diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..22f41212371ea236dd02c6d9e605d09bc77e80f3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "hub-backend"] + path = hub-backend + url = https://git.qoto.org/digipex/hub-backend.git diff --git a/trackdirect-python.dockerfile b/Dockerfile similarity index 62% rename from trackdirect-python.dockerfile rename to Dockerfile index fb1dae36c0fdf20bc30ba5faf580fdea2c7a1cdc..53a08aaae48064111fef7bc61f55359ed909d516 100644 --- a/trackdirect-python.dockerfile +++ b/Dockerfile @@ -8,6 +8,10 @@ RUN apt-get update && apt-get install -y \ git \ && rm -rf /var/lib/apt/lists/* -COPY . /root/trackdirect +COPY ./hub-backend /root/trackdirect RUN pip install -r /root/trackdirect/requirements.txt + +VOLUME /root/trackdirect/config + +CMD /root/trackdirect/server/scripts/wsserver.sh trackdirect.ini diff --git a/aprsc.dockerfile b/aprsc.dockerfile deleted file mode 100644 index da2e51c9cda8d9b4fe0540c63ee05de25b690db0..0000000000000000000000000000000000000000 --- a/aprsc.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu:20.04 - -RUN apt-get update && apt-get install -y \ - gnupg \ - && rm -rf /var/lib/apt/lists/* - -RUN printf "deb http://aprsc-dist.he.fi/aprsc/apt focal main" >> /etc/apt/sources.list -RUN gpg --keyserver keyserver.ubuntu.com --recv C51AA22389B5B74C3896EF3CA72A581E657A2B8D -RUN gpg --export C51AA22389B5B74C3896EF3CA72A581E657A2B8D | apt-key add - - -RUN apt-get update && apt-get install -y \ - aprsc \ - && rm -rf /var/lib/apt/lists/* - -EXPOSE 10152 -EXPOSE 14580 -EXPOSE 10155 -EXPOSE 14501 - -WORKDIR /opt/aprsc -USER aprsc - -CMD /opt/aprsc/sbin/aprsc -c /opt/aprsc/etc/aprsc.conf diff --git a/config/000-default.conf b/config/000-default.conf deleted file mode 100644 index 575aefed1a86d340d51e0d617b5ca7515e8d008b..0000000000000000000000000000000000000000 --- a/config/000-default.conf +++ /dev/null @@ -1,13 +0,0 @@ -<VirtualHost *:80> - ServerAdmin webmaster@localhost - DocumentRoot /root/trackdirect/htdocs/public - - ErrorLog ${APACHE_LOG_DIR}/error.log - CustomLog ${APACHE_LOG_DIR}/access.log combined -</VirtualHost> - -<Directory "/root/trackdirect/htdocs/public"> - Options Indexes MultiViews - AllowOverride All - Require all granted -</Directory> diff --git a/config/aprsc.conf b/config/aprsc.conf deleted file mode 100755 index 48d5927d5a10a43f1a8a4b2a21fb86698268a9dd..0000000000000000000000000000000000000000 --- a/config/aprsc.conf +++ /dev/null @@ -1,30 +0,0 @@ -# Note that server id and passcode needs to be changed -ServerId MY-SERVER-ID -PassCode 11111 - -MyAdmin "My Name, MySignal" -MyEmail me@domain.com - -disallow_unverified false -RunDir data -LogRotate 10 5 -UpstreamTimeout 15s -ClientTimeout 48h - -Listen "Full feed" fullfeed tcp :: 10152 -Listen "Client-Defined Filters" igate tcp :: 14580 -Listen "Duplicate packets" dupefeed tcp :: 10155 - -### Select aprs source (only one) -Uplink "Core rotate" ro tcp rotate.aprs.net 10152 -#Uplink "Core rotate" ro tcp cwop.aprs.net 10152 -#Uplink "Core rotate" ro tcp aprs.glidernet.org 10152 - -HTTPStatus 0.0.0.0 14501 -HTTPStatusOptions ShowEmail=1 - -### Operator attention span qualification run ########### -# After configuring the rest of the settings, remove this bad command -# from the configuration file. It's here only to avoid starting the -# server up accidentally with an invalid configuration. -MagicBadness 42.7 diff --git a/config/trackdirect.ini b/config/trackdirect.ini deleted file mode 100644 index 0a38d5e28f0ea18eaecbecf1736b81f87a6db73b..0000000000000000000000000000000000000000 --- a/config/trackdirect.ini +++ /dev/null @@ -1,164 +0,0 @@ -;; APRS Track Direct Configuration Example -;; This is an example configuration file, you need to do some modifications. - - -[website] - -title="APRS Track Direct" -owner_name="Unknown" -owner_email="no@name.com" - -;maptiler_key="<insert map key here if you want to activate maptiler for vector tiles>" -;google_key="<insert google key here if you want to activate google maps>" -;here_app_id="<insert HERE app_id here if you want to use HERE for raster tiles>" -;here_app_code="<insert HERE app_code here if you want to use HERE for raster tiles>" - -;; For the map type "Leaflet - Raster Tiles" we have a lot of options -;; Please read usage policy for each map provider (OpenStreetMap usage policy: https://operations.osmfoundation.org/policies/tiles/) -leaflet_raster_tile_roadmap="OpenStreetMap" ;; Examples: "OpenStreetMap.DE", "Stamen.TonerLite", "CartoDB.Voyager", "HERE.normalDay" or "HERE.reducedDay" -leaflet_raster_tile_terrain="OpenTopoMap" ;; Examples: "OpenTopoMap", "Stamen.Terrain" or "HERE.terrainDay" -leaflet_raster_tile_satellite="" ;; Examples: "HERE.satelliteDay" - -;; Coverage settings, by default we include stationary senders and only include the 95% percent of the closest positions -coverage_only_moving_senders="0" -coverage_percentile="95" - -;; Url to the websocket server, if you use https you need to set this -;; If nothing is set we will try the url: ws://current-url:9000/ws -;websocket_url="wss://ws.my-domain.com" - - -[database] - -;; Basic database settings -;; If using docker, set host to "db" -host="127.0.0.1" -database="trackdirect" -;; If using docker, activate username and set to "root" -;username="username" -password="foobar" -port="5432" - -;; Settings for the remover script -days_to_save_position_data="10" -days_to_save_station_data="30" -days_to_save_weather_data="10" -days_to_save_telemetry_data="10" - -;; If this setting is enabled, OGN stations that we are not allowed to reveal the identity of will be given a random name similar to "UNKNOWN123" -;; If disabled we will drop all packets regarding stations that we should not reveal the identity of. -save_ogn_stations_with_missing_identity="0" - - -[websocket_server] - -;; Websocket server host -host="0.0.0.0" - -;; Websocket server port, must be same as port specified in index.php (if not using a reverse proxy) -port="9000" - -;; If you are using a reverse proxy you need to play with the "external_port" setting, otherwise it should be the same as "port" -external_port="9000" - -;; Websocket server log output -error_log="~/trackdirect/server/log/wsserver_aprs.log" - -;; Packets received more frequently than the configured frequency limit will be dropped (limit is specified in seconds) -;; This frequency limit is only refering to pakets that is received in real time from the filtered feed used by the websocket server -;; This frequency limit may be a bit more forgiving than the frequence limit on the collector. -;; When receiving data from the OGN network this needs to be about 15s or more. -frequency_limit="0" - -;; First APRS IS server for the websocket server to connect to. -;; Important: Please set up your own APRS IS server, do not use a public server. -;; If using docker, set aprs_host1 to "aprsc" -aprs_host1="127.0.0.1" -aprs_port1="14580" - -;; Important that you set the correct source, otherwise it might be handled incorrect -;; - Source Id 1: APRS-IS -;; - Source Id 2: CWOP -;; - Source Id 3: CBAPRS -;; - Source Id 4: HUBHAB -;; - Source Id 5: OGN -aprs_source_id1="1" - -;; Second APRS IS server for the websocket server to connect to (only needed if you use multiple sources). -;; Important: Please set up your own APRS IS server, do not use a public server. -;aprs_host2="127.0.0.1" -;aprs_port2="14580" -;aprs_source_id2="2" - -;; Allow time travel -;; Use this settings to disable/enable data requests with a time interval (this must be disabled for the OGN network) -allow_time_travel="0" - -;; Max default time in minutes (how old packets that will be included in the response) -;; This setting should be no more than 1440 for for the OGN network. -max_default_time="1440" - -;; Max time in minutes when filtering (how old packets that will be included in the response) -;; This setting should be no more than 1440 for for the OGN network. -max_filter_time="1440" - -;; Time in minutes until idle client is disconnected -max_client_idle_time="60" - -;; Max age in seconds for real time packets waiting to be sent to client (dropping packets if limit is excceded) -max_queued_realtime_packets="30" - - -[collector0] - -;; If using docker, set host to "aprsc" -host="127.0.0.1" -port_full="10152" -port_filtered="14580" - -;; Important that you set the correct source, otherwise it might be handled incorrect -;; - Source Id 1: APRS-IS -;; - Source Id 2: CWOP -;; - Source Id 3: CBAPRS -;; - Source Id 4: HUBHAB -;; - Source Id 5: OGN -source_id="1" - -;; Your callsign and passcode -callsign="NOCALL" -passcode="-1" - -;; Database inserts is done in batches -numbers_in_batch="50" - -;; Packets received more frequently than the configured frequency limit will not be shown on map (limit is specified in seconds) -;; Set to "0" to disable the frequency limit (note that the limit must be 20s or more when receiving data from OGN network)). -frequency_limit="5" - -;; If save_fast_packets is set to "0", packets that is received to frequently will not be saved (useful for OGN, but not recommended for APRS-IS). -save_fast_packets="1" - -;; If detect_duplicates is set to "1" we will try to detect duplicates and ignore them. -detect_duplicates="1" - -;; Collector error log -error_log="~/trackdirect/server/log/collector.log" - - -;; If you need to run multiple collectors you can add multiple collector sections -;[collector1] -; -;source_id="2" -;host="127.0.0.1" -;port_full="20152" -;port_filtered="24580" -; -;callsign="NOCALL" -;passcode="-1" -; -;numbers_in_batch="30" -;frequency_limit="5" -;save_fast_packets="0" -;detect_duplicates="1" -; -;error_log="~/trackdirect/server/log/collector1.log" diff --git a/db.dockerfile b/db.dockerfile deleted file mode 100644 index 4d037867d41ea4f65c982eac29d00658f642c1d3..0000000000000000000000000000000000000000 --- a/db.dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM postgres -COPY misc/database/tables/* /docker-entrypoint-initdb.d/ -VOLUME /var/lib/postgresql/data diff --git a/docker-compose-rel.yml b/docker-compose-rel.yml deleted file mode 100644 index b0396e65acb18be830c1ec78a85c2b6420b95ac6..0000000000000000000000000000000000000000 --- a/docker-compose-rel.yml +++ /dev/null @@ -1,55 +0,0 @@ -version: "3.9" -services: - aprsc: - image: peterus/aprsc:latest - restart: always - ports: - - "10152:10152" - - "14580:14580" - - "10155:10155" - - "14501:14501" - volumes: - - $PWD/config/aprsc.conf:/opt/aprsc/etc/aprsc.conf - - collector: - image: peterus/trackdirect-python:latest - restart: always - volumes: - - $PWD/config/trackdirect.ini:/root/trackdirect/config/trackdirect.ini - command: /root/trackdirect/server/scripts/collector.sh trackdirect.ini 0 - depends_on: - - "db" - - "aprsc" - - websocket: - image: peterus/trackdirect-python:latest - restart: always - volumes: - - $PWD/config/trackdirect.ini:/root/trackdirect/config/trackdirect.ini - command: /root/trackdirect/server/scripts/wsserver.sh trackdirect.ini - ports: - - "9000:9000" - depends_on: - - "db" - - "aprsc" - - web: - image: peterus/trackdirect-apache:latest - restart: always - volumes: - - $PWD/config/trackdirect.ini:/root/trackdirect/config/trackdirect.ini - - $PWD/heatmaps:/root/trackdirect/htdocs/public/heatmaps - ports: - - "80:80" - depends_on: - - "db" - - db: - image: peterus/trackdirect-db:latest - restart: always - environment: - POSTGRES_USER: root - POSTGRES_PASSWORD: foobar - POSTGRES_DB: trackdirect - volumes: - - $PWD/db:/var/lib/postgresql/data diff --git a/docker-compose.yml b/docker-compose.yml index ac2d8fd60fcb3497cbfb5d1ad921af1449008625..e57deb339579f58f091fb10e70bd8f6441c7927f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,60 +1,6 @@ version: "3.9" services: - aprsc: - build: - context: . - dockerfile: aprsc.dockerfile - ports: - - "10152:10152" - - "14580:14580" - - "10155:10155" - - "14501:14501" - volumes: - - $PWD/config/aprsc.conf:/opt/aprsc/etc/aprsc.conf - - collector: - build: - context: . - dockerfile: trackdirect-python.dockerfile - volumes: - - $PWD/config/trackdirect.ini:/root/trackdirect/config/trackdirect.ini - command: /root/trackdirect/server/scripts/collector.sh trackdirect.ini 0 - depends_on: - - "db" - - "aprsc" - websocket: + image: 'registry.qoto.org/digipex/hub-websocket-docker:latest' build: context: . - dockerfile: trackdirect-python.dockerfile - volumes: - - $PWD/config/trackdirect.ini:/root/trackdirect/config/trackdirect.ini - command: /root/trackdirect/server/scripts/wsserver.sh trackdirect.ini - ports: - - "9000:9000" - depends_on: - - "db" - - "aprsc" - - web: - build: - context: . - dockerfile: trackdirect-apache.dockerfile - volumes: - - $PWD/config/trackdirect.ini:/root/trackdirect/config/trackdirect.ini - - $PWD/heatmaps:/root/trackdirect/htdocs/public/heatmaps - ports: - - "80:80" - depends_on: - - "db" - - db: - build: - context: . - dockerfile: db.dockerfile - environment: - POSTGRES_USER: root - POSTGRES_PASSWORD: foobar - POSTGRES_DB: trackdirect - volumes: - - $PWD/db:/var/lib/postgresql/data diff --git a/htdocs/.htaccess b/htdocs/.htaccess deleted file mode 100755 index 53eb9a2f78769a47c94e32be558d524dbceb4380..0000000000000000000000000000000000000000 --- a/htdocs/.htaccess +++ /dev/null @@ -1,16 +0,0 @@ -<IfModule mod_expires.c> - ExpiresActive On - ExpiresByType image/jpg "access 1 month" - ExpiresByType image/jpeg "access 1 month" - ExpiresByType image/gif "access 1 month" - ExpiresByType image/png "access 1 month" - ExpiresDefault "access 1 week" - - Header set Access-Control-Allow-Origin "*" -</IfModule> - -RewriteEngine on - -# Redirect everything to the public directory -RewriteRule ^(.*)$ /public/$1 [L] - diff --git a/htdocs/includes/autoload.php b/htdocs/includes/autoload.php deleted file mode 100644 index 80ca220f5198f250651636654539c246fd5a0107..0000000000000000000000000000000000000000 --- a/htdocs/includes/autoload.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -/** - * Autoload classes when needed - * - * @param string $className - * @return null - */ -function __autoload($className) -{ - - if (file_exists(ROOT . '/includes/' . strtolower($className) . '.class.php')) { - include_once ROOT . '/includes/' . strtolower($className) . '.class.php'; - - } else if (file_exists(ROOT . '/includes/models/' . strtolower($className) . '.class.php')) { - include_once ROOT . '/includes/models/' . strtolower($className) . '.class.php'; - - } else if (file_exists(ROOT . '/includes/repositories/' . strtolower($className) . '.class.php')) { - include_once ROOT . '/includes/repositories/' . strtolower($className) . '.class.php'; - - } else { - error_log(sprintf('Could not find class %s', $className)); - } -} diff --git a/htdocs/includes/bootstrap.php b/htdocs/includes/bootstrap.php deleted file mode 100644 index 35e805c3eb2b170aa9ee745193b1439eafb65f6e..0000000000000000000000000000000000000000 --- a/htdocs/includes/bootstrap.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -if (!defined('ROOT')) { - define('ROOT', dirname(dirname(__FILE__))); - - require_once ROOT . '/includes/autoload.php'; - require_once ROOT . '/includes/common.php'; - - date_default_timezone_set("UTC"); - - ini_set("error_reporting", "true"); - error_reporting(E_ALL|E_STRCT); - - ini_set("display_errors", "false"); -} \ No newline at end of file diff --git a/htdocs/includes/common.php b/htdocs/includes/common.php deleted file mode 100644 index 3ef98f30a6f8b835d2b87ac696e511868989dd9b..0000000000000000000000000000000000000000 --- a/htdocs/includes/common.php +++ /dev/null @@ -1,1893 +0,0 @@ -<?php - -/** - * Returnes true if user probably prefer Imperial Units - * - * @return boolean - */ -function isImperialUnitUser() -{ - if (isset($_GET['imperialUnits']) && $_GET['imperialUnits']) { - return true; - } else if (isset($_GET['imperialUnits']) && !$_GET['imperialUnits']) { - return false; - } - - if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - - if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5) == 'en-US') { - // USA - return true; - } - - if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'my') { - // Myanmar / Burma - return true; - } - - if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5) == 'en-LR') { - // Liberia - return true; - } - } - - return false; -} - -/** - * Convert km to miles (or kmh to mph) - * - * @param {float} value - * @return float - */ -function convertKilometerToMile($value) -{ - return $value * 0.621371192; -} - -/** - * Convert meter to feet - * - * @param {float} value - * @return float - */ -function convertMeterToFeet($value) -{ - return $value * 3.2808399; -} - -/** - * Convert meter per second to miles per second - * - * @param {float} value - * @return float - */ -function convertMpsToMph($value) -{ - return $value * 2.23693629; -} - -/** - * Convert meter to yard - * - * @param {float} value - * @return float - */ -function convertMeterToYard($value) -{ - return $value * 1.0936133; -} - -/** - * Convert mm to inches - * - * @param {float} value - * @return float - */ -function convertMmToInch($value) -{ - return $value * 0.0393700787; -} - -/** - * Convert celcius to fahrenheit - * - * @param {float} value - * @return float - */ -function convertCelciusToFahrenheit($value) -{ - return $value * (9/5) + 32; -} - -/** - * Convert hPa/mbar to mmhg - * - * @param {float} value - * @return float - */ -function convertMbarToMmhg($value) -{ - return $value * 0.75006375541921; -} - -/** - * Returnes true if value is float - * - * @param mixed $value - * @return boolean - */ -function isFloat($value) -{ - if (is_numeric($value)) { - // PHP automagically tries to coerce $value to a number - return is_float($value + 0); - } - return false; -} - -/** - * Returnes true if value is int - * - * @param mixed $value - * @return boolean - */ -function isInt($value) -{ - return (ctype_digit(strval($value))); -} - -/** - * Replace first occurence - * - * @param string $search - * @param string $replace - * @param string $string - * @return string - */ -function str_replace_first($search, $replace, $string) -{ - $pos = strpos($string, $search); - if ($pos !== false) { - return substr_replace($string, $replace, $pos, strlen($search)); - } else { - return $string; - } -} - -/* - * Returnes symbol description - * - * @param string $symbolTable - * @param string $symbol - * @param boolean $includeUndefinedOverlay - * @return string - */ -function getSymbolDescription($symbolTable, $symbol, $includeUndefinedOverlay) -{ - if ($symbolTable == '/') { - switch ($symbol) { - case '!': - return 'Police, Sheriff'; - case '"': - return 'No Symbol'; - case '#': - return 'Digipeater'; - case '$': - return 'Phone'; - case '%': - return 'DX Cluster'; - case '&': - return 'HF Gateway'; - case '\'': - return 'Small Aircraft'; - case '(': - return 'Mobile Satellite Station'; - case ')': - return 'Wheelchair (handicapped)'; - case '*': - return 'Snowmobile'; - case '+': - return 'Red Cross'; - case ',': - return 'Scout (Boy Scout)'; - case '-': - return 'House (VHF)'; - case '.': - return 'X'; - case '/': - return 'Red Dot'; - case '0': - return 'Circle (0)'; - case '1': - return 'Circle (1)'; - case '2': - return 'Circle (2)'; - case '3': - return 'Circle (3)'; - case '4': - return 'Circle (4)'; - case '5': - return 'Circle (5)'; - case '6': - return 'Circle (6)'; - case '7': - return 'Circle (7)'; - case '8': - return 'Circle (8)'; - case '9': - return 'Circle (9)'; - case ':': - return 'Fire'; - case ';': - return 'Campground or Portable operation'; - case '<': - return 'Motorcycle'; - case '=': - return 'Railroad Engine'; - case '>': - return 'Car'; - case '?': - return 'File server'; - case '@': - return 'Hurricane prediction'; - case 'A': - return 'Aid Station'; - case 'B': - return 'BBS or PBBS'; - case 'C': - return 'Canoe'; - case 'D': - return 'No Symbol'; // was originally undefined - case 'E': - return 'Event (Special live event)'; // Eyeball - case 'F': - return 'Farm Vehicle (tractor)'; - case 'G': - return 'Grid Square (6 digit)'; - case 'H': - return 'Hotel (blue bed symbol)'; - case 'I': - return 'TCP/IP network station'; - case 'J': - return 'No Symbol'; - case 'K': - return 'School'; - case 'L': - return 'Logged-ON user (or PC User)'; - case 'M': - return 'MacAPRS'; - case 'N': - return 'NTS Station'; - case 'O': - return 'Balloon'; - case 'P': - return 'Police'; - case 'Q': - return 'TBD'; - case 'R': - return 'Recreational Vehicle'; - case 'S': - return 'Shuttle'; - case 'T': - return 'SSTV'; - case 'U': - return 'Bus'; - case 'V': - return 'ATV'; - case 'W': - return 'National Weather Service'; - case 'X': - return 'Helicopter'; - case 'Y': - return 'Yacht (sail)'; - case 'Z': - return 'WinAPRS'; - case '[': - return 'Human/Person'; - case '\\': - return 'Triangle (DF station)'; - case ']': - return 'Mail/PostOffice'; - case '^': - return 'Large Aircraft'; - case '_': - return 'Weather Station'; - case '`': - return 'Dish Antenna'; - case 'a': - return 'Ambulance'; - case 'b': - return 'Bike'; - case 'c': - return 'Incident Command Post'; - case 'd': - return 'Fire Station'; - case 'e': - return 'Horse (equestrian)'; - case 'f': - return 'Fire Truck'; - case 'g': - return 'Glider'; - case 'h': - return 'Hospital'; - case 'i': - return 'IOTA (islands on the air)'; - case 'j': - return 'Jeep'; - case 'k': - return 'Truck'; - case 'l': - return 'Laptop'; - case 'm': - return 'Mic-E Repeater'; - case 'n': - return 'Node (black bulls-eye)'; - case 'o': - return 'EOC'; - case 'p': - return 'Rover (puppy, or dog)'; - case 'q': - return 'Grid square'; - case 'r': - return 'Antenna'; - case 's': - return 'Power Boat'; - case 't': - return 'Truck Stop'; - case 'u': - return 'Truck (18 wheeler)'; - case 'v': - return 'Van'; - case 'w': - return 'Water Station'; - case 'x': - return 'xAPRS (Unix)'; - case 'y': - return 'Yagi @ QTH'; - case 'z': - return 'Shelter'; - case '{': - return 'No Symbol'; - case '|': - return 'TNC Stream Switch'; - case '}': - return 'No Symbol'; - case '~': - return 'TNC Stream Switch'; - } - - } else { - switch ($symbol) { - case '!': - switch ($symbolTable) { - case "\\": - return 'Emergency!'; - case 'E': - return 'ELT or EPIRB'; - case 'V': - return 'Volcanic Eruption or Lava'; - default: - if ($includeUndefinedOverlay) { - return 'Emergency (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '"': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '#': - switch ($symbolTable) { - case '\\': - return 'Digipeater'; - case 'A': - return 'Digipeater (An Alt-Freq input digi)'; - case 'R': - return 'Digipeater (RELAY only)'; - case 'W': - return 'Digipeater (RELAY and WIDE)'; - case 'T': - return 'Digipeater (PacComm RELAY,WIDE and TRACE)'; - case 'N': - return 'Digipeater (WIDEn-N and relay,wide,trace)'; - case 'I': - return 'Digipeater (digipeater is also an IGate)'; - case 'L': - return 'Digipeater (LIMITED New n-N Paradigm digi)'; - case 'S': - return 'Digipeater (New n-N Paradigm digi)'; - case 'P': - return 'Digipeater (PacComm, New n-N Paradigm)'; - case 'U': - return 'Digipeater (UI-DIGI firmware)'; - case 'D': - return 'Digipeater (DIGI_NED)'; - case '1': - return 'Digipeater (Fill-in digi, 1-hop limit)'; - case 'X': - return 'Digipeater (Experimental)'; - default: - if ($includeUndefinedOverlay) { - return 'Digipeater (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '$': - switch ($symbolTable) { - case '\\': - return 'Bank or ATM'; - case 'U': - return 'ATM (US dollars)'; - case 'L': - return 'ATM (Brittish Pound)'; - case 'Y': - return 'ATM (Japanese Yen)'; - default: - if ($includeUndefinedOverlay) { - return 'Bank or ATM (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case '%': - switch ($symbolTable) { - case '\\': - return 'Power/Energy'; - case 'C': - return 'Power/Energy (Coal)'; - case 'E': - return 'Power/Energy (Emergency)'; - case 'G': - return 'Power/Energy (Geothermal)'; - case 'H': - return 'Power/Energy (Hydroelectric)'; - case 'N': - return 'Power/Energy (Nuclear)'; - case 'P': - return 'Power/Energy (Portable)'; - case 'S': - return 'Power/Energy (Solar)'; - case 'T': - return 'Power/Energy (Turbine)'; - case 'W': - return 'Power/Energy (Wind)'; - default: - if ($includeUndefinedOverlay) { - return 'Power/Energy'; - } else { - return null; - } - } - case '&': - switch ($symbolTable) { - case '\\': - return 'Gateway'; - case 'I': - return 'Igate (Generic)'; - case 'R': - return 'Receive only IGate'; - case 'P': - return 'PSKmail node'; - case 'T': - return 'TX Igate (with path set to 1 hop)'; - case 'W': - return 'WIRES-X'; - case '2': - return 'TX igate (with path set to 2 hops)'; - case 'D': - return 'D-STAR (D-PRS IGate)'; - default: - if ($includeUndefinedOverlay) { - return 'Gateway (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '\'': - switch ($symbolTable) { - case '\\': - return 'Incident site (Airplane Crash Site)'; - case 'A': - return 'Incident site (Automobile crash site)'; - case 'H': - return 'Incident site (Hazardous incident)'; - case 'M': - return 'Incident site (Multi-Vehicle crash site)'; - case 'P': - return 'Incident site (Pileup)'; - case 'T': - return 'Incident site (Truck wreck)'; - default: - if ($includeUndefinedOverlay) { - return 'Incident site'; - } else { - return null; - } - } - case '(': - switch ($symbolTable) { - case "\\": - return 'Cloudy'; - default: - if ($includeUndefinedOverlay) { - return 'Cloudy'; - } else { - return null; - } - } - - case ')': - switch ($symbolTable) { - case "\\": - return 'Firenet MEO (Modis Earth Observatory)'; - default: - if ($includeUndefinedOverlay) { - return 'Firenet MEO (Modis Earth Observatory)'; - } else { - return null; - } - } - - case '*': - switch ($symbolTable) { - case "\\": - return 'Snow'; - default: - if ($includeUndefinedOverlay) { - return 'Snow'; - } else { - return null; - } - } - - case '+': - switch ($symbolTable) { - case "\\": - return 'Church'; - default: - if ($includeUndefinedOverlay) { - return 'Church'; - } else { - return null; - } - } - - case ',': - switch ($symbolTable) { - case "\\": - return 'Scout (Girl Scout)'; - default: - if ($includeUndefinedOverlay) { - return 'Scout (Girl Scout)'; - } else { - return null; - } - } - - case '-': - switch ($symbolTable) { - case '\\': - return 'House (HF)'; - case '5': - return 'House (50 Hz mains power)'; - case '6': - return 'House (60 Hz mains power)'; - case 'B': - return 'House (Backup Battery Power)'; - case 'C': - return 'House (Ham club)'; - case 'E': - return 'House (Emergency power)'; - case 'G': - return 'House (Geothermal)'; - case 'H': - return 'House (Hydro powered)'; - case 'O': - return 'House (Operator Present)'; - case 'S': - return 'House (Solar Powered)'; - case 'W': - return 'House (Wind powered)'; - default: - if ($includeUndefinedOverlay) { - return 'House (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case '.': - switch ($symbolTable) { - case "\\": - return 'Unknown Position'; - default: - if ($includeUndefinedOverlay) { - return 'Unknown Position'; - } else { - return null; - } - } - - case '/': - switch ($symbolTable) { - case "\\": - return 'Waypoint Destination'; - default: - if ($includeUndefinedOverlay) { - return 'Waypoint Destination'; - } else { - return null; - } - } - - case '0': - switch ($symbolTable) { - case '\\': - return 'Circle'; - case 'A': - return 'Allstar Node'; - case 'E': - return 'Echolink Node'; - case 'I': - return 'IRLP repeater'; - case 'S': - return 'Staging Area'; - case 'V': - return 'Echolink and IRLP (VOIP)'; - case 'W': - return 'WIRES (Yaesu VOIP)'; - default: - if ($includeUndefinedOverlay) { - return 'Circle (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '8': - switch ($symbolTable) { - case '\\': - return 'No Symbol'; - case '8': - return '802.11 network node'; - case 'G': - return '802.11G'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '9': - switch ($symbolTable) { - case "\\": - return 'Gas Station'; - default: - if ($includeUndefinedOverlay) { - return 'Gas Station'; - } else { - return null; - } - } - - case ':': - switch ($symbolTable) { - case "\\": - return 'Hail (weather condition)'; - default: - if ($includeUndefinedOverlay) { - return 'Hail (weather condition)'; - } else { - return null; - } - } - - case ';': - switch ($symbolTable) { - case '\\': - return 'Portable, Park or Picnic'; - case 'F': - return 'Field Day'; - case 'I': - return 'Islands on the air'; - case 'S': - return 'Summits on the air'; - case 'W': - return 'WOTA'; - default: - if ($includeUndefinedOverlay) { - return 'Portable'; - } else { - return null; - } - } - - case '<': - switch ($symbolTable) { - case "\\": - return 'Advisory (single gale flag)'; - default: - if ($includeUndefinedOverlay) { - return 'Advisory (single gale flag)'; - } else { - return null; - } - } - - case '=': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '>': - switch ($symbolTable) { - case '\\': - return 'Car'; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - return 'Numbered Car (' . $symbolTable . ')'; - case 'E': - return 'Car (Electric)'; - case 'H': - return 'Car (Hybrid)'; - case 'S': - return 'Car (Solar powered)'; - case 'V': - return 'Car (GM Volt)'; - default: - if ($includeUndefinedOverlay) { - return 'Car (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case '?': - switch ($symbolTable) { - case "\\": - return 'Info Kiosk'; - default: - if ($includeUndefinedOverlay) { - return 'Info Kiosk'; - } else { - return null; - } - } - - case '@': - switch ($symbolTable) { - case "\\": - return 'Hurricane/Tropical storm'; - default: - if ($includeUndefinedOverlay) { - return 'Hurricane/Tropical storm (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'A': - switch ($symbolTable) { - case '\\': - return 'Box'; - case '9': - return 'Mobile DTMF user'; - case '7': - return 'HT DTMF user'; - case 'H': - return 'House DTMF user'; - case 'E': - return 'Echolink DTMF report'; - case 'I': - return 'IRLP DTMF report'; - case 'R': - return 'RFID report'; - case 'A': - return 'AllStar DTMF report'; - case 'D': - return 'D-Star report'; - case 'X': - return 'OLPC Laptop XO'; - default: - if ($includeUndefinedOverlay) { - return 'Box (' . $symbolTable . ')'; - } else { - return null; - } - } - case 'B': - switch ($symbolTable) { - case "\\": - return 'Blowing snow'; - default: - if ($includeUndefinedOverlay) { - return 'Blowing snow'; - } else { - return null; - } - } - - case 'C': - switch ($symbolTable) { - case "\\": - return 'Coast Guard'; - default: - if ($includeUndefinedOverlay) { - return 'Coast Guard'; - } else { - return null; - } - } - - case 'D': - switch ($symbolTable) { - case '\\': - return 'Depot'; // drizzle rain moved to ' ovlyD - case 'A': - return 'Airport'; - case 'F': - return 'Ferry Landing'; - case 'H': - return 'Heloport'; - case 'R': - return 'Rail Depot'; - case 'B': - return 'Bus Depot'; - case 'L': - return 'LIght Rail or Subway'; - case 'S': - return 'Seaport Depot'; - default: - if ($includeUndefinedOverlay) { - return 'Depot (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 'E': - switch ($symbolTable) { - case '\\': - return 'Smoke'; - case 'H': - return 'Haze'; - case 'S': - return 'Smoke'; - case 'B': - return 'Blowing Snow'; // was \B - case 'D': - return 'Blowing Dust or Sand'; // was \b - case 'F': - return 'Fog'; // was \{ - default: - if ($includeUndefinedOverlay) { - return 'Smoke (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 'F': - switch ($symbolTable) { - case "\\": - return 'Freezing rain'; - default: - if ($includeUndefinedOverlay) { - return 'Freezing rain'; - } else { - return null; - } - } - - case 'G': - switch ($symbolTable) { - case "\\": - return 'Snow Shower'; - default: - if ($includeUndefinedOverlay) { - return 'Snow Shower'; - } else { - return null; - } - } - - case 'H': - switch ($symbolTable) { - case '\\': - return 'Haze'; - case 'R': - return 'Radiation detector'; - case 'W': - return 'Hazardous Waste'; - case 'X': - return 'Skull&Crossbones'; - default: - if ($includeUndefinedOverlay) { - return 'Hazard (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 'I': - switch ($symbolTable) { - case "\\": - return 'Rain Shower'; - default: - if ($includeUndefinedOverlay) { - return 'Rain Shower'; - } else { - return null; - } - } - - case 'J': - switch ($symbolTable) { - case "\\": - return 'Lightning'; - default: - if ($includeUndefinedOverlay) { - return 'Lightning'; - } else { - return null; - } - } - - case 'K': - switch ($symbolTable) { - case "\\": - return 'Kenwood HT'; - default: - if ($includeUndefinedOverlay) { - return 'Kenwood HT'; - } else { - return null; - } - } - - case 'L': - switch ($symbolTable) { - case "\\": - return 'Lighthouse'; - default: - if ($includeUndefinedOverlay) { - return 'Lighthouse (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'M': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case 'N': - switch ($symbolTable) { - case "\\": - return 'Navigation Buoy'; - default: - if ($includeUndefinedOverlay) { - return 'Navigation Buoy (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'O': - switch ($symbolTable) { - case '\\': - return 'Rocket (amateur)'; - case 'B': - return 'Blimp (non-rigid airship)'; - case 'M': - return 'Manned Balloon'; - case 'T': - return 'Teathered Balloon'; - case 'C': - return 'Constant Pressure Balloon - Long duration'; - case 'R': - return 'Rocket bearing Balloon (Rockoon)'; - default: - if ($includeUndefinedOverlay) { - return 'Balloon (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 'P': - switch ($symbolTable) { - case "\\": - return 'Parking'; - default: - if ($includeUndefinedOverlay) { - return 'Parking (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'Q': - switch ($symbolTable) { - case "\\": - return 'Quake'; - default: - if ($includeUndefinedOverlay) { - return 'Quake'; - } else { - return null; - } - } - - case 'R': - switch ($symbolTable) { - case '\\': - return 'Restaurant (generic)'; - case '7': - return 'Restaurant (7/11)'; - case 'K': - return 'Restaurant (KFC)'; - case 'M': - return 'Restaurant (McDonalds)'; - case 'T': - return 'Restaurant (Taco Bell)'; - default: - if ($includeUndefinedOverlay) { - return 'Restaurant (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 'S': - switch ($symbolTable) { - case "\\": - return 'Satellite/Pacsat'; - default: - if ($includeUndefinedOverlay) { - return 'Satellite/Pacsat (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'T': - switch ($symbolTable) { - case "\\": - return 'Thunderstorm'; - default: - if ($includeUndefinedOverlay) { - return 'Thunderstorm (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'U': - switch ($symbolTable) { - case "\\": - return 'Sunny'; - default: - if ($includeUndefinedOverlay) { - return 'Sunny (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'V': - switch ($symbolTable) { - case "\\": - return 'VORTAC Navigation Aid'; - default: - if ($includeUndefinedOverlay) { - return 'VORTAC Navigation Aid'; - } else { - return null; - } - } - - case 'W': - switch ($symbolTable) { - case "\\": - return 'National Weather Service'; - default: - if ($includeUndefinedOverlay) { - return 'National Weather Service (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'X': - switch ($symbolTable) { - case "\\": - return 'Pharmacy'; - default: - if ($includeUndefinedOverlay) { - return 'Pharmacy'; - } else { - return null; - } - } - - case 'Y': - switch ($symbolTable) { - case '\\': - return 'Radio/APRS Device'; - case 'A': - return 'Alinco'; - case 'B': - return 'Byonics'; - case 'I': - return 'Icom'; - case 'K': - return 'Kenwood'; - case 'Y': - return 'Yaesu/Standard'; - default: - if ($includeUndefinedOverlay) { - return 'Radio/APRS Device'; // or "No Symbol"? - } else { - return null; - } - } - case 'Z': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '[': - switch ($symbolTable) { - case '\\': - return 'Wall Cloud (or pedestal cloud)'; - case 'B': - return 'Baby on board (stroller, pram etc)'; - case 'S': - return 'Skier'; - case 'R': - return 'Runner'; - case 'H': - return 'Hiker'; - default: - if ($includeUndefinedOverlay) { - return 'Human/Person (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '\\': - switch ($symbolTable) { - case '\\': - return 'No Symbol'; - case 'A': - return 'Avmap G5'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - case ']': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '^': - switch ($symbolTable) { - case '\\': - return 'Aircraft'; // top-view originally intended to point in direction of flight - case 'A': - return 'Aircraft (A = Autonomous)'; - case 'D': - return 'Aircraft (D = Drone)'; - case 'E': - return 'Aircraft (E = Electric aircraft)'; - case 'G': - return 'Aircraft (G = Glider aircraft)'; - case 'H': - return 'Aircraft (H = Hovercraft)'; - case 'J': - return 'Aircraft (J = JET)'; - case 'L': - return 'Paraglider'; // Not official definition - case 'M': - return 'Aircraft (M = Missle)'; - case 'P': - return 'Aircraft (P = Propeller)'; - case 'R': - return 'Aircraft (R = Remotely Piloted)'; - case 'S': - return 'Aircraft (S = Solar Powered)'; - case 'V': - return 'Aircraft (V = Vertical takeoff)'; - case 'X': - return 'Aircraft (X = Experimental)'; - default: - if ($includeUndefinedOverlay) { - return 'Aircraft (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '_': - switch ($symbolTable) { - case "\\": - return 'Weather Station'; - default: - if ($includeUndefinedOverlay) { - return 'Weather Station (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '`': - switch ($symbolTable) { - case "\\": - return 'Rain'; - default: - if ($includeUndefinedOverlay) { - return 'Rain'; - } else { - return null; - } - } - - case 'a': - switch ($symbolTable) { - case '\\': - return 'Red Diamond'; - case 'A': - return 'ARES'; - case 'D': - return 'D-STAR (previously Dutch ARES)'; - case 'G': - return 'RSGB Radio Society of Great Brittan'; - case 'R': - return 'RACES'; - case 'S': - return 'SATERN Salvation Army'; - case 'W': - return 'WinLink'; - case 'Y': - return 'C4FM Yaesu repeaters'; - default: - if ($includeUndefinedOverlay) { - return 'Red Diamond (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'b': - switch ($symbolTable) { - case "\\": - return 'Dust blowing'; - default: - if ($includeUndefinedOverlay) { - return 'Dust blowing'; - } else { - return null; - } - } - - case 'c': - switch ($symbolTable) { - case '\\': - return 'Civil Defense'; - case 'D': - return 'Decontamination'; - case 'R': - return 'RACES'; - case 'S': - return 'SATERN mobile canteen'; - default: - if ($includeUndefinedOverlay) { - return 'Civil Defense (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'd': - switch ($symbolTable) { - case "\\": - return 'DX Spot'; - default: - if ($includeUndefinedOverlay) { - return 'DX Spot'; - } else { - return null; - } - } - - case 'e': - switch ($symbolTable) { - case "\\": - return 'Sleet'; - default: - if ($includeUndefinedOverlay) { - return 'Sleet'; - } else { - return null; - } - } - - case 'f': - switch ($symbolTable) { - case "\\": - return 'Funnel Cloud'; - default: - if ($includeUndefinedOverlay) { - return 'Funnel Cloud'; - } else { - return null; - } - } - - case 'g': - switch ($symbolTable) { - case "\\": - return 'Gale warning flags'; - default: - if ($includeUndefinedOverlay) { - return 'Gale warning flags (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'h': - switch ($symbolTable) { - case '\\': - return 'Store/Ham Store'; - case 'F': - return 'Hamfest'; - case 'H': - return 'Home Dept etc..'; - default: - if ($includeUndefinedOverlay) { - return 'Other store (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 'i': - switch ($symbolTable) { - case "\\": - return 'Point of interest'; - default: - if ($includeUndefinedOverlay) { - return 'Point of interest (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'j': - switch ($symbolTable) { - case "\\": - return 'WorkZone'; - default: - if ($includeUndefinedOverlay) { - return 'WorkZone'; - } else { - return null; - } - } - - case 'k': - switch ($symbolTable) { - case '\\': - return 'Special Vehicle (SUV)'; - case '4': - return 'Special Vehicle (4x4)'; - case 'A': - return 'Special Vehicle (ATV)'; - default: - if ($includeUndefinedOverlay) { - return 'Special Vehicle (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'l': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case 'm': - switch ($symbolTable) { - case "\\": - return 'Milepost'; - default: - if ($includeUndefinedOverlay) { - return 'Milepost'; - } else { - return null; - } - } - - case 'n': - switch ($symbolTable) { - case "\\": - return 'Red Triangle'; - default: - if ($includeUndefinedOverlay) { - return 'Red Triangle (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'o': - switch ($symbolTable) { - case "\\": - return 'Small Circle'; - default: - if ($includeUndefinedOverlay) { - return 'Small Circle (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'p': - switch ($symbolTable) { - case "\\": - return 'Partly Cloudy'; - default: - if ($includeUndefinedOverlay) { - return 'Partly Cloudy'; - } else { - return null; - } - } - - case 'q': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case 'r': - switch ($symbolTable) { - case "\\": - return 'Restrooms'; - default: - if ($includeUndefinedOverlay) { - return 'Restrooms'; - } else { - return null; - } - } - - case 's': - switch ($symbolTable) { - case '\\': - return 'Ship/Boat'; - case '6': - return 'Ship/Boat (Shipwreck "deep6")'; - case 'B': - return 'Ship/Boat (Pleasure Boat)'; - case 'C': - return 'Ship/Boat (Cargo)'; - case 'D': - return 'Ship/Boat (Diving)'; - case 'E': - return 'Ship/Boat (Emergency or Medical transport)'; - case 'F': - return 'Ship/Boat (Fishing)'; - case 'H': - return 'Ship/Boat (High-speed Craft)'; - case 'J': - return 'Ship/Boat (Jet Ski)'; - case 'L': - return 'Ship/Boat (Law enforcement)'; - case 'M': - return 'Ship/Boat (Miltary)'; - case 'O': - return 'Ship/Boat (Oil Rig)'; - case 'P': - return 'Ship/Boat (Pilot Boat)'; - case 'Q': - return 'Ship/Boat (Torpedo)'; - case 'S': - return 'Ship/Boat (Search and Rescue)'; - case 'T': - return 'Ship/Boat (Tug)'; - case 'U': - return 'Ship/Boat (Underwater ops or submarine)'; - case 'W': - return 'Ship/Boat (Wing-in-Ground effect or Hovercraft)'; - case 'X': - return 'Ship/Boat (Passenger, Ferry)'; - case 'Y': - return 'Ship/Boat (Sailing, large ship)'; - default: - if ($includeUndefinedOverlay) { - return 'Ship/Boat (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - case 't': - switch ($symbolTable) { - case "\\": - return 'Tornado'; - default: - if ($includeUndefinedOverlay) { - return 'Tornado'; - } else { - return null; - } - } - - case 'u': - switch ($symbolTable) { - case '\\': - return 'Truck'; - case 'B': - return 'Truck (Buldozer/construction/Backhoe)'; - case 'G': - return 'Truck (Gas)'; - case 'P': - return 'Truck (Plow or SnowPlow)'; - case 'T': - return 'Truck (Tanker)'; - case 'C': - return 'Truck (Chlorine Tanker)'; - case 'H': - return 'Truck (Hazardous)'; - default: - if ($includeUndefinedOverlay) { - return 'Truck (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'v': - switch ($symbolTable) { - case "\\": - return 'Van'; - default: - if ($includeUndefinedOverlay) { - return 'Van (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case 'w': - switch ($symbolTable) { - case "\\": - return 'Flooding'; - default: - if ($includeUndefinedOverlay) { - return 'Flooding'; - } else { - return null; - } - } - - case 'x': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case 'y': - switch ($symbolTable) { - case "\\": - return 'Skywarn'; - default: - if ($includeUndefinedOverlay) { - return 'Skywarn'; - } else { - return null; - } - } - - case 'z': - switch ($symbolTable) { - case '\\': - return 'Shelter'; - case 'C': - return 'Clinic'; - case 'G': - return 'Government building'; - case 'M': - return 'Morgue'; - case 'T': - return 'Triage'; - default: - if ($includeUndefinedOverlay) { - return 'Building (with overlay ' . $symbolTable . ')'; - } else { - return null; - } - } - - case '{': - switch ($symbolTable) { - case "\\": - return 'Fog'; - default: - if ($includeUndefinedOverlay) { - return 'Fog'; - } else { - return null; - } - } - - case '|': - switch ($symbolTable) { - case "\\": - return 'TNC Stream Switch'; - default: - if ($includeUndefinedOverlay) { - return 'TNC Stream Switch'; - } else { - return null; - } - } - - case '}': - switch ($symbolTable) { - case "\\": - return 'No Symbol'; - default: - if ($includeUndefinedOverlay) { - return 'No Symbol'; - } else { - return null; - } - } - - case '~': - switch ($symbolTable) { - case "\\": - return 'TNC Stream Switch'; - default: - if ($includeUndefinedOverlay) { - return 'TNC Stream Switch'; - } else { - return null; - } - } - } - } -} - - -/** - * Returnes true if we may show data older than 24h - * - * @return boolean - */ -function isAllowedToShowOlderData() { - $isAllowedToShowOlderData = false; - $config = parse_ini_file(ROOT . '/../config/trackdirect.ini', true); - - if (isset($config['websocket_server'])) { - if (isset($config['websocket_server']['allow_time_travel'])) { - if ($config['websocket_server']['allow_time_travel'] == '1') { - $isAllowedToShowOlderData = true; - } - } - - if (isset($config['websocket_server']['aprs_source_id1']) && $config['websocket_server']['aprs_source_id1'] == 5) { - // Data source is OGN, disable time travel (server will block it anyway) - $isAllowedToShowOlderData = false; - } - - if (isset($config['websocket_server']['aprs_source_id2']) && $config['websocket_server']['aprs_source_id2'] == 5) { - // Data source is OGN, disable time travel (server will block it anyway) - $isAllowedToShowOlderData = false; - } - } - - return $isAllowedToShowOlderData; -} - -/** - * Returnes valid view path - * - * @param {string} $request - * @return string - */ -function getView($request) { - $parts = explode("/", trim($request, '/')); - if (count($parts) >= 2) { - $view = array_pop($parts); - $dir = array_pop($parts); - if ($view && $dir == 'views') { - $path = ROOT . '/public/views'; - foreach (scandir($path) as $file) { - if ($file == $view) { - return "$path/$view"; - } - } - } - } - return null; -} - -/** - * Returnes an assoc array containing website related values from config - * - * @param {string} $key - * @return string - * */ -function getWebsiteConfig($key) { - $config = parse_ini_file(ROOT . '/../config/trackdirect.ini', true); - if (isset($config['website']) && isset($config['website'][$key])) { - return $config['website'][$key]; - } - - return null; -} - -/** - * Convert coordinate to pixel position in heatmap image - * - * @param {float} $lat - * @param {int} $zoom - * @param {int} $imageTileSize - * @return int - */ -function getLatPixelCoordinate($lat, $zoom, $imageTileSize) { - $pixelGlobeSize = $imageTileSize * pow(2, $zoom); - $yPixelsToRadiansRatio = $pixelGlobeSize / (2 * M_PI); - $halfPixelGlobeSize = $pixelGlobeSize / 2; - $pixelGlobeCenterY = $halfPixelGlobeSize; - $degreesToRadiansRatio = 180 / M_PI; - $siny = sin($lat * M_PI / 180); - - # Truncating to 0.9999 effectively limits latitude to 89.189. This is - # about a third of a tile past the edge of the world tile. - if ($siny < -0.9999) { - $siny = -0.9999; - } - if ($siny > 0.9999) { - $siny = 0.9999; - } - $latY = round($pixelGlobeCenterY + 0.5 * log((1 + $siny) / (1 - $siny)) * -$yPixelsToRadiansRatio); - return $latY; -} - -/** - * Convert coordinate to pixel position in heatmap image - * - * @param {float} $lng - * @param {int} $zoom - * @param {int} $imageTileSize - * @return int - */ -function getLngPixelCoordinate($lng, $zoom, $imageTileSize) { - $scale = 1 << $zoom; - $lngX = floor($imageTileSize * (0.5 + $lng / 360) * $scale); - return $lngX; -} - -/** - * Convert pixel position in heatmap image to coordinate - * - * @param {float} $latPixelCoord - * @param {int} $zoom - * @param {int} $imageTileSize - * @return float - */ -function getLatFromLatPixelCoordinate($latPixelCoord, $zoom, $imageTileSize) { - $pixelGlobeSize = $imageTileSize * pow(2, $zoom); - $yPixelsToRadiansRatio = $pixelGlobeSize / (2 * M_PI); - $halfPixelGlobeSize = $pixelGlobeSize / 2; - $pixelGlobeCenterY = $halfPixelGlobeSize; - $degreesToRadiansRatio = 180 / M_PI; - $lat = (2 * atan(exp(($latPixelCoord - $pixelGlobeCenterY) / -$yPixelsToRadiansRatio)) - M_PI / 2) * $degreesToRadiansRatio; - return $lat; -} - -/** - * Convert pixel position in heatmap image to coordinate - * - * @param {float} $lngPixelCoord - * @param {int} $zoom - * @param {int} $imageTileSize - * @return float - */ -function getLngFromLngPixelCoordinate($lngPixelCoord, $zoom, $imageTileSize) { - $scale = 1 << $zoom; - $lng = ((($lngPixelCoord / $scale) / $imageTileSize) - 0.5) * 360; - return $lng; -} - diff --git a/htdocs/includes/database.class.php b/htdocs/includes/database.class.php deleted file mode 100644 index 4030cb8d8f684f67e93c0aca480fb4f620647eba..0000000000000000000000000000000000000000 --- a/htdocs/includes/database.class.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php - -class Database -{ - - private $_existingTables; - private static $_singletonInstance = null; - - /** - * The constructor - */ - public function __construct() - { - $this->_existingTables = Array(); - } - - /** - * Returnes an initiated Database - * - * @return Database - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new Database(); - } - - return self::$_singletonInstance; - } - - /** - * Returnes true if specified table exists in database - * - * @param string $tablename - * @return boolean - */ - public function checkTableExists($tablename) - { - - if (!isset($this->_existingTables[$tablename])) { - - $sql = "SELECT COUNT(*) c - FROM information_schema.tables - WHERE table_name = ?"; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, [str_replace('\'', '\'\'', $tablename)]); - - $record = $stmt->fetch(PDO::FETCH_ASSOC); - if ($record && $record['c'] > 0) { - $this->_existingTables[$tablename] = true; - } else { - $this->_existingTables[$tablename] = false; - } - } - - return $this->_existingTables[$tablename]; - } -} diff --git a/htdocs/includes/kml.class.php b/htdocs/includes/kml.class.php deleted file mode 100644 index cc448be162f732f464c0069ae1da45f2bbb3977a..0000000000000000000000000000000000000000 --- a/htdocs/includes/kml.class.php +++ /dev/null @@ -1,302 +0,0 @@ -<?php - -class Kml { - - private $_class; - private static $_singletonInstance = null; - - public function __construct($class = 'Kml') - { - $this->_class = $class; - } - - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new Kml(); - } - - return self::$_singletonInstance; - } - - public function getKmlDomDocument($station, $packets, $startTimestamp, $endTimestamp, $color) - { - $dom = new DOMDocument('1.0', 'UTF-8'); - $node = $dom->createElementNS('http://earth.google.com/kml/2.2', 'kml'); - $parNode = $dom->appendChild($node); - - $dnode = $dom->createElement('Document'); - $docNode = $parNode->appendChild($dnode); - - if (!empty($packets)) { - $lastPacket = $packets[count($packets) - 1]; - $makrerStyleNode = $this->getMarkerStyleNode($dom, $lastPacket, $color); - $docNode->appendChild($makrerStyleNode); - - $folderNode = $dom->createElement('Folder'); - $docNode->appendChild($folderNode); - - $nameNode = $dom->createElement('name', $station->name - . ' (' . $startTimestamp . ' - ' . $endTimestamp . ')'); - $folderNode->appendChild($nameNode); - - $stationNode = $this->getStationNode($dom, $station, $packets); - $folderNode->appendChild($stationNode); - } - return $dom; - } - - public function formatKmlContent($kmlContent, $tab="\t", $tabCount = 1) - { - $kmlContent = preg_replace('/(>)(<)(\/*)/', "$1\n$2$3", $kmlContent); - - $token = strtok($kmlContent, "\n"); - $result = ''; - $pad = 0; - $matches = array(); - - while ($token !== false) - { - $token = trim($token); - if (preg_match('/.+<\/\w[^>]*>$/', $token, $matches)) $indent=0; - elseif (preg_match('/^<\/\w/', $token, $matches)) - { - $pad--; - if($indent>0) $indent=0; - } - elseif (preg_match('/^<\w[^>]*[^\/]>.*$/', $token, $matches)) - { - $indent=1; - } - else $indent = 0; - - $line = str_pad($token, strlen($token)+($pad*$tabCount), $tab, STR_PAD_LEFT); - $result .= $line."\n"; - $token = strtok("\n"); - $pad += $indent; - } - - return $result; - } - - private function getMarkerStyleNode($dom, $packet, $color) - { - $styleNode = $dom->createElement('Style'); - $styleNode->setAttribute('id', 'markerStyle' . $packet->stationId); - - $iconstyleNode = $dom->createElement('IconStyle'); - $iconNode = $dom->createElement('Icon'); - $href = $dom->createElement('href', $this->getWebsiteURL() . $packet->getIconFilePath(null, null, true)); - $iconNode->appendChild($href); - $iconstyleNode->appendChild($iconNode); - $styleNode->appendChild($iconstyleNode); - - $linestyleNode = $dom->createElement('LineStyle'); - - if (preg_match('/^[A-F0-9]{8}$/', $color)) { - $colorNode = $dom->createElement('color', $color); - $linestyleNode->appendChild($colorNode); - } else { - $colorNode = $dom->createElement('color', 'ff55ff55'); - $linestyleNode->appendChild($colorNode); - } - - $widthNode = $dom->createElement('width', '5'); - $linestyleNode->appendChild($widthNode); - $styleNode->appendChild($linestyleNode); - - return $styleNode; - } - - private function getStationNode($dom, $station, $packets) { - $lastPacket = $packets[count($packets) - 1]; - - $placeNode = $dom->createElement('Placemark'); - $placeNode->setAttribute('id', 'station-' . $station->getId()); - $styleUrl = $dom->createElement('styleUrl', '#markerStyle' . $station->getId()); - $placeNode->appendChild($styleUrl); - - $nameNode = $dom->createElement('name', htmlspecialchars($station->name)); - $placeNode->appendChild($nameNode); - - $description = $this->getPacketNodeDescription($station, $packets); - if ($description !== null) { - $node = $dom->createElement('description', ($description)); - $placeNode->appendChild($node); - } - - $multiGeometryNode = $this->getMultiGeometryNode($dom, $station, $packets); - $placeNode->appendChild($multiGeometryNode); - - return $placeNode; - } - - private function getMultiGeometryNode($dom, $station, $packets) { - $lastPacket = $packets[count($packets) - 1]; - - $multiGeometryNode = $dom->createElement('MultiGeometry'); - - $altitudeMode = 'clampToGround'; - if ($this->isFlyingObject($station, $packets)) { - $altitudeMode = 'absolute'; - } - - $pointNode = $this->getPacketPointNode($dom, $lastPacket, $altitudeMode); - $multiGeometryNode->appendChild($pointNode); - - if (count($packets) > 1) { - $tailLineNode = $this->getTailLineNode($dom, $packets, $altitudeMode); - $multiGeometryNode->appendChild($tailLineNode); - } - - return $multiGeometryNode; - } - - private function getPacketPointNode($dom, $packet, $altitudeMode) - { - $pointNode = $dom->createElement('Point'); - - // Creates a coordinates element and gives it the value of the lng and lat columns from the results. - if ($packet->altitude !== null) { - $coorStr = round($packet->longitude, 5) . ',' . round($packet->latitude, 5) . ',' . round($packet->altitude, 2); - } else { - $coorStr = round($packet->longitude, 5) . ',' . round($packet->latitude, 5); - } - - $altitudeModeNode = $dom->createElement('altitudeMode', $altitudeMode); - $pointNode->appendChild($altitudeModeNode); - - $coorNode = $dom->createElement('coordinates', $coorStr); - $pointNode->appendChild($coorNode); - return $pointNode; - } - - private function getTailLineNode($dom, $packets, $altitudeMode) - { - $lineStringNode = $dom->createElement('LineString'); - - $lineCoorStr = ''; - foreach ($packets as $packet) { - if ($packet->altitude !== null) { - $lineCoorStr .= ' ' . round($packet->longitude, 5) . ',' . round($packet->latitude, 5) . ',' . round($packet->altitude, 2); - } else { - $lineCoorStr .= ' ' . round($packet->longitude, 5) . ',' . round($packet->latitude, 5); - } - } - - $altitudeModeNode = $dom->createElement('altitudeMode', $altitudeMode); - $lineStringNode->appendChild($altitudeModeNode); - - $tessellateNode = $dom->createElement('tessellate', '1'); - $lineStringNode->appendChild($tessellateNode); - - $extrudeNode = $dom->createElement('extrude', '1'); - $lineStringNode->appendChild($extrudeNode); - - $lineCoorNode = $dom->createElement('coordinates', $lineCoorStr); - $lineStringNode->appendChild($lineCoorNode); - - return $lineStringNode; - } - - private function getPacketNodeDescription($station, $packets) - { - $description = array(); - $description[] = '<a href="' . $this->getWebsiteURL() . '?sid=' . $station->getId() . '" target="_blank">Track ' . $station->name . '</a>'; - - if (!empty($packets)) { - $firstPacket = $packets[0]; - $lastPacket = $packets[count($packets) - 1]; - - $description[] = ''; - if (count($packets) == 1) { - $description[] = '<span style="color: grey;">' . strftime('%F %T %Z',$lastPacket->timestamp) . '</span>'; - } else { - $description[] = '<span style="color: grey;">' . strftime('%F %T %Z',$firstPacket->timestamp) . ' -<br>' . strftime('%F %T %Z',$lastPacket->timestamp) . '</span>'; - } - - if ($lastPacket->comment != null) { - $description[] = ''; - $description[] = '<span style="font-style: italic; color: #754D08;">' . htmlspecialchars($lastPacket->comment) . '</span>'; - } - - if ($lastPacket->speed !== null) { - $description[] = ''; - $description[] = 'Latest speed: <span style="color: blue;">' . $lastPacket->speed . 'kmh' . '</span>'; - - if ($lastPacket->altitude !== null) { - $description[] = 'Latest altitude: <span style="color: blue;">' . $lastPacket->altitude . 'm ' . '</span>'; - } - - if ($lastPacket->course !== null) { - $description[] = 'Latest course: <span style="color: blue;">' . $lastPacket->course . '°' . '</span>'; - } - } - } - - return '<div style="margin-right: 45px;">' . implode('<br/>', $description) . '</div>'; - } - - private function isClientRequestingToOften() - { - $currentMinuteTs = (time() - (time() % 60)); - $limitedNumberOfRequestsPerMinute = 60; - $logFile = 'tmp/export_kml_ip_' . $_SERVER['REMOTE_ADDR'] . '_' . $currentMinuteTs; - - // Create dir if missing - if (!file_exists('tmp')) { - mkdir('tmp'); - } - - // Delete old log-files - $files = glob('tmp/*'); - foreach ($files as $file) { - if (is_file($file) && !stristr($file, '_' . $currentMinuteTs)) { - unlink($file); - } - } - - // Log request - $log = fopen($logFile, "a"); - fwrite($log,'0'); - fclose($log); - - // Check limit - if (filesize($logFile) > $limitedNumberOfRequestsPerMinute) { - return true; - } - - return false; - } - - private function isFlyingObject($station, $packets) - { - if (count($packets) <= 1) { - // A station with only one packet is probably stationary - return false; - } - - if ($station->sourceId == 4) { - // All gliderradar stations with a tail is probably flying - return true; - } - - foreach ($packets as $packet) { - if ($packet->altitude !== null && $packet->altitude > 1000) { - // If altitude is above 1000m it is probably flying - return true; - } - } - - return false; - } - - private function getWebsiteURL() - { - return sprintf( - "%s://%s", - isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', - $_SERVER['SERVER_NAME'] - ); - } -} diff --git a/htdocs/includes/models/model.class.php b/htdocs/includes/models/model.class.php deleted file mode 100644 index 4c3b9de6ba2f7a756c5ae2952a020242abd817af..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/model.class.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php - -class Model -{ - - protected $_id; - protected $_values; - - public function __construct($id) - { - $this->_id = $id; - } - - /** - * Returns id of the object - * - * @return int - */ - public function getId() - { - return $this->_id; - } - - /** - * Returns true if object exists in database - * - * @return boolean - */ - public function isExistingObject() - { - if ($this->_id != null) { - return true; - } - return false; - } - - /** - * Makes it possible to get $object->field - * - * @param string $key - */ - public function __get($key) - { - $key = $this->_camelize($key); - - if (isset($this->_values[$key])) { - return $this->_values[$key]; - } else { - return null; - } - } - - - /** - * Makes it possible to set $object->field - * - * @param string $key - * @param mixed - */ - public function __set($key, $value) - { - $this->_values[$this->_camelize($key)] = $value; - } - - - /** - * Makes it possible to check if $object->field is set - * - * @param string $key - */ - public function __isset($key) - { - if (isset($this->_values[$key])) { - return true; - } else { - return false; - } - } - - /** - * Makes it possible to unset $object->field - * - * @param string $key - */ - public function __unset($key) - { - if (isset($this->_values[$key])) { - unset($this->_values[$key]); - } - } - - /** - * Update object from array, usually a db record - * column-names with underscores will be converted to camelcase - * - * @param array $array - */ - public function updateObjectFromArray($array) - { - foreach ($array as $column => $value) { - $this->_values[$this->_camelize($column)] = $value; - } - } - - /** - * Convert underscore separated variables to camelcaps - * (for some reason I prefer underscore in db-columns but I prefer camelCaps in code...) - * - * @param string $input - * @return string - */ - private function _camelize($input) - { - return lcfirst(str_replace('_', '', ucwords($input, '_'))); - } -} diff --git a/htdocs/includes/models/packet.class.php b/htdocs/includes/models/packet.class.php deleted file mode 100644 index 3d14372851a01fec4dbc7976ca3103e591bc498a..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/packet.class.php +++ /dev/null @@ -1,375 +0,0 @@ -<?php - -class Packet extends Model -{ - - public function __construct($id) - { - parent::__construct($id); - } - - /** - * Returnes icon http path - * - * @param int $scaleWidth - * @param int $scaleHeight - * @return string - */ - public function getIconFilePath($scaleWidth = null, $scaleHeight = null) - { - if (strlen($this->symbol) >= 1 && strlen($this->symbolTable) >= 1) { - $symbolAsciiValue = ord(substr($this->symbol, 0, 1)); - $symbolTableAsciiValue = ord(substr($this->symbolTable, 0, 1)); - } else { - // Default values - $symbolAsciiValue = 125; - $symbolTableAsciiValue = 47; - } - - $scaleStrValue = ''; - if ($scaleWidth !== null && $scaleHeight !== null) { - $scaleStrValue = '-scale' . $scaleWidth . 'x' . $scaleHeight; - } - - return '/symbols/symbol-' . $symbolAsciiValue . '-' . $symbolTableAsciiValue . $scaleStrValue . '.png'; - } - - /** - * Get PGH range in meters - * - * @return float - */ - public function getPHGRange() - { - if ($this->getPhg() != null) { - $p = $this->getPhgPower(); - $h = $this->getPhgHaat(false); - $g = $this->getPhgGain(); - - $gain = pow(10, ($g/10)); //converts from DB to decimal - $range = sqrt(2 * $h * sqrt(($p / 10) * ($gain / 2))); - return $range / 0.000621371192; // convert to m and return - } - return null; - } - - /** - * Get PGH description - * - * @return String - */ - public function getPHGDescription() - { - if ($this->getPhg() != null) { - $power = $this->getPhgPower(); - $haat = $this->getPhgHaat(); - $gain = $this->getPhgGain(); - $direction = $this->getPhgDirection(); - $range = $this->getPHGRange(); - - $description = ''; - if ($power !== null) { - $description .= 'Power ' . $power . ' W'; - } - - if ($haat !== null) { - - if (strlen($description) > 0) { - $description .= ', '; - } - - if (isImperialUnitUser()) { - $description .= 'Height ' . round(convertMeterToFeet($haat), 0) . ' ft'; - } else { - $description .= 'Height ' . $haat . ' m'; - } - } - - if ($gain !== null && $direction !== null) { - if (strlen($description) > 0) { - $description .= ', '; - } - $description .= 'Gain ' . $gain . ' dB ' . $direction; - } - - return $description; - } - return null; - } - - /** - * Get PGH string - * - * @return string - */ - public function getPhg() - { - if ($this->phg != null) { - if ($this->phg == 0) { - return null; // 0000 is considered not to be used (power == 0!) - } else if ($this->phg < 10) { - return '000' + strval($this->phg); - } else if ($this->phg < 100) { - return '00' + strval($this->phg); - } else if ($this->phg < 1000) { - return '0' + strval($this->phg); - } else { - return strval($this->phg); - } - } - return null; - } - - /** - * Get PGH power - * - * @return int - */ - public function getPhgPower() - { - if ($this->getPhg() != null) { - return pow(intval(substr($this->getPhg(), 0, 1)), 2); - } - return null; - } - - /** - * Get PGH hight (above averange terrain) - * - * @param boolean $inMeters - * @return int - */ - public function getPhgHaat($inMeters = true) - { - if ($this->getPhg() != null) { - $value = intval(substr($this->getPhg(), 1, 1)); - - $haat = 0; - if ($value != 0) { - $haat = 10 * pow(2, $value); - } - - if ($inMeters) { - return intval(round($haat * 0.3048)); - } else { - return $haat; - } - - } - return null; - } - - /** - * Get PGH Gain - * - * @return int - */ - public function getPhgGain() - { - if ($this->getPhg() != null) { - return intval(substr($this->getPhg(), 2, 1)); - } - return null; - } - - /** - * Get PGH Direction - * - * @return String - */ - public function getPhgDirection() - { - if ($this->getPhg() != null) { - - switch (substr($this->getPhg(), 3, 1)) { - case 0: - return 'omni'; - break; - case 1: - return 'North East'; - break; - case 2: - return 'East'; - break; - case 3: - return 'South East'; - break; - case 4: - return 'South'; - break; - case 5: - return 'South West'; - break; - case 6: - return 'West'; - break; - case 7: - return 'North West'; - break; - case 8: - return 'North'; - break; - case 9: - return null; - break; - } - } - return null; - } - - /** - * Get PGH Direction Degree - * - * @return int - */ - public function getPhgDirectionDegree() - { - if ($this->getPhg() != null) { - - switch (substr($this->getPhg(), 3, 1)) { - case 0: - return null; - break; - case 1: - return 45; - break; - case 2: - return 90; - break; - case 3: - return 135; - break; - case 4: - return 180; - break; - case 5: - return 225; - break; - case 6: - return 270; - break; - case 7: - return 315; - break; - case 8: - return 360; - break; - case 9: - return null; - break; - } - } - return null; - } - - /** - * Get RNG - * - * @return float - */ - public function getRng() - { - if ($this->rng != null) { - return $this->rng; - } - return null; - } - - /** - * Get packet type description - * - * @return Station - */ - public function getPacketTypeName() - { - switch ($this->packetTypeId) { - case 1: - return 'Position'; - break; - case 2: - return 'Direction'; - break; - case 3: - return 'Weather'; - break; - case 4: - return 'Object'; - break; - case 5: - return 'Item'; - break; - case 6: - return 'Telemetry'; - break; - case 7: - return 'Message'; - break; - case 8: - return 'Query'; - break; - case 9: - return 'Response'; - break; - case 10: - return 'Status'; - break; - case 11: - return 'Other'; - break; - default: - return 'Unknown'; - break; - } - } - - /** - * Get releted packet weather - * @return PacketWeather - */ - public function getPacketWeather() { - return PacketWeatherRepository::getInstance()->getObjectByPacketId($this->id, $this->timestamp); - } - - /** - * Get releted packet telemetry - * @return PacketTelemetry - */ - public function getPacketTelemetry() { - return PacketTelemetryRepository::getInstance()->getObjectByPacketId($this->id, $this->timestamp); - } - - /** - * Returns OGN part of packet - * - * @return PacketOgn - */ - public function getPacketOgn() - { - static $cache = array(); - $key = $this->id; - if (!isset($cache[$key])) { - if ($this->sourceId == 5) { - $cache[$key] = PacketOgnRepository::getInstance()->getObjectByPacketId($this->id); - } else { - $cache[$key] = new PacketOgn(null); - } - } - return $cache[$key]; - } - - /** - * Get Station - * @return Station - */ - public function getStationObject() { - return StationRepository::getInstance()->getObjectById($this->stationId); - } - - /** - * Get Sender - * @return Sender - */ - public function getSenderObject() { - return SenderRepository::getInstance()->getObjectById($this->senderId); - } -} diff --git a/htdocs/includes/models/packetogn.class.php b/htdocs/includes/models/packetogn.class.php deleted file mode 100644 index 5150d13c0c25f760060884996e495c7d39fd5d57..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/packetogn.class.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -class PacketOgn extends Model -{ - public function __construct($id) - { - parent::__construct($id); - - } -} diff --git a/htdocs/includes/models/packetpath.class.php b/htdocs/includes/models/packetpath.class.php deleted file mode 100644 index d82275b6d6295311d2df836e3a789e5617cd163b..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/packetpath.class.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -class PacketPath extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } - -} diff --git a/htdocs/includes/models/packettelemetry.class.php b/htdocs/includes/models/packettelemetry.class.php deleted file mode 100644 index 152e7f0fc3b4ae3c72a4d898533df0dcbd4a3ceb..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/packettelemetry.class.php +++ /dev/null @@ -1,236 +0,0 @@ -<?php - -class PacketTelemetry extends Model -{ - - private $_stationTelemetryParam; - private $_stationTelemetryEqns; - private $_stationTelemetryBits; - private $_stationTelemetryUnit; - - public function __construct($id) - { - parent::__construct($id); - $this->_stationTelemetryParam = null; - $this->_stationTelemetryEqns = null; - $this->_stationTelemetryBits = null; - $this->_stationTelemetryUnit = null; - } - - /** - * Get value parameter name - * - * @param int $valNumber - * @return string - */ - public function getValueParameterName($valNumber) - { - if ($this->_stationTelemetryParam === null && $this->stationTelemetryParamId !== null) { - $this->_stationTelemetryParam = StationTelemetryParamRepository::getInstance()->getObjectById($this->stationTelemetryParamId); - } - - if ($this->_stationTelemetryParam !== null - && $this->_stationTelemetryParam->isExistingObject() - && isset($this->_stationTelemetryParam->{'p'.$valNumber}) - && $this->_stationTelemetryParam->{'p'.$valNumber} != '' - ) { - - return $this->_stationTelemetryParam->{'p'.$valNumber}; - } else { - return "Value$valNumber"; - } - } - - /** - * Get bit parameter name - * - * @param int $valNumber - * @return string - */ - public function getBitParameterName($valNumber) - { - if ($this->_stationTelemetryParam === null && $this->stationTelemetryParamId !== null) { - $this->_stationTelemetryParam = StationTelemetryParamRepository::getInstance()->getObjectById($this->stationTelemetryParamId); - } - - if ($this->_stationTelemetryParam !== null && $this->_stationTelemetryParam->isExistingObject() && $this->_stationTelemetryParam->{'b'.$valNumber} != '') { - return $this->_stationTelemetryParam->{'b'.$valNumber}; - } else { - return "Bit$valNumber"; - } - } - - /** - * Get value eqns - * - * @param int $valNumber - * @return numeric - */ - public function getEqnsValue($valNumber) - { - if ($this->_stationTelemetryEqns === null && $this->stationTelemetryEqnsId !== null) { - $this->_stationTelemetryEqns = StationTelemetryEqnsRepository::getInstance()->getObjectById($this->stationTelemetryEqnsId); - } - - if ($this->_stationTelemetryEqns !== null && $this->_stationTelemetryEqns->isExistingObject()) { - $a = $this->_stationTelemetryEqns->{'a'.$valNumber}; - $b = $this->_stationTelemetryEqns->{'b'.$valNumber}; - $c = $this->_stationTelemetryEqns->{'c'.$valNumber}; - - if ($a === null && $b === null) { - // User has sent us a faulty eqns, just return raw value - return Array(0, 1, 0); - } else { - if ($a === null) { - $a = 0; - } - if ($b === null) { - $b = 0; - } - if ($c === null) { - $c = 0; - } - return Array($a, $b, $c); - } - - } else { - // We have no eqns, just return raw value - return Array(0, 1, 0); - } - } - - /** - * Check if value is set value - * - * @param int $valNumber - * @return bool - */ - public function isValueSet($valNumber) - { - $val = $this->{'val'.$valNumber}; - if ($val !== null) { - return true; - } - return false; - } - - /** - * Get value - * - * @param int $valNumber - * @return numeric - */ - public function getValue($valNumber) - { - $val = $this->{'val'.$valNumber}; - - $eqns = $this->getEqnsValue($valNumber); - $a = $eqns[0]; - $b = $eqns[1]; - $c = $eqns[2]; - - if ($a == null && $b == null) { - // User has sent us a faulty eqns, just return raw value - return $val; - - } else { - $result = 0; - - if ($a != null) { - $result += $a * $val * $val; - } - - if ($b != null) { - $result += $b * $val; - } - - if ($c != null) { - $result += $c; - } - - return $result; - } - } - - /** - * Get value unit - * - * @param int $valNumber - * @return string - */ - public function getValueUnit($valNumber) - { - $unit = ''; // default - if ($this->_stationTelemetryUnit === null && $this->stationTelemetryUnitId !== null) { - $this->_stationTelemetryUnit = StationTelemetryUnitRepository::getInstance()->getObjectById($this->stationTelemetryUnitId); - } - - if ($this->_stationTelemetryUnit !== null && $this->_stationTelemetryUnit->isExistingObject()) { - $unit = ' ' . $this->_stationTelemetryUnit->{'u'.$valNumber}; - } - - return $unit; - } - - /** - * Get bit sense - * - * @param int $valNumber - * @return int - */ - public function getBitSense($valNumber) - { - if ($this->_stationTelemetryBits === null && $this->stationTelemetryBitsId !== null) { - $this->_stationTelemetryBits = StationTelemetryBitsRepository::getInstance()->getObjectById($this->stationTelemetryBitsId); - } - - $sense = 1; // default to 1 - if ($this->_stationTelemetryBits !== null && $this->_stationTelemetryBits->isExistingObject()) { - $sense = substr($this->_stationTelemetryBits->bits, $valNumber-1, 1); - } - - return $sense; - } - - /** - * Get bit - * - * @param int $valNumber - * @return int - */ - public function getBit($valNumber) - { - if ($this->_stationTelemetryBits === null && $this->stationTelemetryBitsId !== null) { - $this->_stationTelemetryBits = StationTelemetryBitsRepository::getInstance()->getObjectById($this->stationTelemetryBitsId); - } - - $sense = $this->getBitSense($valNumber); - - $bit = substr($this->bits, $valNumber-1, 1); - if (($sense == 1 && $bit == 1) || ($sense == 0 && $bit == 0)) { - return 1; - } else { - return 0; - } - } - - /** - * Get bit label - * - * @param int $valNumber - * @return int - */ - public function getBitLabel($valNumber) - { - if ($this->_stationTelemetryUnit === null && $this->stationTelemetryUnitId !== null) { - $this->_stationTelemetryUnit = StationTelemetryUnitRepository::getInstance()->getObjectById($this->stationTelemetryUnitId); - } - - $label = 'On'; // default - if ($this->_stationTelemetryUnit !== null && $this->_stationTelemetryUnit->isExistingObject()) { - $label = $this->_stationTelemetryUnit->{'l'.$valNumber}; - } - - return $label; - } -} diff --git a/htdocs/includes/models/packetweather.class.php b/htdocs/includes/models/packetweather.class.php deleted file mode 100644 index 134b1beeef9521ba07c4778ecaa422a686a0e150..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/packetweather.class.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php - -class PacketWeather extends Model -{ - public function __construct($id) - { - parent::__construct($id); - - } - - /** - * Returnes a rain summary string - * - * @param boolean $showRain1h - * @param boolean $showRain24h - * @param boolean $showRainSinceMidnight - * @return string - */ - public function getRainSummary($showRain1h = true, $showRain24h = true, $showRainSinceMidnight = true) - { - $result = $this->getRainSummaryList($showRain1h, $showRain24h, $showRainSinceMidnight); - - if (empty($result)) { - if ($this->rain_1h === null && $this->rain_24h === null && $this->rain_since_midnight === null) { - return 'No rain measurements received'; - } else { - return 'No other rain measurements received'; - } - } else { - return implode('
', $result); - } - } - - /** - * Returnes a rain summary array - * - * @param boolean $showRain1h - * @param boolean $showRain24h - * @param boolean $showRainSinceMidnight - * @return string - */ - public function getRainSummaryList($showRain1h = true, $showRain24h = true, $showRainSinceMidnight = true) - { - $result = []; - - if ($showRain1h && $this->rain_1h !== null) { - if (isImperialUnitUser()) { - $result[] = "Rain latest hour: " . round(convertMmToInch($this->rain_1h), 2) . " in"; - } else { - $result[] = "Rain latest hour: " . round($this->rain_1h, 2) . " mm"; - } - } - - if ($showRain24h && $this->rain_24h !== null) { - if (isImperialUnitUser()) { - $result[] = "Rain latest 24h hours: " . round(convertMmToInch($this->rain_24h), 2) . " in"; - } else { - $result[] = "Rain latest 24h hours: " . round($this->rain_24h, 2) . " mm"; - } - } - - if ($showRainSinceMidnight && $this->rain_since_midnight !== null) { - if (isImperialUnitUser()) { - $result[] = "Rain since midnight: " . round(convertMmToInch($this->rain_since_midnight), 2) . " in"; - } else { - $result[] = "Rain since midnight: " . round($this->rain_since_midnight, 2) . " mm"; - } - } - - return $result; - } -} diff --git a/htdocs/includes/models/sender.class.php b/htdocs/includes/models/sender.class.php deleted file mode 100644 index 4f61f6a8cae7af8f787d4c7da332e3f19f93af7b..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/sender.class.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -class Sender extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } - - /** - * Get sender station - * - * @return Station - */ - public function getSenderStationObject() - { - return StationRepository::getInstance()->getObjectByNameAndSenderId($this->name, $this->id); - } -} diff --git a/htdocs/includes/models/station.class.php b/htdocs/includes/models/station.class.php deleted file mode 100644 index b3a91cb6a4311834ce2f5e464918cf6e675860e4..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/station.class.php +++ /dev/null @@ -1,322 +0,0 @@ -<?php - -class Station extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } - - /** - * Returnes likly ham radio callsign - * - * @return string - */ - public function getLiklyHamRadioCallsign() - { - if ($this->sourceId == 1 && $this->stationTypeId == 1) { - $pos = strpos($this->name, '-'); - if ($pos !== false) { - $callsign = substr($this->name, 0, $pos); - } else { - $callsign = $this->name; - } - - if (strlen($callsign) >= 3 && preg_match('~[0-9]~', substr($callsign, 1, strlen($callsign)-1))) { - // At least 3 letters and a digit somewhere in the middle - return $callsign; - } - } - - return null; - } - - - /** - * Returns OGN sender address - * - * @return string - */ - public function getOgnSenderAddress() - { - if (isset($this->latestOgnSenderAddress) && $this->latestOgnSenderAddress != '') { - return $this->latestOgnSenderAddress; - } - return null; - } - - /** - * Returns OGN device - * - * @return Model - */ - public function getOgnDevice() - { - static $cache = array(); - $key = $this->id; - if (!isset($cache[$key])) { - if (isset($this->latestOgnSenderAddress) && $this->latestOgnSenderAddress != '') { - $cache[$key] = ModelRepository::getInstance()->getObjectFromSql('select * from ogn_device where device_id = ?', [$this->latestOgnSenderAddress]); - } else { - $cache[$key] = null; - } - } - return $cache[$key]; - } - - /** - * Returns OGN device DB aircraft type name - * - * @return string - */ - public function getOgnDdbAircraftTypeName() - { - $ognDevice = $this->getOgnDevice(); - if ($ognDevice) { - switch ($ognDevice->ddbAircraftType) { - case 1: - return 'Glider/Motoglider'; - case 2: - return 'Plane'; - case 3: - return 'Ultralight'; - case 4: - return 'Helicopter'; - case 5: - return 'Drone/UAV'; - case 6: - return 'Other'; - } - } - return null; - } - - /** - * Returns OGN aircraft type name - * - * @return string - */ - public function getOgnAircraftTypeName() - { - if (isset($this->latestOgnAircraftTypeId) && $this->latestOgnAircraftTypeId != '') { - switch ($this->latestOgnAircraftTypeId) { - case 1: - return 'Glider'; - case 2: - return 'Tow Plane'; - case 3: - return 'Helicopter'; - case 4: - return 'Parachute'; - case 5: - return 'Drop Plane'; - case 6: - return 'Hang Glider'; - case 7: - return 'Para Glider'; - case 8: - return 'Powered Aircraft'; - case 9: - return 'Jet Aircraft'; - case 10: - return 'UFO'; - case 11: - return 'Balloon'; - case 12: - return 'Airship'; - case 13: - return 'UAV'; - case 14: - return ''; - case 15: - return 'Static Object'; - } - } - return null; - } - - /** - * Returns source description - * - * @return string - */ - public function getSourceDescription() - { - if (isset($this->sourceId) && $this->sourceId != '') { - if ($this->sourceId == 1) { - return '<a target="_blank" rel="nofollow" href="http://www.aprs-is.net/">APRS-IS</a>'; - } elseif ($this->sourceId == 2) { - return '<a target="_blank" rel="nofollow" href="http://wxqa.com/">CWOP (Citizen Weather Observer Program)</a>'; - } elseif ($this->sourceId == 5) { - return '<a target="_blank" rel="nofollow" href="http://wiki.glidernet.org/">OGN (Open Glider Network)</a>'; - } - } - return null; - } - - /** - * Get distance between specified lat/lng and the station latest position (confirmed position if exists) - * - * @param float $lat - * @param float $lng - * @return int; - */ - public function getDistance($lat, $lng) - { - static $cache = array(); - $key = $this->id . ':' . $lat . ':' . $lng; - if (!isset($cache[$key])) { - - $latestLatitude = null; - $latestLongitude = null; - if ($this->latestConfirmedLongitude !== null && $this->latestConfirmedLatitude !== null) { - $latestLatitude = $this->latestConfirmedLatitude; - $latestLongitude = $this->latestConfirmedLongitude; - } else if ($this->latestLongitude !== null && $this->latestLatitude !== null) { - $latestLatitude = $this->latestLatitude; - $latestLongitude = $this->latestLongitude; - } - - if ($lat !== null && $lng !== null && $latestLatitude !== null && $latestLongitude !== null) { - $theta = $lng - $latestLongitude; - $dist = sin(deg2rad($lat)) * sin(deg2rad($latestLatitude)) + cos(deg2rad($lat)) * cos(deg2rad($latestLatitude)) * cos(deg2rad($theta)); - $dist = acos($dist); - $dist = rad2deg($dist); - $miles = $dist * 60 * 1.1515; - $cache[$key] = round($miles * 1609.344, 0); - } else { - $cache[$key] = null; - } - } - return $cache[$key]; - } - - /** - * Returnes icon http path - * - * @param int $scaleWidth - * @param int $scaleHeight - * @return string - */ - public function getIconFilePath($scaleWidth = null, $scaleHeight = null) - { - if (strlen($this->latestConfirmedSymbol) >= 1 && strlen($this->latestConfirmedSymbolTable) >= 1) { - $symbolAsciiValue = ord(substr($this->latestConfirmedSymbol, 0, 1)); - $symbolTableAsciiValue = ord(substr($this->latestConfirmedSymbolTable, 0, 1)); - } else { - // Default values - $symbolAsciiValue = 125; - $symbolTableAsciiValue = 47; - } - - $scaleStrValue = ''; - if ($scaleWidth !== null && $scaleHeight !== null) { - $scaleStrValue = '-scale' . $scaleWidth . 'x' . $scaleHeight; - } - - return '/symbols/symbol-' . $symbolAsciiValue . '-' . $symbolTableAsciiValue . $scaleStrValue . '.png'; - } - - /** - * Get array of the latest used symbols for this station - * - * @param int $scaleWidth - * @param int $scaleHeight - * @return array - */ - public function getLatestIconFilePaths($scaleWidth = 24, $scaleHeight = 24) - { - $result = Array(); - if ($this->latestConfirmedPacketTimestamp > (time() - (60*60*24))) { - // Latest packet is not that old, go on - - $scaleStrValue = ''; - if ($scaleWidth !== null && $scaleHeight !== null) { - $scaleStrValue = '-scale' . $scaleWidth . 'x' . $scaleHeight; - } - - $sql = 'select symbol, symbol_table from packet where station_id = ? and timestamp > ? group by symbol, symbol_table'; - $stmt = PDOConnection::getInstance()->prepareAndExec($sql, [$this->id, $this->latestConfirmedPacketTimestamp - (60*60*24)]); - - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - foreach ($records as $record) { - - if (strlen($record['symbol']) >= 1 && strlen($record['symbol_table']) >= 1) { - $key = $record['symbol'] . ':' . $record['symbol_table']; - - $symbolAsciiValue = ord(substr($record['symbol'], 0, 1)); - $symbolTableAsciiValue = ord(substr($record['symbol_table'], 0, 1)); - $result[$key] = '/symbols/symbol-' . $symbolAsciiValue . '-' . $symbolTableAsciiValue . $scaleStrValue . '.png'; - } - } - } - - return array_values($result); - } - - /** - * Get packet frequency in number of seconds for the latest 10 packets - * - * @param string $date - * @param int &$numberOfPackets - * @return int - */ - public function getPacketFrequency($date = null, &$numberOfPackets) - { - $pdo = PDOConnection::getInstance(); - if ($this->latestPacketTimestamp !== null) { - $timestamp = $this->latestPacketTimestamp; - } else { - return null; - } - - // Find start timestamp - $sql = 'select timestamp ts from packet where station_id = ? and map_id in (1,2,5,7,9) and timestamp < ? order by timestamp desc limit 1'; - $stmt = $pdo->prepareAndExec($sql, [$this->id, $timestamp - 1]); - - $record = $stmt->fetch(PDO::FETCH_ASSOC); - if (!empty($record) && $record['ts'] != null && $record['ts'] < $timestamp) { - $startTimestamp = $timestamp - (($timestamp - $record['ts'])*10); - if ($timestamp - $startTimestamp < 600) { - $startTimestamp = $timestamp - 600; - } - } else { - if ($date === null) { - // Try to find frequency for the date before - $date = strftime('%Y-%m-%d', $timestamp - 86400); - return $this->getPacketFrequency($date, $numberOfPackets); - } else { - // Give up - return null; - } - } - - $sql = 'select (max(timestamp) - min(timestamp)) / count(*) freq, count(*) c from packet where station_id = ? and map_id in (1,2,5,7,9) and timestamp >= ?'; - $stmt = $pdo->prepareAndExec($sql, [$this->id, $startTimestamp]); - $record = $stmt->fetch(PDO::FETCH_ASSOC); - if (!empty($record) && $record['freq'] > 0) { - $numberOfPackets = $record['c']; - return $record['freq']; - } else { - return null; - } - } - - /* - * Returnes symbol description - * @param boolean $includeUndefinedOverlay - * @return string - */ - public function getLatestSymbolDescription($includeUndefinedOverlay = true) - { - $symbol = null; - $symbolTable = null; - - if (strlen($this->latestConfirmedSymbol) >= 1 && strlen($this->latestConfirmedSymbolTable) >= 1) { - $symbol = $this->latestConfirmedSymbol; - $symbolTable = $this->latestConfirmedSymbolTable; - } - - return getSymbolDescription($symbolTable, $symbol, $includeUndefinedOverlay); - } -} diff --git a/htdocs/includes/models/stationtelemetrybits.class.php b/htdocs/includes/models/stationtelemetrybits.class.php deleted file mode 100644 index 68078b7c62c2bd01090f585dde1e108b6cccb55d..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/stationtelemetrybits.class.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -class StationTelemetryBits extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } -} diff --git a/htdocs/includes/models/stationtelemetryeqns.class.php b/htdocs/includes/models/stationtelemetryeqns.class.php deleted file mode 100644 index 1b3813fd16d1a5a0d52de970031184333ab67f13..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/stationtelemetryeqns.class.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -class StationTelemetryEqns extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } -} diff --git a/htdocs/includes/models/stationtelemetryparam.class.php b/htdocs/includes/models/stationtelemetryparam.class.php deleted file mode 100644 index 5b3bf472ee85e552ca29c1e7ee0a8de02cf6ba54..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/stationtelemetryparam.class.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -class StationTelemetryParam extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } -} diff --git a/htdocs/includes/models/stationtelemetryunit.class.php b/htdocs/includes/models/stationtelemetryunit.class.php deleted file mode 100644 index c14b4b01d2e5162cb73927331b252fff804ac298..0000000000000000000000000000000000000000 --- a/htdocs/includes/models/stationtelemetryunit.class.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -class StationTelemetryUnit extends Model -{ - public function __construct($id) - { - parent::__construct($id); - } -} diff --git a/htdocs/includes/pdoconnection.class.php b/htdocs/includes/pdoconnection.class.php deleted file mode 100644 index dfc2bd8caa41d50c5b424e891917eedb2dcedbe8..0000000000000000000000000000000000000000 --- a/htdocs/includes/pdoconnection.class.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php - -class PDOConnection -{ - - private static $_singletonInstance = null; - private $_db; - private $_config; - - public function __construct() - { - $this->_config = parse_ini_file(ROOT . '/../config/trackdirect.ini', true); - } - - /** - * Connect to the database. - */ - private function createConnection() - { - if (is_array($this->_config) && isset($this->_config['database'])) { - $databaseconfig = $this->_config['database']; - - if (!isset($databaseconfig['username'])) { - $databaseconfig['username'] = get_current_user(); - } - - try { - $this->_db = new PDO( - sprintf( - 'pgsql:dbname=%s;host=%s;port=%s;user=%s;password=%s', - $databaseconfig['database'], - $databaseconfig['host'], - $databaseconfig['port'], - $databaseconfig['username'], - $databaseconfig['password'] - ), null, null, - array( - PDO::ATTR_PERSISTENT => false, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION - ) - ); - } catch (PDOException $e) { - echo $e; - throw new Exception("Failed to connect to database."); - } - } else { - throw new Exception("Failed to parse database ini file."); - } - } - - /** - * Returnes a PDO db connection - * - * @return PDO - */ - private function getConnection() - { - if($this->_db === null) { - $this->createConnection(); - } - - return $this->_db; - } - - /** - * Executes an SQL statement, returning a result set as a PDOStatement object - * - * @param string $sql - * @return PDOStatement - */ - public function query($sql) - { - return $this->getConnection()->query($sql); - } - - /** - * Prepares a statement for execution and returns a statement object - * - * @param string $sql - * @return PDOStatement - */ - public function prepare($sql) - { - return $this->getConnection()->prepare($sql); - } - - /** - * Prepares a statement for execution and execute the prepared statement. Returnes the statment object - * - * @param string $sql - * @param array $arguments - * @return PDOStatement - */ - public function prepareAndExec($sql, array $arguments = array()) - { - $statement = $this->prepare($sql); - $statement->execute($arguments); - return $statement; - } - - /** - * Initiates a transaction. Turns off autocommit mode. Returns TRUE on success or FALSE on failure. - * - * @return boolean - */ - public function beginTransaction() - { - $this->getConnection()->beginTransaction(); - } - - /** - * Commits a transaction. Returns TRUE on success or FALSE on failure. - * - * @return boolean - */ - public function commit() - { - $this->getConnection()->commit(); - } - - /** - * Rolls back the current transaction (that was started by beginTransaction). Returns TRUE on success or FALSE on failure. - * - * @return boolean - */ - public function rollBack() - { - $this->getConnection()->rollBack(); - } - - /** - * Get the ID of the last inserted record. - * - * @param string $table - * @param string $column - * @return int - */ - public function lastInsertId($table, $column) - { - $suffix = '_' . $column . '_seq'; - - /* The max length of an identifier is 63 characters, - * if table_column_seq exceeds this postgres cuts the - * table name by default. */ - $table = substr($table, 0, 63 - (strlen($suffix))); - $sequenceName = $table . $suffix; - - return $this->getConnection()->lastInsertId($sequenceName); - } - - /** - * Returnes an initiated PDOConnection - * - * @return PDOConnection - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new PDOConnection(); - } - - return self::$_singletonInstance; - } -} diff --git a/htdocs/includes/repositories/modelrepository.class.php b/htdocs/includes/repositories/modelrepository.class.php deleted file mode 100644 index 92d8d0dd991358e026adae9619a30c842a28a4b4..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/modelrepository.class.php +++ /dev/null @@ -1,102 +0,0 @@ -<?php - -class ModelRepository -{ - - private $_class; - private static $_singletonInstance = null; - - public function __construct($class = 'Model') - { - $this->_class = $class; - } - - /** - * Returnes an initiated ModelRepository - * - * @return ModelRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new ModelRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Returns an object based on the provided sql - * - * @param string $sql - * @param array $arg - * @return StandardItem - */ - public function getObjectFromSql($sql, $arg) - { - $pdo = PDOConnection::getInstance(); - - $stmt = $pdo->prepareAndExec($sql, $arg); - if ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { - return $this->_getObjectFromRecord($record); - } - - // No object found, return empty object - return new $this->_class(null); - } - - /** - * Returns an array of object based on the provided sql - * - * @param string $sql - * @param array $arg - * @return array - */ - public function getObjectListFromSql($sql, $arg) - { - $pdo = PDOConnection::getInstance(); - - $stmt = $pdo->prepareAndExec($sql, $arg); - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - if (is_array($records) && !empty($records)) { - return $this->_getObjectListFromRecords($records); - } - - // No object found, return empty array - return []; - } - - /** - * Returns an object based on the provided record - * - * @param array $record - * @return StandardItem - */ - protected function _getObjectFromRecord($record) - { - if (isset($record['id'])) { - $object = new $this->_class($record['id']); - } else { - $object = new $this->_class(0); - } - $object->updateObjectFromArray($record); - return $object; - } - - /** - * Returns a list of objects filled with values from the provided records - * - * @param array $records - * @return Array of StandardItem - */ - protected function _getObjectListFromRecords($records) - { - $list = Array(); - - foreach ($records as $record) { - $list[] = $this->_getObjectFromRecord($record); - } - - return $list; - } -} \ No newline at end of file diff --git a/htdocs/includes/repositories/packetognrepository.class.php b/htdocs/includes/repositories/packetognrepository.class.php deleted file mode 100644 index b692dcad97f580abf79a2f4730ce20a2588d8438..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/packetognrepository.class.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -class PacketOgnRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('PacketOgn'); - } - - /** - * Returnes an initiated PacketOgnRepository - * - * @return PacketOgnRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new PacketOgnRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return PacketOgn - */ - public function getObjectById($id) - { - if (!isInt($id)) { - return new PacketOgn(0); - } - return $this->getObjectFromSql('select * from packet_ogn where id = ?', [$id]); - } - - /** - * Get object by packet id - * - * @param int $id - * @return PacketOgn - */ - public function getObjectByPacketId($packetId) - { - if (!isInt($packetId)) { - return new PacketOgn(0); - } - return $this->getObjectFromSql('select * from packet_ogn where packet_id = ?', [$packetId]); - } -} diff --git a/htdocs/includes/repositories/packetpathrepository.class.php b/htdocs/includes/repositories/packetpathrepository.class.php deleted file mode 100644 index 6fa24947162f3185bc9e9d36c16246f01a47ab44..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/packetpathrepository.class.php +++ /dev/null @@ -1,165 +0,0 @@ -<?php - -class PacketPathRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('PacketPath'); - } - - /** - * Returnes an initiated PacketPathRepository - * - * @return PacketPathRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new PacketPathRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return PacketPath - */ - public function getObjectById($id) - { - if (!isInt($packetId)) { - return new PacketPath(0); - } - return $this->getObjectFromSql('select * from packet_path where id = ?', [$id]); - } - - /** - * Get object by packet id - * - * @param int $id - * @return PacketPath - */ - public function getObjectListByPacketId($id) - { - if (!isInt($id)) { - return []; - } - return $this->getObjectListFromSql('select * from packet_path where packet_id = ?', [$id]); - } - - /** - * Get packet path statistics for sending station - * - * @param int $stationId - * @param int $minTimestamp - * @return array - */ - public function getSenderPacketPathSatistics($stationId, $minTimestamp = null) - { - if (!isInt($stationId)) { - return []; - } - if ($minTimestamp == null || !isInt($minTimestamp)) { - $minTimestamp = time() - (60*60*24*10); // Default to 10 days - } - $sql = 'select station_id, count(*) number_of_packets, max(timestamp) latest_timestamp, max(distance) longest_distance from packet_path where sending_station_id = ? and timestamp > ? and number = 0 and station_id != sending_station_id group by station_id order by max(timestamp) desc'; - $args = [$stationId, $minTimestamp]; - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $args); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get packet path statistics for receiving station - * - * @param int $stationId - * @param int $minTimestamp - * @return array - */ - public function getReceiverPacketPathSatistics($stationId, $minTimestamp = null) - { - if (!isInt($stationId)) { - return []; - } - if ($minTimestamp == null || !isInt($minTimestamp)) { - $minTimestamp = time() - (60*60*24*10); // Default to 10 days - } - $sql = 'select sending_station_id station_id, count(*) number_of_packets, max(timestamp) latest_timestamp, max(distance) longest_distance from packet_path where station_id = ? and timestamp > ? and number = 0 and station_id != sending_station_id group by sending_station_id order by max(timestamp) desc'; - $args = [$stationId, $minTimestamp]; - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $args); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get latest data list by receiving station id - * - * @param int $stationId - * @param int $hours - * @param int $limit - * @return array - */ - public function getLatestDataListByReceivingStationId($stationId, $hours, $limit) - { - if (!isInt($stationId) || !isInt($hours)) { - return []; - } - $minTimestamp = time() - (60*60*$hours); - - $sql = 'select pp.* - from packet_path pp - where pp.station_id = ? - and pp.timestamp >= ? - and pp.number = 0 - and pp.sending_latitude is not null - and pp.sending_longitude is not null - order by pp.timestamp - limit ?'; - - $arg = [$stationId, $minTimestamp, $limit]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $arg); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get latest data list by receiving station id (will try to exclude stationary sending stations) - * - * @param int $stationId - * @param int $hours - * @param int $limit - * @return array - */ - public function getLatestMovingDataListByReceivingStationId($stationId, $hours, $limit) - { - if (!isInt($stationId) || !isInt($hours)) { - return []; - } - $minTimestamp = time() - (60*60*$hours); - - $sql = 'select pp.* - from packet_path pp - join station s on s.id = pp.sending_station_id - where pp.station_id = ? - and pp.timestamp >= ? - and pp.number = 0 - and pp.sending_latitude is not null - and pp.sending_longitude is not null - and pp.sending_latitude != s.latest_confirmed_latitude - and pp.sending_longitude != s.latest_confirmed_longitude - order by pp.timestamp - limit ?'; - - $arg = [$stationId, $minTimestamp, $limit]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $arg); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } -} diff --git a/htdocs/includes/repositories/packetrepository.class.php b/htdocs/includes/repositories/packetrepository.class.php deleted file mode 100644 index 9cbf810190130f5a48d90dbfd991363ade08392d..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/packetrepository.class.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php - -class PacketRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('Packet'); - } - - /** - * Returnes an initiated PacketRepository - * - * @return PacketRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new PacketRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @param int $timestamp - * @return Packet - */ - public function getObjectById($id, $timestamp) - { - if (!isInt($id) || !isInt($timestamp)) { - return new Packet(0); - } - return $this->getObjectFromSql('select * from packet where id = ? and timestamp = ?', [$id, $timestamp]); - } - - /** - * Get object list with raw by station id for the latest 24 hours - * - * @param int $stationId - * @param int $limit - * @param int $offset - * @return array - */ - public function getObjectListWithRawByStationId($stationId, $limit, $offset) - { - if (!isInt($stationId) || !isInt($limit) || !isInt($offset)) { - return []; - } - $sql = 'select packet.* from packet packet where station_id = ? and timestamp > ? and raw is not null order by timestamp desc, id desc limit ? offset ?'; - $parameters = [$stationId, time() - (24*60*60), $limit, $offset]; - return $this->getObjectListFromSql($sql, $parameters); - } - - /** - * Get number of packets with raw by station id for the latest 24 hours - * - * @param int $stationId - * @return int - */ - public function getNumberOfPacketsWithRawByStationId($stationId) - { - if (!isInt($stationId)) { - return 0; - } - $sql = 'select count(*) c from packet where station_id = ? and timestamp > ? and raw is not null'; - $parameters = [$stationId, time() - (24*60*60)]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $parameters); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $sum = 0; - foreach($rows as $row) { - $sum += $row['c']; - } - - return $sum; - } - - /** - * Get object list with raw by sender station id for the latest 24 hours - * - * @param int $stationId - * @param int $limit - * @param int $offset - * @return array - */ - public function getObjectListWithRawBySenderStationId($stationId, $limit, $offset) - { - if (!isInt($stationId) || !isInt($limit) || !isInt($offset)) { - return []; - } - $sql = 'select packet.* from packet where sender_id in (select latest_sender_id from station where id = ?) and timestamp > ? and raw is not null order by timestamp desc, id desc limit ? offset ?'; - $parameters = [$stationId, time() - (24*60*60), $limit, $offset]; - return $this->getObjectListFromSql($sql, $parameters); - } - - /** - * Get number of packets with raw by sender station id for the latest 24 hours - * - * @param int $stationId - * @return int - */ - public function getNumberOfPacketsWithRawBySenderStationId($stationId) - { - if (!isInt($stationId)) { - return 0; - } - $sql = 'select count(*) c from packet where sender_id in (select latest_sender_id from station where id = ?) and timestamp > ? and raw is not null'; - $parameters = [$stationId, time() - (24*60*60)]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $parameters); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $sum = 0; - foreach($rows as $row) { - $sum += $row['c']; - } - return $sum; - } - - /** - * Get latest confirmed position packet object by station id - * - * @param int $stationId - * @return Packet - */ - public function getLatestConfirmedObjectByStationId($stationId) - { - if (!isInt($stationId)) { - return new Packet(0); - } - $station = StationRepository::getInstance()->getObjectById($stationId); - if ($station->isExistingObject()) { - return $this->getObjectById($station->latestConfirmedPacketId, $station->latestConfirmedPacketTimestamp); - } - return new Packet(null); - } - - /** - * Get latest packet data list by station id (useful for creating a chart) - * - * @param int $stationId - * @param int $numberOfHours - * @param array $columns - * @return Array - */ - public function getLatestDataListByStationId($stationId, $numberOfHours, $columns) - { - $result = Array(); - if (!isInt($stationId) || !isInt($numberOfHours)) { - return $result; - } - - if (!in_array('timestamp', $columns)) { - // Just to be sure - $columns[] = 'timestamp'; - } - - $startTimestamp = time() - $numberOfHours*60*60; - $sql = 'select ' . implode(',', $columns) . ', position_timestamp from packet - where station_id = ? - and timestamp >= ? - and (speed is not null or altitude is not null) - and map_id in (1,12,5,7,9) - order by timestamp'; - $arg = [$stationId, $startTimestamp]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $arg); - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - foreach ($records as $record) { - - // Add value for position start if position start is within interval - if ($record['position_timestamp'] != null && $record['position_timestamp'] < $record['timestamp'] && $record['position_timestamp'] >= $startTimestamp) { - $posRecord = $record; - $posRecord['timestamp'] = $posRecord['position_timestamp']; - unset($posRecord['position_timestamp']); - $result[] = $posRecord; - } - - // Add value from found packet - unset($record['position_timestamp']); - $result[] = $record; - } - - return $result; - } - - /** - * Get object list (only confirmed) - * @param array $stationIdList - * @param int $startTimestamp - * @param int $endTimestamp - * @return array - */ - public function getConfirmedObjectListByStationIdList($stationIdList, $startTimestamp, $endTimestamp) { - if (!isInt($startTimestamp) || !isInt($endTimestamp)) { - return $result; - } - - $sql = 'select * from packet where station_id in (' . implode(',', $stationIdList) . ') and timestamp > ? and timestamp < ? and map_id = 1 order by timestamp'; - $parameters = [$startTimestamp, $endTimestamp]; - return $this->getObjectListFromSql($sql, $parameters); - } -} diff --git a/htdocs/includes/repositories/packettelemetryrepository.class.php b/htdocs/includes/repositories/packettelemetryrepository.class.php deleted file mode 100644 index 1254ee81ea2d24fa3868d681c2719de05ea5645f..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/packettelemetryrepository.class.php +++ /dev/null @@ -1,221 +0,0 @@ -<?php - -class PacketTelemetryRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('PacketTelemetry'); - } - - /** - * Returnes an initiated PacketTelemetryRepository - * - * @return PacketTelemetryRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new PacketTelemetryRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @param int $timestamp - * @return PacketTelemetry - */ - public function getObjectById($id, $timestamp) - { - if (!isInt($id) || !isInt($timestamp)) { - return new PacketTelemetry(0); - } - return $this->getObjectFromSql('select * from packet_telemetry where id = ? and timestamp = ?', [$id, $timestamp]); - } - - /** - * Get object by packet id - * - * @param int $id - * @param int $timestamp - * @return PacketTelemetry - */ - public function getObjectByPacketId($id, $timestamp) - { - if (!isInt($id) || !isInt($timestamp)) { - return new PacketTelemetry(0); - } - return $this->getObjectFromSql('select * from packet_telemetry where packet_id = ? and timestamp = ?', [$id, $timestamp]); - } - - /** - * Get latest object by station id (for the latest 3 days) - * - * @param int $stationId - * @return array - */ - public function getLatestObjectByStationId($stationId) - { - if (!isInt($stationId)) { - return new PacketTelemetry(0); - } - return $this->getObjectFromSql( - 'select * from packet_telemetry - where station_id = ? - and timestamp > ? - order by timestamp desc limit 1', [$stationId, (time() - 24*60*60*3)] - ); - } - - /** - * Get latest object list by station id (useful for creating a chart) - * - * @param int $stationId - * @param int $endTimestamp - * @param int $hours - * @param array $columns - * @return array - */ - public function getLatestDataListByStationId($stationId, $endTimestamp , $hours, $columns) - { - if (!isInt($stationId) || !isInt($endTimestamp) || !isInt($hours)) { - return []; - } - $minTimestamp = $endTimestamp - (60*60*$hours); - - $sql = 'select ' . implode(',', $columns) . ' from ' . $table . ' - where station_id = ? - and timestamp >= ? - and timestamp <= ? - order by timestamp'; - $arg = [$stationId, $minTimestamp, $endTimestamp]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $arg); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get latest object list by station id - * We only include telemetry that has the same params, units and eqns as the latest telemetry packet - * - * @param int $stationId - * @param int $limit - * @param int $offset - * @param int $maxDays - * @return array - */ - public function getLatestObjectListByStationId($stationId, $limit, $offset, $maxDays = 7) - { - if (!isInt($stationId) || !isInt($limit) || !isInt($offset) || !isInt($maxDays)) { - return []; - } - $latestObject = $this->getLatestObjectByStationId($stationId); - - $sqlParameters = Array(); - $sql = 'select * from packet_telemetry where station_id = ? and timestamp > ?'; - $sqlParameters[] = $stationId; - $sqlParameters[] = (time() - 24*60*60*$maxDays); - - if ($latestObject->stationTelemetryParamId !== null) { - $sql .= ' and station_telemetry_param_id = ?'; - $sqlParameters[] = $latestObject->stationTelemetryParamId; - } else { - $sql .= ' and station_telemetry_param_id is null'; - } - - if ($latestObject->stationTelemetryUnitId !== null) { - $sql .= ' and station_telemetry_unit_id = ?'; - $sqlParameters[] = $latestObject->stationTelemetryUnitId; - } else { - $sql .= ' and station_telemetry_unit_id is null'; - } - - // if ($latestObject->stationTelemetryEqnsId !== null) { - // $sql .= ' and station_telemetry_eqns_id = ?'; - // $sqlParameters[] = $latestObject->stationTelemetryEqnsId; - // } else { - // $sql .= ' and station_telemetry_eqns_id is null'; - // } - - if ($latestObject->stationTelemetryBitsId !== null) { - $sql .= ' and station_telemetry_bits_id = ?'; - $sqlParameters[] = $latestObject->stationTelemetryBitsId; - } else { - $sql .= ' and station_telemetry_bits_id is null'; - } - - $sql .= ' order by timestamp desc limit ? offset ?'; - $sqlParameters[] = $limit; - $sqlParameters[] = $offset; - - return $this->getObjectListFromSql($sql, $sqlParameters); - } - - - /** - * Get latest number of packets by station id - * We only include telemetry that has the same params, units and eqns as the latest telemetry packet - * - * @param int $stationId - * @param int $maxDays - * @return int - */ - public function getLatestNumberOfPacketsByStationId($stationId, $maxDays = 7) - { - if (!isInt($stationId) || !isInt($maxDays)) { - return 0; - } - $latestObject = $this->getLatestObjectByStationId($stationId); - - $sqlParameters = Array(); - $sql = 'select count(*) c from packet_telemetry where station_id = ? and timestamp > ?'; - $sqlParameters[] = $stationId; - $sqlParameters[] = (time() - 24*60*60*$maxDays); - - if ($latestObject->stationTelemetryParamId !== null) { - $sql .= ' and station_telemetry_param_id = ?'; - $sqlParameters[] = $latestObject->stationTelemetryParamId; - } else { - $sql .= ' and station_telemetry_param_id is null'; - } - - if ($latestObject->stationTelemetryUnitId !== null) { - $sql .= ' and station_telemetry_unit_id = ?'; - $sqlParameters[] = $latestObject->stationTelemetryUnitId; - } else { - $sql .= ' and station_telemetry_unit_id is null'; - } - - // if ($latestObject->stationTelemetryEqnsId !== null) { - // $sql .= ' and station_telemetry_eqns_id = ?'; - // $sqlParameters[] = $latestObject->stationTelemetryEqnsId; - // } else { - // $sql .= ' and station_telemetry_eqns_id is null'; - // } - - if ($latestObject->stationTelemetryBitsId !== null) { - $sql .= ' and station_telemetry_bits_id = ?'; - $sqlParameters[] = $latestObject->stationTelemetryBitsId; - } else { - $sql .= ' and station_telemetry_bits_id is null'; - } - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $sqlParameters); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $sum = 0; - foreach($rows as $row) { - $sum += $row['c']; - } - - return $sum; - } -} diff --git a/htdocs/includes/repositories/packetweatherrepository.class.php b/htdocs/includes/repositories/packetweatherrepository.class.php deleted file mode 100644 index 8f0d78e4faffbebde1c7d1364a4f735a0939cbdd..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/packetweatherrepository.class.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php - -class PacketWeatherRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('PacketWeather'); - } - - /** - * Returnes an initiated PacketWeatherRepository - * - * @return PacketWeatherRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new PacketWeatherRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @param int $timestamp - * @return PacketWeather - */ - public function getObjectById($id, $timestamp) - { - if (!isInt($id) || !isInt($timestamp)) { - return new PacketWeather(0); - } - return $this->getObjectFromSql('select * from packet_weather where id = ? and timestamp = ?', [$id, $timestamp]); - } - - /** - * Get object by packet id - * - * @param int $id - * @param int $timestamp - * @return PacketWeather - */ - public function getObjectByPacketId($id, $timestamp) - { - if (!isInt($id) || !isInt($timestamp)) { - return new PacketWeather(0); - } - return $this->getObjectFromSql('select * from packet_weather where packet_id = ? and timestamp = ?', [$id, $timestamp]); - } - - /** - * Get latest object list by station id (useful for creating a chart) - * - * @param int $stationId - * @param int $endTimestamp - * @param int $hours - * @param array $columns - * @return array - */ - public function getLatestDataListByStationId($stationId, $endTimestamp, $hours, $columns) - { - if (!isInt($stationId) || !isInt($endTimestamp) || !isInt($hours)) { - return []; - } - $minTimestamp = $endTimestamp - (60*60*$hours); - - $sql = 'select ' . implode(',', $columns) . ' from packet_weather - where station_id = ? - and timestamp >= ? - and timestamp <= ? - order by timestamp'; - $arg = [$stationId, $minTimestamp, $endTimestamp]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $arg); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get latest object list by station id - * - * @param int $stationId - * @param int $limit - * @param int $offset - * @param int $maxDays - * @return array - */ - public function getLatestObjectListByStationIdAndLimit($stationId, $limit, $offset, $maxDays = 7) - { - if (!isInt($stationId) || !isInt($limit) || !isInt($offset) || !isInt($maxDays)) { - return []; - } - return $this->getObjectListFromSql( - 'select * from packet_weather - where station_id = ? - and timestamp > ? - and (humidity is not null - or pressure is not null - or rain_1h is not null - or rain_24h is not null - or rain_since_midnight is not null - or temperature is not null - or wind_direction is not null - or wind_gust is not null - or wind_speed is not null - or luminosity is not null - or snow is not null) - order by timestamp desc limit ? offset ?', [$stationId, (time() - 24*60*60*$maxDays), $limit, $offset] - ); - } - - /** - * Get latest number of packets by station id - * - * @param int $stationId - * @param int $maxDays - * @return int - */ - public function getLatestNumberOfPacketsByStationIdAndLimit($stationId, $maxDays = 7) - { - if (!isInt($stationId) || !isInt($maxDays)) { - return 0; - } - $sql = 'select count(*) c from packet_weather - where station_id = ? - and timestamp > ? - and (humidity is not null - or pressure is not null - or rain_1h is not null - or rain_24h is not null - or rain_since_midnight is not null - or temperature is not null - or wind_direction is not null - or wind_gust is not null - or wind_speed is not null - or luminosity is not null - or snow is not null)'; - $parameters = [$stationId, (time() - 24*60*60*$maxDays)]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $parameters); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $sum = 0; - foreach($rows as $row) { - $sum += $row['c']; - } - - return $sum; - } -} diff --git a/htdocs/includes/repositories/senderrepository.class.php b/htdocs/includes/repositories/senderrepository.class.php deleted file mode 100644 index b9e2293fb2427b0ba6e4d55691843e5984c2b9e6..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/senderrepository.class.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -class SenderRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('Sender'); - } - - /** - * Returnes an initiated SenderRepository - * - * @return SenderRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new SenderRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return Sender - */ - public function getObjectById($id) - { - if (!isInt($id)) { - return new Sender(0); - } - - static $cache = array(); - $key = $id; - if (!isset($cache[$key])) { - $cache[$key] = $this->getObjectFromSql('select * from sender where id = ?', [$id]); - } - return $cache[$key]; - } -} diff --git a/htdocs/includes/repositories/stationrepository.class.php b/htdocs/includes/repositories/stationrepository.class.php deleted file mode 100644 index 315aac27e0c6f4b48d0809cec1f1d3bf517745fd..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/stationrepository.class.php +++ /dev/null @@ -1,473 +0,0 @@ -<?php - -class StationRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - private $_config; - - public function __construct() - { - parent::__construct('Station'); - $this->_config = parse_ini_file(ROOT . '/../config/trackdirect.ini', true); - } - - /** - * Returnes an initiated StationRepository - * - * @return StationRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new StationRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return Station - */ - public function getObjectById($id) - { - if (!isInt($id)) { - return new Station(0); - } - - static $cache = array(); - $key = $id; - if (!isset($cache[$key])) { - $cache[$key] = $this->getObjectFromSql('select * from station where id = ?', [$id]); - } - return $cache[$key]; - } - - /** - * Get object by name - * - * @param string $name - * @return Station - */ - public function getObjectByName($name) - { - if (!is_string($name)) { - return new Station(0); - } - - static $cache = array(); - $key = $name; - if (!isset($cache[$key])) { - $cache[$key] = $this->getObjectFromSql('select * from station where name = ? order by latest_location_packet_timestamp desc limit 1', [$name]); - } - return $cache[$key]; - } - - /** - * Get sender station object by sender id - * - * @param string $name - * @param int $senderId - * @return Station - */ - public function getSenderStationObjectBySenderId($senderId) - { - if (!isInt($senderId)) { - return new Station(0); - } - - static $cache = array(); - $key = $senderId; - if (!isset($cache[$key])) { - $cache[$key] = $this->getObjectFromSql('select station.* from station, sender where station.latest_sender_id = sender.id and sender.name = station.name and sender.id = ? and station.station_type_id = 1', [$senderId]); - } - return $cache[$key]; - } - - /** - * Get object by name and sender id - * - * @param string $name - * @param int $senderId - * @return Station - */ - public function getObjectByNameAndSenderId($name, $senderId) - { - if (!is_string($name) || !isInt($senderId)) { - return new Station(0); - } - - static $cache = array(); - $key = $name . ';' . $senderId; - if (!isset($cache[$key])) { - $cache[$key] = $this->getObjectFromSql('select * from station where name = ? and latest_sender_id = ?', [$name, $senderId]); - } - return $cache[$key]; - } - - - /** - * Get object list - * - * @param int $activeDuringLatestNumberOfSeconds - * @param int $limit - * @param int $offset - * @return array - */ - public function getObjectList($activeDuringLatestNumberOfSeconds = (24*60*60), $limit, $offset) - { - if ($activeDuringLatestNumberOfSeconds == 0) { - $activeDuringLatestNumberOfSeconds = time(); - } - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepare( - 'select * from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and (source_id != 5 or latest_confirmed_packet_timestamp > ?) - order by latest_confirmed_packet_timestamp desc - limit ? offset ?' - ); - $stmt->bindValue(1, (time() - $activeDuringLatestNumberOfSeconds)); - $stmt->bindValue(2, (time() - (60*60*24))); // OGN data should be deleted after 24h, but just to be safe we avoid including older data when searching - $stmt->bindValue(3, $limit); - $stmt->bindValue(4, $offset); - - $stmt->execute(); - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - if (is_array($records) && !empty($records)) { - return $this->_getObjectListFromRecords($records); - } - - // No object found, return empty array - return []; - } - - /** - * Get number of stations - * - * @param int $activeDuringLatestNumberOfSeconds - * @return int - */ - public function getNumberOfStations($activeDuringLatestNumberOfSeconds = (24*60*60)) - { - if ($activeDuringLatestNumberOfSeconds == 0) { - $activeDuringLatestNumberOfSeconds = time(); - } - - $sql = 'select count(*) c from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and (source_id != 5 or latest_confirmed_packet_timestamp > ?)'; - $parameters = [(time() - $activeDuringLatestNumberOfSeconds), (time() - (60*60*24))]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $parameters); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $sum = 0; - foreach($rows as $row) { - $sum += $row['c']; - } - - return $sum; - } - - /** - * Get object list by query string - * - * @param int $q - * @param int $activeDuringLatestNumberOfSeconds - * @param int $limit - * @param int $offset - * @return array - */ - public function getObjectListByQueryString($q, $activeDuringLatestNumberOfSeconds = (24*60*60), $limit, $offset) - { - if (!is_string($q) || !isInt($limit)) { - return []; - } - - if ($activeDuringLatestNumberOfSeconds == 0) { - $activeDuringLatestNumberOfSeconds = time(); - } - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepare(' - select s.* - from station s - left outer join ogn_device d on d.device_id = s.latest_ogn_sender_address - where s.latest_confirmed_packet_timestamp is not null - and s.latest_confirmed_packet_timestamp > ? - and (s.source_id != 5 or s.latest_confirmed_packet_timestamp > ?) - and (s.name ilike ? or d.registration ilike ? or d.cn ilike ?) - order by name - limit ? offset ?' - ); - $stmt->bindValue(1, (time() - $activeDuringLatestNumberOfSeconds)); - $stmt->bindValue(2, (time() - (60*60*24))); // OGN data should be deleted after 24h, but just to be safe we avoid including older data when searching - $stmt->bindValue(3, "$q%"); - $stmt->bindValue(4, "$q%"); - $stmt->bindValue(5, "$q%"); - $stmt->bindValue(6, $limit); - $stmt->bindValue(7, $offset); - - $stmt->execute(); - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - if (is_array($records) && !empty($records)) { - return $this->_getObjectListFromRecords($records); - } - - // No object found, return empty array - return []; - } - - /** - * Get number of stations by query string - * - * @param int $q - * @param int $activeDuringLatestNumberOfSeconds - * @return int - */ - public function getNumberOfStationsByQueryString($q, $activeDuringLatestNumberOfSeconds = (24*60*60)) - { - if (!is_string($q)) { - return 0; - } - - if ($activeDuringLatestNumberOfSeconds == 0) { - $activeDuringLatestNumberOfSeconds = time(); - } - - $sql = 'select count(*) c from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and (source_id != 5 or latest_confirmed_packet_timestamp > ?) - and name ilike ?'; - $parameters = [(time() - $activeDuringLatestNumberOfSeconds), (time() - (60*60*24)), "$q%"]; - - $pdo = PDOConnection::getInstance(); - $stmt = $pdo->prepareAndExec($sql, $parameters); - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $sum = 0; - foreach($rows as $row) { - $sum += $row['c']; - } - - return $sum; - } - - /** - * Get object list by sender id (close to specified lat/lng) - * - * @param int $senderId - * @param int $limit - * @param float $latitude - * @param float $longitude - * @return array - */ - public function getObjectListBySenderId($senderId, $limit, $latitude = null, $longitude = null) - { - if (!isInt($senderId) || !isFloat($latitude) || !isFloat($longitude) || !isInt($limit)) { - return []; - } - - $pdo = PDOConnection::getInstance(); - - if ($latitude === null || $longitude === null) { - $stmt = $pdo->prepare( - 'select * from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and latest_sender_id = ? - limit ?' - ); - $stmt->bindValue(1, (time() - 60*60*24)); - $stmt->bindValue(2, $senderId); - $stmt->bindValue(3, $limit); - } else { - $stmt = $pdo->prepare( - 'select * from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and latest_sender_id = ? - order by (abs(latest_confirmed_latitude - ?) + abs(latest_confirmed_longitude - ?)) - limit ?' - ); - $stmt->bindValue(1, (time() - 60*60*24)); - $stmt->bindValue(2, $senderId); - $stmt->bindValue(3, $latitude); - $stmt->bindValue(4, $longitude); - $stmt->bindValue(5, $limit); - } - $stmt->execute(); - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - if (is_array($records) && !empty($records)) { - return $this->_getObjectListFromRecords($records); - } - - // No object found, return empty array - return []; - } - - /** - * Get related object list by station id (stations with same name but different SSID) - * - * @param int $stationId - * @param int $limit - * @return array - */ - public function getRelatedObjectListByStationId($stationId, $limit) - { - if (!isInt($stationId) || !isInt($limit)) { - return []; - } - - $station = $this->getObjectById($stationId); - $name = $station->name; - $pos = strrpos($name, '-'); - if ($pos) { - $call = substr($name, 0, $pos); - } else { - // No object found, return empty array - return []; - } - - if ($station->latestPacketTimestamp !== null) { - $time = $station->latestPacketTimestamp; - } else { - $time = time(); - } - - $pdo = PDOConnection::getInstance(); - - if ($station->latestConfirmedLatitude === null || $station->latestConfirmedLongitude === null) { - $stmt = $pdo->prepare( - 'select * from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and name like ? - limit ?' - ); - $stmt->bindValue(1, $time - 60*60*24, PDO::PARAM_STR); - $stmt->bindValue(2, "$call%", PDO::PARAM_STR); - $stmt->bindValue(3, $limit); - } else { - $stmt = $pdo->prepare( - 'select * from station - where latest_confirmed_packet_timestamp is not null - and latest_confirmed_packet_timestamp > ? - and name like ? - order by (abs(latest_confirmed_latitude - ?) + abs(latest_confirmed_longitude - ?)) - limit ?' - ); - $stmt->bindValue(1, $station->latestPacketTimestamp - 60*60*24, PDO::PARAM_STR); - $stmt->bindValue(2, "$call%", PDO::PARAM_STR); - $stmt->bindValue(3, $station->latestConfirmedLatitude); - $stmt->bindValue(4, $station->latestConfirmedLongitude); - $stmt->bindValue(5, $limit); - } - $stmt->execute(); - $records = $stmt->fetchAll(PDO::FETCH_ASSOC); - if (is_array($records) && !empty($records)) { - return $this->_getObjectListFromRecords($records); - } - - // No object found, return empty array - return []; - } - - /** - * Get object list of stations near specified position - * - * @param int $latitude - * @param int $longitude - * @param int $maxDistanceInKm - * @param int $limit - * @return array - */ - public function getCloseByObjectListByPosition($latitude, $longitude, $maxDistanceInKm = 100, $limit = 10000) - { - if (!isFloat($latitude) || !isFloat($longitude) || !isInt($maxDistanceInKm) || !isInt($limit)) { - return []; - } - - if ($maxDistanceInKm <= 10) { - // Plus 0.1 should be about 11km - $minLatitude = $latitude - 0.1; - $maxLatitude = $latitude + 0.1; - $minLongitude = $longitude - 0.1; - $maxLongitude = $longitude + 0.1; - } else { - // Plus 1 should be about 111km - $minLatitude = $latitude - 1; - $maxLatitude = $latitude + 1; - $minLongitude = $longitude - 1; - $maxLongitude = $longitude + 1; - } - - $minTimestamp = time() - 60*60; // Latest 1h is pretty fast - - // The order by used here is not 100% accurate, but it's fast :-) - $list = $this->getObjectListFromSql( - 'select * from station - where latest_confirmed_latitude > ? - and latest_confirmed_latitude < ? - and latest_confirmed_longitude > ? - and latest_confirmed_longitude < ? - and latest_confirmed_packet_timestamp > ? - order by (abs(latest_confirmed_latitude - ?) + abs(latest_confirmed_longitude - ?)) - limit ?', [$minLatitude, $maxLatitude, $minLongitude, $maxLongitude, $minTimestamp, $latitude, $longitude, $limit] - ); - - $orderedList = []; - foreach ($list as $closeByStation) { - $distance = $closeByStation->getDistance($latitude, $longitude); - if ($distance !== null && $distance <= ($maxDistanceInKm*1000)) { - $key = intval($distance); - while (isset($orderedList[$key])) { - $key++; - } - $orderedList[$key] = $closeByStation; - } - } - ksort($orderedList); - return array_values($orderedList); - } - - /** - * Get object list of stations near specified station - * - * @param int $stationId - * @param int $limit - * @return array - */ - public function getCloseByObjectListByStationId($stationId, $limit) - { - if (!isInt($stationId) || !isInt($limit)) { - return []; - } - - $station = $this->getObjectById($stationId); - if ($station->latestConfirmedLatitude === null || $station->latestConfirmedLongitude === null) { - return []; - } - - $closeByStationList = self::getCloseByObjectListByPosition($station->latestConfirmedLatitude, $station->latestConfirmedLongitude, 100, $limit + 1); - $result = Array(); - foreach ($closeByStationList as $key => $closeByStation) { - if ($station->getId() == $closeByStation->getId()) { - break; - } - } - if (isset($key)) { - unset($closeByStationList[$key]); - } - return $closeByStationList; - } -} diff --git a/htdocs/includes/repositories/stationtelemetrybitsrepository.class.php b/htdocs/includes/repositories/stationtelemetrybitsrepository.class.php deleted file mode 100644 index 290efe31678410bededd1dae18000f6bebdb0359..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/stationtelemetrybitsrepository.class.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -class StationTelemetryBitsRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('StationTelemetryBits'); - } - - /** - * Returnes an initiated StationTelemetryBitsRepository - * - * @return StationTelemetryBitsRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new StationTelemetryBitsRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return StationTelemetryBits - */ - public function getObjectById($id) - { - return $this->getObjectFromSql('select * from station_telemetry_bits where id = ?', [$id]); - } -} diff --git a/htdocs/includes/repositories/stationtelemetryeqnsrepository.class.php b/htdocs/includes/repositories/stationtelemetryeqnsrepository.class.php deleted file mode 100644 index 6fb72bf3c9354cdfaa21e023c58bfbdada72a106..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/stationtelemetryeqnsrepository.class.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -class StationTelemetryEqnsRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('StationTelemetryEqns'); - } - - /** - * Returnes an initiated StationTelemetryEqnsRepository - * - * @return StationTelemetryEqnsRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new StationTelemetryEqnsRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return StationTelemetryEqns - */ - public function getObjectById($id) - { - return $this->getObjectFromSql('select * from station_telemetry_eqns where id = ?', [$id]); - } -} diff --git a/htdocs/includes/repositories/stationtelemetryparamrepository.class.php b/htdocs/includes/repositories/stationtelemetryparamrepository.class.php deleted file mode 100644 index 34eba7fe56185733f4f11665d0deb32a6180fc74..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/stationtelemetryparamrepository.class.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -class StationTelemetryParamRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('StationTelemetryParam'); - } - - /** - * Returnes an initiated StationTelemetryParamRepository - * - * @return StationTelemetryParamRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new StationTelemetryParamRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return StationTelemetryParam - */ - public function getObjectById($id) - { - return $this->getObjectFromSql('select * from station_telemetry_param where id = ?', [$id]); - } -} diff --git a/htdocs/includes/repositories/stationtelemetryunitrepository.class.php b/htdocs/includes/repositories/stationtelemetryunitrepository.class.php deleted file mode 100644 index 0a616584ee537f76f354ef1674cf560744c34ba2..0000000000000000000000000000000000000000 --- a/htdocs/includes/repositories/stationtelemetryunitrepository.class.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -class StationTelemetryUnitRepository extends ModelRepository -{ - - private static $_singletonInstance = null; - - public function __construct() - { - parent::__construct('StationTelemetryUnit'); - } - - /** - * Returnes an initiated StationTelemetryUnitRepository - * - * @return StationTelemetryUnitRepository - */ - public static function getInstance() - { - if (self::$_singletonInstance === null) { - self::$_singletonInstance = new StationTelemetryUnitRepository(); - } - - return self::$_singletonInstance; - } - - /** - * Get object by id - * - * @param int $id - * @return StationTelemetryUnit - */ - public function getObjectById($id) - { - return $this->getObjectFromSql('select * from station_telemetry_unit where id = ?', [$id]); - } -} diff --git a/htdocs/public/.htaccess b/htdocs/public/.htaccess deleted file mode 100755 index 44ac88e82422923f3cf5fadd22dc298b9114b34d..0000000000000000000000000000000000000000 --- a/htdocs/public/.htaccess +++ /dev/null @@ -1,18 +0,0 @@ -<IfModule mod_expires.c> - ExpiresActive On - ExpiresByType image/jpg "access 1 month" - ExpiresByType image/jpeg "access 1 month" - ExpiresByType image/gif "access 1 month" - ExpiresByType image/png "access 1 month" - ExpiresDefault "access 1 week" -</IfModule> - -Options +FollowSymLinks -RewriteEngine on - -# Avoid rewriting existing dirs -RewriteRule ^/?(js|css|images|symbols|data|heatmaps|crossdomain.*|favicon.*|\.well-known|browserconfig\.xml|robots\.txt|ads\.txt)($|/) - [L] - -# Rewrite url -RewriteCond %{REQUEST_METHOD} !=POST -RewriteRule ^(.*)$ index.php?view=$1 [NC,L,QSA] diff --git a/htdocs/public/css/main.css b/htdocs/public/css/main.css deleted file mode 100755 index ad3bb35d4143d1f6ff611e394caf5bed713be1de..0000000000000000000000000000000000000000 --- a/htdocs/public/css/main.css +++ /dev/null @@ -1,866 +0,0 @@ - -html { - background-color: #fff; - height: 100%; - overflow: hidden; -} - -body { - margin: 0px; - padding: 0px !important; - width: 100%; - height: 100%; - - font-family: "Sans-serif", "Helvetica" !important; - font-size: 12px; - background: #fff; -} - -label { - display: inline-block; - width: 5em; -} - -h1 { - font-family: "Sans-serif", "Helvetica" !important; - color: #1a1a1a; -} - -h2 { - font-family: "Sans-serif", "Helvetica" !important; - color: #1a1a1a; -} - -h3 { - font-family: "Sans-serif", "Helvetica" !important; - color: #1a1a1a; -} - -sup { - font-weight: normal; -} - -a { - color: #337ab7; - text-decoration: none; - background-color: transparent; -} - -/* Set the position of the map */ -#map-container { - position:absolute; - top: 39px; - left: 0px; - width: 100%; - height: calc( 100% - 39px ); - z-index:10; -} - -/* Add a black background color to the top navigation */ -.topnav { - background-color: #333; - overflow: hidden; - - background: #464b4c; - background-image: -webkit-linear-gradient(top, #464b4c, #3f4344); - background-image: -moz-linear-gradient(top, #464b4c, #3f4344); - background-image: -o-linear-gradient(top, #464b4c, #3f4344); - background-image: linear-gradient(to bottom, #464b4c, #3f4344); - -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.06); - box-shadow: inset 0 1px rgba(255, 255, 255, 0.06); - - z-index:200; -} - -/* Style the links inside the navigation bar */ -.topnav a { - float: left; - display: block; - color: #f2f2f2; - text-align: center; - padding: 12px 14px; - text-decoration: none; - font-size: 13px; -} - -.dropdown-content-checkbox { - padding-left: 45px !important; - background-image: url(/images/unchecked.png); - background-repeat: no-repeat; - background-position: 5% 50%; -} - -.dropdown-content-checkbox-active { - background-image: url(/images/checked.png); -} - -.dropdown-content-checkbox-hidden { - display: none !important; -} - -/* Hide the link that should open and close the topnav on small screens */ -.topnav .icon { - display: none; -} - -/* Dropdown container - needed to position the dropdown content */ -.dropdown { - float: left; - overflow: hidden; -} - -/* Style the dropdown button to fit inside the topnav */ -.dropdown .dropbtn { - font-size: 13px; - border: none; - outline: none; - color: white; - padding: 11px 14px; - background-color: inherit; - font-family: inherit; - margin: 0; -} - -/* Style the dropdown content (hidden by default) */ -.dropdown-content { - display: none; - position: absolute; - background-color: #f9f9f9; - min-width: 160px; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - z-index: 200; -} - -/* Style the links inside the dropdown */ -.dropdown-content a { - float: none; - color: black; - padding: 12px 14px; - text-decoration: none; - display: block; - text-align: left; -} - -/* Add a dark background on topnav links and the dropdown button on hover */ -.topnav a:hover, .dropdown:hover .dropbtn { - background-color: #555; - color: white; -} - -/* Add a grey background to dropdown links on hover */ -.dropdown-content a:hover { - background-color: #ddd; - color: black; -} - -/* Show the dropdown menu when the user moves the mouse over the dropdown button */ -.dropdown:hover .dropdown-content { - display: block; -} - -/* When the screen is less than 880 pixels wide, hide all links, except for the first one ("Home"). Show the link that contains should open and close the topnav (.icon) */ -@media screen and (max-width: 880px) { - .topnav a:not(:first-child), .dropdown .dropbtn { - display: none; - } - .topnav a.icon { - float: right; - display: block; - } -} - -/* The "responsive" class is added to the topnav with JavaScript when the user clicks on the icon. This class makes the topnav look good on small screens (display the links vertically instead of horizontally) */ -@media screen and (max-width: 880px) { - .topnav.responsive {position: relative;} - .topnav.responsive a.icon { - position: absolute; - right: 0; - top: 0; - } - .topnav.responsive a { - float: none; - display: block; - text-align: left; - } - .topnav.responsive .dropdown {float: none;} - .topnav.responsive .dropdown-content {position: relative;} - .topnav.responsive .dropdown .dropbtn { - display: block; - width: 100%; - text-align: left; - } -} - -/* The Modal (background) */ -.modal { - display: none; - position: fixed; - z-index: 300; - padding-top: 100px; /* Location of the box */ - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.4); -} - -#td-modal { - display: block; -} - -/* Modal Content */ -.modal-content, .modal-long-content { - background-color: #fff; - margin: auto; - padding: 0px; - border: 1px solid #888; - width: 80%; - max-width: 1200px; -} - -.modal-long-content { - height: 80%; - max-height: 1200px; -} - -@media screen and (max-width: 1000px) { - .modal-long-content { - width: 95%; - height: 95%; - } - .modal { - padding-top: 10px; - } -} - -/* Modal Close Button */ -.modal-close { - color: #aaaaaa; - float: right; - font-size: 28px; - font-weight: bold; - margin: 10px; -} -.modal-close:hover, -.modal-close:focus { - color: #000; - text-decoration: none; - cursor: pointer; -} - -.modal-title { - font-weight: bold; - font-size: 16pt; - margin: 15px 15px 15px 20px; - float: left; - font-family: "Sans-serif", "Helvetica" !important; -} - -.modal-content-header { - width: 100%; - height: 55px; - border-bottom: 1px solid #e9ecef; - border-top-left-radius: 0.3rem; - border-top-right-radius: 0.3rem; -} - -.modal-content-body { - height: calc(100% - 56px); - margin: 0px; - padding: 0px; - overflow: auto; -} - -input[type=text], select, textarea { - padding: 10px; - border: 1px solid #ccc; - border-radius: 4px; - box-sizing: border-box; - resize: vertical -} - -input[type=text] { - padding: 11px; -} - -input[type=submit] { - background-color: #4CAF50; - color: white; - padding: 12px 20px; - border: none; - border-radius: 4px; - cursor: pointer; -} - -input[type=submit]:hover { - background-color: #45a049; -} - -.form-container { - margin-top: 6px; - margin-bottom: 16px; - display: inline-block; - width: 100%; -} - -#cordinates-container { - clear: both; - padding:5px; - color: #4d4d4d; - background-color: rgba(255, 255, 255, 0.7); - font-size: 11px; - display: none; - min-width: 130px; -} - -#status-container { - padding:5px; - white-space:nowrap; - line-height: 20px; - font-size: 11px; - background-color: rgba(255, 255, 255, 0.7); -} - -@media screen and (min-width: 800px) { - #cordinates-container { - display: block; - } -} - -#right-container { - position: absolute; - right: 0px; - text-align: right; -} - -#right-container-info, #right-container-filtered, #right-container-timetravel { - position:relative; - right:10px; - z-index:50; - - color: #4d4d4d; - font-size:11px; - font-family: "Sans-serif", "Helvetica"; - - margin-bottom: 15px; -} - -#right-container-filtered, #right-container-timetravel { - display: none; -} - -.modal-inner-content { - max-width: 1100px; - - padding-top: 10px; - padding-left: 30px; - padding-right: 30px; - padding-bottom: 10px; - - margin-left: auto; - margin-right: auto; - - font-size: 9pt; - font-family: "Sans-serif", "Helvetica"; -} - - -.modal-inner-content-menu { - font-size: 9pt; - padding-top: 15px; - padding-bottom: 3px; - -} - -.modal-inner-content-menu a, .modal-inner-content-menu span { - margin-right: 20px; -} - -.modal-inner-content-about h2:not(:first-child) { - padding-top: 20px; -} - -.modal-inner-content-about h2 { - font-weight: normal; -} - -.modal-inner-content-about h3 { - padding-top: 15px; -} - -.overview-content-summary { - float:left; - padding-right: 30px; -} - -.overview-content-summary div div { - font-size: 9pt; - line-height: 14pt; - font-family: "Sans-serif", "Helvetica"; - word-break: break-all; -} - -.overview-content-symbol { - float:left; - width:200px; - text-align:left; - color: grey; - font-family: "Helvetica"; - font-size: 13px; - display: none; - text-align: center; -} - -.overview-content-symbol h3 { - font-size: 12px; - font-weight: bold; - color: grey; -} - -.overview-content-symbol p { - font-size: 10px; - margin: 0px; -} - -.overview-content-symbol div { - padding-bottom: 10px; -} - -.overview-content-explanations, .list-explanations { - clear: both; - width: 100%; - font-size: 12px; -} - -.overview-content-summary-cell-time { - color: grey; -} - -.overview-content-summary-cell-weather-time { - color: #227152; -} - -.overview-content-summary-cell-telemetry-time { - color: #823030; -} - -.overview-content-summary-cell-position { - color: #754D08; -} - -.overview-content-summary-cell-posambiguity { - color: darkred; -} - -.overview-content-summary-cell-status { - color: #375654; -} - -.overview-content-summary-cell-phg { - color: #440B2A; -} - -.overview-content-packet-frequency span:nth-of-type(2){ - color: grey; -} - -.overview-content-number-of-packets span { - color: grey; -} - -.overview-content-station span { - vertical-align: bottom; -} - -.overview-content-station img { - vertical-align: middle; -} - -.overview-content-station-list { - padding-top: 5px; -} - -.overview-content-station-list img { - vertical-align: middle; -} - -.overview-content-station-list span { - line-height: 24px; - vertical-align: bottom; -} - -.overview-content-station-list a { - line-height: 24px; - font-weight: bold; -} - -.overview-content-station-list span span { - color: grey; - float: right; - padding-right: 50px; - font-weight: normal; -} - -.overview-content-summary-hr, .overview-content-summary-hr-indent{ - font-weight: bold; - font-family: "Helvetica"; - font-size: 13px; - padding-right:25px; - white-space: nowrap; - width: 180px; -} - -.overview-content-summary-hr-indent { - padding-left: 20px; -} - -.overview-content-divider { - height: 20px; -} - -#raw-content-output p { - white-space: nowrap; - margin-top: 0px; - margin-bottom: 5px; - font-size: 8pt; - font-family: "Sans-serif", "Helvetica"; - line-height: normal; - clear: both; -} - -#raw-content-output a { - font-weight: bold; -} - -.raw-packet-warning { - color: darkorange; -} - -.raw-packet-error { - color: darkred; -} - -.raw-packet-timestamp { - color:grey; -} - -.telemetry-subtable { - display: table; -} - -.telemetry-subtable div { - display: table-row; -} - -.telemetry-subtable div div { - display: table-cell; - font-size: 8pt; - color: grey; - font-family: "Sans-serif", "Helvetica"; - padding-right: 10px; - padding-top: 3px; -} - -.telemetry-biton { - color: black; -} - -.telemetry-bitoff { - color: lightgrey; - text-decoration: line-through; -} - -.horizontal-line { - height: 1px; - margin: 5px 0px 25px 0px; - padding: 0; - background-color: #e9ecef; - clear: both; - margin-top: 3px; -} - - -@media screen and (min-width: 600px) { - .overview-content-summary { - display:table; - min-width: 500px; - } - - .overview-content-summary div { - display:table-row; - } - - .overview-content-summary div div { - display:table-cell; - } -} - -@media screen and (max-width: 600px) { - .overview-content-summary-hr, .overview-content-summary-hr-indent { - padding-top: 8px; - } - - .overview-content-summary-indent { - padding-left: 20px; - } -} - -@media screen and (min-width: 850px) { - .overview-content-summary { - display:table; - min-width: 500px; - width: calc(100% - 300px); - } - - .overview-content-symbol { - display: block; - } -} - -.tooltiptext { - display:none; - width: 150px; - font-family: "Helvetica"; - font-size: 14px; - line-height: 16px; - padding: 5px; -} - -.leaflet-marker-tooltiptext { - padding-left: 3px !important; - padding-right: 0px !important; - padding-top: 0px !important; - padding-bottom: 0px !important; -} - -.leaflet-marker-labeltext { - background-color: transparent !important; - box-shadow: none !important; - box-shadow: none !important; - font-weight: bold !important; - font-size: 10px !important; - border: none !important; - color: #000 !important; -} - -.leaflet-marker-tooltiptext::before, .leaflet-marker-labeltext::before { - border: none !important; -} - -.leaflet-infowindow-content .leaflet-popup-content-wrapper { - border-radius: 2px !important; -} - -.leaflet-popup-close-button { - height: auto !important; - padding: 4px !important; -} - -.leaflet-bottom { - bottom: 5px !important; -} - -.datagrid table { - border-collapse: collapse; - text-align: left; - width: 100%; -} - -.datagrid { - font: normal 12px/150% Arial, Helvetica, sans-serif; - background: #fff; - overflow: hidden; - border: 1px solid #c3c3c3; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.datagrid table td, .datagrid table th { - padding: 1px 10px; -} - -.datagrid table thead th { - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #E8E8E8), color-stop(1, #D1D1D1) ); - background:-moz-linear-gradient( center top, #E8E8E8 5%, #D1D1D1 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#E8E8E8', endColorstr='#D1D1D1'); - background-color:#E8E8E8; - color:#636363; - font-size: 13px; - font-weight: bold; - border-left: 1px solid #A3A3A3; - line-height: 23px; -} - -.datagrid table thead th:first-child { - border: none; -} - -.datagrid table tbody td { - color: #404040; - border-left: 1px solid #DBDBDB; - font-size: 12px; - font-weight: normal; - line-height: 22px; - vertical-align: top; -} - -.datagrid table tbody tr:nth-child(odd) { - background: #F4F4F4; - color: #404040; -} - -.datagrid table tbody td:first-child { - border-left: none; -} - -.datagrid table tbody tr:last-child td { - border-bottom: none; -} - -.datagrid table tbody td table td { - border-left: none; - padding: 0; -} - -.datagrid table tbody td table tr { - background-color: rgba(255, 255, 255, 0) !important; - color: #404040; -} - -.pagination { - display: inline-block; -} - -.pagination a { - color: black; - float: left; - padding: 8px 16px; - text-decoration: none; - height: 14px; -} - -.pagination a:first-child, .pagination a:last-child { - font-size: 9px; -} - -.pagination a.active { - background-color: #4CAF50; - color: white; - border-radius: 5px; -} - -.pagination a:hover:not(.active) { - background-color: #ddd; - border-radius: 5px; -} - -@media screen and (max-width: 600px) { - .pagination-rows { - display: none; - } - - #raw-type { - display: none; - } -} - -.decoded { - margin-bottom: 20px; -} - -.decoded table tr td:first-child { - width: 150px; -} - -@media screen and (max-width: 600px) { - .datagrid-statistics tr th:nth-child(3), - .datagrid-statistics tr th:nth-child(4) { - display:none; - } - .datagrid-statistics tr td:nth-child(3), - .datagrid-statistics tr td:nth-child(4) { - display:none; - } -} - -@media screen and (max-width: 600px) { - .datagrid-weather tr th:nth-child(3), - .datagrid-weather tr th:nth-child(4), - .datagrid-weather tr th:nth-child(5), - .datagrid-weather tr th:nth-child(6), - .datagrid-weather tr th:nth-child(7), - .datagrid-weather tr th:nth-child(8) { - display:none; - } - .datagrid-weather tr td:nth-child(3), - .datagrid-weather tr td:nth-child(4), - .datagrid-weather tr td:nth-child(5), - .datagrid-weather tr td:nth-child(6), - .datagrid-weather tr td:nth-child(7), - .datagrid-weather tr td:nth-child(8) { - display:none; - } -} - -@media screen and (max-width: 600px) { - .datagrid-telemetry1 tr th:nth-child(4), - .datagrid-telemetry1 tr th:nth-child(5), - .datagrid-telemetry1 tr th:nth-child(6) { - display:none; - } - .datagrid-telemetry1 tr td:nth-child(4), - .datagrid-telemetry1 tr td:nth-child(5), - .datagrid-telemetry1 tr td:nth-child(6) { - display:none; - } -} - -@media screen and (max-width: 600px) { - .datagrid-telemetry2 tr th:nth-child(4), - .datagrid-telemetry2 tr th:nth-child(5), - .datagrid-telemetry2 tr th:nth-child(6), - .datagrid-telemetry2 tr th:nth-child(7), - .datagrid-telemetry2 tr th:nth-child(8), - .datagrid-telemetry2 tr th:nth-child(9) { - display:none; - } - .datagrid-telemetry2 tr td:nth-child(4), - .datagrid-telemetry2 tr td:nth-child(5), - .datagrid-telemetry2 tr td:nth-child(6), - .datagrid-telemetry2 tr td:nth-child(7), - .datagrid-telemetry2 tr td:nth-child(8), - .datagrid-telemetry2 tr td:nth-child(9) { - display:none; - } -} - -@media screen and (max-width: 600px) { - .datagrid-search tr th:nth-child(3), - .datagrid-search tr th:nth-child(4) { - display:none; - } - .datagrid-search tr td:nth-child(3), - .datagrid-search tr td:nth-child(4) { - display:none; - } -} - -@media screen and (max-width: 800px) { - .datagrid-search tr th:nth-child(4) { - display:none; - } - .datagrid-search tr td:nth-child(4) { - display:none; - } -} - -@media screen and (max-width: 600px) { - .modal-inner-content-menu a, .modal-inner-content-menu span { - margin-bottom: 10px; - display: block; - } -} - diff --git a/htdocs/public/data/coverage.php b/htdocs/public/data/coverage.php deleted file mode 100644 index bb662aa87af6c286e2f4a32b1017c015eb43490d..0000000000000000000000000000000000000000 --- a/htdocs/public/data/coverage.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -require dirname(__DIR__) . "../../includes/bootstrap.php"; - -$response = []; -$station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); -if ($station->isExistingObject()) { - $response['station_id'] = $station->id; - $response['coverage'] = []; - - $numberOfHours = 10*24; // latest 10 days should be enough - $limit = 5000; // Limit number of packets to reduce load on server (and browser) - - if (getWebsiteConfig('coverage_only_moving_senders')) { - $packetPaths = PacketPathRepository::getInstance()->getLatestMovingDataListByReceivingStationId($_GET['id'] ?? null, $numberOfHours, $limit); - } else { - $packetPaths = PacketPathRepository::getInstance()->getLatestDataListByReceivingStationId($_GET['id'] ?? null, $numberOfHours, $limit); - } - - - foreach ($packetPaths as $path) { - $row = []; - $row['latitude'] = $path['sending_latitude']; - $row['longitude'] = $path['sending_longitude']; - $row['distance'] = $path['distance']; - $response['coverage'][] = $row; - } -} - -header('Content-type: application/json'); -echo json_encode($response); diff --git a/htdocs/public/data/kml.php b/htdocs/public/data/kml.php deleted file mode 100644 index 79321f54149cde09a2fe9731c3398a8833b25c01..0000000000000000000000000000000000000000 --- a/htdocs/public/data/kml.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php - -require dirname(__DIR__) . "../../includes/bootstrap.php"; - -if (isset($_GET['id']) && isInt($_GET['id'])) { - $station = StationRepository::getInstance()->getObjectById($_GET['id']); -} else { - $station = new Station(null); -} - -$color = null; -if (isset($_GET['color'])) { - $color = $_GET['color']; -} - -$startTimestamp = time() - (60*60*24); // Default to 24h -if (isset($_GET['startts'])) { - $startTimestamp = $_GET['startts']; -} -if ($startTimestamp < (time() - (60*60*24*3))) { - $startTimestamp = time() - (60*60*24*3); // Not older than 3 days allowed -} - -$endTimestamp = time(); -if (isset($_GET['endts']) && isInt($_GET['endts'])) { - $endTimestamp = $_GET['endts']; -} - -$startTimestampString = strftime('%Y%m%d%H%M', $startTimestamp); -$endTimestampString = strftime('%Y%m%d%H%M', $endTimestamp); - -if ($station->isExistingObject()) { - $stationIds = []; - if ($station->stationTypeId == 2) { - $currentStations = StationRepository::getInstance()->getObjectListByName($station->name, 2, $station->sourceId); - foreach ($currentStations as $currentStation) { - $stationIds[] = $currentStation->getId(); - } - } else { - $stationIds[] = $station->getId(); - } - - $lateststation = null; - foreach ($stationIds as $stationId) { - $s = StationRepository::getInstance()->getObjectById($stationId); - if ($lateststation === null) { - $lateststation = $s; - } else if ($lateststation->latestConfirmedPacketTimestamp < $s->latestConfirmedPacketTimestamp) { - $lateststation = $s; - } - } - - $packets = PacketRepository::getInstance()->getConfirmedObjectListByStationIdList($stationIds, $startTimestamp, $endTimestamp); - $dom = Kml::getInstance()->getKmlDomDocument($lateststation, $packets, $startTimestamp, $endTimestamp, $color); - $kmlOutput = $dom->saveXML(); - - header('Content-type: application/vnd.google-earth.kml+xml'); - header('Content-Disposition: attachment; filename="' . htmlspecialchars($lateststation->name) . '-' . $startTimestampString . '-' . $endTimestampString . '.kml"'); - echo Kml::getInstance()->formatKmlContent($kmlOutput, " ", 4); -} diff --git a/htdocs/public/data/trail.php b/htdocs/public/data/trail.php deleted file mode 100644 index 064f0e55a5907510e74f9bfdef3ae868601a248e..0000000000000000000000000000000000000000 --- a/htdocs/public/data/trail.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -require dirname(__DIR__) . "../../includes/bootstrap.php"; - -$response = []; -$station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); -if ($station->isExistingObject()) { - $numberOfHours = $_GET['hours'] ?? 1; - - $columns = ['timestamp']; - $type = 'speed'; - if ($_GET['type'] == 'speed') { - $type = 'speed'; - if ($_GET['imperialUnits'] ?? '0' == '1') { - $response[] = array('Time', 'Speed (mph)'); - } else { - $response[] = array('Time', 'Speed (kmh)'); - } - } else { - $type = 'altitude'; - if ($_GET['imperialUnits'] ?? '0' == '1') { - $response[] = array('Time', 'Altitude (ft)'); - } else { - $response[] = array('Time', 'Altitude (m)'); - } - } - $columns[] = $type; - - $packets = PacketRepository::getInstance()->getLatestDataListByStationId($_GET['id'] ?? null, $numberOfHours, $columns); - foreach($packets as $packet) { - $value = floatval($packet[$type]); - if ($_GET['imperialUnits'] ?? '0' == '1') { - if ($type == 'speed') { - $value = convertKilometerToMile($value); - } else if ($type == 'altitude') { - $value = convertMeterToFeet($value); - } - } - - if ($type == 'speed' && count($response) > 1) { - if (isset($response[count($response) - 1])) { - $prevTimestamp = $response[count($response) - 1][0]; - if ($prevTimestamp < ($packet['timestamp'] - 60*60)) { - // Previous value is old, make sure we have a break in graph - $response[] = array($prevTimestamp + 1, null); - } - } - } - - $response[] = [$packet['timestamp'], $value]; - } -} - -header('Content-type: application/json'); -echo json_encode($response); diff --git a/htdocs/public/favicon.ico b/htdocs/public/favicon.ico deleted file mode 100755 index 6a8a77bd5a18e9e9377bda4b1fe23d8e7ccac6c6..0000000000000000000000000000000000000000 Binary files a/htdocs/public/favicon.ico and /dev/null differ diff --git a/htdocs/public/heatmaps/.htaccess b/htdocs/public/heatmaps/.htaccess deleted file mode 100755 index 413bd31b84f2df2cc811382c5a7935c8bf50ffd3..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/.htaccess +++ /dev/null @@ -1,23 +0,0 @@ -<IfModule mod_expires.c> - ExpiresActive On - ExpiresByType image/jpg "access 1 hour" - ExpiresByType image/jpeg "access 1 hour" - ExpiresByType image/gif "access 1 hour" - ExpiresByType image/png "access 1 hour" - ExpiresDefault "access 1 week" -</IfModule> - -Options +FollowSymLinks -RewriteEngine On - -# Do not do anything for already existing files and folders -RewriteCond %{REQUEST_FILENAME} -f [OR] -RewriteCond %{REQUEST_FILENAME} -d -RewriteRule .+ - [L] - -RewriteCond %{SCRIPT_FILENAME} !-d -RewriteCond %{SCRIPT_FILENAME} !-f -RewriteCond %{REQUEST_URI} \.png$ - -# Images that needs to be handled by heatmap.php -RewriteRule ^/?latest-heatmap\.(\d+)\.(\d+)\.(\d+)\.png$ ./heatmap.php?zoom=$1&x=$2&y=$3 diff --git a/htdocs/public/heatmaps/gd-heatmap/LICENSE b/htdocs/public/heatmaps/gd-heatmap/LICENSE deleted file mode 100644 index 7ffb009659f5854d88a6c78b12993aee287fa345..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/gd-heatmap/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 xird - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/htdocs/public/heatmaps/gd-heatmap/README.md b/htdocs/public/heatmaps/gd-heatmap/README.md deleted file mode 100644 index cba16fe0b1bf63c55db5371d5318278b991c9b2a..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/gd-heatmap/README.md +++ /dev/null @@ -1,6 +0,0 @@ -gd-heatmap -========== - -GD-Heatmap is a heatmap generation library using PHP and GD. - -Take a look at the test.php script to get started. diff --git a/htdocs/public/heatmaps/gd-heatmap/gd-rg.php b/htdocs/public/heatmaps/gd-heatmap/gd-rg.php deleted file mode 100644 index 74066a4942b4c01f2fdf59dcc70a2c3fdee369ec..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/gd-heatmap/gd-rg.php +++ /dev/null @@ -1,195 +0,0 @@ -<?php - -/** - * This class is originally from here: http://planetozh.com/download/gd-gradient-fill.php - * - * It was then modified by StackOverflow user Justin (http://stackoverflow.com/users/265575/justin) - * ..in this question: http://stackoverflow.com/questions/6615602/radial-gradients-with-opacity-in-php - * ..to support alpha, and uploaded here: http://codepad.org/1eZ3Km0J/fork . - * - * Only a couple of changes were needed to use this class with the heatmap lib. - * - */ -class gd_gradient_alpha { - - // Constructor. Creates, fills and returns an image - function gd_gradient_alpha($w,$h,$d,$rgb,$as,$ae,$step=0) { - $this->width = $w; - $this->height = $h; - $this->direction = $d; - $this->color = $rgb; - $this->alphastart = $as; - $this->alphaend = $ae; - $this->step = intval(abs($step)); - - // Attempt to create a blank image in true colors, or a new palette based image if this fails - if (function_exists('imagecreatetruecolor')) { - $this->image = imagecreatetruecolor($this->width,$this->height); - } elseif (function_exists('imagecreate')) { - $this->image = imagecreate($this->width,$this->height); - } else { - die('Unable to create an image'); - } - - imagealphablending($this->image, false); - imagesavealpha($this->image, true); - - // Fill it - $this->fillalpha($this->image,$this->direction,$this->color,$this->alphastart,$this->alphaend); - - // Show it - //$this->display($this->image); - - // Return it - //return $this->image; - } - - function get_image() { - return $this->image; - } - - - // Displays the image with a portable function that works with any file type - // depending on your server software configuration - function display ($im) { - if (function_exists("imagepng")) { - header("Content-type: image/png"); - imagepng($im); - } - elseif (function_exists("imagegif")) { - header("Content-type: image/gif"); - imagegif($im); - } - elseif (function_exists("imagejpeg")) { - header("Content-type: image/jpeg"); - imagejpeg($im, "", 0.5); - } - elseif (function_exists("imagewbmp")) { - header("Content-type: image/vnd.wap.wbmp"); - imagewbmp($im); - } else { - die("Doh ! No graphical functions on this server ?"); - } - return true; - } - - - // The main function that draws the gradient - function fillalpha($im,$direction,$rgb,$as,$ae) { - - list($r,$g,$b) = $this->hex2rgb($rgb); - $a1 = $this->a2sevenbit($as); - $a2 = $this->a2sevenbit($ae); - - switch($direction) { - case 'horizontal': - $line_numbers = imagesx($im); - $line_width = imagesy($im); - break; - case 'vertical': - $line_numbers = imagesy($im); - $line_width = imagesx($im); - break; - case 'ellipse': - $width = imagesx($im); - $height = imagesy($im); - $rh=$height>$width?1:$width/$height; - $rw=$width>$height?1:$height/$width; - $line_numbers = min($width,$height); - $center_x = $width/2; - $center_y = $height/2; - imagefill($im, 0, 0, imagecolorallocatealpha($im, $r, $g, $b, $a1)); - break; - case 'ellipse2': - $width = imagesx($im); - $height = imagesy($im); - $rh=$height>$width?1:$width/$height; - $rw=$width>$height?1:$height/$width; - $line_numbers = sqrt(pow($width,2)+pow($height,2)); - $center_x = $width/2; - $center_y = $height/2; - break; - case 'circle': - $width = imagesx($im); - $height = imagesy($im); - $line_numbers = sqrt(pow($width,2)+pow($height,2)); - $center_x = $width/2; - $center_y = $height/2; - $rh = $rw = 1; - break; - case 'circle2': - $width = imagesx($im); - $height = imagesy($im); - $line_numbers = min($width,$height); - $center_x = $width/2; - $center_y = $height/2; - $rh = $rw = 1; - imagefill($im, 0, 0, imagecolorallocatealpha($im, $r, $g, $b, $a1)); - break; - case 'square': - case 'rectangle': - $width = imagesx($im); - $height = imagesy($im); - $line_numbers = max($width,$height)/2; - break; - case 'diamond': - $width = imagesx($im); - $height = imagesy($im); - $rh=$height>$width?1:$width/$height; - $rw=$width>$height?1:$height/$width; - $line_numbers = min($width,$height); - break; - default: - } - - for ( $i = 0; $i < $line_numbers; $i=$i+1+$this->step ) { - $old_a = ( empty($a) ) ? $a2 : $a; - $a = ( $a2 - $a1 != 0 ) ? intval( $a1 + ( $a2 - $a1 ) * ( $i / $line_numbers ) ): $a1; - - if ( "$old_a" != "$a") { - $fill = imagecolorallocatealpha( $im, $r, $g, $b, $a ); - } - switch($direction) { - case 'vertical': - imagefilledrectangle($im, 0, $i, $line_width, $i+$this->step, $fill); - break; - case 'horizontal': - imagefilledrectangle( $im, $i, 0, $i+$this->step, $line_width, $fill ); - break; - case 'ellipse': - case 'ellipse2': - case 'circle': - case 'circle2': - imagefilledellipse ($im,$center_x, $center_y, ($line_numbers-$i)*$rh, ($line_numbers-$i)*$rw,$fill); - break; - case 'square': - case 'rectangle': - imagefilledrectangle ($im,$i*$width/$height,$i*$height/$width,$width-($i*$width/$height), $height-($i*$height/$width),$fill); - break; - case 'diamond': - imagefilledpolygon($im, array ( - $width/2, $i*$rw-0.5*$height, - $i*$rh-0.5*$width, $height/2, - $width/2,1.5*$height-$i*$rw, - 1.5*$width-$i*$rh, $height/2 ), 4, $fill); - break; - default: - } - } - } - - // #ff00ff -> array(255,0,255) or #f0f -> array(255,0,255) - function hex2rgb($color) { - $color = str_replace('#','',$color); - $s = strlen($color) / 3; - $rgb[]=hexdec(str_repeat(substr($color,0,$s),2/$s)); - $rgb[]=hexdec(str_repeat(substr($color,$s,$s),2/$s)); - $rgb[]=hexdec(str_repeat(substr($color,2*$s,$s),2/$s)); - return $rgb; - } - - function a2sevenbit($alpha) { - return (abs($alpha - 255) >> 1); - } - -} diff --git a/htdocs/public/heatmaps/gd-heatmap/gd_heatmap.php b/htdocs/public/heatmaps/gd-heatmap/gd_heatmap.php deleted file mode 100644 index 5d9b4f35848be37c6440c06069aaee3060d3be00..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/gd-heatmap/gd_heatmap.php +++ /dev/null @@ -1,293 +0,0 @@ -<?php - -/** - * A class for generating heatmaps using the GD image library. - * - * http://blog.ampli.fi/heatmap-generation-library-using-php-and-gd/ - * - * TODO Automatic generation of gradient from source or from scratch. - * - */ -Class gd_heatmap { - private $config; - private $debug_log; - private $im; - - /** - * @param array $data - * An array containing the data to be represented by the heatmap. Each - * element is a non-associative array with three values, where the first one - * is the x-coordinate, second the y-coordinate and third the value in that - * coordinate. - * - * @param array $config - * An array containing configuration variables: - * debug - Set to TRUE to print out debug data in the image. - * r - radius of each data point. - * width - width of the image. - * height - height of the image. - * noc - Number of colours to be used in the heatmap. More colours looks - * nicer but is heavier to process. - * dither - Boolean. Dithered images tend to look better than non-dithered - * if noc is about less than 16. - * format - String, "png" or "jpeg" - * fill_with_smallest - Boolean. If set to true, the image won't be filled - * (i.e. areas with 0 value won't be coloured) with white/transparent, - * but instead with a colour that matches the gradient's low end. - */ - function __construct($data, $config = array()) { - $default_config = array( - 'debug' => FALSE, - 'r' => 50, - 'width' => 640, - 'height' => 480, - 'noc' => 16, - 'dither' => FALSE, - 'format' => 'png', - 'fill_with_smallest' => false, - ); - - foreach ($default_config as $key => $value) { - if (isset($config[$key])) { - $this->config[$key] = $config[$key]; - } - else { - $this->config[$key] = $default_config[$key]; - } - } - - if ($this->config['format'] != 'png' && $this->config['format'] != 'jpeg') { - $this->error('Invalid format "' . $this->config['format'] . '". Supported formats include png and jpeg.'); - } - - $this->debug_log = ''; - - $this->generate_image($data); - } - - /** - * @param string $key - * The configuration option to get. - * - * @return mixed - * The value of the configuration option. - */ - public function get_config($key) { - return $this->config[$key]; - } - - - /** - * Generates the actual heatmap. - */ - private function generate_image($data) { - require_once('gd-rg.php'); - $time = microtime(1); $this->logg('Started at ' . $time); - - // Find the maximum value from the given data. - $max_data_value = 1; - foreach ($data as $row) { - if (isset($row[2]) && $max_data_value < $row[2]) { - $max_data_value = $row[2]; - } - } - $this->logg('Done sorting data at ' . (microtime(1) - $time)); - - // Create the heatmap image. - $im = imagecreatetruecolor($this->get_config('width'), $this->get_config('height')); - $white = imagecolorallocate($im, 255, 255, 255); - imagefill($im, 0, 0, $white); - imagealphablending($im, true); - imagesavealpha($im, true); - - // Create a separate spot image for each value to be shown, with different - // amounts of black. Having 25 separate shades of colour looks like a decent - // number. - $spots = array(); - for ($i = 0; $i < $this->config['noc']; $i++) { - // The gradient lib doesn't like too small values for $alpha_end, so we use - // $noc for that, which happens to work well. - $alpha_end = $this->map($i, 0, $this->config['noc'] - 1, $this->config['noc'], 255); - $temp = new gd_gradient_alpha($this->config['r'], $this->config['r'], 'ellipse','#000', 0x00, $alpha_end, 0); - $spot = $temp->get_image(); - imagealphablending($spot, true); - imagesavealpha($spot, true); - $spots[$i] = $spot; - } - $this->logg('Created '.count($spots).' spots at ' . (microtime(1) - $time)); - - // Go through the data, and add appropriate spot images to the heatmap - // image. - for ($i = 0; $i < count($data); $i++) { - $value = (isset($data[$i][2]) ? $data[$i][2] : 1); - $value = $this->map($value, 1, $max_data_value, 0, $this->config['noc'] - 1); - imagecopy($im , $spots[$value], $data[$i][0], $data[$i][1] , 0 , 0 , $this->config['r'] , $this->config['r']); - } - $this->logg('Copied spots to image at ' . (microtime(1) - $time)); - - imagetruecolortopalette($im, $this->config['dither'], $this->config['noc']); - $this->logg('Flattened black at ' . (microtime(1) - $time)); - - // Get the gradient from an image file - // FIX: Fetch image in current __FILE__ directory (script including this might be somewhere else) - $gi = dirname(__FILE__) . '/gradient-' . $this->config['noc'] . ($this->config['fill_with_smallest'] ? "-fill" : "") . '.png'; - if (!file_exists($gi)) { - $this->error("Can't find gradient file " . $gi . ". Make one using gradient-source.jpg"); - } - $gs = imagecreatefrompng($gi); - imagetruecolortopalette($gs, TRUE, $this->config['noc']); - - // Get a list of different gray values in the image, and order them. - $grays = array(); - $imagecolorstotal = imagecolorstotal($im); - // FIX: Loop over all colors supported by gradient instead of colors in image (might not contain all) - for ($i = 0; $i < $this->config['noc']; $i++) { - if ($i >= $imagecolorstotal) { - $c = array('red'=> 0, 'green'=> 0, 'blue'=> 0); - } else { - $c = imagecolorsforindex($im, $i); - } - $grays[] = str_pad(($c['red'] * 65536) + ($c['green'] * 256) + $c['blue'], 8, '0', STR_PAD_LEFT) . ':' . $i; - } - sort($grays); - $indexes = array(); - foreach ($grays as $gray) { - $indexes[] = substr($gray, strpos($gray, ':') + 1); - } - $this->logg('Created gray indexes at ' . (microtime(1) - $time)); - - // Replace each shade of gray with the matching rainbow colour. - $i = 0; - foreach ($indexes as $index) { - $fill_index = imagecolorat($gs , $i, 0); - $fill_color = imagecolorsforindex($gs, $fill_index); - imagecolorset($im, $index, $fill_color['red'], $fill_color['green'], $fill_color['blue']); - $i++; - } - - $this->logg('Replaced black with rainbow at ' . (microtime(1) - $time)); - - if (!$this->config['fill_with_smallest']) { - // Finally switch from white background to transparent. - $closest = imagecolorclosest ($im, 255 , 255 , 255); - imagecolortransparent($im, $closest); - $this->logg('Made transparent at ' . (microtime(1) - $time)); - } - - $this->logg('done at ' . (microtime(1) - $time)); - - // Debugging text - if ($this->config['debug']) { - $text_color = imagecolorallocate($im, 0, 0, 0); - $y = 5; - foreach (explode("\n", $this->debug_log) as $line) { - imagestring($im, 3, 250, $y, $line, $text_color); - $y = $y + 10; - } - } - $this->im = $im; - } - - /** - * Prints out an error in the image if something went horribly wrong. - */ - function error ($text) { - $im = imagecreate(600, 480); - $bg_color = imagecolorallocate($im, 255, 0, 0); - $text_color = imagecolorallocate($im, 0, 0, 0); - imagestring($im, 3, 5, 5, $text , $text_color); - header('Content-type: image/png'); - imagepng($im); - imagedestroy($im); - die(); - } - - /** - * @return Object The generated GD image object containing the heatmap. - */ - public function get_image() { - return $this->im; - } - - /** - * Prints out the generated image or saves it into a file. - */ - public function output($filename = null) { - if (!$filename) { - header('Content-type: image/' . $this->config['format']); - } - switch ($this->config['format']) { - case 'png': - imagepng($this->im, $filename); - break; - case 'jpeg': - imagejpeg($this->im, $filename); - break; - } - imagedestroy($this->im); - } - - /** - * Debugging function. - */ - private function logg($thing) { - if (!$this->config['debug']) { - return; - } - if (is_array($thing) || is_object($thing)) { - $out = print_r($thing, 1); - } - else { - $out = $thing; - } - $this->debug_log .= $out . "\n"; - } - - /** - * Simple utility function for mapping values from one range to another. - * Copied from http://stackoverflow.com/questions/7742959/php-map-a-value-using-fromrange-and-torange - * - */ - private function map($value, $fromLow, $fromHigh, $toLow, $toHigh) { - $fromRange = $fromHigh - $fromLow; - $toRange = $toHigh - $toLow; - $scaleFactor = $toRange / $fromRange; - $tmpValue = $value - $fromLow; - $tmpValue *= $scaleFactor; - return $tmpValue + $toLow; - } - - function debug() { - echo $this->debug_log; - } - - /** - * @param integer $w - * The maximum x-coordinate of the test points. - * @param integer $h - * The maximum y-coordinate of the test points. - * height. - * @param integer $r - * The radius of a single data point. Used to calculate data point distance - * from image edges. - * @param integer $n - * The number of data points generated. - * @param integer $mv - * The maximum value of a single data point. - * - * @return array Test data that can be passed to the heatmap constructor. - */ - public static function get_test_data($w, $h, $r, $n = 200, $mv = 1500) { - $data = array(); - - for ($i = 0; $i < $n; $i++) { - $x = rand(0 - $r, $w ); - $y = rand(0 - $r, $h ); - $v = rand(1, $mv); - - $data[] = array($x, $y, $v); - } - - return $data; - } -} diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-16-fill.png b/htdocs/public/heatmaps/gd-heatmap/gradient-16-fill.png deleted file mode 100644 index 61fdf6204243173a688eab735ea99e821773088b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-16-fill.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-16.png b/htdocs/public/heatmaps/gd-heatmap/gradient-16.png deleted file mode 100644 index 119782bc87e07195298c76a3b5f70c33d04a08ef..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-16.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-25-fill.png b/htdocs/public/heatmaps/gd-heatmap/gradient-25-fill.png deleted file mode 100644 index 725e67baf325816d9514e10ac9e1128e1869a50e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-25-fill.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-25.png b/htdocs/public/heatmaps/gd-heatmap/gradient-25.png deleted file mode 100644 index 3b6ff273a3d8f59bfa0d81e80ae6b7a873c88cd2..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-25.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-32-fill.png b/htdocs/public/heatmaps/gd-heatmap/gradient-32-fill.png deleted file mode 100644 index 4f52e9ab4b694157a4dd71a1e86245f69f1dea95..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-32-fill.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-32.png b/htdocs/public/heatmaps/gd-heatmap/gradient-32.png deleted file mode 100644 index 3a30889d0744c78c4c6e6b92f53b5e4cc6b4b2b5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-32.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-8-fill.png b/htdocs/public/heatmaps/gd-heatmap/gradient-8-fill.png deleted file mode 100644 index 0fdbfcaedc669d50ea87a61733d59300d965ff15..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-8-fill.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-8.png b/htdocs/public/heatmaps/gd-heatmap/gradient-8.png deleted file mode 100644 index 7f890cc90e83bf04a01115dff01d079e8464d265..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-8.png and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/gradient-source.jpg b/htdocs/public/heatmaps/gd-heatmap/gradient-source.jpg deleted file mode 100644 index 821bff13a0de21365d5feb74cac294c4494f7c86..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/gd-heatmap/gradient-source.jpg and /dev/null differ diff --git a/htdocs/public/heatmaps/gd-heatmap/test.php b/htdocs/public/heatmaps/gd-heatmap/test.php deleted file mode 100644 index abaf65983ec798474e72eddc0bf185a4e062d471..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/gd-heatmap/test.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -// This is a test script demonstrating the use of the gd-heatmap library. -require_once('gd_heatmap.php'); - -// Generate some test data using the static function provided for that purpose. -$data = gd_heatmap::get_test_data(1240, 600, 50, 500); - -// Config array with all the available options. See the constructor's doc block -// for explanations. -$config = array( - 'debug' => TRUE, - 'width' => 1240, - 'height' => 600, - 'noc' => 32, - 'r' => 50, - 'dither' => FALSE, - 'format' => 'jpeg', - 'fill_with_smallest' => false, -); - -// Create a new heatmap based on the data and the config. -$heatmap = new gd_heatmap($data, $config); - -// And print it out. If you're having trouble getting any images out of the -// library , comment this out to allow your browser to show you the error -// messages. -$heatmap->output(); - -// Or save it to a file. Don't forget to set correct file permissions in the -// target directory. -//$heatmap->output('savetest.png'); diff --git a/htdocs/public/heatmaps/heatmap.php b/htdocs/public/heatmaps/heatmap.php deleted file mode 100755 index 7e7a5398fafd0fd2f8c58a62162a43bee1631825..0000000000000000000000000000000000000000 --- a/htdocs/public/heatmaps/heatmap.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php -header('Access-Control-Allow-Origin: *'); -header('Cache-Control: max-age=3600, public'); -header('Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); -header('Content-type: image/png'); - -$zoom = $_GET['zoom'] ?? 0; -$x = $_GET['x'] ?? 0; -$y = $_GET['y'] ?? 0; -$filename = 'heatmap.'.$zoom.'.'.$x.'.'.$y.'.png'; - -if (file_exists($filename) && time()-filemtime($filename) < 3600) { - // File exists and is not older than 1 hour - readfile($filename); - exit; -} - -require dirname(__DIR__) . "../../includes/bootstrap.php"; -require_once('gd-heatmap/gd_heatmap.php'); - -$dotRadius = 16; -$tilePixelSize = 256; - -$totalMinLat = -85.05115; -$totalMaxLat = 85.05115; -$totalMinLng = -180; -$totalMaxLng = 180; - -$totalMinLatPixel = getLatPixelCoordinate($totalMinLat, $zoom, $tilePixelSize); -$totalMaxLatPixel = getLatPixelCoordinate($totalMaxLat, $zoom, $tilePixelSize); -$totalMinLngPixel = getLngPixelCoordinate($totalMinLng, $zoom, $tilePixelSize); -$totalMaxLngPixel = getLngPixelCoordinate($totalMaxLng, $zoom, $tilePixelSize); - -$latPartPixelLength = ($totalMinLatPixel / pow(2, $zoom)); -$lngPartPixelLength = ($totalMaxLngPixel / pow(2, $zoom)); - -$minLatPixel = ($x * $latPartPixelLength) + $latPartPixelLength; -$maxLatPixel = ($x * $latPartPixelLength); -$minLngPixel = $totalMinLngPixel + $y * $lngPartPixelLength; -$maxLngPixel = $totalMinLngPixel + (($y * $lngPartPixelLength) + $lngPartPixelLength); - -$minLat = getLatFromLatPixelCoordinate($minLatPixel, $zoom, $tilePixelSize); -$maxLat = getLatFromLatPixelCoordinate($maxLatPixel, $zoom, $tilePixelSize); -$minLng = getLngFromLngPixelCoordinate($minLngPixel, $zoom, $tilePixelSize); -$maxLng = getLngFromLngPixelCoordinate($maxLngPixel, $zoom, $tilePixelSize); - -$latMarginal = ($maxLat - $minLat) * 0.1; -$lngMarginal = ($maxLng - $minLng) * 0.1; - -$sql = "select latest_confirmed_latitude latitude, latest_confirmed_longitude longitude - from station - where latest_confirmed_packet_timestamp > ? - and latest_confirmed_latitude between ? and ? - and latest_confirmed_longitude between ? and ?"; -$parameters = [time() - (3*60*60), $minLat - $latMarginal, $maxLat + $latMarginal, $minLng - $lngMarginal, $maxLng + $lngMarginal]; - -$pdo = PDOConnection::getInstance(); -$stmt = $pdo->prepareAndExec($sql, $parameters); -$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - -$data = []; -foreach($rows as $row) { - $x = getLngPixelCoordinate($row["longitude"], $zoom, $tilePixelSize) - $minLngPixel - ($dotRadius / 2); - $y = getLatPixelCoordinate($row["latitude"], $zoom, $tilePixelSize) - $maxLatPixel - ($dotRadius / 2); - $data[] = [$x, $y, 2]; -} - -$config = array( - 'debug' => FALSE, - 'width' => 256, - 'height' => 256, - 'noc' =>16, - 'r' => $dotRadius, - 'dither' => FALSE, - 'format' => 'png', - 'fill_with_smallest' => FALSE, -); - -$heatmap = new gd_heatmap($data, $config); - -if (is_writable(dirname($filename))) { - $heatmap->output($filename); - readfile($filename); -} else { - $heatmap->output(); -} diff --git a/htdocs/public/heatmaps/transparent.png b/htdocs/public/heatmaps/transparent.png deleted file mode 100755 index 5ac920731787e5acc2b38c13795ca9d6d583b640..0000000000000000000000000000000000000000 Binary files a/htdocs/public/heatmaps/transparent.png and /dev/null differ diff --git a/htdocs/public/images/aprs-symbols.png b/htdocs/public/images/aprs-symbols.png deleted file mode 100644 index ca20360ce32cdfd7b55e6c4d55e1c86422470d40..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/aprs-symbols.png and /dev/null differ diff --git a/htdocs/public/images/checked.png b/htdocs/public/images/checked.png deleted file mode 100755 index 57bba8979fd4747eb4b3625af843712ba4fb6c52..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/checked.png and /dev/null differ diff --git a/htdocs/public/images/dotColor0.png b/htdocs/public/images/dotColor0.png deleted file mode 100755 index 94510499be66f2ebf969ad064a88679e7c860f59..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/dotColor0.png and /dev/null differ diff --git a/htdocs/public/images/dotColor0.svg b/htdocs/public/images/dotColor0.svg deleted file mode 100755 index 79928529e79179990a31d82f8858166e3dd037db..0000000000000000000000000000000000000000 --- a/htdocs/public/images/dotColor0.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="12" - height="12" - viewBox="0 0 12 12" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="dotColor0.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="653" - inkscape:window-height="480" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-0.10614088" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4182"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - id="path4197" - sodipodi:type="arc" - sodipodi:cx="6" - sodipodi:cy="6" - sodipodi:rx="2.4999955" - sodipodi:ry="2.4999955" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="M 3.5000045,5.9999999 A 2.4999955,2.4999955 0 0 1 5.9994001,3.5000046 2.4999955,2.4999955 0 0 1 8.4999952,5.9988001 2.4999955,2.4999955 0 0 1 6.0017999,8.4999948 2.4999955,2.4999955 0 0 1 3.5000057,6.0023999" - style="fill:#2a2aff;stroke:#1a1a1a;stroke-width:0;stroke-linecap:round" /> -</svg> diff --git a/htdocs/public/images/dotColor1.png b/htdocs/public/images/dotColor1.png deleted file mode 100755 index ce72213702baedbba1944959831a8b7522621218..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/dotColor1.png and /dev/null differ diff --git a/htdocs/public/images/dotColor1.svg b/htdocs/public/images/dotColor1.svg deleted file mode 100755 index b20db8d575cb179ccd34770b0db3f7f0bcc45da7..0000000000000000000000000000000000000000 --- a/htdocs/public/images/dotColor1.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="12" - height="12" - viewBox="0 0 12 12" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="dotColor1.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="653" - inkscape:window-height="480" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="12" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4182"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - id="path4197" - sodipodi:type="arc" - sodipodi:cx="6" - sodipodi:cy="6" - sodipodi:rx="2.4999955" - sodipodi:ry="2.4999955" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="M 3.5000045,5.9999999 A 2.4999955,2.4999955 0 0 1 5.9994001,3.5000046 2.4999955,2.4999955 0 0 1 8.4999952,5.9988001 2.4999955,2.4999955 0 0 1 6.0017999,8.4999948 2.4999955,2.4999955 0 0 1 3.5000057,6.0023999" - style="fill:#6f02a7;fill-opacity:0.98799995;stroke:#1a1a1a;stroke-width:0;stroke-linecap:round" /> -</svg> diff --git a/htdocs/public/images/dotColor2.png b/htdocs/public/images/dotColor2.png deleted file mode 100755 index 10df02363dfec44689e533eedb55fe0e47740dcb..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/dotColor2.png and /dev/null differ diff --git a/htdocs/public/images/dotColor2.svg b/htdocs/public/images/dotColor2.svg deleted file mode 100755 index ba2eb645569fd91d427c8179fcc5cdbfa8000a94..0000000000000000000000000000000000000000 --- a/htdocs/public/images/dotColor2.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="12" - height="12" - viewBox="0 0 12 12" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="dotColor2.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="653" - inkscape:window-height="480" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="12" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4182"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - id="path4197" - sodipodi:type="arc" - sodipodi:cx="6" - sodipodi:cy="6" - sodipodi:rx="2.4999955" - sodipodi:ry="2.4999955" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="M 3.5000045,5.9999999 A 2.4999955,2.4999955 0 0 1 5.9994001,3.5000046 2.4999955,2.4999955 0 0 1 8.4999952,5.9988001 2.4999955,2.4999955 0 0 1 6.0017999,8.4999948 2.4999955,2.4999955 0 0 1 3.5000057,6.0023999" - style="fill:#005500;stroke:#1a1a1a;stroke-width:0;stroke-linecap:round" /> -</svg> diff --git a/htdocs/public/images/dotColor3.png b/htdocs/public/images/dotColor3.png deleted file mode 100755 index 5b7b83f0ce5e5bd50e2cb632c7d4aeb95941485b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/dotColor3.png and /dev/null differ diff --git a/htdocs/public/images/dotColor3.svg b/htdocs/public/images/dotColor3.svg deleted file mode 100755 index 6aabeed550db735cb2a3a069ba5df9edafea101e..0000000000000000000000000000000000000000 --- a/htdocs/public/images/dotColor3.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="12" - height="12" - viewBox="0 0 12 12" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="dotColor3.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="653" - inkscape:window-height="480" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-0.10169492" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4182"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - id="path4197" - sodipodi:type="arc" - sodipodi:cx="6" - sodipodi:cy="6" - sodipodi:rx="2.4999955" - sodipodi:ry="2.4999955" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="M 3.5000045,5.9999999 A 2.4999955,2.4999955 0 0 1 5.9994001,3.5000046 2.4999955,2.4999955 0 0 1 8.4999952,5.9988001 2.4999955,2.4999955 0 0 1 6.0017999,8.4999948 2.4999955,2.4999955 0 0 1 3.5000057,6.0023999" - style="fill:#a70202;stroke:#1a1a1a;stroke-width:0;stroke-linecap:round" /> -</svg> diff --git a/htdocs/public/images/dotColor4.png b/htdocs/public/images/dotColor4.png deleted file mode 100755 index 35d1e796908ed4fb9b116e8d8dddeebc33ebc4a6..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/dotColor4.png and /dev/null differ diff --git a/htdocs/public/images/dotColor4.svg b/htdocs/public/images/dotColor4.svg deleted file mode 100755 index ee4a4837233beaf32913842cb7876526fbcd5e6b..0000000000000000000000000000000000000000 --- a/htdocs/public/images/dotColor4.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="12" - height="12" - viewBox="0 0 12 12" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="dotColor4.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="653" - inkscape:window-height="480" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="12" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4182"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - id="path4197" - sodipodi:type="arc" - sodipodi:cx="6" - sodipodi:cy="6" - sodipodi:rx="2.4999955" - sodipodi:ry="2.4999955" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="M 3.5000045,5.9999999 A 2.4999955,2.4999955 0 0 1 5.9994001,3.5000046 2.4999955,2.4999955 0 0 1 8.4999952,5.9988001 2.4999955,2.4999955 0 0 1 6.0017999,8.4999948 2.4999955,2.4999955 0 0 1 3.5000057,6.0023999" - style="fill:#217867;stroke:#1a1a1a;stroke-width:0;stroke-linecap:round" /> -</svg> diff --git a/htdocs/public/images/spinner.gif b/htdocs/public/images/spinner.gif deleted file mode 100644 index 19cb4297f9bf3b49dacdb693f5e3f5da9350f016..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/spinner.gif and /dev/null differ diff --git a/htdocs/public/images/transmit-original.png b/htdocs/public/images/transmit-original.png deleted file mode 100755 index 07216aef0cf6cd1492bcd6e742a6dfc5ecb81132..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/transmit-original.png and /dev/null differ diff --git a/htdocs/public/images/transmit-original.svg b/htdocs/public/images/transmit-original.svg deleted file mode 100755 index 3bc5068188bfdfdf7c584d49196e57eaf6d9811f..0000000000000000000000000000000000000000 --- a/htdocs/public/images/transmit-original.svg +++ /dev/null @@ -1,111 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="86" - height="72" - viewBox="0 0 86 72" - id="svg4310" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="transmit.svg"> - <defs - id="defs4312" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.98" - inkscape:cx="-337.92553" - inkscape:cy="276.19386" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:window-width="1875" - inkscape:window-height="1056" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" /> - <metadata - id="metadata4315"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-980.36219)"> - <g - id="g4878" - style="stroke:#2c5aa0" - transform="matrix(0.50474232,0,0,0.50474232,-105.22361,729.73976)"> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214" - d="m 246.84931,501.49154 c -46.53731,31.96085 -45.53599,101.06369 0.67435,132.84715" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5" - d="m 262.10498,522.50881 c -32.37593,21.6208 -30.92504,70.04354 0.44957,90.81259" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-9" - d="m 273.93876,539.70487 c -18.88891,14.42772 -19.46108,40.82167 0.44957,56.19592" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-9-1" - d="m 282.31201,552.74211 c -10.7967,7.909 -9.5706,23.06376 0.44957,30.12101" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-53" - d="m 340.47459,501.37914 c 46.53731,31.96085 45.53599,101.06368 -0.67435,132.84714" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-95" - d="m 325.21892,522.3964 c 32.37593,21.6208 30.92504,70.04354 -0.44957,90.81259" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-9-2" - d="m 313.38514,539.59247 c 18.88891,14.42772 19.46107,40.82166 -0.44957,56.19591" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-9-1-5" - d="m 305.01189,552.62971 c 10.7967,7.90899 9.57059,23.06375 -0.44956,30.121" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/htdocs/public/images/transmit.png b/htdocs/public/images/transmit.png deleted file mode 100755 index f2ef93cd56c5ff344171dc0467bbb637d8b29bb1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/transmit.png and /dev/null differ diff --git a/htdocs/public/images/transmit.svg b/htdocs/public/images/transmit.svg deleted file mode 100755 index c69dd5c86b5e7c6f5d09544f57e7fbb60464d365..0000000000000000000000000000000000000000 --- a/htdocs/public/images/transmit.svg +++ /dev/null @@ -1,99 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="76" - height="64" - viewBox="0 0 76 64" - id="svg4310" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="transmit.svg"> - <defs - id="defs4312" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="7.1892188" - inkscape:cx="11.050423" - inkscape:cy="47.464992" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:window-width="1875" - inkscape:window-height="1056" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" /> - <metadata - id="metadata4315"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-988.36219)"> - <g - id="g4878" - style="stroke:#2c5aa0" - transform="matrix(0.44605036,0,0,0.44605036,-92.988018,767.06851)"> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214" - d="m 246.84931,501.49154 c -46.53731,31.96085 -45.53599,101.06369 0.67435,132.84715" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5" - d="m 262.10498,522.50881 c -32.37593,21.6208 -30.92504,70.04354 0.44957,90.81259" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-9" - d="m 273.93876,539.70487 c -18.88891,14.42772 -19.46108,40.82167 0.44957,56.19592" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-53" - d="m 340.47459,501.37914 c 46.53731,31.96085 45.53599,101.06368 -0.67435,132.84714" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-95" - d="m 325.21892,522.3964 c 32.37593,21.6208 30.92504,70.04354 -0.44957,90.81259" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4214-5-9-2" - d="m 313.38514,539.59247 c 18.88891,14.42772 19.46107,40.82166 -0.44957,56.19591" - style="fill:none;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/htdocs/public/images/transmit1.png b/htdocs/public/images/transmit1.png deleted file mode 100755 index 7cd8e5b26b1d74877e4489511761c93b38bd4a9e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/transmit1.png and /dev/null differ diff --git a/htdocs/public/images/transmit1.svg b/htdocs/public/images/transmit1.svg deleted file mode 100755 index af0a2b710e606cca792486fd68e5db081adb8386..0000000000000000000000000000000000000000 --- a/htdocs/public/images/transmit1.svg +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="60" - height="60" - viewBox="0 0 60 60" - id="svg4310" - version="1.1" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="transmit1.svg" - inkscape:export-filename="/run/user/1000/gvfs/sftp:host=aprsdirect.com/home/peqv/trackdirect_dev/htdocs/public/images/transmit1.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96"> - <defs - id="defs4312" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="8.0000002" - inkscape:cx="35.059875" - inkscape:cy="32.310313" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:window-width="1865" - inkscape:window-height="1025" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" /> - <metadata - id="metadata4315"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-992.3622)"> - <path - style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 20.044871,1008.1516 c -9.534032,7.2823 -9.82283,20.6045 0.226917,28.3645" - id="path4214-5-9" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 39.955129,1008.0949 c 9.534032,7.2823 9.822825,20.6044 -0.226917,28.3645" - id="path4214-5-9-2" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - </g> -</svg> diff --git a/htdocs/public/images/transmit2.png b/htdocs/public/images/transmit2.png deleted file mode 100755 index 1ad39170fe0ead8a1cf77286641862a97481d02f..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/transmit2.png and /dev/null differ diff --git a/htdocs/public/images/transmit2.svg b/htdocs/public/images/transmit2.svg deleted file mode 100755 index 68640e02dfd23910854b22589fa9263c3eed6417..0000000000000000000000000000000000000000 --- a/htdocs/public/images/transmit2.svg +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="60" - height="60" - viewBox="0 0 60 60" - id="svg4310" - version="1.1" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="transmit2.svg" - inkscape:export-filename="/run/user/1000/gvfs/sftp:host=aprsdirect.com/home/peqv/trackdirect_dev/htdocs/public/images/transmit2.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96"> - <defs - id="defs4312" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="2.56" - inkscape:cx="-82.653226" - inkscape:cy="86.278417" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:window-width="1865" - inkscape:window-height="1025" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" /> - <metadata - id="metadata4315"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-992.3622)"> - <path - style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 42.996273,1003.6012 c 12.939755,7.9568 12.788207,28.9745 -0.3669,37.1316" - id="path4214-5-95-0" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 16.996446,1003.7979 c -12.939757,7.9568 -12.788207,28.9745 0.3669,37.1316" - id="path4214-5-95-0-2" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - </g> -</svg> diff --git a/htdocs/public/images/transmit3.png b/htdocs/public/images/transmit3.png deleted file mode 100755 index 298ceb685b791bc64945edfa709812b6bbb15e5c..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/transmit3.png and /dev/null differ diff --git a/htdocs/public/images/transmit3.svg b/htdocs/public/images/transmit3.svg deleted file mode 100755 index dfa844f7a6140b0ec0b61d1e9953977afcd91a3e..0000000000000000000000000000000000000000 --- a/htdocs/public/images/transmit3.svg +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="60" - height="60" - viewBox="0 0 60 60" - id="svg4310" - version="1.1" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="transmit3.svg" - inkscape:export-filename="/run/user/1000/gvfs/sftp:host=aprsdirect.com/home/peqv/trackdirect_dev/htdocs/public/images/transmit3.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96"> - <defs - id="defs4312" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="5.12" - inkscape:cx="-23.97789" - inkscape:cy="34.822542" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:window-width="1865" - inkscape:window-height="1025" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" /> - <metadata - id="metadata4315"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-992.3622)"> - <path - style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 14.071862,999.47211 C -2.26964,1010.385 -1.537315,1034.826 14.298779,1045.309" - id="path4214-5" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 45.928138,999.41537 c 16.341502,10.91293 15.609177,35.35393 -0.226917,45.83693" - id="path4214-5-95" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - </g> -</svg> diff --git a/htdocs/public/images/transparent.png b/htdocs/public/images/transparent.png deleted file mode 100755 index 81e94b216a2b4233194076c77be9e3c12a5b890b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/transparent.png and /dev/null differ diff --git a/htdocs/public/images/unchecked.png b/htdocs/public/images/unchecked.png deleted file mode 100755 index 568ed12f343a2f7515617a12c8c2ae90b80eb32f..0000000000000000000000000000000000000000 Binary files a/htdocs/public/images/unchecked.png and /dev/null differ diff --git a/htdocs/public/index.php b/htdocs/public/index.php deleted file mode 100755 index ab412ac0b49322a28bd0b8e344b1625cb8e0eb44..0000000000000000000000000000000000000000 --- a/htdocs/public/index.php +++ /dev/null @@ -1,400 +0,0 @@ -<?php require "../includes/bootstrap.php"; ?> - -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8" /> - <title><?php echo getWebsiteConfig('title'); ?></title> - - <!-- Mobile meta --> - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/> - <meta name="apple-mobile-web-app-capable" content="yes"/> - <meta name="mobile-web-app-capable" content="yes"> - - <!-- JS libs used by this website (not a dependency for the track direct js lib) --> - <script src="https://cdnjs.cloudflare.com/ajax/libs/mobile-detect/1.4.5/mobile-detect.min.js" integrity="sha512-1vJtouuOb2tPm+Jh7EnT2VeiCoWv0d7UQ8SGl/2CoOU+bkxhxSX4gDjmdjmbX4OjbsbCBN+Gytj4RGrjV3BLkQ==" crossorigin="anonymous"></script> - <script type="text/javascript" src="//www.gstatic.com/charts/loader.js"></script> - - <!-- Stylesheets used by this website (not a dependency for the track direct js lib) --> - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous" /> - - <!-- Track Direct js dependencies --> - <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" integrity="sha512-jGsMH83oKe9asCpkOVkBnUrDDTp8wl+adkB2D+//JtlxO4SrLoJdhbOysIFQJloQFD+C4Fl1rMsQZF76JjV0eQ==" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js" integrity="sha512-LGXaggshOkD/at6PFNcp2V2unf9LzFq6LE+sChH7ceMTDP0g2kn6Vxwgg7wkPP7AAtX+lmPqPdxB47A0Nz0cMQ==" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/autolinker/3.14.2/Autolinker.min.js" integrity="sha512-qyoXjTIJ69k6Ik7CxNVKFAsAibo8vW/s3WV3mBzvXz6Gq0yGup/UsdZBDqFwkRuevQaF2g7qhD3E4Fs+OwS4hw==" crossorigin="anonymous"></script> - <script src="/js/convex-hull.js" crossorigin="anonymous"></script> - - <!-- Map api javascripts and related dependencies --> - <?php $mapapi = $_GET['mapapi'] ?? 'leaflet'; ?> - <?php if ($mapapi == 'google') : ?> - <?php if (getWebsiteConfig('google_key') != null) : ?> - <script type="text/javascript" src="//maps.googleapis.com/maps/api/js?key=<?php echo getWebsiteConfig('google_key'); ?>&libraries=visualization,geometry"></script> - <?php else : ?> - <script type="text/javascript" src="//maps.googleapis.com/maps/api/js?libraries=visualization,geometry"></script> - <?php endif; ?> - - <script src="https://cdnjs.cloudflare.com/ajax/libs/OverlappingMarkerSpiderfier/1.0.3/oms.min.js" integrity="sha512-/3oZy+rGpR6XGen3u37AEGv+inHpohYcJupz421+PcvNWHq2ujx0s1QcVYEiSHVt/SkHPHOlMFn5WDBb/YbE+g==" crossorigin="anonymous"></script> - - <?php elseif ($mapapi == 'leaflet' || $mapapi == 'leaflet-vector'): ?> - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.min.css" integrity="sha512-1xoFisiGdy9nvho8EgXuXvnpR5GAMSjFwp40gSRE3NwdUdIMIKuPa7bqoUhLD0O/5tPNhteAsE5XyyMi5reQVA==" crossorigin="anonymous" /> - <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.min.js" integrity="sha512-SeiQaaDh73yrb56sTW/RgVdi/mMqNeM2oBwubFHagc5BkixSpP1fvqF47mKzPGWYSSy4RwbBunrJBQ4Co8fRWA==" crossorigin="anonymous"></script> - - <?php if ($mapapi == 'leaflet-vector'): ?> - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.13.1/mapbox-gl.min.css" /> - <script src="https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.13.1/mapbox-gl.min.js"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl-leaflet/0.0.15/leaflet-mapbox-gl.min.js"></script> - <?php endif; ?> - - <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-providers/1.11.0/leaflet-providers.min.js" integrity="sha512-TO+Wd5hbpDsACTmvzSqAZL83jMQCXGRFNoS4WZxcxrlJBTdgMYaT7g5uX49C5+Kbuxzlg2A+TFJ6UqdsXuOKLw==" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.heat/0.2.0/leaflet-heat.js" integrity="sha512-KhIBJeCI4oTEeqOmRi2gDJ7m+JARImhUYgXWiOTIp9qqySpFUAJs09erGKem4E5IPuxxSTjavuurvBitBmwE0w==" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/OverlappingMarkerSpiderfier-Leaflet/0.2.6/oms.min.js" integrity="sha512-V8RRDnS4BZXrat3GIpnWx+XNYBHQGdK6nKOzMpX4R0hz9SPWt7fltGmmyGzUkVFZUQODO1rE+SWYJJkw3SYMhg==" crossorigin="anonymous"></script> - <?php endif; ?> - - <!-- Track Direct jslib --> - <script type="text/javascript" src="/js/trackdirect.min.js"></script> - - - <script type="text/javascript" src="/js/main.js"></script> - <link rel="stylesheet" href="/css/main.css"> - - <script> - // Start everything!!! - $(document).ready(function() { - google.charts.load('current', {'packages':['corechart', 'timeline']}); - - var options = {}; - options['isMobile'] = false; - options['useImperialUnit'] = <?php echo (isImperialUnitUser() ? 'true': 'false'); ?>; - options['coverageDataUrl'] = '/data/coverage.php'; - options['coveragePercentile'] = <?php echo (getWebsiteConfig('coverage_percentile') ?? "95"); ?>; - options['defaultTimeLength'] = 60; // In minutes - - var md = new MobileDetect(window.navigator.userAgent); - if (md.mobile() !== null) { - options['isMobile'] = true; - } - - options['time'] = "<?php echo $_GET['time'] ?? '' ?>"; // How many minutes of history to show - options['center'] = "<?php echo $_GET['center'] ?? '' ?>"; // Position to center on (for example "46.52108,14.63379") - options['zoom'] = "<?php echo $_GET['zoom'] ?? '' ?>"; // Zoom level - options['timetravel'] = "<?php echo $_GET['timetravel'] ?? '' ?>"; // Unix timestamp to travel to - options['maptype'] = "<?php echo $_GET['maptype'] ?? '' ?>"; // May be "roadmap", "terrain" or "satellite" - options['mid'] = "<?php echo $_GET['mid'] ?? '' ?>"; // Render map from "Google My Maps" (requires https) - - options['filters'] = {}; - options['filters']['sid'] = "<?php echo $_GET['sid'] ?? '' ?>"; // Station id to filter on - options['filters']['sname'] = "<?php echo $_GET['sname'] ?? '' ?>"; // Station name to filter on - options['filters']['sidlist'] = "<?php echo $_GET['sidlist'] ?? '' ?>"; // Station id list to filter on (colon separated) - options['filters']['snamelist'] = "<?php echo $_GET['snamelist'] ?? '' ?>"; // Station name list to filter on (colon separated) - - // Tell jslib which html element to use to show connection status and mouse cordinates - options['statusContainerElementId'] = 'status-container'; - options['cordinatesContainerElementId'] = 'cordinates-container'; - - // Use this setting so enlarge some symbols (for example airplanes when using OGN as data source) - //options['symbolsToScale'] = [[88,47],[94,null]]; - - // Set this setting to false if you want to stop animations - options['animate'] = true; - - // Use Stockholm as default position (will be used if we fail to fetch location from ip-location service) - options['defaultLatitude'] = '59.30928'; - options['defaultLongitude'] = '18.08830'; - - // Tip: request position from some ip->location service (https://freegeoip.app/json and https://ipapi.co/json is two examples) - $.getJSON('https://ipapi.co/json', function(data) { - if (data.latitude && data.longitude) { - options['defaultLatitude'] = data.latitude; - options['defaultLongitude'] = data.longitude; - } - }).fail(function() { - console.log('Failed to fetch location, using default location'); - }).always(function() { - <?php if ($mapapi == 'leaflet-vector') : ?> - options['mapboxGLStyle'] = "https://api.maptiler.com/maps/bright/style.json?optimize=true&key=<?php echo getWebsiteConfig('maptiler_key'); ?>"; - options['mapboxGLAttribution'] = 'Map © <a href="https://www.maptiler.com">MapTiler</a>, OpenStreetMap contributors'; - <?php endif; ?> - - <?php if ($mapapi == 'leaflet') : ?> - // We are using Leaflet -- read about leaflet-providers and select your favorite maps - // https://leaflet-extras.github.io/leaflet-providers/preview/ - - // Make sure to read the license requirements for each provider before launching a public website - // https://wiki.openstreetmap.org/wiki/Tile_servers - - // Many providers require a map api key or similar, the following is an example for HERE - L.TileLayer.Provider.providers['HERE'].options['app_id'] = '<?php echo getWebsiteConfig('here_app_id'); ?>'; - L.TileLayer.Provider.providers['HERE'].options['app_code'] = '<?php echo getWebsiteConfig('here_app_code'); ?>'; - - options['supportedMapTypes'] = {}; - options['supportedMapTypes']['roadmap'] = "<?php echo getWebsiteConfig('leaflet_raster_tile_roadmap'); ?>"; - options['supportedMapTypes']['terrain'] = "<?php echo getWebsiteConfig('leaflet_raster_tile_terrain'); ?>"; - options['supportedMapTypes']['satellite'] = "<?php echo getWebsiteConfig('leaflet_raster_tile_satellite'); ?>"; - <?php endif; ?> - - // host is used to create url to /heatmaps and /images - options['host'] = "<?php echo $_SERVER['HTTP_HOST']; ?>"; - - var supportsWebSockets = 'WebSocket' in window || 'MozWebSocket' in window; - if (supportsWebSockets) { - <?php if (getWebsiteConfig('websocket_url') != null) : ?> - var wsServerUrl = "<?php echo getWebsiteConfig('websocket_url'); ?>"; - <?php else : ?> - var wsServerUrl = 'ws://<?php echo $_SERVER['HTTP_HOST']; ?>:9000/ws'; - <?php endif; ?> - var mapElementId = 'map-container'; - - trackdirect.init(wsServerUrl, mapElementId, options); - } else { - alert('This service require HTML 5 features to be able to feed you APRS data in real-time. Please upgrade your browser.'); - } - }); - }); - </script> - </head> - <body> - <div class="topnav" id="tdTopnav"> - <a style="background-color: #af7a4c; color: white;" - href="" - onclick=" - if (location.protocol != 'https:') { - trackdirect.setCenter(); // Will go to default position - } else { - trackdirect.setMapLocationByGeoLocation( - function(errorMsg) { - var msg = 'We failed to determine your current location by using HTML 5 Geolocation functionality'; - if (typeof errorMsg !== 'undefined' && errorMsg != '') { - msg += ' (' + errorMsg + ')'; - } - msg += '.'; - alert(msg); - }, - function() {}, - 5000 - ); - } - return false;" - title="Go to my current position"> - My position - </a> - - <div class="dropdown"> - <button class="dropbtn">Tail length - <i class="fa fa-caret-down"></i> - </button> - <div class="dropdown-content" id="tdTopnavTimelength"> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(10); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">10 minutes</a> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(30); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">30 minutes</a> - <a href="javascript:void(0);" id="tdTopnavTimelengthDefault" onclick="trackdirect.setTimeLength(60); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">1 hour</a> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(180); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">3 hours</a> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(360); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">6 hours</a> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(720); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox dropdown-content-checkbox-only-filtering dropdown-content-checkbox-hidden">12 hours</a> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(1080); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox dropdown-content-checkbox-only-filtering dropdown-content-checkbox-hidden">18 hours</a> - <a href="javascript:void(0);" onclick="trackdirect.setTimeLength(1440); $('#tdTopnavTimelength>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox dropdown-content-checkbox-only-filtering dropdown-content-checkbox-hidden">24 hours</a> - </div> - </div> - - <div class="dropdown"> - <button class="dropbtn">Map API - <i class="fa fa-caret-down"></i> - </button> - <div class="dropdown-content"> - <?php if (getWebsiteConfig('google_key') != null) : ?> - <a href="/?mapapi=google" title="Switch to Google Maps" <?= ($mapapi=="google"?"class='dropdown-content-checkbox dropdown-content-checkbox-active'":"class='dropdown-content-checkbox'") ?>>Google Maps API</a> - <?php endif; ?> - <a href="/?mapapi=leaflet" title="Switch to Leaflet with raster tiles" <?= ($mapapi=="leaflet"?"class='dropdown-content-checkbox dropdown-content-checkbox-active'":"class='dropdown-content-checkbox'") ?>>Leaflet - Raster Tiles</a> - <?php if (getWebsiteConfig('maptiler_key') != null) : ?> - <a href="/?mapapi=leaflet-vector" title="Switch to Leaflet with vector tiles" <?= ($mapapi=="leaflet-vector"?"class='dropdown-content-checkbox dropdown-content-checkbox-active'":"class='dropdown-content-checkbox'") ?>>Leaflet - Vector Tiles</a> - <?php endif; ?> - </div> - </div> - - <?php if ($mapapi != 'leaflet-vector') : ?> - <div class="dropdown"> - <button class="dropbtn">Map Type - <i class="fa fa-caret-down"></i> - </button> - <div class="dropdown-content" id="tdTopnavMapType"> - <a href="javascript:void(0);" onclick="trackdirect.setMapType('roadmap'); $('#tdTopnavMapType>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox dropdown-content-checkbox-active">Roadmap</a> - <a href="javascript:void(0);" onclick="trackdirect.setMapType('terrain'); $('#tdTopnavMapType>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">Terrain/Outdoors</a> - <?php if ($mapapi == 'google' || getWebsiteConfig('leaflet_raster_tile_satellite') != null) : ?> - <a href="javascript:void(0);" onclick="trackdirect.setMapType('satellite'); $('#tdTopnavMapType>a').removeClass('dropdown-content-checkbox-active'); $(this).addClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox">Satellite</a> - <?php endif; ?> - </div> - </div> - <?php endif; ?> - - <div class="dropdown"> - <button class="dropbtn">Settings - <i class="fa fa-caret-down"></i> - </button> - <div class="dropdown-content" id="tdTopnavSettings"> - <a href="javascript:void(0);" onclick="trackdirect.toggleImperialUnits(); $(this).toggleClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox <?php echo (isImperialUnitUser()?'dropdown-content-checkbox-active':''); ?>" title="Switch to imperial units">Use imperial units</a> - <a href="javascript:void(0);" onclick="trackdirect.toggleStationaryPositions(); $(this).toggleClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox" title="Hide stations that is not moving">Hide not moving stations</a> - - <!-- - <a href="javascript:void(0);" onclick="trackdirect.toggleInternetPositions(); $(this).toggleClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox" title="Hide stations that sends packet using TCP/UDP">Hide Internet stations</a> - <a href="javascript:void(0);" onclick="trackdirect.toggleCwopPositions(); $(this).toggleClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox" title="Hide CWOP weather stations">Hide CWOP stations</a> - <a href="javascript:void(0);" onclick="trackdirect.toggleOgflymPositions(); $(this).toggleClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox" title="Hide model airplanes (OGFLYM)">Hide model airplanes (OGFLYM)</a> - <a href="javascript:void(0);" onclick="trackdirect.toggleUnknownPositions(); $(this).toggleClass('dropdown-content-checkbox-active');" class="dropdown-content-checkbox" title="Hide unknown aircrafts">Hide unknown aircrafts</a> - --> - </div> - </div> - - <div class="dropdown"> - <button class="dropbtn">Other - <i class="fa fa-caret-down"></i> - </button> - <div class="dropdown-content"> - - <a href="/views/search.php" - class="tdlink" - onclick="$(this).attr('href', '/views/search.php?imperialUnits=' + (trackdirect.isImperialUnits()?'1':'0'))" - title="Search for a station/vehicle here!"> - Station search - </a> - - <a href="/views/latest.php" - class="tdlink" - onclick="$(this).attr('href', '/views/latest.php?imperialUnits=' + (trackdirect.isImperialUnits()?'1':'0'))" - title="List latest heard stations!"> - Latest heard - </a> - - <a href="javascript:void(0);" - onclick="$('#modal-timetravel').show();" - title="Select date and time to show what the map looked like then"> - Travel in time - </a> - - <a class="triple-notselected" href="#" onclick="trackdirect.togglePHGCircles(); return false;" title="Show PHG cirlces, first click will show half PGH circles and second click will show full PHG circles."> - Toggle PHG circles - </a> - </div> - </div> - - <a href="/views/about.php" - class="tdlink" - title="More about this website!"> - About - </a> - - <a href="javascript:void(0);" class="icon" onclick="toggleTopNav()">☰</a> - </div> - - <div id="map-container"></div> - - <div id="right-container"> - <div id="right-container-info"> - <div id="status-container"></div> - <div id="cordinates-container"></div> - </div> - - <div id="right-container-filtered"> - <div id="right-container-filtered-content"></div> - <a href="#" onclick="trackdirect.filterOnStationId([]); return false;">reset</a> - </div> - - <div id="right-container-timetravel"> - <div id="right-container-timetravel-content"></div> - <a href="#" onclick="trackdirect.setTimeTravelTimestamp(0); $('#right-container-timetravel').hide(); return false;">reset</a> - </div> - </div> - - <div id="td-modal" class="modal"> - <div class="modal-long-content"> - <div class="modal-content-header"> - <span class="modal-close" id="td-modal-close">×</span> - <span class="modal-title" id="td-modal-title"><?php echo getWebsiteConfig('title'); ?></h2> - </div> - <div class="modal-content-body"> - <div id="td-modal-content"> - <?php $view = getView($_GET['view']); ?> - <?php if ($view) : ?> - <?php include($view); ?> - <?php else: ?> - <div id="td-modal-content-nojs"> - <?php include(ROOT . '/public/views/about.php'); ?> - </div> - <?php endif; ?> - </div> - </div> - </div> - </div> - - <div id="modal-timetravel" class="modal"> - <div class="modal-content"> - <div class="modal-content-header"> - <span class="modal-close" onclick="$('#modal-timetravel').hide();">×</span> - <span class="modal-title">Travel in time</h2> - </div> - <div class="modal-content-body" style="margin: 0px 20px 20px 20px;"> - <?php if (!isAllowedToShowOlderData()) : ?> - <div style="text-align: center;"> - <p style="max-width: 800px; display: inline-block; color: red;"> - The time travel feature that allows you to see the map as it looked like an earlier date is disabled on this website. - </p> - </div> - <?php else : ?> - <p>Select date and time to show map data for (enter time for your locale time zone). The regular time length select box can still be used to select how old data that should be shown (relative to selected date and time).</p> - <p>*Note that the heatmap will still based on data from the latest hour (not the selected date and time).</p> - <p>Date and time:</p> - - <form id="timetravel-form"> - <select id="timetravel-date" class="timetravel-select form-control" - <option value="0" selected>Select date</option> - <?php for($i=0; $i <= 10; $i++) : ?> - <?php $date = date('Y-m-d', strtotime("-$i days")); ?> - <option value="<?php echo $date; ?>"><?php echo $date; ?></option> - <?php endfor; ?> - </select> - - <select id="timetravel-time" class="timetravel-select form-control"> - <option value="0" selected>Select time</option> - <option value="00:00">00:00</option> - <option value="01:00">01:00</option> - <option value="02:00">02:00</option> - <option value="03:00">03:00</option> - <option value="04:00">04:00</option> - <option value="05:00">05:00</option> - <option value="06:00">06:00</option> - <option value="07:00">07:00</option> - <option value="08:00">08:00</option> - <option value="09:00">09:00</option> - <option value="10:00">10:00</option> - <option value="11:00">11:00</option> - <option value="12:00">12:00</option> - <option value="13:00">13:00</option> - <option value="14:00">14:00</option> - <option value="15:00">15:00</option> - <option value="16:00">16:00</option> - <option value="17:00">17:00</option> - <option value="18:00">18:00</option> - <option value="19:00">19:00</option> - <option value="20:00">20:00</option> - <option value="21:00">21:00</option> - <option value="22:00">22:00</option> - <option value="23:00">23:00</option> - </select> - <input type="submit" - value="Ok" - onclick=" - if ($('#timetravel-date').val() != '0' && $('#timetravel-time').val() != '0') { - trackdirect.setTimeLength(60, false); - var ts = moment($('#timetravel-date').val() + ' ' + $('#timetravel-time').val(), 'YYYY-MM-DD HH:mm').unix(); - trackdirect.setTimeTravelTimestamp(ts); - $('#right-container-timetravel-content').html('Time travel to ' + $('#timetravel-date').val() + ' ' + $('#timetravel-time').val()); - $('#right-container-timetravel').show(); - } else { - trackdirect.setTimeTravelTimestamp(0, true); - $('#right-container-timetravel').hide(); - } - $('#modal-timetravel').hide(); - return false;"/> - </form> - <?php endif; ?> - </div> - </div> - </div> - </body> -</html> diff --git a/htdocs/public/js/convex-hull.js b/htdocs/public/js/convex-hull.js deleted file mode 100644 index 376cb7f3d20b9a05ee9590b614cb3e715674e69d..0000000000000000000000000000000000000000 --- a/htdocs/public/js/convex-hull.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Convex hull algorithm - Library (compiled from TypeScript) - * - * Copyright (c) 2021 Project Nayuki - * https://www.nayuki.io/page/convex-hull-algorithm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program (see COPYING.txt and COPYING.LESSER.txt). - * If not, see <http://www.gnu.org/licenses/>. - */ -"use strict"; -var convexhull; -(function (convexhull) { - // Returns a new array of points representing the convex hull of - // the given set of points. The convex hull excludes collinear points. - // This algorithm runs in O(n log n) time. - function makeHull(points) { - var newPoints = points.slice(); - newPoints.sort(convexhull.POINT_COMPARATOR); - return convexhull.makeHullPresorted(newPoints); - } - convexhull.makeHull = makeHull; - // Returns the convex hull, assuming that each points[i] <= points[i + 1]. Runs in O(n) time. - function makeHullPresorted(points) { - if (points.length <= 1) - return points.slice(); - // Andrew's monotone chain algorithm. Positive y coordinates correspond to "up" - // as per the mathematical convention, instead of "down" as per the computer - // graphics convention. This doesn't affect the correctness of the result. - var upperHull = []; - for (var i = 0; i < points.length; i++) { - var p = points[i]; - while (upperHull.length >= 2) { - var q = upperHull[upperHull.length - 1]; - var r = upperHull[upperHull.length - 2]; - if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) - upperHull.pop(); - else - break; - } - upperHull.push(p); - } - upperHull.pop(); - var lowerHull = []; - for (var i = points.length - 1; i >= 0; i--) { - var p = points[i]; - while (lowerHull.length >= 2) { - var q = lowerHull[lowerHull.length - 1]; - var r = lowerHull[lowerHull.length - 2]; - if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) - lowerHull.pop(); - else - break; - } - lowerHull.push(p); - } - lowerHull.pop(); - if (upperHull.length == 1 && lowerHull.length == 1 && upperHull[0].x == lowerHull[0].x && upperHull[0].y == lowerHull[0].y) - return upperHull; - else - return upperHull.concat(lowerHull); - } - convexhull.makeHullPresorted = makeHullPresorted; - function POINT_COMPARATOR(a, b) { - if (a.x < b.x) - return -1; - else if (a.x > b.x) - return +1; - else if (a.y < b.y) - return -1; - else if (a.y > b.y) - return +1; - else - return 0; - } - convexhull.POINT_COMPARATOR = POINT_COMPARATOR; -})(convexhull || (convexhull = {})); \ No newline at end of file diff --git a/htdocs/public/js/main.js b/htdocs/public/js/main.js deleted file mode 100755 index c1b3a9b256bc5c0a131c1719d6cab04e1b5595e5..0000000000000000000000000000000000000000 --- a/htdocs/public/js/main.js +++ /dev/null @@ -1,158 +0,0 @@ -jQuery(document).ready(function ($) { - $('#td-modal-content-nojs').remove(); - if ($('#td-modal-content').text().trim() == '') { - $('#td-modal').hide(); - } else { - var title = $('#td-modal-content title').text(); - if (title != '') { - $("#td-modal-title").text(title); - } - } -}); - -// Init local time presentation -jQuery(document).ready(function ($) { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); -}); - -// Switch between regular topnav and topnav adapted for mobile -function toggleTopNav() { - var x = document.getElementById("tdTopnav"); - if (x.className === "topnav") { - x.className += " responsive"; - } else { - x.className = "topnav"; - } -} - -// If an external website shows map in iframe, hide all menu's -if (!inIframe()) { - $("#tdTopnav").hide(); -} - -// Set correct time length option to active -jQuery(document).ready(function ($) { - $("#tdTopnavTimelengthDefault").addClass("dropdown-content-checkbox-active"); -}); - -// Open all internal url's in dialog -function loadView(url) { - var view = url.split('/').pop().split("?")[0]; - if (view != '') { - var requestUrl = '/views/' + url.split('/').pop(); - $("#td-modal-content").html('<img src="/images/spinner.gif" style="max-width: 100%; max-height: 100px; margin-top: 40px; margin-left: auto; margin-right: auto; display: block;"/>'); - $("#td-modal-title").text(''); - $("#td-modal").show(); - $("#td-modal-content").load(requestUrl, {'modal': true}, - function() { - history.replaceState(null, "", requestUrl); - var title = $('#td-modal-content title').text(); - $("#td-modal-title").text(title); - - $("#td-modal-content .tdlink").unbind('click').bind('click', function(e) { - loadView(this.href); - e.preventDefault(); - }); - } - ); - } -} -jQuery(document).ready(function ($) { - $(".tdlink").bind('click', function(e) { - loadView(this.href); - e.preventDefault(); - }); -}); - -// Handle dialog close -jQuery(document).ready(function ($) { - $("#td-modal-close").bind('click', function(e) { - $('#td-modal').hide(); - history.replaceState(null, "", "/"); - }); -}); - -// Open station dialog if user clicked on station name -jQuery(document).ready(function ($) { - trackdirect.addListener("station-name-clicked", function (data) { - if (trackdirect.isImperialUnits()) { - loadView("/views/overview.php?id=" + data.station_id + "&imperialUnits=1"); - } else { - loadView("/views/overview.php?id=" + data.station_id + "&imperialUnits=0"); - } - }); -}); - -// Update url when user moves map -jQuery(document).ready(function ($) { - var newUrlTimeoutId = null; - trackdirect.addListener("position-request-sent", function (data) { - if (newUrlTimeoutId !== null) { - clearTimeout(newUrlTimeoutId); - } - - newUrlTimeoutId = window.setTimeout(function () { - if ($("#td-modal").is(":hidden")) { - var url = window.location.href.split('/').pop(); - var newLat = Math.round(data.center.lat * 10000) / 10000; - var newLng = Math.round(data.center.lng * 10000) / 10000; - var newZoom = data.zoom; - - if (!url.includes("center=")) { - if (!url.includes("?")) { - url += "?center=" + newLat + "," + newLng; - } else { - url += "¢er=" + newLat + "," + newLng; - } - } else { - url = url.replace(/center=[^&]*/i, "center=" + newLat + "," + newLng); - } - - if (!url.includes("zoom=")) { - if (!url.includes("?")) { - url += "?zoom=" + newZoom; - } else { - url += "&zoom=" + newZoom; - } - } else { - url = url.replace(/zoom=[^&]*/i, "zoom=" + newZoom); - } - - history.replaceState(null, "", url); - } - }, 1000); - }); -}); - -// Handle filter response -jQuery(document).ready(function ($) { - trackdirect.addListener("filter-changed", function (packets) { - if (packets.length == 0) { - // We are not filtering any more. - $("#right-container-filtered").hide(); - - // Time travel is stopped when filtering is stopped - $("#right-container-timetravel").hide(); - - // Reset tail length to default when filtering is stopped - $("#tdTopnavTimelength>a").removeClass("dropdown-content-checkbox-active"); - $("#tdTopnavTimelengthDefault").addClass("dropdown-content-checkbox-active"); - $(".dropdown-content-checkbox-only-filtering").addClass("dropdown-content-checkbox-hidden"); - } else { - var counts = {}; - for (var i = 0; i < packets.length; i++) { - // Note that if related is set to 1, it is included since it is related to the station we are filtering on - if (packets[i].related == 0) { - counts[packets[i]["station_name"]] = - 1 + (counts[packets[i]["station_name"]] || 0); - } - } - $("#right-container-filtered-content").html( - "Filtering on " + Object.keys(counts).length + " station(s)" - ); - $("#right-container-filtered").show(); - $(".dropdown-content-checkbox-only-filtering").removeClass("dropdown-content-checkbox-hidden"); - } - }); -}); diff --git a/htdocs/public/js/trackdirect.min.js b/htdocs/public/js/trackdirect.min.js deleted file mode 100755 index 8bcd1e463f45e759435b7a65d83e45fe1fcaad12..0000000000000000000000000000000000000000 --- a/htdocs/public/js/trackdirect.min.js +++ /dev/null @@ -1,889 +0,0 @@ -var trackdirect={services:{},models:{},_time:null,_timetravel:null,_center:null,_zoom:null,_maptype:null,_mid:null,_rulers:[],_filterTimeoutId:null,_waitForFilterResponse:false,_doNotChangeLocationOnFilterResponse:false,_doNotChangeLocationOnFilterResponseTmp:false,_filters:{},_defaultLatitude:null,_defaultLongitude:null,_eventListeners:{},_eventListenersOnce:{},_cordinatesContainerElementId:null,_statusContainerElementId:"td-status-text",_mapElementId:null,_wsServerUrl:null,_map:null,_websocket:null,_mapCreated:false,_trackdirectInitDone:false,isMobile:false,coverageDataUrl:null,coveragePercentile:95,settings:{},init:function(wsServerUrl,mapElementId,options){this._initSettings();this._wsServerUrl=wsServerUrl;this._mapElementId=mapElementId;if($("#"+mapElementId).length<=0){console.log("ERROR: Specified map element missing");return;} -if(typeof google==="object"&&typeof google.maps==="object"){this.settings.defaultMinZoomForMarkerLabel=12;this.settings.minZoomForMarkerLabel=12;} -this._parseOptions(options);var me=this;this.addListener("map-created",function(){me._initTime();me._websocket=new trackdirect.Websocket(me._wsServerUrl);me._initWebsocketListeners();me._handleWebsocketStateChange();me._initMapListeners();if(!me._initFilterUrlRequest()){trackdirect.services.callbackExecutor.add(me,me._sendPositionRequest,[]);} -me._setWebsocketStateIdle();if(inIframe()){var parentUrl="";try{parentUrl=window.location!=window.parent.location?document.referrer:document.location.href;}catch(e){parentUrl="Unknown";}} -me._emitEventListeners("trackdirect-init-done");});this._mapInit(options);},enableImperialUnits:function(){this._map.state.useImperialUnit=true;if(this._map.state.openInfoWindow!==null){this._map.state.openInfoWindow.hide();}},enableMetricUnits:function(){this._map.state.useImperialUnit=false;if(this._map.state.openInfoWindow!==null){this._map.state.openInfoWindow.hide();}},toggleImperialUnits:function(){if(this._map.state.useImperialUnit){this.enableMetricUnits();}else{this.enableImperialUnits();}},isImperialUnits:function(){return this._map.state.useImperialUnit;},addListener:function(event,handler,execOnce){execOnce=typeof execOnce!=="undefined"?execOnce:false;if((event=="map-created"&&this._mapCreated)||(event=="trackdirect-init-done"&&this._trackdirectInitDone)){handler();if(execOnce){return;}} -if(execOnce){if(!(event in this._eventListenersOnce)){this._eventListenersOnce[event]=[];} -this._eventListenersOnce[event].push(handler);}else{if(!(event in this._eventListeners)){this._eventListeners[event]=[];} -this._eventListeners[event].push(handler);}},setCenter:function(latitude,longitude,zoom){latitude=typeof latitude!=="undefined"?latitude:this._defaultLatitude;longitude=typeof longitude!=="undefined"?longitude:this._defaultLongitude;zoom=typeof zoom!=="undefined"?zoom:this._map.getZoom();if(this._map!==null){this._map.setCenter({lat:latitude,lng:longitude},zoom);}},setZoom:function(value){if(this._map!==null){this._map.setZoom(value);}},addRuler:function(){if(this._rulers.length>0){var ruler=this._rulers.pop();ruler.hide();}else{var ruler=new trackdirect.models.Ruler((this._map.getCurrentRadiusInKm()*1000)/2,this._map);this._rulers.push(ruler);}},isFilteredMode:function(){return this._map.state.isFilterMode;},stopFilterOnStationId:function(stationId){var currentFilterStationIds=this._map.state.getFilterStationIds();if(currentFilterStationIds.length==1&¤tFilterStationIds.indexOf(stationId)>=0){this.filterOnStationId([]);}else{if(this._map.state.getTrackStationId()==stationId){this.stopTrackStation();} -this._setWebsocketStateLoading(false);this._websocket.doSendStopFilterRequest(stationId);}},filterOnStationId:function(stationIdArray){if(!Array.isArray(stationIdArray)){stationIdArray=[stationIdArray];} -var currentFilterStationIds=this._map.state.getFilterStationIds();if(currentFilterStationIds.length==0){if(this._map.state.getTrackStationId()!==null&&stationIdArray.indexOf(this._map.state.getTrackStationId())==-1){this.stopTrackStation();}} -this._setWebsocketStateLoading(false);this._websocket.doSendFilterRequest(stationIdArray,this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp());},filterOnStationName:function(stationNameArray){if(!Array.isArray(stationNameArray)){stationNameArray=[stationNameArray];} -var currentFilterStationIds=this._map.state.getFilterStationIds();if(currentFilterStationIds.length==0){if(this._map.state.getTrackStationId()!==null&&stationIdArray.indexOf(this._map.state.getTrackStationId())==-1){this.stopTrackStation();}} -this._setWebsocketStateLoading(false);this._websocket.doSendFilterRequestByName(stationNameArray,this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp());},stopTrackStation:function(){this._map.state.onlyTrackRecentPackets=false;this._map.state.trackStationId=null;this._emitEventListeners("track-changed",[null,null]);},trackStation:function(stationId,stationName,alsoFilterOnStation,onlyTrackRecentPackets){onlyTrackRecentPackets=typeof onlyTrackRecentPackets!=="undefined"?onlyTrackRecentPackets:false;if(alsoFilterOnStation){var currentFilterStationIds=this._map.state.getFilterStationIds();if(currentFilterStationIds.length>0){if(currentFilterStationIds.indexOf(stationId)==-1){this.filterOnStationId(stationId);}}} -if(stationId!==null){var trackLinkElementClass="trackStationLink"+stationId;$("."+trackLinkElementClass).html("Untrack");} -if(this._map.state.trackStationId!==null){var trackLinkElementClass="trackStationLink"+this._map.state.trackStationId;$("."+trackLinkElementClass).html("Track");} -this._map.state.onlyTrackRecentPackets=onlyTrackRecentPackets;this._map.state.trackStationId=stationId;this._emitEventListeners("track-changed",[stationId,stationName]);},focusOnStation:function(stationId,openInfoWindow){var map=this._map;openInfoWindow=typeof openInfoWindow!=="undefined"?openInfoWindow:false;var marker=map.markerCollection.getStationLatestMarker(stationId);if(marker!==null){marker.show();marker.showLabel();if(openInfoWindow){map.openMarkerInfoWindow(marker,false);}else{this.setCenter(marker.packet.latitude,marker.packet.longitude);} -marker.hide(5000,true);return true;}else{return false;}},focusOnMarkerId:function(markerId,zoom){var map=this._map;var markerIdKey=map.markerCollection.getMarkerIdKey(markerId);if(map.markerCollection.isExistingMarker(markerIdKey)){var marker=map.markerCollection.getMarker(markerIdKey);if(map.markerCollection.hasRelatedDashedPolyline(marker)){newerMarker=map.markerCollection.getMarker(marker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey);if(newerMarker.packet.hasConfirmedMapId()){return this.focusOnMarkerId(newerMarker.packet.marker_id);}} -marker.show();marker.showLabel();this.setCenter(marker.packet.latitude,marker.packet.longitude,zoom);map.openMarkerInfoWindow(marker);marker.hide(5000,true);}},toggleStationCoverage:function(stationId,coverageLinkElementClass){coverageLinkElementClass=typeof coverageLinkElementClass!=="undefined"?coverageLinkElementClass:null;var coveragePolygon=this._map.markerCollection.getStationCoverage(stationId);if(coveragePolygon!==null&&coveragePolygon.isRequestedToBeVisible()){coveragePolygon.hide();if(coverageLinkElementClass!==null){$("."+coverageLinkElementClass).html("Coverage");}}else{if(coveragePolygon!==null){coveragePolygon.show();if(!coveragePolygon.hasContent()){alert("Currently we do not have enough data to create a max range coverage plot for this station. Try again later!");}else{if(coverageLinkElementClass!==null){$("."+coverageLinkElementClass).html("Hide coverage");}}}else{var packet=this._map.markerCollection.getStationLatestPacket(stationId);var center={lat:parseFloat(packet.latitude),lng:parseFloat(packet.longitude),};var coveragePolygon=new trackdirect.models.StationCoveragePolygon(center,this._map,true);this._map.markerCollection.addStationCoverage(stationId,coveragePolygon);coveragePolygon.showWhenDone();if(coverageLinkElementClass!==null){$("."+coverageLinkElementClass).html('Loading <i class="fa fa-spinner fa-spin" style="font-size:12px"></i>');coveragePolygon.addTdListener("visible",function(){if(!coveragePolygon.hasContent()){coveragePolygon.hide();alert("Currently we do not have enough data to create a max range coverage plot for this station. Try again later!");$("."+coverageLinkElementClass).html("Coverage");}else{$("."+coverageLinkElementClass).html("Hide coverage");}},true);} -var me=this;$.getJSON(this.coverageDataUrl+"?id="+stationId,function(data){if("station_id"in data&&"coverage"in data){coveragePolygon.setData(data["coverage"],me.coveragePercentile);var marker=me._map.markerCollection.getStationLatestMarker(stationId);if(marker.isVisible()){if(coveragePolygon.isRequestedToBeVisible()){coveragePolygon.show();}}}}).fail(function(){coveragePolygon.hide();alert("Failed to fetch coverage data. Try again later!");$("."+coverageLinkElementClass).html("Coverage");}).always(function(){});}}},setMapType:function(mapType){if(this._map!==null){this._map.setMapType(mapType);}},getMapType:function(){if(this._map!==null){return this._map.getMapType();}},setMapDefaultLocation:function(setDefaultZoom){this._map.setMapDefaultLocation(setDefaultZoom);},setMapLocationByGeoLocation:function(failCallBack,successCallBack,timeout){var me=this;if(navigator&&navigator.geolocation){navigator.geolocation.getCurrentPosition(function(position){var pos={lat:position.coords.latitude,lng:position.coords.longitude,};me._map.setCenter(pos,12);if(successCallBack!==null){successCallBack();}},function(error){if(failCallBack!==null){failCallBack(error.message);}},{enableHighAccuracy:false,timeout:timeout,maximumAge:5000,});}else{if(failCallBack!==null){failCallBack();}}},openStationInformationDialog:function(stationId){var packet=this._map.markerCollection.getStationLatestPacket(stationId);if(packet==null){packet={station_id:stationId,id:null};} -this._emitEventListeners("station-name-clicked",packet);},openMarkerInfoWindow:function(markerId){var markerIdKey=this._map.markerCollection.getMarkerIdKey(markerId);if(this._map.markerCollection.isExistingMarker(markerIdKey)){var marker=this._map.markerCollection.getMarker(markerIdKey);this._map.openMarkerInfoWindow(marker);}},closeAnyOpenInfoWindow:function(){if(this._map!==null){var state=this._map.state;if(state.isInfoWindowOpen()){state.openInfoWindow.hide();}}},setTimeTravelTimestamp:function(ts,sendRequestToServer){if(ts!=0||this._map.state.endTimeTravelTimestamp!=null){sendRequestToServer=typeof sendRequestToServer!=="undefined"?sendRequestToServer:true;if(this._map.state.endTimeTravelTimestamp!=ts){if(ts!=null&&ts!=0&&ts!=""){this._map.state.endTimeTravelTimestamp=ts;}else{this._map.state.endTimeTravelTimestamp=null;} -if(sendRequestToServer){trackdirect.services.callbackExecutor.add(this,this._handleTimeChange,[]);}} -this._emitEventListeners("time-travel-changed",ts);this._emitEventListeners("mode-changed");}},getTimeTravelTimestamp:function(){return this._map.state.endTimeTravelTimestamp;},setTimeLength:function(time,sendRequestToServer){sendRequestToServer=typeof sendRequestToServer!=="undefined"?sendRequestToServer:true;if(this._map.state.getTimeLength()/60!=time){this._map.state.setTimeLength(time*60);if(sendRequestToServer){trackdirect.services.callbackExecutor.add(this,this._handleTimeChange,[]);}} -this._emitEventListeners("time-length-changed",time);this._updateMinZoomLevels();},togglePHGCircles:function(){var state=this._map.state;if(state.showPHGCircles==0){state.showPHGCircles=1;}else if(state.showPHGCircles==1){state.showPHGCircles=2;}else{state.showPHGCircles=0;} -this._map.showHidePHGCircles();},toggleRNGCircles:function(){var state=this._map.state;if(state.showRNGCircles==0){state.showRNGCircles=1;}else if(state.showRNGCircles==1){state.showRNGCircles=2;}else{state.showRNGCircles=0;} -this._map.showHideRNGCircles();},toggleStationaryPositions:function(){if(this.isStationaryMarkersVisible()){this._map.state.isStationaryMarkersVisible=false;}else{this._map.state.isStationaryMarkersVisible=true;} -this._map.showHideMarkers();},toggleUnknownPositions:function(){if(this.isUnknownMarkersVisible()){this._map.state.isUnknownMarkersVisible=false;}else{this._map.state.isUnknownMarkersVisible=true;} -this._map.showHideMarkers();},toggleOgflymPositions:function(){if(this.isOgflymMarkersVisible()){this._map.state.isOgflymMarkersVisible=false;}else{this._map.state.isOgflymMarkersVisible=true;} -this._map.showHideMarkers();},toggleInternetPositions:function(){if(this.isInternetMarkersVisible()){this._map.state.isInternetMarkersVisible=false;}else{this._map.state.isInternetMarkersVisible=true;} -this._map.showHideMarkers();},toggleCwopPositions:function(){if(this.isCwopMarkersVisible()){this._map.state.isCwopMarkersVisible=false;}else{this._map.state.isCwopMarkersVisible=true;} -this._map.showHideMarkers();},toggleGhostPositions:function(){if(this.isGhostMarkersVisible()){this._map.state.isGhostMarkersVisible=false;}else{this._map.state.isGhostMarkersVisible=true;} -this._map.showHideMarkers();},isGhostMarkersVisible:function(){return this._map.state.isGhostMarkersVisible;},isCwopMarkersVisible:function(){return this._map.state.isCwopMarkersVisible;},isInternetMarkersVisible:function(){return this._map.state.isInternetMarkersVisible;},isStationaryMarkersVisible:function(){return this._map.state.isStationaryMarkersVisible;},setVisibleSymbols:function(symbols){this._map.state.visibleSymbols=symbols;this._map.showHideMarkers();},addVisibleSymbol:function(symbol){this._map.state.visibleSymbols.push(symbol);this._map.showHideMarkers();},removeVisibleSymbol:function(symbol){var indexToRemove=null;for(var i=0;i<this._map.state.visibleSymbols.length;i++){if(this._map.state.visibleSymbols[i][0]==symbol[0]&&this._map.state.visibleSymbols[i][1]==symbol[1]){indexToRemove=i;break;}} -if(indexToRemove!==null){this._map.state.visibleSymbols.splice(indexToRemove,1);} -this._map.showHideMarkers();},getVisibleSymbols:function(){return this._map.state.visibleSymbols;},isUnknownMarkersVisible:function(){return this._map.state.isUnknownMarkersVisible;},isOgflymMarkersVisible:function(){return this._map.state.isOgflymMarkersVisible;},handleFilterStationRequest:function(stationId,filterLinkElementClass){filterLinkElementClass=typeof filterLinkElementClass!=="undefined"?filterLinkElementClass:null;if(this._map.state.filterStationIds.length>0&&this._map.state.filterStationIds.indexOf(stationId)>-1){this.stopFilterOnStationId(stationId);if(filterLinkElementClass!==null){$("."+filterLinkElementClass).html("Filter");}}else{this.filterOnStationId(stationId);if(filterLinkElementClass!==null){$("."+filterLinkElementClass).html("Unfilter");}}},handleTrackStationRequest:function(stationId,trackLinkElementClass){stationId=typeof stationId!=="undefined"?stationId:0;trackLinkElementClass=typeof trackLinkElementClass!=="undefined"?trackLinkElementClass:null;if(this._map.state.getTrackStationId()!==null&&(stationId===0||this._map.state.getTrackStationId()==stationId)){if(trackLinkElementClass!==null){$("."+trackLinkElementClass).html("Track");}else if(this._map.state.openInfoWindow!==null){this._map.state.openInfoWindow.hide();} -this.stopTrackStation();}else if(stationId!==0){if(trackLinkElementClass!==null){$("."+trackLinkElementClass).html("Untrack");} -var packet=this._map.markerCollection.getStationLatestPacket(stationId);if(packet!==null){var stationName=packet.station_name;if(packet.sender_name!=packet.station_name){stationName=packet.station_name+" ("+packet.sender_name+")";} -this.trackStation(stationId,stationName,true);}}},_initSettings:function(){this.settings={animate:true,defaultMinZoomForMarkerLabel:11,defaultMinZoomForMarkerPrevPosition:11,defaultMinZoomForMarkerTail:9,defaultMinZoomForMarkers:8,minZoomForMarkerLabel:11,minZoomForMarkerPrevPosition:11,minZoomForMarkerTail:9,minZoomForMarkers:8,markerSymbolBaseDir:"/symbols/",imagesBaseDir:"/images/",defaultCurrentZoom:11,defaultCurrentZoomMobile:11,dateFormat:"L LTSZ",dateFormatNoTimeZone:"L LTS",host:"www.aprsdirect.com",baseUrl:"https://www.aprsdirect.com",defaultTimeLength:60,symbolsToScale:[],primarySymbolWithNoDirectionPolyline:[87,64,95],alternativeSymbolWithNoDirectionPolyline:[40,42,64,74,84,85,96,98,101,102,112,116,119,121,123,],};},_parseOptions:function(options){if(typeof options["cordinatesContainerElementId"]!==undefined){this._cordinatesContainerElementId=options["cordinatesContainerElementId"];} -if(typeof options["statusContainerElementId"]!==undefined){this._statusContainerElementId=options["statusContainerElementId"];} -if(typeof options["isMobile"]!==undefined){this.isMobile=options["isMobile"];} -if(typeof options["coverageDataUrl"]!==undefined){this.coverageDataUrl=options["coverageDataUrl"];} -if(typeof options["coveragePercentile"]!==undefined){this.coveragePercentile=options["coveragePercentile"];} -if(typeof options["time"]!==undefined){this._time=options["time"];} -if(typeof options["timetravel"]!==undefined){this._timetravel=options["timetravel"];} -if(typeof options["center"]!==undefined){this._center=options["center"];} -if(typeof options["zoom"]!==undefined){this._zoom=options["zoom"];} -if(typeof options["maptype"]!==undefined){this._maptype=options["maptype"];} -if(typeof options["mid"]!==undefined){this._mid=options["mid"];} -if(typeof options["filters"]!==undefined&&options["filters"]!==null){for(var i in options["filters"]){if(options["filters"][i]!==null&&options["filters"][i]!=""){this._filters[i]=options["filters"][i];}}} -if(typeof options["disableLocationChangeOnFilterResponse"]!==undefined&&options["disableLocationChangeOnFilterResponse"]){this._doNotChangeLocationOnFilterResponse=true;} -if(typeof options["defaultMinZoomForMarkerLabel"]!==undefined&&options["defaultMinZoomForMarkerLabel"]!=null){this.settings.defaultMinZoomForMarkerLabel=options["defaultMinZoomForMarkerLabel"];} -if(typeof options["defaultMinZoomForMarkerPrevPosition"]!==undefined&&options["defaultMinZoomForMarkerPrevPosition"]!=null){this.settings.defaultMinZoomForMarkerPrevPosition=options["defaultMinZoomForMarkerPrevPosition"];} -if(typeof options["defaultMinZoomForMarkerTail"]!==undefined&&options["defaultMinZoomForMarkerTail"]!=null){this.settings.defaultMinZoomForMarkerTail=options["defaultMinZoomForMarkerTail"];} -if(typeof options["defaultMinZoomForMarkers"]!==undefined&&options["defaultMinZoomForMarkers"]!=null){this.settings.defaultMinZoomForMarkers=options["defaultMinZoomForMarkers"];} -if(typeof options["animate"]!==undefined&&options["animate"]!=null){this.settings.animate=options["animate"];} -if(typeof options["host"]!==undefined&&options["host"]!=null){this.settings.host=options["host"];this.settings.baseUrl=this._getMapBaseUrl(options["host"]);}else{this.settings.baseUrl=this._getMapBaseUrl();} -if(typeof options["defaultTimeLength"]!==undefined&&options["defaultTimeLength"]!=null){this.settings.defaultTimeLength=options["defaultTimeLength"];} -if(typeof options["symbolsToScale"]!==undefined&&options["symbolsToScale"]!==null){this.settings.symbolsToScale=options["symbolsToScale"];} -this._initDefaultLocation(options);},_initDefaultLocation:function(options){if(typeof options["defaultLatitude"]!=="undefined"&&typeof options["defaultLongitude"]!=="undefined"){this._defaultLatitude=options["defaultLatitude"];this._defaultLongitude=options["defaultLongitude"];}else{this._defaultLatitude=0;this._defaultLongitude=0;}},_initTime:function(){var filterMode=false;if("sid"in this._filters||"sidlist"in this._filters||"sname"in this._filters||"snamelist"in this._filters){filterMode=true;} -if(this._time!=null&&this._isValidTime(this._time,filterMode)){this.setTimeLength(this._time,false);}else{this.setTimeLength(this.settings.defaultTimeLength,false);} -now=new Date();if(this._timetravel!=null&&this._timetravel>=0&&this._timetravel<=now.getTime()/1000){this.setTimeTravelTimestamp(this._timetravel,false);} -this._updateMinZoomLevels();},_mapInit:function(options){if("sid"in this._filters||"sidlist"in this._filters||"sname"in this._filters||"snamelist"in this._filters){this._waitForFilterResponse=true;if(window.location.href.indexOf("/center/")>=0){this._doNotChangeLocationOnFilterResponseTmp=true;}} -var tdMapOptions=this._getMapInitOptions(options);var me=this;$(document).ready(function(){me._map=new trackdirect.models.Map(me._mapElementId,tdMapOptions);me._markerCreator=new trackdirect.MarkerCreator(me._map);if(typeof options["useImperialUnit"]!=="undefined"&&options["useImperialUnit"]==true){me.enableImperialUnits();} -me._emitEventListeners("map-created");});},_getMapInitOptions:function(options){var center=this._getMapInitCenter();var tdMapOptions={zoom:this._getMapInitZoom(),maptype:this._getMapInitMapType(),cordinatesContainer:this._cordinatesContainerElementId,defaultLatitude:this._defaultLatitude,defaultLongitude:this._defaultLongitude,initCenter:center,mid:this._getMapInitMid(),};if("supportedMapTypes"in options){tdMapOptions["supportedMapTypes"]=options["supportedMapTypes"];} -if("mapboxGLStyle"in options){tdMapOptions["mapboxGLStyle"]=options["mapboxGLStyle"];} -if("mapboxGLAccessToken"in options){tdMapOptions["mapboxGLAccessToken"]=options["mapboxGLAccessToken"];} -if("mapboxGLAttribution"in options){tdMapOptions["mapboxGLAttribution"]=options["mapboxGLAttribution"];} -return tdMapOptions;},_getMapInitCenter:function(){if(this._center!=null){var centerParts=this._center.split(",");if(centerParts.length==2&&this._isValidLatitude(centerParts[0])&&this._isValidLongitude(centerParts[1])){return{lat:parseFloat(centerParts[0]),lng:parseFloat(centerParts[1]),};}} -return null;},_getMapInitZoom:function(){var zoom=null;if(this._zoom!=null&&this._isValidZoom(this._zoom)){zoom=this._zoom;} -return zoom;},_getMapInitMid:function(){var mid=null;if(this._mid!=null){mid=this._mid;} -return mid;},_getMapInitMapType:function(){var maptype=null;if(this._maptype!=null){maptype=this._maptype;} -return maptype;},_initFilterUrlRequest:function(){if("sid"in this._filters){stationId=this._filters["sid"];if(isNumeric(stationId)){this.filterOnStationId(stationId);}}else if("sname"in this._filters){stationName=this._filters["sname"];if(stationName!=""){this.filterOnStationName(stationName);}}else if("sidlist"in this._filters){stationIdArray=this._filters["sidlist"].split(",");var isValid=true;for(var i=0;i<stationIdArray.length;i++){if(!isNumeric(stationIdArray[i])){isValid=false;}} -if(isValid){this.filterOnStationId(stationIdArray);}}else if("snamelist"in this._filters){stationNameArray=this._filters["snamelist"].split(",");var isValid=true;for(var i=0;i<stationNameArray.length;i++){if(typeof stationNameArray[i]=="undefined"||stationNameArray[i]==""){isValid=false;}} -if(isValid){this.filterOnStationName(stationNameArray);}}else{return false;} -var me=this;this._filterTimeoutId=window.setTimeout(function(){if(me._waitForFilterResponse){me._waitForFilterResponse=false;trackdirect.services.callbackExecutor.add(me,me._sendPositionRequest,[]);}},5000);return true;},_isValidTime:function(time,filteredMode){if(isNumeric(time)){if(filteredMode&&time<=14400&&time>0){return true;}else if(filteredMode==false&&time<=1440&&time>0){return true;}} -return false;},_isValidZoom:function(zoom){if(isNumeric(zoom)){if(zoom<=21&&zoom>=0){return true;}} -return false;},_isValidLatitude:function(lat){if(isNumeric(lat)){if(lat<=90&&lat>=-90){return true;}} -return false;},_isValidLongitude:function(lng){if(isNumeric(lng)){if(lng<=180&&lng>=-180){return true;}} -return false;},_initMapListeners:function(){var me=this;this._map.addTdListener("change",function(){trackdirect.services.callbackExecutor.add(me,me._sendPositionRequest,[]);trackdirect.services.mapAttributionModifier.update(me._map);});this._map.addTdListener("moving",function(){trackdirect.services.callbackExecutor.addIfUnique(me,me._sendIdleRequest,[]);});this._map.addTdListener("station-tail-needed",function(stationId){me._websocket.doSendCompleteStationRequest(stationId,me._map.state.getTimeLength()/60,me.getTimeTravelTimestamp());});this._map.addTdListener("station-information",function(stationId){me.openStationInformationDialog(stationId);});},_initWebsocketListeners:function(){this._initWebsocketStateChangeListener();this._initWebsocketAprsPacketListener();this._initWebsocketPayloadDoneListener();this._initWebsocketFilterResponseListener();this._initWebsocketServerTimestampResponseListener();this._initWebsocketResetListener();},_initWebsocketStateChangeListener:function(){var me=this;this._websocket.addListener("state-change",function(){var callback=function(){me._handleWebsocketStateChange();};trackdirect.services.callbackExecutor.add(this,callback,[]);});},_initWebsocketAprsPacketListener:function(){var me=this;this._websocket.addListener("aprs-packet",function(packetData){var packet=new trackdirect.models.Packet(packetData);var queueTimestamp=Math.floor(Date.now()/1000);var callback=function(){var dequeueTimestamp=Math.floor(Date.now()/1000);if(dequeueTimestamp-queueTimestamp>5||!this.settings.animate){me._handleAprsPacket(packet,false);}else{me._handleAprsPacket(packet,true);}};trackdirect.services.callbackExecutor.add(me,callback,[]);});},_initWebsocketPayloadDoneListener:function(){var me=this;this._websocket.addListener("aprs-packet-payload-done",function(){var callback=function(){me._map.showNewMarkersInQueue(true);};trackdirect.services.callbackExecutor.add(this,callback,[]);});},_initWebsocketFilterResponseListener:function(){var me=this;this._websocket.addListener("filter-response",function(data){var callback=function(){me._handleFilterResponse(data);};trackdirect.services.callbackExecutor.add(this,callback,[]);});},_initWebsocketServerTimestampResponseListener:function(){var me=this;this._websocket.addListener("server-timestamp-response",function(data){var callback=function(){me._map.state.setServerCurrentTimestamp(data.timestamp);};trackdirect.services.callbackExecutor.add(this,callback,[]);if(me._map.getNumberOfNewMarkersToShow()>0){var callback2=function(){me._map.showNewMarkersInQueue(true);};trackdirect.services.callbackExecutor.addIfUnique(this,callback2,[]);}});},_initWebsocketResetListener:function(){var me=this;this._websocket.addListener("reset",function(){trackdirect.services.callbackExecutor.add(me._map,me._map.resetAllMarkers,[]);});},_updateMinZoomLevels:function(){if(this._map.state.getTimeLength()/60>720){trackdirect.settings.minZoomForMarkerPrevPosition=trackdirect.settings.defaultMinZoomForMarkerPrevPosition+1;trackdirect.settings.minZoomForMarkerTail=trackdirect.settings.defaultMinZoomForMarkerTail+1;trackdirect.settings.minZoomForMarkerLabel=trackdirect.settings.defaultMinZoomForMarkerLabel+1;trackdirect.settings.minZoomForMarkers=trackdirect.settings.defaultMinZoomForMarkers;}else{trackdirect.settings.minZoomForMarkerPrevPosition=trackdirect.settings.defaultMinZoomForMarkerPrevPosition;trackdirect.settings.minZoomForMarkerTail=trackdirect.settings.defaultMinZoomForMarkerTail;trackdirect.settings.minZoomForMarkerLabel=trackdirect.settings.defaultMinZoomForMarkerLabel;trackdirect.settings.minZoomForMarkers=trackdirect.settings.defaultMinZoomForMarkers;}},_handleTimeChange:function(){this._updateMinZoomLevels();this._map.resetAllMarkers();this._websocket.clearLastSentPositionRequest();trackdirect.services.callbackExecutor.add(this,this._sendPositionRequest,[]);this._emitEventListeners("mode-changed");},_handleFilterResponse:function(data){if(this._filterTimeoutId!==null){clearTimeout(this._filterTimeoutId);this._filterTimeoutId=null;} -if(data.length==0){this._handleEmptyFilterResponse();}else{this._handleNonEmptyFilterResponse(data);}},_unMarkMissingStationsAsFiltered:function(data){var filterStationIds=this._map.state.getFilterStationIds();for(var key in filterStationIds){var stationId=filterStationIds[key];var foundStation=false;for(var i=0;i<data.length;i++){var packetData=data[i];if(packetData.station_id==stationId&&packetData["related"]==0){foundStation=true;}} -if(!foundStation){this._unMarkStationAsFiltered(stationId);}}},_unMarkStationAsFiltered:function(stationId){var map=this._map;var index=map.state.filterStationIds.indexOf(stationId);if(index>-1){map.state.filterStationIds.splice(index,1);var filterLinkElementClass="filterStationLink"+stationId;$("."+filterLinkElementClass).html("Filter");for(var markerIdKey in map.markerCollection.getStationMarkerIdKeys(stationId)){var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker!==null){marker.hideCompleteMarker();}}}},_getNumberOfUniqeStationsInArray:function(data){var numberOfStationPackets=0;for(var i=0;i<data.length;i++){var packetData=data[i];if(packetData["related"]==0){numberOfStationPackets++;}} -return numberOfStationPackets;},_trackStationInArray:function(data,onlyTrackRecentPackets){if(this._getNumberOfUniqeStationsInArray(data)==1){for(var i=0;i<data.length;i++){var packet=new trackdirect.models.Packet(data[i]);if(packet["related"]==0){this.trackStation(packet.station_id,escapeHtml(packet.getStationName()),false,onlyTrackRecentPackets);}}}},_addFilterResponsePacketsToMap:function(data){var tryToShowPacket=this._isAnyPacketInArrayOlderThanCurrentLimit(data);for(var i=0;i<data.length;i++){var packet=new trackdirect.models.Packet(data[i]);if(packet["related"]==0){this._markStationAsFiltered(packet.station_id);} -var markerIdKey=this._markerCreator.addPacket(packet,tryToShowPacket);var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker!==null){marker.markToBeOverWritten();}}},_markStationAsFiltered:function(stationId){var map=this._map;if(map.state.filterStationIds.indexOf(stationId)==-1){map.state.filterStationIds.push(stationId);} -var filterLinkElementClass="filterStationLink"+stationId;$("."+filterLinkElementClass).html("Unfilter");for(var markerIdKey in map.markerCollection.getStationMarkerIdKeys(stationId)){var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker!==null){marker.showCompleteMarker();}}},_handleNonEmptyFilterResponse:function(data){var isFilterModeNew=!this.isFilteredMode();this._map.activateFilteredMode();this._waitForFilterResponse=false;if(isFilterModeNew){this._map.resetAllMarkers();this._emitEventListeners("mode-changed");}else{this._unMarkMissingStationsAsFiltered(data);} -this._addFilterResponsePacketsToMap(data);var packets=[];for(var i=0;i<data.length;i++){packets.push(new trackdirect.models.Packet(data[i]));} -this._emitEventListeners("filter-changed",packets);if(isFilterModeNew){var onlyTrackRecentPackets=true;if(!this._doNotChangeLocationOnFilterResponse&&!this._doNotChangeLocationOnFilterResponseTmp){onlyTrackRecentPackets=false;this._setFilteredMapBounds(data);} -this._doNotChangeLocationOnFilterResponseTmp=false;this._trackStationInArray(data,onlyTrackRecentPackets);this._emitEventListeners("filter-new");} -trackdirect.services.callbackExecutor.add(this,this._requestFilteredUpdate,[]);},_requestFilteredUpdate:function(){this._websocket.clearLastSentPositionRequest();this._setWebsocketStateLoading(false);this._websocket.doSendNewPositionRequest(90,180,-90,-180,this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp(),false);},_handleEmptyFilterResponse:function(){this._deactivateFiltered(true);this._waitForFilterResponse=false;},_isAnyPacketInArrayOlderThanCurrentLimit:function(data){for(var i=0;i<data.length;i++){var packetData=data[i];if(packetData["related"]==0){if(packetData.timestamp<packetData.requested_timestamp+60){return true;} -if(packetData["source"]==0||packetData["source_id"]==0){return true;}}} -return false;},_setFilteredMapBounds:function(data){if(data.length==1){this._map.setCenter({lat:parseFloat(data[0].latitude),lng:parseFloat(data[0].longitude),},12);}else{var positions=[];for(var i=0;i<data.length;i++){var packetData=data[i];if(packetData["related"]==0){positions.push({lat:parseFloat(packetData.latitude),lng:parseFloat(packetData.longitude),});}} -this._map.fitBounds(positions);if(this._map.getZoom()>12){this._map.setZoom(12);}}},_handleAprsPacket:function(packet,animate){var markerIdKey=this._markerCreator.addPacket(packet,true);if(markerIdKey!==null){var highlight=false;var autoRender=false;var marker=this._map.markerCollection.getMarker(markerIdKey);if(animate&&packet.db==0&&packet.station_name==packet.sender_name&&marker.shouldMarkerBeVisible()&&(this.isFilteredMode()||this._isPacketOnMap(packet))){highlight=true;var tdTransmitAnimation=new trackdirect.models.TransmitAnimation(marker,this._map);tdTransmitAnimation.show();} -if(packet.realtime==1&&animate){autoRender=true;}}},_linkifyPacketRaw:function(packet){if(typeof packet.raw!=="undefined"&&typeof packet.raw=="string"){var raw=escapeHtml(packet.raw);var stationNameReplacement='<a href="#" onclick="trackdirect.focusOnMarkerId('+ -packet.marker_id+ -'); return false;">'+ -escapeHtml(packet.sender_name)+ -"</a>";raw=raw.replaceAll(escapeHtml(packet.sender_name)+">",stationNameReplacement+">");for(var i=0;i<packet.station_id_path.length;i++){var relatedStationId=packet.station_id_path[i];var relatedStationLatestPacket=this._map.markerCollection.getStationLatestPacket(relatedStationId);if(relatedStationLatestPacket!==null){var relatedStationNameReplacement='<a href="#" onclick="trackdirect.focusOnStation('+ -relatedStationId+ -', true); return false;">'+ -escapeHtml(relatedStationLatestPacket.sender_name)+ -"</a>";var relatedStationSenderName=escapeHtml(relatedStationLatestPacket.sender_name);raw=raw.replaceAll(">"+relatedStationSenderName+":",">"+relatedStationNameReplacement+":");raw=raw.replaceAll(">"+relatedStationSenderName+",",">"+relatedStationNameReplacement+",");raw=raw.replaceAll(">"+relatedStationSenderName+"*",">"+relatedStationNameReplacement+"*");raw=raw.replaceAll(","+relatedStationSenderName+":",","+relatedStationNameReplacement+":");raw=raw.replaceAll(","+relatedStationSenderName+",",","+relatedStationNameReplacement+",");raw=raw.replaceAll(","+relatedStationSenderName+"*",","+relatedStationNameReplacement+"*");}} -raw=Autolinker.link(raw,{newWindow:true});return raw;} -return"";},_isPacketOnMap:function(packet){if(packet.latitude<=this._map.getNorthEastLat()&&packet.latitude>=this._map.getSouthWestLat()){if(packet.longitude<=this._map.getNorthEastLng()&&packet.longitude>=this._map.getSouthWestLng()){return true;}} -return false;},_handleWebsocketStateChange:function(){switch(this._websocket.getState()){case this._websocket.State.CONNECTING:this._setWebsocketStateConnecting();break;case this._websocket.State.CONNECTED:this._setWebsocketStateConnected();trackdirect.services.callbackExecutor.add(this,this._sendPositionRequest,[]);break;case this._websocket.State.CLOSED:case this._websocket.State.ERROR:this._setWebsocketStateError();break;case this._websocket.State.LOADING:this._setWebsocketStateLoading(true,false);break;case this._websocket.State.LOADING_DONE:this._setWebsocketStateLoadingDone();break;case this._websocket.State.LISTENING_APRSIS:this._setWebsocketStateAprsISConnected();break;case this._websocket.State.CONNECTING_APRSIS:this._setWebsocketStateAprsISConnecting();break;case this._websocket.State.IDLE:this._setWebsocketStateIdle();break;case this._websocket.State.INACTIVE:this._setWebsocketStateInactive();break;}},_setWebsocketStateConnecting:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Connecting").css("color","blue");}},_setWebsocketStateConnected:function(){this._map.resetAllMarkers();if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Connected").css("color","green");}},_setWebsocketStateError:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Disconnected").css("color","red");} -this._map.resetAllMarkers();this._deactivateFiltered(false);var me=this;if(confirm("You have been disconnected, this can be caused by a network error, by the timeout limit or if maintenance occurs while you’re logged in. Do you want to reconnect?")){me._websocket=new trackdirect.Websocket(me._wsServerUrl);me._initWebsocketListeners();trackdirect.services.callbackExecutor.add(me,me._sendPositionRequest,[]);}},_setWebsocketStateLoading:function(isStateConfirmed,showOnMobile){isStateConfirmed=typeof isStateConfirmed!=="undefined"?isStateConfirmed:true;showOnMobile=typeof showOnMobile!=="undefined"?showOnMobile:true;if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html('Loading <i class="fa fa-spinner fa-spin" style="font-size:14px"></i>').css("color","green");}},_setWebsocketStateLoadingDone:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Complete").css("color","green");}},_setWebsocketStateAprsISConnected:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Connected to APRS feed").css("color","green");}},_setWebsocketStateAprsISConnecting:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Waiting for APRS feed").css("color","green");}},_setWebsocketStateIdle:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Idle").css("color","green");}},_setWebsocketStateInactive:function(){if(this._statusContainerElementId!==null){$("#"+this._statusContainerElementId).html("Inactive").css("color","orange");} -this._websocket.close();this._map.resetAllMarkers();var me=this;if(confirm("No activity for a long time, map updates has been stopped. Do you want to reconnect?")){me._websocket=new trackdirect.Websocket(me._wsServerUrl);me._initWebsocketListeners();trackdirect.services.callbackExecutor.add(me,me._sendPositionRequest,[]);}},_sendPositionRequest:function(){if(!this._waitForFilterResponse&&this._map.isMapReady()){if(!this.isFilteredMode()){if(this._map.getZoom()<trackdirect.settings.minZoomForMarkers){this._websocket.doSendNewPositionRequest(0,0,0,0,this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp(),false);}else if(this._map.getZoom()>=trackdirect.settings.minZoomForMarkerTail){this._websocket.doSendNewPositionRequest(this._map.getNorthEastLat(),this._map.getNorthEastLng(),this._map.getSouthWestLat(),this._map.getSouthWestLng(),this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp(),false);}else{this._websocket.doSendNewPositionRequest(this._map.getNorthEastLat(),this._map.getNorthEastLng(),this._map.getSouthWestLat(),this._map.getSouthWestLng(),this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp(),true);}}else{this._websocket.doSendNewPositionRequest(90,180,-90,-180,this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp(),false);} -var data={center:this._map.getCenterLiteral(),zoom:this._map.getZoom(),};this._emitEventListeners("position-request-sent",data);}},_sendIdleRequest:function(){if(this._websocket.isPositionRequestSent()){this._websocket.doSendNewPositionRequest(0,0,0,0,this._map.state.getTimeLength()/60,this.getTimeTravelTimestamp(),false);}},_deactivateFiltered:function(sendNewRequest){this.setTimeTravelTimestamp(null);this._map.resetAllMarkers();if(this._map.state.openInfoWindow!==null){this._map.state.openInfoWindow.hide();} -this._map.deactivateFilteredMode();this.stopTrackStation();this.setTimeLength(this.settings.defaultTimeLength,false);this._emitEventListeners("filter-changed",[]);this._emitEventListeners("filter-stopped");if(sendNewRequest){trackdirect.services.callbackExecutor.add(this,this._sendPositionRequest,[]);} -this._emitEventListeners("mode-changed");},_getMapBaseUrl:function(host){host=typeof host!=="undefined"?host:"";host=host.replace("http://","");host=host.replace("https://","");if(host==""){host=window.location.host;} -if(location.protocol==="https:"){return"https://"+host;}else{return"http://"+host;}},_emitEventListeners:function(event,arg){if(event in this._eventListeners){for(var i=0;i<this._eventListeners[event].length;i++){this._eventListeners[event][i](arg);}} -if(event in this._eventListenersOnce){for(var i=0;i<this._eventListenersOnce[event].length;i++){this._eventListenersOnce[event][i](arg);this._eventListenersOnce[event].splice(i,1);i--;}} -if(event=="trackdirect-init-done"){this._trackdirectInitDone=true;} -if(event=="map-created"){this._mapCreated=true;}},}; -trackdirect.services.symbolPathFinder={getFilePath:function(symbolTable,symbol,course,width,height,scaleWidth,scaleHeight){if(typeof symbol!=="undefined"&&typeof symbolTable!=="undefined"&&symbol!==null&&symbolTable!==null&&symbol.length>=1&&symbolTable.length>=1){var symbolAsciiValue=symbol.charCodeAt(0);var symbolTableAsciiValue=symbolTable.charCodeAt(0);}else{var symbolAsciiValue=125;var symbolTableAsciiValue=47;} -var sizeStrValue="";if(width!==null&&height!==null){sizeStrValue="-"+width+"x"+height;} -var scaleStrValue=this._getIconFilePathScalePart(scaleWidth,scaleHeight);var courseStrValue=this._getIconFilePathCoursePart(course);var url=trackdirect.settings.markerSymbolBaseDir+ -"symbol-"+ -symbolAsciiValue+ -"-"+ -symbolTableAsciiValue+ -courseStrValue+ -sizeStrValue+ -scaleStrValue+ -".png";return trackdirect.settings.baseUrl+url;},_getIconFilePathCoursePart:function(course){var courseStrValue="";if(course!==null){var courseValue=Math.round(parseInt(course)/10)*10;while(courseValue>360){courseValue=courseValue-360;} -while(courseValue<0){courseValue=courseValue+360;} -courseStrValue="-"+courseValue;} -return courseStrValue;},_getIconFilePathScalePart:function(scaleWidth,scaleHeight){var scaleStrValue="";if(scaleWidth!==null&&scaleHeight!==null){if(isHighDensity()){scaleStrValue="-scale"+scaleWidth*2+"x"+scaleHeight*2;}else{scaleStrValue="-scale"+scaleWidth+"x"+scaleHeight;}} -return scaleStrValue;},}; -trackdirect.services.stationColorCalculator={_colors:["#3333ff","#9900cc","#006600","#cc0000",],_stationColorId:{},getColor:function(packet){var colorId=this.getColorId(packet);return this._colors[colorId];},getKmlColor(packet){var hex=this.getColor(packet);var result=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);if(result){return"FF"+result[3]+result[2]+result[1];} -return null;},getColorId:function(packet){if(packet.station_name in this._stationColorId){colorId=this._stationColorId[packet.station_name];return colorId;}else{var hash=this._simplehashStr(packet.station_name);var colorId=hash%this._colors.length;this._stationColorId[packet.station_name]=colorId;} -return colorId;},_simplehashStr:function(str){var hash=0;for(var i=0;i<str.length;i++){var charCode=str.charCodeAt(i);hash+=charCode;} -return hash;},}; -trackdirect.services.MapSectorCalculator={getMapSectors:function(bounds){var result=[];if(typeof google==="object"&&typeof google.maps==="object"){var maxLat=Math.ceil(bounds.getNorthEast().lat())+1;var minLat=Math.floor(bounds.getSouthWest().lat())-1;var maxLng=Math.ceil(bounds.getNorthEast().lng())+1;var minLng=Math.floor(bounds.getSouthWest().lng())-1;}else if(typeof L==="object"){var maxLat=Math.ceil(bounds.getNorthEast().lat)+1;var minLat=Math.floor(bounds.getSouthWest().lat)-1;var maxLng=Math.ceil(bounds.getNorthEast().lng)+1;var minLng=Math.floor(bounds.getSouthWest().lng)-1;} -if(maxLng<minLng){result=result.concat(trackdirect.services.MapSectorCalculator.getMapSectorsByInterval(minLat,maxLat,minLng,180.0));minLng=-180.0;} -result=result.concat(trackdirect.services.MapSectorCalculator.getMapSectorsByInterval(minLat,maxLat,minLng,maxLng));return result;},getMapSectorsByInterval:function(minLat,maxLat,minLng,maxLng){var result=[];var minAreaCode=this.getMapSector(minLat,minLng);var maxAreaCode=this.getMapSector(maxLat,maxLng);lngDiff=parseInt(Math.ceil(maxLng))-parseInt(Math.ceil(minLng));var areaCode=minAreaCode;while(areaCode<=maxAreaCode){if(areaCode%10==5){result.push(areaCode);}else{result.push(areaCode);result.push(areaCode+5);} -for(var i=1;i<=lngDiff;i++){if(areaCode%10==5){result.push(areaCode+10*i-5);result.push(areaCode+10*i);}else{result.push(areaCode+10*i);result.push(areaCode+10*i+5);}} -areaCode=areaCode+20000;} -return result;},getMapSector:function(latitude,longitude){var lat=this._getMapSectorLatRepresentation(latitude);var lng=this._getMapSectorLngRepresentation(longitude);return lat+lng;},_getMapSectorLatRepresentation:function(latitude){var lat=parseInt(Math.floor(latitude))+90;var latDecimalPart=latitude-Math.floor(latitude);if(latDecimalPart<0.2){lat=lat*10+0;}else if(latDecimalPart<0.4){lat=lat*10+2;}else if(latDecimalPart<0.6){lat=lat*10+4;}else if(latDecimalPart<0.8){lat=lat*10+6;}else{lat=lat*10+8;} -lat=lat*10000;return lat;},_getMapSectorLngRepresentation:function(longitude){lng=parseInt(Math.floor(longitude))+180;lngDecimalPart=longitude-Math.floor(longitude);if(lngDecimalPart<0.5){lng=lng*10+0;}else{lng=lng*10+5;} -return lng;},}; -trackdirect.services.mapAttributionModifier={_hereBaseAttributionData:null,_hereAerialAttributionData:null,_latestAttribution:null,_isHereInitialized:false,_eventListeners:{},_eventListenersOnce:{},update:function(map){if(this._isHereTileProvider(map)){this.updateHereAttribution(map);}else if(this._latestAttribution!=null){this.setMapAttribution(map,"");}},updateHereAttribution:function(map){this._loadHereAttributionData(map);var me=this;var base=this._getMapTileBase(map);if(base=="base"){this.addListener("init-here-base",function(){var attribution=me._getHereAttributionString(map);me.setMapAttribution(map,attribution);},true);}else if(base=="aerial"){this.addListener("init-here-aerial",function(){var attribution=me._getHereAttributionString(map);me.setMapAttribution(map,attribution);},true);}},setMapAttribution:function(map,attribution){if(this._latestAttribution!=attribution){map.attributionControl.removeAttribution(this._latestAttribution);if(attribution!=""){map.attributionControl.addAttribution(attribution);}} -this._latestAttribution=attribution;},addListener:function(event,handler,execOnce){execOnce=typeof execOnce!=="undefined"?execOnce:false;if(execOnce){if(!(event in this._eventListenersOnce)){this._eventListenersOnce[event]=[];} -this._eventListenersOnce[event].push(handler);}else{if(!(event in this._eventListeners)){this._eventListeners[event]=[];} -this._eventListeners[event].push(handler);} -if(event=="init-here-base"&&this._isHereBaseInitialized){this._emitEventListeners("init-here-base");} -if(event=="init-here-aerial"&&this._isHereAerialInitialized){this._emitEventListeners("init-here-aerial");}},_isHereTileProvider:function(map){var tileLayer=map.getLeafletTileLayer();if(tileLayer!==null&&typeof tileLayer._url!=="undefined"&&tileLayer._url.indexOf("here.com")>=0){return true;} -return false;},_getMapTileOptions:function(map){var tileLayer=map.getLeafletTileLayer();if(tileLayer!==null&&typeof tileLayer.options!=="undefined"){return tileLayer.options;} -return null;},_getMapTileVariant:function(map){var options=this._getMapTileOptions(map);if(options.variant!=="undefined"){return options.variant;} -return null;},_getMapTileInitialVariant:function(map){var mapVariant=this._getMapTileVariant(map);var dotIndex=mapVariant.indexOf(".");if(dotIndex>=0){return mapVariant.substring(0,dotIndex);} -return mapVariant;},_getMapTileBase:function(map){var options=this._getMapTileOptions(map);if(options.base!=="undefined"){return options.base;} -return null;},_getHereAttributionString:function(map){var result=[];var mapBaseVariant=this._getMapTileInitialVariant(map);if(this._getMapTileBase(map)=="base"){var data=this._hereBaseAttributionData;}else if(this._getMapTileBase(map)=="aerial"){var data=this._hereAerialAttributionData;} -if(data!==null&&typeof data[mapBaseVariant]!=="undefined"){for(var i=0,len=data[mapBaseVariant].length;i<len;i++){var attributionArea=data[mapBaseVariant][i];if(parseInt(map.getZoom())>=parseInt(attributionArea.minLevel)&&parseInt(map.getZoom())<=parseInt(attributionArea.maxLevel)){if(typeof attributionArea.boxes==="undefined"||this._isAnyBoxVisible(attributionArea.boxes,map)){var attributionText='<span title="'+ -attributionArea.alt+ -'">'+ -attributionArea.label+ -"</span>";if(result.indexOf(attributionText)<0){result.push(attributionText);}}}}} -return result.join(", ");},_isAnyBoxVisible:function(boxes,map){if(typeof boxes!=="undefined"&&Array.isArray(boxes)){for(var i=0,len=boxes.length;i<len;i++){var box=boxes[i];if(Array.isArray(box)&&box.length>=4){var boxBounds=L.latLngBounds(L.latLng(parseFloat(box[0]),parseFloat(box[1])),L.latLng(parseFloat(box[2]),parseFloat(box[3])));if(boxBounds.isValid()&&boxBounds.intersects(map.getBounds())){return true;}}}} -return false;},_loadHereAttributionData:function(map){var options=this._getMapTileOptions(map);var base=this._getMapTileBase(map);if((this._hereBaseAttributionData===null&&base=="base")||(this._hereAerialAttributionData===null&&base=="aerial")){var me=this;jQuery.ajax({url:"https://1."+ -base+ -".maps.api.here.com/maptile/2.1/copyright/"+ -options.mapID+ -"?app_id="+ -options.app_id+ -"&app_code="+ -options.app_code,type:"GET",dataType:"json",timeout:5000,success:function(result){if(base=="base"){me._hereBaseAttributionData=result;me._isHereBaseInitialized=true;me._emitEventListeners("init-here-base");}else if(base=="aerial"){me._hereAerialAttributionData=result;me._isHereAerialInitialized=true;me._emitEventListeners("init-here-aerial");}},error:function(xhr){console.log("Failed to load map copyright data");},});}},_emitEventListeners:function(event,arg){if(event in this._eventListeners){for(var i=0;i<this._eventListeners[event].length;i++){this._eventListeners[event][i](arg);}} -if(event in this._eventListenersOnce){var eventListenersOnce=this._eventListenersOnce[event].splice(0);this._eventListenersOnce[event]=[];for(var i=0;i<eventListenersOnce.length;i++){eventListenersOnce[i](arg);}}},}; -trackdirect.services.imperialConverter={convertKilometerToMile:function(value){return value*0.621371192;},convertMpsToMph:function(value){return value*2.23693629;},convertMeterToFeet:function(value){return value*3.2808399;},convertMeterToYard:function(value){return value*1.0936133;},convertMmToInch:function(value){return value*0.0393700787;},convertCelciusToFahrenheit:function(value){return value*(9/5)+32;},convertMbarToMmhg:function(value){return value*0.75006375541921;},}; -trackdirect.services.distanceCalculator={getDistance:function(p1,p2){var R=6378137;var dLat=this._radians(p2.lat-p1.lat);var dLong=this._radians(p2.lng-p1.lng);var a=Math.sin(dLat/2)*Math.sin(dLat/2)+ -Math.cos(this._radians(p1.lat))*Math.cos(this._radians(p2.lat))*Math.sin(dLong/2)*Math.sin(dLong/2);var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));var d=R*c;if(isNaN(d)){return null;}else{return d;}},getCenter:function(coords){var x=coords.map(function(a){return a.lat;});var y=coords.map(function(a){return a.lng;});var minX=Math.min.apply(null,x);var maxX=Math.max.apply(null,x);var minY=Math.min.apply(null,y);var maxY=Math.max.apply(null,y);return{lat:(minX+maxX)/2,lng:(minY+maxY)/2};},getPositionByDistance:function(latLng,course,distanceInMeters){var dist=distanceInMeters/1000;dist=dist/6371;var brng=(course*Math.PI)/180;var lat1=(latLng.lat*Math.PI)/180,lon1=(latLng.lng*Math.PI)/180;var lat2=Math.asin(Math.sin(lat1)*Math.cos(dist)+ -Math.cos(lat1)*Math.sin(dist)*Math.cos(brng));var lon2=lon1+ -Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));if(isNaN(lat2)||isNaN(lon2))return null;var latitude=(lat2*180)/Math.PI;var longitude=(lon2*180)/Math.PI;return{lat:Math.round(latitude*100000)/100000,lng:Math.round(longitude*100000)/100000,};},getBearing:function(p1,p2){startLat=this._radians(p1.lat);startLong=this._radians(p1.lng);endLat=this._radians(p2.lat);endLong=this._radians(p2.lng);var dLong=endLong-startLong;var dPhi=Math.log(Math.tan(endLat/2.0+Math.PI/4.0)/ -Math.tan(startLat/2.0+Math.PI/4.0));if(Math.abs(dLong)>Math.PI){if(dLong>0.0){dLong=-(2.0*Math.PI-dLong);}else{dLong=2.0*Math.PI+dLong;}} -return(this._degrees(Math.atan2(dLong,dPhi))+360.0)%360.0;},_radians:function(n){return n*(Math.PI/180);},_degrees:function(n){return n*(180/Math.PI);},}; -trackdirect.services.dateFormatter={getDateString:function(timestamp,includeTimeZone,includeTime,useLocalTimeZone){includeTimeZone=typeof includeTimeZone!=="undefined"?includeTimeZone:true;includeTime=typeof includeTime!=="undefined"?includeTime:true;useLocalTimeZone=typeof useLocalTimeZone!=="undefined"?useLocalTimeZone:true;var date=new Date(timestamp*1000);if(useLocalTimeZone){var theMoment=moment(date);}else{var theMoment=moment.utc(date);} -if(!theMoment.isValid()){return timestamp;} -if(includeTime){if(includeTimeZone){return theMoment.format("L LTSZ");}else{return theMoment.format("L LTS");}}else{return theMoment.format("L");}},getAgeString:function(timestamp){var delta=Math.abs(Math.floor(Date.now()/1000)-timestamp);var days=Math.floor(delta/86400);delta-=days*86400;var hours=Math.floor(delta/3600)%24;delta-=hours*3600;var minutes=Math.floor(delta/60)%60;delta-=minutes*60;var seconds=Math.floor(delta%60);var timeAgoList=[];if(days>1){timeAgoList.push(days+" days");}else if(days>0){timeAgoList.push(days+" day");} -if(hours>1){timeAgoList.push(hours+" hours");}else if(hours>0){timeAgoList.push(hours+" hour");} -if(minutes>1){timeAgoList.push(minutes+" minutes");}else if(minutes>0){timeAgoList.push(minutes+" minute");} -if(seconds==1){timeAgoList.push(seconds+" second");}else{timeAgoList.push(seconds+" seconds");} -if(timeAgoList.length>1){return(timeAgoList.slice(0,timeAgoList.length-1).join(", ")+ -" and "+ -timeAgoList[timeAgoList.length-1]);}else{return timeAgoList[timeAgoList.length-1];}},}; -if(!Date.now){Date.now=function(){return new Date().getTime();};} -function escapeRegExp(str){return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");} -String.prototype.replaceAll=function(search,replacement){var target=this;return target.replace(new RegExp(escapeRegExp(search),"gi"),replacement);};function isNumeric(n){return!isNaN(parseFloat(n))&&isFinite(n);} -Number.prototype.mod=function(n){return((this%n)+n)%n;};function isDate(str){var d=new Date(str);var now=new Date();if(Object.prototype.toString.call(d)==="[object Date]"){if(isNaN(d.getTime())){return false;}else{if(d.getTime()>0){return true;}else{return false;}}}else{return false;}} -if(!Array.prototype.fill){Array.prototype.fill=function(value){if(this==null){throw new TypeError("this is null or not defined");} -var O=Object(this);var len=O.length>>>0;var start=arguments[1];var relativeStart=start>>0;var k=relativeStart<0?Math.max(len+relativeStart,0):Math.min(relativeStart,len);var end=arguments[2];var relativeEnd=end===undefined?len:end>>0;var final=relativeEnd<0?Math.max(len+relativeEnd,0):Math.min(relativeEnd,len);while(k<final){O[k]=value;k++;} -return O;};} -if(!Array.prototype.indexOf){Array.prototype.indexOf=function(elt ){var len=this.length;var from=Number(arguments[1])||0;from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++){if(from in this&&this[from]===elt)return from;} -return-1;};} -if(typeof String.prototype.endsWith!=="function"){String.prototype.endsWith=function(suffix){return this.indexOf(suffix,this.length-suffix.length)!==-1;};} -if(!String.prototype.trim){(function(){var rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(rtrim,"");};})();} -if(!Object.keys){Object.keys=function(obj){var keys=[],k;for(k in obj){if(Object.prototype.hasOwnProperty.call(obj,k)){keys.push(k);}} -return keys;};} -if(!Date.prototype.toISOString){(function(){function pad(number){var r=String(number);if(r.length===1){r="0"+r;} -return r;} -Date.prototype.toISOString=function(){return(this.getUTCFullYear()+ -"-"+ -pad(this.getUTCMonth()+1)+ -"-"+ -pad(this.getUTCDate())+ -"T"+ -pad(this.getUTCHours())+ -":"+ -pad(this.getUTCMinutes())+ -":"+ -pad(this.getUTCSeconds())+ -"."+ -String((this.getUTCMilliseconds()/1000).toFixed(3)).slice(2,5)+ -"Z");};})();} -function inIframe(){try{return window.self!==window.top;}catch(e){return true;}} -function isHighDensity(){return((window.matchMedia&&(window.matchMedia("only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)").matches||window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)").matches))||(window.devicePixelRatio&&window.devicePixelRatio>1.3));} -function escapeHtml(text){if(typeof text==="undefined"||text==null){return null;} -var map={"&":"&","<":"<",">":">",'"':""","'":"'",};return text.replace(/[&<>"']/g,function(m){return map[m];});} -trackdirect.services.callbackExecutor={settings:{minTimeBeforeSleep:30,},_running:false,_lastSleepTimestamp:0,_lastAddedUniqueCallback:null,_lowPriorityQueue:[],_normalPriorityQueue:[],_highPriorityQueue:[],add:function(thisObj,callback,argsArray){var callBackString=callback.toString()+":"+argsArray.toString();this._lastAddedUniqueCallback=callBackString;this._normalPriorityQueue.push(function(){callback.apply(thisObj,argsArray);trackdirect.services.callbackExecutor._next();});this.start();return this;},addIfUnique:function(thisObj,callback,argsArray){var callBackString=callback.toString()+":"+argsArray.toString();if(this._lastAddedUniqueCallback==callBackString){return this;} -this._lastAddedUniqueCallback=callBackString;this._normalPriorityQueue.push(function(){callback.apply(thisObj,argsArray);trackdirect.services.callbackExecutor._next();});this.start();return this;},addWithPriority:function(thisObj,callback,argsArray){this._highPriorityQueue.push(function(){callback.apply(thisObj,argsArray);trackdirect.services.callbackExecutor._next();});this.start();return this;},addWithLowPriority:function(thisObj,callback,argsArray){this._lowPriorityQueue.push(function(){callback.apply(thisObj,argsArray);trackdirect.services.callbackExecutor._next();});this.start();return this;},start:function(){if(!this._running){this._next();} -return this;},_next:function(){var secondsSinceLastSleep=Date.now()-this._lastSleepTimestamp;if(secondsSinceLastSleep>this.settings.minTimeBeforeSleep){this._lastSleepTimestamp=Date.now();var me=this;setTimeout(function(){me._dequeue();},1);}else{this._dequeue();}},_dequeue:function(){var shift=this._highPriorityQueue.shift();if(shift){this._running=true;shift();return;} -shift=this._normalPriorityQueue.shift();if(shift){this._running=true;shift();return;} -shift=this._lowPriorityQueue.shift();if(shift){this._running=true;shift();return;} -this._running=false;},}; -trackdirect.Websocket=function(wsServerUrl){this._wsServerUrl=wsServerUrl;this._init();this._state=this.State.CONNECTING;this._emitEventListeners("state-change");this._instance=new WebSocket(this._wsServerUrl);var me=this;this._instance.onopen=function(evt){me._onOpen(evt);};this._instance.onclose=function(evt){me._onClose(evt);};this._instance.onmessage=function(evt){me._onMessage(evt);};this._instance.onerror=function(evt){me._onError(evt);};};trackdirect.Websocket.prototype._init=function(){this._instance=null;this._eventListeners={};this._lastSentPositionRequest="";this._state=0;this._lastMessageTimestamp=null;this._queue=[];this._running=false;this._sendPositionRequestIntervalId=null;this.State={CONNECTING:0,CONNECTED:1,CLOSING:2,CLOSED:3,ERROR:4,LOADING:5,LOADING_DONE:6,LISTENING_APRSIS:7,CONNECTING_APRSIS:8,IDLE:9,INACTIVE:10,};};trackdirect.Websocket.prototype.send=function(data){this._instance.send(data);};trackdirect.Websocket.prototype.close=function(){this._instance.close();};trackdirect.Websocket.prototype.getState=function(){return this._state;};trackdirect.Websocket.prototype.clearLastSentPositionRequest=function(){this._lastSentPositionRequest="";};trackdirect.Websocket.prototype.isPositionRequestSent=function(){if(this._lastSentPositionRequest!=""){return true;}else{return false;}};trackdirect.Websocket.prototype.doSendFilterRequest=function(list,historyMinutes,referenceTime){var request={};request.payload_request_type=4;request.list=list;request.minutes=historyMinutes;if(referenceTime!=""){request.time=parseInt(referenceTime,10);}else{request.time=null;} -return this._addToSendQueue(request);};trackdirect.Websocket.prototype.doSendFilterRequestByName=function(namelist,historyMinutes,referenceTime){var request={};request.payload_request_type=8;request.namelist=namelist;request.minutes=historyMinutes;if(referenceTime!=""){request.time=parseInt(referenceTime,10);}else{request.time=null;} -return this._addToSendQueue(request);};trackdirect.Websocket.prototype.doSendCompleteStationRequest=function(stationId,historyMinutes,referenceTime){var request={};request.payload_request_type=7;request.station_id=stationId;request.minutes=historyMinutes;if(referenceTime!=""){request.time=parseInt(referenceTime,10);}else{request.time=null;} -return this._addToSendQueue(request);};trackdirect.Websocket.prototype.doSendStopFilterRequest=function(stationId){var request={};request.payload_request_type=6;request.station_id=stationId;return this._addToSendQueue(request);};trackdirect.Websocket.prototype.doSendNewPositionRequest=function(neLat,neLng,swLat,swLng,historyMinutes,referenceTime,onlyRequestLatestPacket){var request={};request.payload_request_type=1;request.neLat=neLat;request.neLng=neLng;request.swLat=swLat;request.swLng=swLng;request.minutes=historyMinutes;if(referenceTime!=""){request.time=parseInt(referenceTime,10);}else{request.time=null;} -if(onlyRequestLatestPacket){request.onlyLatestPacket=1;}else{request.onlyLatestPacket=0;} -var requestStr=JSON.stringify(request);if(requestStr!=this._lastSentPositionRequest){this._lastSentPositionRequest=requestStr;if(this._sendPositionRequestIntervalId!==null){clearInterval(this._sendPositionRequestIntervalId);} -if(this._addToSendQueue(request)){var me=this;this._sendPositionRequestIntervalId=window.setInterval(function(){request.payload_request_type=11;if(me._lastSentPositionRequest==requestStr){me._addToSendQueue(request);}},60*1000);return true;} -return false;}else{return true;}};trackdirect.Websocket.prototype.addListener=function(event,handler){if(!(event in this._eventListeners)){this._eventListeners[event]=[];} -this._eventListeners[event].push(handler);};trackdirect.Websocket.prototype._onOpen=function(evt){this._state=this.State.CONNECTING;this._emitEventListeners("state-change");};trackdirect.Websocket.prototype._onClose=function(evt){this._state=this.State.CLOSED;this._emitEventListeners("state-change");};trackdirect.Websocket.prototype._onError=function(evt){this._state=this.State.ERROR;this._emitEventListeners("state-change");};trackdirect.Websocket.prototype._onMessage=function(evt){this._lastMessageTimestamp=Math.floor(Date.now()/1000);var packet=JSON.parse(evt.data);trackdirect.services.callbackExecutor.add(this,this._handleMessage,[packet,]);};trackdirect.Websocket.prototype._handleMessage=function(packet){switch(packet.payload_response_type){case 1:this._emitEventListeners("aprs-packet",packet.data);this._emitEventListeners("aprs-packet-payload-done");break;case 2:for(i=0;typeof packet.data!=="undefined"&&i<packet.data.length;i++){this._emitEventListeners("aprs-packet",packet.data[i]);} -this._emitEventListeners("aprs-packet-payload-done");break;case 5:this._emitEventListeners("filter-response",packet.data);this._emitEventListeners("aprs-packet-payload-done");break;case 41:this._emitEventListeners("server-timestamp-response",packet.data);break;case 31:this._state=this.State.LISTENING_APRSIS;this._emitEventListeners("state-change");break;case 32:this._state=this.State.LOADING;this._emitEventListeners("state-change");break;case 33:this._state=this.State.IDLE;this._emitEventListeners("state-change");break;case 34:this._state=this.State.CONNECTING_APRSIS;this._emitEventListeners("state-change");break;case 35:this._state=this.State.LOADING_DONE;this._emitEventListeners("state-change");break;case 36:this._state=this.State.INACTIVE;this._emitEventListeners("state-change");this.clearLastSentPositionRequest();break;case 40:this._emitEventListeners("reset");break;case 42:this.clearLastSentPositionRequest();this._state=this.State.CONNECTED;this._emitEventListeners("state-change");break;} -return true;};trackdirect.Websocket.prototype._addToSendQueue=function(request){if(this.readyState>1){return false;} -var currentTs=Math.floor(Date.now()/1000);if(this._lastMessageTimestamp!==null&&this._lastMessageTimestamp<currentTs-60){this.close();return false;} -var me=this;this._queue.push(function(){var data=JSON.stringify(request);if(data!=null){me.send(data);} -me._dequeue();});this._start();return true;};trackdirect.Websocket.prototype._start=function(){if(!this._running){this._dequeue();}};trackdirect.Websocket.prototype._dequeue=function(){this._running=true;var me=this;setTimeout(function(){if(me._instance.readyState===1){var shift=me._queue.shift();if(shift){shift();}else{me._running=false;} -return;}else if(me._instance.readyState>1){me._running=false;return;}else{me._dequeue();}},5);};trackdirect.Websocket.prototype._emitEventListeners=function(event,arg){if(typeof this._eventListeners!=="undefined"&&event in this._eventListeners){for(var i=0;i<this._eventListeners[event].length;i++){this._eventListeners[event][i](arg);}}}; -trackdirect.models.TransmitPolyline=function(packet,map){this._packet=packet;this._defaultMap=map;this._relatedMarkerIdKeys=[];if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Polyline.call(this,this._getGoolgePolylineOptions());}else if(typeof L==="object"){L.Polyline.call(this,{},this._getLeafletPolylineOptions());this.setLatLngs(this.getCoordinates());}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.TransmitPolyline.prototype=Object.create(google.maps.Polyline.prototype);}else if(typeof L==="object"){trackdirect.models.TransmitPolyline.prototype=Object.create(L.Polyline.prototype);} -trackdirect.models.TransmitPolyline.prototype.constructor=trackdirect.models.TransmitPolyline;trackdirect.models.TransmitPolyline.prototype.getPathItem=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);return path.getAt(index);}else if(typeof L==="object"){var list=this.getLatLngs();if(typeof list[index]!=="undefined"){return list[index];}else{return null;}} -return null;};trackdirect.models.TransmitPolyline.prototype.pushPathItem=function(latLng){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);path.push(latLng);}else if(typeof L==="object"){this.addLatLng(latLng);}};trackdirect.models.TransmitPolyline.prototype.removePathItem=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);path.removeAt(index);}else if(typeof L==="object"){var list=this.getLatLngs();if(typeof list[index]!=="undefined"){list.splice(index,1);this.setLatLngs(list);}}};trackdirect.models.TransmitPolyline.prototype.getPathLength=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);return path.getLength();}else if(typeof L==="object"){var list=this.getLatLngs();return list.length;}};trackdirect.models.TransmitPolyline.prototype.getPath=function(){if(typeof google==="object"&&typeof google.maps==="object"){return google.maps.Polyline.prototype.getPath.call(this);}else if(typeof L==="object"){return this.getLatLngs();} -return[];};trackdirect.models.TransmitPolyline.prototype.getMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){var map=google.maps.Polyline.prototype.getMap.call(this);if(typeof map!=="undefined"){return map;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return this._defaultMap;}} -return null;};trackdirect.models.TransmitPolyline.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}} -for(var i=0;i<this._relatedMarkerIdKeys.length;i++){var relatedMarkerIdKey=this._relatedMarkerIdKeys[i];if(this._defaultMap.markerCollection.isExistingMarker(relatedMarkerIdKey)){var relatedMarker=this._defaultMap.markerCollection.getMarker(relatedMarkerIdKey);relatedMarker.show();relatedMarker.showLabel();}}};trackdirect.models.TransmitPolyline.prototype.hide=function(delayInMilliSeconds){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}} -for(var i=0;i<this._relatedMarkerIdKeys.length;i++){var relatedMarkerIdKey=this._relatedMarkerIdKeys[i];if(this._defaultMap.markerCollection.isExistingMarker(relatedMarkerIdKey)){var relatedMarker=this._defaultMap.markerCollection.getMarker(relatedMarkerIdKey);if(relatedMarker!==null&&relatedMarker.getMap()!==null){relatedMarker.hide(delayInMilliSeconds,true);}}}};trackdirect.models.TransmitPolyline.prototype.isVisible=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()!=="undefined"&&this.getMap()!==null){return true;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return true;}} -return false;};trackdirect.models.TransmitPolyline.prototype._getGoolgePolylineOptions=function(){var lineCoordinates=this.getCoordinates();if(lineCoordinates.length<=1){lineCoordinates=[];} -var lineSymbol={path:"M 0,-0.1 0,0",strokeOpacity:0.7,scale:3,};return{path:lineCoordinates,strokeOpacity:0,strokeColor:"#0000ff",icons:[{icon:lineSymbol,offset:"0px",repeat:"5px",},],map:null,zIndex:100,};};trackdirect.models.TransmitPolyline.prototype._getLeafletPolylineOptions=function(){return{opacity:0.6,weight:3,color:"#0000ff",dashArray:"1,5",lineCap:"round",lineJoin:"round",};};(trackdirect.models.TransmitPolyline.prototype.getCoordinates=function(){var lineCoordinates=this.getCoordinatesByStationMarkers();if(lineCoordinates.length<this._packet.station_location_path.length+1){lineCoordinates=this.getCoordinatesByPositions();} -return lineCoordinates;}),(trackdirect.models.TransmitPolyline.prototype.getCoordinatesByStationMarkers=function(){var lineCoordinates=[];var startLatLng=this._packet.getLatLngLiteral();lineCoordinates.push(startLatLng);for(var i=0;i<this._packet.station_id_path.length;i++){var stationId=this._packet.station_id_path[i];var stationMarkerIdKey=null;var stationMarker=null;var stationDistance=null;var stationLatLng=null;for(var pointMarkerIdKey in this._defaultMap.markerCollection.getStationMarkerIdKeys(stationId)){var pointMarker=this._defaultMap.markerCollection.getMarker(pointMarkerIdKey);if(pointMarker!==null){var pointLatLng=pointMarker.packet.getLatLngLiteral();var distance=trackdirect.services.distanceCalculator.getDistance(startLatLng,pointLatLng);if(stationMarker===null||distance<stationDistance){stationMarkerIdKey=pointMarkerIdKey;stationMarker=pointMarker;stationDistance=distance;stationLatLng=pointLatLng;}}} -if(stationLatLng!==null){lineCoordinates.push(stationLatLng);this._relatedMarkerIdKeys.push(stationMarkerIdKey);}} -return lineCoordinates;}),(trackdirect.models.TransmitPolyline.prototype.getCoordinatesByPositions=function(){var lineCoordinates=[];var startLatLng=this._packet.getLatLngLiteral();lineCoordinates.push(startLatLng);if(lineCoordinates.length<this._packet.station_location_path.length+1){for(var i=0;i<this._packet.station_location_path.length;i++){if(this._packet.station_location_path[i][0]!==null&&this._packet.station_location_path[i][1]!==null){lineCoordinates.push({lat:parseFloat(this._packet.station_location_path[i][0]),lng:parseFloat(this._packet.station_location_path[i][1]),});}}} -return lineCoordinates;}); -trackdirect.models.TransmitAnimation=function(marker,map){this._map=map;this._marker=marker;this.init();};trackdirect.models.TransmitAnimation.prototype.show=function(){this._startAnimation();};trackdirect.models.TransmitAnimation.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){this.iconMarkers[1].setMap(null);this.iconMarkers[2].setMap(null);this.iconMarkers[3].setMap(null);}else if(typeof L==="object"){this._map.removeLayer(this.iconMarkers[1]);this._map.removeLayer(this.iconMarkers[2]);this._map.removeLayer(this.iconMarkers[3]);} -this.marker.transmitPolyLine.hide();};trackdirect.models.TransmitAnimation.prototype.init=function(){var newLatLng=this._marker.packet.getLatLngLiteral();this._marker.transmitPolyLine=new trackdirect.models.TransmitPolyline(this._marker.packet,this._map);this.iconMarkers=[];for(var i=1;i<=3;i++){var icon=this._getIcon(i);if(typeof google==="object"&&typeof google.maps==="object"){var iconMarker=new google.maps.Marker({position:newLatLng,zIndex:this._map.state.currentMarkerZindex,icon:icon,opacity:0.6,});}else if(typeof L==="object"){var iconMarker=new L.Marker(newLatLng,{zIndexOffset:this._map.state.currentMarkerZindex,icon:icon,opacity:0.6,});} -this.iconMarkers[i]=iconMarker;}};trackdirect.models.TransmitAnimation.prototype._getIcon=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var icon={url:trackdirect.settings.baseUrl+ -trackdirect.settings.imagesBaseDir+ -"transmit"+ -index+ -".png",size:new google.maps.Size(60,60),origin:new google.maps.Point(0,0),anchor:new google.maps.Point(30,30),};}else if(typeof L==="object"){var icon=L.icon({iconUrl:trackdirect.settings.baseUrl+ -trackdirect.settings.imagesBaseDir+ -"transmit"+ -index+ -".png",iconSize:[60,60],iconAnchor:[30,30],});} -return icon;};trackdirect.models.TransmitAnimation.prototype._startAnimation=function(){var me=this;me._showIconMarker(1);window.setTimeout(function(){me._showIconMarker(2);},150);window.setTimeout(function(){me._showIconMarker(3);if(me._marker.transmitPolyLine!==null){me._marker.transmitPolyLine.show();}},300);window.setTimeout(function(){me._hideIconMarker(1);},800);window.setTimeout(function(){me._hideIconMarker(2);},900);window.setTimeout(function(){me._hideIconMarker(3);if(me._marker.transmitPolyLine!=null){me._marker.transmitPolyLine.hide(4000);}},1000);};trackdirect.models.TransmitAnimation.prototype._showIconMarker=function(index){if(typeof google==="object"&&typeof google.maps==="object"){this.iconMarkers[index].setMap(this._map);}else if(typeof L==="object"){this.iconMarkers[index].addTo(this._map);}};trackdirect.models.TransmitAnimation.prototype._hideIconMarker=function(index){if(typeof google==="object"&&typeof google.maps==="object"){this.iconMarkers[index].setMap(null);}else if(typeof L==="object"){this._map.removeLayer(this.iconMarkers[index]);}}; -trackdirect.models.TailPolyline=function(color,map){this._defaultMap=map;this.markerIdKey=null;this.ownerMarkerIdKey=null;this.relatedMarkerIdKey=null;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Polyline.call(this,this._getGooglePolylineOptions(color));}else if(typeof L==="object"){L.Polyline.call(this,{},this._getLeafletPolylineOptions(color));}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.TailPolyline.prototype=Object.create(google.maps.Polyline.prototype);}else if(typeof L==="object"){trackdirect.models.TailPolyline.prototype=Object.create(L.Polyline.prototype);} -trackdirect.models.TailPolyline.prototype.constructor=trackdirect.models.TailPolyline;trackdirect.models.TailPolyline.prototype.getPathItem=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);return path.getAt(index);}else if(typeof L==="object"){var list=this.getLatLngs();if(typeof list[index]!=="undefined"){return list[index];}else{return null;}} -return null;};trackdirect.models.TailPolyline.prototype.pushPathItem=function(latLng){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);path.push(latLng);}else if(typeof L==="object"){this.addLatLng(latLng);}};trackdirect.models.TailPolyline.prototype.removePathItem=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);path.removeAt(index);}else if(typeof L==="object"){var list=this.getLatLngs();if(typeof list[index]!=="undefined"){list.splice(index,1);this.setLatLngs(list);}}};trackdirect.models.TailPolyline.prototype.getPathLength=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);return path.getLength();}else if(typeof L==="object"){var list=this.getLatLngs();return list.length;}};trackdirect.models.TailPolyline.prototype.getPath=function(){if(typeof google==="object"&&typeof google.maps==="object"){return google.maps.Polyline.prototype.getPath.call(this);}else if(typeof L==="object"){return this.getLatLngs();} -return[];};trackdirect.models.TailPolyline.prototype.getMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){var map=google.maps.Polyline.prototype.getMap.call(this);if(typeof map!=="undefined"){return map;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return this._defaultMap;}} -return null;};trackdirect.models.TailPolyline.prototype.setMarkerIdKey=function(markerIdKey){this.markerIdKey=markerIdKey;this.ownerMarkerIdKey=markerIdKey;this._addInfoWindowListener(markerIdKey);};trackdirect.models.TailPolyline.prototype.setRelatedMarkerIdKey=function(markerIdKey){this.relatedMarkerIdKey=markerIdKey;};trackdirect.models.TailPolyline.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}}};trackdirect.models.TailPolyline.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}}};trackdirect.models.TailPolyline.prototype.addMarker=function(marker){if(typeof google==="object"&&typeof google.maps==="object"){var latLng=new google.maps.LatLng(parseFloat(marker.packet.latitude),parseFloat(marker.packet.longitude));latLng.marker=marker;this.pushPathItem(latLng);}else if(typeof L==="object"){var latLng=new L.latLng(parseFloat(marker.packet.latitude),parseFloat(marker.packet.longitude));latLng.marker=marker;this.addLatLng(latLng);}};trackdirect.models.TailPolyline.prototype._addInfoWindowListener=function(markerIdKey){var me=this;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.event.addListener(this,"click",function(event){var marker=me._defaultMap.markerCollection.getMarker(markerIdKey);me._defaultMap.openPolylineInfoWindow(marker,event.latLng);});}else if(typeof L==="object"){this.on("click",function(event){var marker=me._defaultMap.markerCollection.getMarker(markerIdKey);me._defaultMap.openPolylineInfoWindow(marker,event.latlng);});}};trackdirect.models.TailPolyline.prototype._getGooglePolylineOptions=function(color){return{geodesic:false,strokeOpacity:0.6,strokeWeight:4,strokeColor:color,map:null,zIndex:100,};};trackdirect.models.TailPolyline.prototype._getLeafletPolylineOptions=function(color){return{opacity:0.7,weight:4,color:color,};}; -trackdirect.models.StationCoveragePolygon=function(center,map,tryToShowCoveragePolygon){tryToShowCoveragePolygon=typeof tryToShowCoveragePolygon!=="undefined"?tryToShowCoveragePolygon:true;this._showPolygon=tryToShowCoveragePolygon;this._map=map;this._center=center;this._isRequestedToBeVisible=false;this._polygon=null;this._polygonCoordinates=null;this._heatmapCoordinates=null;this._heatmap=null;this._tdEventListeners={};this._tdEventListenersOnce={};this._upperMaxRangeInMeters=1000*1000;this._paddingInPercentOfMaxRange=10;this._paddingMinInMeters=1000;};trackdirect.models.StationCoveragePolygon.prototype.setData=function(data,percentile){this._addParametersToData(data);this._heatmapCoordinates=this._getCoordinates(data);if(this._showPolygon){var maxRange=this._getCoveragePolygonMaxRange(data,percentile);if(maxRange<=0){this._showPolygon=false;}else{this._polygonCoordinates=this._getConvexHullCoordinates(data,maxRange);}} -if(typeof google==="object"&&typeof google.maps==="object"){this._googleMapsInit();}else if(typeof L==="object"){this._leafletInit();}};trackdirect.models.StationCoveragePolygon.prototype.addTdListener=function(event,handler,execOnce){execOnce=typeof execOnce!=="undefined"?execOnce:false;if(execOnce){if(!(event in this._tdEventListenersOnce)){this._tdEventListenersOnce[event]=[];} -this._tdEventListenersOnce[event].push(handler);}else{if(!(event in this._tdEventListeners)){this._tdEventListeners[event]=[];} -this._tdEventListeners[event].push(handler);}};trackdirect.models.StationCoveragePolygon.prototype.hasContent=function(){if(this._heatmapCoordinates!==null&&this._heatmapCoordinates.length>0){return true;} -return false;};trackdirect.models.StationCoveragePolygon.prototype.isRequestedToBeVisible=function(){return this._isRequestedToBeVisible;};trackdirect.models.StationCoveragePolygon.prototype.showWhenDone=function(){this._isRequestedToBeVisible=true;};trackdirect.models.StationCoveragePolygon.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this._polygon!==null){this._polygon.setMap(this._map);} -if(this._heatmap!==null){this._heatmap.setMap(this._map);}}else if(typeof L==="object"){if(this._polygon!==null){this._polygon.addTo(this._map);} -if(this._heatmap!==null){this._heatmap.addTo(this._map);}} -this._isRequestedToBeVisible=true;if(this._showPolygon&&this._polygonCoordinates!==null){this._emitTdEventListeners("visible");}else if(this._heatmapCoordinates!==null){this._emitTdEventListeners("visible");}};trackdirect.models.StationCoveragePolygon.prototype.hide=function(stillMarkAsVisible){stillMarkAsVisible=typeof stillMarkAsVisible!=="undefined"?stillMarkAsVisible:false;if(typeof google==="object"&&typeof google.maps==="object"){if(this._polygon!==null){this._polygon.setMap(null);} -if(this._heatmap!==null){this._heatmap.setMap(null);}}else if(typeof L==="object"){if(this._polygon!==null){this._map.removeLayer(this._polygon);} -if(this._heatmap!==null){this._map.removeLayer(this._heatmap);}} -if(!stillMarkAsVisible){this._isRequestedToBeVisible=false;} -this._emitTdEventListeners("hidden");};trackdirect.models.StationCoveragePolygon.prototype._googleMapsInit=function(){if(this._polygonCoordinates!==null&&this._polygonCoordinates.length>0){this._polygon=new google.maps.Polygon({paths:this._polygonCoordinates,strokeColor:"#0000FF",strokeOpacity:0,strokeWeight:0,fillColor:"#0000FF",fillOpacity:0.2,});} -if(this._heatmapCoordinates!==null&&this._heatmapCoordinates.length>0){var data=[];for(var i=0;i<this._heatmapCoordinates.length;i++){data.push({location:this._heatmapCoordinates[i],weight:1});} -this._heatmap=new google.maps.visualization.HeatmapLayer({data:data,radius:8,maxIntensity:5,gradient:["rgba(0, 255, 255, 0)","rgba(0, 255, 255, 1)","rgba(0, 191, 255, 1)","rgba(0, 127, 255, 1)","rgba(0, 63, 255, 1)","rgba(0, 0, 255, 1)","rgba(0, 0, 223, 1)","rgba(0, 0, 191, 1)","rgba(0, 0, 159, 1)","rgba(0, 0, 127, 1)","rgba(63, 0, 91, 1)","rgba(127, 0, 63, 1)","rgba(191, 0, 31, 1)","rgba(255, 0, 0, 1)",],map:null,});}};trackdirect.models.StationCoveragePolygon.prototype._leafletInit=function(){if(this._polygonCoordinates!==null&&this._polygonCoordinates.length>0){this._polygon=new L.polygon(this._polygonCoordinates,{color:"#0000FF",opacity:0,weight:0,fillColor:"#0000FF",fillOpacity:0.2,});} -if(this._heatmapCoordinates!==null&&this._heatmapCoordinates.length>0){var data=[];for(var i=0;i<this._heatmapCoordinates.length;i++){data.push([this._heatmapCoordinates[i].lat,this._heatmapCoordinates[i].lng,10,]);} -this._heatmap=L.heatLayer(this._heatmapCoordinates,{minOpacity:0.35,radius:6,blur:4,});}};trackdirect.models.StationCoveragePolygon.prototype._getConvexHullCoordinates=function(data,maxRange){var positions=this._getFilteredPositions(data,maxRange);positions.push(this._center);var xyPositions=this._convertToXYPos(positions);var convexHullXYPositions=convexhull.makeHull(xyPositions);var latLngPadding=this._paddingInPercentOfMaxRange*0.01*maxRange*0.000009;var latLngPaddingMin=this._paddingMinInMeters*0.000009;if(isNaN(latLngPadding)||latLngPadding<latLngPaddingMin){latLngPadding=latLngPaddingMin;} -var xyPositionsWithPadding=[];for(var i=0;i<convexHullXYPositions.length;i++){xyPositionsWithPadding.push(convexHullXYPositions[i]);for(var angle=0;angle<360;angle+=10){var x=convexHullXYPositions[i]["x"]+ -latLngPadding*Math.cos((angle*Math.PI)/180);var y=convexHullXYPositions[i]["y"]+ -latLngPadding*Math.sin((angle*Math.PI)/180)*2;if(!isNaN(x)&&!isNaN(y)){xyPositionsWithPadding.push({x:x,y:y});}}} -var convexHullXYPositionsWithPadding=convexhull.makeHull(xyPositionsWithPadding);return this._convertToLatLngPos(convexHullXYPositionsWithPadding);};trackdirect.models.StationCoveragePolygon.prototype._getFilteredPositions=function(data,maxRange){var result=[];for(var i=0;i<data.length;i++){if(typeof maxRange!=="undefined"&&data[i].distance>maxRange){continue;} -result.push(data[i].latLngLiteral);} -return result;};trackdirect.models.StationCoveragePolygon.prototype._getCoveragePolygonMaxRange=function(data,percentile){var maxRange=this._getDistancePercentile(data,percentile,this._upperMaxRangeInMeters);if(isNaN(maxRange)){maxRange=0;} -return maxRange;};trackdirect.models.StationCoveragePolygon.prototype._getDistancePercentile=function(data,percentile,upperMaxRange){var values=[];for(var i=0;i<data.length;i++){if(data[i].distance+0<upperMaxRange){values.push(data[i].distance);}} -values.sort(function(a,b){return a-b;});var index=(percentile/100)*values.length;var result;if(Math.floor(index)==index){result=(values[index-1]+values[index])/2;}else{result=values[Math.floor(index)];} -return result;};trackdirect.models.StationCoveragePolygon.prototype._getNumberOfValues=function(data,maxRange){var counter=0;for(var i=0;i<data.length;i++){if(data[i].distance>maxRange){continue;} -counter++;} -return counter;};trackdirect.models.StationCoveragePolygon.prototype._convertToXYPos=function(positions){var result=[];for(var i=0;i<positions.length;i++){result.push({x:positions[i].lat,y:positions[i].lng});} -return result;};trackdirect.models.StationCoveragePolygon.prototype._convertToLatLngPos=function(positions){var result=[];for(var i=0;i<positions.length;i++){result.push({lat:positions[i].x,lng:positions[i].y});} -return result;};trackdirect.models.StationCoveragePolygon.prototype._getCoordinates=function(data){var result=[];for(var j=0;j<data.length;j++){if(typeof google==="object"&&typeof google.maps==="object"){var position=new google.maps.LatLng(parseFloat(data[j]["latitude"]),parseFloat(data[j]["longitude"]));}else{var position={lat:parseFloat(data[j]["latitude"]),lng:parseFloat(data[j]["longitude"]),};} -result.push(position);} -return result;};trackdirect.models.StationCoveragePolygon.prototype._addParametersToData=function(data){for(var j=0;j<data.length;j++){var latLngLiteral={lat:parseFloat(data[j].latitude),lng:parseFloat(data[j].longitude),};data[j].latLngLiteral=latLngLiteral;data[j].angle=trackdirect.services.distanceCalculator.getBearing(this._center,latLngLiteral);}};trackdirect.models.StationCoveragePolygon.prototype._emitTdEventListeners=function(event,arg){if(event in this._tdEventListeners){for(var i=0;i<this._tdEventListeners[event].length;i++){this._tdEventListeners[event][i](arg);}} -if(event in this._tdEventListenersOnce){var eventListenersOnce=this._tdEventListenersOnce[event].splice(0);this._tdEventListenersOnce[event]=[];for(var i=0;i<eventListenersOnce.length;i++){eventListenersOnce[i](arg);}}}; -trackdirect.models.Ruler=function(defaultLength,map){this._map=map;if(typeof google==="object"&&typeof google.maps==="object"){this._googleMapsInit(defaultLength);this._addGoolgeMapsListeners();}else if(typeof L==="object"){this.leafletInit(defaultLength);this._addLeafletListeners();}};trackdirect.models.Ruler.prototype._googleMapsInit=function(defaultLength){this.marker1=new google.maps.Marker({position:trackdirect.services.distanceCalculator.getPositionByDistance(this._map.getCenterLiteral(),270,defaultLength/2),draggable:true,map:this._map,});this.marker2=new google.maps.Marker({position:trackdirect.services.distanceCalculator.getPositionByDistance(this._map.getCenterLiteral(),90,defaultLength/2),draggable:true,map:this._map,});this.marker1.markerLabel=new trackdirect.models.Label({position:this.marker1.getPosition(),text:this._getDistance(this.marker1,this.marker2),},this._map);this.marker1.markerLabel.show();this.marker2.markerLabel=new trackdirect.models.Label({position:this.marker2.getPosition(),text:this._getDistance(this.marker2,this.marker1),},this._map);this.marker2.markerLabel.show();this.line=new google.maps.Polyline({path:[this.marker1.getPosition(),this.marker2.getPosition()],strokeColor:"#ffff00",strokeOpacity:0.7,strokeWeight:6,});this.line.setMap(this._map);};trackdirect.models.Ruler.prototype.leafletInit=function(defaultLength){this.marker1=new L.Marker(trackdirect.services.distanceCalculator.getPositionByDistance(this._map.getCenterLiteral(),270,defaultLength/2),{draggable:true});this.marker1.addTo(this._map);this.marker2=new L.Marker(trackdirect.services.distanceCalculator.getPositionByDistance(this._map.getCenterLiteral(),90,defaultLength/2),{draggable:true});this.marker2.addTo(this._map);this.marker1.markerLabel=new trackdirect.models.Label({position:this.marker1.getLatLng(),text:this._getDistance(this.marker1,this.marker2),},this._map);this.marker1.markerLabel.show();this.marker2.markerLabel=new trackdirect.models.Label({position:this.marker2.getLatLng(),text:this._getDistance(this.marker2,this.marker1),},this._map);this.marker2.markerLabel.show();this.line=new L.Polyline([this.marker1.getLatLng(),this.marker2.getLatLng()],{color:"#ffff00",opacity:0.8,weight:6,});this.line.addTo(this._map);};trackdirect.models.Ruler.prototype.show=function(){this.marker1.markerLabel.show();this.marker2.markerLabel.show();if(typeof google==="object"&&typeof google.maps==="object"){this.marker1.setMap(this._map);this.marker2.setMap(this._map);this.line.setMap(this._map);}else if(typeof L==="object"){this.marker1.addTo(this._map);this.marker2.addTo(this._map);this.line.addTo(this._map);}};trackdirect.models.Ruler.prototype.hide=function(){this.marker1.markerLabel.hide();this.marker2.markerLabel.hide();if(typeof google==="object"&&typeof google.maps==="object"){this.marker1.setMap(null);this.marker2.setMap(null);this.line.setMap(null);}else if(typeof L==="object"){this._map.removeLayer(this.marker1);this._map.removeLayer(this.marker2);this._map.removeLayer(this.line);}};trackdirect.models.Ruler.prototype._addGoolgeMapsListeners=function(){var me=this;google.maps.event.addListener(this.marker1,"drag",function(){me.line.setPath([me.marker1.getPosition(),me.marker2.getPosition()]);me._updateLabels();});google.maps.event.addListener(this.marker2,"drag",function(){me.line.setPath([me.marker1.getPosition(),me.marker2.getPosition()]);me._updateLabels();});};trackdirect.models.Ruler.prototype._addLeafletListeners=function(){var me=this;this.marker1.on("drag",function(e){me.line.setLatLngs([me.marker1.getLatLng(),me.marker2.getLatLng()]);me._updateLabels();});this.marker2.on("drag",function(e){me.line.setLatLngs([me.marker1.getLatLng(),me.marker2.getLatLng()]);me._updateLabels();});};trackdirect.models.Ruler.prototype._updateLabels=function(){this.marker1.markerLabel.hide();this.marker2.markerLabel.hide();if(typeof google==="object"&&typeof google.maps==="object"){this.marker1.markerLabel=new trackdirect.models.Label({position:this.marker1.getPosition(),text:this._getDistance(this.marker1,this.marker2),},this._map);this.marker2.markerLabel=new trackdirect.models.Label({position:this.marker2.getPosition(),text:this._getDistance(this.marker2,this.marker1),},this._map);}else if(typeof L==="object"){this.marker1.markerLabel=new trackdirect.models.Label({position:this.marker1.getLatLng(),text:this._getDistance(this.marker1,this.marker2),},this._map);this.marker2.markerLabel=new trackdirect.models.Label({position:this.marker2.getLatLng(),text:this._getDistance(this.marker2,this.marker1),},this._map);} -this.marker1.markerLabel.show();this.marker2.markerLabel.show();};trackdirect.models.Ruler.prototype._getDistance=function(marker1,marker2){var p1=this._getPositionLiteral(marker1);var p2=this._getPositionLiteral(marker2);var distance=Math.round(trackdirect.services.distanceCalculator.getDistance(p1,p2),0);if(distance>99999){if(this._map.state.useImperialUnit){distance=Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(distance/1000)).toString()+" miles";}else{distance=Math.round(distance/1000).toString()+" km";}}else if(distance>999){if(this._map.state.useImperialUnit){distance=(Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(distance/1000)*10)/10).toString()+" miles";}else{distance=(Math.round(distance/100)/10).toString()+" km";}}else{distance=distance.toString()+" m";} -var bearing=Math.round(trackdirect.services.distanceCalculator.getBearing(p2,p1),0).toString();return bearing+"º "+distance;};trackdirect.models.Ruler.prototype._getPositionLiteral=function(marker){if(typeof google==="object"&&typeof google.maps==="object"){var latLng=marker.getPosition();if(typeof latLng!=="undefined"&&typeof latLng.lat==="function"){return{lat:latLng.lat(),lng:latLng.lng()};}else{return latLng;}}else if(typeof L==="object"){var latLng=marker.getLatLng();if(typeof latLng!=="undefined"){return{lat:latLng.lat,lng:latLng.lng};}else{return latLng;}} -return null;}; -trackdirect.models.RngCircle=function(packet,map,isHalf){this._defaultMap=map;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Circle.call(this,this._getGoogleCircleOptions(packet,isHalf));}else if(typeof L==="object"){var center=packet.getLatLngLiteral();if(L.version<="0.7.7"){var range=this._getCircleRadius(packet,isHalf);L.Circle.call(this,[center.lat,center.lng],range,this._getLeafletCircleOptions(packet,isHalf));}else{L.Circle.call(this,center,this._getLeafletCircleOptions(packet,isHalf));}}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.RngCircle.prototype=Object.create(google.maps.Circle.prototype);}else if(typeof L==="object"){trackdirect.models.RngCircle.prototype=Object.create(L.Circle.prototype);} -trackdirect.models.RngCircle.prototype.constructor=trackdirect.models.RngCircle;trackdirect.models.RngCircle.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}}};trackdirect.models.RngCircle.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}}};trackdirect.models.RngCircle.prototype._getGoogleCircleOptions=function(packet,isHalf){var color=trackdirect.services.stationColorCalculator.getColor(packet);var range=this._getCircleRadius(packet,isHalf);var options={strokeColor:color,strokeOpacity:0.6,strokeWeight:1,fillColor:color,fillOpacity:0.3,map:null,center:packet.getLatLngLiteral(),radius:range*1000,};return options;};trackdirect.models.RngCircle.prototype._getLeafletCircleOptions=function(packet,isHalf){var color=trackdirect.services.stationColorCalculator.getColor(packet);var range=this._getCircleRadius(packet,isHalf);var options={color:color,opacity:0.6,weight:1,fillColor:color,fillOpacity:0.3,radius:range*1000,};return options;};trackdirect.models.RngCircle.prototype._getCircleRadius=function(packet,isHalf){var range=packet.getRNGRange();if(range===null){range=0;} -if(isHalf){range=range/2;} -return range;}; -trackdirect.models.PhgCircle=function(packet,map,isHalf){this._defaultMap=map;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Circle.call(this,this._getGoogleCircleOptions(packet,isHalf));}else if(typeof L==="object"){if(L.version<="0.7.7"){var range=this._getCircleRadius(packet,isHalf);var center=this._getCircleCenter(packet,isHalf);L.Circle.call(this,[center.lat,center.lng],range,this._getLeafletCircleOptions(packet,isHalf));}else{L.Circle.call(this,this._getCircleCenter(packet,isHalf),this._getLeafletCircleOptions(packet,isHalf));}}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.PhgCircle.prototype=Object.create(google.maps.Circle.prototype);}else if(typeof L==="object"){trackdirect.models.PhgCircle.prototype=Object.create(L.Circle.prototype);} -trackdirect.models.PhgCircle.prototype.constructor=trackdirect.models.PhgCircle;trackdirect.models.PhgCircle.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}}};trackdirect.models.PhgCircle.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}}};trackdirect.models.PhgCircle.prototype._getGoogleCircleOptions=function(packet,isHalf){var color=trackdirect.services.stationColorCalculator.getColor(packet);var range=this._getCircleRadius(packet,isHalf);var center=this._getCircleCenter(packet,isHalf);var options={strokeColor:color,strokeOpacity:0.6,strokeWeight:1,fillColor:color,fillOpacity:0.3,map:null,center:center,radius:range,};return options;};trackdirect.models.PhgCircle.prototype._getLeafletCircleOptions=function(packet,isHalf){var color=trackdirect.services.stationColorCalculator.getColor(packet);var range=this._getCircleRadius(packet,isHalf);var options={color:color,opacity:0.6,weight:1,fillColor:color,fillOpacity:0.3,radius:range,};return options;};trackdirect.models.PhgCircle.prototype._getCircleRadius=function(packet,isHalf){var range=packet.getPHGRange();if(range===null){range=0;} -if(isHalf){range=range/2;} -return range;};trackdirect.models.PhgCircle.prototype._getCircleCenter=function(packet,isHalf){var direction=packet.getPhgDirectionDegree();var center=packet.getLatLngLiteral();if(direction!=null){var range=packet.getPHGRange();if(range===null){range=0;} -if(isHalf){range=range/2;} -var distance=(range*2)/3/2;center=trackdirect.services.distanceCalculator.getPositionByDistance(center,direction,distance);} -return center;}; -trackdirect.models.Packet=function(data){this.init();for(var key in data){this[key]=data[key];}};trackdirect.models.Packet.prototype.init=function(){this["altitude"]=null;this["comment"]="";this["course"]=null;this["db"]=null;this["id"]=null;this["latest_phg_timestamp"]=null;this["latest_rng_timestamp"]=null;this["latitude"]=null;this["longitude"]=null;this["map_id"]=null;this["map_sector"]=null;this["marker_counter"]=null;this["marker_id"]=null;this["ogn"]=null;this["overwrite"]=null;this["is_moving"]=1;this["packet_order_id"]=null;this["packet_tail_timestamp"]=null;this["packet_type_id"]=null;this["phg"]=null;this["posambiguity"]=0;this["position_timestamp"]=null;this["raw"]="";this["raw_path"]="";this["realtime"]=0;this["related_map_sectors"]=[];this["reported_timestamp"]=null;this["rng"]=null;this["sender_id"]=null;this["sender_name"]=null;this["source_id"]=null;this["speed"]=null;this["station_id"]=null;this["station_id_path"]=[];this["station_location_path"]=[];this["station_name"]=null;this["station_name_path"]=[];this["symbol"]=null;this["symbol_table"]=null;this["telemetry"]=null;this["timestamp"]=null;this["weather"]=null;};trackdirect.models.Packet.prototype.getStationName=function(){if(this.station_name==this.sender_name){return escapeHtml(this.station_name);}else{return escapeHtml(this.station_name+" ("+this.sender_name+")");}};trackdirect.models.Packet.prototype.getLatLngLiteral=function(){return{lat:parseFloat(this.latitude),lng:parseFloat(this.longitude)};};trackdirect.models.Packet.prototype.hasConfirmedMapId=function(){if([1,2,12].indexOf(this.map_id)>=0){return true;} -return false;};trackdirect.models.Packet.prototype.getOgnAircraftType=function(){if(typeof this.ogn!=="undefined"&&this.ogn!==null){if(typeof this.ogn.ogn_aircraft_type_id!=="undefined"&&this.ogn.ogn_aircraft_type_id!=""){if(this.ogn.ogn_aircraft_type_id==1){return"Glider";}else if(this.ogn.ogn_aircraft_type_id==2){return"Tow Plane";}else if(this.ogn.ogn_aircraft_type_id==3){return"Helicopter";}else if(this.ogn.ogn_aircraft_type_id==4){return"Parachute";}else if(this.ogn.ogn_aircraft_type_id==5){return"Drop Plane";}else if(this.ogn.ogn_aircraft_type_id==6){return"Hang Glider";}else if(this.ogn.ogn_aircraft_type_id==7){return"Para Glider";}else if(this.ogn.ogn_aircraft_type_id==8){return"Powered Aircraft";}else if(this.ogn.ogn_aircraft_type_id==9){return"Jet Aircraft";}else if(this.ogn.ogn_aircraft_type_id==10){return"UFO";}else if(this.ogn.ogn_aircraft_type_id==11){return"Balloon";}else if(this.ogn.ogn_aircraft_type_id==12){return"Airship";}else if(this.ogn.ogn_aircraft_type_id==13){return"UAV";}else if(this.ogn.ogn_aircraft_type_id==14){return"";}else if(this.ogn.ogn_aircraft_type_id==15){return"Static Object";}}} -return null;};trackdirect.models.Packet.prototype.getOgnDdbAircraftType=function(){if(typeof this.ogn_device!=="undefined"&&this.ogn_device!==null){if(typeof this.ogn_device.ddb_aircraft_type!=="undefined"&&this.ogn_device.ddb_aircraft_type!=""){if(this.ogn_device.ddb_aircraft_type==1){return"Glider/Motoglider";}else if(this.ogn_device.ddb_aircraft_type==2){return"Plane";}else if(this.ogn_device.ddb_aircraft_type==3){return"Ultralight";}else if(this.ogn_device.ddb_aircraft_type==4){return"Helicopter";}else if(this.ogn_device.ddb_aircraft_type==5){return"Drone/UAV";}else if(this.ogn_device.ddb_aircraft_type==6){return"Other";}}} -return null;};trackdirect.models.Packet.prototype.getOgnAddressType=function(){if(typeof this.ogn!=="undefined"&&this.ogn!==null){if(typeof this.ogn.ogn_address_type_id!=="undefined"&&this.ogn.ogn_address_type_id!=""){if(this.ogn.ogn_address_type_id==1){return"ICAO";}else if(this.ogn.ogn_address_type_id==2){return"FLARM";}else if(this.ogn.ogn_address_type_id==3){return"OGN";}}} -return null;};trackdirect.models.Packet.prototype.getOgnSenderAddress=function(){if(typeof this.ogn!=="undefined"&&this.ogn!==null){if(typeof this.ogn.ogn_sender_address!=="undefined"&&this.ogn.ogn_sender_address!=""){return this.ogn.ogn_sender_address;}} -return null;};trackdirect.models.Packet.prototype.getOgnRegistration=function(){if(typeof this.ogn_device!=="undefined"&&this.ogn_device!==null){if(typeof this.ogn_device.registration!=="undefined"&&this.ogn_device.registration!=""){return this.ogn_device.registration;}} -return null;};trackdirect.models.Packet.prototype.getOgnCN=function(){if(typeof this.ogn_device!=="undefined"&&this.ogn_device!==null){if(typeof this.ogn_device.cn!=="undefined"&&this.ogn_device.cn!=""){return this.ogn_device.cn;}} -return null;};trackdirect.models.Packet.prototype.getOgnSummary=function(){var senderAddress=this.getOgnSenderAddress();var aircraftType=this.getOgnAircraftType();var ddbAircraftType=this.getOgnDdbAircraftType();var addressType=this.getOgnAddressType();var summary="";if(ddbAircraftType!==null){summary+=ddbAircraftType;}else if(aircraftType!==null){summary+=aircraftType;} -if(senderAddress!==null){if(summary!=""){summary+=" ";} -summary+=senderAddress;if(addressType!==null){summary+=" ("+addressType+")";}} -return summary;};trackdirect.models.Packet.prototype.hasDirectionSupport=function(){if(this.course!==null&&this.speed!==null&&this.speed>0&&this.source_id==1&&this.packet_order_id==1&&this.is_moving==1&&this.hasConfirmedMapId()){var symbolCategory=1;if(this.symbol_table.charCodeAt(0)=="92"){symbolCategory=2;} -if(symbolCategory==1&&trackdirect.settings.primarySymbolWithNoDirectionPolyline.indexOf(parseInt(this.symbol.charCodeAt(0)))>-1){return false;} -if(symbolCategory==2&&trackdirect.settings.alternativeSymbolWithNoDirectionPolyline.indexOf(parseInt(this.symbol.charCodeAt(0)))>-1){return false;} -return true;} -return false;};trackdirect.models.Packet.prototype.getPhg=function(){if(this.phg!==null){if(this.phg==0){return null;}else if(this.phg<10){return"000"+String(this.phg);}else if(this.phg<100){return"00"+String(this.phg);}else if(this.phg<1000){return"0"+String(this.phg);}else{return String(this.phg);}} -return null;};trackdirect.models.Packet.prototype.getRNGRange=function(){if(this.rng!==null){return this.rng;} -return null;};trackdirect.models.Packet.prototype.getPHGRange=function(){if(this.getPhg()!==null){var p=this.getPhgPower();var h=this.getPhgHaat(false);var g=this.getPhgGain();var gain=Math.pow(10,g/10);var range=Math.sqrt(2*h*Math.sqrt((p/10)*(gain/2)));return range/0.000621371192;} -return null;};trackdirect.models.Packet.prototype.getPHGDescription=function(){if(this.getPhg()!==null){var power=this.getPhgPower();var haat=this.getPhgHaat();var gain=this.getPhgGain();var direction=this.getPhgDirection();var description="";if(power!==null){description+="Power "+power+"W";} -if(haat!==null){if(description.length>0){description+=", ";} -description+="Height "+haat+"m";} -if(gain!==null&&direction!==null){if(description.length>0){description+=", ";} -description+="Gain "+gain+"dB "+direction;} -return description;} -return null;};trackdirect.models.Packet.prototype.getPhgPower=function(){if(this.getPhg()!==null){return Math.pow(parseInt(this.getPhg().substring(0,1)),2);} -return null;};trackdirect.models.Packet.prototype.getPhgHaat=function(inMeters){inMeters=typeof inMeters!=="undefined"?inMeters:true;if(this.getPhg()!=null){value=parseInt(this.getPhg().substring(1,2));var haat=10;if(value==1){haat=20;}else if(value>1){haat=10*Math.pow(value,2);} -if(inMeters){return Math.round(haat*0.3048,0);}else{return haat;}} -return null;};trackdirect.models.Packet.prototype.getPhgGain=function(){if(this.getPhg()!=null){return parseInt(this.getPhg().substring(2,3));} -return null;};trackdirect.models.Packet.prototype.getPhgDirection=function(){if(this.getPhg()!=null){switch(parseInt(this.getPhg().substring(3,4))){case 0:return"omni";break;case 1:return"North East";break;case 2:return"East";break;case 3:return"South East";break;case 4:return"South";break;case 5:return"South West";break;case 6:return"West";break;case 7:return"North West";break;case 8:return"North";break;}} -return null;};trackdirect.models.Packet.prototype.getPhgDirectionDegree=function(){if(this.getPhg()!=null){switch(parseInt(this.getPhg().substring(3,4))){case 0:return null;break;case 1:return 45;break;case 2:return 90;break;case 3:return 135;break;case 4:return 180;break;case 5:return 225;break;case 6:return 270;break;case 7:return 315;break;case 8:return 360;break;}} -return null;};trackdirect.models.Packet.prototype.getMarkerDistance=function(marker){var packetLatLng={lat:parseFloat(this.latitude),lng:parseFloat(this.longitude),};var markerPacketLatLng={lat:parseFloat(marker.packet.latitude),lng:parseFloat(marker.packet.longitude),};return trackdirect.services.distanceCalculator.getDistance(packetLatLng,markerPacketLatLng);};trackdirect.models.Packet.prototype.hasSameSymbol=function(marker){if(marker.packet.symbol==this.symbol&&marker.packet.symbol_table==this.symbol_table){return true;} -return false;};trackdirect.models.Packet.prototype.getLinkifiedRawPath=function(){if(typeof this.raw_path!=="undefined"&&this.raw_path!==null&&this.raw_path!==""){var rawPath=escapeHtml(this.raw_path);rawPath="#"+rawPath+"#";for(var i=0;i<this.station_id_path.length;i++){var relatedStationId=this.station_id_path[i];if(typeof this.station_name_path!=="undefined"&&this.station_name_path!==null){var relatedStationName=escapeHtml(this.station_name_path[i]);var relatedStationNameReplacement='<a href="#" onclick="'+ -" var relatedStationLatestPacket = trackdirect._map.markerCollection.getStationLatestPacket("+ -relatedStationId+ -");"+ -" if (relatedStationLatestPacket !== null) {"+ -" trackdirect.focusOnStation("+ -relatedStationId+ -", true);"+ -" } else {"+ -" alert('Can not go to "+ -relatedStationName+ -", station has not been heard for a long time.');"+ -" }"+ -' return false;">'+ -relatedStationName+ -"</a>";rawPath=rawPath.replaceAll("#"+relatedStationName+",","#"+relatedStationNameReplacement+",");rawPath=rawPath.replaceAll("#"+relatedStationName+"*","#"+relatedStationNameReplacement+"*");rawPath=rawPath.replaceAll("#"+relatedStationName+":","#"+relatedStationNameReplacement+":");rawPath=rawPath.replaceAll("#"+relatedStationName+"#","#"+relatedStationNameReplacement+"#");rawPath=rawPath.replaceAll(","+relatedStationName+",",","+relatedStationNameReplacement+",");rawPath=rawPath.replaceAll(","+relatedStationName+"*",","+relatedStationNameReplacement+"*");rawPath=rawPath.replaceAll(","+relatedStationName+":",","+relatedStationNameReplacement+":");rawPath=rawPath.replaceAll(","+relatedStationName+"#",","+relatedStationNameReplacement+"#");}} -rawPath=rawPath.replace(/#+$/,"");rawPath=rawPath.replace(/^#+/,"");var rawPathArray=rawPath.split(",");if(rawPathArray.length>0){var rawPath=rawPathArray[0]+ -" via "+ -rawPathArray.join(",").replace(rawPathArray[0]+",","");} -return rawPath;} -return null;}; -trackdirect.MarkerCreator=function(map){this._map=map;this._currentPacketSequenceStationId=null;};trackdirect.MarkerCreator.prototype.addPacket=function(packet,tryToShowPacket){if(this.isBadPacket(packet)){return null;} -var markerIdKey=this._map.markerCollection.getMarkerIdKey(packet.marker_id);if(this._map.markerCollection.isExistingMarker(markerIdKey)){var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker.packet.is_moving==1&&packet.is_moving!=1){packet.is_moving=1;}}else{if(packet.packet_order_id==2){packet.packet_order_id=3;}} -markerIdKeyToOverwrite=this._getMarkerIdKeyToOverwrite(packet);if(markerIdKeyToOverwrite!==null){this._overwriteMarker(markerIdKeyToOverwrite,markerIdKey);} -if(this._map.markerCollection.isPacketReplacingMarker(packet)){this._replaceMarker(markerIdKey);} -this._setCurrentPacketSequenceStationId(packet);this._convertLostMarkersToGhost(packet);this._connectToPreviousMarker(packet);marker=this._createMarker(packet);this._map.addMarkerToMapSectors(markerIdKey,packet,tryToShowPacket);if(packet.overwrite==1){marker.overwrite=true;} -return markerIdKey;};trackdirect.MarkerCreator.prototype._getMarkerIdKeyToOverwrite=function(packet){var markerIdKey=this._map.markerCollection.getMarkerIdKey(packet.marker_id);if(this._map.markerCollection.isExistingMarker(markerIdKey)){var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker.overwrite==true&&packet.overwrite==0){return markerIdKey;}}else{var prevMarker=this._map.markerCollection.getStationLatestMarker(packet.station_id);if(prevMarker!==null){if(packet.is_moving==0&&packet.station_id==prevMarker.packet.station_id&&packet.timestamp-prevMarker.packet.timestamp>86400&&Math.round(prevMarker.packet.latitude*100000)==Math.round(packet.latitude*100000)&&Math.round(prevMarker.packet.longitude*100000)==Math.round(packet.longitude*100000)&&prevMarker.packet.symbol==packet.symbol&&prevMarker.packet.symbol_table==packet.symbol_table){return prevMarker.markerIdKey;}}} -return null;};trackdirect.MarkerCreator.prototype._replaceMarker=function(markerIdKey){if(this._map.markerCollection.isExistingMarker(markerIdKey)){var marker=this._map.markerCollection.getMarker(markerIdKey);if(this._map.state.isMarkerInfoWindowOpen(marker)){this._map.state.openInfoWindowForMarkerIdKey=markerIdKey;} -marker.hide(0,false,false);marker.stopDirectionPolyline();}};trackdirect.MarkerCreator.prototype._overwriteMarker=function(prevMarkerIdKey,newMarkerIdKey){var prevMarker=this._map.markerCollection.getMarker(prevMarkerIdKey);if(this._map.state.isMarkerInfoWindowOpen(prevMarker)){this._map.state.openInfoWindowForMarkerIdKey=newMarkerIdKey;} -var markerLabel=prevMarker.label;var markerPolyLine=this._map.markerCollection.getMarkerPolyline(prevMarkerIdKey);var markerDotMarkers=this._map.markerCollection.getDotMarkers(prevMarkerIdKey);var markerOriginDashedPolyline=this._map.markerCollection.getMarkerDashedPolyline(prevMarkerIdKey);clearTimeout(prevMarker.toOldTimerId);if(markerDotMarkers!=null){for(var i=0;i<markerDotMarkers.length;i++){clearTimeout(markerDotMarkers[i].toOldTimerId);}} -this._map.markerCollection.resetMarker(prevMarkerIdKey);if(this._map.oms){this._map.oms.removeMarker(prevMarker);} -if(prevMarker!=null&&typeof prevMarker.packet.latitude!="undefined"&&typeof prevMarker.packet.longitude!="undefined"){this._map.markerCollection.removePostionMarkerId(prevMarker.packet.latitude,prevMarker.packet.longitude,prevMarkerIdKey);this._map.showTopLabelOnPosition(prevMarker.packet.latitude,prevMarker.packet.longitude);} -prevMarker.hide(0,false,false);if(markerPolyLine!==null){markerPolyLine.hide();} -if(markerDotMarkers!=null){for(var i=0;i<markerDotMarkers.length;i++){markerDotMarkers[i].hide();}} -if(markerOriginDashedPolyline!==null){markerOriginDashedPolyline.hide();if(typeof markerOriginDashedPolyline.relatedMarkerIdKey!=="undefined"&&markerOriginDashedPolyline.relatedMarkerIdKey!==null){var prevMarker=this._map.markerCollection.getMarker(markerOriginDashedPolyline.relatedMarkerIdKey);if(prevMarker!==null&&typeof prevMarker._relatedMarkerOriginDashedPolyLine!=="undefined"){prevMarker._relatedMarkerOriginDashedPolyLine=null;}}} -prevMarker.hidePHGCircle();prevMarker.hideRNGCircle();if(prevMarker.directionPolyLine!==null){prevMarker.directionPolyLine.stop();}};trackdirect.MarkerCreator.prototype._setCurrentPacketSequenceStationId=function(packet){if(packet.packet_order_id==3){this._currentPacketSequenceStationId=packet.station_id;} -if(packet.packet_order_id==2&&this._currentPacketSequenceStationId===null){this._currentPacketSequenceStationId=packet.station_id;packet.packet_order_id=3;} -if(packet.packet_order_id==1){this._currentPacketSequenceStationId=null;}};trackdirect.MarkerCreator.prototype._createMarker=function(packet){var markerIdKey=this._map.markerCollection.getMarkerIdKey(packet.marker_id);var prevmarker=this._map.markerCollection.getMarker(markerIdKey);this._map.state.currentMarkerZindex+=1;if(packet.packet_order_id==1||packet.is_moving==0){if(prevmarker!==null){if(prevmarker.packet.latitude!=packet.latitude&&prevmarker.packet.longitude!=packet.longitude){this._map.markerCollection.removePostionMarkerId(prevmarker.latitude,prevmarker.longitude,markerIdKey);this._map.showTopLabelOnPosition(prevmarker.latitude,prevmarker.longitude);}} -var marker=new trackdirect.models.Marker(packet,false,this._map);this._addInfoWindowClickListener(marker,true);}else{var marker=new trackdirect.models.Marker(packet,true,this._map);this._map.markerCollection.addDotMarker(markerIdKey,marker);this._addInfoWindowClickListener(marker,false);} -marker.markerIdKey=markerIdKey;if(prevmarker!==null){if(!this._map.markerCollection.isPacketReplacingMarker(packet)){this._extendTail(prevmarker,marker);}else{this._replaceTailMarker(markerIdKey);}} -if(packet.packet_order_id==1){if(packet.hasDirectionSupport()&&packet.hasConfirmedMapId()){marker.directionPolyLine=new trackdirect.models.DirectionPolyline(marker,this._map);}} -this._map.markerCollection.setMarker(markerIdKey,marker);if(!marker.isDotMarker()){this._createMarkerLabel(marker);this._map.showTopLabelOnPosition(packet.latitude,packet.longitude);} -return marker;};trackdirect.MarkerCreator.prototype._addInfoWindowClickListener=function(marker,useOmsIfExists){var me=this;if(useOmsIfExists&&this._map.oms){me._map.oms.addMarker(marker);}else if(typeof google==="object"&&typeof google.maps==="object"){marker.addListener("click",function(){me._map.openMarkerInfoWindow(marker,false);});}else if(typeof L==="object"){marker.on("click",function(){me._map.openMarkerInfoWindow(marker,false);});}};trackdirect.MarkerCreator.prototype._convertToDotMarker=function(markerIdKey,packet){var dotMarker=this._map.markerCollection.getMarker(markerIdKey);if(dotMarker!=null&&dotMarker.showAsMarker){dotMarker.stopDirectionPolyline();if(this._map.state.isMarkerInfoWindowOpen(dotMarker)){this._map.state.openInfoWindowForMarkerIdKey=markerIdKey;} -if(!this._map.state.isFilterMode){if(this._map.getZoom()<trackdirect.settings.minZoomForMarkerPrevPosition){dotMarker.hide();}} -var icon=this._getDotMarkerIcon(packet);dotMarker.setOpacity(1.0);dotMarker.setIcon(icon);if(typeof google==="object"&&typeof google.maps==="object"){dotMarker.setOptions({anchorPoint:null});} -this._map.markerCollection.addDotMarker(markerIdKey,dotMarker);if(this._map.oms){this._map.oms.removeMarker(dotMarker);var me=this;if(typeof google==="object"&&typeof google.maps==="object"){dotMarker.addListener("click",function(){me._map.openMarkerInfoWindow(dotMarker,false);});}else if(typeof L==="object"){dotMarker.on("click",function(){me._map.openMarkerInfoWindow(dotMarker,false);});}} -if(this._map.markerCollection.hasMarkerLabel(markerIdKey)){var markerLabel=this._map.markerCollection.getMarkerLabel(markerIdKey);markerLabel.hide();} -dotMarker.hasLabel=false;dotMarker.showAsMarker=false;}};trackdirect.MarkerCreator.prototype._getDotMarkerIcon=function(packet){var colorId=trackdirect.services.stationColorCalculator.getColorId(packet);if(typeof google==="object"&&typeof google.maps==="object"){var icon={url:trackdirect.settings.baseUrl+ -trackdirect.settings.imagesBaseDir+ -"dotColor"+ -colorId+ -".png",size:new google.maps.Size(12,12),origin:new google.maps.Point(0,0),anchor:new google.maps.Point(6,6),};}else if(typeof L==="object"){var icon=L.icon({iconUrl:trackdirect.settings.baseUrl+ -trackdirect.settings.imagesBaseDir+ -"dotColor"+ -colorId+ -".png",iconSize:[12,12],iconAnchor:[6,6],popupAnchor:[-3,-12],});} -return icon;};trackdirect.MarkerCreator.prototype._removeExistingRelatedMarkerOriginDashedPolyLine=function(prevMarker,newMarkerIdKey){if(typeof prevMarker._relatedMarkerOriginDashedPolyLine!=="undefined"&&prevMarker._relatedMarkerOriginDashedPolyLine!==null){var ownerMarkerIdKey=prevMarker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey;var ownerMarker=this._map.markerCollection.getMarker(ownerMarkerIdKey);var isConfirmedMapId=true;if(ownerMarker!==null&&ownerMarker.packet.map_id!=1&&ownerMarker.packet.map_id!=2&&ownerMarker.packet.map_id!=12){isConfirmedMapId=false;} -if(ownerMarkerIdKey!=newMarkerIdKey&&(!isConfirmedMapId||!this._map.markerCollection.hasDotMarkers(ownerMarkerIdKey))&&ownerMarker.showAsMarker){this._map.markerCollection.resetMarkerDashedPolyline(prevMarker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey);prevMarker._relatedMarkerOriginDashedPolyLine.hide();prevMarker._relatedMarkerOriginDashedPolyLine=null;}}};trackdirect.MarkerCreator.prototype._createMarkerOriginDashedPolyLine=function(prevMarker,packet,newMarkerIdKey){if(this._map.state.getClientTimestamp(prevMarker.packet.timestamp)<=this._map.state.getOldestAllowedPacketTimestamp()){return;} -if(typeof prevMarker._relatedMarkerOriginDashedPolyLine==="undefined"||prevMarker._relatedMarkerOriginDashedPolyLine===null){var color=trackdirect.services.stationColorCalculator.getColor(packet);var newDashedPolyline=new trackdirect.models.DashedTailPolyline(color,this._map);newDashedPolyline.setMarkerIdKey(newMarkerIdKey);newDashedPolyline.setRelatedMarkerIdKey(prevMarker.markerIdKey);newDashedPolyline.addPacket(prevMarker.packet);newDashedPolyline.addPacket(packet);this._map.markerCollection.setMarkerDashedPolyline(newMarkerIdKey,newDashedPolyline);prevMarker._relatedMarkerOriginDashedPolyLine=newDashedPolyline;this._map.addMarkerToMapSectorInterval(newMarkerIdKey,prevMarker.packet.getLatLngLiteral(),packet.getLatLngLiteral());}};trackdirect.MarkerCreator.prototype._convertLostMarkersToGhost=function(newPacket){if(newPacket.packet_order_id!=2&&newPacket.hasConfirmedMapId()&&newPacket.is_moving==1&&this._map.markerCollection.isPacketReplacingMarker(newPacket)==false){if(this._map.markerCollection.hasNonRelatedMovingMarkerId(newPacket)){list=this._map.markerCollection.getStationMarkerIdKeys(newPacket.station_id);for(var markerIdKey in list){var newMarkerIdKey=this._map.markerCollection.getMarkerIdKey(newPacket.marker_id);var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker!==null&&markerIdKey!==newMarkerIdKey&&marker.packet.is_moving==1&&marker.packet.timestamp<=newPacket.timestamp&&marker.packet.hasConfirmedMapId()&&marker.isSingleMovingMarker()){if(this._map.markerCollection.hasRelatedDashedPolyline(marker)){masterMarkerIdKey=this._map.markerCollection.getMarkerMasterMarkerKeyId(markerIdKey);if(masterMarkerIdKey!==markerIdKey&&this._map.markerCollection.isExistingMarker(masterMarkerIdKey)!==null){continue;}else{this._map.markerCollection.resetMarkerDashedPolyline(marker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey);marker._relatedMarkerOriginDashedPolyLine.hide();marker._relatedMarkerOriginDashedPolyLine=null;}} -marker.packet.map_id=9;marker.setOpacity(0.5);marker.hasLabel=false;marker.hideLabel();marker.stopDirectionPolyline();if(!this._map.state.isGhostMarkersVisible){marker.hide();}}}}}};trackdirect.MarkerCreator.prototype._getLatestStationMarkerToConnectTo=function(newPacket,newMarkerIdKey){if(this._map.markerCollection.getStationLatestMovingMarkerIdKey(newPacket.station_id)===newMarkerIdKey){return newMarkerIdKey;} -var latestPrevMarkerIdKey=null;var latestPrevMarkerIdKeyTimestamp=null;var list=this._map.markerCollection.getStationMarkerIdKeys(newPacket.station_id);for(var markerIdKey in list){var marker=this._map.markerCollection.getMarker(markerIdKey);if(marker!==null){if(markerIdKey===newMarkerIdKey){return markerIdKey;}else if(marker.packet.hasConfirmedMapId()&&marker.packet.is_moving==1&&marker.overwrite!==true&&marker.isSingleMovingMarker()==false&&(latestPrevMarkerIdKeyTimestamp===null||latestPrevMarkerIdKeyTimestamp<marker.packet.timestamp)){latestPrevMarkerIdKey=markerIdKey;latestPrevMarkerIdKeyTimestamp=marker.packet.timestamp;}}} -return latestPrevMarkerIdKey;};trackdirect.MarkerCreator.prototype._connectToPreviousMarker=function(newPacket){var newMarkerIdKey=this._map.markerCollection.getMarkerIdKey(newPacket.marker_id);if(newPacket.packet_order_id!=2&&newPacket.is_moving==1&&this._map.markerCollection.isPacketReplacingMarker(newPacket)==false){var latestPrevMarkerIdKey=this._getLatestStationMarkerToConnectTo(newPacket,newMarkerIdKey);var latestPrevMarker=this._map.markerCollection.getMarker(latestPrevMarkerIdKey);if(latestPrevMarker!==null){if(newPacket.hasConfirmedMapId()){latestPrevMarker.stopDirectionPolyline();} -if(latestPrevMarkerIdKey==newMarkerIdKey){if(this._map.markerCollection.hasDashedPolyline(latestPrevMarkerIdKey)&&newPacket.hasConfirmedMapId()){var dashedPolyline=this._map.markerCollection.getMarkerDashedPolyline(latestPrevMarkerIdKey);var latestPrevRelatedMarkerIdKey=dashedPolyline.relatedMarkerIdKey;this._convertToDotMarker(latestPrevRelatedMarkerIdKey,newPacket);} -this._convertToDotMarker(latestPrevMarkerIdKey,newPacket);}else{this._removeExistingRelatedMarkerOriginDashedPolyLine(latestPrevMarker,newMarkerIdKey);this._createMarkerOriginDashedPolyLine(latestPrevMarker,newPacket,newMarkerIdKey);if(newPacket.hasConfirmedMapId()){this._convertToDotMarker(latestPrevMarkerIdKey,newPacket);}}}}};trackdirect.MarkerCreator.prototype._createMarkerLabel=function(marker){var position=marker.packet.getLatLngLiteral();if(this._map.markerCollection.hasMarkerLabel(marker.markerIdKey)){this._map.markerCollection.setMarkerLabelPosition(marker.markerIdKey,position);}else if(marker.packet.packet_order_id==1){if(marker.packet.getOgnRegistration()!=null){labelText=marker.packet.getOgnRegistration();if(marker.packet.getOgnCN()!==null){labelText+=" ["+marker.packet.getOgnCN()+"]";}}else{if(marker.packet.station_name==marker.packet.sender_name){labelText=escapeHtml(marker.packet.station_name);}else{labelText=escapeHtml(marker.packet.station_name)+ -' <span style="font-weight: normal;">('+ -escapeHtml(marker.packet.sender_name)+ -")</span>";} -if(marker.packet.comment){var opIndex=marker.packet.comment.indexOf("OP:");if(opIndex>-1){opStr=marker.packet.comment.substring(opIndex+3).replace(/^\s+/,"")+" ";opStr=opStr.substring(0,opStr.indexOf(" "));if(opStr.length<=10&&opStr.length>0){labelText+=' <span style="font-weight: normal;">['+ -escapeHtml(opStr)+ -"]</span>";}}}} -var markerLabel=new trackdirect.models.Label({position:position,text:labelText,},this._map);this._map.markerCollection.setMarkerLabel(marker.markerIdKey,markerLabel);}};trackdirect.MarkerCreator.prototype._extendTail=function(prevmarker,newmarker){if(this._map.state.getClientTimestamp(newmarker.packet.timestamp)<=this._map.state.getOldestAllowedPacketTimestamp()){return;} -if(this._map.markerCollection.hasPolyline(newmarker.markerIdKey)){var polyline=this._map.markerCollection.getMarkerPolyline(newmarker.markerIdKey);polyline.addMarker(newmarker);}else{if(this._map.state.getClientTimestamp(this._map.markerCollection.getMarker(newmarker.markerIdKey).packet.timestamp)<=this._map.state.getOldestAllowedPacketTimestamp()){return;}else{var color=trackdirect.services.stationColorCalculator.getColor(newmarker.packet);var newTailPolyline=new trackdirect.models.TailPolyline(color,this._map);newTailPolyline.setMarkerIdKey(newmarker.markerIdKey);newTailPolyline.addMarker(prevmarker);newTailPolyline.addMarker(newmarker);this._map.markerCollection.setMarkerPolyline(newmarker.markerIdKey,newTailPolyline);}}};trackdirect.MarkerCreator.prototype._replaceTailMarker=function(markerIdKey){if(this._map.markerCollection.hasPolyline(markerIdKey)){var marker=this._map.markerCollection.getMarker(markerIdKey);var polylines=this._map.markerCollection.getMarkerPolyline(markerIdKey);var latestIndex=polylines.getPath().length-1;if(latestIndex>=0){polylines.getPathItem(latestIndex).marker=marker;}}};trackdirect.MarkerCreator.prototype.isBadPacket=function(packet){if(typeof packet.latitude==="undefined"||typeof packet.longitude==="undefined"||packet.marker_id==null){return true;} -var markerIdKey=this._map.markerCollection.getMarkerIdKey(packet.marker_id);if(this._map.markerCollection.isExistingMarker(markerIdKey)){var marker=this._map.markerCollection.getMarker(markerIdKey);if(packet.packet_order_id==1&&this._currentPacketSequenceStationId==packet.station_id){return false;} -if(packet.db==0){if(this._map.markerCollection.isDuplicate(packet)){return true;}} -if(packet.db==1&&marker.packet.db==1&&marker.packet.source===0&&packet.id===marker.packet.id){return true;} -if(marker.overwrite==true&&packet.overwrite==0){return false;}else{if(marker.packet.timestamp>=packet.timestamp){return true;} -if(marker.packet.reported_timestamp!==null&&packet.reported_timestamp!==null&&Math.abs(marker.packet.reported_timestamp-packet.reported_timestamp)<600){if(marker.packet.reported_timestamp>packet.reported_timestamp){return true;}}}} -if(packet.is_moving==1){var list=this._map.markerCollection.getStationMarkerIdKeys(packet.station_id);for(var relatedMarkerIdKey in list){var relatedMarker=this._map.markerCollection.getMarker(relatedMarkerIdKey);if(relatedMarker!==null&&relatedMarker.overwrite==false&&relatedMarker.packet.timestamp>packet.timestamp){return true;}}} -return false;}; -trackdirect.models.MarkerCollection=function(){this._markerKeys={};this._markers=[];this._stationMarkers={};this._stationLastMovingMarkerIdKey={};this._stationLastMarker={};this._senderLastMarker={};this._positionMarkersIdKeys={};this._dotMarkers=[];this._markerPolyLines=[];this._markerOriginDashedPolyLines=[];this._mapSectorMarkerIdKeys={};this._stationCoverage={};this.resetAllMarkers();};trackdirect.models.MarkerCollection.prototype.getMarkerIdKey=function(markerId){if(!(markerId in this._markerKeys)){this._markers.push(null);this._markerPolyLines.push(null);this._dotMarkers.push(null);this._markerOriginDashedPolyLines.push(null);var markerIdKey=this._markers.length-1;this._markerKeys[markerId]=markerIdKey;return markerIdKey;}else{return this._markerKeys[markerId];}};trackdirect.models.MarkerCollection.prototype.isExistingMarker=function(markerIdKey){if(markerIdKey in this._markers&&this._markers[markerIdKey]!==null){return true;} -return false;};trackdirect.models.MarkerCollection.prototype.setMarker=function(markerIdKey,marker){if(marker!==null&&typeof marker.packet!=="undefined"){var packet=marker.packet;this._markers[markerIdKey]=marker;this._addStationMarkerId(markerIdKey,packet);this._addStationLastMarker(packet,marker);this.addPostionMarkerId(markerIdKey,packet);}};trackdirect.models.MarkerCollection.prototype.getMarker=function(markerIdKey){if(markerIdKey!==null&&markerIdKey in this._markers){return this._markers[markerIdKey];} -return null;};trackdirect.models.MarkerCollection.prototype.getAllMarkers=function(){return this._markers;};trackdirect.models.MarkerCollection.prototype.removeMarker=function(markerIdKey){if(markerIdKey!==null&&markerIdKey in this._markers){this._markers.splice(markerIdKey,1);}};trackdirect.models.MarkerCollection.prototype.getNumberOfMarkers=function(){return this._markers.length;};trackdirect.models.MarkerCollection.prototype.setMarkerLabel=function(markerIdKey,label){if(markerIdKey in this._markers&&this._markers[markerIdKey]!==null){this._markers[markerIdKey].label=label;}};trackdirect.models.MarkerCollection.prototype.getMarkerLabel=function(markerIdKey){if(markerIdKey in this._markers&&this._markers[markerIdKey]!==null){return this._markers[markerIdKey].label;} -return null;};trackdirect.models.MarkerCollection.prototype.hasMarkerLabel=function(markerIdKey){if(markerIdKey in this._markers&&this._markers[markerIdKey]!==null&&this._markers[markerIdKey].label!==null){return true;} -return false;};trackdirect.models.MarkerCollection.prototype.setMarkerLabelPosition=function(markerIdKey,position){if(markerIdKey in this._markers&&this._markers[markerIdKey]!==null&&this._markers[markerIdKey].label!==null){this._markers[markerIdKey].label.position=position;}};trackdirect.models.MarkerCollection.prototype.isDuplicate=function(packet){if(packet.is_moving==0){return false;} -for(var markerIdKey in this.getPositionMarkerIdKeys(packet.latitude,packet.longitude)){var marker=this.getMarker(markerIdKey);if(marker!==null&&marker.packet.station_id==packet.station_id&&marker.packet.symbol==packet.symbol&&marker.packet.symbol_table==packet.symbol_table&&marker.packet.course==packet.course){return true;}} -return false;};trackdirect.models.MarkerCollection.prototype.addDotMarker=function(markerIdKey,dotMarker){if(markerIdKey in this._dotMarkers){if(this._dotMarkers[markerIdKey]===null){this._dotMarkers[markerIdKey]=[];} -this._dotMarkers[markerIdKey].push(dotMarker);}};trackdirect.models.MarkerCollection.prototype.getDotMarkers=function(markerIdKey){if(markerIdKey in this._dotMarkers&&this._dotMarkers[markerIdKey]!==null){return this._dotMarkers[markerIdKey];} -return[];};trackdirect.models.MarkerCollection.prototype.hasDotMarkers=function(markerIdKey){if(markerIdKey in this._dotMarkers&&this._dotMarkers[markerIdKey]!==null&&this._dotMarkers[markerIdKey].length>0){return true;} -return false;};trackdirect.models.MarkerCollection.prototype.addStationCoverage=function(stationId,stationCoveragePolygon){this._stationCoverage[stationId]=stationCoveragePolygon;};trackdirect.models.MarkerCollection.prototype.getStationCoverage=function(stationId){if(stationId in this._stationCoverage&&this._stationCoverage[stationId]!==null){return this._stationCoverage[stationId];} -return null;};trackdirect.models.MarkerCollection.prototype.getStationIdListWithVisibleCoverage=function(){var result=[];for(var stationId in this._stationCoverage){if(this._stationCoverage[stationId].isRequestedToBeVisible()){result.push(stationId);}} -return result;};trackdirect.models.MarkerCollection.prototype.hasCoveragePolygon=function(stationId){if(stationId in this._stationCoverage&&this._stationCoverage[stationId]!==null){return true;} -return false;};trackdirect.models.MarkerCollection.prototype.resetDotMarkers=function(markerIdKey){if(markerIdKey in this._dotMarkers&&this._dotMarkers[markerIdKey]!==null){this._dotMarkers[markerIdKey]=[];}};trackdirect.models.MarkerCollection.prototype.removeOldestDotMarker=function(markerIdKey){if(this.hasDotMarkers(markerIdKey)){latestMarker=this.getMarker(markerIdKey);var latestMarkerIndex=this.getDotMarkerIndex(markerIdKey,latestMarker);var dotMarkers=this.getDotMarkers(markerIdKey);var maxNumberOfPolyLinePoints=dotMarkers.length;if(latestMarkerIndex>-1){maxNumberOfPolyLinePoints=maxNumberOfPolyLinePoints-1;} -var removedItems=this._dotMarkers[markerIdKey].splice(0,1);if(removedItems.length==1){var removedMarker=removedItems[0];removedMarker.hide();if(this.hasPolyline(removedMarker.markerIdKey)){var polyline=this.getMarkerPolyline(removedMarker.markerIdKey);while(polyline.getPathLength()>maxNumberOfPolyLinePoints){polyline.removePathItem(0);}} -removedMarker=null;return true;}} -return false;};trackdirect.models.MarkerCollection.prototype.getDotMarkerIndex=function(markerIdKey,marker){if(!this.hasDotMarkers(markerIdKey)){return-1;} -for(var i=0,len=this._dotMarkers[markerIdKey].length;i<len;i++){var foundMarker=this._dotMarkers[markerIdKey][i];if(foundMarker===null){continue;} -if(typeof marker.packet.id!=="undefined"&&marker.packet.id!==null&&foundMarker.packet.id===marker.packet.id&&foundMarker.packet.map_id===marker.packet.map_id){return i;} -if(foundMarker.packet.station_id===marker.packet.station_id&&foundMarker.packet.timestamp===marker.packet.timestamp&&Math.round(foundMarker.packet.latitude*100000)===Math.round(marker.packet.latitude*100000)&&Math.round(foundMarker.packet.longitude*100000)===Math.round(marker.packet.longitude*100000)&&foundMarker.packet.map_id===marker.packet.map_id){return i;}} -return-1;};trackdirect.models.MarkerCollection.prototype.setMarkerPolyline=function(markerIdKey,polyline){if(markerIdKey in this._markerPolyLines){this._markerPolyLines[markerIdKey]=polyline;}};trackdirect.models.MarkerCollection.prototype.getMarkerPolyline=function(markerIdKey){if(this.hasPolyline(markerIdKey)){return this._markerPolyLines[markerIdKey];} -return null;};trackdirect.models.MarkerCollection.prototype.hasPolyline=function(markerIdKey){if(markerIdKey in this._markerPolyLines&&this._markerPolyLines[markerIdKey]!==null){if(this._markerPolyLines[markerIdKey].getPathLength()>1){return true;}else{this._markerPolyLines[markerIdKey].hide();this._markerPolyLines[markerIdKey]=null;return false;}} -return false;};trackdirect.models.MarkerCollection.prototype.resetMarkerPolyline=function(markerIdKey){if(markerIdKey in this._markerPolyLines){this._markerPolyLines[markerIdKey]=null;}};trackdirect.models.MarkerCollection.prototype.setMarkerDashedPolyline=function(markerIdKey,polyline){if(markerIdKey in this._markerOriginDashedPolyLines){this._markerOriginDashedPolyLines[markerIdKey]=polyline;}};trackdirect.models.MarkerCollection.prototype.getMarkerDashedPolyline=function(markerIdKey){if(this.hasDashedPolyline(markerIdKey)){return this._markerOriginDashedPolyLines[markerIdKey];} -return null;};trackdirect.models.MarkerCollection.prototype.hasDashedPolyline=function(markerIdKey){if(markerIdKey in this._markerOriginDashedPolyLines&&this._markerOriginDashedPolyLines[markerIdKey]!==null){if(this._markerOriginDashedPolyLines[markerIdKey].getPathLength()>1){return true;}else{this._markerOriginDashedPolyLines[markerIdKey].hide();this._markerOriginDashedPolyLines[markerIdKey]=null;return false;}} -return false;};trackdirect.models.MarkerCollection.prototype.resetMarkerDashedPolyline=function(markerIdKey){if(markerIdKey in this._markerOriginDashedPolyLines){this._markerOriginDashedPolyLines[markerIdKey]=null;}};trackdirect.models.MarkerCollection.prototype.getStationLatestPacket=function(stationId){if(typeof this._stationLastMarker[stationId]!=="undefined"&&this._stationLastMarker[stationId]!==null&&typeof this._stationLastMarker[stationId].packet!=="undefined"){return this._stationLastMarker[stationId].packet;}else{return null;}};trackdirect.models.MarkerCollection.prototype.getStationLatestMarker=function(stationId){if(typeof this._stationLastMarker[stationId]!=="undefined"&&this._stationLastMarker[stationId]!==null){return this._stationLastMarker[stationId];}else{return null;}};trackdirect.models.MarkerCollection.prototype.getSenderLatestPacket=function(senderId){if(typeof this._senderLastMarker[senderId]!=="undefined"&&this._senderLastMarker[senderId]!==null&&typeof this._senderLastMarker[senderId].packet!=="undefined"){return this._senderLastMarker[senderId].packet;}else{return null;}};trackdirect.models.MarkerCollection.prototype.getStationLatestMovingMarkerIdKey=function(stationId){if(this._stationLastMovingMarkerIdKey!==null&&typeof this._stationLastMovingMarkerIdKey[stationId]!=="undefined"&&this._stationLastMovingMarkerIdKey[stationId]!==null&&this.isExistingMarker(this._stationLastMovingMarkerIdKey[stationId])){return this._stationLastMovingMarkerIdKey[stationId];} -return null;};trackdirect.models.MarkerCollection.prototype.getMarkerMasterMarkerKeyId=function(markerIdKey){if(this.isExistingMarker(markerIdKey)){var marker=this._markers[markerIdKey];if(this.hasRelatedDashedPolyline(marker)){return this.getMarkerMasterMarkerKeyId(marker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey);}} -return markerIdKey;};trackdirect.models.MarkerCollection.prototype.getStationLatestVisibleMarker=function(stationId){var latestVisibleMarker=null;var latestVisibleMarkerTimestamp=null;for(var markerIdKey in this._stationMarkers[stationId]){var marker=this._markers[markerIdKey];if(typeof marker!=="undefined"&&marker!==null&&typeof marker.getMap()!=="undefined"&&marker.getMap()!==null){if(latestVisibleMarkerTimestamp===null||marker.packet.timestamp>latestVisibleMarkerTimestamp){latestVisibleMarker=marker;latestVisibleMarkerTimestamp=marker.packet.timestamp;}}} -return latestVisibleMarker;};trackdirect.models.MarkerCollection.prototype.getStationMarkerIdKeys=function(stationId){if(stationId in this._stationMarkers){return this._stationMarkers[stationId];} -return{};};trackdirect.models.MarkerCollection.prototype.getPositionMarkerIdKeys=function(latitude,longitude){var key=this._getCompareablePosition(latitude,longitude);if(key in this._positionMarkersIdKeys){return this._positionMarkersIdKeys[key];} -return{};};trackdirect.models.MarkerCollection.prototype.addPostionMarkerId=function(markerIdKey,packet){var key=this._getCompareablePosition(packet.latitude,packet.longitude);if(!(key in this._positionMarkersIdKeys)){this._positionMarkersIdKeys[key]={};} -this._positionMarkersIdKeys[key][markerIdKey]=true;};trackdirect.models.MarkerCollection.prototype.removePostionMarkerId=function(latitude,longitude,markerIdKey){var key=this._getCompareablePosition(latitude,longitude);if(key in this._positionMarkersIdKeys){if(markerIdKey in this._positionMarkersIdKeys[key]){this._positionMarkersIdKeys[key][markerIdKey]=false;}}};trackdirect.models.MarkerCollection.prototype.addMarkerToMapSector=function(markerIdKey,markerMapSector){if(!(markerMapSector in this._mapSectorMarkerIdKeys)){this._mapSectorMarkerIdKeys[markerMapSector]=[];} -if(this._mapSectorMarkerIdKeys[markerMapSector].indexOf(markerIdKey)<0){this._mapSectorMarkerIdKeys[markerMapSector].push(markerIdKey);}};trackdirect.models.MarkerCollection.prototype.getMapSectorMarkerKeys=function(mapSector){if(mapSector in this._mapSectorMarkerIdKeys){return this._mapSectorMarkerIdKeys[mapSector];} -return[];};trackdirect.models.MarkerCollection.prototype.resetAllMarkers=function(){this._markerKeys={};this._markers=[];this._markerPolyLines=[];this._dotMarkers=[];this._markerOriginDashedPolyLines=[];this._stationMarkers={};this._stationLastMovingMarkerIdKey={};this._stationLastMarker={};this._senderLastMarker={};this._positionMarkersIdKeys={};this._mapSectorMarkerIdKeys={};this._stationCoverage={};};trackdirect.models.MarkerCollection.prototype.resetMarker=function(markerIdKey){if(this.isExistingMarker(markerIdKey)){var marker=this._markers[markerIdKey];this._markers[markerIdKey]=null;this._markerPolyLines[markerIdKey]=null;this._dotMarkers[markerIdKey]=null;this._markerOriginDashedPolyLines[markerIdKey]=null;if(typeof marker.packet.latitude!="undefined"&&typeof marker.packet.longitude!="undefined"){this.removePostionMarkerId(marker.packet.latitude,marker.packet.longitude,markerIdKey);}}};trackdirect.models.MarkerCollection.prototype.hasRelatedDashedPolyline=function(marker){if(typeof marker._relatedMarkerOriginDashedPolyLine!=="undefined"&&marker._relatedMarkerOriginDashedPolyLine!==null){return true;} -return false;};trackdirect.models.MarkerCollection.prototype.hasNonRelatedMovingMarkerId=function(packet){var latestStationMovingMarkerIdKey=this.getStationLatestMovingMarkerIdKey(packet.station_id);var newMarkerIdKey=this.getMarkerIdKey(packet.marker_id);if(latestStationMovingMarkerIdKey!==null&&latestStationMovingMarkerIdKey!==newMarkerIdKey){var latestStationMovingMarker=this.getMarker(latestStationMovingMarkerIdKey);if(latestStationMovingMarker.packet.hasConfirmedMapId()){return true;}} -return false;};trackdirect.models.MarkerCollection.prototype.isPacketReplacingMarker=function(packet){var markerIdKey=this.getMarkerIdKey(packet.marker_id);if(this.isExistingMarker(markerIdKey)){var marker=this.getMarker(markerIdKey);if(marker!==null){if(packet.map_id==14){return true;} -if(packet.is_moving==0){return true;} -if([1,2,7,12].indexOf(packet.map_id)<0){return true;}}} -return false;};trackdirect.models.MarkerCollection.prototype._addStationMarkerId=function(markerIdKey,packet){if(!(packet.station_id in this._stationMarkers)){this._stationMarkers[packet.station_id]={};} -this._stationMarkers[packet.station_id][markerIdKey]=true;if(packet.is_moving==1&&packet.hasConfirmedMapId()){this._stationLastMovingMarkerIdKey[packet.station_id]=markerIdKey;}};trackdirect.models.MarkerCollection.prototype._addStationLastMarker=function(packet,marker){if(packet.hasConfirmedMapId()){if(typeof this._stationLastMarker[packet.station_id]==="undefined"||this._stationLastMarker[packet.station_id]===null){this._stationLastMarker[packet.station_id]=marker;if(packet.station_name==packet.sender_name){this._senderLastMarker[packet.sender_id]=marker;}}else if(this._stationLastMarker[packet.station_id].packet.timestamp<=packet.timestamp){this._stationLastMarker[packet.station_id]=marker;if(packet.station_name==packet.sender_name){this._senderLastMarker[packet.sender_id]=marker;}}}};trackdirect.models.MarkerCollection.prototype._getCompareablePosition=function(latitude,longitude){var latCmp=Math.round(latitude*100000);var lngCmp=Math.round(longitude*100000);return String(latCmp)+":"+String(lngCmp);}; -trackdirect.models.Marker=function(packet,isDotMarker,map){this.packet=packet;this._isDotMarker=isDotMarker;this._defaultMap=map;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Marker.call(this,this._getGoogleMarkerOptions());}else if(typeof L==="object"){L.Marker.call(this,this.packet.getLatLngLiteral(),this._getLeafletMarkerOptions());} -this._init();if(typeof google==="object"&&typeof google.maps==="object"){this.setMap(null);}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.Marker.prototype=Object.create(google.maps.Marker.prototype);}else if(typeof L==="object"){trackdirect.models.Marker.prototype=Object.create(L.Marker.prototype);} -trackdirect.models.Marker.prototype.constructor=trackdirect.models.Marker;trackdirect.models.Marker.prototype._init=function(){this._tdEventListeners={};this.hasLabel=false;this.showAsMarker=false;this.overwrite=false;this.markerIdKey=null;this.label=null;this.transmitPolyLine=null;this.directionPolyLine=null;this.phgCircle=null;this.rngCircle=null;this.hideTimerId=null;this.toOldTimerId=null;if(!this._isDotMarker){this.showAsMarker=true;if(this.packet.map_id!=1&&this.packet.map_id!=2&&this.packet.map_id!=12){this.setOpacity(0.5);}else{this.hasLabel=true;}} -if(this._defaultMap.state.endTimeTravelTimestamp===null){this._addMarkerToOldTimeout(0);} -this._addMarkerTooltip();};trackdirect.models.Marker.prototype.addTdListener=function(event,handler){if(!(event in this._tdEventListeners)){this._tdEventListeners[event]=[];} -this._tdEventListeners[event].push(handler);};trackdirect.models.Marker.prototype.isDotMarker=function(){return this._isDotMarker;};trackdirect.models.Marker.prototype.isVisible=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()!=="undefined"&&this.getMap()!==null){return true;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return true;}} -return false;};trackdirect.models.Marker.prototype.getPositionLiteral=function(){if(typeof google==="object"&&typeof google.maps==="object"){var latLng=this.getPosition();if(typeof latLng!=="undefined"&&typeof latLng.lat==="function"){return{lat:latLng.lat(),lng:latLng.lng()};}else{return latLng;}}else if(typeof L==="object"){var latLng=this.getLatLng();if(typeof latLng!=="undefined"){return{lat:latLng.lat,lng:latLng.lng};}else{return latLng;}} -return{};};trackdirect.models.Marker.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}} -if(this.hideTimerId!==null){clearTimeout(this.hideTimerId);} -this._emitTdEventListeners("onshow");};trackdirect.models.Marker.prototype.hide=function(delayInMilliSeconds,onlyHideIfNeeded,hideOpenInfoWindow){delayInMilliSeconds=typeof delayInMilliSeconds!=="undefined"?delayInMilliSeconds:0;onlyHideIfNeeded=typeof onlyHideIfNeeded!=="undefined"?onlyHideIfNeeded:false;hideOpenInfoWindow=typeof hideOpenInfoWindow!=="undefined"?hideOpenInfoWindow:true;if(delayInMilliSeconds>0){this._hideLater(delayInMilliSeconds,onlyHideIfNeeded);return;} -if(onlyHideIfNeeded&&this.shouldMarkerBeVisible()){return;} -if(hideOpenInfoWindow&&this._defaultMap.state.isMarkerInfoWindowOpen(this)){this._defaultMap.state.openInfoWindow.hide();} -if(this.isVisible()){if(typeof google==="object"&&typeof google.maps==="object"){this.setMap(null);}else if(typeof L==="object"){this._defaultMap.removeLayer(this);}} -if(this.showAsMarker){this.hideLabel();} -this.hidePHGCircle();this.hideRNGCircle();if(this.hideTimerId!==null){clearTimeout(this.hideTimerId);} -this._emitTdEventListeners("onhide");};trackdirect.models.Marker.prototype.getDefaultMap=function(){return this._defaultMap;};trackdirect.models.Marker.prototype.getMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){var map=google.maps.Marker.prototype.getMap.call(this);if(typeof map!=="undefined"){return map;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return this._defaultMap;}} -return null;};trackdirect.models.Marker.prototype.getState=function(){return this._defaultMap.state;};trackdirect.models.Marker.prototype.getZIndex=function(){if(typeof google==="object"&&typeof google.maps==="object"){return this.zIndex;}else if(typeof L==="object"){return this.options.zIndexOffset;} -return 0;};trackdirect.models.Marker.prototype.showCompleteMarker=function(){if(this._defaultMap.state.isFilterMode&&this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id)==-1){return;} -if(this.shouldMarkerBeVisible()){if(this.showAsMarker){this.show();} -if(this._defaultMap.state.isFilterMode){this.showMarkerPrevPosition();this.showMarkerTail();this.showLabel();}else{if(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerPrevPosition){this.showMarkerPrevPosition();} -if(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerTail){this.showMarkerTail();} -if(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerLabel){this.showLabel();}} -if(this._defaultMap.state.showPHGCircles==1){this.showPHGCircle(true);}else if(this._defaultMap.state.showPHGCircles==2){this.showPHGCircle(false);} -if(this._defaultMap.state.showRNGCircles==1){this._showRNGCircle(true);}else if(this._defaultMap.state.showRNGCircles==2){this._showRNGCircle(false);}}};trackdirect.models.Marker.prototype.hideCompleteMarker=function(){this.hide();this.hideMarkerPrevPosition();this.hideMarkerTail();};trackdirect.models.Marker.prototype.showMarkerDetails=function(){if(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerPrevPosition){this.showMarkerPrevPosition();} -if(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerTail){this.showMarkerTail();} -if(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerLabel){this.showLabel();}};trackdirect.models.Marker.prototype.hideMarkerDetails=function(){if(this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerPrevPosition){this.hideMarkerPrevPosition();} -if(this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerTail){this.hideMarkerTail();} -if(this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerLabel){this.hideLabel();}};trackdirect.models.Marker.prototype.showLabel=function(){if(!this._defaultMap.state.isFilterMode||this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id)>-1){if(this.isVisible()&&this.label!==null&&(this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerLabel||this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id)>-1)&&this.hasLabel&&this.packet.hasConfirmedMapId()){this.label.show();}}};trackdirect.models.Marker.prototype.hideLabel=function(){if(this.label!==null&&this.hasLabel){this.label.hide();}};trackdirect.models.Marker.prototype.showMarkerPrevPosition=function(){if(this.shouldMarkerBeVisible()&&this.packet.hasConfirmedMapId()){var oldestAllowedPacketTimestamp=this._defaultMap.state.getOldestAllowedPacketTimestamp();var dotMarkers=this._defaultMap.markerCollection.getDotMarkers(this.markerIdKey);for(var i=0;i<dotMarkers.length;i++){var dotMarker=dotMarkers[i];if(this._defaultMap.state.getClientTimestamp(dotMarker.packet.timestamp)>oldestAllowedPacketTimestamp){dotMarker.show();}} -if(!this.showAsMarker){this.show();}}};trackdirect.models.Marker.prototype.hideMarkerPrevPosition=function(){if(this.packet.hasConfirmedMapId()){var dotMarkers=this._defaultMap.markerCollection.getDotMarkers(this.markerIdKey);for(var i=0;i<dotMarkers.length;i++){var dotMarker=dotMarkers[i];dotMarker.hide();} -if(!this.showAsMarker){this.hide();}}};trackdirect.models.Marker.prototype.showMarkerTail=function(){if(this.shouldMarkerBeVisible()){if(this.packet.hasConfirmedMapId()===false&&this._defaultMap.state.showGhostPosition){this.show();} -if(this._defaultMap.markerCollection.hasPolyline(this.markerIdKey)&&this.packet.hasConfirmedMapId()){var polyline=this._defaultMap.markerCollection.getMarkerPolyline(this.markerIdKey);while(this._defaultMap.state.getClientTimestamp(polyline.getPathItem(0).marker.packet.timestamp)<this._defaultMap.state.getOldestAllowedPacketTimestamp()){var relatedMarker=polyline.getPathItem(0).marker;if(relatedMarker.getMap()===null){polyline.removePathItem(0);}else{break;}} -polyline.show();} -var dashedPolyline=this._defaultMap.markerCollection.getMarkerDashedPolyline(this.markerIdKey);if(dashedPolyline!==null&&this.packet.hasConfirmedMapId()){var dashedPolyLineRelatedMarker=this._defaultMap.markerCollection.getMarker(dashedPolyline.relatedMarkerIdKey);if(this._defaultMap.state.getClientTimestamp(dashedPolyLineRelatedMarker.packet.timestamp)>this._defaultMap.state.getOldestAllowedPacketTimestamp()){dashedPolyline.show();if(typeof dashedPolyline.relatedMarkerIdKey!=="undefined"){var relatedMarker=this._defaultMap.markerCollection.getMarker(dashedPolyline.relatedMarkerIdKey);if(relatedMarker!==null&&relatedMarker.markerIdKey!==this.markerIdKey){relatedMarker.showMarkerTail();}}}} -if(this.directionPolyLine!==null){this.directionPolyLine.show();}}};trackdirect.models.Marker.prototype.hideMarkerTail=function(markerIdKey){var latestMarker=this._defaultMap.markerCollection.getStationLatestMarker(this.packet.station_id);if(this._defaultMap.state.isMarkerInfoWindowOpen(this)||this._defaultMap.state.isMarkerInfoWindowOpen(latestMarker)){return;} -if(this.packet.map_id!=1&&this.packet.map_id!=2&&this.packet.map_id!=12){this.hide();if(this.showAsMarker){this.hideLabel();}} -var polyline=this._defaultMap.markerCollection.getMarkerPolyline(this.markerIdKey);if(polyline!==null){if(this._defaultMap.state.isPolylineInfoWindowOpen(polyline)){this._defaultMap.state.openInfoWindow.hide();} -polyline.hide();} -var dashedPolyline=this._defaultMap.markerCollection.getMarkerDashedPolyline(this.markerIdKey);if(dashedPolyline!==null){dashedPolyline.hide();if(typeof dashedPolyline.relatedMarkerIdKey!=="undefined"){var relatedMarker=this._defaultMap.markerCollection.getMarker(dashedPolyline.relatedMarkerIdKey);if(relatedMarker!==null&&relatedMarker.markerIdKey!==this.markerIdKey){relatedMarker.hideMarkerTail();}}} -if(this.directionPolyLine!==null){this.directionPolyLine.hide();}};trackdirect.models.Marker.prototype.hideRNGCircle=function(){if(this.rngCircle!==null){this.rngCircle.hide();}};trackdirect.models.Marker.prototype.showRNGCircle=function(isHalf){this.hideRNGCircle();this.rngCircle=new trackdirect.models.RngCircle(this.packet,this._defaultMap,isHalf);this.rngCircle.show();};trackdirect.models.Marker.prototype.hidePHGCircle=function(){if(this.phgCircle!==null){this.phgCircle.hide();}};trackdirect.models.Marker.prototype.showPHGCircle=function(isHalf){this.hidePHGCircle();this.phgCircle=new trackdirect.models.PhgCircle(this.packet,this._defaultMap,isHalf);this.phgCircle.show();};trackdirect.models.Marker.prototype.markToBeOverWritten=function(){this.overwrite=true;};trackdirect.models.Marker.prototype.isSingleMovingMarker=function(){var markerCounter=0;if(typeof this.packet.marker_counter!=="undefined"&&this.packet.marker_counter!==null){markerCounter=this.packet.marker_counter;} -if(this.packet.position_timestamp==this.packet.timestamp&&this.packet.is_moving==1&&[1,2,7,12].indexOf(this.packet.map_id)>=0&&markerCounter<=1&&!this._defaultMap.markerCollection.hasDotMarkers(this.markerIdKey)){return true;} -return false;};trackdirect.models.Marker.prototype.shouldMarkerBeVisible=function(){if(this.packet.map_id==14){return false;} -if(this.packet.source_id==2&&!this._defaultMap.state.isCwopMarkersVisible){return false;} -if(!this._defaultMap.state.isStationaryMarkersVisible){if(!this.isMovingStation()){return false;}} -if(!this._defaultMap.state.isUnknownMarkersVisible){if(this.packet.station_name.substring(0,7)=="UNKNOWN"){return false;}} -if(!this._defaultMap.state.isOgflymMarkersVisible){if(this.packet.raw_path.indexOf("OGFLYM")>=0){return false;}} -if(!this._defaultMap.state.isInternetMarkersVisible){if(this.packet.raw_path.indexOf("TCPIP")>=0||this.packet.raw_path.indexOf("qAC")>=0||this.packet.raw_path.indexOf("qAX")>=0||this.packet.raw_path.indexOf("qAU")>=0||this.packet.raw_path.indexOf("qAS")>=0){if(this.packet.station_id_path.length==0){return false;}}} -if(this._defaultMap.state.visibleSymbols.length>0){var symbolFound=false;for(var key in this._defaultMap.state.visibleSymbols){var visibleSymbol=this._defaultMap.state.visibleSymbols[key];if(this.packet.symbol.charCodeAt(0)==visibleSymbol[0]&&this.packet.symbol_table.charCodeAt(0)==visibleSymbol[1]){symbolFound=true;}} -if(!symbolFound){return false;}} -if(this.packet.map_id!=1&&this.packet.map_id!=2&&this.packet.map_id!=12&&!this._defaultMap.state.isGhostMarkersVisible){return false;} -if(this._defaultMap.state.isFilterMode&&this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id)>-1){var latestStationMarker=this._defaultMap.markerCollection.getStationLatestMarker(this.packet.station_id);if(this._defaultMap.state.getClientTimestamp(this.packet.timestamp)<=this._defaultMap.state.getOldestAllowedPacketTimestamp()&&typeof latestStationMarker!=="undefined"&&latestStationMarker!==null&&!this._isMarkersEqual(latestStationMarker)){return false;} -return true;}else{if(this._defaultMap.state.isFilterMode&&this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id)===-1){return false;} -if(this.packet.map_id!=1&&this.packet.map_id!=2&&this.packet.map_id!=12&&this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerTail){return false;} -if(this._defaultMap.state.getClientTimestamp(this.packet.timestamp)<=this._defaultMap.state.getOldestAllowedPacketTimestamp()){return false;} -if(this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkers){return false;} -return true;}};trackdirect.models.Marker.prototype.isMovingStation=function(){if(this.packet.is_moving==0){return false;} -if(this._defaultMap.state.getClientTimestamp(this.packet.position_timestamp)<this._defaultMap.state.getOldestAllowedPacketTimestamp()){var stationLatestMovingMarkerIdKey=this._defaultMap.markerCollection.getStationLatestMovingMarkerIdKey(this.packet.station_id);if(stationLatestMovingMarkerIdKey==this.markerIdKey){return false;}} -return true;};trackdirect.models.Marker.prototype.stopDirectionPolyline=function(){if(this.directionPolyLine!==null){this.directionPolyLine.stop();}};trackdirect.models.Marker.prototype.stopToOldTimeout=function(){clearTimeout(this.toOldTimerId);var dotMarkers=this._defaultMap.markerCollection.getDotMarkers(this.markerIdKey);for(var j=0;j<dotMarkers.length;j++){clearTimeout(dotMarkers[j].toOldTimerId);}};trackdirect.models.Marker.prototype.getToolTipContent=function(){var iconUrl=trackdirect.services.symbolPathFinder.getFilePath(this.packet.symbol_table,this.packet.symbol,null,null,null,20,20);var date=new Date(this.packet.timestamp*1000);var positionDate=new Date(this.packet.position_timestamp*1000);var dateString=moment(date).format(trackdirect.settings.dateFormatNoTimeZone);if(this.packet.timestamp>this.packet.position_timestamp){dateString=moment(positionDate).format(trackdirect.settings.dateFormatNoTimeZone)+ -" - "+ -moment(date).format(trackdirect.settings.dateFormatNoTimeZone);} -if(this.packet.getOgnRegistration()!=null){var name=escapeHtml(this.packet.station_name);name+=", ";name+=escapeHtml(this.packet.getOgnRegistration());if(this.packet.getOgnCN()!==null){name+=" ["+escapeHtml(this.packet.getOgnCN())+"]";} -return('<div><img style="float: left; width:20px; height:20px;" src="'+ -iconUrl+ -'" />'+ -'<span style="font-weight: bold; font-family: Helvetica; font-size: 10px; line-height: 22px; margin-left: 5px; margin-right: 25px">'+ -name+ -"</span></div>"+ -'<div style="clear:both; font-family: Helvetica; font-size: 9px;">'+ -dateString+ -"</div>");}else if(this.packet.station_name==this.packet.sender_name){return('<div><img style="float: left; width:20px; height:20px;" src="'+ -iconUrl+ -'" />'+ -'<span style="font-weight: bold; font-family: Helvetica; font-size: 10px; line-height: 22px; margin-left: 5px; margin-right: 25px">'+ -escapeHtml(this.packet.station_name)+ -"</span></div>"+ -'<div style="clear:both; font-family: Helvetica; font-size: 9px;">'+ -dateString+ -"</div>");}else{return('<div><img style="float: left; width:20px; height:20px;" src="'+ -iconUrl+ -'" />'+ -'<span style="font-weight: bold; font-family: Helvetica; font-size: 10px; line-height: 22px; margin-left: 5px; margin-right: 25px">'+ -escapeHtml(this.packet.station_name)+ -"</span></div>"+ -'<div style="clear:both; font-family: Helvetica; font-size: 9px;">Sent by '+ -escapeHtml(this.packet.sender_name)+ -"</div>"+ -'<div style="clear:both; font-family: Helvetica; font-size: 9px;">'+ -dateString+ -"</div>");}};trackdirect.models.Marker.prototype._getGoogleMarkerOptions=function(){var anchorPoint=null;if(this._isDotMarker){var colorId=trackdirect.services.stationColorCalculator.getColorId(this.packet);var iconUrl=trackdirect.settings.baseUrl+ -trackdirect.settings.imagesBaseDir+ -"dotColor"+ -colorId+ -".png";var scaledImageSize=new google.maps.Size(12,12);var imageSize=new google.maps.Size(12,12);var imageAnchor=new google.maps.Point(6,6);var opacity=1.0;}else{var scalePx=24;var sizePx=24;if(this._shouldMarkerSymbolBeScaled()){scalePx=48;} -if(this.packet.course!==null){sizePx=sizePx+7;if(scalePx<sizePx){scalePx=sizePx;}} -var imageSize=new google.maps.Size(scalePx,scalePx);var imageAnchor=new google.maps.Point(Math.floor(scalePx/2),Math.floor(scalePx/2));var scaledImageSize=new google.maps.Size(scalePx,scalePx);var iconUrl=trackdirect.services.symbolPathFinder.getFilePath(this.packet.symbol_table,this.packet.symbol,this.packet.course,sizePx,sizePx,scalePx,scalePx);if(isHighDensity()){imageSize=new google.maps.Size(scalePx*2,scalePx*2);anchorPoint=new google.maps.Point(0,-Math.floor(scalePx/2));iconUrl=trackdirect.services.symbolPathFinder.getFilePath(this.packet.symbol_table,this.packet.symbol,this.packet.course,sizePx,sizePx,scalePx*2,scalePx*2);} -var opacity=1.0;} -return{position:this.packet.getLatLngLiteral(),zIndex:this._defaultMap.state.currentMarkerZindex,icon:{url:iconUrl,size:imageSize,scaledSize:scaledImageSize,origin:new google.maps.Point(0,0),anchor:imageAnchor,},opacity:opacity,anchorPoint:anchorPoint,};};trackdirect.models.Marker.prototype._getLeafletMarkerOptions=function(){if(this._isDotMarker){var colorId=trackdirect.services.stationColorCalculator.getColorId(this.packet);var iconUrl=trackdirect.settings.baseUrl+ -trackdirect.settings.imagesBaseDir+ -"dotColor"+ -colorId+ -".png";var icon=L.icon({iconUrl:iconUrl,iconSize:[12,12],iconAnchor:[6,6],});var opacity=0.8;}else{var scalePx=24;var sizePx=24;if(this._shouldMarkerSymbolBeScaled()){scalePx=48;} -if(this.packet.course!==null){sizePx=sizePx+7;if(scalePx<sizePx){scalePx=sizePx;}} -var iconUrl=trackdirect.services.symbolPathFinder.getFilePath(this.packet.symbol_table,this.packet.symbol,this.packet.course,sizePx,sizePx,scalePx,scalePx);var iconRetinaUrl=trackdirect.services.symbolPathFinder.getFilePath(this.packet.symbol_table,this.packet.symbol,this.packet.course,sizePx,sizePx,scalePx*2,scalePx*2);var icon=L.icon({iconUrl:iconUrl,iconRetinaUrl:iconRetinaUrl,iconSize:[scalePx,scalePx],iconAnchor:[Math.floor(scalePx/2),Math.floor(scalePx/2)],});var opacity=1.0;} -var tooltipTitle="";if(typeof L.tooltip=="undefined"){tooltipTitle=this.packet.station_name;} -return{zIndexOffset:this._defaultMap.state.currentMarkerZindex,icon:icon,opacity:opacity,title:tooltipTitle,};};trackdirect.models.Marker.prototype._shouldMarkerSymbolBeScaled=function(){if(typeof trackdirect.settings.symbolsToScale==="undefined"){return false;} -for(var i=0;i<trackdirect.settings.symbolsToScale.length;i++){var symbol=trackdirect.settings.symbolsToScale[i][0];var symbolTable=trackdirect.settings.symbolsToScale[i][1];if(symbolTable==null&&this.packet.symbol.charCodeAt()==symbol){return true;}else if(this.packet.symbol.charCodeAt()==symbol&&this.packet.symbol_table.charCodeAt()==symbolTable){return true;}} -return false;};trackdirect.models.Marker.prototype._hideLater=function(delayInMilliSeconds,onlyHideIfNeeded){var me=this;this.hideTimerId=window.setTimeout(function(){if(me._defaultMap.state.isMarkerInfoWindowOpen(me)){me.hide(500);}else{if(!me.shouldMarkerBeVisible()){me.hide(0,onlyHideIfNeeded);}}},delayInMilliSeconds);};trackdirect.models.Marker.prototype._addMarkerTooltip=function(){if(typeof google==="object"&&typeof google.maps==="object"){this._addMarkerGoogleMapTooltip();}else if(typeof L==="object"){this._addMarkerLeafletMapTooltip();}};trackdirect.models.Marker.prototype._addMarkerLeafletMapTooltip=function(){if(!trackdirect.isMobile){if(typeof L.tooltip!="undefined"){var tooltip=L.tooltip({direction:"right",noWrap:true,offset:[6,30],className:"leaflet-marker-tooltiptext",});} -var me=this;var isMyTooltipVisible=false;this.on("mouseover",function(e){if(typeof tooltip!=="undefined"){tooltip.setContent(me.getToolTipContent());tooltip.setLatLng(new L.LatLng(me.packet.latitude,me.packet.longitude));tooltip.addTo(me._defaultMap);isMyTooltipVisible=true;} -if(me.transmitPolyLine==null){me.transmitPolyLine=new trackdirect.models.TransmitPolyline(me.packet,me._defaultMap);} -me.transmitPolyLine.show();});this.on("mouseout",function(e){if(me.transmitPolyLine!=null&&me.transmitPolyLine.isVisible()){me.transmitPolyLine.hide(2000);} -if(typeof tooltip!=="undefined"&&isMyTooltipVisible&&me._defaultMap.hasLayer(tooltip)){tooltip.remove();isMyTooltipVisible=false;}});this.on("remove",function(e){if(me.transmitPolyLine!=null&&me.transmitPolyLine.isVisible()){me.transmitPolyLine.hide(0);} -if(typeof tooltip!=="undefined"&&isMyTooltipVisible&&me._defaultMap.hasLayer(tooltip)){tooltip.remove();isMyTooltipVisible=false;}});}};trackdirect.models.Marker.prototype._addMarkerGoogleMapTooltip=function(){if(!trackdirect.isMobile){if(!$("#marker-tooltip").length){var tooltip=$(document.createElement("div"));tooltip.attr("id","marker-tooltip");tooltip.css("display","none");tooltip.css("position","absolute");tooltip.css("margin","15px");tooltip.css("z-index","90");tooltip.css("padding","3px");tooltip.css("opacity","0.95");tooltip.css("filter","alpha(opacity=95)");tooltip.css("-webkit-border-radius","1px");tooltip.css("-moz-border-radius","1px");tooltip.css("border-radius","1px");tooltip.css("-webkit-box-shadow","0px 0px 3px 0px rgba(0,0,0,0.3)");tooltip.css("-moz-box-shadow","0px 0px 3px 0px rgba(0,0,0,0.3)");tooltip.css("box-shadow","0px 0px 3px 0px rgba(0,0,0,0.3)");tooltip.css("background-color","#fff");tooltip.css("background","#ffffff");$("body").append(tooltip);} -var me=this;var isMyTooltipVisible=false;google.maps.event.addListener(this,"mouseover",function(){var point=this._fromGoogleLatLngToPoint(me.getPosition());var mapElementId=this._defaultMap.getMapElementId();$("#marker-tooltip").html(me.getToolTipContent()).css({left:point.x+$("#"+mapElementId).offset().left,top:point.y+$("#"+mapElementId).offset().top,}).show();isMyTooltipVisible=true;if(me.transmitPolyLine==null){me.transmitPolyLine=new trackdirect.models.TransmitPolyline(me.packet,me._defaultMap);} -me.transmitPolyLine.show();});google.maps.event.addListener(this,"mouseout",function(){if(me.transmitPolyLine!=null&&me.transmitPolyLine.isVisible()){me.transmitPolyLine.hide(2000);} -if(isMyTooltipVisible){$("#marker-tooltip").hide();isMyTooltipVisible=false;}});this.addTdListener("onhide",function(){if(me.transmitPolyLine!=null&&me.transmitPolyLine.isVisible()){me.transmitPolyLine.hide(0);} -if(isMyTooltipVisible){$("#marker-tooltip").hide();isMyTooltipVisible=false;}});}};trackdirect.models.Marker.prototype._fromGoogleLatLngToPoint=function(latLng){var topRight=this._defaultMap.getProjection().fromLatLngToPoint(this._defaultMap.getBounds().getNorthEast());var bottomLeft=this._defaultMap.getProjection().fromLatLngToPoint(this._defaultMap.getBounds().getSouthWest());var scale=Math.pow(2,this._defaultMap.getZoom());var worldPoint=this._defaultMap.getProjection().fromLatLngToPoint(latLng);return new google.maps.Point((worldPoint.x-bottomLeft.x)*scale,(worldPoint.y-topRight.y)*scale);};trackdirect.models.Marker.prototype._isMarkersEqual=function(marker2){var marker1=this;if(typeof marker2!=="undefined"&&marker2!==null&&typeof marker1.packet!=="undefined"&&typeof marker2.packet!=="undefined"&&marker1.packet.station_id===marker2.packet.station_id&&marker1.packet.timestamp===marker2.packet.timestamp&&Math.round(marker1.packet.latitude*100000)===Math.round(marker2.packet.latitude*100000)&&Math.round(marker1.packet.longitude*100000)===Math.round(marker2.packet.longitude*100000)&&marker1.packet.map_id===marker2.packet.map_id){return true;}else{return false;}};(trackdirect.models.Marker.prototype._addMarkerToOldTimeout=function(altDelayMilliSeconds){var markerCollection=this._defaultMap.markerCollection;var state=this._defaultMap.state;var delay=(this._defaultMap.state.getClientTimestamp(this.packet.timestamp)- -state.getOldestAllowedPacketTimestamp())*1000;if(altDelayMilliSeconds!==0){delay=altDelayMilliSeconds;} -if(delay<0){delay=10;} -if(typeof this.toOldTimerId!=="undefined"&&this.toOldTimerId!==null){clearTimeout(this.toOldTimerId);} -var me=this;this.toOldTimerId=window.setTimeout(function(){if(me._defaultMap.state.isMarkerInfoWindowOpen(me)){me._addMarkerToOldTimeout(500);}else{var latestStationMarker=markerCollection.getStationLatestMarker(me.packet.station_id);var latestMarker=markerCollection.getMarker(me.markerIdKey);if(!me._isMarkersEqual(latestStationMarker)||state.filterStationIds.indexOf(me.packet.station_id)==-1){if(latestMarker===me){var callback=function(){me.hideCompleteMarker();markerCollection.resetMarkerPolyline(me.markerIdKey);markerCollection.resetDotMarkers(me.markerIdKey);};trackdirect.services.callbackExecutor.add(me,callback,[]);}else if(markerCollection.hasDotMarkers(me.markerIdKey)){var index=markerCollection.getDotMarkerIndex(me.markerIdKey,me);if(index==0){var callback=function(){if(markerCollection.hasDotMarkers(me.markerIdKey)){var success=markerCollection.removeOldestDotMarker(me.markerIdKey);if(!success){me._addMarkerToOldTimeout(500);}}};trackdirect.services.callbackExecutor.add(me,callback,[]);}else if(index>0){var dotMarkers=markerCollection.getDotMarkers(me.markerIdKey);dotMarkers[0]._addMarkerToOldTimeout(0);me._addMarkerToOldTimeout(100);}}}else{me._addMarkerToOldTimeout(1000);}}},delay);}),(trackdirect.models.Marker.prototype._emitTdEventListeners=function(event,arg){if(event in this._tdEventListeners){for(var i=0;i<this._tdEventListeners[event].length;i++){this._tdEventListeners[event][i](arg);}}}); -trackdirect.models.MapState=function(){this._init();};trackdirect.models.MapState.prototype._init=function(){this.isFilterMode=false;this.filterStationIds=[];this.isGhostMarkersVisible=false;this.isCwopMarkersVisible=true;this.isStationaryMarkersVisible=true;this.isInternetMarkersVisible=true;this.isUnknownMarkersVisible=true;this.isOgflymMarkersVisible=true;this.visibleSymbols=[];this.useImperialUnit=false;this.showPHGCircles=0;this.showRNGCircles=0;this.trackStationId=null;this.onlyTrackRecentPackets=false;this.timeLengthInSeconds=3600;this.endTimeTravelTimestamp=null;this.currentMarkerZindex=200;this.serverClientTimestampDiff=0;this.openInfoWindow=null;this.openInfoWindowForMarkerIdKey=null;};trackdirect.models.MapState.prototype.getOldestAllowedPacketTimestamp=function(){var oldestAllowedTimestamp=Math.floor(Date.now()/1000)-this.timeLengthInSeconds;if(this.endTimeTravelTimestamp!==null){oldestAllowedTimestamp=this.endTimeTravelTimestamp-this.timeLengthInSeconds;} -return oldestAllowedTimestamp;};trackdirect.models.MapState.prototype.setTimeLength=function(seconds){this.timeLengthInSeconds=seconds;};trackdirect.models.MapState.prototype.getTimeLength=function(){return this.timeLengthInSeconds;};trackdirect.models.MapState.prototype.getClientTimestamp=function(serverTimestamp){return serverTimestamp-this.serverClientTimestampDiff;};trackdirect.models.MapState.prototype.setServerCurrentTimestamp=function(serverTimestamp){this.serverClientTimestampDiff=serverTimestamp-Math.floor(Date.now()/1000);};trackdirect.models.MapState.prototype.isInfoWindowOpen=function(){if(this.openInfoWindow===null){return false;} -return this.openInfoWindow.isInfoWindowOpen();};trackdirect.models.MapState.prototype.isMarkerInfoWindowOpen=function(marker){if(!this.isInfoWindowOpen()){return false;} -if(this.openInfoWindow.getPolyline()!==null){return false;} -if(this.openInfoWindow.getMarker()===marker){return true;} -return false;};trackdirect.models.MapState.prototype.isPolylineInfoWindowOpen=function(polyline){if(!this.isInfoWindowOpen()){return false;} -if(this.openInfoWindow.getPolyline()===null){return false;} -if(this.openInfoWindow.getPolyline()===polyline){return true;} -return false;};trackdirect.models.MapState.prototype.getFilterStationIds=function(){return this.filterStationIds;};trackdirect.models.MapState.prototype.getTrackStationId=function(){return this.trackStationId;}; -trackdirect.models.Map=function(mapElementId,options){this._init(mapElementId,options);if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Map.call(this,document.getElementById(mapElementId),this._getGoolgeMapOptions());}else if(typeof L==="object"){L.Map.call(this,document.getElementById(mapElementId),this._getLeafletMapOptions());this._updateLeafletTileLayer();L.control.zoom({position:"bottomright",}).addTo(this);} -this._initMap();};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.Map.prototype=Object.create(google.maps.Map.prototype);}else if(typeof L==="object"){trackdirect.models.Map.prototype=Object.create(L.Map.prototype);} -trackdirect.models.Map.prototype.constructor=trackdirect.models.Map;trackdirect.models.Map.prototype._init=function(mapElementId,options){this._mapElementId=mapElementId;this._tdMapOptions=options;this._initBasic();this._initMapTypes();};trackdirect.models.Map.prototype._initBasic=function(){this._tdEventListeners={};this._tdEventTimeout=null;this._currentContentZoom=null;this._visibleMapSectors=[];this._newMarkersToShow=[];this._leafletTileLayer=null;this._heatMap=null;this.markerCollection=new trackdirect.models.MarkerCollection();this.state=new trackdirect.models.MapState();};trackdirect.models.Map.prototype._initMapTypes=function(){this._supportedMapTypes={};if(typeof this._tdMapOptions.supportedMapTypes!=="undefined"&&this._tdMapOptions.supportedMapTypes!==null&&Object.keys(this._tdMapOptions.supportedMapTypes).length>0){this._supportedMapTypes=this._tdMapOptions.supportedMapTypes;}else if(typeof google==="object"&&typeof google.maps==="object"){this._supportedMapTypes["roadmap"]=google.maps.MapTypeId.ROADMAP;this._supportedMapTypes["terrain"]=google.maps.MapTypeId.TERRAIN;this._supportedMapTypes["satellite"]=google.maps.MapTypeId.SATELLITE;this._supportedMapTypes["hybrid"]=google.maps.MapTypeId.HYBRID;}else if(typeof L==="object"){this._supportedMapTypes["roadmap"]="OpenStreetMap.Mapnik";this._supportedMapTypes["terrain"]="OpenTopoMap";} -if(typeof this._tdMapOptions.maptype!=="undefined"&&this._tdMapOptions.maptype!==null&&this._tdMapOptions.maptype in this._supportedMapTypes){this._mapType=this._tdMapOptions.maptype;}else{this._mapType=Object.keys(this._supportedMapTypes)[0];}};trackdirect.models.Map.prototype._initMap=function(){this._heatMap=new trackdirect.models.HeatMap(this);this._setMapInitialLocation();this._initOms();this._initInfoWindowEvent();this._updateMapContent();this._initMapEvents();if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this._tdMapOptions.mid!=="undefined"){var kmlUrl="https://www.google.com/maps/d/u/0/kml?mid="+this._tdMapOptions.mid;var kmlLayer=new google.maps.KmlLayer(kmlUrl,{map:this});}}};trackdirect.models.Map.prototype.triggerResize=function(){if(typeof google==="object"&&typeof google.maps==="object"){google.maps.event.trigger(this,"resize");}else if(typeof L==="object"){L.Map.prototype._onResize.call(this);}};trackdirect.models.Map.prototype.setCenter=function(pos,zoom){if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Map.prototype.setCenter.call(this,pos);if(typeof zoom!=="undefined"){google.maps.Map.prototype.setZoom.call(this,zoom);}}else if(typeof L==="object"){zoom=typeof zoom!=="undefined"?zoom:this.getZoom();L.Map.prototype.setView.call(this,pos,zoom);} -this._renderCordinatesContainer(pos);};trackdirect.models.Map.prototype.getCenterLiteral=function(){if(typeof google==="object"&&typeof google.maps==="object"){var latLng=google.maps.Map.prototype.getCenter.call(this);if(typeof latLng!=="undefined"&&typeof latLng.lat==="function"){return{lat:latLng.lat(),lng:latLng.lng()};}else{return latLng;}}else if(typeof L==="object"){var latLng=L.Map.prototype.getCenter.call(this);if(typeof latLng!=="undefined"){return{lat:latLng.lat,lng:latLng.lng};}else{return latLng;}} -return null;};trackdirect.models.Map.prototype.fitBounds=function(bounds){if(typeof google==="object"&&typeof google.maps==="object"){var latLngBounds=new google.maps.LatLngBounds();for(var i=0;i<bounds.length;i++){latLngBounds.extend(bounds[i]);} -google.maps.Map.prototype.fitBounds.call(this,latLngBounds);}else if(typeof L==="object"){L.Map.prototype.fitBounds.call(this,bounds);}};trackdirect.models.Map.prototype.setCenterByStationId=function(stationId){var latestVisibleMarker=this.markerCollection.getStationLatestVisibleMarker(stationId);if(latestVisibleMarker!==null){this.setCenter(latestVisibleMarker.packet.getLatLngLiteral());}};trackdirect.models.Map.prototype.getMapElementId=function(){return this._mapElementId;};trackdirect.models.Map.prototype.getTdMapOptions=function(){return this._tdMapOptions;};trackdirect.models.Map.prototype.isMapSectorVisible=function(mapSector){if(this._visibleMapSectors.indexOf(mapSector)>=0||this.state.isFilterMode){return true;} -return false;};trackdirect.models.Map.prototype.getNumberOfNewMarkersToShow=function(){return this._newMarkersToShow;};trackdirect.models.Map.prototype.showNewMarkersInQueue=function(track){track=typeof track!=="undefined"?track:true;var oldestAllowedTrackingTimestamp=0;if(this.state.onlyTrackRecentPackets){oldestAllowedTrackingTimestamp=Math.floor(Date.now()/1000)-60;} -while((markerIdKey=this._newMarkersToShow.pop())!=null){if(!this.markerCollection.isExistingMarker(markerIdKey)){continue;} -var marker=this.markerCollection.getMarker(markerIdKey);trackdirect.services.callbackExecutor.addWithPriority(marker,marker.showCompleteMarker,[]);if(track&&marker.packet.packet_order_id==1){if(marker.shouldMarkerBeVisible()&&marker.showAsMarker&&this.state.trackStationId!==null&&this.state.trackStationId==marker.packet.station_id&&this.state.getClientTimestamp(marker.packet.timestamp)>oldestAllowedTrackingTimestamp){trackdirect.services.callbackExecutor.addWithPriority(this,this.setCenterByStationId,[marker.packet.station_id]);}} -if(this.state.openInfoWindowForMarkerIdKey!==null&&this.state.openInfoWindowForMarkerIdKey==markerIdKey&&marker.packet.packet_order_id==1&&marker.shouldMarkerBeVisible()&&marker.showAsMarker){trackdirect.services.callbackExecutor.addWithPriority(this,this.openLatestStationInfoWindow,[marker.packet.station_id]);}} -this.state.openInfoWindowForMarkerIdKey=null;};trackdirect.models.Map.prototype.activateFilteredMode=function(){this.state.isFilterMode=true;this._deactivateHeatMap();this._updateMapContent();};trackdirect.models.Map.prototype.deactivateFilteredMode=function(){if(this.state.isFilterMode){this._activateHeatMap();this.state.isFilterMode=false;this.state.filterStationIds=[];this._updateMapContent();}};trackdirect.models.Map.prototype.getNorthEastLat=function(){if(this.getBounds()!=null){if(typeof google==="object"&&typeof google.maps==="object"){return this.getBounds().getNorthEast().lat();}else if(typeof L==="object"){return this.getBounds().getNorthEast().lat;}} -return 0;};trackdirect.models.Map.prototype.getNorthEastLng=function(){if(this.getBounds()!=null){if(typeof google==="object"&&typeof google.maps==="object"){return this.getBounds().getNorthEast().lng();}else if(typeof L==="object"){return this.getBounds().getNorthEast().lng;}} -return 0;};trackdirect.models.Map.prototype.getSouthWestLat=function(){if(this.getBounds()!=null){if(typeof google==="object"&&typeof google.maps==="object"){return this.getBounds().getSouthWest().lat();}else if(typeof L==="object"){return this.getBounds().getSouthWest().lat;}} -return 0;};trackdirect.models.Map.prototype.getSouthWestLng=function(){if(this.getBounds()!=null){if(typeof google==="object"&&typeof google.maps==="object"){return this.getBounds().getSouthWest().lng();}else if(typeof L==="object"){return this.getBounds().getSouthWest().lng;}} -return 0;};trackdirect.models.Map.prototype.isMapReady=function(){if(this.getBounds()!=null){return true;} -return false;};trackdirect.models.Map.prototype.setMapType=function(mapType){if(mapType in this._supportedMapTypes){this._mapType=mapType;if(typeof google==="object"&&typeof google.maps==="object"){this._updateGoogleMapTileLayer();}else if(typeof L==="object"){this._updateLeafletTileLayer();} -this._emitTdEventListeners("change");}};trackdirect.models.Map.prototype.getMapType=function(){return this._mapType;};trackdirect.models.Map.prototype.getLeafletTileLayer=function(){return this._leafletTileLayer;};trackdirect.models.Map.prototype.getMid=function(){if(typeof this._tdMapOptions.mid!=="undefined"){return this._tdMapOptions.mid;} -return null;};trackdirect.models.Map.prototype.resetAllMarkers=function(){while(this.markerCollection.getNumberOfMarkers()>0){var i=this.markerCollection.getNumberOfMarkers();while(i--){var marker=this.markerCollection.getMarker(i);if(marker!==null){marker.stopToOldTimeout();marker.stopDirectionPolyline();marker.hide();marker.hideMarkerPrevPosition();marker.hideMarkerTail();var stationCoverage=this.markerCollection.getStationCoverage(marker.packet.station_id);if(stationCoverage){stationCoverage.hide();}} -this.markerCollection.removeMarker(i);}} -if(this.state.openInfoWindow!==null){this.state.openInfoWindow.hide();} -if(this.oms){this.oms.clearMarkers();} -this.markerCollection.resetAllMarkers();};trackdirect.models.Map.prototype.openMarkerInfoWindow=function(marker,disableAutoPan){disableAutoPan=typeof disableAutoPan!=="undefined"?disableAutoPan:true;if(marker.getMap()!==null){if(this.state.openInfoWindow!==null&&this.state.openInfoWindow.getMarker().packet.id!=marker.packet.id){this.state.openInfoWindow.hide();} -if(this.state.openInfoWindow!==null&&this.state.openInfoWindow.getMarker().packet.id==marker.packet.id){this.state.openInfoWindow.setMarker(marker);}else{this.state.openInfoWindow=new trackdirect.models.InfoWindow(marker,this,disableAutoPan);} -this._addInfoWindowListeners(this.state.openInfoWindow);this.state.openInfoWindow.show();}};trackdirect.models.Map.prototype.openLatestStationInfoWindow=function(stationId){var latestVisibleMarker=this.markerCollection.getStationLatestVisibleMarker(stationId);if(latestVisibleMarker!==null){this.openMarkerInfoWindow(latestVisibleMarker);}};trackdirect.models.Map.prototype.openPolylineInfoWindow=function(marker,position){if(this.state.openInfoWindow!==null){this.state.openInfoWindow.hide();} -this.state.openInfoWindow=new trackdirect.models.InfoWindow(marker,this);this._addInfoWindowListeners(this.state.openInfoWindow);this.state.openInfoWindow.show(true,position);};trackdirect.models.Map.prototype._addInfoWindowListeners=function(infoWindow){var me=this;infoWindow.addTdListener("station-tail-needed",function(stationId){me._emitTdEventListeners("station-tail-needed",stationId);});};(trackdirect.models.Map.prototype.addTdListener=function(event,handler){if(!(event in this._tdEventListeners)){this._tdEventListeners[event]=[];} -this._tdEventListeners[event].push(handler);}),(trackdirect.models.Map.prototype._emitTdEventListeners=function(event,arg){if(event in this._tdEventListeners){for(var i=0;i<this._tdEventListeners[event].length;i++){this._tdEventListeners[event][i](arg);}}});(trackdirect.models.Map.prototype._triggerMapChangeEvent=function(){if(this._tdEventTimeout!=null){clearTimeout(this._tdEventTimeout);} -var me=this;this._tdEventTimeout=window.setTimeout(function(){me._emitTdEventListeners("change");me._tdEventTimeout=null;},5);}),(trackdirect.models.Map.prototype._deactivateHeatMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.overlayMapTypes!=="undefined"&&this.overlayMapTypes.length>0){this.overlayMapTypes.clear();}}else if(typeof L==="object"){if(this._heatMap!==null){this.removeLayer(this._heatMap);}}});trackdirect.models.Map.prototype._activateHeatMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.overlayMapTypes!=="undefined"&&this.overlayMapTypes.length==0){this.overlayMapTypes.setAt(0,this._heatMap);}}else if(typeof L==="object"){if(this._heatMap!==null){this._heatMap.addTo(this);this._heatMap.bringToFront();this._heatMap.setZIndex(1000);}}};trackdirect.models.Map.prototype._updateGoogleMapTileLayer=function(){this.setMapTypeId(this._supportedMapTypes[this._mapType]);};trackdirect.models.Map.prototype._updateLeafletTileLayer=function(){if(typeof windyInit!=="function"){if(this._leafletTileLayer!==null){this._leafletTileLayer.remove();} -if(typeof L.mapboxGL==="function"){var attribution="";var accessToken="no-token";var style="";if("mapboxGLStyle"in this._tdMapOptions){style=this._tdMapOptions["mapboxGLStyle"];} -if("mapboxGLAccessToken"in this._tdMapOptions){accessToken=this._tdMapOptions["mapboxGLAccessToken"];} -if("mapboxGLAttribution"in this._tdMapOptions){attribution=this._tdMapOptions["mapboxGLAttribution"];} -this._leafletTileLayer=L.mapboxGL({accessToken:accessToken,style:style,});this.addLayer(this._leafletTileLayer);this.attributionControl.addAttribution(attribution);}else{var options={};if(isHighDensity()){options["ppi"]="320";options["size"]="512";}else if(trackdirect.isMobile){options["ppi"]="250";} -this._leafletTileLayer=L.tileLayer.provider(this._supportedMapTypes[this._mapType],options);this.addLayer(this._leafletTileLayer);this._leafletTileLayer.bringToBack();}}};trackdirect.models.Map.prototype._updateMapContent=function(){if(this.getBounds()!=null){var previousVisibleMapSectors=[];for(var i=0;i<this._visibleMapSectors.length;i++){previousVisibleMapSectors.push(this._visibleMapSectors[i]);} -this._visibleMapSectors=trackdirect.services.MapSectorCalculator.getMapSectors(this.getBounds());this._triggerMapChangeEvent();if(!this.state.isFilterMode){if(this.getZoom()<trackdirect.settings.minZoomForMarkers){this.hideAllMarkers();this._activateHeatMap();}else{this._deactivateHeatMap();this._hideMarkersInPreviousVisibleMapSectors(previousVisibleMapSectors);this._showMarkersInNewVisibleMapSectors(previousVisibleMapSectors);if(this._isAnyMarkerDetailsVisible()){this._showVisibleMarkerDetails();} -if(this._isAnyMarkerDetailsHidden()){this._hideVisibleMarkerDetails();}}}} -this._currentContentZoom=this.getZoom();};trackdirect.models.Map.prototype._isAnyMarkerDetailsVisible=function(){var showPrevPosition=this.getZoom()>=trackdirect.settings.minZoomForMarkerPrevPosition&&this._currentContentZoom<trackdirect.settings.minZoomForMarkerPrevPosition;var showMarkerTail=this.getZoom()>=trackdirect.settings.minZoomForMarkerTail&&this._currentContentZoom<trackdirect.settings.minZoomForMarkerTail;var showMarkerLabel=this.getZoom()>=trackdirect.settings.minZoomForMarkerLabel&&this._currentContentZoom<trackdirect.settings.minZoomForMarkerLabel;if(showPrevPosition||showMarkerTail||showMarkerLabel){return true;} -return false;};trackdirect.models.Map.prototype._isAnyMarkerDetailsHidden=function(){var hidePrevPosition=this.getZoom()<trackdirect.settings.minZoomForMarkerPrevPosition&&this._currentContentZoom>=trackdirect.settings.minZoomForMarkerPrevPosition;var hideMarkerTail=this.getZoom()<trackdirect.settings.minZoomForMarkerTail&&this._currentContentZoom>=trackdirect.settings.minZoomForMarkerTail;var hideMarkerLabel=this.getZoom()<trackdirect.settings.minZoomForMarkerLabel&&this._currentContentZoom>=trackdirect.settings.minZoomForMarkerLabel;if(hidePrevPosition||hideMarkerTail||hideMarkerLabel){return true;} -return false;};trackdirect.models.Map.prototype._showVisibleMarkerDetails=function(){for(var i=0;i<this._visibleMapSectors.length;i++){var mapSector=this._visibleMapSectors[i];var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];var marker=this.markerCollection.getMarker(markerIdKey);if(marker===null){continue;} -trackdirect.services.callbackExecutor.addWithPriority(marker,marker.showMarkerDetails,[]);}}};trackdirect.models.Map.prototype._hideVisibleMarkerDetails=function(){for(var i=0;i<this._visibleMapSectors.length;i++){var mapSector=this._visibleMapSectors[i];var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];var marker=this.markerCollection.getMarker(markerIdKey);if(marker===null){continue;} -trackdirect.services.callbackExecutor.addWithPriority(marker,marker.hideMarkerDetails,[]);}}};trackdirect.models.Map.prototype.showHideMarkers=function(){if(this.oms){this.oms.unspiderfy();} -if(this.state.isFilterMode){for(var markerIdKey in this.markerCollection.getAllMarkers()){if(this.markerCollection.isExistingMarker(markerIdKey)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker){if(marker.shouldMarkerBeVisible()){marker.showCompleteMarker();}else{marker.hideCompleteMarker();}} -if(marker.packet){this.showTopLabelOnPosition(marker.packet.latitude,marker.packet.longitude);}}}}else{for(var i=0;i<this._visibleMapSectors.length;i++){var mapSector=this._visibleMapSectors[i];var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];if(this.markerCollection.isExistingMarker(markerIdKey)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker.shouldMarkerBeVisible()){marker.showCompleteMarker();}else{marker.hideCompleteMarker();} -this.showTopLabelOnPosition(marker.packet.latitude,marker.packet.longitude);}}}}};trackdirect.models.Map.prototype.showHidePHGCircles=function(){if(this.getZoom()>=trackdirect.settings.minZoomForMarkers){if(this.state.isFilterMode){for(var markerIdKey in this.markerCollection.getAllMarkers()){if(this.markerCollection.isExistingMarker(markerIdKey)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker.showAsMarker&&marker.packet.phg!=null&&marker.getMap()!==null&&marker.shouldMarkerBeVisible()){if(this.state.showPHGCircles==0){marker.hidePHGCircle();}else if(this.state.showPHGCircles==1){marker.showPHGCircle(true);}else if(this.state.showPHGCircles==2){marker.showPHGCircle(false);}}}}}else{for(var i=0;i<this._visibleMapSectors.length;i++){var mapSector=this._visibleMapSectors[i];var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];if(this.markerCollection.isExistingMarker(markerIdKey)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker.showAsMarker&&marker.packet.phg!=null&&marker.getMap()!==null&&marker.shouldMarkerBeVisible()){if(this.state.showPHGCircles==0){marker.hidePHGCircle();}else if(this.state.showPHGCircles==1){marker.showPHGCircle(true);}else if(this.state.showPHGCircles==2){marker.showPHGCircle(false);}}}}}}}};trackdirect.models.Map.prototype.showHideRNGCircles=function(){if(this.getZoom()>=trackdirect.settings.minZoomForMarkers){if(this.state.isFilterMode){for(var markerIdKey in this.markerCollection.getAllMarkers()){if(this.markerCollection.isExistingMarker(markerIdKey)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker.showAsMarker&&marker.packet.rng!=null&&marker.getMap()!==null&&marker.shouldMarkerBeVisible()){if(this.state.showRNGCircles==0){marker.hideRNGCircle();}else if(this.state.showRNGCircles==1){marker.showRNGCircle(true);}else if(this.state.showRNGCircles==2){marker.showRNGCircle(false);}}}}}else{for(var i=0;i<this._visibleMapSectors.length;i++){var mapSector=this._visibleMapSectors[i];var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];if(this.markerCollection.isExistingMarker(markerIdKey)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker.showAsMarker&&marker.packet.rng!=null&&marker.getMap()!==null&&marker.shouldMarkerBeVisible()){if(this.state.showRNGCircles==0){marker.hideRNGCircle();}else if(this.state.showRNGCircles==1){marker.showRNGCircle(true);}else if(this.state.showRNGCircles==2){marker.showRNGCircle(false);}}}}}}}};trackdirect.models.Map.prototype.hideAllMarkers=function(){for(var markerIdKey in this.markerCollection.getAllMarkers()){var marker=this.markerCollection.getMarker(markerIdKey);if(marker!==null){marker.hideCompleteMarker();}}};trackdirect.models.Map.prototype.showTopLabelOnPosition=function(latitude,longitude){var topMarkerIdKey=-1;var topMarkerZindex=0;if(Object.keys(this.markerCollection.getPositionMarkerIdKeys(latitude,longitude)).length>1){for(var markerIdKey in this.markerCollection.getPositionMarkerIdKeys(latitude,longitude)){var marker=this.markerCollection.getMarker(markerIdKey);if(marker!==null&&marker.shouldMarkerBeVisible()){if(marker.getZIndex()>topMarkerZindex){topMarkerZindex=marker.getZIndex();topMarkerIdKey=markerIdKey;} -marker.hideLabel();marker.hasLabel=false;}} -if(topMarkerIdKey!=-1){var topMarker=this.markerCollection.getMarker(topMarkerIdKey);topMarker.hasLabel=true;var topMarkerMapSector=trackdirect.services.MapSectorCalculator.getMapSector(topMarker.getPositionLiteral().lat,topMarker.getPositionLiteral().lng);if(this.state.isFilterMode){topMarker.showLabel();}else if(this.isMapSectorVisible(topMarkerMapSector)&&this.getZoom()>=trackdirect.settings.minZoomForMarkerLabel){topMarker.showLabel();}}}};trackdirect.models.Map.prototype._hideMarkersInPreviousVisibleMapSectors=function(previousVisibleMapSectors){if(this._currentContentZoom>=trackdirect.settings.minZoomForMarkers){var markerIdKeyListToMaybeHide={};var markerIdKeyListNotToHide={};for(var i=0;i<previousVisibleMapSectors.length;i++){var mapSector=previousVisibleMapSectors[i];if(!this.isMapSectorVisible(mapSector)||this.getZoom()<trackdirect.settings.minZoomForMarkers){var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];markerIdKeyListToMaybeHide[markerIdKey]=markerIdKey;}}else if(this.getZoom()>=trackdirect.settings.minZoomForMarkers){var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];markerIdKeyListNotToHide[markerIdKey]=markerIdKey;}}} -for(var markerIdKey in markerIdKeyListToMaybeHide){if(markerIdKey in markerIdKeyListNotToHide){continue;} -var marker=this.markerCollection.getMarker(markerIdKey);if(marker!==null){trackdirect.services.callbackExecutor.addWithPriority(marker,marker.hideCompleteMarker,[]);}}}};trackdirect.models.Map.prototype._showMarkersInNewVisibleMapSectors=function(previousVisibleMapSectors){if(this.getZoom()>=trackdirect.settings.minZoomForMarkers){for(var i=0;i<this._visibleMapSectors.length;i++){var mapSector=this._visibleMapSectors[i];if(previousVisibleMapSectors.indexOf(mapSector)==-1||this._currentContentZoom<trackdirect.settings.minZoomForMarkers){var mapSectorMarkerKeys=this.markerCollection.getMapSectorMarkerKeys(mapSector);for(var j=0;j<mapSectorMarkerKeys.length;j++){var markerIdKey=mapSectorMarkerKeys[j];var marker=this.markerCollection.getMarker(markerIdKey);if(marker!==null){trackdirect.services.callbackExecutor.addWithPriority(marker,marker.showCompleteMarker,[]);}}}} -var stationIdList=this.markerCollection.getStationIdListWithVisibleCoverage();for(var i=0;i<stationIdList.length;i++){var latestMarker=this.markerCollection.getStationLatestMarker(stationIdList[i]);if(latestMarker!==null){if(latestMarker.shouldMarkerBeVisible()&&latestMarker.showAsMarker){latestMarker.show();}}}}};trackdirect.models.Map.prototype._setMapInitialLocation=function(){var zoom=this._getInitialZoom();if(typeof this._tdMapOptions.initCenter!=="undefined"&&this._tdMapOptions.initCenter!==null){var pos=this._tdMapOptions.initCenter;this.setCenter(pos,zoom);}else{this.setMapDefaultLocation();this.setZoom(zoom);} -this._emitTdEventListeners("change");};trackdirect.models.Map.prototype.setMapDefaultLocation=function(setDefaultZoom){setDefaultZoom=typeof setDefaultZoom!=="undefined"?setDefaultZoom:false;var defaultLatitude=typeof this._tdMapOptions.defaultLatitude!=="undefined"?this._tdMapOptions.defaultLatitude:59.35;var defaultLongitude=typeof this._tdMapOptions.defaultLongitude!=="undefined"?this._tdMapOptions.defaultLongitude:18.05;var pos={lat:parseFloat(defaultLatitude),lng:parseFloat(defaultLongitude),};if(setDefaultZoom){if(trackdirect.isMobile){this.setCenter(pos,trackdirect.settings.defaultCurrentZoomMobile);}else{this.setCenter(pos,trackdirect.settings.defaultCurrentZoom);}}else{this.setCenter(pos);}};trackdirect.models.Map.prototype.addMarkerToMapSectorInterval=function(markerIdKey,startLatLng,endLatLng){var minLat=startLatLng.lat;var maxLat=endLatLng.lat;var minLng=startLatLng.lng;var maxLng=endLatLng.lng;if(endLatLng.lat<minLat){minLat=endLatLng.lat;maxLat=startLatLng.lat;} -if(endLatLng.lng<minLng){minLng=endLatLng.lng;maxLng=startLatLng.lng;} -for(var lat=Math.floor(minLat);lat<=Math.ceil(maxLat);lat++){for(var lng=Math.floor(minLng);lng<=Math.ceil(maxLng);lng++){var markerMapSector=trackdirect.services.MapSectorCalculator.getMapSector(lat,lng);this.markerCollection.addMarkerToMapSector(markerIdKey,markerMapSector);if(this.isMapSectorVisible(markerMapSector)){if(this._newMarkersToShow.indexOf(markerIdKey)<0){this._newMarkersToShow.push(markerIdKey);}}}}};trackdirect.models.Map.prototype.addMarkerToMapSectors=function(markerIdKey,packet,tryToShowPacket){var markerMapSectors=[];markerMapSectors.push(packet.map_sector);if(typeof packet.related_map_sectors!=="undefined"&&packet.related_map_sectors!==null){for(var i=0;i<packet.related_map_sectors.length;i++){markerMapSectors.push(packet.related_map_sectors[i]);}} -for(var i=0;i<markerMapSectors.length;i++){var markerMapSector=markerMapSectors[i];this.markerCollection.addMarkerToMapSector(markerIdKey,markerMapSector);if(tryToShowPacket){if(this.isMapSectorVisible(markerMapSector)){if(this._newMarkersToShow.indexOf(markerIdKey)<0){this._newMarkersToShow.push(markerIdKey);}}}}};trackdirect.models.Map.prototype._initMapEvents=function(){if(typeof google==="object"&&typeof google.maps==="object"){this._initGoogleMapEvents();}else if(typeof L==="object"){this._initLeafletMapEvents();}};trackdirect.models.Map.prototype._initGoogleMapEvents=function(){var me=this;google.maps.event.addListener(this,"mousemove",function(event){me._renderCordinatesContainer(event.latLng);});google.maps.event.addListener(this,"idle",function(){me._updateMapContent();});google.maps.event.addListener(this,"maptypeid_changed",function(){me._updateMapContent();});google.maps.event.addListener(this,"bounds_changed",function(){if(me.isMapReady()){me._emitTdEventListeners("moving");}});};trackdirect.models.Map.prototype._initLeafletMapEvents=function(){var me=this;this.on("mousemove",function(event){me._renderCordinatesContainer(event.latlng);});this.on("moveend",function(){me._updateMapContent();});this.on("move",function(){if(me.isMapReady()){me._emitTdEventListeners("moving");}});};trackdirect.models.Map.prototype._initOms=function(){var options={};options["nearbyDistance"]=12;if(typeof google==="object"&&typeof google.maps==="object"){var mti=google.maps.MapTypeId;this.oms=new OverlappingMarkerSpiderfier(this,options);this.oms.legColors.usual[mti.HYBRID]=this.oms.legColors.usual[mti.SATELLITE]="#fff";this.oms.legColors.usual[mti.TERRAIN]=this.oms.legColors.usual[mti.ROADMAP]="#222";this.oms.legColors.highlighted[mti.HYBRID]=this.oms.legColors.highlighted[mti.SATELLITE]="#f00";this.oms.legColors.highlighted[mti.TERRAIN]=this.oms.legColors.highlighted[mti.ROADMAP]="#f00";}else if(typeof L==="object"){this.oms=new OverlappingMarkerSpiderfier(this,options);}};trackdirect.models.Map.prototype._initInfoWindowEvent=function(){var me=this;if(this.oms){this.oms.addListener("click",function(marker,event){me.openMarkerInfoWindow(marker,false);});}else{}};trackdirect.models.Map.prototype._getGoolgeMapOptions=function(){var zoom=this._getInitialZoom();var mapOptions={zoom:zoom,panControl:false,zoomControl:true,zoomControlOptions:{position:google.maps.ControlPosition.RIGHT_BOTTOM,},mapTypeControl:false,scaleControl:false,streetViewControl:false,overviewMapControl:false,fullscreenControl:false,mapTypeId:google.maps.MapTypeId.ROADMAP,gestureHandling:"greedy",};mapOptions.mapTypeId=this._supportedMapTypes[this._mapType];return mapOptions;};trackdirect.models.Map.prototype._getLeafletMapOptions=function(){var zoom=this._getInitialZoom();var mapOptions={zoom:zoom,zoomControl:true,attributionControl:true,zoomControl:false,minZoom:3,maxZoom:16,closePopupOnClick:false,};return mapOptions;};trackdirect.models.Map.prototype._getInitialZoom=function(){var zoom=trackdirect.settings.defaultCurrentZoom;if(typeof this._tdMapOptions.zoom!=="undefined"&&this._tdMapOptions.zoom!==null){zoom=parseInt(this._tdMapOptions.zoom);}else if(trackdirect.isMobile){zoom=trackdirect.settings.defaultCurrentZoomMobile;} -return zoom;};trackdirect.models.Map.prototype.getCurrentRadiusInKm=function(){if(this.getBounds()!=null){if(typeof google==="object"&&typeof google.maps==="object"){var latLng=this.getBounds().getNorthEast();var latLngLiteral={lat:latLng.lat(),lng:latLng.lng()};}else if(typeof L==="object"){var latLng=this.getBounds().getNorthEast();var latLngLiteral={lat:latLng.lat,lng:latLng.lng};} -return(trackdirect.services.distanceCalculator.getDistance(this.getCenterLiteral(),latLngLiteral)/1000);} -return 0;};trackdirect.models.Map.prototype._renderCordinatesContainer=function(mouseLatLng){var options=this.getTdMapOptions();if(typeof options.cordinatesContainer==="undefined"){return;} -if(options.cordinatesContainer==null){return;} -var lat=null;var lng=null;if(typeof mouseLatLng.lat=="function"){lat=mouseLatLng.lat();lng=mouseLatLng.lng();}else{lat=mouseLatLng.lat;lng=mouseLatLng.lng;} -if(lat<=90&&lat>=-90&&lng<=180&&lng>=-180){var content="";content+=this._getGpsDegreeFromGpsDecimal(lat.toFixed(5),"lat");content+=" "+this._getGpsDegreeFromGpsDecimal(lng.toFixed(5),"lon");content+="<br>"+lat.toFixed(5)+", "+lng.toFixed(5);content+="<br>"+this._getMaidenheadLocatorFromGpsDecimal(lat,lng);$("#"+options.cordinatesContainer).html(content);}};trackdirect.models.Map.prototype._getGpsDegreeFromGpsDecimal=function(dms,type){var sign=1,Abs=0;var days,minutes,secounds,direction;if(dms<0){sign=-1;} -Abs=Math.abs(Math.round(dms*1000000));if(type=="lat"&&Abs>90*1000000){return false;}else if(type=="lon"&&Abs>180*1000000){return false;} -days=Math.floor(Abs/1000000);minutes=Math.floor((Abs/1000000-days)*60);secounds=((Math.floor(((Abs/1000000-days)*60-minutes)*100000)*60)/ -100000).toFixed();days=days*sign;if(type=="lat")direction=days<0?"S":"N";if(type=="lon")direction=days<0?"W":"E";return days*sign+"º "+minutes+"' "+secounds+"'' "+direction;};trackdirect.models.Map.prototype._getMaidenheadLocatorFromGpsDecimal=function(lat,lng,){const chars='ABCDEFGHIJKLMNOPQRSTUVX';var result='';lng=lng+180;lat=lat+90;result=chars.charAt(parseInt(lng/20));result+=chars.charAt(parseInt(lat/10));result+=parseInt(lng/2%10);result+=parseInt(lat%10);lng_r=(lng-parseInt(lng/2)*2)*60;lat_r=(lat-parseInt(lat))*60;result+=chars.charAt(parseInt(lng_r/5));result+=chars.charAt(parseInt(lat_r/2.5));return result;}; -if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.Label=function(options,map){this._defaultMap=map;options.map=null;this.setValues(options);this.div_=null;};trackdirect.models.Label.prototype=new google.maps.OverlayView();trackdirect.models.Label.prototype.show=function(){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}};trackdirect.models.Label.prototype.hide=function(){if(this.getMap()!==null){this.setMap(null);}};trackdirect.models.Label.prototype.onAdd=function(){if(this.div_===null){var jqSpan=$(document.createElement("span"));jqSpan.css("color","#101010");jqSpan.css("text-shadow","1px 1px 1px #FFF, -1px -1px 1px #FFF, 1px -1px 1px #FFF, -1px 1px 1px #FFF, 1px 1px 1px #FFF");jqSpan.css("position","relative");jqSpan.css("top","10px");jqSpan.css("white-space","nowrap");jqSpan.css("font-family","Helvetica");jqSpan.css("font-weight","bold");jqSpan.css("font-size","10px");jqSpan.css("padding","0px");jqSpan.css("z-index","1000");jqSpan.css("margin","0");jqSpan.css("line-height","10px");var span=(this.span_=jqSpan[0]);span.innerHTML=this.get("text").toString();var div=(this.div_=document.createElement("div"));div.appendChild(span);div.style.cssText="position: absolute; display: none";} -var pane=this.getPanes().overlayLayer;pane.appendChild(this.div_);var me=this;this.listeners_=[google.maps.event.addListener(this,"position_changed",function(){me.draw();}),google.maps.event.addListener(this,"text_changed",function(){me.draw();}),];};trackdirect.models.Label.prototype.onRemove=function(){if(this.div_!==null&&this.div_.parentNode!==null){this.div_.parentNode.removeChild(this.div_);for(var i=0,I=this.listeners_.length;i<I;++i){google.maps.event.removeListener(this.listeners_[i]);}}};trackdirect.models.Label.prototype.draw=function(){var projection=this.getProjection();if(typeof this.get("position").lat==="function"){var latLng=new google.maps.LatLng({lat:this.get("position").lat(),lng:this.get("position").lng(),});}else{var latLng=new google.maps.LatLng({lat:this.get("position").lat,lng:this.get("position").lng,});} -var position=projection.fromLatLngToDivPixel(latLng);var div=this.div_;var span=this.span_;span.innerHTML=this.get("text").toString();div.style.left=position.x+"px";div.style.top=position.y+"px";div.style.display="block";};}else if(typeof L==="object"&&typeof L.Tooltip!=="undefined"){trackdirect.models.Label=function(options,map){this._defaultMap=map;L.Tooltip.call(this,this._getBasicOptions(options));this.setContent(options.text);if(typeof options.position!=="undefined"&&typeof options.position.lat!=="undefined"&&typeof options.position.lng!=="undefined"){this.setLatLng(new L.LatLng(options.position.lat,options.position.lng));}};trackdirect.models.Label.prototype=new L.Tooltip();trackdirect.models.Label.prototype.show=function(){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}};trackdirect.models.Label.prototype.hide=function(){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}};trackdirect.models.Label.prototype._getBasicOptions=function(options){return{direction:"right",noWrap:true,offset:L.point(2,10),className:"leaflet-marker-labeltext",permanent:true,};};}else if(typeof L==="object"){trackdirect.models.Label=function(options,map){this._defaultMap=map;var position=null;if(typeof options.position!=="undefined"&&typeof options.position.lat!=="undefined"&&typeof options.position.lng!=="undefined"){position=[options.position.lat,options.position.lng];} -L.Marker.call(this,position,this._getBasicOptions(options));};trackdirect.models.Label.prototype=Object.create(L.Marker.prototype);trackdirect.models.Label.prototype.constructor=trackdirect.models.Label;trackdirect.models.Label.prototype.show=function(){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}};trackdirect.models.Label.prototype.hide=function(){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}};trackdirect.models.Label.prototype._getBasicOptions=function(options){var strlen=options.text.length;var myIcon=L.divIcon({iconSize:new L.Point(strlen*10,20),className:"leaflet-marker-labeltext",html:options.text,iconAnchor:new L.Point(-2,-10),});return{icon:myIcon,clickable:false,keyboard:false,};};}else{trackdirect.models.Label=function(options,map){};trackdirect.models.Label.prototype.show=function(){};trackdirect.models.Label.prototype.hide=function(){};} -trackdirect.models.InfoWindow=function(marker,map,disableAutoPan){disableAutoPan=typeof disableAutoPan!=="undefined"?disableAutoPan:true;this._marker=marker;this._defaultMap=map;this._polyline=null;this._tdEventListeners={};if(typeof google==="object"&&typeof google.maps==="object"){google.maps.InfoWindow.call(this,{disableAutoPan:disableAutoPan,});}else if(typeof L==="object"){var yOffset=2;if(!marker.isDotMarker()){yOffset=-5;} -L.Popup.call(this,{autoPan:!disableAutoPan,offset:[0,yOffset],maxWidth:440,className:"leaflet-infowindow-content",});} -var me=this;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.event.addListener(this,"closeclick",function(){me._hideRelatedMarkerTail();});}else if(typeof L==="object"){this.on("popupclose",function(){me._hideRelatedMarkerTail();});}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.InfoWindow.prototype=Object.create(google.maps.InfoWindow.prototype);}else if(typeof L==="object"){trackdirect.models.InfoWindow.prototype=Object.create(L.Popup.prototype);} -trackdirect.models.InfoWindow.prototype.constructor=trackdirect.models.InfoWindow;trackdirect.models.InfoWindow.prototype.setMarker=function(marker){this._marker=marker;};trackdirect.models.InfoWindow.prototype.getMarker=function(){return this._marker;};trackdirect.models.InfoWindow.prototype.getPolyline=function(){return this._polyline;};trackdirect.models.InfoWindow.prototype.isInfoWindowOpen=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){return true;}}else if(typeof L==="object"&&typeof windyInit==="function"){return this._defaultMap.hasLayer(this);}else if(typeof L==="object"){return this.isOpen();} -return false;};trackdirect.models.InfoWindow.prototype.show=function(compactVersion,position){compactVersion=typeof compactVersion!=="undefined"?compactVersion:false;position=typeof position!=="undefined"?position:null;this._create(compactVersion);if(typeof google==="object"&&typeof google.maps==="object"){if(position!==null){this.setPosition(position);this.open(this._defaultMap);}else{this.open(this._defaultMap,this._marker);} -this.addListener("domready",function(){this._addPhgLinkListeners();this._addRngLinkListeners();});}else if(typeof L==="object"){if(this.isOpen()){this._addPhgLinkListeners();this._addRngLinkListeners();}else{this.on("add",function(){this._addPhgLinkListeners();this._addRngLinkListeners();});} -if(position!==null){this.setLatLng(position);this.openOn(this._defaultMap);}else{this.setLatLng(this._marker.packet.getLatLngLiteral());this.openOn(this._defaultMap);}} -if(this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerTail){if(this._marker.overwrite){this._emitTdEventListeners("station-tail-needed",this._marker.packet.station_id);} -this._marker.showMarkerTail(true);}};trackdirect.models.InfoWindow.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){this.close();if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){this._defaultMap.removeLayer(this);} -this._hideRelatedMarkerTail();if(this._defaultMap.state.openInfoWindow!==null&&this._defaultMap.state.openInfoWindow===this){this._defaultMap.state.openInfoWindow=null;}};(trackdirect.models.InfoWindow.prototype.addTdListener=function(event,handler){if(!(event in this._tdEventListeners)){this._tdEventListeners[event]=[];} -this._tdEventListeners[event].push(handler);}),(trackdirect.models.InfoWindow.prototype._emitTdEventListeners=function(event,arg){if(event in this._tdEventListeners){for(var i=0;i<this._tdEventListeners[event].length;i++){this._tdEventListeners[event][i](arg);}}});trackdirect.models.InfoWindow.prototype._create=function(compactVersion){if(compactVersion){var mainDiv=this._getCompactMainDiv();var menuwrapper=this._getMenuDiv(false);this._polyline=this._defaultMap.markerCollection.getMarkerPolyline(this._marker.markerIdKey);}else{var mainDiv=this._getMainDiv();if(!trackdirect.isMobile){mainDiv.append(this._getIconDiv());} -mainDiv.append(this._getCompletePacketDiv());var menuwrapper=this._getMenuDiv(true);} -mainDiv.append(menuwrapper);var wrapperDiv=$(document.createElement("div"));wrapperDiv.append(mainDiv);if(typeof google==="object"&&typeof google.maps==="object"){this.setContent(wrapperDiv.html());}else if(typeof L==="object"){this.setContent(wrapperDiv.html());}};trackdirect.models.InfoWindow.prototype._hideRelatedMarkerTail=function(){if(this._polyline!==null){if(!this._defaultMap.state.isFilterMode&&this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerTail){var markerIdKey=this._polyline.markerIdKey;if(this._defaultMap.markerCollection.isExistingMarker(markerIdKey)){var stationId=this._defaultMap.markerCollection.getMarker(markerIdKey).packet.station_id;var stationLatestMarker=this._defaultMap.markerCollection.getStationLatestMarker(stationId);if(stationLatestMarker!==null){stationLatestMarker.hideMarkerTail();}}}}else if(this._marker!==null){if(!this._defaultMap.state.isFilterMode&&this._defaultMap.getZoom()<trackdirect.settings.minZoomForMarkerTail){this._marker.hideMarkerTail();}}};trackdirect.models.InfoWindow.prototype._getMainDiv=function(){var mainDiv=$(document.createElement("div"));mainDiv.css("font-family","Verdana,Arial,sans-serif");if(!trackdirect.isMobile){mainDiv.css("font-size","11px");}else{mainDiv.css("font-size","10px");} -mainDiv.css("line-height","1.42857143");mainDiv.css("color","#333");mainDiv.css("text-align","left");return mainDiv;};trackdirect.models.InfoWindow.prototype._getIconDiv=function(){var iconUrl64=trackdirect.services.symbolPathFinder.getFilePath(this._marker.packet.symbol_table,this._marker.packet.symbol,null,null,null,64,64);var iconImg=$(document.createElement("img"));iconImg.css("width","64px");iconImg.css("height","64px");iconImg.attr("src",iconUrl64);iconImg.attr("alt","");iconImg.attr("title","");var leftIconDiv=$(document.createElement("div"));leftIconDiv.css("display","inline-block");leftIconDiv.css("vertical-align","top");leftIconDiv.css("padding-right","15px");leftIconDiv.css("padding-bottom","5px");leftIconDiv.append(iconImg);return leftIconDiv;};trackdirect.models.InfoWindow.prototype._getPacketDiv=function(){var packetDiv=$(document.createElement("div"));packetDiv.css("display","inline-block");packetDiv.css("vertical-align","top");packetDiv.css("max-width","350px");return packetDiv;};trackdirect.models.InfoWindow.prototype._getNameIconDiv=function(){var iconUrl24=trackdirect.services.symbolPathFinder.getFilePath(this._marker.packet.symbol_table,this._marker.packet.symbol,null,null,null,24,24);var iconImg=$(document.createElement("img"));iconImg.css("width","24px");iconImg.css("height","24px");iconImg.css("vertical-align","middle");iconImg.attr("src",iconUrl24);iconImg.attr("alt","symbol");iconImg.attr("title","");return iconImg;};trackdirect.models.InfoWindow.prototype._getNameLink=function(){var nameLink=$(document.createElement("a"));nameLink.css("color","#337ab7");if(trackdirect.isMobile){nameLink.css("vertical-align","-2px");} -nameLink.attr("href","");nameLink.attr("onclick","trackdirect.openStationInformationDialog("+ -this._marker.packet.station_id+ -"); return false;");nameLink.html(escapeHtml(this._marker.packet.station_name));return nameLink;};trackdirect.models.InfoWindow.prototype._getSenderNameLink=function(){var nameLink=$(document.createElement("span"));if(trackdirect.isMobile){nameLink.css("vertical-align","-2px");} -nameLink.html(escapeHtml(this._marker.packet.sender_name));return nameLink;};trackdirect.models.InfoWindow.prototype._getNameDiv=function(){var nameDiv=$(document.createElement("div"));nameDiv.css("clear","both");nameDiv.css("font-size","12px");nameDiv.css("font-weight","bold");if(trackdirect.isMobile){nameDiv.append(this._getNameIconDiv());nameDiv.append(" ");nameDiv.append(" ");} -nameDiv.append(this._getNameLink());if(this._marker.packet.getOgnRegistration()!=null){var name=escapeHtml(this._marker.packet.getOgnRegistration());if(this._marker.packet.getOgnCN()!==null){name+=" ["+escapeHtml(this._marker.packet.getOgnCN())+"]";} -nameDiv.append(", ");nameDiv.append(name);} -if(this._marker.packet.sender_name!=this._marker.packet.station_name){nameDiv.append(" (");nameDiv.append(this._getSenderNameLink());nameDiv.append(")");} -return nameDiv;};trackdirect.models.InfoWindow.prototype._getCompletePacketDiv=function(){var packetDiv=this._getPacketDiv();packetDiv.append(this._getNameDiv());packetDiv.append(this._getPacketTimeDiv());if(this._marker.packet.timestamp>0){if($(window).height()>=300){packetDiv.append(this._getPacketPathDiv());} -var phgRange=this._marker.packet.getPHGRange();var rngRange=this._marker.packet.getRNGRange();if(phgRange!==null||rngRange!==null){packetDiv.append(this._getSpaceDiv());packetDiv.append(this._getPhgDiv(phgRange));packetDiv.append(this._getRngDiv(rngRange));} -if($(window).height()>=300){var transmitDistance=this._getTransmitDistance(this._marker.packet);var tailDistance=this._getTailDistance(this._defaultMap.markerCollection.getMarkerMasterMarkerKeyId(this._marker.markerIdKey));if((transmitDistance!==null&&Math.round(transmitDistance/100)!=0)||(tailDistance!==null&&Math.round(tailDistance)>0)){packetDiv.append(this._getSpaceDiv());packetDiv.append(this._getTransmitDistanceDiv(transmitDistance));packetDiv.append(this._getTailDistanceDiv(tailDistance));}} -if(this._marker.packet.speed!==null||this._marker.packet.course!==null||this._marker.packet.altitude!==null){packetDiv.append(this._getSpaceDiv());packetDiv.append(this._getPacketSpeedAltitudeCourseDiv());} -if(typeof this._marker.packet.weather!=="undefined"&&this._marker.packet.weather!==null){packetDiv.append(this._getSpaceDiv());packetDiv.append(this._getWeatherDiv());} -if(typeof this._marker.packet.latest_telemetry_packet_timestamp!=="undefined"&&this._marker.packet.latest_telemetry_packet_timestamp!==null){packetDiv.append(this._getSpaceDiv());packetDiv.append(this._getTelemetryDiv());} -var commentDiv=this._getPacketCommentDiv();if(commentDiv!=null){packetDiv.append(this._getSpaceDiv());packetDiv.append(commentDiv);}} -return packetDiv;};trackdirect.models.InfoWindow.prototype._getPacketTimeDiv=function(){if(this._marker.packet.timestamp==0){dateString='<span style="color: grey;">No known packet for specified limits.</span>';}else{var date=new Date(this._marker.packet.timestamp*1000);var dateString=moment(date).format(trackdirect.settings.dateFormatNoTimeZone);if(this._marker.packet.timestamp>this._marker.packet.position_timestamp&&!trackdirect.isMobile){var positionDate=new Date(this._marker.packet.position_timestamp*1000);dateString=moment(positionDate).format(trackdirect.settings.dateFormatNoTimeZone)+ -" - "+ -moment(date).format(trackdirect.settings.dateFormatNoTimeZone);} -if(this._defaultMap.state.endTimeTravelTimestamp!==null&&this._marker.packet.map_id==12){dateString+='<br/><span style="color: grey;">(exact time for this is not known)</span>';}} -var timeDiv=$(document.createElement("div"));timeDiv.css("clear","both");timeDiv.html(dateString);return timeDiv;};trackdirect.models.InfoWindow.prototype._getPacketPathDiv=function(){var rawPath=this._marker.packet.getLinkifiedRawPath();if(rawPath!==null){var rawPathDiv=$(document.createElement("div"));rawPathDiv.css("clear","both");rawPathDiv.html("["+rawPath+"]");return rawPathDiv;} -return null;};trackdirect.models.InfoWindow.prototype._getSpaceDiv=function(){var spaceDiv=$(document.createElement("div"));spaceDiv.css("clear","both");spaceDiv.css("line-height","4px");spaceDiv.html(" ");return spaceDiv;};trackdirect.models.InfoWindow.prototype._getPhgDiv=function(phgRange){if(phgRange!==null){if(this._defaultMap.state.useImperialUnit){var phgRange=Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(phgRange/1000)*10)/10;var phgRangeUnit="miles";}else{var phgRange=Math.round(phgRange/10)/100;var phgRangeUnit="km";} -var phgDiv=$(document.createElement("div"));phgDiv.attr("id","phglinks-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id);var halfPhgLink=$("<a style='color: #337ab7;' id='half-phg-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id+ -"' href='#'>Half</a>");var fullPhgLink=$("<a style='color: #337ab7;' id='full-phg-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id+ -"' href='#'>Full</a>");var nonePhgLink=$("<a style='color: #337ab7;' id='none-phg-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id+ -"' href='#'>None</a>");phgDiv.css("clear","both");phgDiv.css("display","none");phgDiv.css("color","#440B2A");phgDiv.append("PHG calculated range: "+phgRange+" "+phgRangeUnit);if(typeof L==="object"&&L.version<="0.7.7"){return phgDiv;} -if(phgRange>0){phgDiv.append("<br/>");phgDiv.append("PHG circle: ");phgDiv.append(fullPhgLink);phgDiv.append('<span style="color:#000"> - </span>');phgDiv.append(halfPhgLink);phgDiv.append('<span style="color:#000"> - </span>');phgDiv.append(nonePhgLink);} -return phgDiv;} -return null;};trackdirect.models.InfoWindow.prototype._getRngDiv=function(rngRange){if(rngRange!==null){if(this._defaultMap.state.useImperialUnit){var rngRange=Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(rngRange/1000)*10)/10;var rngRangeUnit="miles";}else{var rngRange=Math.round(rngRange*100)/100;var rngRangeUnit="km";} -var rngDiv=$(document.createElement("div"));rngDiv.attr("id","rnglinks-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id);var halfRngLink=$("<a style='color: #337ab7;' id='half-rng-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id+ -"' href='#'>Half</a>");var fullRngLink=$("<a style='color: #337ab7;' id='full-rng-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id+ -"' href='#'>Full</a>");var noneRngLink=$("<a style='color: #337ab7;' id='none-rng-"+ -this._marker.packet.station_id+ -"-"+ -this._marker.packet.id+ -"' href='#'>None</a>");rngDiv.css("clear","both");rngDiv.css("display","none");rngDiv.css("color","#440B2A");rngDiv.append("RNG precalculated range: "+rngRange+" "+rngRangeUnit);if(typeof L==="object"&&L.version<="0.7.7"){return rngDiv;} -if(rngRange>0){rngDiv.append("<br/>");rngDiv.append("RNG circle: ");rngDiv.append(fullRngLink);rngDiv.append('<span style="color:#000"> - </span>');rngDiv.append(halfRngLink);rngDiv.append('<span style="color:#000"> - </span>');rngDiv.append(noneRngLink);} -return rngDiv;} -return null;};trackdirect.models.InfoWindow.prototype._getTransmitDistanceDiv=function(transmitDistance){if(transmitDistance!==null&&Math.round(transmitDistance/100)!=0){var transmitDistanceDiv=$(document.createElement("div"));transmitDistanceDiv.css("clear","both");transmitDistanceDiv.css("color","#273c20");if(this._defaultMap.state.useImperialUnit){transmitDistance=Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(transmitDistance/1000)*10)/10;transmitDistanceUnit="miles";}else{transmitDistance=Math.round(transmitDistance/100)/10;transmitDistanceUnit="km";} -transmitDistanceDiv.append('<span title="Transmit distance to receiving digipeater/igate">Transmit distance: '+ -transmitDistance+ -" "+ -transmitDistanceUnit+ -"</span>");return transmitDistanceDiv;} -return null;};trackdirect.models.InfoWindow.prototype._getTailDistanceDiv=function(tailDistance){if(tailDistance!==null&&Math.round(tailDistance)>0){var distanceDiv=$(document.createElement("div"));distanceDiv.css("clear","both");distanceDiv.css("color","#273c20");if(tailDistance<1000){if(this._defaultMap.state.useImperialUnit){tailDistance=Math.round(trackdirect.services.imperialConverter.convertMeterToYard(tailDistance));tailDistanceUnit="yd";}else{tailDistance=Math.round(tailDistance);tailDistanceUnit="m";}}else{if(this._defaultMap.state.useImperialUnit){tailDistance=Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(tailDistance/1000)*10)/10;tailDistanceUnit="miles";}else{tailDistance=Math.round(tailDistance/100)/10;tailDistanceUnit="km";}} -distanceDiv.append('<span title="Current shown tail distance (depends on the time settings)">Current tail distance: '+ -tailDistance+ -" "+ -tailDistanceUnit+ -"</span>");return distanceDiv;} -return null;};trackdirect.models.InfoWindow.prototype._getPacketSpeedAltitudeCourseDiv=function(){if(Math.round(this._marker.packet.speed)!=0||Math.round(this._marker.packet.course)!=0||Math.round(this._marker.packet.altitude)!=0){var speedDiv=$(document.createElement("div"));speedDiv.css("clear","both");speedDiv.css("font-weight","bold");if(this._marker.packet.speed!==null){if(this._defaultMap.state.useImperialUnit){speedDiv.append(Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(this._marker.packet.speed))+" mph ");}else{speedDiv.append(Math.round(this._marker.packet.speed)+" km/h ");}} -if(this._marker.packet.course!==null){speedDiv.append(Math.round(this._marker.packet.course)+"° ");} -if(this._marker.packet.altitude!==null){if(this._defaultMap.state.useImperialUnit){speedDiv.append(" alt "+ -Math.round(trackdirect.services.imperialConverter.convertMeterToFeet(this._marker.packet.altitude))+ -" ft ");}else{speedDiv.append(" alt "+Math.round(this._marker.packet.altitude)+" m ");}} -return speedDiv;} -return null;};trackdirect.models.InfoWindow.prototype._getWeatherDivRainString=function(){if(isNumeric(this._marker.packet.weather.rain_1h)){if(this._defaultMap.state.useImperialUnit){var rain1h="-";if(isNumeric(this._marker.packet.weather.rain_1h)){rain1h=Math.round(trackdirect.services.imperialConverter.convertMmToInch(this._marker.packet.weather.rain_1h))+"in";} -var rain24h="-";if(isNumeric(this._marker.packet.weather.rain_24h)){rain24h=Math.round(trackdirect.services.imperialConverter.convertMmToInch(this._marker.packet.weather.rain_24h))+"in";} -var rainSinceMidnight="-";if(isNumeric(this._marker.packet.weather.rain_since_midnight)){rainSinceMidnight=Math.round(trackdirect.services.imperialConverter.convertMmToInch(this._marker.packet.weather.rain_since_midnight))+"in";}}else{var rain1h="-";if(isNumeric(this._marker.packet.weather.rain_1h)){rain1h=Math.round(this._marker.packet.weather.rain_1h)+"mm";} -var rain24h="-";if(isNumeric(this._marker.packet.weather.rain_24h)){rain24h=Math.round(this._marker.packet.weather.rain_24h)+"mm";} -var rainSinceMidnight="-";if(isNumeric(this._marker.packet.weather.rain_since_midnight)){rainSinceMidnight=Math.round(this._marker.packet.weather.rain_since_midnight)+"mm";}} -return("<b>Rain</b> "+ -rain1h+ -"/"+ -rain24h+ -"/"+ -rainSinceMidnight+ -" (1h/24h/midnight)<br/>");} -return null;};trackdirect.models.InfoWindow.prototype._getWeatherDivTemperatureString=function(){if(isNumeric(this._marker.packet.weather.temperature)){if(this._defaultMap.state.useImperialUnit){return("<b>Temperature</b> "+ -Math.round(trackdirect.services.imperialConverter.convertCelciusToFahrenheit(this._marker.packet.weather.temperature))+ -"°F"+ -"<br/>");}else{return("<b>Temperature</b> "+ -Math.round(this._marker.packet.weather.temperature)+ -"°C"+ -"<br/>");}} -return null;};trackdirect.models.InfoWindow.prototype._getWeatherDivHumidityString=function(){if(isNumeric(this._marker.packet.weather.humidity)){return("<b>Humidity</b> "+ -Math.round(this._marker.packet.weather.humidity)+ -"%<br/>");} -return null;};trackdirect.models.InfoWindow.prototype._getWeatherDivPressureString=function(){if(isNumeric(this._marker.packet.weather.pressure)){if(this._defaultMap.state.useImperialUnit){return("<b>Pressure</b> "+ -Math.round(trackdirect.services.imperialConverter.convertMbarToMmhg(this._marker.packet.weather.pressure))+ -" mmHg<br/>");}else{return("<b>Pressure</b> "+ -Math.round(this._marker.packet.weather.pressure)+ -" hPa<br/>");}} -return null;};trackdirect.models.InfoWindow.prototype._getWeatherDivWindString=function(){if(isNumeric(this._marker.packet.weather.wind_speed)){var windDir="";if(typeof this._marker.packet.weather.wind_direction!=="undefined"&&isNumeric(this._marker.packet.weather.wind_direction)){windDir=this._marker.packet.weather.wind_direction.toString()+"° ";} -if(this._defaultMap.state.useImperialUnit){if(isNumeric(this._marker.packet.weather.wind_gust)){return("<b>Wind</b> "+ -windDir+ -Math.round(trackdirect.services.imperialConverter.convertMpsToMph(this._marker.packet.weather.wind_speed)*10)/ -10+ -" mph"+ -" ("+ -Math.round(trackdirect.services.imperialConverter.convertMpsToMph(this._marker.packet.weather.wind_gust)*10)/ -10+ -" mph)<br/>");}else{return("<b>Wind</b> "+ -windDir+ -Math.round(trackdirect.services.imperialConverter.convertMpsToMph(this._marker.packet.weather.wind_speed)*10)/ -10+ -" mph<br/>");}}else{if(isNumeric(this._marker.packet.weather.wind_gust)){return("<b>Wind</b> "+ -windDir+ -Math.round(this._marker.packet.weather.wind_speed*10)/10+ -" m/s"+ -" ("+ -Math.round(this._marker.packet.weather.wind_gust*10)/10+ -" m/s)<br/>");}else{return("<b>Wind</b> "+ -windDir+ -Math.round(this._marker.packet.weather.wind_speed*10)/10+ -" m/s <br/>");}}} -return null;};trackdirect.models.InfoWindow.prototype._getWeatherDiv=function(){var weatherDiv=$(document.createElement("div"));weatherDiv.css("clear","both");weatherDiv.css("color","#227152");var weatherDate=new Date(this._marker.packet.timestamp*1000);if(typeof this._marker.packet.weather.timestamp!=="undefined"&&this._marker.packet.weather.timestamp!==null){weatherDate=new Date(this._marker.packet.weather.timestamp*1000);} -weatherDateString=moment(weatherDate).format(trackdirect.settings.dateFormatNoTimeZone);weatherDiv.append("<b>Latest Weather</b> "+weatherDateString+"<br/>");if(!trackdirect.isMobile&&$(window).height()>=300){weatherDiv.append(this._getWeatherDivTemperatureString());weatherDiv.append(this._getWeatherDivHumidityString());weatherDiv.append(this._getWeatherDivPressureString());weatherDiv.append(this._getWeatherDivRainString());weatherDiv.append(this._getWeatherDivWindString());} -return weatherDiv;};trackdirect.models.InfoWindow.prototype._getTelemetryDiv=function(){var telemetryDiv=$(document.createElement("div"));telemetryDiv.css("clear","both");telemetryDiv.css("color","#823030");var telemetryDate=new Date(this._marker.packet.latest_telemetry_packet_timestamp*1000);telemetryDateString=moment(telemetryDate).format(trackdirect.settings.dateFormatNoTimeZone);telemetryDiv.append("Latest Telemetry "+telemetryDateString+"<br/>");return telemetryDiv;};trackdirect.models.InfoWindow.prototype._getPacketCommentDiv=function(){var comment="";var ognSummary=escapeHtml(this._marker.packet.getOgnSummary());if(ognSummary!=""){comment=ognSummary;}else if(typeof this._marker.packet.comment!=="undefined"&&this._marker.packet.comment!==null){comment=Autolinker.link(escapeHtml(this._marker.packet.comment),{newWindow:true,});} -if(comment==""){return null;} -var commentDiv=$(document.createElement("div"));commentDiv.css("clear","both");commentDiv.css("font-weight","bold");if(!trackdirect.isMobile){commentDiv.css("font-size","11px");}else{commentDiv.css("font-size","10px");} -commentDiv.html(comment);return commentDiv;};trackdirect.models.InfoWindow.prototype._addPhgLinkListeners=function(){var marker=this._marker;$("#half-phg-"+marker.packet.station_id+"-"+marker.packet.id).click(function(e){marker.showPHGCircle(true);return false;});$("#full-phg-"+marker.packet.station_id+"-"+marker.packet.id).click(function(e){marker.showPHGCircle(false);return false;});$("#none-phg-"+this._marker.packet.station_id+"-"+marker.packet.id).click(function(e){marker.hidePHGCircle();return false;});if($("#phglinks-"+marker.packet.station_id+"-"+marker.packet.id).length){$("#phglinks-"+marker.packet.station_id+"-"+marker.packet.id).show();}};trackdirect.models.InfoWindow.prototype._addRngLinkListeners=function(){var marker=this._marker;$("#half-rng-"+marker.packet.station_id+"-"+marker.packet.id).click(function(e){marker.showRNGCircle(true);return false;});$("#full-rng-"+marker.packet.station_id+"-"+marker.packet.id).click(function(e){marker.showRNGCircle(false);return false;});$("#none-rng-"+marker.packet.station_id+"-"+marker.packet.id).click(function(e){marker.hideRNGCircle();return false;});if($("#rnglinks-"+marker.packet.station_id+"-"+marker.packet.id).length){$("#rnglinks-"+marker.packet.station_id+"-"+marker.packet.id).show();}};trackdirect.models.InfoWindow.prototype._getMenuDiv=function(isInfoWindowOpen){var menuWrapperDiv=this._getMenuDivWrapperDiv();var menuDiv=this._getMenuDivMainDiv();menuWrapperDiv.append(menuDiv);var menuUl=this._getMenuDivUlDiv();menuDiv.append(menuUl);menuUl.append(this._getMenuDivTrackLink());menuUl.append(this._getMenuDivFilterLink());if(!trackdirect.isMobile){menuUl.append(this._getMenuDivCenterLink(isInfoWindowOpen));} -menuUl.append(this._getMenuDivZoomLink(isInfoWindowOpen));if(!trackdirect.isEmbedded&&!inIframe()&&!this._marker.isMovingStation()&&this._marker.packet.source_id!=2){menuUl.append(this._getMenuDivCoverageLink());} -return menuWrapperDiv;};trackdirect.models.InfoWindow.prototype._getMenuDivWrapperDiv=function(){var menuWrapperDiv=$(document.createElement("div"));menuWrapperDiv.addClass("infowindow-menu-wrapper");menuWrapperDiv.css("clear","both");menuWrapperDiv.css("width","100%");menuWrapperDiv.css("padding-top","8px");return menuWrapperDiv;};trackdirect.models.InfoWindow.prototype._getMenuDivMainDiv=function(){var menuDiv=$(document.createElement("div"));menuDiv.addClass("infowindow-menu");menuDiv.css("width","100%");menuDiv.css("border-top","1px solid #cecece");return menuDiv;};trackdirect.models.InfoWindow.prototype._getMenuDivUlDiv=function(){var menuUl=$(document.createElement("ul"));menuUl.css("list-style-type","none");menuUl.css("list-style","none");menuUl.css("text-align","center");menuUl.css("margin","0");menuUl.css("padding","0");menuUl.css("display","table");return menuUl;};trackdirect.models.InfoWindow.prototype._getMenuDivLinkCss=function(){var liLinkCss={"list-style":"none",display:"table-cell","text-align":"center","padding-right":"10px",width:"auto",};return liLinkCss;};trackdirect.models.InfoWindow.prototype._getMenuDivTrackLink=function(){var trackLinkElementClass="trackStationLink"+this._marker.packet.station_id;var menuLi=$(document.createElement("li"));menuLi.css(this._getMenuDivLinkCss());var menuLink=$(document.createElement("a"));menuLink.css("color","#337ab7");menuLink.attr("href","#");menuLink.addClass(trackLinkElementClass);menuLink.attr("onclick","trackdirect.handleTrackStationRequest("+ -this._marker.packet.station_id+ -', "'+ -trackLinkElementClass+ -'"); return false;');if(this._defaultMap.state.getTrackStationId()!==null&&this._defaultMap.state.getTrackStationId()==this._marker.packet.station_id){menuLink.html("Untrack");}else{menuLink.html("Track");} -menuLi.append(menuLink);return menuLi;};trackdirect.models.InfoWindow.prototype._getMenuDivFilterLink=function(){var filterLinkElementClass="filterStationLink"+this._marker.packet.station_id;var menuLi=$(document.createElement("li"));menuLi.css(this._getMenuDivLinkCss());var menuLink=$(document.createElement("a"));menuLink.css("color","#337ab7");menuLink.addClass(filterLinkElementClass);menuLink.attr("onclick","trackdirect.handleFilterStationRequest("+ -this._marker.packet.station_id+ -', "'+ -filterLinkElementClass+ -'"); return false;');if(this._defaultMap.state.filterStationIds.length>0&&this._defaultMap.state.filterStationIds.indexOf(this._marker.packet.station_id)>-1){menuLink.html("Unfilter");var center=this._defaultMap.getCenterLiteral();menuLink.attr("href","/center/"+ -Number.parseFloat(center.lat).toFixed(5)+ -","+ -Number.parseFloat(center.lng).toFixed(5)+ -"/zoom/"+ -this._defaultMap.getZoom());}else{menuLink.html("Filter");menuLink.attr("href","/sid/"+this._marker.packet.station_id);} -menuLi.append(menuLink);return menuLi;};trackdirect.models.InfoWindow.prototype._getMenuDivCoverageLink=function(){var coverageLinkElementClass="stationCoverageLink"+this._marker.packet.station_id;var menuLi=$(document.createElement("li"));menuLi.css(this._getMenuDivLinkCss());var menuLink=$(document.createElement("a"));menuLink.css("color","#337ab7");menuLink.css("white-space","nowrap");menuLink.attr("href","#");menuLink.addClass(coverageLinkElementClass);menuLink.attr("onclick","trackdirect.toggleStationCoverage("+ -this._marker.packet.station_id+ -', "'+ -coverageLinkElementClass+ -'"); return false;');var coveragePolygon=this._defaultMap.markerCollection.getStationCoverage(this._marker.packet.station_id);if(coveragePolygon!==null&&coveragePolygon.isRequestedToBeVisible()){menuLink.html("Hide Coverage");}else{menuLink.html("Coverage");} -menuLi.append(menuLink);return menuLi;};trackdirect.models.InfoWindow.prototype._getMenuDivCenterLink=function(isInfoWindowOpen){var menuLi=$(document.createElement("li"));menuLi.css(this._getMenuDivLinkCss());var menuLink=$(document.createElement("a"));menuLink.css("color","#337ab7");if(isInfoWindowOpen){menuLink.attr("href","/center/"+ -this._marker.packet.latitude.toFixed(5)+ -","+ -this._marker.packet.longitude.toFixed(5)+ -"/zoom/"+ -this._defaultMap.getZoom());menuLink.attr("onclick","trackdirect.setCenter("+ -this._marker.packet.latitude+ -","+ -this._marker.packet.longitude+ -"); return false;");menuLink.html("Center");}else{menuLink.attr("href","/center/"+ -this._marker.packet.latitude.toFixed(5)+ -","+ -this._marker.packet.longitude.toFixed(5)+ -"/zoom/"+ -this._defaultMap.getZoom());menuLink.attr("onclick","trackdirect.focusOnMarkerId("+ -this._marker.packet.marker_id+ -"); return false;");menuLink.html("Focus");} -menuLi.append(menuLink);return menuLi;};trackdirect.models.InfoWindow.prototype._getMenuDivZoomLink=function(isInfoWindowOpen){var menuLi=$(document.createElement("li"));menuLi.css(this._getMenuDivLinkCss());var menuLink=$(document.createElement("a"));menuLink.css("color","#337ab7");if(isInfoWindowOpen){menuLink.attr("href","/center/"+ -this._marker.packet.latitude.toFixed(5)+ -","+ -this._marker.packet.longitude.toFixed(5)+ -"/zoom/14");menuLink.attr("onclick","trackdirect.setCenter("+ -this._marker.packet.latitude+ -","+ -this._marker.packet.longitude+ -", 14); return false;");menuLink.html("Zoom");}else{menuLink.attr("href","/center/"+ -this._marker.packet.latitude.toFixed(5)+ -","+ -this._marker.packet.longitude.toFixed(5)+ -"/zoom/14");menuLink.attr("onclick","trackdirect.focusOnMarkerId("+ -this._marker.packet.marker_id+ -", 14); return false;");menuLink.html("Zoom");} -menuLi.append(menuLink);return menuLi;};trackdirect.models.InfoWindow.prototype._getCompactMainDiv=function(){var packet=this._marker.packet;var mainDiv=$(document.createElement("div"));mainDiv.css("font-family","Verdana,Arial,sans-serif");if(!trackdirect.isMobile){mainDiv.css("font-size","11px");}else{mainDiv.css("font-size","10px");} -mainDiv.css("line-height","1.42857143");mainDiv.css("color","#333");mainDiv.css("text-align","left");var polylineDiv=$(document.createElement("div"));polylineDiv.css("float","left");var nameDiv=$(document.createElement("div"));nameDiv.css("clear","both");nameDiv.css("font-size","12px");nameDiv.css("font-weight","bold");var iconUrl24=trackdirect.services.symbolPathFinder.getFilePath(packet.symbol_table,packet.symbol,null,null,null,24,24);var iconImg=$(document.createElement("img"));iconImg.css("vertical-align","middle");iconImg.css("width","24px");iconImg.css("height","24px");iconImg.attr("src",iconUrl24);iconImg.attr("alt","");iconImg.attr("title","");nameDiv.append(iconImg);nameDiv.append(" ");nameDiv.append(" ");var nameLink=$(document.createElement("a"));nameLink.css("color","#337ab7");if(trackdirect.isMobile){nameLink.css("vertical-align","-2px");} -nameLink.attr("href","");nameLink.attr("onclick","trackdirect.openStationInformationDialog("+ -packet.station_id+ -"); return false;");nameLink.html(escapeHtml(packet.station_name));nameDiv.append(nameLink);if(packet.sender_name!=packet.station_name){nameDiv.append(" (");var nameLink2=$(document.createElement("span"));if(trackdirect.isMobile){nameLink2.css("vertical-align","-2px");} -nameLink2.html(escapeHtml(packet.sender_name));nameDiv.append(nameLink2);nameDiv.append(")");} -polylineDiv.append(nameDiv);var tailDistance=this._getTailDistance(this._defaultMap.markerCollection.getMarkerMasterMarkerKeyId(this._marker.markerIdKey));if(tailDistance!==null&&Math.round(tailDistance)>0){var distanceDiv=$(document.createElement("div"));distanceDiv.css("clear","both");distanceDiv.css("padding-top","4px");distanceDiv.append("Tail distance: ");if(tailDistance<1000){if(this._defaultMap.state.useImperialUnit){distanceDiv.append(Math.round(trackdirect.services.imperialConverter.convertMeterToYard(tailDistance))+" yd ");}else{distanceDiv.append(Math.round(tailDistance)+" m ");}}else{if(this._defaultMap.state.useImperialUnit){distanceDiv.append(Math.round(trackdirect.services.imperialConverter.convertKilometerToMile(tailDistance/1000)*10)/ -10+ -" miles ");}else{distanceDiv.append(Math.round(tailDistance/100)/10+" km ");}} -polylineDiv.append(distanceDiv);} -mainDiv.append(polylineDiv);return mainDiv;};trackdirect.models.InfoWindow.prototype._getTailDistance=function(markerIdKey){if(this._defaultMap.markerCollection.isExistingMarker(markerIdKey)){var marker=this._defaultMap.markerCollection.getMarker(markerIdKey);if(marker.packet.hasConfirmedMapId()&&marker.packet.is_moving==1&&marker.overwrite!==true){var distance=0;if(this._defaultMap.markerCollection.hasDotMarkers(markerIdKey)){var prevLatLng=null;var dotMarkers=this._defaultMap.markerCollection.getDotMarkers(markerIdKey);for(var i=0;i<dotMarkers.length;i++){var dotMarker=dotMarkers[i];var latLng=dotMarker.packet.getLatLngLiteral();if(prevLatLng!==null){distance+=trackdirect.services.distanceCalculator.getDistance(prevLatLng,latLng);} -prevLatLng=latLng;} -if(prevLatLng!==null){var latLng=marker.packet.getLatLngLiteral();if(prevLatLng!==latLng){distance+=trackdirect.services.distanceCalculator.getDistance(prevLatLng,latLng);}}} -var dashedPolyline=this._defaultMap.markerCollection.getMarkerDashedPolyline(markerIdKey);if(dashedPolyline!==null){if(dashedPolyline.getPathLength()==2){distance+=trackdirect.services.distanceCalculator.getDistance(dashedPolyline.getPathItem(0),dashedPolyline.getPathItem(1));distance+=this._getTailDistance(dashedPolyline.relatedMarkerIdKey);}} -return distance;}} -return null;};trackdirect.models.InfoWindow.prototype._getTransmitDistance=function(packet){if(typeof packet.station_location_path!=="undefined"&&packet.station_location_path!==null&&packet.station_location_path.length>=1){var relatedStationLatLng={lat:parseFloat(packet.station_location_path[0][0]),lng:parseFloat(packet.station_location_path[0][1]),};var distance=trackdirect.services.distanceCalculator.getDistance(packet.getLatLngLiteral(),relatedStationLatLng);if(distance!==null){return distance;}} -if(typeof packet.station_id_path!=="undefined"&&packet.station_id_path!==null&&packet.station_id_path.length>=1){for(var i=0;i<packet.station_id_path.length;i++){var relatedStationId=packet.station_id_path[i];var relatedStationPacket=this._defaultMap.markerCollection.getStationLatestPacket(relatedStationId);if(relatedStationPacket!==null){break;}} -if(relatedStationPacket!==null){var relatedStationLatLng={lat:parseFloat(relatedStationPacket.latitude),lng:parseFloat(relatedStationPacket.longitude),};var distance=trackdirect.services.distanceCalculator.getDistance(packet.getLatLngLiteral(),relatedStationLatLng);if(distance!==null){return distance;}}} -return null;}; -trackdirect.models.HeatMap=function(map){this._defaultMap=map;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.ImageMapType.call(this,this._getGoogleMapOptions());}else if(typeof L==="object"){L.TileLayer.call(this,this._getUrlTemplate(),this._getLeafletOptions());}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.HeatMap.prototype=Object.create(google.maps.ImageMapType.prototype);}else if(typeof L==="object"){trackdirect.models.HeatMap.prototype=Object.create(L.TileLayer.prototype);} -trackdirect.models.HeatMap.prototype.constructor=trackdirect.models.HeatMap;trackdirect.models.HeatMap.prototype._getLeafletOptions=function(){var options={errorTileUrl:trackdirect.settings.baseUrl+"/heatmaps/transparent.png",tileSize:256,maxZoom:9,minZoom:0,};return options;};trackdirect.models.HeatMap.prototype._getGoogleMapOptions=function(){var me=this;var options={getTileUrl:function(coord,zoom){if(zoom>trackdirect.settings.minZoomForMarkers-1){return trackdirect.settings.baseUrl+"/heatmaps/transparent.png";} -var normalizedCoord=me._getNormalizedCoord(coord,zoom);if(!normalizedCoord){return trackdirect.settings.baseUrl+"/heatmaps/transparent.png";} -var xString=String(normalizedCoord.x);var yString=String(normalizedCoord.y);return me._getUrlTemplate().replace("{z}",zoom).replace("{y}",yString).replace("{x}",xString);},tileSize:new google.maps.Size(256,256),maxZoom:9,minZoom:0,radius:1738000,name:"APRSHEAT",};return options;};trackdirect.models.HeatMap.prototype._getUrlTemplate=function(){return(trackdirect.settings.baseUrl+ -"/heatmaps/latest-heatmap.{z}.{y}.{x}.png?version="+ -this._getHeatMapVersion());};trackdirect.models.HeatMap.prototype._getHeatMapVersion=function(){var today=new Date();var dd=today.getDate();var mm=today.getMonth()+1;var yyyy=today.getFullYear();var hh=today.getHours();if(dd<10){dd="0"+dd;} -if(mm<10){mm="0"+mm;} -return yyyy+"-"+mm+"-"+dd+"-"+hh;};trackdirect.models.HeatMap.prototype._getNormalizedCoord=function(coord,zoom){var y=coord.y;var x=coord.x;var tileRange=1<<zoom;if(y<0||y>=tileRange){return null;} -if(x<0||x>=tileRange){x=((x%tileRange)+tileRange)%tileRange;} -return{x:x,y:y};}; -trackdirect.models.DirectionPolyline=function(marker,map){this._marker=marker;this._defaultMap=map;this.startTimestamp=this._marker.packet.timestamp;this.speed=this._marker.packet.speed;this.course=this._marker.packet.course;this.stopped=false;this.timerId=null;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Polyline.call(this,this._getGooglePolylineOptions());}else if(typeof L==="object"){L.Polyline.call(this,{},this._getLeafletPolylineOptions());this.setLatLngs([this._getFirstCoordinate(),this._getExpectedCoordinate(),]);}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.DirectionPolyline.prototype=Object.create(google.maps.Polyline.prototype);}else if(typeof L==="object"){trackdirect.models.DirectionPolyline.prototype=Object.create(L.Polyline.prototype);} -trackdirect.models.DirectionPolyline.prototype.constructor=trackdirect.models.DirectionPolyline;trackdirect.models.DirectionPolyline.prototype.setPathItems=function(pathItems){if(typeof google==="object"&&typeof google.maps==="object"){this.setPath(pathItems);}else if(typeof L==="object"){this.setLatLngs(pathItems);}};trackdirect.models.DirectionPolyline.prototype.getMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){var map=google.maps.Polyline.prototype.getMap.call(this);if(typeof map!=="undefined"){return map;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return this._defaultMap;}} -return null;};trackdirect.models.DirectionPolyline.prototype.show=function(){var timeInSeconds=this._getAgeInSeconds();if(this.stopped===false&&timeInSeconds<=900&&this._marker.packet.hasConfirmedMapId()&&(this._defaultMap.state.isFilterMode||this._defaultMap.getZoom()>=trackdirect.settings.minZoomForMarkerTail)){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}} -this.recalculate();}};trackdirect.models.DirectionPolyline.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}}};trackdirect.models.DirectionPolyline.prototype.stop=function(){this.stopped=true;this.hide();};trackdirect.models.DirectionPolyline.prototype._getGooglePolylineOptions=function(){var lineCoordinates=[this._getFirstCoordinate(),this._getExpectedCoordinate(),];var lineSymbol={path:google.maps.SymbolPath.FORWARD_OPEN_ARROW,strokeOpacity:1,scale:0.65,};var options={path:lineCoordinates,strokeOpacity:0,strokeColor:trackdirect.services.stationColorCalculator.getColor(this._marker.packet),map:null,icons:[{icon:lineSymbol,offset:"0px",repeat:"8px",},],};return options;};trackdirect.models.DirectionPolyline.prototype._getLeafletPolylineOptions=function(){return{color:trackdirect.services.stationColorCalculator.getColor(this._marker.packet),weight:4,opacity:0.7,dashArray:"2,8",lineJoin:"round",};};trackdirect.models.DirectionPolyline.prototype._getFirstCoordinate=function(){return this._marker.packet.getLatLngLiteral();};trackdirect.models.DirectionPolyline.prototype._getExpectedCoordinate=function(){var timeInSeconds=this._getAgeInSeconds();var distance=(this.speed/3.6)*timeInSeconds;var startPosition=this._getFirstCoordinate();if(startPosition!=null){return trackdirect.services.distanceCalculator.getPositionByDistance(startPosition,this.course,distance);} -return null;};trackdirect.models.DirectionPolyline.prototype.recalculate=function(){var interval=1000;var me=this;this.timerId=window.setInterval(function(){if(!me._marker.isVisible()||me.stopped||!me._marker.showAsMarker){me.hide();clearInterval(me.timerId);return;} -var timeInSeconds=me._getAgeInSeconds();if(timeInSeconds>900){me.stop();if(me.timerId!==null){clearInterval(me.timerId);}}else{var firstPosition=me._getFirstCoordinate();var newPosition=me._getExpectedCoordinate();if(firstPosition!=null&&newPosition!=null){me.setPathItems([firstPosition,newPosition]);}}},interval);};trackdirect.models.DirectionPolyline.prototype._getAgeInSeconds=function(){var timeInSeconds=0;var startTimestamp=this._defaultMap.state.getClientTimestamp(this.startTimestamp);if(startTimestamp<Date.now()/1000){timeInSeconds=Date.now()/1000-startTimestamp;} -return timeInSeconds;}; -trackdirect.models.DashedTailPolyline=function(color,map){this._defaultMap=map;this.markerIdKey=null;this.ownerMarkerIdKey=null;this.relatedMarkerIdKey=null;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.Polyline.call(this,this._getGooglePolylineOptions(color));}else if(typeof L==="object"){L.Polyline.call(this,{},this._getLeafletPolylineOptions(color));}};if(typeof google==="object"&&typeof google.maps==="object"){trackdirect.models.DashedTailPolyline.prototype=Object.create(google.maps.Polyline.prototype);}else if(typeof L==="object"){trackdirect.models.DashedTailPolyline.prototype=Object.create(L.Polyline.prototype);} -trackdirect.models.DashedTailPolyline.prototype.constructor=trackdirect.models.DashedTailPolyline;trackdirect.models.DashedTailPolyline.prototype.getPathItem=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);return path.getAt(index);}else if(typeof L==="object"){var list=this.getLatLngs();if(typeof list[index]!=="undefined"){return list[index];}else{return null;}} -return null;};trackdirect.models.DashedTailPolyline.prototype.pushPathItem=function(latLng){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);path.push(latLng);}else if(typeof L==="object"){this.addLatLng(latLng);}};trackdirect.models.DashedTailPolyline.prototype.removePathItem=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);path.removeAt(index);}else if(typeof L==="object"){var list=this.getLatLngs();if(typeof list[index]!=="undefined"){list.splice(index,1);this.setLatLngs(list);}}};trackdirect.models.DashedTailPolyline.prototype.getPathLength=function(index){if(typeof google==="object"&&typeof google.maps==="object"){var path=google.maps.Polyline.prototype.getPath.call(this);return path.getLength();}else if(typeof L==="object"){var list=this.getLatLngs();return list.length;}};trackdirect.models.DashedTailPolyline.prototype.getPath=function(){if(typeof google==="object"&&typeof google.maps==="object"){return google.maps.Polyline.prototype.getPath.call(this).getArray();}else if(typeof L==="object"){return this.getLatLngs();} -return[];};trackdirect.models.DashedTailPolyline.prototype.getMap=function(){if(typeof google==="object"&&typeof google.maps==="object"){var map=google.maps.Polyline.prototype.getMap.call(this);if(typeof map!=="undefined"){return map;}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){return this._defaultMap;}} -return null;};trackdirect.models.DashedTailPolyline.prototype.setMarkerIdKey=function(markerIdKey){this.markerIdKey=markerIdKey;this.ownerMarkerIdKey=markerIdKey;this._addInfoWindowListener(markerIdKey);};trackdirect.models.DashedTailPolyline.prototype.setRelatedMarkerIdKey=function(markerIdKey){this.relatedMarkerIdKey=markerIdKey;};trackdirect.models.DashedTailPolyline.prototype.show=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(typeof this.getMap()==="undefined"||this.getMap()===null){this.setMap(this._defaultMap);}}else if(typeof L==="object"){if(!this._defaultMap.hasLayer(this)){this.addTo(this._defaultMap);}}};trackdirect.models.DashedTailPolyline.prototype.hide=function(){if(typeof google==="object"&&typeof google.maps==="object"){if(this.getMap()!==null){this.setMap(null);}}else if(typeof L==="object"){if(this._defaultMap.hasLayer(this)){this._defaultMap.removeLayer(this);}}};trackdirect.models.DashedTailPolyline.prototype.addPacket=function(packet){if(typeof google==="object"&&typeof google.maps==="object"){var latLng=new google.maps.LatLng(parseFloat(packet.latitude),parseFloat(packet.longitude));this.pushPathItem(latLng);}else if(typeof L==="object"){var latLng=new L.latLng(parseFloat(packet.latitude),parseFloat(packet.longitude));this.addLatLng(latLng);}};trackdirect.models.DashedTailPolyline.prototype._addInfoWindowListener=function(markerIdKey){var me=this;if(typeof google==="object"&&typeof google.maps==="object"){google.maps.event.addListener(this,"click",function(event){var marker=me._defaultMap.markerCollection.getMarker(markerIdKey);me._defaultMap.openPolylineInfoWindow(marker,event.latLng);});}else if(typeof L==="object"){this.on("click",function(event){var marker=me._defaultMap.markerCollection.getMarker(markerIdKey);me._defaultMap.openPolylineInfoWindow(marker,event.latlng);});}};trackdirect.models.DashedTailPolyline.prototype._getGooglePolylineOptions=function(color){var lineSymbol={path:"M 0,-1 0,1",strokeOpacity:0.4,scale:3,};var options={geodesic:false,strokeOpacity:0,strokeColor:color,icons:[{icon:lineSymbol,offset:"20px",repeat:"15px",},],map:null,zIndex:100,};return options;};trackdirect.models.DashedTailPolyline.prototype._getLeafletPolylineOptions=function(color){return{opacity:0.6,weight:3,dashArray:"6,8",lineJoin:"round",color:color,};}; diff --git a/htdocs/public/robots.txt b/htdocs/public/robots.txt deleted file mode 100644 index 07b27593c63faf7ee313db7cdb92b9eaa57da49b..0000000000000000000000000000000000000000 --- a/htdocs/public/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Disallow: /heatmaps/ -Disallow: /data/ - diff --git a/htdocs/public/symbols/.htaccess b/htdocs/public/symbols/.htaccess deleted file mode 100755 index 89d0b1917339b22e2b156e3ec1e8edc57b7e53bc..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/.htaccess +++ /dev/null @@ -1,66 +0,0 @@ -<IfModule mod_expires.c> - ExpiresActive On - ExpiresByType image/jpg "access 1 month" - ExpiresByType image/jpeg "access 1 month" - ExpiresByType image/gif "access 1 month" - ExpiresByType image/png "access 1 month" - ExpiresDefault "access 1 week" -</IfModule> - - -Options +FollowSymLinks -RewriteEngine On - -# Do not do anything for already existing files and folders -RewriteCond %{REQUEST_FILENAME} -f [OR] -RewriteCond %{REQUEST_FILENAME} -d -RewriteRule .+ - [L] - -RewriteCond %{SCRIPT_FILENAME} !-d -RewriteCond %{SCRIPT_FILENAME} !-f -RewriteCond %{REQUEST_URI} \.(svg|png)$ - - -# -# Simple svg images -# - -# Regular primary table symbol (no point in using symbol.php) -RewriteRule ^/?symbol-(\d+)-47\.svg$ ./svgicons/$1-1.svg - -# Regular alternative table symbol (no point in using symbol.php) -RewriteRule ^/?symbol-(\d+)-92\.svg$ ./svgicons/$1-2.svg - - -# -# Images that needs to be handled by symbols.php -# - -# Symbol with overlay (or other file extension) -RewriteRule ^/?n?symbol-(\d+)-(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&format=$3 - -# Symbol with overlay and course (raly used since width and height should be specified when rotating) -RewriteRule ^/?n?symbol-(\d+)-(\d+)-(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&course=$3&format=$4 - -# Symbol with overlay and specified width and height -RewriteRule ^/?n?symbol-(\d+)-(\d+)-(\d+)x(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&width=$3&height=$4&format=$5 - -# Symbol with overlay and course and specified width and height -RewriteRule ^/?n?symbol-(\d+)-(\d+)-(\d+)-(\d+)x(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&course=$3&width=$4&height=$5&format=$6 - - -# -# Images that needs to be handled by symbols.php AND also nees to be scaled -# - -# Symbol with overlay (or other file extension) -RewriteRule ^/?n?symbol-(\d+)-(\d+)-scale(\d+)x(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&scale_width=$3&scale_height=$4&format=$5 - -# Symbol with overlay and course (raly used since width and height should be specified when rotating) -RewriteRule ^/?n?symbol-(\d+)-(\d+)-(\d+)-scale(\d+)x(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&course=$3&scale_width=$4&scale_height=$5&format=$6 - -# Symbol with overlay and specified width and height -RewriteRule ^/?n?symbol-(\d+)-(\d+)-(\d+)x(\d+)-scale(\d+)x(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&width=$3&height=$4&scale_width=$5&scale_height=$6&format=$7 - -# Symbol with overlay and course and specified width and height -RewriteRule ^/?n?symbol-(\d+)-(\d+)-(\d+)-(\d+)x(\d+)-scale(\d+)x(\d+)\.(svg|png)$ ./symbol.php?symbol=$1&symbol_table=$2&course=$3&width=$4&height=$5&scale_width=$6&scale_height=$7&format=$8 diff --git a/htdocs/public/symbols/icons/100-1.png b/htdocs/public/symbols/icons/100-1.png deleted file mode 100755 index c35faefeef77a2e27592800812440ac4cd8e54f5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/100-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/100-2.png b/htdocs/public/symbols/icons/100-2.png deleted file mode 100755 index 9db76b0d4986d9eba15ba05932682e35bf541911..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/100-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/101-1.png b/htdocs/public/symbols/icons/101-1.png deleted file mode 100755 index 53b96ec99bb6f849169a50bcaf6f7dd4281b5c79..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/101-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/101-2.png b/htdocs/public/symbols/icons/101-2.png deleted file mode 100755 index 58f049496491c3e3b844a3c0144ea2676036fe93..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/101-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/102-1.png b/htdocs/public/symbols/icons/102-1.png deleted file mode 100755 index 4612c5179f92f063f43ce70155dcceb068f587a8..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/102-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/102-2.png b/htdocs/public/symbols/icons/102-2.png deleted file mode 100755 index ef59eb589511bea89a623adc2ccce887893a72a2..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/102-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/103-1.png b/htdocs/public/symbols/icons/103-1.png deleted file mode 100755 index ef32b1246fbd8e9b83190a97bbd792c0e69fcaf1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/103-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/103-2.png b/htdocs/public/symbols/icons/103-2.png deleted file mode 100755 index 0d79074ee16ff3271dbe37d718e72b01942d7910..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/103-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/104-1.png b/htdocs/public/symbols/icons/104-1.png deleted file mode 100755 index 055eda2431e54223438d4b84867b4ab7b8581b83..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/104-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/104-2.png b/htdocs/public/symbols/icons/104-2.png deleted file mode 100755 index 65401954192309f3217b088932b70363b896dce1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/104-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/105-1.png b/htdocs/public/symbols/icons/105-1.png deleted file mode 100755 index 4e96a707c65d170d23ce43ca371c70841c483906..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/105-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/105-2.png b/htdocs/public/symbols/icons/105-2.png deleted file mode 100755 index 7a2326796d36812696a7baef326ed7b3e65badb6..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/105-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/106-1.png b/htdocs/public/symbols/icons/106-1.png deleted file mode 100755 index 816208827476fbea7d7c46dc28ce5bccbdf244ce..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/106-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/106-2.png b/htdocs/public/symbols/icons/106-2.png deleted file mode 100755 index 4f1e87f26d0a10008b1909453f22853093508557..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/106-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/107-1.png b/htdocs/public/symbols/icons/107-1.png deleted file mode 100755 index ff8f372d21d2ac5836abd57157afd5f2ebc28d11..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/107-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/107-2.png b/htdocs/public/symbols/icons/107-2.png deleted file mode 100755 index 16e0cf0c236e217171e5058e0f4a23dcf5bb14fd..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/107-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/108-1.png b/htdocs/public/symbols/icons/108-1.png deleted file mode 100755 index d5e8910cb2ccbc157b5ac60d80c75a851098ce90..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/108-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/108-2.png b/htdocs/public/symbols/icons/108-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/108-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/109-1.png b/htdocs/public/symbols/icons/109-1.png deleted file mode 100755 index f0cab5637c013e8b6927904da820563fafc95157..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/109-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/109-2.png b/htdocs/public/symbols/icons/109-2.png deleted file mode 100755 index 09e2de017db8e791334a903738cf3c5744ab9285..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/109-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/110-1.png b/htdocs/public/symbols/icons/110-1.png deleted file mode 100755 index 41b1f95e14b598434b6ba4b8bc4bbe68cb6910da..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/110-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/110-2.png b/htdocs/public/symbols/icons/110-2.png deleted file mode 100755 index 7791a99ca6f293f11b163b1a1552572bcec60c86..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/110-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/111-1.png b/htdocs/public/symbols/icons/111-1.png deleted file mode 100755 index 276642fac207d9b90214d8a7ec175c9ab85888d0..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/111-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/111-2.png b/htdocs/public/symbols/icons/111-2.png deleted file mode 100755 index 579be975d5fe2babdd29b018ed5826231a12fc63..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/111-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/112-1.png b/htdocs/public/symbols/icons/112-1.png deleted file mode 100755 index 1021601b97c19566c5c28d283c07969b6c996e72..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/112-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/112-2.png b/htdocs/public/symbols/icons/112-2.png deleted file mode 100755 index f0ad8254496ae06a9b1ca64a4c7fb5b4cae29d7e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/112-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/113-1.png b/htdocs/public/symbols/icons/113-1.png deleted file mode 100755 index ca74259917ef696863603e81321c495ae363dbcd..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/113-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/113-2.png b/htdocs/public/symbols/icons/113-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/113-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/114-1.png b/htdocs/public/symbols/icons/114-1.png deleted file mode 100755 index a238b6fba7ecf4f513daf5e50f98dfe80350efac..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/114-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/114-2.png b/htdocs/public/symbols/icons/114-2.png deleted file mode 100755 index 1043d223669a667b1d2b84c7606aa70467356700..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/114-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/115-1.png b/htdocs/public/symbols/icons/115-1.png deleted file mode 100755 index 9107ffa3f65fffdb7a3b90ecf24bb20e999c67ae..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/115-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/115-2.png b/htdocs/public/symbols/icons/115-2.png deleted file mode 100755 index 393ab8b2a33f265ed2740f405382d54d77367d74..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/115-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/116-1.png b/htdocs/public/symbols/icons/116-1.png deleted file mode 100755 index 9fab7f139ed7d67b469d3bb4e7e1e44accc55adf..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/116-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/116-2.png b/htdocs/public/symbols/icons/116-2.png deleted file mode 100755 index dc309083b57e3d3ec5caa13033cb7f7ed161f7aa..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/116-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/117-1.png b/htdocs/public/symbols/icons/117-1.png deleted file mode 100755 index 11fc96d8a6bc6e8bcf443649a7b28c422883b0ef..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/117-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/117-2.png b/htdocs/public/symbols/icons/117-2.png deleted file mode 100755 index f85658d06082a7507eb8513b1db4de6854574df5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/117-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/118-1.png b/htdocs/public/symbols/icons/118-1.png deleted file mode 100755 index ccfa8dc5939697370deeca8aa089f33357421915..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/118-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/118-2.png b/htdocs/public/symbols/icons/118-2.png deleted file mode 100755 index ccfa8dc5939697370deeca8aa089f33357421915..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/118-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/119-1.png b/htdocs/public/symbols/icons/119-1.png deleted file mode 100755 index 15b82d036b5538ef19533929fb62f8a7e3b9db92..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/119-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/119-2.png b/htdocs/public/symbols/icons/119-2.png deleted file mode 100755 index 4ff4dffcd20887fad57f4e202e57b5b79d5e981f..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/119-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/120-1.png b/htdocs/public/symbols/icons/120-1.png deleted file mode 100755 index 44db21dee6bd7736ebadefe13649576d4af31330..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/120-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/120-2.png b/htdocs/public/symbols/icons/120-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/120-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/121-1.png b/htdocs/public/symbols/icons/121-1.png deleted file mode 100755 index e2d581b171e2611a2a857118647d7f4c1191e5d5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/121-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/121-2.png b/htdocs/public/symbols/icons/121-2.png deleted file mode 100755 index 0e63464fa0e724c0df4ac875171ebfbd09544199..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/121-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/122-1.png b/htdocs/public/symbols/icons/122-1.png deleted file mode 100755 index bdf4bf2a0c06b3a64ce9ceff9f59d792b337e428..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/122-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/122-2.png b/htdocs/public/symbols/icons/122-2.png deleted file mode 100755 index 5c7dd40997266f7d1a8dfb58e01da14b5cd8d7e7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/122-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/123-1.png b/htdocs/public/symbols/icons/123-1.png deleted file mode 100755 index 9a99f2851e16323e5c5174321002f9a79ae4d79b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/123-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/123-2.png b/htdocs/public/symbols/icons/123-2.png deleted file mode 100755 index 50d955b8f4b97ff3f607b06f7e44a24e98044949..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/123-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/124-1.png b/htdocs/public/symbols/icons/124-1.png deleted file mode 100755 index 9a99f2851e16323e5c5174321002f9a79ae4d79b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/124-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/124-2.png b/htdocs/public/symbols/icons/124-2.png deleted file mode 100755 index ba59de5af28f69db5b643af7fa3bd148e95f45fc..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/124-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/125-1.png b/htdocs/public/symbols/icons/125-1.png deleted file mode 100755 index 9a99f2851e16323e5c5174321002f9a79ae4d79b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/125-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/125-2.png b/htdocs/public/symbols/icons/125-2.png deleted file mode 100755 index 9a99f2851e16323e5c5174321002f9a79ae4d79b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/125-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/126-1.png b/htdocs/public/symbols/icons/126-1.png deleted file mode 100755 index 1dc247035738680604f82f8f55cfe9643dd0dd2a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/126-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/126-2.png b/htdocs/public/symbols/icons/126-2.png deleted file mode 100755 index 1dc247035738680604f82f8f55cfe9643dd0dd2a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/126-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/32-1.png b/htdocs/public/symbols/icons/32-1.png deleted file mode 100755 index e4c239447755f7db3f1f85b4e4cc5aad646be1d5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/32-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/32-2.png b/htdocs/public/symbols/icons/32-2.png deleted file mode 100755 index e4c239447755f7db3f1f85b4e4cc5aad646be1d5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/32-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/33-1.png b/htdocs/public/symbols/icons/33-1.png deleted file mode 100755 index ae42eb642da8673e171020fc78c616c576d1a2f4..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/33-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/33-2.png b/htdocs/public/symbols/icons/33-2.png deleted file mode 100755 index 07aa19370a19a6cafc84f726262a1b909c15e366..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/33-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/34-1.png b/htdocs/public/symbols/icons/34-1.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/34-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/34-2.png b/htdocs/public/symbols/icons/34-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/34-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/35-1.png b/htdocs/public/symbols/icons/35-1.png deleted file mode 100755 index f627f33643fb2be54ba9a53dcb387d14b62e6275..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/35-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/35-2.png b/htdocs/public/symbols/icons/35-2.png deleted file mode 100755 index b3b8706f6275b4826ed1052b6c75370c63301f3e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/35-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/36-1.png b/htdocs/public/symbols/icons/36-1.png deleted file mode 100755 index 229eb5142ce81e0c0887310786ab141b778a5ccb..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/36-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/36-2.png b/htdocs/public/symbols/icons/36-2.png deleted file mode 100755 index 4e17c9f926854d29e66e8da55db1e06ba1bb585f..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/36-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/37-1.png b/htdocs/public/symbols/icons/37-1.png deleted file mode 100755 index 473f8bf0898c5f545cbcafe87c22e351ba81eae6..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/37-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/37-2.png b/htdocs/public/symbols/icons/37-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/37-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/38-1.png b/htdocs/public/symbols/icons/38-1.png deleted file mode 100755 index e9ee41d309dafe9cc12f918a8c82d306669202ae..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/38-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/38-2.png b/htdocs/public/symbols/icons/38-2.png deleted file mode 100755 index 5a746b63c83b67a8bd71a8b6ff231aa8354076b1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/38-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/39-1.png b/htdocs/public/symbols/icons/39-1.png deleted file mode 100755 index 23685956b2455614e339da0c557017c6f22510e7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/39-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/39-2.png b/htdocs/public/symbols/icons/39-2.png deleted file mode 100755 index 7f5d1f09c80d07c6325f73b9363fbdc7432b097e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/39-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/40-1.png b/htdocs/public/symbols/icons/40-1.png deleted file mode 100755 index 6e15bcea1b12b35a183436fabe77e7e24f44944f..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/40-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/40-2.png b/htdocs/public/symbols/icons/40-2.png deleted file mode 100755 index 485cd977b9ecace737370d2f5c6af1d990f43e4b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/40-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/41-1.png b/htdocs/public/symbols/icons/41-1.png deleted file mode 100755 index 9e566b39f9a32aa830f8cfb7f26de22fccf571af..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/41-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/41-2.png b/htdocs/public/symbols/icons/41-2.png deleted file mode 100755 index 356f3812eaf235c7c1f88baf5fd9719e26508a48..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/41-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/42-1.png b/htdocs/public/symbols/icons/42-1.png deleted file mode 100755 index c4f02de449a1b495540789c7a96bc94fd8c110cc..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/42-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/42-2.png b/htdocs/public/symbols/icons/42-2.png deleted file mode 100755 index 8377b3af0006601ba2fa2e0c934ecd04e5e5b9cd..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/42-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/43-1.png b/htdocs/public/symbols/icons/43-1.png deleted file mode 100755 index 935aa24a888948bc9d5bbecdc371a3e04d744c3b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/43-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/43-2.png b/htdocs/public/symbols/icons/43-2.png deleted file mode 100755 index 78b514349d5c5d88d6375986c6adaec6086996a1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/43-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/44-1.png b/htdocs/public/symbols/icons/44-1.png deleted file mode 100755 index 946f15ff9cfa1d304e5be1e1c2ffb3cf2635b58d..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/44-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/44-2.png b/htdocs/public/symbols/icons/44-2.png deleted file mode 100755 index d74dc8652b2cea23681141cbaf2cc22adffbf46d..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/44-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/45-1.png b/htdocs/public/symbols/icons/45-1.png deleted file mode 100755 index c1431907c8ef004665ba0c13c430eb191320762a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/45-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/45-2.png b/htdocs/public/symbols/icons/45-2.png deleted file mode 100755 index 6abb770bb874389650ccbf3c9a0850d2a9f231bc..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/45-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/46-1.png b/htdocs/public/symbols/icons/46-1.png deleted file mode 100755 index 86e57b13395c177939ad24d5f9b90bb161ca8858..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/46-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/46-2.png b/htdocs/public/symbols/icons/46-2.png deleted file mode 100755 index 27b2263df191384d248e7f638ef7c5d3b9a78d45..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/46-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/47-1.png b/htdocs/public/symbols/icons/47-1.png deleted file mode 100755 index 3476187a2d78c283847d22affa3b317637f68be4..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/47-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/47-2.png b/htdocs/public/symbols/icons/47-2.png deleted file mode 100755 index aeaa4d485583ed6a2af0d7bca9bcd52e30d476fe..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/47-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/48-1.png b/htdocs/public/symbols/icons/48-1.png deleted file mode 100755 index 4c6ba20d8a8cfe2cce8ab542d9b3bb3974efc10a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/48-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/48-2.png b/htdocs/public/symbols/icons/48-2.png deleted file mode 100755 index fef9f60f5b70b9ece1bf5891c07be8329e101ced..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/48-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/49-1.png b/htdocs/public/symbols/icons/49-1.png deleted file mode 100755 index e2eff03667562608b11858fadb9e50e1641a9371..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/49-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/49-2.png b/htdocs/public/symbols/icons/49-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/49-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/50-1.png b/htdocs/public/symbols/icons/50-1.png deleted file mode 100755 index 9a15de1617cb1f01ca47aea3991724630ce5c1e7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/50-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/50-2.png b/htdocs/public/symbols/icons/50-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/50-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/51-1.png b/htdocs/public/symbols/icons/51-1.png deleted file mode 100755 index 2885b1727bc189ce28891680efa1041daf7af971..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/51-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/51-2.png b/htdocs/public/symbols/icons/51-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/51-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/52-1.png b/htdocs/public/symbols/icons/52-1.png deleted file mode 100755 index 2febcd239483778bfccddbffcecc48ddca657f18..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/52-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/52-2.png b/htdocs/public/symbols/icons/52-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/52-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/53-1.png b/htdocs/public/symbols/icons/53-1.png deleted file mode 100755 index 31406b4b787f36bec01c1f20ff8ce835d55c992a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/53-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/53-2.png b/htdocs/public/symbols/icons/53-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/53-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/54-1.png b/htdocs/public/symbols/icons/54-1.png deleted file mode 100755 index c244d84389d105328c01be0972f0789259c3a007..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/54-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/54-2.png b/htdocs/public/symbols/icons/54-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/54-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/55-1.png b/htdocs/public/symbols/icons/55-1.png deleted file mode 100755 index 3e72b3c515c2394eaf6878339a7feca4af8addf5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/55-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/55-2.png b/htdocs/public/symbols/icons/55-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/55-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/56-1.png b/htdocs/public/symbols/icons/56-1.png deleted file mode 100755 index 537faabd8da10a1ffa2b30feedb3d671ca95f1bf..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/56-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/56-2.png b/htdocs/public/symbols/icons/56-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/56-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/57-1.png b/htdocs/public/symbols/icons/57-1.png deleted file mode 100755 index a8324072a3e51974849979fbb716cc92549376ca..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/57-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/57-2.png b/htdocs/public/symbols/icons/57-2.png deleted file mode 100755 index 148ef50a59fadbbae0879edba48a594a19a60d67..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/57-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/58-1.png b/htdocs/public/symbols/icons/58-1.png deleted file mode 100755 index 76793e577ac62bc971af8606cccde31ed4e5ce68..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/58-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/58-2.png b/htdocs/public/symbols/icons/58-2.png deleted file mode 100755 index 330114382a8d71be56d66e8ce802860833e9d005..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/58-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/59-1.png b/htdocs/public/symbols/icons/59-1.png deleted file mode 100755 index fde1341883cecc957c825353b9cde13453c13474..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/59-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/59-2.png b/htdocs/public/symbols/icons/59-2.png deleted file mode 100755 index 86e8b06f4ed3190a33203b8f954b6d53fa3bfa73..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/59-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/60-1.png b/htdocs/public/symbols/icons/60-1.png deleted file mode 100755 index fc326d3d5b38ffbfb5756a35ffcff248f572728f..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/60-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/60-2.png b/htdocs/public/symbols/icons/60-2.png deleted file mode 100755 index 217f9ef55b020b136b39b68d78f9d074070fcdd8..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/60-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/61-1.png b/htdocs/public/symbols/icons/61-1.png deleted file mode 100755 index 227c9f0f41782487a4f257b1c366566f6cbb0a49..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/61-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/61-2.png b/htdocs/public/symbols/icons/61-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/61-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/62-1.png b/htdocs/public/symbols/icons/62-1.png deleted file mode 100755 index 7919b1508e492799e62b893d3700fe0c3c15f2b9..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/62-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/62-1.svg b/htdocs/public/symbols/icons/62-1.svg deleted file mode 100755 index 6ca9118ad271eef3a9eb86fe77e6431896491a9b..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/icons/62-1.svg +++ /dev/null @@ -1,141 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - id="svg3406" - version="1.1" - inkscape:version="0.91 r13725" - width="20" - height="20" - viewBox="0 0 20 20" - sodipodi:docname="62-1.svg" - enable-background="new"> - <metadata - id="metadata3412"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs3410"> - <linearGradient - id="linearGradient4149" - osb:paint="solid"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop4151" /> - </linearGradient> - </defs> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview3408" - showgrid="false" - inkscape:object-paths="true" - inkscape:object-nodes="true" - inkscape:zoom="45.95" - inkscape:cx="4.6898803" - inkscape:cy="9.3630291" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="layer2" /> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="Layer 1" - style="display:inline"> - <path - style="fill:#b3b3b3;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 2.4693829,10.743841 4.4511829,-5.1943307 4.8966272,0.021763 3.156422,5.1642207" - id="path4376" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccc" /> - <path - style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 2.4693829,10.743841 -1.8600249,2.030914 -0.0217628,1.741023 1.4145811,1.196953 4.9619151,1.08814 6.0718176,-0.02176 4.940152,-1.153428 1.414581,-1.305767 -0.0029,-3.587369 z" - id="path4370" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccccccc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 9.3580451,16.792292 -0.02181,-1.362477 0,0" - id="path4378" - inkscape:connector-curvature="0" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 8.1397624,5.5598044 4.43e-5,7.7524236" - id="path4374" - inkscape:connector-curvature="0" /> - <path - style="opacity:1;fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:1.107;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4334-4" - sodipodi:type="arc" - sodipodi:cx="4.8639832" - sodipodi:cy="16.213278" - sodipodi:rx="1.7530049" - sodipodi:ry="1.7856489" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="M 3.1109782,16.213278 A 1.7530049,1.7856489 0 0 1 4.8635625,14.427629 1.7530049,1.7856489 0 0 1 6.6169879,16.212421 1.7530049,1.7856489 0 0 1 4.8652452,17.998926 1.7530049,1.7856489 0 0 1 3.1109791,16.214992" /> - <path - style="opacity:1;fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:1.107;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4334-4-4" - sodipodi:type="arc" - sodipodi:cx="15.081611" - sodipodi:cy="16.16975" - sodipodi:rx="1.7530049" - sodipodi:ry="1.7856489" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - sodipodi:open="true" - d="m 13.328606,16.16975 a 1.7530049,1.7856489 0 0 1 1.752584,-1.785649 1.7530049,1.7856489 0 0 1 1.753425,1.784792 1.7530049,1.7856489 0 0 1 -1.751742,1.786506 1.7530049,1.7856489 0 0 1 -1.754266,-1.783935" /> - <path - style="opacity:1;fill:#ffff00;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.40162328;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4380" - sodipodi:type="arc" - sodipodi:cx="1.5112727" - sodipodi:cy="11.812865" - sodipodi:rx="0.84983104" - sodipodi:ry="0.8436057" - sodipodi:start="2.3268943" - sodipodi:end="5.4319826" - d="M 0.92821389,12.426604 A 0.84983104,0.8436057 0 0 1 0.88246619,11.245375 0.84983104,0.8436057 0 0 1 2.0713785,11.178412 L 1.5112727,11.812865 Z" /> - <path - style="opacity:1;fill:#ffff00;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.50709417;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4380-4" - sodipodi:type="arc" - sodipodi:cx="5.4738126" - sodipodi:cy="20.904537" - sodipodi:rx="1.1014514" - sodipodi:ry="1.1388382" - sodipodi:start="2.288325" - sodipodi:end="5.4377386" - d="m 4.7495811,21.762575 a 1.1014514,1.1388382 0 0 1 -0.3560156,-1.080423 1.1014514,1.1388382 0 0 1 0.729113,-0.857034 1.1014514,1.1388382 0 0 1 1.0818337,0.227264 l -0.7306996,0.852155 z" - transform="matrix(0.85691816,-0.51545249,0.70172322,0.71244966,0,0)" /> - </g> -</svg> diff --git a/htdocs/public/symbols/icons/62-2.png b/htdocs/public/symbols/icons/62-2.png deleted file mode 100755 index 0f2bf5b36e9e8fb6087009cecac20c696cefa5d0..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/62-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/63-1.png b/htdocs/public/symbols/icons/63-1.png deleted file mode 100755 index 476e3121d349491ac9b059324c840544eab62a05..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/63-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/63-2.png b/htdocs/public/symbols/icons/63-2.png deleted file mode 100755 index 6a6d597fb43208a79cff06b4722550777b98b4bf..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/63-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/64-1.png b/htdocs/public/symbols/icons/64-1.png deleted file mode 100755 index d37e76f70eac706a3a940c5a687cb6283de7acf7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/64-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/64-2.png b/htdocs/public/symbols/icons/64-2.png deleted file mode 100755 index 655d57f257b45d238bb6dac46366730bd89179d2..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/64-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/65-1.png b/htdocs/public/symbols/icons/65-1.png deleted file mode 100755 index 4b4bf358c9adbf1b064b5ae362faf1ea583f8442..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/65-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/65-2.png b/htdocs/public/symbols/icons/65-2.png deleted file mode 100755 index 29c4b7d9070add1d70e1ead7fd4ba957e542fdcc..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/65-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/66-1.png b/htdocs/public/symbols/icons/66-1.png deleted file mode 100755 index 2dce183c93c0a998bfcd4dfe7f332dff1662503c..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/66-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/66-2.png b/htdocs/public/symbols/icons/66-2.png deleted file mode 100755 index 4bc23cf550880f04a6d6b9d01ffb017d27fad852..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/66-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/67-1.png b/htdocs/public/symbols/icons/67-1.png deleted file mode 100755 index 548fb93b2b207a7d1974e3793146587a788405ff..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/67-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/67-2.png b/htdocs/public/symbols/icons/67-2.png deleted file mode 100755 index 2fa7f60047c2cc274f2e999db47042105a3effcf..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/67-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/68-1.png b/htdocs/public/symbols/icons/68-1.png deleted file mode 100755 index 9a99f2851e16323e5c5174321002f9a79ae4d79b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/68-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/68-2.png b/htdocs/public/symbols/icons/68-2.png deleted file mode 100755 index 8e31f43a854ea60f6e2d0340979c15dd3946a3be..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/68-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/69-1.png b/htdocs/public/symbols/icons/69-1.png deleted file mode 100755 index d60450fd28667e5e773dc9a42c5116fad1d4f39e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/69-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/69-2.png b/htdocs/public/symbols/icons/69-2.png deleted file mode 100755 index f6fab0f13f258e57cedbf1d7cca908aa95972024..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/69-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/70-1.png b/htdocs/public/symbols/icons/70-1.png deleted file mode 100755 index 3576fa91f69f6a7edf05f9b10acbe91820768d8a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/70-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/70-2.png b/htdocs/public/symbols/icons/70-2.png deleted file mode 100755 index cc3488904a5c5c57c06ca98a6b2956c902c206ec..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/70-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/71-1.png b/htdocs/public/symbols/icons/71-1.png deleted file mode 100755 index f372c554e042dae568086d3c1d18c035038db56d..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/71-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/71-2.png b/htdocs/public/symbols/icons/71-2.png deleted file mode 100755 index 0df603172423e780482af59399528a7a577d5897..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/71-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/72-1.png b/htdocs/public/symbols/icons/72-1.png deleted file mode 100755 index dbd286935393791a158bd932b431893fea0ca973..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/72-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/72-2.png b/htdocs/public/symbols/icons/72-2.png deleted file mode 100755 index f1b1e57928b5bcba1e5ce66891658ae3aa48e71c..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/72-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/73-1.png b/htdocs/public/symbols/icons/73-1.png deleted file mode 100755 index 2354f488479173396619914702e2fa381c2ce7ce..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/73-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/73-2.png b/htdocs/public/symbols/icons/73-2.png deleted file mode 100755 index 5cc39dd8e603fde9ae9d526873d7a7ce46327bf7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/73-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/74-1.png b/htdocs/public/symbols/icons/74-1.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/74-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/74-2.png b/htdocs/public/symbols/icons/74-2.png deleted file mode 100755 index 0ae51340cbda1e553868e147d304abc06470ca0e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/74-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/75-1.png b/htdocs/public/symbols/icons/75-1.png deleted file mode 100755 index 30bece8d49f0a8e964aca1ae35de78c8684314f7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/75-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/75-2.png b/htdocs/public/symbols/icons/75-2.png deleted file mode 100755 index eba53c6d14379fefc04bdf30ae500e072231fab5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/75-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/76-1.png b/htdocs/public/symbols/icons/76-1.png deleted file mode 100755 index 74b3e85a9722e0e18e2df915ab1884f2ef6aec3b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/76-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/76-2.png b/htdocs/public/symbols/icons/76-2.png deleted file mode 100755 index 1d090821055880f13d748edd83fc59c0a0eb3841..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/76-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/77-1.png b/htdocs/public/symbols/icons/77-1.png deleted file mode 100755 index a00e2c4d0a9879e2ccb8296d05514a7dbceda49a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/77-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/77-2.png b/htdocs/public/symbols/icons/77-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/77-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/78-1.png b/htdocs/public/symbols/icons/78-1.png deleted file mode 100755 index bc352a0b20bc4bed3e8c7f10d22768252ff917bd..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/78-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/78-2.png b/htdocs/public/symbols/icons/78-2.png deleted file mode 100755 index b49eaefba74ff79ab700bc3f55a9ce5af3cf18aa..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/78-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/79-1.png b/htdocs/public/symbols/icons/79-1.png deleted file mode 100755 index 1bcf0061934f3c20b2a7f963445798dd752e9ad8..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/79-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/79-2.png b/htdocs/public/symbols/icons/79-2.png deleted file mode 100755 index 2cc4e5417557de1eca35c5885dd22d992ce5c31d..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/79-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/80-1.png b/htdocs/public/symbols/icons/80-1.png deleted file mode 100755 index f037b7fcdc5c86989a3476f1c4127b0bf85ab027..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/80-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/80-2.png b/htdocs/public/symbols/icons/80-2.png deleted file mode 100755 index a736df9c42c956e7dae85ce86bb034a1fdbb6341..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/80-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/81-1.png b/htdocs/public/symbols/icons/81-1.png deleted file mode 100755 index 43753804d2ba69f699ed0b59058545d8304a71b2..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/81-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/81-2.png b/htdocs/public/symbols/icons/81-2.png deleted file mode 100755 index 304182be1e7a5eecc623070d9481e056c335be69..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/81-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/82-1.png b/htdocs/public/symbols/icons/82-1.png deleted file mode 100755 index 588818dc9411621f04da72fd130470739af4e7b1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/82-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/82-2.png b/htdocs/public/symbols/icons/82-2.png deleted file mode 100755 index a3eac8a3f56e953553e649d355f48db10f66e72b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/82-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/83-1.png b/htdocs/public/symbols/icons/83-1.png deleted file mode 100755 index 2b870affa4cd624357597de967fabd603c186b8a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/83-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/83-2.png b/htdocs/public/symbols/icons/83-2.png deleted file mode 100755 index 5ffb898d9662cb78e8d8d2d2126ea4e48ae9cfd1..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/83-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/84-1.png b/htdocs/public/symbols/icons/84-1.png deleted file mode 100755 index ac19132f2a620076c53747448698782185680f0a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/84-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/84-2.png b/htdocs/public/symbols/icons/84-2.png deleted file mode 100755 index fe9dd5d742296290cc5281f01e1c9bb8f2453135..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/84-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/85-1.png b/htdocs/public/symbols/icons/85-1.png deleted file mode 100755 index 2b874b734dadee76f5ed49500c8879cdd50206de..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/85-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/85-2.png b/htdocs/public/symbols/icons/85-2.png deleted file mode 100755 index 5657beefed36435e3992f9e499449173a0569e58..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/85-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/86-1.png b/htdocs/public/symbols/icons/86-1.png deleted file mode 100755 index 990682cf3e3c6e48afcf3a1d1d96cde6fa99c16b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/86-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/86-2.png b/htdocs/public/symbols/icons/86-2.png deleted file mode 100755 index e325cd800db9e41f5c3488258ec47f896fece82a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/86-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/87-1.png b/htdocs/public/symbols/icons/87-1.png deleted file mode 100755 index 967246f286f112c89ab3faf446a351b880795a8b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/87-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/87-2.png b/htdocs/public/symbols/icons/87-2.png deleted file mode 100755 index bdefa72a7ace4aeb8794e5d64ef49a17fed16474..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/87-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/88-1.png b/htdocs/public/symbols/icons/88-1.png deleted file mode 100755 index 417eb64bc3777f42b32f1f0379f9c8e2cca66dce..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/88-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/88-2.png b/htdocs/public/symbols/icons/88-2.png deleted file mode 100755 index 32ff405e906ebcb7c24bdc8b351de40a9a7f03fa..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/88-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/89-1.png b/htdocs/public/symbols/icons/89-1.png deleted file mode 100755 index 9e52ef517898574c7da37213567f232f1c00adbf..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/89-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/89-2.png b/htdocs/public/symbols/icons/89-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/89-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/90-1.png b/htdocs/public/symbols/icons/90-1.png deleted file mode 100755 index bad1b738c2757c4e7f06e7afb57a07ee66aa23b0..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/90-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/90-2.png b/htdocs/public/symbols/icons/90-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/90-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/91-1.png b/htdocs/public/symbols/icons/91-1.png deleted file mode 100755 index 4e56743e1227b9a4ada96c482e9ce28dc751f248..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/91-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/91-2.png b/htdocs/public/symbols/icons/91-2.png deleted file mode 100755 index c1cefdfed647500ea591a9d25aee4a9b78752d8e..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/91-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/92-1.png b/htdocs/public/symbols/icons/92-1.png deleted file mode 100755 index a88ae2cb57c24b6b4f12ba9999ae7195ccb40268..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/92-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/92-2.png b/htdocs/public/symbols/icons/92-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/92-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/93-1.png b/htdocs/public/symbols/icons/93-1.png deleted file mode 100755 index 51244768f13981197b89ed17943ab23dec852ba2..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/93-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/93-2.png b/htdocs/public/symbols/icons/93-2.png deleted file mode 100755 index dee7bb238f0b1cc57e6ca81f1016dbd165ed8928..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/93-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/94-1.png b/htdocs/public/symbols/icons/94-1.png deleted file mode 100755 index 4575d4e1c35e92c5de151d3a637755b6789b1632..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/94-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/94-2.png b/htdocs/public/symbols/icons/94-2.png deleted file mode 100755 index f4ea80a4648f6bf007a4544367b8e530cb5f6d9a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/94-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/95-1.png b/htdocs/public/symbols/icons/95-1.png deleted file mode 100755 index d1fcfe56ad72c0699caac980b028d2c088317f04..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/95-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/95-2.png b/htdocs/public/symbols/icons/95-2.png deleted file mode 100755 index 0339a3c42fd95f6bfb406f3ee220afeecd8743a0..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/95-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/96-1.png b/htdocs/public/symbols/icons/96-1.png deleted file mode 100755 index f9084733c9f4bef00d7ae343aa049e87d33ff213..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/96-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/96-2.png b/htdocs/public/symbols/icons/96-2.png deleted file mode 100755 index 58a29620497e901cc1b3f0ce06987becfdfb8d8d..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/96-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/97-1.png b/htdocs/public/symbols/icons/97-1.png deleted file mode 100755 index 192b503d4654bc5e3198b9c1321bfe646914f390..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/97-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/97-2.png b/htdocs/public/symbols/icons/97-2.png deleted file mode 100755 index 8ddf159848806235ec3d017e75ab7b87887b8f6d..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/97-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/98-1.png b/htdocs/public/symbols/icons/98-1.png deleted file mode 100755 index 99aaeaac0f633dc7c3440421703d482f37b64894..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/98-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/98-2.png b/htdocs/public/symbols/icons/98-2.png deleted file mode 100755 index 9ed506b8b0dd865b75ba45380ec9d079977895bd..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/98-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/99-1.png b/htdocs/public/symbols/icons/99-1.png deleted file mode 100755 index 3c0e000ba2e2541c01c313ae960021179f7e1eb8..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/99-1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/99-2.png b/htdocs/public/symbols/icons/99-2.png deleted file mode 100755 index 417eee9c155752e092150b0793a6294b6dd79dd7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/99-2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/Icon-set.gif b/htdocs/public/symbols/icons/Icon-set.gif deleted file mode 100755 index 5c33bf91d699fd6efb24e893ab64b1c64e9d201b..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/Icon-set.gif and /dev/null differ diff --git a/htdocs/public/symbols/icons/dot.png b/htdocs/public/symbols/icons/dot.png deleted file mode 100755 index 0d77c340b05896966921ea47c2423b2a76ae35da..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/dot.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/dotColor0.png b/htdocs/public/symbols/icons/dotColor0.png deleted file mode 100755 index faaba3d32c2218c0dce98fa8d8c35c051273e68a..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/dotColor0.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/dotColor1.png b/htdocs/public/symbols/icons/dotColor1.png deleted file mode 100755 index c52ccc7ddc9436361e94f0bc4542f79280daf3f7..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/dotColor1.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/dotColor2.png b/htdocs/public/symbols/icons/dotColor2.png deleted file mode 100755 index 61084ba3eb697adbd3bb5912ce11be5f3e786ff5..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/dotColor2.png and /dev/null differ diff --git a/htdocs/public/symbols/icons/dotColor3.png b/htdocs/public/symbols/icons/dotColor3.png deleted file mode 100755 index 3571cbe9e405086c368b10e574f93e3285fd9048..0000000000000000000000000000000000000000 Binary files a/htdocs/public/symbols/icons/dotColor3.png and /dev/null differ diff --git a/htdocs/public/symbols/svgicons/100-1.svg b/htdocs/public/symbols/svgicons/100-1.svg deleted file mode 100755 index 4f44880d30e95c721afd40210dad5f40ed62e257..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/100-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3957"/> - <path d="m 2.3225454,23.562785 19.2338326,0 0,-11.58873 2.006407,0 L 12.025945,0.43721472 0.43721467,12.025945 l 1.91992393,0 z" id="path3961" inkscape:connector-curvature="0" fill="#ff0000" stroke="#000000" stroke-linejoin="round" stroke-width="0.874"/> - <text x="3.626" y="18.335" id="text4509" sodipodi:linespacing="125%" transform="scale(0.86944981,1.1501526)" fill="#e6e6e6" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="8.05"><tspan sodipodi:role="line" id="tspan4511" x="3.626" y="18.335">FIRE</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/100-2.svg b/htdocs/public/symbols/svgicons/100-2.svg deleted file mode 100755 index d65a4284233781d0531208b587a9beb0804c1380..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/100-2.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - <text x="1.773" y="8.688" id="text2985" sodipodi:linespacing="125%" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="9"><tspan sodipodi:role="line" id="tspan2987" x="1.773" y="8.688">D</tspan> - </text> - <text x="14.825" y="8.688" id="text2985-9" sodipodi:linespacing="125%" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="9"><tspan sodipodi:role="line" id="tspan2987-2" x="14.825" y="8.688">X</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/101-1.svg b/htdocs/public/symbols/svgicons/101-1.svg deleted file mode 100755 index a77b74a1648c995b4a5edd802129054e6f3bee1c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/101-1.svg +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="-0.258 -0.548 24.000001 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="101-1.svg"> - <defs - id="defs10" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview8" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-5.440678" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4206"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g4752" - transform="matrix(0.94457081,0,0,0.94457081,-48.338123,48.378111)"> - <path - d="m 60.945313,-47.661027 c 0.925776,0 1.674641,-0.747216 1.674641,-1.667339 0,-0.92766 -0.749101,-1.674641 -1.674641,-1.674641 -0.920122,0 -1.667339,0.747217 -1.667339,1.674641 0,0.920123 0.747217,1.667339 1.667339,1.667339 z" - id="path4198" - inkscape:connector-curvature="0" - style="fill:#231f20" /> - <path - d="m 73.362252,-42.848406 -1.770517,-0.338744 -1.030603,2.048249 c 0.167488,0.03863 0.340393,0.05701 0.517068,0.05701 1.098917,2.36e-4 2.01904,-0.746981 2.284052,-1.766512 z m -21.756674,3.458114 c 0,-1.358275 1.098681,-2.462375 2.456957,-2.462375 l 5.180575,0 0,-3.721242 c 0,-0.925776 0.747217,-1.672992 1.674642,-1.672992 0.925775,0 1.672992,0.747216 1.672992,1.672992 l 0,0.57596 2.468029,0.631318 c 0.430615,0.09941 0.706699,0.530024 0.609174,0.960639 -0.09752,0.437918 -0.530024,0.708584 -0.966293,0.61106 l -2.11091,-0.495161 0,1.437426 2.484518,0 6.79821,-7.033776 -0.202351,1.829408 3.347633,2.224925 c 0.552168,0.316601 0.752635,1.030602 0.437918,1.58277 -0.248522,0.441687 -0.743447,0.65511 -1.209162,0.568657 l -0.27043,-0.0497 c -0.322019,1.302917 -1.499851,2.263557 -2.898644,2.263557 -0.276084,0 -0.54463,-0.04052 -0.798806,-0.108596 l -2.535872,5.180575 0,7.107509 c 0,0.609174 -0.500578,1.104335 -1.109753,1.104335 -0.609174,0 -1.104335,-0.495161 -1.104335,-1.104335 l 0,-7.269578 -5.59635,0 -1.001157,1.713274 2.09442,4.992829 c 0.30553,0.535442 0.114014,1.207278 -0.414125,1.507154 -0.535443,0.303645 -1.207278,0.114014 -1.512808,-0.414126 l -2.444001,-5.763602 0,-1.834827 -1.093263,1.720813 0,5.348063 c 0,0.609174 -0.495161,1.104335 -1.104335,1.104335 -0.609175,0 -1.109753,-0.495161 -1.109753,-1.104335 l 0,-6.176315 0.914704,-1.431772 0,-4.843951 -0.909051,1.391255 0,4.032189 -1.748373,0 0,-4.074356 z" - id="path4200" - inkscape:connector-curvature="0" - style="fill:#231f20" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/101-2.svg b/htdocs/public/symbols/svgicons/101-2.svg deleted file mode 100755 index 27c2148924d1fe5f520888d31b29270b685e2dd2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/101-2.svg +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3064"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <path inkscape:connector-curvature="0" id="path4305" d="m 21.887317,1035.9366 c -0.04771,0 -0.09492,0 -0.141903,0.01 -0.597417,0.034 -1.132448,0.2812 -1.450926,0.6765 -0.114029,0.1416 -0.356407,0.1856 -0.541427,0.098 -0.120747,-0.057 -0.186751,-0.1554 -0.186832,-0.2563 0,-0.054 0.01842,-0.1085 0.05808,-0.1576 0.470154,-0.5838 1.272944,-0.9406 2.162251,-0.9657 -0.07538,-1.9228 -2.096246,-3.4714 -4.60875,-3.5349 0.153647,0.3492 0.264017,0.7142 0.325154,1.0919 0.02671,0.1649 -0.126498,0.3152 -0.342209,0.3357 -0.0039,4e-4 -0.0077,3e-4 -0.01174,5e-4 -0.01238,0 -0.02486,0 -0.03704,0 -0.19576,0 -0.365416,-0.1116 -0.390113,-0.264 -0.06388,-0.3948 -0.187836,-0.7742 -0.364008,-1.1332 -0.403386,-0.8222 -1.081649,-1.5369 -1.94461,-2.0838 -0.117327,-0.074 -0.238033,-0.1454 -0.361917,-0.2135 -1.075092,-0.5898 -2.389908,-0.9346 -3.797595,-0.9346 -0.120263,0 -0.239924,0 -0.3589004,0.01 -0.6587147,0.028 -1.2965944,0.1304 -1.8964644,0.2993 -1.6054185,0.4524 -2.9383334,1.3778 -3.6691258,2.5956 0.096694,-0.01 0.1940307,-0.01 0.2920515,-0.01 1.0352724,0 2.0340235,0.2333 2.888257,0.6747 0.1124203,0.058 0.173075,0.1527 0.1731957,0.2492 8.04e-5,0.058 -0.0218,0.1168 -0.067493,0.1685 -0.1217117,0.1378 -0.3663014,0.1739 -0.546375,0.08 -0.7235926,-0.3738 -1.5699427,-0.5714 -2.4475854,-0.5714 -0.2474454,0 -0.4900641,0.015 -0.7264082,0.046 -0.068377,0.028 -0.1471319,0.041 -0.2269322,0.034 -0.027873,0.01 -0.055667,0.01 -0.083339,0.014 -1.9151274,0.357 -3.3410755,1.6796 -3.3410755,3.2525 0,4e-4 -4.022e-5,7e-4 -4.022e-5,0 6.8377e-4,2.0145 2.13666982,3.6474 4.77148832,3.6474 l 12.0025086,0 4.47638,0 c 1.249454,0 2.262645,-0.7746 2.262645,-1.7302 0,-0.788 -0.838548,-1.4292 -1.869194,-1.4292 z" fill="#b3b3b3" stroke="#808080" stroke-width="0.487"/> - <g id="g4307" transform="matrix(0.04105515,0,0,0.04105515,-0.19392772,1024.4556)"> - <path inkscape:connector-curvature="0" id="path4309" d="m 45.378,497.42 c -3.818,10.365 1.488,21.863 11.853,25.682 2.281,0.84 4.616,1.238 6.912,1.238 8.14,0 15.791,-5.008 18.769,-13.092 l 49.855,-135.322 -42.627,0 -44.762,121.494 z" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" id="path4311" d="m 181.378,497.42 c -3.818,10.365 1.488,21.863 11.853,25.682 2.281,0.84 4.616,1.238 6.912,1.238 8.14,0 15.791,-5.008 18.769,-13.092 l 49.855,-135.322 -42.627,0 -44.762,121.494 z" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" id="path4313" d="m 317.379,497.42 c -3.818,10.365 1.488,21.863 11.853,25.682 2.28,0.84 4.616,1.238 6.912,1.238 8.14,0 15.79,-5.008 18.769,-13.092 l 49.855,-135.322 -42.628,0 -44.761,121.494 z" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" id="path4315" d="m 498.139,375.926 -44.76,121.494 c -3.818,10.365 1.488,21.863 11.853,25.682 2.28,0.84 4.616,1.238 6.912,1.238 8.14,0 15.79,-5.008 18.769,-13.092 l 49.855,-135.322 -42.629,0 z" fill="#b3b3b3"/> - </g> - <circle id="circle4505" transform="matrix(0.98480773,-0.17364829,0.17364829,0.98480773,0,0)" r="1.219" cy="1026.49" cx="-174" fill="#80b3ff"/> - <circle id="circle4515" transform="matrix(0.98480773,-0.17364829,0.17364829,0.98480773,0,0)" r="1.219" cy="1029.18" cx="-175.93" fill="#80b3ff"/> - <circle id="circle4505-8" transform="matrix(0.98480773,-0.17364829,0.17364829,0.98480773,0,0)" r="1.219" cy="1027.47" cx="-168.42" fill="#80b3ff"/> - <circle id="circle4515-0" transform="matrix(0.98480773,-0.17364829,0.17364829,0.98480773,0,0)" r="1.219" cy="1030.17" cx="-170.34" fill="#80b3ff"/> - <circle id="circle4505-8-9" transform="matrix(0.98480773,-0.17364829,0.17364829,0.98480773,0,0)" r="1.219" cy="1028.42" cx="-163.01" fill="#80b3ff"/> - <circle id="circle4515-0-6" transform="matrix(0.98480773,-0.17364829,0.17364829,0.98480773,0,0)" r="1.219" cy="1031.12" cx="-164.94" fill="#80b3ff"/> - <text x="-0.156" y="1052.23" id="text3098" sodipodi:linespacing="125%" fill="#1a1a1a" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="7"><tspan sodipodi:role="line" id="tspan3100" x="-0.156" y="1052.23">SLEET</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/102-1.svg b/htdocs/public/symbols/svgicons/102-1.svg deleted file mode 100755 index 4816ec49cce549e4d259665553ccf9394907528f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/102-1.svg +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata16"/> - <rect x="-16.834" y="8.951" height="5.149" width="16.834" id="rect6" transform="scale(-1,1)" fill="#ff0000"/> - <path inkscape:connector-curvature="0" d="m 17.262338,8.262819 0,6.38346 -10.0774435,0.0082 c 0.5913749,0.483155 0.9605805,1.149107 0.9557546,2.023167 l 10.0037429,-0.006 c 0.09583,-3.391009 4.906836,-3.379471 5.011375,-0.0196 0.722587,-0.0054 0.822818,-0.169504 0.829785,-0.835124 l 0,-2.54551 c 0.0091,-1.137564 0.151138,-0.386644 -0.690943,-2.543831 C 22.428158,8.4281362 22.667023,8.6406854 21.883322,8.5813386 L 17.262338,8.262819 Z m 2.001581,3.763825 -0.03988,-2.7121043 2.57251,0.1595355 c 0.468983,0.031418 0.472886,0.034362 0.638143,0.5783168 l 0.658084,1.754891 c 0.22108,0.538266 0.185892,0.696875 -0.418781,0.6182 l -3.410073,-0.398839 z m -19.25064324,2.632702 -0.00490023,1.434155 1.66120227,0.588036 1.4585673,-9.33e-4 c -0.00594,-0.831598 0.3396595,-1.53102 0.9524215,-2.022334 l -4.06729084,0.0011 z" id="path4" fill="#ff0000" fill-rule="evenodd"/> - <circle r="1.472" cx="-5.635" cy="16.624" id="circle10" transform="scale(-1,1)" fill="none" stroke="#000000" stroke-width="1.487"/> - <path d="m 0.06519882,5.2563742 3.67926758,0 0,2.9947522 -2.84501464,0 C 0.22810636,8.3130312 0.02206606,7.9484071 0.03311293,7.3847869 Z" id="path4266" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" fill="#1a1a1a" fill-rule="evenodd" stroke-width="3.488"/> - <path id="path4230-7" d="m 4.2792429,6.4865296 0,1.4332034 3.123098,0 0,-1.4118114 z m 7.6580091,0 0,1.4332034 3.123097,0 0,-1.4118114 z m -3.8290057,0 0,1.4332034 3.1230987,0 0,-1.4118114 z m -6.609845,1.4009481 2.0107626,-1.3904208 0,1.4118117 -2.0963258,0 m 15.3587959,-2.0749345 -13.818638,0 -2.28884665,1.7326778 0,0.9412071 16.17165965,0 0,-0.6203413 -1.026772,0 0,-1.4118114 0.98399,0 z" inkscape:connector-curvature="0" fill="#4d4d4d" fill-rule="evenodd" stroke-width="3.488"/> - <path inkscape:connector-curvature="0" d="m 21.614958,8.1381339 0.02868,-0.4101547 -0.535784,-0.037466 0.01815,-0.2595229 C 21.158279,6.9694151 20.781066,6.5681619 20.282189,6.533277 19.784115,6.4984483 19.355121,6.8435282 19.322858,7.3049026 l -0.01815,0.2595228 -0.524293,-0.036662 -0.02868,0.4101547 2.863221,0.2002159 z" id="path3" fill="#0000ff" stroke="#000000" stroke-width="0"/> - <path d="M 21.214851,7.0125175 21.738875,6.8378429" id="path4411" inkscape:connector-curvature="0" fill="#0000ff" fill-rule="evenodd" stroke="#0000ff" stroke-width="0.111"/> - <path d="M 19.318657,6.8472358 18.842401,6.5674276" id="path4411-1" inkscape:connector-curvature="0" fill="#0000ff" fill-rule="evenodd" stroke="#0000ff" stroke-width="0.111"/> - <path d="m 20.752567,6.4995702 0.351836,-0.425823" id="path4411-4" inkscape:connector-curvature="0" fill="#0000ff" fill-rule="evenodd" stroke="#0000ff" stroke-width="0.111"/> - <path d="M 19.836981,6.4496678 19.616145,5.943361" id="path4411-4-2" inkscape:connector-curvature="0" fill="#0000ff" fill-rule="evenodd" stroke="#0000ff" stroke-width="0.111"/> - <circle r="1.472" cx="-20.651" cy="16.624" id="circle10-6" transform="scale(-1,1)" fill="none" stroke="#000000" stroke-width="1.487"/> - <rect id="rect3343" width="13.212" height="0.379" x="1.723" y="11.36" fill="#ffffff" fill-rule="evenodd" stroke="#ffffff" stroke-width="0.706"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/102-2.svg b/htdocs/public/symbols/svgicons/102-2.svg deleted file mode 100755 index b5f4fb9ae647f86c15d8d4759517f80b9d31146e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/102-2.svg +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g transform="matrix(0.08683674,0,0,0.12984142,3.5732685,1034.444)" id="g3405" fill="#4d4d4d"> - <g id="g3509"> - <path inkscape:connector-curvature="0" d="m 61.254807,4.999999 0,2 c -12.621002,1.629901 -27.061005,4.7024 -38,11.4684 -11.507004,7.117199 -9.490997,16.063301 2,21.531601 -2.535995,-13.834801 24.475998,-21.2733 35,-19 -7.85701,4.938299 -37.820007,12.626499 -16.001999,23.621899 2.25499,1.136002 4.563004,1.798603 7.001999,2.378101 -8.223999,-11.623299 13.093002,-14.979 21,-16 -3.404999,4.229698 -14.292999,3.501999 -15.218002,10.039398 -0.899002,6.361401 10.871002,8.882801 15.218002,9.699802 13.065994,2.4557 29.030703,2.5117 42.000003,-0.638901 4.61149,-1.1203 17.0063,-5.137302 13.91359,-12.006901 -1.41739,-3.148399 -5.4102,-4.907799 -7.91359,-7.093399 8.3441,-1.2341 18.63359,4.719498 16,14 2.10899,-0.921898 4.0885,-1.860199 5.96449,-3.223801 18.70981,-13.5991 -11.95689,-18.598499 -16.96449,-25.7762 12.94209,1.6713 34.612,5.9484 35,22.000001 2.1483,-1.917702 4.48039,-3.7542 6.19749,-6.091 C 177.6577,16.659798 148.58,6.909198 138.25481,4.155098 c -3.668,-0.978399 -7.6133,-1.0165 -10,-4.155099 15.2339,1.203899 32.7129,5.132899 46,12.876499 6.28795,3.6646 13.32872,10.0522 10.25772,18.123501 -2.76161,7.258099 -11.49953,11.5462 -18.25772,14.188301 -16.82201,6.5765 -35.98741,9.983597 -54,10.772297 C 84.948807,57.156299 56.663804,56.2877 30.254807,48.709098 21.236802,46.121101 10.155808,43.918998 3.387803,36.895099 c -7.645004,-7.935501 -1.042999,-15.4701 6.867004,-19.632 14.806,-7.7901 34.358002,-11.5485 51,-12.263101 z" id="path1365"/> - <path inkscape:connector-curvature="0" d="m 70.254807,42 c 5.369003,-1.971802 10.352997,-2.606598 16,-3.168999 4.231995,-0.421501 7.767998,-0.421501 12,0 l 7.000003,0.607998 c 2.17399,0.344101 11.19619,1.819798 8.10959,5.851902 -1.90999,2.495098 -7.2558,2.824299 -10.10959,3.2701 C 95.077607,49.838101 73.358811,51.857201 70.254807,42 Z" id="path1605"/> - <path inkscape:connector-curvature="0" d="m 177.99594,40.912319 c -2.26642,12.892502 -16.72382,17.374199 -28,19.789402 -28.3129,6.064102 -55.64762,3.871994 -84.000014,0.210598 9.261002,-3.886002 22.1464,0.392101 32,-0.0394 28.575794,-1.251202 56.046294,-3.301403 80.000014,-19.960602 z" id="path1609"/> - <path inkscape:connector-curvature="0" d="m 173.25481,59 c -4.2818,14.376198 -22.65641,14.798904 -35,16.4244 -28.04901,3.693703 -59.458011,-2.149002 -86.000003,-11.091805 -10.475998,-3.529896 -24.57901,-8.821396 -28,-20.332596 8.263992,3.475399 15.481003,9.102398 24,12.315598 38.215996,14.414398 87.339703,20.267502 125.000003,2.684402 z" id="path1627"/> - <path inkscape:connector-curvature="0" d="m 164.25481,74 c -1.5712,15.199005 -22.54,14 -34,14 -28.863,0 -74.668002,-1.978104 -93.000003,-28 9.51799,1.8353 18.641998,8.528 28,11.645096 C 94.757805,81.471802 135.80611,89.602997 164.25481,74 Z" id="path1699"/> - <path inkscape:connector-curvature="0" d="m 151.25481,82 -1,1 1,-1 z" id="path1775"/> - <path inkscape:connector-curvature="0" d="m 137.25481,93 c -15.87451,14.72299 -56.256,7.877 -70.000003,-7 10.156998,-0.596405 22.635994,5.794006 33.000003,7.410004 12.30829,1.917999 24.7016,-0.376007 37,-0.410004 z" id="path1797"/> - <path inkscape:connector-curvature="0" d="m 71.254807,95 c 17.209999,9.79401 35.089603,9.013 54.000003,9 -9.73851,10.34 -32.788005,9.522 -44.000003,2.3 -3.865997,-2.49 -10.106003,-6.298 -10,-11.3 z" id="path1819"/> - <path inkscape:connector-curvature="0" d="m 72.254807,107 c 14.245995,8.313 23.916,5.653 39.000003,7 -7.16851,8.588 -21.832004,9.218 -31.000003,3.44099 C 76.6418,115.164 71.311799,111.698 72.254807,107 Z" id="path1855"/> - <path inkscape:connector-curvature="0" d="m 94.254807,124 c -3.297302,5.44 -9.484009,7.22501 -10,14 -6.074997,-3.64999 -12.81601,-10.162 -15,-17 9.421997,2.713 15.110992,3.78 25,3 z" id="path1887"/> - </g> - </g> - <path inkscape:connector-curvature="0" d="m 21.713332,1037.3646 c -0.04689,0 -0.09328,0 -0.13944,0.012 -0.58687,0.039 -1.112518,0.3181 -1.425407,0.7652 -0.112021,0.1601 -0.350146,0.2099 -0.531908,0.112 -0.118609,-0.064 -0.183411,-0.1756 -0.183494,-0.2898 0,-0.061 0.01807,-0.1226 0.05707,-0.1782 0.46192,-0.6603 1.250558,-1.0639 2.124216,-1.0923 -0.07408,-2.175 -2.059334,-3.9268 -4.527686,-3.9986 0.150968,0.3951 0.25941,0.8079 0.319475,1.2353 0.02622,0.1866 -0.12429,0.3563 -0.336189,0.3795 -0.0038,5e-4 -0.0077,10e-5 -0.01152,7e-4 -0.01218,0 -0.02442,0 -0.0364,0 -0.192344,0 -0.358994,-0.1262 -0.383245,-0.2987 -0.06274,-0.4466 -0.18452,-0.8756 -0.357638,-1.2819 -0.396296,-0.9298 -1.062623,-1.7383 -1.910383,-2.3569 -0.115232,-0.084 -0.233842,-0.1646 -0.355539,-0.2414 -1.056117,-0.667 -2.347806,-1.0573 -3.730727,-1.0573 -0.118156,0 -0.235736,0 -0.3526155,0.012 -0.6470995,0.031 -1.2737389,0.1474 -1.8630373,0.3385 -1.5771987,0.5118 -2.8866319,1.5586 -3.6045433,2.9359 0.094978,-0.012 0.1906141,-0.012 0.2869094,-0.012 1.0170893,0 1.9982377,0.2637 2.8374343,0.7631 0.1104575,0.066 0.1700295,0.1728 0.1701531,0.2818 8.22e-5,0.066 -0.021408,0.1324 -0.066284,0.1908 -0.1195558,0.1558 -0.3598616,0.1966 -0.5367664,0.092 -0.7108716,-0.423 -1.5423283,-0.6466 -2.4044972,-0.6466 -0.2430641,0 -0.4813936,0.018 -0.7135889,0.054 -0.067146,0.031 -0.1445455,0.046 -0.2229321,0.038 -0.027378,0.012 -0.054672,0.012 -0.081845,0.016 -1.881564,0.4037 -3.28247539,1.8999 -3.28247539,3.679 0,4e-4 -4.123e-5,8e-4 -4.123e-5,0 6.9987e-4,2.2787 2.09906162,4.1259 4.68754512,4.1259 l 11.7912384,0 4.39763,0 c 1.227506,0 2.222817,-0.8764 2.222817,-1.9572 0,-0.8915 -0.823799,-1.6167 -1.836277,-1.6167 z" id="path3614" fill="#b3b3b3" stroke="#4d4d4d" stroke-width="0.534"/> - <text x="1.596" y="1052.36" id="text3475" sodipodi:linespacing="125%" font-family="sans-serif" fill="#1a1a1a" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="8.75"><tspan sodipodi:role="line" id="tspan3477" x="1.596" y="1052.36">F</tspan> - </text> - <text x="16.497" y="1052.24" id="text3475-1" sodipodi:linespacing="125%" font-family="sans-serif" fill="#1a1a1a" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="8.75"><tspan sodipodi:role="line" id="tspan3477-7" x="16.497" y="1052.24">C</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/103-1.svg b/htdocs/public/symbols/svgicons/103-1.svg deleted file mode 100755 index 97780e206acc401b481dc26a798ad24da3b85fc1..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/103-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata17"/> - <g id="g4180" transform="matrix(1.0127819,0,0,1.0127819,-0.24080261,-0.17759904)"> - <path d="m 13.941942,11.960746 c 0.601141,0.205439 1.252519,-0.106889 1.461379,-0.706533 0.20886,-0.601141 -0.108598,-1.25252 -0.709739,-1.4613797 -0.599645,-0.2088601 -1.25252,0.1085987 -1.46138,0.7097397 -0.203729,0.596438 0.110309,1.252733 0.70974,1.458173 z" id="path9" inkscape:connector-curvature="0"/> - <path sodipodi:nodetypes="ccccccccccccccccccccccccccccc" d="M 11.797545,8.6023093 11.44182,12.22476 9.1471382,12.787635 c -0.2037294,0.04682 -0.3758199,0.147078 -0.5160576,0.272138 l -5.0387232,4.865136 c -0.2973637,0.282186 -0.3039908,0.756557 -0.016675,1.04879 0.2821856,0.297364 0.7565567,0.308908 1.0487898,0.02672 l 3.792831,-3.654303 4.6430228,-1.137294 -0.03164,0.01005 0.773231,-0.197103 0.70974,0.808291 c 0.110308,0.120143 0.265511,0.193682 0.43247,0.193682 l 2.500122,0.01005 c 0.314038,0 0.574632,-0.255463 0.574632,-0.574632 l 0,0 c 0,-0.277269 -0.193681,-0.491046 -0.449359,-0.554537 l -1.86221,-6.4849279 z m 5.214234,5.2758017 c -0.569502,0 -1.518244,-0.0049 -1.805346,-0.0049 -0.272138,-0.307411 -1.347864,-1.523161 -1.347864,-1.523161 -0.01497,-0.02181 -0.04169,-0.02672 -0.05686,-0.04169 -0.272138,-0.318955 -0.704822,-0.482709 -1.137293,-0.380737 l -0.67297,0.16696 0.359145,-3.6592205 2.844303,-0.8617349 1.81689,6.3044964 z" id="path11" inkscape:connector-curvature="0"/> - <path sodipodi:nodetypes="csccccc" d="m 23.07216,4.463962 c 0,0 -3.773916,-0.4529368 -11.610758,-0.4529368 -5.7801351,0 -10.50210258,0.4529368 -10.50210258,0.4529368 0,0 1.95759978,0.8634881 1.61831308,3.5353982 0,0 2.8096608,-0.3343004 3.986673,2.0729118 0,0 -0.1009115,0.03153 16.6182025,-5.035283 0.36027,-0.1558268 0.331181,-0.5244092 -0.110328,-0.573027 z" id="path11-9" inkscape:connector-curvature="0" fill="#ff0000" stroke="#550000" stroke-width="0.5"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/103-2.svg b/htdocs/public/symbols/svgicons/103-2.svg deleted file mode 100755 index ad132490a44124a76ea5422f193ecdad24fe56a1..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/103-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4196"/> - <path d="m 8.4874864,0.50166737 c 0,22.94102163 0,23.01852463 0,23.01852463" id="path4200" inkscape:connector-curvature="0" fill="none" fill-rule="evenodd" stroke="#000000" stroke-linecap="round"/> - <path sodipodi:type="star" id="path4202" sodipodi:sides="3" sodipodi:cx="11.072906" sodipodi:cy="4.9913278" sodipodi:r1="5.1861811" sodipodi:r2="2.5930905" sodipodi:arg1="2.0943951" sodipodi:arg2="3.1415927" inkscape:flatsided="true" inkscape:rounded="0" inkscape:randomized="0" d="m 8.479815,9.4826923 0,-8.98272909 7.779272,4.49136459 z" inkscape:transform-center-x="-1.479492" transform="matrix(1.1411034,0,0,1.020518,-1.079427,-0.01340882)" fill="#d50000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round"/> - <path sodipodi:type="star" id="path4202-7" sodipodi:sides="3" sodipodi:cx="11.072906" sodipodi:cy="4.9913278" sodipodi:r1="5.1861811" sodipodi:r2="2.5930905" sodipodi:arg1="2.0943951" sodipodi:arg2="3.1415927" inkscape:flatsided="true" inkscape:rounded="0" inkscape:randomized="0" d="m 8.479815,9.4826923 0,-8.98272909 7.779272,4.49136459 z" inkscape:transform-center-x="-1.479492" transform="matrix(1.1411034,0,0,1.020518,-1.1093532,9.0607759)" fill="#d50000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/104-1.svg b/htdocs/public/symbols/svgicons/104-1.svg deleted file mode 100755 index 4fad64aeef09c9512f8679eae03fbb8f4cd4be4c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/104-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata17"/> - <rect id="rect4242" width="24" height="24" x="-0.258" y="-0.548" rx="4" fill="#000080" stroke-width="0.5"/> - <text x="2.343" y="20.565" id="text4244" sodipodi:linespacing="125%" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" letter-spacing="0" font-size="25"><tspan sodipodi:role="line" id="tspan4246" x="2.343" y="20.565">H</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/104-2.svg b/htdocs/public/symbols/svgicons/104-2.svg deleted file mode 100755 index 4b79fd6876e204912f5e5bd4fe2cd1f251759061..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/104-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata7"/> - <g inkscape:label="Camada 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <path d="m 23.310235,1028.8715 c -0.037,6e-4 -0.0751,0 -0.11147,0.01 -6.7e-4,2e-4 -0.001,-1e-4 -0.002,0 l -3.67436,0.6276 c -0.23368,0.04 -0.42959,0.2003 -0.51606,0.4211 a 0.16705751,0.16705751 0 0 0 0,0 l -1.70506,4.3721 -16.63986969,0.4149 c -0.19136,0 -0.37099,0.091 -0.49542,0.2353 -0.1244,0.1441 -0.18429,0.3358 -0.16101,0.5264 l 0.91859,7.5985 c 0.0379,0.3188 0.30127999,0.5716 0.62133999,0.5966 l 11.8631997,0.9433 2.35117,1.8496 a 0.16705751,0.16705751 0 0 0 0.008,0.01 c 0.003,0 0.006,0 0.008,0 0.003,0 0.005,0 0.008,0.01 0.42908,0.3203 0.53543,0.7566 0.47479,0.9991 -0.0346,0.1381 -0.0873,0.2397 -0.21262,0.3179 -0.12532,0.078 -0.34179,0.1348 -0.71216,0.1135 a 0.16705751,0.16705751 0 0 0 -0.004,0 c -0.0119,-4e-4 -0.0252,-3e-4 -0.0371,0 -0.002,0 -0.004,-10e-5 -0.006,0 l -14.1483297,0.041 -0.002,0 c -0.37180999,0 -0.68473999,0.3095 -0.68325999,0.6812 0.001,0.3717 0.31561,0.6824 0.68739999,0.6771 7.2e-4,0 10e-4,0 0.002,0 l 1.03419,0 c -0.38426,0.2449 -0.64198,0.6734 -0.64198,1.1601 0,0.7569 0.61995,1.3768 1.37685,1.3768 0.75692,0 1.37685,-0.6199 1.37685,-1.3768 0,-0.4893 -0.2584,-0.9221 -0.6461,-1.1663 l 11.6505897,-0.033 c -0.41975,0.2366 -0.70598,0.6859 -0.70598,1.1993 0,0.7569 0.61993,1.3768 1.37685,1.3768 0.75692,0 1.37686,-0.6199 1.37686,-1.3768 0,-0.6574 -0.46699,-1.2115 -1.0858,-1.3459 0.58509,-0.207 1.03455,-0.6338 1.31286,-1.286 a 0.16705751,0.16705751 0 0 0 0.0103,-0.025 c 0.21336,-0.8532 -0.16506,-1.7808 -0.94542,-2.3842 a 0.16705751,0.16705751 0 0 0 -0.006,-0.01 c -0.002,0 -0.002,0 -0.004,-0.01 a 0.16705751,0.16705751 0 0 0 -0.0227,-0.023 l -1.66584,-1.3067 5.1957,-13.3082 3.2966,-0.5615 c 6.6e-4,-10e-5 0.001,2e-4 0.002,0 0.34631,-0.056 0.59958,-0.3784 0.56973,-0.7287 -0.0299,-0.3509 -0.33564,-0.6261 -0.68739,-0.6213 z m -6.51063,6.4818 -0.95781,2.4565 -1.24886,0 0,-2.4008 2.20667,-0.056 z m -2.68352,0.068 0,2.3883 -2.30575,0 0,-2.3305 2.30575,-0.058 z m -2.7826,0.068 0,2.3202 -2.3057497,0 0,-2.2624 2.3057497,-0.058 z m -2.7825997,0.07 0,2.25 -2.30576,0 0,-2.1922 2.30576,-0.058 z m -2.7826,0.07 0,2.1799 -2.30576,0 0,-2.1221 2.30576,-0.058 z m -2.7826,0.068 0,2.1117 -1.69061,0 -0.24978,-2.0621 1.94039,-0.05 z m -1.63281,2.5865 1.63281,0 0,2.1572 -1.37272,0 -0.26009,-2.1572 z m 2.10965,0 2.30576,0 0,2.1572 -2.30576,0 0,-2.1572 z m 2.7826,0 2.30576,0 0,2.1572 -2.30576,0 0,-2.1572 z m 2.78261,0 2.3057497,0 0,2.1572 -2.3057497,0 0,-2.1572 z m 2.7825997,0 2.30575,0 0,2.1572 -2.30575,0 0,-2.1572 z m 2.7826,0 1.06515,0 -0.84222,2.1572 -0.22293,0 0,-2.1572 z m -12.9221697,2.6319 1.31492,0 0,1.5482 -1.13946,-0.091 -0.17546,-1.4574 z m 1.79176,0 2.30576,0 0,1.7691 -2.30576,-0.1837 0,-1.5854 z m 2.7826,0 2.30576,0 0,1.99 -2.30576,-0.1817 0,-1.8083 z m 2.78261,0 2.3057497,0 0,2.2129 -2.3057497,-0.1837 0,-2.0292 z m 2.7825997,0 2.30575,0 0,1.3129 -0.43762,1.1209 c -0.0568,-0.028 -0.11873,-0.044 -0.18165,-0.05 l -1.68648,-0.1342 0,-2.25 z m 2.7826,0 0.0351,0 -0.0351,0.097 0,-0.097 z m -11.6815597,8.7483 c 0.44991,0 0.80918,0.3593 0.80918,0.8092 0,0.4499 -0.35927,0.8071 -0.80918,0.8071 -0.44989,0 -0.80919,-0.3572 -0.80919,-0.8071 0,-0.4499 0.3593,-0.8092 0.80919,-0.8092 z m 13.0522097,0 c 0.4499,0 0.80919,0.3593 0.80919,0.8092 0,0.4499 -0.35929,0.8071 -0.80919,0.8071 -0.4499,0 -0.80918,-0.3572 -0.80918,-0.8071 0,-0.4499 0.35928,-0.8092 0.80918,-0.8092 z m -13.0522097,0.3839 c -0.24442,0 -0.43968,0.1953 -0.43968,0.4397 0,0.2444 0.19526,0.4376 0.43968,0.4376 0.24442,0 0.43969,-0.1932 0.43969,-0.4376 0,-0.2444 -0.19527,-0.4397 -0.43969,-0.4397 z m 13.0522097,0 c -0.24442,0 -0.43968,0.1953 -0.43968,0.4397 0,0.2444 0.19526,0.4376 0.43968,0.4376 0.24442,0 0.43968,-0.1932 0.43968,-0.4376 0,-0.2444 -0.19526,-0.4397 -0.43968,-0.4397 z" id="path3847" inkscape:connector-curvature="0" color="#000000" stroke-width="15.5" fill="#550000"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/105-1.svg b/htdocs/public/symbols/svgicons/105-1.svg deleted file mode 100755 index 0577b4c6a137570bdc1e287d96d986231d3b7e92..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/105-1.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.1" width="24" height="24"> - <metadata id="metadata26"/> - <path inkscape:connector-curvature="0" id="path6-9" d="M 0.42237017,20.852183 C 1.4886938,21.641264 2.6475758,22.253 3.8782569,22.569115 c 2.0606033,0.632017 3.9047512,0.997097 5.9958112,1.1718 1.0803169,0.09786 2.4267789,0.121537 3.4780879,0.103979 1.148719,0.03236 3.06396,0.134213 3.06396,0.134213 1.492934,-0.09743 3.020733,-0.125285 4.329408,-0.525325 1.16385,-0.500881 2.142446,-1.482579 2.983006,-2.530347 0.550327,-1.131092 -0.573852,-2.065826 -1.349076,-2.451413 -1.584141,-1.093048 -3.36483,-1.490939 -5.387889,-2.103011 C 15.387074,15.896081 14.028803,15.67259 11.583978,14.996822 9.4965832,14.749861 7.5530337,15.26673 6.2960009,15.657008 4.3380386,16.436501 4.9218724,16.35612 2.6306795,17.363095 1.5947333,17.95343 0.28957936,18.6799 0.12804054,20.191189 c -0.006513,0.261309 0.0969278,0.53011 0.29432963,0.660994 z" sodipodi:nodetypes="cccccccccccccc" fill="#2a7fff" stroke-width="0.255"/> - <path inkscape:connector-curvature="0" id="path6" d="m 2.7730463,20.337108 c 0.8607735,0.540145 1.7962623,0.958893 2.7897109,1.175281 1.6633903,0.432631 3.3793443,-0.02419 5.0673198,0.0954 0.872069,-0.09363 1.655922,0.340182 2.504575,0.392413 0.927285,0.02215 1.866334,-0.08029 2.776392,0.156119 1.072561,0.206361 2.230089,0.444281 3.267555,-0.03836 0.9395,-0.342865 1.729455,-1.01486 2.407986,-1.732083 0.444242,-0.774259 -0.463235,-1.414107 -1.089021,-1.67805 -1.278774,-0.748219 -2.716208,-1.156875 -4.081423,-1.71214 -1.348774,-0.505452 -2.766658,-0.794726 -4.097323,-1.348165 -1.042133,-0.396197 -2.182444,-0.22411 -3.2507381,-0.04781 -1.6876819,0.351863 -3.1450431,1.341724 -4.5124108,2.349031 -0.836251,0.404097 -1.8898162,0.901385 -2.0202169,1.935898 -0.00525,0.178873 0.078247,0.362873 0.2375941,0.452464 z" fill="#e5b380" stroke-width="0.19"/> - <path inkscape:connector-curvature="0" id="path8" d="m 14.155551,20.157272 c -0.108809,0.123074 -0.712277,-0.223187 -0.88619,-0.17749 -0.173914,0.0457 -0.436605,0.619553 -0.609194,0.570419 -0.172587,-0.04913 0.0319,-0.639557 -0.07344,-0.764754 -0.10534,-0.125197 -0.834465,-0.158301 -0.83232,-0.311741 0.0021,-0.15344 0.731991,-0.172081 0.840801,-0.295154 0.10881,-0.123074 -0.07912,-0.717388 0.09479,-0.763085 0.173913,-0.0457 0.420497,0.533205 0.593085,0.582337 0.17259,0.04913 0.785564,-0.285068 0.890905,-0.159871 0.10534,0.125198 -0.472111,0.50162 -0.474255,0.655059 -0.0021,0.153439 0.564629,0.541207 0.455819,0.66428 z" fill="#f3f98f" stroke-width="0.338"/> - <path inkscape:connector-curvature="0" id="path10" d="M 8.7185804,17.631722 C 7.6474285,12.043944 9.4008377,7.2022748 13.759866,3.5144596 14.286828,3.470482 14.218373,3.9973953 13.83578,4.2926727 10.355637,8.1216331 9.669201,12.985452 10.120977,17.983736 9.7056131,17.646691 9.2814064,17.346933 8.7185804,17.631722 Z" fill="#9c6434" stroke-width="0.237"/> - <path inkscape:connector-curvature="0" id="path12" d="m 14.200774,3.9008721 c 0.846883,0.8169903 1.492017,1.7650085 2.110296,2.7560443 l 0.392165,-0.6594174 0.209479,0.8337544 3.856939,1.5668713 -2.276069,-3.6008689 -1.04933,0.079075 c 0.005,-0.1957562 0.07546,-0.5014145 0.08051,-0.6971694 C 16.552831,3.7037343 15.546575,3.3106627 14.459617,3.529059 14.370307,3.558324 14.226546,3.546675 14.169112,3.599897 l 0.03165,0.3009754 z" fill="#026333" stroke-width="0.237"/> - <path inkscape:connector-curvature="0" id="path14" d="M 13.693886,3.9300053 C 12.67843,4.5224553 11.828091,5.2901655 10.993699,6.106054 L 10.768177,5.3721624 10.368051,6.1324177 6.2512902,6.7379065 9.3117522,3.7804582 10.312603,4.1067214 c 0.04126,-0.1913914 0.04491,-0.5050974 0.08617,-0.6964882 1.056408,-0.2308717 2.126745,-0.3735697 3.131299,0.096998 0.07987,0.049664 0.222292,0.072519 0.265542,0.1378807 l -0.101726,0.284893 z" fill="#026333" stroke-width="0.237"/> - <path inkscape:connector-curvature="0" id="path16" d="m 13.847257,3.9837972 c -0.28159,1.2232894 -0.792609,2.3329258 -1.357456,3.4413939 l 0.814474,0 -0.644791,0.6473913 0.678727,4.3954436 2.036184,-4.0547117 -0.644791,-0.9199767 C 14.910597,7.3911179 15.227337,7.2888987 15.408331,7.1866789 15.310666,6.0350583 15.119277,4.896888 14.327093,4.0184255 14.251693,3.9524265 14.183828,3.8141139 14.104017,3.7904499 l -0.25676,0.1933473 z" fill="#026333" stroke-width="0.252"/> - <path inkscape:connector-curvature="0" id="path18" d="M 13.70466,3.7179063 C 12.708895,3.3516704 11.687172,3.2017038 10.641327,3.0906587 L 11.01885,2.50992 10.262073,2.6695945 7.4677368,0.14827983 11.279478,0.5758619 11.631314,1.4620384 c 0.156194,-0.081672 0.37531,-0.2601348 0.531504,-0.3418078 0.769281,0.6034346 1.485609,1.2674602 1.739762,2.2394902 0.01173,0.084353 0.07811,0.1968542 0.05785,0.2647289 l -0.255769,0.093457 z" fill="#026333" stroke-width="0.214"/> - <path inkscape:connector-curvature="0" id="path20" d="M 14.110627,3.5996953 C 15.06045,3.30601 16.023993,3.2160071 17.008209,3.163618 L 16.683281,2.6015113 17.38373,2.7882401 20.122147,0.56628391 16.533904,0.77861736 16.161309,1.5906377 c -0.142187,-0.084135 -0.33853,-0.2619512 -0.480717,-0.3460832 -0.749455,0.5268353 -1.452311,1.1129868 -1.737683,2.0101682 -0.0151,0.078367 -0.08273,0.1803834 -0.06708,0.2449039 l 0.2348,0.1000687 z" fill="#026333" stroke-width="0.201"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/105-2.svg b/htdocs/public/symbols/svgicons/105-2.svg deleted file mode 100755 index 3ef2ad08c336775a5cce12c0b192cda7a71d3c22..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/105-2.svg +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="-0.258 -0.548 24.000001 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="105-2.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-0.76271186" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata19"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <rect - id="rect4191" - width="14.886283" - height="14.886283" - x="4.2988591" - y="4.0088582" - style="stroke:#000000;stroke-width:4.06287098" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/106-1.svg b/htdocs/public/symbols/svgicons/106-1.svg deleted file mode 100755 index 6c56a634b9f34892e20ef8812e35e60b5d731ee2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/106-1.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata19"/> - <g id="g3339-7" transform="matrix(1.206235,0,0,1.206235,12.018091,-3.1654974)"> - <circle r="1.188" cy="14.952" cx="5.523" id="path3341-1" fill="#666666" fill-rule="evenodd"/> - <path sodipodi:nodetypes="ssscssssss" d="m 5.4550981,16.158002 c 0.6654362,0 1.2007092,-0.540525 1.2007092,-1.20779 0,-0.660182 -0.535273,-1.200707 -1.2007092,-1.200707 -0.6672637,0 -1.2025361,0.540525 -1.2025361,1.200707 2.256e-4,0.667265 0.5355008,1.20779 1.2025361,1.20779 z m -2.7777529,-1.20779 c 0,-1.528858 1.2418136,-2.774098 2.7777529,-2.774098 1.5306879,0 2.7725006,1.24524 2.7725006,2.774098 0,1.536169 -1.2418127,2.779581 -2.7725006,2.779581 -1.5359393,0 -2.7777529,-1.24364 -2.7777529,-2.779581 z" id="path9-0-5-2" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0.319"/> - </g> - <path inkscape:connector-curvature="0" id="path11" d="m 22.660454,11.946482 -0.0052,-2.7536211 c 0,-1.0969109 -0.97583,-0.9809973 -0.97583,-0.9809973 l -5.517577,0 -2.012988,-3.3958637 -1.184744,0 2.012987,3.3958637 -1.525072,2.5797514 -3.4767336,-0.0052 C 8.77486,8.3205887 6.333711,8.4751402 6.333711,8.4751402 l -6.59157429,0 0,5.8617228 0.94235947,0 c 0.1264716,-1.993669 2.04106752,-3.574901 4.06461322,-3.574901 2.0235456,0 3.9435329,1.584827 4.0646131,3.574901 l 5.7300845,0.0052 c 0.121081,-1.995466 2.041068,-3.580292 4.064613,-3.580292 2.023546,0 3.9487,1.584826 4.064614,3.583661 l 0.356277,0.0036 c 0.394915,0 0.712554,-0.321234 0.712554,-0.714351 l 0,-1.688385 -1.081411,0 z" fill="#165016"/> - <g id="g3339" transform="matrix(1.206235,0,0,1.206235,-1.8384114,-3.165498)"> - <circle r="1.188" cy="14.952" cx="5.523" id="path3341" fill="#666666" fill-rule="evenodd"/> - <path sodipodi:nodetypes="ssscssssss" d="m 5.4550981,16.158002 c 0.6654362,0 1.2007092,-0.540525 1.2007092,-1.20779 0,-0.660182 -0.535273,-1.200707 -1.2007092,-1.200707 -0.6672637,0 -1.2025361,0.540525 -1.2025361,1.200707 2.256e-4,0.667265 0.5355008,1.20779 1.2025361,1.20779 z m -2.7777529,-1.20779 c 0,-1.528858 1.2418136,-2.774098 2.7777529,-2.774098 1.5306879,0 2.7725006,1.24524 2.7725006,2.774098 0,1.536169 -1.2418127,2.779581 -2.7725006,2.779581 -1.5359393,0 -2.7777529,-1.24364 -2.7777529,-2.779581 z" id="path9-0-5" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0.319"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/106-2.svg b/htdocs/public/symbols/svgicons/106-2.svg deleted file mode 100755 index 72563dcd91d83e3438083912d04cec867a5419a8..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/106-2.svg +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.1" width="24" height="24"> - <defs id="defs5962"> - <linearGradient id="linearGradient7499-4"> - <stop id="stop7501-1" stop-color="#6f6f6f"/> - <stop id="stop7503-6" offset="0.143" stop-color="#868686"/> - <stop id="stop7505-4" offset="0.407" stop-color="#a0a0a0"/> - <stop id="stop7507-6" offset="0.638" stop-color="#ebebeb"/> - <stop id="stop7509-45" offset="0.869" stop-color="#cfcfcf"/> - <stop id="stop7511-3" offset="1" stop-color="#aaaaaa"/> - </linearGradient> - <linearGradient id="linearGradient7069-4"> - <stop id="stop7071-13" stop-color="#ffcb05"/> - <stop id="stop7073-0" offset="1" stop-color="#cca111"/> - </linearGradient> - </defs> - <g id="layer1" inkscape:label="Calque 1" inkscape:groupmode="layer" transform="translate(-21.451,-697.80301)"> - <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccsscc" d="m 43.681028,714.25418 -6.766915,-10.07764 -0.524206,-0.95153 c 0.0083,-0.75691 0.07198,-1.51382 0.142961,-2.27071 0.09304,-0.99196 0.794441,-0.77411 1.096043,-0.21626 l 6.933439,12.82417 c 0.354441,0.5572 0.02043,1.16472 -0.881605,0.69202 z" id="path7035" stroke="#000000" stroke-width="0.034"/> - <path inkscape:connector-curvature="0" sodipodi:nodetypes="ssccssss" d="m 43.834539,713.63701 c -0.297107,-0.38351 -1.351861,-0.97532 -1.852204,-0.50443 -0.838518,0.78916 -2.300849,1.5219 -3.948667,1.36352 l -0.504431,0.74088 c 1.78335,1.54714 3.586468,2.83815 6.202942,0.74876 0.224445,-0.17924 0.42854,-0.37473 0.535959,-0.63842 0.08262,-0.20282 0.09969,-0.40214 -0.02365,-0.81969 -0.08489,-0.2874 -0.15742,-0.56481 -0.409843,-0.89062 z" id="path6705"/> - <path inkscape:connector-curvature="0" d="m 38.034673,714.49811 -0.283741,-0.45715 -1.749744,-0.23645 1.529041,1.43448 z" id="path6713" stroke="#000000" stroke-width="0.034"/> - <path inkscape:connector-curvature="0" sodipodi:nodetypes="cssccc" d="m 32.070628,715.40947 c 0.608902,-5.02052 3.643428,-9.6517 5.514731,-14.11066 0.30419,-0.72477 -0.116764,-0.56943 -0.978237,-0.49917 -0.296187,0.0242 -0.665862,0.37389 -0.665862,0.37389 -3.350587,4.22342 -6.496453,8.51552 -9.678506,12.79522 z" id="path7677"/> - <g transform="matrix(-0.02812885,0,0,0.02812885,-19.094846,670.95925)" id="g7047" stroke="#000000"> - <circle r="12.142" cy="1121.56" cx="-2319.47" transform="matrix(1.1569,0,0,1.1569,689.23,-228.12)" id="path7049" color="#000000" stroke-width="0.8"/> - <path d="m -2005.3,1064.9 c 3.2045,-9.62 17.065,-13.506 23.523,2.47 -9.2702,-11.147 -15.601,-10.329 -23.523,-2.47 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc" id="path7051"/> - </g> - <path d="m 27.472082,707.06943 3.756911,0.0677 1.319995,1.28615 1.049228,2.43691 0.50769,3.04614 -0.50769,1.52308 -7.581513,-2.30153 0.135384,-4.46768 0.676921,-1.32 z" id="path4677" inkscape:connector-curvature="0" fill="#b3b3b3" fill-rule="evenodd" stroke="#000000" stroke-width="0.034"/> - <path d="m 27.828115,706.74921 2.591478,0.0157 c 1.864199,0.0113 2.538103,1.97252 3.136987,3.41123 0.570437,1.37046 0.882712,2.87373 0.683721,5.27919 l -8.407963,-1.2994 -0.04712,-5.30867 c 0.197932,-1.42799 1.137658,-2.10376 2.042819,-2.0983 z m 0.09319,0.60729 c -0.553383,-0.004 -1.551791,0.31065 -1.564322,2.24909 l -0.01152,1.71613 2.203011,0.23245 -0.07748,-4.1745 -0.4984,-0.022 c -0.01687,-7.4e-4 -0.03345,-9e-4 -0.0513,-10e-4 z m 1.469032,10e-4 -0.06701,4.29613 4.263622,0.5319 c -0.238086,-0.88854 -1.23898,-4.81647 -3.344322,-4.81647 l -0.852288,-0.0115 z m 0.233492,5.03426 c -0.12549,-0.002 -0.245012,0.0442 -0.245012,0.20313 l 0,0.52038 c 0,0.20805 0.129641,0.47749 0.343436,0.5424 l 2.845921,0.86381 c 0.2634,0.0799 1.182188,0.17958 1.162252,-0.39892 l -0.02199,-0.64184 c -0.01324,-0.38404 -0.290053,-0.64371 -0.841835,-0.70885 l -3.188284,-0.3759 c -0.01784,-0.002 -0.03652,-0.004 -0.05445,-0.004 z" inkscape:connector-curvature="0" id="path7755" stroke="#000000" stroke-width="0.221"/> - <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccssssccc" d="m 34.214997,715.3691 -7.772357,-2.45796 0,-0.93006 c 0,-0.4019 -0.22021,-0.59787 -0.775024,-0.59787 l -1.70508,0 c -0.654671,0 -0.642173,0.376 -0.642173,0.73073 l 0,3.96374 10.916882,0 z" id="path7867" fill="#ff6600" stroke="#000000" stroke-width="0.436"/> - <rect id="rect8131" height="4.31" width="14.371" y="716.69" x="-35.822" transform="scale(-1,1)" color="#000000" rx="2.155"/> - </g> - <metadata id="metadata244"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/107-1.svg b/htdocs/public/symbols/svgicons/107-1.svg deleted file mode 100755 index 745533bad814d98a8b6b22f85ff2a0e99312ee25..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/107-1.svg +++ /dev/null @@ -1,125 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="-0.258 -0.548 24.000001 24" - id="svg4618" - inkscape:version="0.91 r13725" - sodipodi:docname="107-1.svg"> - <defs - id="defs4633" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="640" - inkscape:window-height="480" - id="namedview4631" - showgrid="false" - inkscape:zoom="19.666667" - inkscape:cx="10.675699" - inkscape:cy="13.645399" - inkscape:window-x="445" - inkscape:window-y="357" - inkscape:window-maximized="0" - inkscape:current-layer="svg4618" /> - <metadata - id="metadata19"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3339-8" - transform="matrix(1.0958316,0,0,1.0958316,13.068522,-1.4329655)"> - <circle - r="1.188" - cy="14.952" - cx="5.523" - id="path3341-5" - fill="#666666" - fill-rule="evenodd" /> - <path - sodipodi:nodetypes="ssscssssss" - d="m 5.4550981,16.158002 c 0.6654362,0 1.2007092,-0.540525 1.2007092,-1.20779 0,-0.660182 -0.535273,-1.200707 -1.2007092,-1.200707 -0.6672637,0 -1.2025361,0.540525 -1.2025361,1.200707 2.256e-4,0.667265 0.5355008,1.20779 1.2025361,1.20779 z m -2.7777529,-1.20779 c 0,-1.528858 1.2418136,-2.774098 2.7777529,-2.774098 1.5306879,0 2.7725006,1.24524 2.7725006,2.774098 0,1.536169 -1.2418127,2.779581 -2.7725006,2.779581 -1.5359393,0 -2.7777529,-1.24364 -2.7777529,-2.779581 z" - id="path9-0-2" - inkscape:connector-curvature="0" - stroke="#000000" - stroke-width="0.319" /> - </g> - <circle - id="path3341-9" - cx="19.05" - cy="14.827" - r="1.188" - fill="#666666" - fill-rule="evenodd" /> - <g - id="g3339" - transform="matrix(1.0958316,0,0,1.0958316,-0.52251938,-1.4329662)"> - <circle - r="1.188" - cy="14.952" - cx="5.523" - id="path3341" - fill="#666666" - fill-rule="evenodd" /> - <path - sodipodi:nodetypes="ssscssssss" - d="m 5.4550981,16.158002 c 0.6654362,0 1.2007092,-0.540525 1.2007092,-1.20779 0,-0.660182 -0.535273,-1.200707 -1.2007092,-1.200707 -0.6672637,0 -1.2025361,0.540525 -1.2025361,1.200707 2.256e-4,0.667265 0.5355008,1.20779 1.2025361,1.20779 z m -2.7777529,-1.20779 c 0,-1.528858 1.2418136,-2.774098 2.7777529,-2.774098 1.5306879,0 2.7725006,1.24524 2.7725006,2.774098 0,1.536169 -1.2418127,2.779581 -2.7725006,2.779581 -1.5359393,0 -2.7777529,-1.24364 -2.7777529,-2.779581 z" - id="path9-0" - inkscape:connector-curvature="0" - stroke="#000000" - stroke-width="0.319" /> - </g> - <path - style="fill:#e6e6e6;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="M 8.768122,5.7866079 14.232681,5.5075598 17.164673,10.37949 8.5566171,10.611368 Z" - id="path4754" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccc" /> - <path - sodipodi:nodetypes="cccccccccccccsccsccsccc" - inkscape:connector-curvature="0" - id="path11" - d="m 22.75482,12.282904 -0.0047,-2.5137827 c 0,-1.0013709 -0.890836,-0.8955533 -0.890836,-0.8955533 l -5.037,0 -1.837659,-3.1000867 -1.081553,0 1.837657,3.1000867 -1.392239,1.136307 -3.173913,-0.0047 C 10.4849,8.9728233 7.8501235,9.1139135 7.8501235,9.1139135 l -8.10816334,0 0,5.3511715 2.00956154,0 c 0.115456,-1.820022 1.8632922,-3.26353 3.7105887,-3.26353 1.8472964,0 3.6000543,1.44679 3.7105886,3.26353 l 6.172428,0.0047 c 0.110535,-1.821662 1.863292,-3.268451 3.710588,-3.268451 1.847297,0 3.604772,1.446789 3.71059,3.271527 l 0.325245,0.0033 c 0.360518,0 0.650491,-0.293255 0.650491,-0.652132 l 0,-1.541328 -0.987221,0 z" - fill="#800000" - style="fill:#800000" /> - <rect - id="rect3336-6" - width="6.191" - height="1.527" - x="5.02" - y="-9.649" - transform="matrix(0,1,-1,0,0,0)" - fill="#800000" - fill-rule="evenodd" - style="fill:#800000" /> - <path - d="m 8.1231182,5.0144994 6.4302758,0 0.631319,1.1125532 -7.0381574,-0.00961 z" - id="path4156" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccc" - fill="#800000" - fill-rule="evenodd" - style="fill:#800000" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/107-2.svg b/htdocs/public/symbols/svgicons/107-2.svg deleted file mode 100755 index e6525a91046c8b9cd1524c459a65ad780c6060a7..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/107-2.svg +++ /dev/null @@ -1,81 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - enable-background="new 0 0 1000 600" - height="24" - id="Shape_1_7_" - overflow="visible" - version="1.1" - viewBox="0 0 24 24" - width="24" - xml:space="preserve" - inkscape:version="0.91 r13725" - sodipodi:docname="107-2.svg" - style="overflow:visible"><metadata - id="metadata12"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs - id="defs10" /><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview8" - showgrid="false" - inkscape:zoom="28.963094" - inkscape:cx="6.8080044" - inkscape:cy="18.809498" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="Shape_1_7_" - showguides="false" /><path - style="fill:#e6e6e6;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="M 2.2905532,7.0474501 12.64907,7.0772571 17.545906,11.229782 0.9604041,10.550176 Z" - id="path4754" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccc" /><g - id="Shape_1" - transform="matrix(0.03259342,0,0,0.03259342,-6.7040498,2.4819419)" - style="fill:#800000"><g - id="g4" - style="fill:#800000"><path - d="m 219.11831,311.436 c -0.022,0.005 -0.032,0.003 -0.056,0.009 0.024,0.139 0.043,0.128 0.056,-0.009 z M 941.987,332.575 c 1.476,-52.841 -33.835,-74.252 -32.12,-72.974 -8.865,-6.607 -20.691,-9.007 -32.965,-12.397 21.246,5.869 -30.112,-5.286 -143.693,-17.75 -2.16,-0.094 -4.32,-0.188 -6.48,-0.281 -22.21592,-15.3252 -26.194,-19.84328 -34.373,-25.61628 -24.20348,-20.55582 -65.04568,-54.59248 -73.69602,-60.576 -20.5372,-13.81947 -25.36669,-13.09519 -57.478,-17.186 0,0 -34.41662,-3.834 -69.20062,-5.042 -56.897,-1.977 -59.22177,-1.14794 -59.22177,-1.14794 0,0 -10.29628,-0.44906 -64.23328,1.77994 -32.192,1.331 -57.895,3.538 -57.895,3.538 0,0 -39.964,6.832 -38.318,6.224 -16.795,6.207 -4.993,7.6 -4.508,10.425 -9.25,9.972 -25.809,27.88228 -47.053,90.70028 -1.77,5.233 -1.238,11.699 -2.536,17.188 0,22.552 1.117,59.737 0.901,61.977 3.723,-0.819 -22.681,14.576 -9.917,58.612 1.274,4.397 7.411,17.749 10.153,14.138 -12.241,16.121 26.23477,24.601 82.84877,29.028 -2.35,-7.895 -3.617,-16.253 -3.617,-24.908 0,-58.84291 46.96623,-95.75377 95.43923,-95.75377 48.473,0 95.95709,34.01536 96.80881,95.75377 0.14307,10.37001 -1.815,20.317 -5.14,29.548 1.244,-0.013 1.904,-0.021 1.904,-0.021 l 207.10605,0.467 c -4.41,-10.433 -6.0455,-21.92293 -6.85,-33.927 -3.48821,-52.04824 44.40983,-95.00472 92.88283,-95.00472 48.473,0 97.86913,38.90097 95.7505,95.00472 -0.45698,12.10137 -2.471,23.645 -6.936,34.132 l 4.628,0.006 c 0,0 31.2835,2.535 36.8155,-12.115 1.754,-1.079 5.025,-0.462 7.044,-1.127 6.262,-2.064 16.019,-14.87 12.397,-12.679 7.087,-4.291 10.955,-38.623 11.552,-60.016 z M 399.50952,160.78231 353.02052,228.077 c 0,0 61.37379,0.282 -97.76121,-0.146 13.339,-45.461 46.34,-72.04469 46.34,-72.04469 l 91.43021,-8.005 c 0,0 7.981,-0.04 9.017,2.745 2.233,2.728 -2.537,10.156 -2.537,10.156 z m 22.08935,69.95369 c 0,0 -16.209,-15.43728 -18.878,-23.79728 -1.136,-3.561 -0.391,-8.308 0.521,-11.395 -0.005,0.007 0.008,-0.039 0.044,-0.157 -0.016,0.049 -0.029,0.107 -0.044,0.157 0.127,-0.175 13.628,-32.09641 24.274,-41.32141 13.686,-7.696 64.52812,-1.69 64.52812,-1.69 l 0.037,78.05869 z m 224.62854,-33.00196 c -11.544,14.993 0.82333,36.79096 0.82333,36.79096 l -125.45162,-0.048 c 0,0 0.265,-77.31869 0.265,-71.23869 0.839,-3.864 0.624,-7.521 2.536,-10.143 1.871,-2.565 25.43498,-2.26 28.86098,-3.381 0.707,0.027 16.02428,-0.88 37.83228,6.198 26.11437,11.24671 34.46442,26.75419 55.13403,41.82173 z" - id="path6" - inkscape:connector-curvature="0" - style="fill:#800000" - sodipodi:nodetypes="cccccccccccccccccccccccssscccssscccccccccccccccccccccccccccccc" /></g></g><path - style="overflow:visible;fill:#666666;stroke:#000000;stroke-width:1.88725293;stroke-miterlimit:4;stroke-dasharray:none" - id="path3514-1-1-5" - sodipodi:type="arc" - sodipodi:cx="6.1523438" - sodipodi:cy="15.137695" - sodipodi:rx="1.8765619" - sodipodi:ry="1.8765619" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - d="m 4.2757819,15.137695 a 1.8765619,1.8765619 0 0 1 1.8761116,-1.876562 1.8765619,1.8765619 0 0 1 1.8770119,1.875662 1.8765619,1.8765619 0 0 1 -1.8752106,1.877462 1.8765619,1.8765619 0 0 1 -1.8779121,-1.87476" - sodipodi:open="true" /><path - style="overflow:visible;fill:#666666;stroke:#000000;stroke-width:1.88725293;stroke-miterlimit:4;stroke-dasharray:none" - id="path3514-1-1-5-5" - sodipodi:type="arc" - sodipodi:cx="18.782524" - sodipodi:cy="15.057586" - sodipodi:rx="1.8765619" - sodipodi:ry="1.8765619" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - d="m 16.905962,15.057586 a 1.8765619,1.8765619 0 0 1 1.876112,-1.876562 1.8765619,1.8765619 0 0 1 1.877012,1.875661 1.8765619,1.8765619 0 0 1 -1.875211,1.877462 1.8765619,1.8765619 0 0 1 -1.877912,-1.87476" - sodipodi:open="true" /></svg> diff --git a/htdocs/public/symbols/svgicons/107-65.svg b/htdocs/public/symbols/svgicons/107-65.svg deleted file mode 100755 index 5f09ee8e456bfbb39eee4d88d04d1b4e3980bc37..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/107-65.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata25"/> - <path d="m 18.726837,7.1624246 0,-2.9805619 -0.274301,0 c -0.822901,0 -1.492036,0.6674961 -1.492036,1.490164 0,0.8245402 0.669135,1.4901639 1.492036,1.4901639 l 0.274301,0 z" id="path11" inkscape:connector-curvature="0"/> - <path d="M 16.479538,6.4839284 15.17778,3.8801788 C 14.887096,3.3463224 14.325623,2.9879996 13.672871,2.9879996 l -3.022456,0 c -0.283428,0 -0.508345,0.2267895 -0.508345,0.5102179 0,0.2834284 0.224917,0.5083456 0.508345,0.5083456 l 3.022456,-0.00187 c 0.246918,0 0.515601,0.1664059 0.625368,0.3967061 l 0.828285,1.6603146 1.353014,0.422217 z" id="path13" inkscape:connector-curvature="0"/> - <path d="m 23.04497,9.1623456 c 0.414529,0.1194237 0.722958,0.5031096 0.722958,0.9561304 l -2.320867,0.002 c -3.05345,0 -5.534454,2.482732 -5.534454,5.536428 l -7.5528137,0 c 0,-2.453863 -1.5961827,-4.535884 -3.8052758,-5.262542 L 0.39269753,9.0254029 1.0828386,7.9710686 c 0.2427955,-0.3681411 0.6689213,-0.6111832 1.143162,-0.6111832 0.1098008,0 0.2082513,0.00766 0.2988062,0.026895 l 9.2740942,2.87604 c 0.11375,0.03282 0.231447,0.05404 0.35852,0.05404 0.418229,0 0.782669,-0.211953 1.000543,-0.537901 l 2.108915,-3.0457999 7.778091,2.4291883 z" id="path15" inkscape:connector-curvature="0" fill="#550000" stroke-width="0.702"/> - <circle id="path4236-3" cx="20.15" cy="16.419" r="2.175" fill="#4d4d4d" stroke-width="3"/> - <path d="m 16.589305,16.33956 c 0,-1.980254 1.605314,-3.578313 3.57644,-3.578313 1.976509,0 3.57644,1.598059 3.57644,3.578313 0,1.972998 -1.599931,3.57644 -3.57644,3.57644 -1.971126,0 -3.57644,-1.603676 -3.57644,-3.57644 z m 3.57644,1.33663 c 0.742391,0 1.342014,-0.599623 1.342014,-1.33663 0,-0.742391 -0.599623,-1.338503 -1.342014,-1.338503 -0.73139,0 -1.331247,0.596112 -1.331247,1.338503 2.34e-4,0.736773 0.599857,1.33663 1.331247,1.33663 z" id="path17" inkscape:connector-curvature="0"/> - <circle id="path4236" cx="3.536" cy="15.864" r="2.175" fill="#4d4d4d" stroke-width="3"/> - <path d="m -0.25818392,15.955492 c 0,-2.16866 1.76071982,-3.933125 3.93476302,-3.933125 2.1777879,0 3.9312524,1.764465 3.9312524,3.933125 0,2.174043 -1.7534645,3.936635 -3.9312524,3.936635 -2.1740432,0 -3.93476302,-1.762592 -3.93476302,-3.936635 z m 3.94389082,1.475653 c 0.808157,0 1.4681637,-0.658134 1.4681637,-1.471908 0,-0.813775 -0.6600067,-1.471909 -1.4681637,-1.471909 -0.8172849,0 -1.4719085,0.658134 -1.4719085,1.471909 0,0.813774 0.6546236,1.471908 1.4719085,1.471908 z" id="path19" inkscape:connector-curvature="0"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/108-1.svg b/htdocs/public/symbols/svgicons/108-1.svg deleted file mode 100755 index efcae6de980369babec243a6bb133a0070e4c70e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/108-1.svg +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.0" width="24" height="24"> - <defs id="defs7856"> - <linearGradient id="linearGradient5418" y2="18.14" gradientUnits="userSpaceOnUse" x2="25.17" gradientTransform="matrix(1.0625,0,0,0.93333,-1.5,0.51667)" y1="4.739" x1="21.09" inkscape:collect="always"> - <stop id="stop5414" stop-color="#ffffff"/> - <stop id="stop5416" offset="1" stop-color="#ffffff" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient5426" y2="8.24" gradientUnits="userSpaceOnUse" x2="0" gradientTransform="matrix(1.0452,0,0,0.97519,-0.83237,0.65789)" y1="26.933" inkscape:collect="always"> - <stop id="stop5422" stop-color="#3465a4"/> - <stop id="stop5424" offset="1" stop-color="#204a87"/> - </linearGradient> - <filter id="filter5450" height="1.203" width="1.076" y="-0.102" x="-0.038" inkscape:collect="always"> - <feGaussianBlur id="feGaussianBlur5452" stdDeviation="0.71466" inkscape:collect="always"/> - </filter> - <linearGradient id="linearGradient5741" y2="30.489" gradientUnits="userSpaceOnUse" x2="24" y1="2.01" x1="17.799" inkscape:collect="always"> - <stop id="stop5737" stop-color="#2e3436"/> - <stop id="stop5739" offset="1" stop-color="#080d19"/> - </linearGradient> - </defs> - <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,-24)"> - <g id="g3416" transform="matrix(0.48504583,0,0,0.48504583,0.3597217,23.888137)"> - <path d="M 4.8125,29.363 1.5,42.582 c -0.70396,1.954 0.0843,2.946 0.625,3.125 l 43.125,0 c 0.788,-0.629 1.614,-1.476 1.125,-3.25 l -2.5,-12.969 C 43.809,29.132 43.523,28.94 43.125,28.832 L 6.25,28.863 C 5.5292,28.82 5.1504,28.837 4.8125,29.363 Z" transform="matrix(1.0154,0,0,1.1259,-0.2403,-5.4628)" sodipodi:nodetypes="ccccccccc" id="path5428" inkscape:connector-curvature="0" filter="url(#filter5450)" fill-rule="evenodd" color="#000000"/> - <rect x="4.511" y="2.511" width="38.978" height="27.478" ry="0.492" rx="0.557" id="rect5139" fill="url(#linearGradient5741)" fill-rule="evenodd" stroke="#202526" stroke-linejoin="round" stroke-linecap="square" color="#000000"/> - <path d="M 4.8125,28.656 1.5,41.875 c -0.221,0.613 -0.4895,1.189 -0.2756,1.56 L 2.125,45 45.25,45 46.389,43.566 c 0.312,-0.392 0.194,-1.061 -0.014,-1.816 l -2.5,-12.969 c -0.066,-0.357 -0.352,-0.549 -0.75,-0.656 L 6.25,28.156 C 5.5292,28.113 5.1504,28.13 4.8125,28.656 Z" sodipodi:nodetypes="ccsccsccccc" id="path5147" inkscape:connector-curvature="0" fill="#2e3436" fill-rule="evenodd" stroke="#202526" stroke-linejoin="round" stroke-linecap="square" color="#000000"/> - <path d="m 6.7502,29.752 -0.9651,6.267 c -0.6372,0.926 0.0762,1.396 0.5656,1.481 l 27.679,0 0.088,1.061 8.259,0 c 0.713,-0.298 1.46,-0.7 1.018,-1.541 l -1.29,-7.209 c -0.06,-0.169 -0.319,-0.26 -0.679,-0.311 L 8.0507,29.515 C 7.3985,29.494 7.0557,29.502 6.7499,29.752 Z" sodipodi:nodetypes="ccccccccccc" id="path2787" inkscape:connector-curvature="0" opacity="0.85" fill="none" stroke="#171b1c" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.5"/> - <g transform="translate(-1.0607,-1.5581)" id="g5266" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"> - <rect x="7.745" y="33.12" width="2.928" height="1.511" id="rect5268"/> - <rect x="10.989" y="33.12" width="2.133" height="1.511" id="rect5270"/> - <rect x="13.475" y="33.12" width="2.133" height="1.511" id="rect5272"/> - <rect x="15.906" y="33.12" width="2.133" height="1.511" id="rect5274"/> - <rect x="18.513" y="33.12" width="2.133" height="1.511" id="rect5276"/> - <rect x="20.988" y="33.12" width="2.133" height="1.511" id="rect5278"/> - <rect x="23.463" y="33.12" width="2.133" height="1.511" id="rect5280"/> - <rect x="26.07" y="33.12" width="2.133" height="1.511" id="rect5282"/> - <rect x="28.59" y="33.12" width="2.133" height="1.511" id="rect5284"/> - <rect x="31.06" y="33.12" width="2.133" height="1.511" id="rect5286"/> - <rect x="33.495" y="33.12" width="2.133" height="1.511" id="rect5288"/> - <rect x="36.01" y="33.12" width="2.133" height="1.511" id="rect5290"/> - <rect x="38.489" y="33.12" width="2.133" height="1.511" id="rect5320"/> - <rect x="40.964" y="33.12" width="1.914" height="1.511" id="rect5324"/> - </g> - <rect x="6.596" y="33.12" width="4.077" height="1.511" id="rect5199" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="10.989" y="33.12" width="2.133" height="1.511" id="rect5203" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="13.475" y="33.12" width="2.133" height="1.511" id="rect5207" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="15.906" y="33.12" width="2.133" height="1.511" id="rect5211" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="18.513" y="33.12" width="2.133" height="1.511" id="rect5215" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="20.988" y="33.12" width="2.133" height="1.511" id="rect5219" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="23.463" y="33.12" width="2.133" height="1.511" id="rect5223" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="26.07" y="33.12" width="2.133" height="1.511" id="rect5227" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="28.59" y="33.12" width="2.133" height="1.511" id="rect5231" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="31.06" y="33.12" width="2.133" height="1.511" id="rect5235" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="33.495" y="33.12" width="2.133" height="1.511" id="rect5239" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="36.01" y="33.12" width="2.133" height="1.511" id="rect5243" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="38.31" y="33.12" width="3.724" height="1.511" id="rect5247" fill="#545755" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="6.484" y="5.484" width="35.03" height="21.03" ry="0.372" rx="0.361" id="rect5137" fill="url(#linearGradient5426)" fill-rule="evenodd" stroke="#204a87" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.968"/> - <rect x="11.373" y="35.24" width="2.133" height="1.511" id="rect5149" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="13.994" y="35.24" width="2.133" height="1.511" id="rect5159" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="16.623" y="35.24" width="12.414" height="1.511" id="rect5163" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="29.588" y="35.24" width="2.133" height="1.511" id="rect5167" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="32.21" y="35.24" width="2.133" height="1.511" id="rect5171" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="34.98" y="36.432" width="2.133" height="1.324" id="rect5175" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="37.37" y="35.18" width="2.133" height="1.199" id="rect5183" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="37.623" y="36.554" width="2.133" height="1.168" id="rect5179" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="40.24" y="36.526" width="2.133" height="1.23" id="rect5187" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="8.779" y="35.24" width="2.133" height="1.511" id="rect5191" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <rect x="6.154" y="35.24" width="2.133" height="1.511" id="rect5195" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"/> - <g transform="translate(-1.4982,-2.9331)" id="g5328" fill="#555753" fill-rule="evenodd" stroke="#222728" stroke-linejoin="round" stroke-linecap="square" color="#000000" stroke-width="0.489"> - <rect x="8.495" y="33.12" width="2.178" height="1.511" id="rect5330"/> - <rect x="10.989" y="33.12" width="2.133" height="1.511" id="rect5332"/> - <rect x="13.475" y="33.12" width="2.133" height="1.511" id="rect5334"/> - <rect x="15.906" y="33.12" width="2.133" height="1.511" id="rect5336"/> - <rect x="18.513" y="33.12" width="2.133" height="1.511" id="rect5338"/> - <rect x="20.988" y="33.12" width="2.133" height="1.511" id="rect5340"/> - <rect x="23.463" y="33.12" width="2.133" height="1.511" id="rect5342"/> - <rect x="26.07" y="33.12" width="2.133" height="1.511" id="rect5344"/> - <rect x="28.59" y="33.12" width="2.133" height="1.511" id="rect5346"/> - <rect x="31.06" y="33.12" width="2.133" height="1.511" id="rect5348"/> - <rect x="33.495" y="33.12" width="2.133" height="1.511" id="rect5350"/> - <rect x="36.01" y="33.12" width="2.133" height="1.511" id="rect5352"/> - <rect x="38.489" y="33.12" width="2.133" height="1.511" id="rect5354"/> - <rect x="40.964" y="33.12" width="2.133" height="1.511" id="rect5356"/> - </g> - <path d="M 18.143,39.34 18,41 29,41 28.929,39.462 C 28.913,39.15 28.727,39.006 28.5,39 l -10.071,0 c -0.144,0.009 -0.238,0.124 -0.286,0.34 z" sodipodi:nodetypes="ccccccc" id="path5386" inkscape:connector-curvature="0" opacity="0.75" fill="#555753" fill-rule="evenodd" color="#000000"/> - <path d="M 18.143,41.731 18,41 29,41 28.929,41.769 C 28.904,41.988 28.67,41.973 28.5,42 l -10.071,0 c -0.117,0.016 -0.217,-0.05 -0.286,-0.269 z" sodipodi:nodetypes="ccccccc" id="path5388" inkscape:connector-curvature="0" opacity="0.75" fill="#555753" fill-rule="evenodd" color="#000000"/> - <path d="m 1.591,43.05 c 0.0984,0.644 0.0034,1.371 0.8839,1.68 l 42.426,0 c 0.499,-0.476 0.927,-0.783 1.194,-1.724 L 1.5909,43.05 Z" sodipodi:nodetypes="ccccc" id="path5398" inkscape:connector-curvature="0" fill="#2e3436" fill-rule="evenodd" color="#000000"/> - <path d="m 7,6.1167 0.1255,13.883 c 7.1195,-4.224 26.594,-6.457 33.874,-6.65 l 0,-7.35 -34,0.1167 z" sodipodi:nodetypes="ccccc" id="path5410" inkscape:connector-curvature="0" opacity="0.218" fill="url(#linearGradient5418)" fill-rule="evenodd" color="#000000"/> - <path d="m 1.6661,43 44.396,0 c 0,0.619 -0.488,1 -0.937,1 L 2.8541,44 C 1.9356,44 1.6662,43 1.6662,43 Z" sodipodi:nodetypes="ccccc" id="rect5496" inkscape:connector-curvature="0" opacity="0.12" fill="#eeeeec" fill-rule="evenodd" color="#000000"/> - <path d="M 28.997,43.006 29,44.08 c 0,0.191 -0.154,0.345 -0.345,0.345 l -10.31,0 C 18.154,44.425 18,44.271 18,44.08 l 0,-1.082 10.997,0.008 z" sodipodi:nodetypes="ccccccc" id="rect5733" inkscape:connector-curvature="0" opacity="0.615" fill="#000000" fill-rule="evenodd" color="#000000"/> - <rect x="23.688" y="42.42" width="5.313" height="1" ry="0.345" rx="0.157" id="rect5466" opacity="0.273" fill="#808285" fill-rule="evenodd" color="#000000"/> - <rect x="18" y="42.42" width="5.438" height="1" ry="0.345" rx="0.157" id="rect3766" opacity="0.273" fill="#808285" fill-rule="evenodd" color="#000000"/> - <path d="m 18.501,37.265 -0.147,1.293 4.646,0 -0.031,-1.198 C 22.962,37.117 22.88,37.005 22.781,37 l -4.154,0 c -0.063,0.007 -0.104,0.097 -0.126,0.265 z" sodipodi:nodetypes="ccccccc" id="path4778" inkscape:connector-curvature="0" opacity="0.27" fill="#888a85" fill-rule="evenodd" color="#000000"/> - <path d="m 28.615,37.265 0.154,1.293 -4.813,0 0.032,-1.198 C 23.995,37.117 24.08,37.005 24.183,37 l 4.303,0 c 0.065,0.007 0.108,0.097 0.129,0.265 z" sodipodi:nodetypes="ccccccc" id="path4780" inkscape:connector-curvature="0" opacity="0.27" fill="#888a85" fill-rule="evenodd" color="#000000"/> - <ellipse transform="matrix(0.34811,0,0,0.2901,21.238,17.601)" id="path4782" cx="6.497" cy="59.977" rx="2.873" ry="1.724" fill="#555753" fill-rule="evenodd" stroke="#3465a4" fill-opacity="0.75" stroke-width="3.147"/> - <rect x="22.938" y="37" width="1.094" height="1.5" ry="0.345" rx="0.157" id="rect3781" opacity="0.619" fill="#808285" fill-rule="evenodd" color="#000000"/> - </g> - </g> - <metadata id="metadata88"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/108-2.svg b/htdocs/public/symbols/svgicons/108-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/108-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/109-1.svg b/htdocs/public/symbols/svgicons/109-1.svg deleted file mode 100755 index 9ca89f9158bda784b9d311e9ffa8911af12c1e3e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/109-1.svg +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.0" width="24" height="24"> - <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,-24)"> - <rect id="rect3508" width="24" height="24" y="24" rx="4" fill="#e6e6e6" fill-rule="evenodd"/> - <text x="1.346" y="32.758" id="text3510" sodipodi:linespacing="125%" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10"><tspan sodipodi:role="line" id="tspan3512" x="1.346" y="32.758">MIC</tspan> - </text> - <text x="8.492" y="46.935" id="text3514" sodipodi:linespacing="125%" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10"><tspan sodipodi:role="line" id="tspan3516" x="8.492" y="46.935">E</tspan> - </text> - <path sodipodi:type="arc" id="path5701" sodipodi:cx="12.000047" sodipodi:cy="36" sodipodi:rx="1.8725199" sodipodi:ry="1.8725199" d="m 10.127527,36 a 1.8725199,1.8725199 0 0 1 1.87207,-1.87252 1.8725199,1.8725199 0 0 1 1.872969,1.871621 1.8725199,1.8725199 0 0 1 -1.871171,1.873418 1.8725199,1.8725199 0 0 1 -1.873867,-1.870721" sodipodi:start="3.1415927" sodipodi:end="3.1406327" sodipodi:open="true" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-linecap="round" stroke-width="1.674"/> - </g> - <metadata id="metadata88"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/109-2.svg b/htdocs/public/symbols/svgicons/109-2.svg deleted file mode 100755 index e28599fbbd9a5aaceb58e2da6f30dedefda0881f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/109-2.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata3740"/> - <path d="M 11.98987,1.6991642 12.01013,22.300836" id="path3744" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" fill="none" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="3.351"/> - <rect id="rect4546" width="22.811" height="11.37" x="0.595" y="2.679" rx="3.176" fill="#ffffff" stroke="#000000" stroke-linecap="round" stroke-width="1.189"/> - <text x="1.261" y="12.178" id="text4548" sodipodi:linespacing="125%" font-family="sans-serif" word-spacing="0" line-height="125%" letter-spacing="0" font-size="11.25"><tspan sodipodi:role="line" id="tspan4550" x="1.261" y="12.178">888</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/110-1.svg b/htdocs/public/symbols/svgicons/110-1.svg deleted file mode 100755 index c3bfee69bd8882d8e29f901b88281d363121a0a5..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/110-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3276"/> - <path sodipodi:type="arc" id="path3280" sodipodi:cx="11.898305" sodipodi:cy="12.101695" sodipodi:rx="12.20339" sodipodi:ry="12.20339" d="m 24.101695,12.101695 a 12.20339,12.20339 0 1 1 -24.40678018,0 12.20339,12.20339 0 1 1 24.40678018,0 z" transform="matrix(0.9201921,0,0,0.9201921,1.0512738,0.86411581)" fill="#cccccc" stroke="#000000" stroke-width="1.675"/> - <path sodipodi:type="arc" id="path3282" sodipodi:cx="12" sodipodi:cy="11.898305" sodipodi:rx="7.2203388" sodipodi:ry="7.2203388" d="m 19.220339,11.898305 a 7.2203388,7.2203388 0 1 1 -14.4406778,0 7.2203388,7.2203388 0 1 1 14.4406778,0 z" transform="matrix(0.93617311,0,0,0.93617311,0.76592268,0.86112686)" fill="#999999" stroke="#000000" stroke-width="1.582"/> - <path sodipodi:type="arc" id="path3284" sodipodi:cx="11.79661" sodipodi:cy="12" sodipodi:rx="1.2203389" sodipodi:ry="1.2203389" d="m 13.016949,12 a 1.2203389,1.2203389 0 1 1 -2.440678,0 1.2203389,1.2203389 0 1 1 2.440678,0 z" transform="translate(0.20339012,0)" fill="#0000ff" stroke="#0000ff" stroke-width="1.582"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/110-2.svg b/htdocs/public/symbols/svgicons/110-2.svg deleted file mode 100755 index f0c31d3dd1061ea8244a352ac4783c5dbf3f5637..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/110-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3070"/> - <path sodipodi:type="star" id="path3879" sodipodi:sides="3" sodipodi:cx="11.186441" sodipodi:cy="12.610169" sodipodi:r1="12.604427" sodipodi:r2="6.3022137" sodipodi:arg1="0.52359878" sodipodi:arg2="1.5707963" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="m 22.102196,18.912383 -10.915754,0 -10.91575488,0 L 5.7285642,9.4590627 11.186441,0.00574207 16.644318,9.4590624 Z" inkscape:transform-center-y="-3.6355753" transform="matrix(1.0454529,0,0,1.1537455,0.3051024,1.0866167)" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-width="1.125"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/111-1.svg b/htdocs/public/symbols/svgicons/111-1.svg deleted file mode 100755 index 4580c646965854d7b80e8d0583c4337944a5d699..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/111-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3957"/> - <path d="m 2.3225454,23.562785 19.2338326,0 0,-11.58873 2.006407,0 L 12.025945,0.43721472 0.43721467,12.025945 l 1.91992393,0 z" id="path3961" inkscape:connector-curvature="0" fill="#ff0000" stroke="#000000" stroke-linejoin="round" stroke-width="0.874"/> - <text x="4.925" y="16.972" id="text4509" sodipodi:linespacing="125%" transform="scale(0.80564602,1.2412399)" fill="#ffffff" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="8.689"><tspan sodipodi:role="line" id="tspan4511" x="4.925" y="16.972">EOC</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/111-2.svg b/htdocs/public/symbols/svgicons/111-2.svg deleted file mode 100755 index 6a5150540c1001a82a32c33b04d8d99ea0a1ab78..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/111-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3276"/> - <ellipse id="path3280" cx="12" cy="12" rx="9.95" ry="9.95" fill="#ffffff" stroke="#ff0000" stroke-width="4.1"/> - <circle id="path3282" cx="12" cy="12" r="3.419" fill="#ffffff" stroke="#ffff00" stroke-width="2.826"/> - <circle id="path3284" cx="12" cy="12" r="1.547" fill="#ff0000" stroke="#ff0000" stroke-width="2.01"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/112-1.svg b/htdocs/public/symbols/svgicons/112-1.svg deleted file mode 100755 index dd97456a8b8a2b9084027e983afd80594cd31625..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/112-1.svg +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - id="svg3000" - version="1.1" - inkscape:version="0.48.4 r9939" - sodipodi:docname="Nytt dokument 2"> - <defs - id="defs3002" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="7.9195959" - inkscape:cx="25.766187" - inkscape:cy="25.439181" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1867" - inkscape:window-height="1056" - inkscape:window-x="53" - inkscape:window-y="24" - inkscape:window-maximized="1" /> - <metadata - id="metadata3005"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1028.3622)"> - <g - transform="matrix(-44.210088,0,0,44.210088,35.674396,1031.1014)" - id="g6547"> - <path - d="m 0.67499548,0.44929292 -0.002899,4.1666e-4 -0.002795,3.6458e-4 -0.002691,2.9514e-4 -0.002569,2.2569e-4 -0.0025,1.7361e-4 -0.002378,1.0417e-4 -0.002292,5.208e-5 -0.002205,0 -0.002101,-6.944e-5 -0.002014,-1.2153e-4 -0.001927,-1.7361e-4 -0.00184,-2.2569e-4 -0.001771,-2.9514e-4 -0.001667,-3.2986e-4 -0.001597,-3.8194e-4 -0.00151,-4.3402e-4 -0.001441,-4.8611e-4 -0.001372,-5.3819e-4 -0.001285,-5.9028e-4 -0.001233,-6.2499e-4 -0.001146,-6.7708e-4 -0.001094,-7.2916e-4 -0.001024,-7.6389e-4 -9.5485e-4,-8.1596e-4 -9.0277e-4,-8.5069e-4 -8.3333e-4,-9.0278e-4 -7.8125e-4,-9.3749e-4 -7.2916e-4,-9.7222e-4 -6.7708e-4,-0.001024 -6.2499e-4,-0.001059 -0.001094,-0.002222 -9.2013e-4,-0.002361 -7.4652e-4,-0.0025 -6.0764e-4,-0.002622 -4.6875e-4,-0.00276 -3.2985e-4,-0.002865 -2.4306e-4,-0.002969 -1.5625e-4,-0.003073 -8.68e-5,-0.003177 -1.736e-5,-0.003247 3.472e-5,-0.003333 3.472e-5,-0.003403 6.944e-5,-0.003455 8.681e-5,-0.007118 1.736e-5,-0.003611 -0.003802,-0.0803294 -0.0158332,0.0741662 c -0.003333,0.0137499 -0.007083,0.0266665 0.0129166,0.0370831 0.0141666,0.0125173 -0.001667,0.0296005 -0.0170832,0.0275172 -0.0462497,0.001649 -0.0395831,-0.0291665 -0.0354164,-0.0508504 l 0.0025,-0.0316665 0.0075,-0.0645829 -0.00625,-0.0162499 C 0.51582983,0.27137739 0.48166338,0.26179412 0.44291363,0.24096092 l -0.0274998,0.00375 c -0.0129166,0.002083 -0.009583,0.0166666 -0.0108333,0.0262498 l -0.004167,0.0262672 -0.0229165,0.059583 -0.001667,0.004983 c -0.001667,0.004167 -0.00125,0.0204165 0.004583,0.0287498 l 0.0124999,0.0250172 c 0.009167,0.0137326 0.0116666,0.0487323 -0.0141666,0.0374824 l 4.1666e-4,0 -0.0191665,-0.007917 c -0.0137499,-0.005816 -0.0249998,-0.0437324 -0.0299998,-0.0712322 l 8.3333e-4,-0.0391838 c -0.0120833,-0.003316 -0.0170832,0.0662496 -0.0120833,0.0808502 l 0.0120833,0.0362324 c 0.003333,0.0116666 -0.0104166,0.0158506 -0.0199999,0.0158506 -0.0224998,0 -0.0324998,-0.0229339 -0.0370831,-0.0421004 l -0.003333,-0.0145832 c -0.005833,-0.0220832 -0.002917,-0.055833 0.008333,-0.0754162 l 0.005833,-0.0120833 c 0.009583,-0.0241665 -0.002917,-0.0412497 -0.005833,-0.0537496 -0.009583,-0.0391664 -0.0174999,-0.0770828 0.009583,-0.1145826 l 0.0025,-0.002899 c -0.00125,-0.002934 -0.009167,-0.009167 -0.0137499,-0.0237672 C 0.26666352,0.0951289 0.25749692,0.04054591 0.27041312,0.04054591 l 0.00875,-4.1666e-4 c 0.0216665,0 0.0149999,0.08999943 0.0412497,0.08416613 l 0.1874988,0.002083 0.0333331,-0.009149 c 0.0116666,-0.003351 0.0220832,-0.0108506 0.0329164,-0.01751725 l 0.0216665,-0.01333325 c 0.0241665,0.02458318 0.045833,0.03999975 0.0812495,0.05291633 0.009583,0.0733329 -0.00125,0.0896001 -0.0104166,0.13333248 l -0.003333,0.0179166 c -0.007083,0.0312672 -0.009167,0.0637496 -0.0075,0.0962494 l 8.3332e-4,0.0149999 c -8.3332e-4,0.0154166 0.008333,0.0166839 0.0204165,0.0204339 0.007917,0.004149 0.0133333,0.0195658 -0.002083,0.0270658 l 4.1666e-4,0 -4.1666e-4,0 z" - id="path12" - inkscape:connector-curvature="0" - stroke-miterlimit="10.433" - style="fill:#1e1916;stroke:#1e1916;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961" /> - <path - d="m 0.71499522,1.29127e-4 9.375e-4,6.9444e-4 9.7221e-4,6.94443e-4 0.001962,0.0015104 0.002031,0.00161458 0.002066,0.00171874 0.002101,0.00180554 0.002118,0.00187499 0.002153,0.0019444 0.00217,0.0019965 0.00217,0.002066 0.00217,0.0020833 0.004288,0.0042708 0.002101,0.0021528 0.002083,0.0021528 0.002031,0.0021354 0.001979,0.0021354 0.0133332,0.01414922 c 0.008333,0.0087499 0.0212499,0.0074999 0.0324998,0.0099999 l 0.004583,4.1667e-4 c 0.0120832,0.006684 0.008333,0.02001723 0.004167,0.02999981 l -0.0025,0.0062673 c -0.0120832,0.02873245 -0.047083,0.03081577 -0.0720829,0.01748253 l -0.0108333,-0.005833 -0.00375,0 -0.007917,0.005 -0.0154166,0.0125173 C 0.65791226,0.10681247 0.63166242,0.09012855 0.61082922,0.06762869 l 0.048333,-0.06083294 0.0162499,-0.02333318 0.003333,-0.0079166 0.00375,-0.0087326 c 0,0 0.0149999,-0.01876724 0.0237498,-0.01501727 0.00875,0.0037673 0.0141666,0.01999987 0.0120833,0.02833316 l -0.0025,0.00999993 -8.3333e-4,0.009999937 4.1667e-4,0" - id="path14" - inkscape:connector-curvature="0" - stroke-miterlimit="10.433" - style="fill:#1e1916;stroke:#1e1916;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961" /> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/112-2.svg b/htdocs/public/symbols/svgicons/112-2.svg deleted file mode 100755 index 68d5c87c0d544b4f4a14dae3e50f3673473743a9..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/112-2.svg +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <switch id="switch3117" transform="matrix(0.04126034,0,0,0.04126034,-0.21995112,513.7136)"> - <g id="g3121"> - <path d="m 587.001,191.775 c 0,-34.867 -24.173,-64.178 -56.635,-72.094 -0.487,-0.119 -0.977,-0.23 -1.468,-0.34 -1.321,0.132 -2.625,-0.138 -3.761,-0.734 -4.019,-0.676 -8.14,-1.047 -12.347,-1.047 -14.877,0 -29.225,4.381 -41.491,12.671 -3.054,2.063 -7.2,1.261 -9.263,-1.792 -0.774,-1.146 -1.145,-2.447 -1.144,-3.735 0.002,-2.139 1.03,-4.239 2.936,-5.526 14.481,-9.786 31.411,-14.959 48.962,-14.959 1.654,0 3.297,0.051 4.928,0.142 C 499.864,65.46 460.832,40.014 417.312,40.014 c -46.851,0 -87.649,29.456 -103.479,71.663 -2.983,7.955 -5.083,16.361 -6.166,25.111 -0.418,3.378 -3.293,5.852 -6.612,5.852 -0.207,0 -0.417,-0.019 -0.627,-0.039 -0.067,-0.006 -0.133,-0.004 -0.2,-0.012 -3.656,-0.452 -6.253,-3.783 -5.801,-7.439 1.036,-8.369 2.905,-16.456 5.507,-24.189 -42.585,1.412 -76.817,35.727 -78.098,78.348 8.087,0.308 15.9,2.767 22.695,7.162 1.975,1.276 3.044,3.421 3.043,5.609 -0.001,1.24 -0.342,2.495 -1.065,3.614 -2,3.095 -6.129,3.979 -9.224,1.978 -4.437,-2.869 -9.495,-4.561 -14.755,-4.959 -0.804,-0.062 -1.611,-0.097 -2.423,-0.097 -14.922,0 -27.461,10.372 -30.804,24.284 11.929,-3.955 24.376,-6.65 37.163,-7.951 5.847,-0.594 11.765,-0.901 17.736,-0.901 5.979,0 11.893,0.314 17.732,0.909 11.826,1.203 23.331,3.594 34.384,7.062 20.481,6.429 39.406,16.55 55.945,29.621 6.605,5.221 12.835,10.904 18.624,17.02 h 135.23 c 44.668,0 80.877,-36.205 80.885,-80.871 0,-0.006 -10e-4,-0.01 -10e-4,-0.014 z" id="path3123" inkscape:connector-curvature="0" fill="#b3b3b3"/> - <path d="m 521.806,465.719 c -1.138,0 -2.266,0.055 -3.387,0.139 -14.255,1.062 -27.023,8.777 -34.622,21.114 -2.721,4.414 -8.506,5.79 -12.921,3.07 -2.88,-1.773 -4.455,-4.852 -4.456,-8.002 0,-1.681 0.439,-3.382 1.385,-4.918 11.22,-18.215 30.377,-29.352 51.597,-30.136 -1.799,-60.006 -50.021,-108.336 -109.977,-110.315 3.667,10.895 6.302,22.287 7.761,34.077 0.637,5.147 -3.02,9.836 -8.166,10.473 -0.094,0.012 -0.187,0.009 -0.281,0.018 -0.296,0.027 -0.592,0.055 -0.884,0.055 -4.672,0 -8.72,-3.482 -9.308,-8.238 -1.525,-12.323 -4.483,-24.163 -8.688,-35.367 -9.626,-25.658 -25.811,-47.963 -46.402,-65.029 -2.799,-2.319 -5.68,-4.541 -8.637,-6.662 -25.652,-18.406 -57.028,-29.169 -90.619,-29.169 -2.87,0 -5.725,0.084 -8.565,0.239 -15.718,0.86 -30.94,4.069 -45.253,9.344 -38.31,14.117 -70.116,42.994 -87.554,81 2.307,-0.129 4.63,-0.201 6.969,-0.201 24.705,0 48.537,7.281 68.921,21.057 2.683,1.812 4.13,4.769 4.133,7.779 0.002,1.812 -0.52,3.645 -1.61,5.259 -2.904,4.298 -8.741,5.427 -13.038,2.522 -17.267,-11.669 -37.463,-17.836 -58.405,-17.836 -5.904,0 -11.693,0.5 -17.333,1.446 -1.631,0.87 -3.511,1.261 -5.415,1.056 -0.665,0.148 -1.328,0.304 -1.988,0.465 -45.703,11.139 -79.73,52.417 -79.73,101.501 0,0.011 -0.001,0.021 -0.001,0.031 0.017,62.868 50.986,113.828 113.86,113.828 H 405.6 512.417 c 29.816,0 53.992,-24.176 53.992,-53.997 0,-24.594 -20.009,-44.603 -44.603,-44.603 z" id="path3125" inkscape:connector-curvature="0" fill="#b3b3b3"/> - </g> - </switch> - <switch transform="matrix(0.04099584,0,0,0.04099584,-0.41974494,1028.2304)" id="switch4024"> - <g id="g4028"> - <g id="g4030"> - <path inkscape:connector-curvature="0" d="m 259.145,407.478 c 17.73,-46.855 62.652,-78.06 113.067,-78.06 19.159,0 37.393,4.506 53.622,12.558 8.705,-21.276 13.515,-44.558 13.515,-68.967 0,-100.664 -81.604,-182.267 -182.268,-182.267 -100.663,0 -182.266,81.603 -182.266,182.267 0,82.6 54.95,152.352 130.283,174.73 11.605,-19.933 31.027,-34.761 54.047,-40.261 z" id="path4032" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 294.336,76.668 c -0.122,0 -0.245,-0.011 -0.367,-0.034 -12.121,-2.262 -24.531,-3.409 -36.888,-3.409 -11.317,0 -22.722,0.969 -33.895,2.88 -0.113,0.02 -0.226,0.029 -0.338,0.029 -0.647,0 -1.263,-0.314 -1.641,-0.857 -0.443,-0.636 -0.479,-1.472 -0.091,-2.143 l 23.761,-41.157 c 3.607,-6.248 8.423,-9.688 13.56,-9.688 5.137,0 9.953,3.44 13.561,9.688 l 24.07,41.69 c 0.391,0.676 0.352,1.518 -0.099,2.155 -0.38,0.537 -0.991,0.846 -1.633,0.846 z" id="path4034" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 103.03,144.698 c -0.174,0 -0.349,-0.022 -0.521,-0.069 -0.749,-0.202 -1.313,-0.819 -1.448,-1.583 L 92.804,96.214 C 91.729,90.115 92.71,84.88 95.568,81.473 c 2.333,-2.78 5.779,-4.25 9.966,-4.25 2.499,0 5.206,0.524 8.045,1.558 l 45.236,16.465 c 0.734,0.267 1.245,0.937 1.309,1.716 0.064,0.778 -0.331,1.523 -1.012,1.906 -20.767,11.696 -39.122,26.877 -54.555,45.121 -0.386,0.457 -0.948,0.709 -1.527,0.709 z" id="path4036" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 55.301,274.2 c -0.462,0 -0.919,-0.16 -1.286,-0.468 l -36.419,-30.56 c -5.526,-4.638 -8.078,-9.978 -7.186,-15.037 0.892,-5.059 5.117,-9.204 11.896,-11.671 l 45.213,-16.457 c 0.223,-0.081 0.455,-0.121 0.684,-0.121 0.525,0 1.041,0.207 1.423,0.594 0.549,0.556 0.725,1.381 0.449,2.112 -8.382,22.233 -12.68,45.655 -12.774,69.615 -0.003,0.776 -0.455,1.48 -1.158,1.807 -0.269,0.125 -0.557,0.186 -0.842,0.186 z" id="path4038" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 54.448,404.091 c -7.214,0 -12.602,-2.45 -15.17,-6.898 -2.568,-4.449 -1.997,-10.341 1.61,-16.589 l 24.06,-41.67 c 0.359,-0.622 1.022,-1 1.731,-1 0.062,0 0.124,0.003 0.187,0.009 0.778,0.072 1.442,0.592 1.701,1.329 7.889,22.476 19.65,43.181 34.958,61.539 0.497,0.597 0.604,1.427 0.275,2.129 -0.329,0.703 -1.035,1.152 -1.811,1.152 l -47.541,-10e-4 z" id="path4040" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 174.05,508.828 c -6.811,0 -11.828,-5.395 -13.421,-14.431 l -8.36,-47.413 c -0.136,-0.771 0.189,-1.549 0.833,-1.993 0.341,-0.235 0.739,-0.354 1.137,-0.354 0.353,0 0.706,0.093 1.021,0.28 12.801,7.597 26.484,13.76 40.669,18.317 1.05,0.338 1.629,1.462 1.293,2.513 -2.481,7.765 -4.133,14.701 -4.133,23.319 0,1.573 0.304,4.142 0.548,6.204 l 0.054,0.453 c 0.076,0.646 -0.166,1.288 -0.649,1.723 l -6.928,6.226 c -4.04,3.389 -8.193,5.156 -12.064,5.156 z" id="path4042" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 457.351,363.719 c -0.501,0 -1,-0.188 -1.385,-0.557 -4.231,-4.062 -8.809,-7.854 -13.604,-11.272 -0.759,-0.542 -1.044,-1.535 -0.686,-2.396 1.022,-2.462 1.996,-4.938 2.892,-7.36 0.27,-0.727 0.935,-1.233 1.707,-1.299 0.057,-0.005 0.113,-0.007 0.17,-0.007 0.71,0 1.372,0.378 1.731,1 l 10.906,18.892 c 0.497,0.862 0.285,1.96 -0.499,2.574 -0.362,0.284 -0.798,0.425 -1.232,0.425 z" id="path4044" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 458.85,277.275 c -0.291,0 -0.584,-0.063 -0.857,-0.193 -0.707,-0.335 -1.153,-1.052 -1.143,-1.834 0.011,-0.772 0.016,-1.513 0.016,-2.239 0,-23.188 -3.945,-45.919 -11.726,-67.56 -0.263,-0.73 -0.079,-1.546 0.471,-2.094 0.381,-0.38 0.892,-0.583 1.411,-0.583 0.229,0 0.461,0.04 0.685,0.121 l 44.62,16.243 c 6.778,2.467 11.003,6.612 11.896,11.671 0.892,5.059 -1.66,10.399 -7.186,15.037 l -36.901,30.964 c -0.368,0.307 -0.825,0.467 -1.286,0.467 z" id="path4046" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 413.104,147.04 c -0.59,0 -1.161,-0.262 -1.546,-0.731 -15.14,-18.452 -33.266,-33.903 -53.873,-45.926 -0.67,-0.391 -1.054,-1.134 -0.984,-1.906 0.07,-0.772 0.579,-1.436 1.309,-1.701 l 44.652,-16.25 c 2.841,-1.034 5.547,-1.558 8.044,-1.558 4.188,0 7.636,1.47 9.968,4.251 2.857,3.405 3.839,8.64 2.763,14.739 l -8.362,47.428 c -0.136,0.77 -0.707,1.39 -1.463,1.587 -0.17,0.046 -0.34,0.067 -0.508,0.067 z" id="path4048" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 595.627,530.521 c -0.834,-16.318 -14.371,-29.338 -30.894,-29.338 -0.795,0 -1.583,0.039 -2.366,0.098 -9.877,0.741 -18.727,6.09 -23.994,14.643 -1.887,3.061 -5.897,4.017 -8.961,2.129 -1.996,-1.23 -3.089,-3.364 -3.09,-5.549 0,-1.166 0.305,-2.347 0.961,-3.412 7.777,-12.625 21.057,-20.328 35.763,-20.88 -1.24,-41.618 -34.663,-75.128 -76.243,-76.507 2.54,7.55 4.365,15.445 5.376,23.615 0.442,3.569 -2.094,6.821 -5.663,7.263 -0.065,0.008 -0.129,0.006 -0.194,0.012 -0.206,0.02 -0.411,0.038 -0.614,0.038 -3.239,0 -6.047,-2.415 -6.454,-5.713 -1.058,-8.541 -3.106,-16.748 -6.02,-24.515 -1.118,-2.981 -2.362,-5.899 -3.729,-8.744 -7.823,-16.288 -19.604,-30.232 -34.023,-40.684 -4.734,-3.432 -9.754,-6.486 -15.012,-9.122 -14.585,-7.312 -30.999,-11.411 -48.257,-11.411 -42.489,0 -80.596,24.844 -98.026,62.824 1.596,-0.089 3.199,-0.144 4.815,-0.144 17.132,0 33.66,5.05 47.798,14.604 1.86,1.257 2.864,3.308 2.866,5.396 10e-4,1.257 -0.36,2.526 -1.116,3.646 -2.014,2.979 -6.063,3.764 -9.043,1.749 -11.976,-8.092 -25.982,-12.369 -40.505,-12.369 -4.108,0 -8.132,0.361 -12.056,1.022 -1.109,0.582 -2.381,0.845 -3.67,0.717 -0.479,0.106 -0.957,0.216 -1.434,0.331 -18.139,4.424 -33.616,15.69 -43.544,30.905 -3.263,5 -5.92,10.425 -7.879,16.174 -2.063,6.056 -3.355,12.464 -3.736,19.115 -0.08,1.387 -0.13,2.78 -0.13,4.187 0,0.004 0,0.009 0,0.013 0.007,43.604 35.357,78.95 78.963,78.95 h 198.628 74.08 c 20.677,0 37.443,-16.766 37.443,-37.447 0,-0.536 -0.019,-1.067 -0.04,-1.596 z" id="path4050" fill="#b3b3b3"/> - </g> - </g> - </switch> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/112-2.svg~ b/htdocs/public/symbols/svgicons/112-2.svg~ deleted file mode 100755 index 68d5c87c0d544b4f4a14dae3e50f3673473743a9..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/112-2.svg~ +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <switch id="switch3117" transform="matrix(0.04126034,0,0,0.04126034,-0.21995112,513.7136)"> - <g id="g3121"> - <path d="m 587.001,191.775 c 0,-34.867 -24.173,-64.178 -56.635,-72.094 -0.487,-0.119 -0.977,-0.23 -1.468,-0.34 -1.321,0.132 -2.625,-0.138 -3.761,-0.734 -4.019,-0.676 -8.14,-1.047 -12.347,-1.047 -14.877,0 -29.225,4.381 -41.491,12.671 -3.054,2.063 -7.2,1.261 -9.263,-1.792 -0.774,-1.146 -1.145,-2.447 -1.144,-3.735 0.002,-2.139 1.03,-4.239 2.936,-5.526 14.481,-9.786 31.411,-14.959 48.962,-14.959 1.654,0 3.297,0.051 4.928,0.142 C 499.864,65.46 460.832,40.014 417.312,40.014 c -46.851,0 -87.649,29.456 -103.479,71.663 -2.983,7.955 -5.083,16.361 -6.166,25.111 -0.418,3.378 -3.293,5.852 -6.612,5.852 -0.207,0 -0.417,-0.019 -0.627,-0.039 -0.067,-0.006 -0.133,-0.004 -0.2,-0.012 -3.656,-0.452 -6.253,-3.783 -5.801,-7.439 1.036,-8.369 2.905,-16.456 5.507,-24.189 -42.585,1.412 -76.817,35.727 -78.098,78.348 8.087,0.308 15.9,2.767 22.695,7.162 1.975,1.276 3.044,3.421 3.043,5.609 -0.001,1.24 -0.342,2.495 -1.065,3.614 -2,3.095 -6.129,3.979 -9.224,1.978 -4.437,-2.869 -9.495,-4.561 -14.755,-4.959 -0.804,-0.062 -1.611,-0.097 -2.423,-0.097 -14.922,0 -27.461,10.372 -30.804,24.284 11.929,-3.955 24.376,-6.65 37.163,-7.951 5.847,-0.594 11.765,-0.901 17.736,-0.901 5.979,0 11.893,0.314 17.732,0.909 11.826,1.203 23.331,3.594 34.384,7.062 20.481,6.429 39.406,16.55 55.945,29.621 6.605,5.221 12.835,10.904 18.624,17.02 h 135.23 c 44.668,0 80.877,-36.205 80.885,-80.871 0,-0.006 -10e-4,-0.01 -10e-4,-0.014 z" id="path3123" inkscape:connector-curvature="0" fill="#b3b3b3"/> - <path d="m 521.806,465.719 c -1.138,0 -2.266,0.055 -3.387,0.139 -14.255,1.062 -27.023,8.777 -34.622,21.114 -2.721,4.414 -8.506,5.79 -12.921,3.07 -2.88,-1.773 -4.455,-4.852 -4.456,-8.002 0,-1.681 0.439,-3.382 1.385,-4.918 11.22,-18.215 30.377,-29.352 51.597,-30.136 -1.799,-60.006 -50.021,-108.336 -109.977,-110.315 3.667,10.895 6.302,22.287 7.761,34.077 0.637,5.147 -3.02,9.836 -8.166,10.473 -0.094,0.012 -0.187,0.009 -0.281,0.018 -0.296,0.027 -0.592,0.055 -0.884,0.055 -4.672,0 -8.72,-3.482 -9.308,-8.238 -1.525,-12.323 -4.483,-24.163 -8.688,-35.367 -9.626,-25.658 -25.811,-47.963 -46.402,-65.029 -2.799,-2.319 -5.68,-4.541 -8.637,-6.662 -25.652,-18.406 -57.028,-29.169 -90.619,-29.169 -2.87,0 -5.725,0.084 -8.565,0.239 -15.718,0.86 -30.94,4.069 -45.253,9.344 -38.31,14.117 -70.116,42.994 -87.554,81 2.307,-0.129 4.63,-0.201 6.969,-0.201 24.705,0 48.537,7.281 68.921,21.057 2.683,1.812 4.13,4.769 4.133,7.779 0.002,1.812 -0.52,3.645 -1.61,5.259 -2.904,4.298 -8.741,5.427 -13.038,2.522 -17.267,-11.669 -37.463,-17.836 -58.405,-17.836 -5.904,0 -11.693,0.5 -17.333,1.446 -1.631,0.87 -3.511,1.261 -5.415,1.056 -0.665,0.148 -1.328,0.304 -1.988,0.465 -45.703,11.139 -79.73,52.417 -79.73,101.501 0,0.011 -0.001,0.021 -0.001,0.031 0.017,62.868 50.986,113.828 113.86,113.828 H 405.6 512.417 c 29.816,0 53.992,-24.176 53.992,-53.997 0,-24.594 -20.009,-44.603 -44.603,-44.603 z" id="path3125" inkscape:connector-curvature="0" fill="#b3b3b3"/> - </g> - </switch> - <switch transform="matrix(0.04099584,0,0,0.04099584,-0.41974494,1028.2304)" id="switch4024"> - <g id="g4028"> - <g id="g4030"> - <path inkscape:connector-curvature="0" d="m 259.145,407.478 c 17.73,-46.855 62.652,-78.06 113.067,-78.06 19.159,0 37.393,4.506 53.622,12.558 8.705,-21.276 13.515,-44.558 13.515,-68.967 0,-100.664 -81.604,-182.267 -182.268,-182.267 -100.663,0 -182.266,81.603 -182.266,182.267 0,82.6 54.95,152.352 130.283,174.73 11.605,-19.933 31.027,-34.761 54.047,-40.261 z" id="path4032" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 294.336,76.668 c -0.122,0 -0.245,-0.011 -0.367,-0.034 -12.121,-2.262 -24.531,-3.409 -36.888,-3.409 -11.317,0 -22.722,0.969 -33.895,2.88 -0.113,0.02 -0.226,0.029 -0.338,0.029 -0.647,0 -1.263,-0.314 -1.641,-0.857 -0.443,-0.636 -0.479,-1.472 -0.091,-2.143 l 23.761,-41.157 c 3.607,-6.248 8.423,-9.688 13.56,-9.688 5.137,0 9.953,3.44 13.561,9.688 l 24.07,41.69 c 0.391,0.676 0.352,1.518 -0.099,2.155 -0.38,0.537 -0.991,0.846 -1.633,0.846 z" id="path4034" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 103.03,144.698 c -0.174,0 -0.349,-0.022 -0.521,-0.069 -0.749,-0.202 -1.313,-0.819 -1.448,-1.583 L 92.804,96.214 C 91.729,90.115 92.71,84.88 95.568,81.473 c 2.333,-2.78 5.779,-4.25 9.966,-4.25 2.499,0 5.206,0.524 8.045,1.558 l 45.236,16.465 c 0.734,0.267 1.245,0.937 1.309,1.716 0.064,0.778 -0.331,1.523 -1.012,1.906 -20.767,11.696 -39.122,26.877 -54.555,45.121 -0.386,0.457 -0.948,0.709 -1.527,0.709 z" id="path4036" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 55.301,274.2 c -0.462,0 -0.919,-0.16 -1.286,-0.468 l -36.419,-30.56 c -5.526,-4.638 -8.078,-9.978 -7.186,-15.037 0.892,-5.059 5.117,-9.204 11.896,-11.671 l 45.213,-16.457 c 0.223,-0.081 0.455,-0.121 0.684,-0.121 0.525,0 1.041,0.207 1.423,0.594 0.549,0.556 0.725,1.381 0.449,2.112 -8.382,22.233 -12.68,45.655 -12.774,69.615 -0.003,0.776 -0.455,1.48 -1.158,1.807 -0.269,0.125 -0.557,0.186 -0.842,0.186 z" id="path4038" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 54.448,404.091 c -7.214,0 -12.602,-2.45 -15.17,-6.898 -2.568,-4.449 -1.997,-10.341 1.61,-16.589 l 24.06,-41.67 c 0.359,-0.622 1.022,-1 1.731,-1 0.062,0 0.124,0.003 0.187,0.009 0.778,0.072 1.442,0.592 1.701,1.329 7.889,22.476 19.65,43.181 34.958,61.539 0.497,0.597 0.604,1.427 0.275,2.129 -0.329,0.703 -1.035,1.152 -1.811,1.152 l -47.541,-10e-4 z" id="path4040" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 174.05,508.828 c -6.811,0 -11.828,-5.395 -13.421,-14.431 l -8.36,-47.413 c -0.136,-0.771 0.189,-1.549 0.833,-1.993 0.341,-0.235 0.739,-0.354 1.137,-0.354 0.353,0 0.706,0.093 1.021,0.28 12.801,7.597 26.484,13.76 40.669,18.317 1.05,0.338 1.629,1.462 1.293,2.513 -2.481,7.765 -4.133,14.701 -4.133,23.319 0,1.573 0.304,4.142 0.548,6.204 l 0.054,0.453 c 0.076,0.646 -0.166,1.288 -0.649,1.723 l -6.928,6.226 c -4.04,3.389 -8.193,5.156 -12.064,5.156 z" id="path4042" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 457.351,363.719 c -0.501,0 -1,-0.188 -1.385,-0.557 -4.231,-4.062 -8.809,-7.854 -13.604,-11.272 -0.759,-0.542 -1.044,-1.535 -0.686,-2.396 1.022,-2.462 1.996,-4.938 2.892,-7.36 0.27,-0.727 0.935,-1.233 1.707,-1.299 0.057,-0.005 0.113,-0.007 0.17,-0.007 0.71,0 1.372,0.378 1.731,1 l 10.906,18.892 c 0.497,0.862 0.285,1.96 -0.499,2.574 -0.362,0.284 -0.798,0.425 -1.232,0.425 z" id="path4044" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 458.85,277.275 c -0.291,0 -0.584,-0.063 -0.857,-0.193 -0.707,-0.335 -1.153,-1.052 -1.143,-1.834 0.011,-0.772 0.016,-1.513 0.016,-2.239 0,-23.188 -3.945,-45.919 -11.726,-67.56 -0.263,-0.73 -0.079,-1.546 0.471,-2.094 0.381,-0.38 0.892,-0.583 1.411,-0.583 0.229,0 0.461,0.04 0.685,0.121 l 44.62,16.243 c 6.778,2.467 11.003,6.612 11.896,11.671 0.892,5.059 -1.66,10.399 -7.186,15.037 l -36.901,30.964 c -0.368,0.307 -0.825,0.467 -1.286,0.467 z" id="path4046" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 413.104,147.04 c -0.59,0 -1.161,-0.262 -1.546,-0.731 -15.14,-18.452 -33.266,-33.903 -53.873,-45.926 -0.67,-0.391 -1.054,-1.134 -0.984,-1.906 0.07,-0.772 0.579,-1.436 1.309,-1.701 l 44.652,-16.25 c 2.841,-1.034 5.547,-1.558 8.044,-1.558 4.188,0 7.636,1.47 9.968,4.251 2.857,3.405 3.839,8.64 2.763,14.739 l -8.362,47.428 c -0.136,0.77 -0.707,1.39 -1.463,1.587 -0.17,0.046 -0.34,0.067 -0.508,0.067 z" id="path4048" fill="#ffaa00"/> - <path inkscape:connector-curvature="0" d="m 595.627,530.521 c -0.834,-16.318 -14.371,-29.338 -30.894,-29.338 -0.795,0 -1.583,0.039 -2.366,0.098 -9.877,0.741 -18.727,6.09 -23.994,14.643 -1.887,3.061 -5.897,4.017 -8.961,2.129 -1.996,-1.23 -3.089,-3.364 -3.09,-5.549 0,-1.166 0.305,-2.347 0.961,-3.412 7.777,-12.625 21.057,-20.328 35.763,-20.88 -1.24,-41.618 -34.663,-75.128 -76.243,-76.507 2.54,7.55 4.365,15.445 5.376,23.615 0.442,3.569 -2.094,6.821 -5.663,7.263 -0.065,0.008 -0.129,0.006 -0.194,0.012 -0.206,0.02 -0.411,0.038 -0.614,0.038 -3.239,0 -6.047,-2.415 -6.454,-5.713 -1.058,-8.541 -3.106,-16.748 -6.02,-24.515 -1.118,-2.981 -2.362,-5.899 -3.729,-8.744 -7.823,-16.288 -19.604,-30.232 -34.023,-40.684 -4.734,-3.432 -9.754,-6.486 -15.012,-9.122 -14.585,-7.312 -30.999,-11.411 -48.257,-11.411 -42.489,0 -80.596,24.844 -98.026,62.824 1.596,-0.089 3.199,-0.144 4.815,-0.144 17.132,0 33.66,5.05 47.798,14.604 1.86,1.257 2.864,3.308 2.866,5.396 10e-4,1.257 -0.36,2.526 -1.116,3.646 -2.014,2.979 -6.063,3.764 -9.043,1.749 -11.976,-8.092 -25.982,-12.369 -40.505,-12.369 -4.108,0 -8.132,0.361 -12.056,1.022 -1.109,0.582 -2.381,0.845 -3.67,0.717 -0.479,0.106 -0.957,0.216 -1.434,0.331 -18.139,4.424 -33.616,15.69 -43.544,30.905 -3.263,5 -5.92,10.425 -7.879,16.174 -2.063,6.056 -3.355,12.464 -3.736,19.115 -0.08,1.387 -0.13,2.78 -0.13,4.187 0,0.004 0,0.009 0,0.013 0.007,43.604 35.357,78.95 78.963,78.95 h 198.628 74.08 c 20.677,0 37.443,-16.766 37.443,-37.447 0,-0.536 -0.019,-1.067 -0.04,-1.596 z" id="path4050" fill="#b3b3b3"/> - </g> - </g> - </switch> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/113-1.svg b/htdocs/public/symbols/svgicons/113-1.svg deleted file mode 100755 index 6df0241690b0eda122554667933c08fdd53d04f9..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/113-1.svg +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="113-1.svg"> - <defs - id="defs10" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="653" - inkscape:window-height="480" - id="namedview8" - showgrid="false" - inkscape:zoom="7.8666667" - inkscape:cx="15" - inkscape:cy="15" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4249"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3338" - transform="matrix(0.80286981,0,0,0.80286981,-0.04344836,-0.04264536)"> - <rect - rx="0.5" - y="3.5039999" - x="3.552" - height="22.990999" - width="22.896999" - id="rect4255" - style="fill:#cccccc;stroke:#1a1a1a;stroke-width:2.15799999" /> - <path - inkscape:connector-curvature="0" - id="path4797" - d="m 15,3.3135594 0,22.3728816 0,0" - style="fill:#1a1a1a;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:2" /> - <path - inkscape:connector-curvature="0" - id="path4797-9" - d="m 26.18644,15 -22.3728805,0 0,0" - style="fill:#1a1a1a;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:2" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/113-2.svg b/htdocs/public/symbols/svgicons/113-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/113-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/114-1.svg b/htdocs/public/symbols/svgicons/114-1.svg deleted file mode 100755 index 77a422278a196c5dba19119c20ca4e1a83703e1b..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/114-1.svg +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.0"> - <metadata id="metadata7599"/> - <g inkscape:label="Calque 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-30)"> - <g id="g4285-3" transform="matrix(1.1781391,0,0,0.98623438,-312.96944,-269.49239)" stroke="#000000"> - <path inkscape:connector-curvature="0" d="m 275.82023,322.78012 -0.11743,0.0587 -4.69724,2.34862 -0.11787,0.40315 4.81511,2.35648 0.11743,0.0587 0.10275,-0.0587 4.69724,-2.34862 0,-0.41101 -4.69724,-2.34862 -0.10275,-0.0587 z m 0,0.52844 4.1688,2.0844 -4.1688,2.0844 -4.18348,-2.0844 4.18348,-2.0844 z" id="path13409-3-5" sodipodi:nodetypes="cccccccccccccccc" fill-rule="evenodd" stroke-width="0.07"/> - <path inkscape:connector-curvature="0" d="m 275.58537,306.54529 c 0,0 0,0.0294 0,0.0294 -1e-5,5e-5 -0.007,0.25759 -4.69724,19.01891 l 0.33761,0.005 4.69724,-2.34862 0.13211,-0.0587 0,-0.14679 0,-16.44034 -0.46972,-0.0587 z m 0,1.93761 0,14.41465 -4.12477,2.05505 c 2.2092,-8.83676 3.42326,-13.66369 3.99266,-15.94126 0.0755,-0.30197 0.0748,-0.29913 0.13211,-0.52844 z" id="path13411-2-9" sodipodi:nodetypes="ccccccccccccsc" fill-rule="evenodd" stroke-width="0.07"/> - <path inkscape:connector-curvature="0" d="m 276.04041,306.54529 -0.45504,0.0587 0,0.0587 0,21.07886 0.33761,0.20551 4.69724,-2.34862 0.16147,-0.0734 -0.044,-0.19082 -4.68256,-18.73025 -0.0147,-0.0587 z m 0.0147,1.99632 4.18348,16.73392 -4.18348,2.0844 0,-18.81832 z" id="path13413-7-0" sodipodi:nodetypes="cccccccccccccc" fill-rule="evenodd" stroke-width="0.07"/> - <path inkscape:connector-curvature="0" d="m 275.64341,309.26123 -0.93909,0.97507 0.0587,0.38089 0.64564,0.33517 -0.96845,0.97507 0.044,0.38089 0.90975,0.54847 -1.59941,1.24931 0.0294,0.41136 1.54071,0.79224 -2.28906,1.7216 0.0294,0.41136 2.25972,1.27978 -3.0961,2.20914 0.0146,0.41136 2.9934,1.70636 -4.0442,2.15425 0.21442,0.0549 4.46075,-1.95014 0.44019,-0.19805 -0.42552,-0.24378 -3.08144,-1.76731 3.11078,-2.20913 0.30815,-0.22854 -0.33749,-0.18282 -2.2744,-1.27978 2.30374,-1.7216 0.30815,-0.22853 -0.33749,-0.18283 -1.54073,-0.80747 1.57007,-1.21884 0.27885,-0.22853 -0.29347,-0.18283 -0.93911,-0.57895 0.98313,-0.97506 0.23477,-0.24377 -0.29347,-0.15236 -0.66031,-0.33517 0.71901,-0.74654 -0.3375,-0.33518 z" id="path13415-7-8" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc" fill-rule="evenodd" stroke-width="0.071"/> - <path inkscape:connector-curvature="0" d="m 275.98235,309.26123 -0.3375,0.33482 0.71901,0.74576 -0.66031,0.33483 -0.29348,0.15219 0.24945,0.24351 0.96847,0.97405 -0.92444,0.57835 -0.30815,0.18264 0.2788,0.22829 1.57008,1.21756 -1.54073,0.80663 -0.3375,0.18264 0.30815,0.22829 2.30376,1.7198 -2.27441,1.27844 -0.3375,0.18263 0.32282,0.2283 3.09614,2.22205 -3.08146,1.75024 -0.42554,0.24352 0.44021,0.19785 4.47547,1.9481 0.15935,-0.0384 -4.00385,-2.16846 2.99342,-1.70458 0.0147,-0.41093 -3.09615,-2.20684 2.25975,-1.27844 0.0294,-0.41093 -2.2891,-1.7198 1.54073,-0.79141 0.0294,-0.41093 -1.58476,-1.23278 0.90977,-0.56313 0.044,-0.38048 -0.98315,-0.97405 0.64565,-0.33483 0.0587,-0.38048 -0.93911,-0.97405 z" id="path13417-3-1" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc" fill-rule="evenodd" stroke-width="0.071"/> - </g> - <g id="g3005" transform="translate(0.04031641,0)"> - <path inkscape:connector-curvature="0" id="path3012" d="m 5.2748532,32.118719 c 13.3696608,0 13.3696608,0 13.3696608,0" fill="#333333" stroke="#333333" stroke-width="0.347"/> - <path inkscape:connector-curvature="0" id="path3782" d="m 5.2904294,30.045199 0,4.24156" fill="#333333" stroke="#333333" stroke-width="0.378"/> - <path inkscape:connector-curvature="0" id="path3782-5" d="m 7.6909752,30.045199 0,4.24156" fill="#333333" stroke="#333333" stroke-width="0.378"/> - <path inkscape:connector-curvature="0" id="path3782-7" d="m 10.09152,30.0452 0,4.241558" fill="#333333" stroke="#333333" stroke-width="0.378"/> - <path inkscape:connector-curvature="0" id="path3782-6" d="m 18.487833,30.103136 0,4.24156" fill="#333333" stroke="#333333" stroke-width="0.378"/> - <path inkscape:connector-curvature="0" id="path3782-0" d="m 16.135838,30.103136 0,4.24156" fill="#333333" stroke="#333333" stroke-width="0.378"/> - <path inkscape:connector-curvature="0" id="path3782-59" d="m 13.783847,30.103136 0,4.24156" fill="#333333" stroke="#333333" stroke-width="0.378"/> - <path transform="translate(0,29.53069)" d="m 12.177967,2.5423729 c 0,0.1263703 -0.102444,0.2288136 -0.228814,0.2288136 -0.12637,0 -0.228814,-0.1024433 -0.228814,-0.2288136 0,-0.1263702 0.102444,-0.2288135 0.228814,-0.2288135 0.12637,0 0.228814,0.1024433 0.228814,0.2288135 z" sodipodi:ry="0.22881356" sodipodi:rx="0.22881356" sodipodi:cy="2.5423729" sodipodi:cx="11.949153" id="path3832" sodipodi:type="arc" fill="#333333" stroke="#333333" stroke-width="0.5"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/114-2.svg b/htdocs/public/symbols/svgicons/114-2.svg deleted file mode 100755 index 32924b7d84317da0ffd11fb650200170f9e95779..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/114-2.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" viewBox="0 0 24 24" version="1.0"> - <metadata id="metadata4"/> - <rect id="rect3411" width="20.379" height="21.849" x="1.847" y="1.119" fill="#ffffff"/> - <g transform="matrix(0.04136539,0,0,0.04136539,-1.4461831,-1.267893)" id="g8" fill="#000080"> - <path d="m 81.553493,609.68121 c -23.478786,-4.36846 -38.026716,-17.69952 -44.23322,-40.5333 -1.666124,-6.12969 -1.76678,-20.20156 -1.76678,-247 l 0,-240.499996 2.233155,-8.373779 c 5.725822,-21.470413 19.780719,-35.211978 41.766845,-40.83572 6.631125,-1.696148 19.594455,-1.790501 245.999997,-1.790501 223.52273,0 239.43669,0.112295 245.7433,1.734056 16.60649,4.270396 29.36707,14.086266 36.09557,27.765944 7.75705,15.770794 7.16113,-5.990182 7.16113,261.499996 0,227.0761 -0.0902,239.38457 -1.8089,246.70814 -4.92962,21.0063 -17.56825,34.06696 -39.1911,40.49976 -5.67908,1.68953 -18.81014,1.79417 -245.5,1.95641 -193.0645,0.13817 -240.857193,-0.0811 -246.499997,-1.13101 z m 99.648477,-94.63903 c 5.92937,-4.22208 5.85152,-3.32583 5.85152,-67.36215 l 0,-58.53212 4.5,0 4.5,0 0,58.7656 c 0,66.74815 -0.36956,63.63344 8.07399,68.04897 7.47759,3.91038 14.99459,1.99127 20.36422,-5.19902 2.02074,-2.7059 2.06723,-3.94405 2.33484,-62.18821 l 0.27305,-59.42734 19.97695,0 c 10.98732,0 19.97695,-0.27385 19.97695,-0.60856 0,-0.3347 -9.675,-33.85244 -21.5,-74.48386 -11.825,-40.63142 -21.5,-74.10757 -21.5,-74.39144 0,-0.28388 1.54468,-0.51614 3.43261,-0.51614 2.4037,0 3.58903,0.52456 3.95444,1.75 0.287,0.9625 6.20184,20.854 13.14408,44.20334 6.94224,23.34933 13.48194,43.66065 14.53267,45.13626 2.8155,3.95401 9.11875,6.20761 13.82101,4.94142 6.07042,-1.6346 10.11519,-7.14266 10.11519,-13.77462 0,-5.09778 -29.1129,-101.06697 -32.3189,-106.53759 -6.13905,-10.4755 -18.89204,-19.53452 -30.56759,-21.71353 -7.03332,-1.31263 -50.28136,-1.30097 -57.22269,0.0154 -12.59805,2.38917 -25.40548,11.71042 -30.72495,22.36162 -2.94595,5.8987 -32.16587,102.06675 -32.16587,105.86372 0,8.06714 5.92419,13.74372 14.35,13.75021 4.15703,0.003 5.32197,-0.46823 8.15325,-3.29951 3.75233,-3.75233 3.69318,-3.57876 19.578,-57.44675 l 10.39467,-35.25 3.32943,0 c 2.70585,0 3.23029,0.32776 2.80014,1.75 -2.25569,7.45809 -42.60549,147.41352 -42.60549,147.77942 0,0.25882 9,0.47058 20,0.47058 l 20,0 0,57.2566 c 0,34.24599 0.39229,58.62443 0.97612,60.66013 1.17576,4.09965 4.454,7.84185 8.52388,9.73025 4.04465,1.87669 11.766,1.01186 15.64848,-1.75271 z m 262.39289,0.22607 c 5.46787,-2.48371 9.0604,-7.03621 10.3695,-13.14037 0.7299,-3.4034 1.08913,-29.46955 1.08913,-79.02919 l 0,-73.95078 3,0 3,0 0,76.9349 c 0,52.06692 0.34477,77.84484 1.06661,79.75 5.17311,13.65333 26.21636,15.19519 33.69752,2.46905 l 2.73587,-4.65395 0.26467,-129.75 0.26468,-129.75 2.98532,0 2.98533,0 0.002,47.75 c 10e-4,43.45693 0.15876,48.06468 1.75,51.25 4.58907,9.18628 19.48162,9.14868 24.42118,-0.0617 1.70573,-3.18051 1.82727,-7.03595 1.82727,-57.96264 0,-59.30802 -0.13002,-60.93195 -5.69773,-71.16166 -3.50091,-6.43232 -12.013,-14.33444 -18.77628,-17.43077 -8.78679,-4.02273 -15.6615,-4.53932 -55.69793,-4.18539 -35.41726,0.31309 -37.62367,0.44102 -43.10284,2.49908 -11.2885,4.24012 -20.39716,13.16752 -25.083,24.58384 -2.09219,5.09731 -2.14864,6.56211 -2.41718,62.7192 -0.25998,54.36819 -0.17407,57.68642 1.57727,60.92273 4.79424,8.85933 18.99389,9.38064 24.17206,0.88745 1.95044,-3.19912 2.01828,-4.92908 2.02189,-51.56018 l 0.004,-48.25 3.5,0 3.5,0 0,129.4349 c 0,89.02006 0.3321,130.31389 1.06362,132.25 1.40532,3.7195 5.70967,8.23429 9.43638,9.89774 4.24127,1.89313 11.30401,1.68958 16.04137,-0.4623 z m -98.04137,-196.12034 0,-196.5 -18.75,-0.27207 -18.75,-0.27206 0,196.3554 c 0,107.99547 0.30982,196.66522 0.6885,197.04389 0.37867,0.37868 8.81617,0.56618 18.75,0.41667 l 18.0615,-0.27183 0,-196.5 z m -146,-136.35609 c 7.48349,-1.99414 10.69414,-3.98175 16.24814,-10.05871 5.98478,-6.54831 8.24999,-12.45035 8.25681,-21.51334 0.007,-9.73191 -2.39611,-15.46761 -9.49547,-22.6606 -6.98516,-7.07728 -13.15174,-9.67387 -22.89386,-9.64 -12.71415,0.0442 -24.01473,7.35234 -29.39274,19.0084 -6.72112,14.56707 -1.08243,32.94399 12.56187,40.94008 8.4767,4.96768 16.19833,6.19368 24.71525,3.92417 z m 265.78946,-0.13109 c 22.72524,-5.91917 31.93438,-31.7694 18.10284,-50.81504 -11.77397,-16.21242 -36.44442,-17.44384 -49.88903,-2.49019 -11.15873,12.4112 -11.26723,31.49906 -0.247,43.45461 5.05046,5.4791 9.00592,7.91593 15.8251,9.74933 7.01655,1.88646 9.29958,1.90073 16.20809,0.10129 z" id="path10" inkscape:connector-curvature="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/115-1.svg b/htdocs/public/symbols/svgicons/115-1.svg deleted file mode 100755 index b7ea475b30398cab9d2091f5a95aa9471f0b74fd..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/115-1.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24 24" enable-background="new 0 0 99.988 49.124"> - <metadata id="metadata15"/> - <path d="M -3.5754934e-8,17.89555 C 0.48989565,17.89555 0.96298942,17.784177 1.3801568,17.595036 1.8088456,17.394613 2.2929806,17.27772 2.7941575,17.27772 c 0.5062176,0 0.9905926,0.116893 1.4190413,0.317316 0.4231681,0.189141 0.8907413,0.300514 1.3803969,0.300514 0.4843751,0 0.9574688,-0.111373 1.3748763,-0.300514 0.4284487,-0.200423 0.9128237,-0.317316 1.4192813,-0.317316 0.5009369,0 0.9850719,0.116893 1.4137606,0.317316 0.4229281,0.189141 0.8905011,0.300514 1.3801571,0.300514 0.489895,0 0.957469,-0.111373 1.375116,-0.300514 0.428449,-0.200423 0.912824,-0.317316 1.419041,-0.317316 0.506458,0 0.985312,0.116893 1.413761,0.317316 0.422928,0.189141 0.890501,0.300514 1.380157,0.300514 0.489656,0 0.951708,-0.111373 1.369356,-0.300514 0.434209,-0.200423 0.912823,-0.317316 1.419281,-0.317316 0.506457,0 0.985072,0.116893 1.419281,0.317316 0.417408,0.189141 0.884981,0.300514 1.374876,0.300514 v -2.064955 c -0.489895,0 -0.957228,-0.111372 -1.374876,-0.300754 -0.434209,-0.194662 -0.912824,-0.311555 -1.419281,-0.311555 -0.506458,0 -0.985072,0.116893 -1.419281,0.311555 -0.417408,0.189382 -0.87946,0.300754 -1.369356,0.300754 -0.489896,0 -0.957229,-0.111372 -1.380157,-0.300754 -0.428449,-0.194662 -0.907303,-0.311555 -1.413761,-0.311555 -0.506217,0 -0.990592,0.116893 -1.419041,0.311555 -0.417407,0.189382 -0.885221,0.300754 -1.375116,0.300754 -0.489656,0 -0.957229,-0.111372 -1.3801571,-0.300754 -0.4284486,-0.194662 -0.9128237,-0.311555 -1.4137606,-0.311555 -0.5064576,0 -0.9908326,0.116893 -1.4192813,0.311555 -0.4171675,0.189382 -0.8905012,0.300754 -1.3748763,0.300754 -0.4896556,0 -0.9572288,-0.111372 -1.3803969,-0.300754 -0.4284487,-0.194662 -0.9128237,-0.311555 -1.4190413,-0.311555 -0.5011769,0 -0.9850719,0.116893 -1.4140007,0.311555 C 0.96298942,15.719223 0.48989565,15.830595 -3.5754935e-8,15.830595 v 2.064955 z" id="path3" inkscape:connector-curvature="0" fill="#333333"/> - <path d="m 5.6214389,9.2713698 -4.0631818,0.3170761 0.3060348,-2.075996 2.983539,-0.211464 c 0.8067317,-0.038884 0.6900785,0.7680873 0.6900785,0.7680873 l 0.08353,1.2022966 z" id="path5" inkscape:connector-curvature="0" fill="#1a1a1a"/> - <path d="m 12.986123,8.7982761 c -0.745764,0 -1.346793,-0.6010283 -1.346793,-1.3467931 0,-0.7457648 0.601029,-1.3470331 1.346793,-1.3470331 0.745765,0 1.346793,0.6012683 1.346793,1.3470331 0,0.7457648 -0.600788,1.3467931 -1.346793,1.3467931 z" id="path7" inkscape:connector-curvature="0" fill="#1a1a1a"/> - <path d="m 21.4726,13.988386 c -0.172579,-0.04993 -0.339638,-0.116653 -0.495416,-0.189142 -0.434209,-0.200422 -0.912824,-0.317316 -1.419281,-0.317316 -0.506458,0 -0.985072,0.116894 -1.419282,0.317316 -0.417407,0.189142 -0.879459,0.300515 -1.369355,0.300515 -0.489896,0 -0.957229,-0.111373 -1.380157,-0.300515 -0.428449,-0.200422 -0.907303,-0.317316 -1.413761,-0.317316 -0.506217,0 -0.990592,0.116894 -1.419041,0.317316 -0.417407,0.189142 -0.885221,0.300515 -1.375116,0.300515 -0.489656,0 -0.957229,-0.111373 -1.3801571,-0.300515 -0.4284487,-0.200422 -0.9128238,-0.317316 -1.4137607,-0.317316 -0.5064575,0 -0.9908326,0.116894 -1.4192813,0.317316 -0.4171674,0.189142 -0.8905012,0.300515 -1.3748763,0.300515 -0.4896556,0 -0.9572287,-0.111373 -1.3803968,-0.300515 -0.4284487,-0.200422 -0.9128238,-0.317316 -1.4190413,-0.317316 -0.501177,0 -0.985072,0.116894 -1.4140007,0.317316 -0.41716744,0.189142 -0.88498061,0.300515 -1.37463626,0.300515 L 0.4613324,10.41798 17.353252,9.0042195 14.804163,6.4328072 15.92293,6.3327158 18.467219,8.9096487 23.999608,8.4533569 C 24.03297,10.339971 21.929132,13.476408 21.4726,13.988386 l 0,0 z" id="path9" inkscape:connector-curvature="0" fill="#165016"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/115-2.svg b/htdocs/public/symbols/svgicons/115-2.svg deleted file mode 100755 index 0cbedb5e60fbe2cd8bb6dc83ace67bbdc4d17b55..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/115-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata2570"/> - <path d="m 3,11.74468 0,12.25527 18,0 0,-12.25527 C 21,7.65959 18.000005,3.74471 12,5e-5 5.9999946,4.08514 3,8.00002 3,11.74468" id="path2565" inkscape:connector-curvature="0" sodipodi:nodetypes="cccscc" fill="#005500" stroke-width="10"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/116-1.svg b/htdocs/public/symbols/svgicons/116-1.svg deleted file mode 100755 index 4e0ef716f7f3655fb24d63899c46d1735e5edd3e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/116-1.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <rect id="rect3370" width="24" height="24" y="1028.36" rx="4" fill="#330080"/> - <g id="g3446" transform="translate(-0.06313467,1.0100882)"> - <text sodipodi:linespacing="125%" id="text3391" y="1043.78" x="1.72" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="16.25"><tspan dy="0" id="tspan3414" y="1043.78" x="1.72" sodipodi:role="line">T</tspan> - </text> - <text sodipodi:linespacing="125%" id="text3391-9" y="1046.54" x="11.813" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="16.25"><tspan id="tspan3414-4" y="1046.54" x="11.813" sodipodi:role="line">S</tspan> - </text> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/116-2.svg b/htdocs/public/symbols/svgicons/116-2.svg deleted file mode 100755 index ffcccdd724ea79e8f897584fd69ca766fcdaa72d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/116-2.svg +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g transform="matrix(0.12955143,0,0,0.13637681,-4.7984412e-5,1030.9522)" id="g3405" fill="#4d4d4d"> - <g id="g3509"> - <path inkscape:connector-curvature="0" d="m 61.254807,4.999999 0,2 c -12.621002,1.629901 -27.061005,4.7024 -38,11.4684 -11.507004,7.117199 -9.490997,16.063301 2,21.531601 -2.535995,-13.834801 24.475998,-21.2733 35,-19 -7.85701,4.938299 -37.820007,12.626499 -16.001999,23.621899 2.25499,1.136002 4.563004,1.798603 7.001999,2.378101 -8.223999,-11.623299 13.093002,-14.979 21,-16 -3.404999,4.229698 -14.292999,3.501999 -15.218002,10.039398 -0.899002,6.361401 10.871002,8.882801 15.218002,9.699802 13.065994,2.4557 29.030703,2.5117 42.000003,-0.638901 4.61149,-1.1203 17.0063,-5.137302 13.91359,-12.006901 -1.41739,-3.148399 -5.4102,-4.907799 -7.91359,-7.093399 8.3441,-1.2341 18.63359,4.719498 16,14 2.10899,-0.921898 4.0885,-1.860199 5.96449,-3.223801 18.70981,-13.5991 -11.95689,-18.598499 -16.96449,-25.7762 12.94209,1.6713 34.612,5.9484 35,22.000001 2.1483,-1.917702 4.48039,-3.7542 6.19749,-6.091 C 177.6577,16.659798 148.58,6.909198 138.25481,4.155098 c -3.668,-0.978399 -7.6133,-1.0165 -10,-4.155099 15.2339,1.203899 32.7129,5.132899 46,12.876499 6.28795,3.6646 13.32872,10.0522 10.25772,18.123501 -2.76161,7.258099 -11.49953,11.5462 -18.25772,14.188301 -16.82201,6.5765 -35.98741,9.983597 -54,10.772297 C 84.948807,57.156299 56.663804,56.2877 30.254807,48.709098 21.236802,46.121101 10.155808,43.918998 3.387803,36.895099 c -7.645004,-7.935501 -1.042999,-15.4701 6.867004,-19.632 14.806,-7.7901 34.358002,-11.5485 51,-12.263101 z" id="path1365"/> - <path inkscape:connector-curvature="0" d="m 70.254807,42 c 5.369003,-1.971802 10.352997,-2.606598 16,-3.168999 4.231995,-0.421501 7.767998,-0.421501 12,0 l 7.000003,0.607998 c 2.17399,0.344101 11.19619,1.819798 8.10959,5.851902 -1.90999,2.495098 -7.2558,2.824299 -10.10959,3.2701 C 95.077607,49.838101 73.358811,51.857201 70.254807,42 Z" id="path1605"/> - <path inkscape:connector-curvature="0" d="m 177.99594,40.912319 c -2.26642,12.892502 -16.72382,17.374199 -28,19.789402 -28.3129,6.064102 -55.64762,3.871994 -84.000014,0.210598 9.261002,-3.886002 22.1464,0.392101 32,-0.0394 28.575794,-1.251202 56.046294,-3.301403 80.000014,-19.960602 z" id="path1609"/> - <path inkscape:connector-curvature="0" d="m 173.25481,59 c -4.2818,14.376198 -22.65641,14.798904 -35,16.4244 -28.04901,3.693703 -59.458011,-2.149002 -86.000003,-11.091805 -10.475998,-3.529896 -24.57901,-8.821396 -28,-20.332596 8.263992,3.475399 15.481003,9.102398 24,12.315598 38.215996,14.414398 87.339703,20.267502 125.000003,2.684402 z" id="path1627"/> - <path inkscape:connector-curvature="0" d="m 164.25481,74 c -1.5712,15.199005 -22.54,14 -34,14 -28.863,0 -74.668002,-1.978104 -93.000003,-28 9.51799,1.8353 18.641998,8.528 28,11.645096 C 94.757805,81.471802 135.80611,89.602997 164.25481,74 Z" id="path1699"/> - <path inkscape:connector-curvature="0" d="m 151.25481,82 -1,1 1,-1 z" id="path1775"/> - <path inkscape:connector-curvature="0" d="m 137.25481,93 c -15.87451,14.72299 -56.256,7.877 -70.000003,-7 10.156998,-0.596405 22.635994,5.794006 33.000003,7.410004 12.30829,1.917999 24.7016,-0.376007 37,-0.410004 z" id="path1797"/> - <path inkscape:connector-curvature="0" d="m 71.254807,95 c 17.209999,9.79401 35.089603,9.013 54.000003,9 -9.73851,10.34 -32.788005,9.522 -44.000003,2.3 -3.865997,-2.49 -10.106003,-6.298 -10,-11.3 z" id="path1819"/> - <path inkscape:connector-curvature="0" d="m 72.254807,107 c 14.245995,8.313 23.916,5.653 39.000003,7 -7.16851,8.588 -21.832004,9.218 -31.000003,3.44099 C 76.6418,115.164 71.311799,111.698 72.254807,107 Z" id="path1855"/> - <path inkscape:connector-curvature="0" d="m 94.254807,124 c -3.297302,5.44 -9.484009,7.22501 -10,14 -6.074997,-3.64999 -12.81601,-10.162 -15,-17 9.421997,2.713 15.110992,3.78 25,3 z" id="path1887"/> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/117-1.svg b/htdocs/public/symbols/svgicons/117-1.svg deleted file mode 100755 index bbb73cbb0885ed4a4713070dcb3ea101c80dd97d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/117-1.svg +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <circle id="path4202-7-41" cx="20.848" cy="15.639" r="1.167" fill="#999999" stroke="#000000" stroke-width="0.869"/> - <circle id="path4202-7-4" cx="14.889" cy="15.639" r="1.167" fill="#999999" stroke="#000000" stroke-width="0.869"/> - <circle id="path4202-7-3" cx="5.902" cy="15.639" r="1.167" fill="#999999" stroke="#000000" stroke-width="0.869"/> - <circle id="path4202-7" cx="2.566" cy="15.639" r="1.167" fill="#999999" stroke="#000000" stroke-width="0.869"/> - <metadata id="metadata16"/> - <path inkscape:connector-curvature="0" id="path1999" d="m 18.973354,8.2340634 3.694442,0.058906 1.332271,3.5694771 0,3.393518 c 0,0.236478 -0.153395,0.45247 -0.427332,0.45247 l -0.754115,0 C 22.246471,13.4291 20.049359,13.090386 19.073181,15.004593 l -2.413168,0 c -1.075877,-1.819269 -3.54604,-1.482708 -3.670026,0.68158 l -0.678704,0 c 0,-0.915452 0.928708,-2.566867 1.960699,-2.566867 l 4.725789,0 z" sodipodi:nodetypes="cccsscccccscc" color="#000000" stroke-linecap="round" fill="#330080"/> - <path inkscape:connector-curvature="0" id="path2003" d="m 6.4246942,13.128203 c 1.0319917,0 1.9606895,1.65139 1.9606901,2.566841 l -0.680552,0 C 7.5843514,13.591945 5.2490251,13.353691 4.5296521,14.290175 l 0.00219,0.08534 -0.680552,0 0.00219,-0.08534 C 3.1341043,13.353691 0.79877799,13.591945 0.67829706,15.695044 l -0.678363787946,0 C -6.6064736e-5,14.779593 0.92863167,13.128203 1.9606235,13.128203 l 4.4640713,0 z" color="#000000" stroke-linecap="round" fill="#330080"/> - <path inkscape:connector-curvature="0" id="path2018" d="m 17.408213,6.8489999 0.0041,5.9776541 -17.36951172,-0.0044 0,-5.952824 L 17.408186,6.849041 Z" color="#000000" stroke-linecap="round" fill="#330080"/> - <path inkscape:connector-curvature="0" id="path2020" d="m 20.388457,9.1247404 -0.0071,2.1916766 2.751974,0.335393 -0.897406,-2.5199873 -1.847486,-0.00704 z" sodipodi:nodetypes="cccccc" color="#000000" stroke-linecap="round" fill="#7f2aff"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/117-2.svg b/htdocs/public/symbols/svgicons/117-2.svg deleted file mode 100755 index de2be4800b4a9055c14eefa8cf39394d87b845f9..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/117-2.svg +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="117-2.svg"> - <defs - id="defs11" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview9" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="15.953885" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata16"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3339" - transform="translate(0,1.0174495)"> - <circle - transform="scale(-1,1)" - id="circle10-3" - cy="16.049999" - cx="-20.650999" - r="1.635" - style="fill:#333333;stroke:#000000;stroke-width:1.09000003" /> - <circle - transform="scale(-1,1)" - id="circle10" - cy="16.049999" - cx="-5.6350002" - r="1.635" - style="fill:#333333;stroke:#000000;stroke-width:1.09000003" /> - <path - inkscape:connector-curvature="0" - id="path4" - d="m 17.26232,7.6891224 0,6.3834376 -10.0774084,0.0082 c 0.5913728,0.483153 0.9605772,1.149103 0.9557512,2.02316 l 10.0037082,-0.006 c 0.09583,-3.390997 4.906818,-3.37946 5.011357,-0.0196 0.722585,-0.0054 0.822815,-0.169504 0.829782,-0.835121 l 0,-2.545501 c 0.0091,-1.13756 0.151137,-0.386643 -0.69094,-2.543823 C 22.428121,7.854439 22.666986,8.0669874 21.883288,8.0076409 L 17.26232,7.6891224 Z m 2.001574,3.7638116 -0.03988,-2.7120946 2.572501,0.159535 c 0.468981,0.031418 0.472884,0.034362 0.63814,0.5783144 l 0.658082,1.7548852 c 0.221079,0.538264 0.185891,0.696873 -0.418779,0.618198 l -3.410061,-0.398838 z m -19.25057607,2.632693 -0.00490022,1.43415 1.66119649,0.588034 1.4585622,-9.33e-4 c -0.00594,-0.831595 0.3396583,-1.531015 0.9524182,-2.022327 l -4.06727667,0.0011 z" - style="fill:#550000;fill-rule:evenodd" /> - <rect - style="fill:#550000" - transform="scale(-1,1)" - id="rect6" - width="16.966" - height="9.999898" - y="3.7351017" - x="-16.966" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/118-1.svg b/htdocs/public/symbols/svgicons/118-1.svg deleted file mode 100755 index 3ed29dfb06110d0b8a03c89c264fa3b2efd1ca4b..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/118-1.svg +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.0"> - <metadata id="metadata3205"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-73)"> - <text x="-35.536" y="68.786" id="text3301" font-family="RoadSign" font-size="72"><tspan sodipodi:role="line" id="tspan3303" x="-35.536" y="68.786"/> - </text> - <text x="-14.286" y="63.25" id="text3305" font-family="RoadSign" font-size="72"><tspan sodipodi:role="line" id="tspan3307" x="-14.286" y="63.25"/> - </text> - <text x="-10.536" y="52.54" id="text3309" font-family="RoadSign" font-size="72"><tspan sodipodi:role="line" id="tspan3311" x="-10.536" y="52.54"/> - </text> - <circle id="path3374-9" cx="18.796" cy="89.89" r="1.74" fill="#cccccc" stroke="#000000" stroke-width="1.602"/> - <circle id="path3374" cx="4.28" cy="89.89" r="1.74" fill="#cccccc" stroke="#000000" stroke-width="1.602"/> - <g id="g4295" fill="#007ad4"> - <path sodipodi:nodetypes="cccccccccccccccscc" id="path3678" d="m 21.808672,89.618143 1.369448,0 c 0.547753,8e-6 0.821643,-0.273881 0.821669,-0.821669 l 0,-1.369448 -0.821669,0 0,-1.917228 c -2.5e-5,-0.547766 -0.25109,-0.890127 -0.753196,-1.027086 l -0.280954,-0.546148 -1.780283,-5.83048 c -0.182615,-0.296697 -2.992157,-0.512983 -3.266025,-0.513 l -0.374425,9.90187 -10.6974543,-0.06793 c 0.753188,0.547789 1.1754341,1.278161 1.2667394,2.191117 l 8.4905779,0 c 0.06846,-0.776012 0.387992,-1.426499 0.958614,-1.951464 0.593408,-0.524944 1.278132,-0.787422 2.054172,-0.787433 0.798823,1.1e-5 1.472135,0.262489 2.019936,0.787433 0.57058,0.502141 0.901529,1.152628 0.99285,1.951464" inkscape:connector-curvature="0"/> - <path sodipodi:nodetypes="ccsccccsc" id="path3676" d="m 17.556318,77.567 -15.7415879,0 c -0.4564861,2e-5 -0.84449594,0.159789 -1.16403114,0.479306 -0.31954015,0.319558 -0.4793087,0.707568 -0.4793068,1.164031 l 0,7.668909 17.29688984,0.03261 0.540171,-6.605956 c 0.27387,1.7e-5 0.410814,-0.136927 0.410835,-0.410835 -2.1e-5,-0.09128 -0.03426,-0.171162 -0.102709,-0.239653" inkscape:connector-curvature="0"/> - <path id="path3666" d="m 2.5336903,87.427026 -2.53347913634,0 0,1.232503 C 2.0926165e-4,89.298613 0.31974675,89.618151 0.95882476,89.618143 l 0.30812584,0 c 0.091293,-0.93578 0.5135395,-1.666152 1.2667397,-2.191117" inkscape:connector-curvature="0"/> - </g> - <path inkscape:connector-curvature="0" d="m 20.877773,83.188801 c 0.0228,0.06849 0.03421,0.136959 0.03424,0.205417 -2.2e-5,0.273903 -0.136966,0.410848 -0.410834,0.410835 l -2.3373,0 c -0.273908,1.3e-5 -0.410853,-0.136932 -0.410835,-0.410835 l 0,-3.712725 c -1.8e-5,-0.273874 0.136927,-0.410819 0.410835,-0.410835 l 0.728198,0 c 0.296694,1.6e-5 0.524935,0.125549 0.684724,0.376599 l 1.300976,3.541544" id="path3662" sodipodi:nodetypes="cscccccccc" fill="#cccccc"/> - <path d="m 15.492906,79.628566 0,3.962045 c -6.4e-5,0.122847 -0.337431,0.184274 -1.012083,0.184282 l -10.1207902,0 c -0.6747747,-8e-6 -1.0121442,-0.06144 -1.0120848,-0.184282 l 0,-3.962045 c -5.94e-5,-0.122858 0.3373101,-0.184284 1.0120848,-0.184281 l 10.1207902,0 c 0.674652,-3e-6 1.012019,0.06142 1.012083,0.184281" id="path3700-4" inkscape:connector-curvature="0" fill="#cccccc"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/118-2.svg b/htdocs/public/symbols/svgicons/118-2.svg deleted file mode 100755 index dbb17864817239e2e527afa2b8541f02611c8ce8..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/118-2.svg +++ /dev/null @@ -1,132 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - version="1.0" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="118-2.svg"> - <defs - id="defs21" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview19" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-0.76271186" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="layer1" /> - <metadata - id="metadata3205"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-73)"> - <text - x="-35.536" - y="68.786" - id="text3301" - font-family="RoadSign" - font-size="72"> - <tspan - sodipodi:role="line" - id="tspan3303" - x="-35.536" - y="68.786" /> - </text> - <text - x="-14.286" - y="63.25" - id="text3305" - font-family="RoadSign" - font-size="72"> - <tspan - sodipodi:role="line" - id="tspan3307" - x="-14.286" - y="63.25" /> - </text> - <text - x="-10.536" - y="52.54" - id="text3309" - font-family="RoadSign" - font-size="72"> - <tspan - sodipodi:role="line" - id="tspan3311" - x="-10.536" - y="52.54" /> - </text> - <g - id="g3349" - transform="translate(0,0.86540701)"> - <circle - r="1.74" - cy="89.889999" - cx="18.796" - id="path3374-9" - style="fill:#cccccc;stroke:#000000;stroke-width:1.602" /> - <circle - r="1.74" - cy="89.889999" - cx="4.2800002" - id="path3374" - style="fill:#cccccc;stroke:#000000;stroke-width:1.602" /> - <g - style="fill:#007ad4" - transform="matrix(1,0,0,1.1434564,0,-12.856296)" - id="g3363"> - <path - inkscape:connector-curvature="0" - d="m 21.808672,89.618143 1.369448,0 c 0.547753,8e-6 0.821643,-0.273881 0.821669,-0.821669 l 0,-1.369448 -0.821669,0 0,-1.917228 c -2.5e-5,-0.547766 -0.25109,-0.890127 -0.753196,-1.027086 l -0.280954,-0.546148 -1.780283,-5.83048 c -0.182615,-0.296697 -2.992157,-0.512983 -3.266025,-0.513 l -0.374425,9.90187 -10.6974543,-0.06793 c 0.753188,0.547789 1.1754341,1.278161 1.2667394,2.191117 l 8.4905779,0 c 0.06846,-0.776012 0.387992,-1.426499 0.958614,-1.951464 0.593408,-0.524944 1.278132,-0.787422 2.054172,-0.787433 0.798823,1.1e-5 1.472135,0.262489 2.019936,0.787433 0.57058,0.502141 0.901529,1.152628 0.99285,1.951464" - id="path3678" - sodipodi:nodetypes="cccccccccccccccscc" /> - <path - inkscape:connector-curvature="0" - d="m 17.556318,77.567 -15.7415879,0 c -0.4564861,2e-5 -0.84449594,0.159789 -1.16403114,0.479306 -0.31954015,0.319558 -0.4793087,0.707568 -0.4793068,1.164031 l 0,7.668909 17.29688984,0.03261 0.540171,-6.605956 c 0.27387,1.7e-5 0.410814,-0.136927 0.410835,-0.410835 -2.1e-5,-0.09128 -0.03426,-0.171162 -0.102709,-0.239653" - id="path3676" - sodipodi:nodetypes="ccsccccsc" /> - <path - inkscape:connector-curvature="0" - d="m 2.5336903,87.427026 -2.53347913634,0 0,1.232503 C 2.0926165e-4,89.298613 0.31974675,89.618151 0.95882476,89.618143 l 0.30812584,0 c 0.091293,-0.93578 0.5135395,-1.666152 1.2667397,-2.191117" - id="path3666" /> - </g> - <path - style="fill:#cccccc" - sodipodi:nodetypes="cscccccccc" - id="path3662" - d="m 20.877773,82.953845 c 0.0228,0.0946 0.03421,0.189177 0.03424,0.283735 -2.2e-5,0.378333 -0.136966,0.567491 -0.410834,0.567473 l -2.3373,0 c -0.273908,1.8e-5 -0.410853,-0.18914 -0.410835,-0.567473 l 0,-5.128263 c -1.8e-5,-0.378293 0.136927,-0.56745 0.410835,-0.567473 l 0.728198,0 c 0.296694,2.3e-5 0.524935,0.173417 0.684724,0.520184 l 1.300976,4.891817" - inkscape:connector-curvature="0" /> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/119-1.svg b/htdocs/public/symbols/svgicons/119-1.svg deleted file mode 100755 index 9945291decbf5341c6290160420a4c05e78e9f3c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/119-1.svg +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <rect id="rect3370" width="24" height="24" y="1028.36" rx="4" fill="#330080"/> - <g id="g3565" transform="translate(0,1.4520842)"> - <text transform="scale(0.90797253,1.1013549)" sodipodi:linespacing="125%" id="text3391-4" y="948.63" x="9.561" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10.625"><tspan id="tspan3414-3" y="948.63" x="9.561" sodipodi:role="line">2</tspan> - </text> - <g transform="translate(-0.63089896,-0.05619343)" id="g3539"> - <text x="1.457" y="945.91" id="text3391" sodipodi:linespacing="125%" transform="scale(0.90797253,1.1013549)" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10.625"><tspan sodipodi:role="line" x="1.457" y="945.91" id="tspan3414">H</tspan> - </text> - <text x="16.891" y="945.91" id="text3391-3" sodipodi:linespacing="125%" transform="scale(0.90797253,1.1013549)" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10.625"><tspan sodipodi:role="line" x="16.891" y="945.91" id="tspan3414-9">O</tspan> - </text> - </g> - </g> - <text x="-76.27" y="1019.03" id="text3554" sodipodi:linespacing="125%" font-family="sans-serif" fill="#000000" word-spacing="0" line-height="125%" font-weight="normal" letter-spacing="0" font-size="15"><tspan sodipodi:role="line" id="tspan3556" x="-76.27" y="1019.03"/> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/119-2.svg b/htdocs/public/symbols/svgicons/119-2.svg deleted file mode 100755 index 3cfd67a948765a31f3d23976ae43348682ffb66f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/119-2.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata18081">image/svg+xmlPublic Domainclker.comMohamed Ibrahimmap symbolsmap symbols</metadata> - <g id="g3363" transform="matrix(0.1260878,0,0,0.1260878,-20.426648,35.46397)"> - <path sodipodi:nodetypes="csccccscc" id="path6712" d="m 251.64044,-204.39984 c -6.83786,6.62585 -16.06195,9.22351 -26.29251,9.22351 -12.98724,0 -24.80786,-5.30078 -31.59329,-15.31989 -6.73184,10.23114 -18.60602,15.31989 -31.75229,15.31989 l 0,-29.10217 c 13.14627,0 25.02045,-6.51984 31.75229,-16.7504 6.78543,10.01855 18.60605,16.7504 31.59329,16.7504 13.25226,0 24.96744,-6.83786 31.6463,-17.17441 z" inkscape:connector-curvature="0" fill="#2948cc"/> - <path sodipodi:nodetypes="ccscsccscsccc" d="m 352.34793,-194.17633 c -12.98724,0 -24.80786,-5.30078 -31.59329,-15.31989 -6.73184,10.23114 -18.60602,15.31989 -31.75229,15.31989 -12.98666,0 -24.70184,-5.4068 -31.48669,-15.4259 -6.73243,10.33715 -18.60605,15.4259 -31.91129,15.4259 -9.59454,0 -18.39404,-2.17365 -25.02045,-8.05747 l -5.03578,-36.04602 c 6.89144,9.1175 17.81099,15.00132 30.05623,15.00132 13.30524,0 25.17886,-6.51984 31.91129,-16.85639 6.78485,10.01853 18.50003,16.85639 31.48669,16.85639 13.14627,0 25.02045,-6.51984 31.75229,-16.7504 6.78543,10.01855 18.60605,16.7504 31.59329,16.7504 z" id="svg_1" inkscape:connector-curvature="0" fill="#2948cc"/> - </g> - <rect id="rect3367" width="24" height="15.333" y="8.667" fill="#2948cc" fill-rule="evenodd"/> - <text x="-0.018" y="22.762" id="text3369" sodipodi:linespacing="125%" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" letter-spacing="-0.3" font-size="7.25"><tspan sodipodi:role="line" id="tspan3371" x="-0.018" y="22.762">FLOOD</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/120-1.svg b/htdocs/public/symbols/svgicons/120-1.svg deleted file mode 100755 index d774dd4672d4dd022464c543afb197768850189e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/120-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata8"/> - <g transform="matrix(0.08790013,0,0,0.08790013,-26.032503,-29.850322)" id="layer1"> - <path d="m 296.78571,612.63003 c 0,0 104.06285,-132.7859 104.06285,-132.7859 0,0 -104.06285,-140.24982 -104.06285,-140.24982 l 67.30299,0 c 0,0 83.34749,113.48826 83.34749,113.48826 l -126.86477,159.54746 -23.78571,0 z M 417.28794,500.06578 544.11662,339.59431 c 0,0 24.45481,0 24.45481,0 L 464.47749,471.26578 c 0,0 104.09394,141.36425 104.09394,141.36425 l -67.30357,0 c 0,0 -83.97992,-112.56425 -83.97992,-112.56425 z" id="path2830" inkscape:connector-curvature="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/120-2.svg b/htdocs/public/symbols/svgicons/120-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/120-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/121-1.svg b/htdocs/public/symbols/svgicons/121-1.svg deleted file mode 100755 index dc8aba6f96cad03a51d2a6174505ca107543a55d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/121-1.svg +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3029"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g transform="translate(0.00101871,1028.5055)" id="g2991"> - <path sodipodi:nodetypes="cccsscsssscssc" id="rect2391" d="m 20.265448,16.462473 -8.264431,-6.266405 -8.2684999,6.269014 0,5.886696 c 0,0.231639 0.2182565,0.417208 0.4882882,0.417208 l 5.9228317,0 0,-3.927855 c 0,-0.231202 0.216733,-0.418082 0.487275,-0.418082 l 2.735628,0 c 0.270543,0 0.487286,0.18688 0.487286,0.418082 l 0,3.927855 5.924345,0 c 0.270032,0 0.487277,-0.185569 0.487277,-0.417208 z" inkscape:connector-curvature="0" fill="#ffff00" stroke="#000000" stroke-width="1.879"/> - <path id="path2399" d="M 11.9536,5.5543978 0.22594157,14.44575 1.4612949,15.638705 12.001217,7.6473983 22.539115,15.638705 23.772021,14.44575 12.046899,5.5543978 12.0012,5.5996202 11.95349,5.5543978 z" inkscape:connector-curvature="0" stroke="#000000" stroke-linejoin="round" stroke-width="0.47"/> - <path id="rect2404" d="m 3.7328178,6.8342717 2.9729061,0 -0.025857,1.5076098 -2.9470184,2.2794445 0,-3.7870543 z" inkscape:connector-curvature="0"/> - <path sodipodi:nodetypes="ccccc" id="rect2404-4" d="m 18.098343,2.2763645 -0.954846,0 0.0083,6.0962772 0.946533,0.8746216 z" inkscape:connector-curvature="0"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path3336" d="M 22.021206,2.453667 10.079193,2.4094135" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="0.796"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4138" d="m 9.5054813,0.35498487 0,4.24235173" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.7"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4138-0" d="m 12.353087,0.35498487 0,4.24235173" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.7"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4138-2" d="m 15.200692,0.35498487 0,4.24235173" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.7"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4138-7" d="m 19.881322,0.35498487 0,4.24235173" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.7"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4138-3" d="m 22.438356,0.35498487 0,4.24235173" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.7"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/121-2.svg b/htdocs/public/symbols/svgicons/121-2.svg deleted file mode 100755 index 8ebb972d28c9fc5d1958bce3697efa5c1b63c45b..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/121-2.svg +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <rect id="rect3370" width="24" height="24" y="1028.36" rx="4" fill="#d45500"/> - <g transform="matrix(0.11875777,0,0,0.12501449,0.99974367,1031.7362)" id="g3405"> - <g id="g3509"> - <path inkscape:connector-curvature="0" d="m 61.254807,4.999999 0,2 c -12.621002,1.629901 -27.061005,4.7024 -38,11.4684 -11.507004,7.117199 -9.490997,16.063301 2,21.531601 -2.535995,-13.834801 24.475998,-21.2733 35,-19 -7.85701,4.938299 -37.820007,12.626499 -16.001999,23.621899 2.25499,1.136002 4.563004,1.798603 7.001999,2.378101 -8.223999,-11.623299 13.093002,-14.979 21,-16 -3.404999,4.229698 -14.292999,3.501999 -15.218002,10.039398 -0.899002,6.361401 10.871002,8.882801 15.218002,9.699802 13.065994,2.4557 29.030703,2.5117 42.000003,-0.638901 4.61149,-1.1203 17.0063,-5.137302 13.91359,-12.006901 -1.41739,-3.148399 -5.4102,-4.907799 -7.91359,-7.093399 8.3441,-1.2341 18.63359,4.719498 16,14 2.10899,-0.921898 4.0885,-1.860199 5.96449,-3.223801 18.70981,-13.5991 -11.95689,-18.598499 -16.96449,-25.7762 12.94209,1.6713 34.612,5.9484 35,22.000001 2.1483,-1.917702 4.48039,-3.7542 6.19749,-6.091 C 177.6577,16.659798 148.58,6.909198 138.25481,4.155098 c -3.668,-0.978399 -7.6133,-1.0165 -10,-4.155099 15.2339,1.203899 32.7129,5.132899 46,12.876499 6.28795,3.6646 13.32872,10.0522 10.25772,18.123501 -2.76161,7.258099 -11.49953,11.5462 -18.25772,14.188301 -16.82201,6.5765 -35.98741,9.983597 -54,10.772297 C 84.948807,57.156299 56.663804,56.2877 30.254807,48.709098 21.236802,46.121101 10.155808,43.918998 3.387803,36.895099 c -7.645004,-7.935501 -1.042999,-15.4701 6.867004,-19.632 14.806,-7.7901 34.358002,-11.5485 51,-12.263101 z" id="path1365"/> - <path inkscape:connector-curvature="0" d="m 70.254807,42 c 5.369003,-1.971802 10.352997,-2.606598 16,-3.168999 4.231995,-0.421501 7.767998,-0.421501 12,0 l 7.000003,0.607998 c 2.17399,0.344101 11.19619,1.819798 8.10959,5.851902 -1.90999,2.495098 -7.2558,2.824299 -10.10959,3.2701 C 95.077607,49.838101 73.358811,51.857201 70.254807,42 Z" id="path1605"/> - <path inkscape:connector-curvature="0" d="m 177.99594,40.912319 c -2.26642,12.892502 -16.72382,17.374199 -28,19.789402 -28.3129,6.064102 -55.64762,3.871994 -84.000014,0.210598 9.261002,-3.886002 22.1464,0.392101 32,-0.0394 28.575794,-1.251202 56.046294,-3.301403 80.000014,-19.960602 z" id="path1609"/> - <path inkscape:connector-curvature="0" d="m 173.25481,59 c -4.2818,14.376198 -22.65641,14.798904 -35,16.4244 -28.04901,3.693703 -59.458011,-2.149002 -86.000003,-11.091805 -10.475998,-3.529896 -24.57901,-8.821396 -28,-20.332596 8.263992,3.475399 15.481003,9.102398 24,12.315598 38.215996,14.414398 87.339703,20.267502 125.000003,2.684402 z" id="path1627"/> - <path inkscape:connector-curvature="0" d="m 164.25481,74 c -1.5712,15.199005 -22.54,14 -34,14 -28.863,0 -74.668002,-1.978104 -93.000003,-28 9.51799,1.8353 18.641998,8.528 28,11.645096 C 94.757805,81.471802 135.80611,89.602997 164.25481,74 Z" id="path1699"/> - <path inkscape:connector-curvature="0" d="m 151.25481,82 -1,1 1,-1 z" id="path1775"/> - <path inkscape:connector-curvature="0" d="m 137.25481,93 c -15.87451,14.72299 -56.256,7.877 -70.000003,-7 10.156998,-0.596405 22.635994,5.794006 33.000003,7.410004 12.30829,1.917999 24.7016,-0.376007 37,-0.410004 z" id="path1797"/> - <path inkscape:connector-curvature="0" d="m 71.254807,95 c 17.209999,9.79401 35.089603,9.013 54.000003,9 -9.73851,10.34 -32.788005,9.522 -44.000003,2.3 -3.865997,-2.49 -10.106003,-6.298 -10,-11.3 z" id="path1819"/> - <path inkscape:connector-curvature="0" d="m 72.254807,107 c 14.245995,8.313 23.916,5.653 39.000003,7 -7.16851,8.588 -21.832004,9.218 -31.000003,3.44099 C 76.6418,115.164 71.311799,111.698 72.254807,107 Z" id="path1855"/> - <path inkscape:connector-curvature="0" d="m 94.254807,124 c -3.297302,5.44 -9.484009,7.22501 -10,14 -6.074997,-3.64999 -12.81601,-10.162 -15,-17 9.421997,2.713 15.110992,3.78 25,3 z" id="path1887"/> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/122-1.svg b/htdocs/public/symbols/svgicons/122-1.svg deleted file mode 100755 index 700aecd3cc6a78451e0a60000be084a270829b53..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/122-1.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3957"/> - <path d="m 2.1612884,23.755458 19.5543286,0 0,-11.781835 2.039841,0 L 12.026377,0.24454219 0.24454209,12.026377 l 1.95191591,0 z" id="path3961" inkscape:connector-curvature="0" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-width="0.489"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/122-2.svg b/htdocs/public/symbols/svgicons/122-2.svg deleted file mode 100755 index 700aecd3cc6a78451e0a60000be084a270829b53..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/122-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3957"/> - <path d="m 2.1612884,23.755458 19.5543286,0 0,-11.781835 2.039841,0 L 12.026377,0.24454219 0.24454209,12.026377 l 1.95191591,0 z" id="path3961" inkscape:connector-curvature="0" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-width="0.489"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/123-1.svg b/htdocs/public/symbols/svgicons/123-1.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/123-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/123-2.svg b/htdocs/public/symbols/svgicons/123-2.svg deleted file mode 100755 index 5675e6fef10e1f760314f7578861ebbd2c4e5dff..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/123-2.svg +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3121"> - <path d="m 587.001,191.775 c 0,-34.867 -24.173,-64.178 -56.635,-72.094 -0.487,-0.119 -0.977,-0.23 -1.468,-0.34 -1.321,0.132 -2.625,-0.138 -3.761,-0.734 -4.019,-0.676 -8.14,-1.047 -12.347,-1.047 -14.877,0 -29.225,4.381 -41.491,12.671 -3.054,2.063 -7.2,1.261 -9.263,-1.792 -0.774,-1.146 -1.145,-2.447 -1.144,-3.735 0.002,-2.139 1.03,-4.239 2.936,-5.526 14.481,-9.786 31.411,-14.959 48.962,-14.959 1.654,0 3.297,0.051 4.928,0.142 C 499.864,65.46 460.832,40.014 417.312,40.014 c -46.851,0 -87.649,29.456 -103.479,71.663 -2.983,7.955 -5.083,16.361 -6.166,25.111 -0.418,3.378 -3.293,5.852 -6.612,5.852 -0.207,0 -0.417,-0.019 -0.627,-0.039 -0.067,-0.006 -0.133,-0.004 -0.2,-0.012 -3.656,-0.452 -6.253,-3.783 -5.801,-7.439 1.036,-8.369 2.905,-16.456 5.507,-24.189 -42.585,1.412 -76.817,35.727 -78.098,78.348 8.087,0.308 15.9,2.767 22.695,7.162 1.975,1.276 3.044,3.421 3.043,5.609 -0.001,1.24 -0.342,2.495 -1.065,3.614 -2,3.095 -6.129,3.979 -9.224,1.978 -4.437,-2.869 -9.495,-4.561 -14.755,-4.959 -0.804,-0.062 -1.611,-0.097 -2.423,-0.097 -14.922,0 -27.461,10.372 -30.804,24.284 11.929,-3.955 24.376,-6.65 37.163,-7.951 5.847,-0.594 11.765,-0.901 17.736,-0.901 5.979,0 11.893,0.314 17.732,0.909 11.826,1.203 23.331,3.594 34.384,7.062 20.481,6.429 39.406,16.55 55.945,29.621 6.605,5.221 12.835,10.904 18.624,17.02 h 135.23 c 44.668,0 80.877,-36.205 80.885,-80.871 0,-0.006 -10e-4,-0.01 -10e-4,-0.014 z" id="path3123" inkscape:connector-curvature="0" fill="#b3b3b3"/> - <path d="m 521.806,465.719 c -1.138,0 -2.266,0.055 -3.387,0.139 -14.255,1.062 -27.023,8.777 -34.622,21.114 -2.721,4.414 -8.506,5.79 -12.921,3.07 -2.88,-1.773 -4.455,-4.852 -4.456,-8.002 0,-1.681 0.439,-3.382 1.385,-4.918 11.22,-18.215 30.377,-29.352 51.597,-30.136 -1.799,-60.006 -50.021,-108.336 -109.977,-110.315 3.667,10.895 6.302,22.287 7.761,34.077 0.637,5.147 -3.02,9.836 -8.166,10.473 -0.094,0.012 -0.187,0.009 -0.281,0.018 -0.296,0.027 -0.592,0.055 -0.884,0.055 -4.672,0 -8.72,-3.482 -9.308,-8.238 -1.525,-12.323 -4.483,-24.163 -8.688,-35.367 -9.626,-25.658 -25.811,-47.963 -46.402,-65.029 -2.799,-2.319 -5.68,-4.541 -8.637,-6.662 -25.652,-18.406 -57.028,-29.169 -90.619,-29.169 -2.87,0 -5.725,0.084 -8.565,0.239 -15.718,0.86 -30.94,4.069 -45.253,9.344 -38.31,14.117 -70.116,42.994 -87.554,81 2.307,-0.129 4.63,-0.201 6.969,-0.201 24.705,0 48.537,7.281 68.921,21.057 2.683,1.812 4.13,4.769 4.133,7.779 0.002,1.812 -0.52,3.645 -1.61,5.259 -2.904,4.298 -8.741,5.427 -13.038,2.522 -17.267,-11.669 -37.463,-17.836 -58.405,-17.836 -5.904,0 -11.693,0.5 -17.333,1.446 -1.631,0.87 -3.511,1.261 -5.415,1.056 -0.665,0.148 -1.328,0.304 -1.988,0.465 -45.703,11.139 -79.73,52.417 -79.73,101.501 0,0.011 -0.001,0.021 -0.001,0.031 0.017,62.868 50.986,113.828 113.86,113.828 H 405.6 512.417 c 29.816,0 53.992,-24.176 53.992,-53.997 0,-24.594 -20.009,-44.603 -44.603,-44.603 z" id="path3125" inkscape:connector-curvature="0" fill="#b3b3b3"/> - </g> - <g id="g3046" transform="translate(-0.03373486,-0.89285714)"> - <path inkscape:connector-curvature="0" id="path3903" d="m 0.74157708,1045.7667 c 20.84821392,0 20.84821392,0 20.84821392,0" stroke="#b3b1b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-6" d="m 2.2817553,1047.4801 c 20.8482147,0 20.8482147,0 20.8482147,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-0" d="m 0.67857143,1049.1935 c 7.98315367,0 7.98315367,0 7.98315367,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-0-4" d="m 10.499999,1049.1506 c 7.983154,0 7.983154,0 7.983154,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-6-6" d="m 2.1924695,1050.9068 c 20.8482145,0 20.8482145,0 20.8482145,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - </g> - <text x="2.5" y="11.143" id="text4818" sodipodi:linespacing="0%" transform="translate(0,1028.3622)" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" letter-spacing="0" font-size="6"><tspan sodipodi:role="line" id="tspan4820"/> - </text> - <g id="g3053" transform="translate(-0.04910686,1.0267857)"> - <path inkscape:connector-curvature="0" id="path3903-3" d="m 0.75694943,1029.8814 c 20.84821357,0 20.84821357,0 20.84821357,0" stroke="#b3b1b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-6-5" d="m 2.2971274,1031.5948 c 20.8482146,0 20.8482146,0 20.8482146,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-0-0" d="m 0.69394343,1033.3082 c 7.98315397,0 7.98315397,0 7.98315397,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-0-4-6" d="m 10.515371,1033.2653 c 7.983154,0 7.983154,0 7.983154,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-6-6-5" d="m 2.2078414,1035.0215 c 20.8482146,0 20.8482146,0 20.8482146,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - </g> - <g id="g3046-8" transform="translate(-0.03373486,-7.9388357)"> - <path inkscape:connector-curvature="0" id="path3903-67" d="m 0.74157708,1045.7667 c 20.84821392,0 20.84821392,0 20.84821392,0" stroke="#b3b1b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-6-58" d="m 2.2817553,1047.4801 c 20.8482147,0 20.8482147,0 20.8482147,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-0-01" d="m 0.67857143,1049.1935 c 7.98315367,0 7.98315367,0 7.98315367,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-0-4-1" d="m 10.499999,1049.1506 c 7.983154,0 7.983154,0 7.983154,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - <path inkscape:connector-curvature="0" id="path3903-6-6-3" d="m 2.1924695,1050.9068 c 20.8482145,0 20.8482145,0 20.8482145,0" stroke="#b3b3b3" fill-opacity="0" stroke-linecap="round"/> - </g> - <text x="11.917" y="1043.64" id="text4818-9" sodipodi:linespacing="0%" fill="#1a1a1a" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="9"><tspan sodipodi:role="line" id="tspan4820-2" x="11.917" y="1043.64">FOG</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/124-1.svg b/htdocs/public/symbols/svgicons/124-1.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/124-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/124-2.svg b/htdocs/public/symbols/svgicons/124-2.svg deleted file mode 100755 index ea1c71cfe9e24cf61e7b596ec0bc786f3b79b494..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/124-2.svg +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - viewBox="0 0 24 24" - height="24" - width="24" - version="1.1" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="124-2.svg"> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview6" - showgrid="false" - inkscape:zoom="7.8666667" - inkscape:cx="-16.90678" - inkscape:cy="15" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata3432"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <rect - rx="1.9170001" - y="1.2583904" - x="8.1230001" - height="21.483219" - width="7.7540002" - id="rect3436" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/125-1.svg b/htdocs/public/symbols/svgicons/125-1.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/125-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/125-2.svg b/htdocs/public/symbols/svgicons/125-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/125-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/126-1.svg b/htdocs/public/symbols/svgicons/126-1.svg deleted file mode 100755 index c0618969cc40587a530fca1f0e825e18f21df7bb..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/126-1.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="30" height="30" viewBox="0 0 30 30"> - <metadata id="metadata3516"/> - <text x="-4.337" y="29.2" id="text3528" sodipodi:linespacing="125%" transform="scale(0.84923707,1.1775275)" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="52.51"><tspan sodipodi:role="line" id="tspan3530" x="-4.337" y="29.2">~</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/126-2.svg b/htdocs/public/symbols/svgicons/126-2.svg deleted file mode 100755 index c0618969cc40587a530fca1f0e825e18f21df7bb..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/126-2.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="30" height="30" viewBox="0 0 30 30"> - <metadata id="metadata3516"/> - <text x="-4.337" y="29.2" id="text3528" sodipodi:linespacing="125%" transform="scale(0.84923707,1.1775275)" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="52.51"><tspan sodipodi:role="line" id="tspan3530" x="-4.337" y="29.2">~</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/32-1.svg b/htdocs/public/symbols/svgicons/32-1.svg deleted file mode 100755 index 712d15a0cbb40c8ff0e95e9b23319b3c04a3bada..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/32-1.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4183"/> - <text x="11.563" y="8.596" id="text4187" sodipodi:linespacing="125%" font-family="sans-serif" text-anchor="middle" text-align="center" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10"><tspan sodipodi:role="line" id="tspan4189" x="11.563" y="8.596">REV</tspan> - </text> - <text x="4.677" y="23.06" id="text4191" sodipodi:linespacing="125%" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="17.5"><tspan sodipodi:role="line" id="tspan4193" x="4.677" y="23.06">H</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/32-2.svg b/htdocs/public/symbols/svgicons/32-2.svg deleted file mode 100755 index 712d15a0cbb40c8ff0e95e9b23319b3c04a3bada..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/32-2.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4183"/> - <text x="11.563" y="8.596" id="text4187" sodipodi:linespacing="125%" font-family="sans-serif" text-anchor="middle" text-align="center" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="10"><tspan sodipodi:role="line" id="tspan4189" x="11.563" y="8.596">REV</tspan> - </text> - <text x="4.677" y="23.06" id="text4191" sodipodi:linespacing="125%" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="17.5"><tspan sodipodi:role="line" id="tspan4193" x="4.677" y="23.06">H</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/33-1.svg b/htdocs/public/symbols/svgicons/33-1.svg deleted file mode 100755 index 3460dc97efd84d897937a2882e3f2cbdeaeecd61..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/33-1.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4298"/> - <g inkscape:groupmode="layer" id="layer1" inkscape:label="Layer 1"> - <path sodipodi:type="star" id="path4304" sodipodi:sides="6" sodipodi:cx="11.986943" sodipodi:cy="13.815016" sodipodi:r1="13.818669" sodipodi:r2="7.8766413" sodipodi:arg1="0.52453753" sodipodi:arg2="1.0481363" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="m 23.94777,20.735582 -8.028911,-0.0955 -3.944888,6.993598 -3.9317502,-7.000992 -8.02907713,0.08043 4.09716173,-6.905491 -4.08418939,-6.9131722 8.02891189,0.0955 3.9448881,-6.99359774 3.93175,7.00099194 8.029077,-0.080426 -4.097162,6.9054915 z" transform="matrix(1.0010906,0,0,0.8695997,-1.6205237e-5,-0.01353359)" fill="#0000d0" stroke="#1a1a1a" stroke-linecap="round" stroke-width="0"/> - </g> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 2"> - <text x="13.13" y="14.347" id="text4323" sodipodi:linespacing="125%" transform="scale(0.9004394,1.1105689)" fill="#d8d81f" font-family="sans-serif" text-anchor="middle" text-align="center" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="9.717"><tspan sodipodi:role="line" id="tspan4325" x="13.13" y="14.347">PD</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/33-2.svg b/htdocs/public/symbols/svgicons/33-2.svg deleted file mode 100755 index 455d42494523b1ecf8a8abc2278744f698824534..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/33-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 24 24" width="24" height="24"> - <path inkscape:connector-curvature="0" d="M 11.926935,5.4192426 20.327446,19.51052 3.6845254,19.564516 11.926935,5.4192426 Z" id="white_bg" fill="#ffff00"/> - <path inkscape:connector-curvature="0" d="M 11.977044,2.0093618 C 11.566241,1.9828259 11.146799,2.1767499 10.883729,2.5250469 L 0.0572775,20.713555 c -0.07304604,0.274732 -0.07581064,0.44968 -0.01066964,0.70843 0.0623332,0.247518 0.3058344,0.502812 0.53862277,0.564584 l 22.54621637,0.0065 c 0.140822,-0.02549 0.335208,-0.09158 0.430673,-0.146869 0.347304,-0.201298 0.582295,-0.737372 0.336073,-1.144719 L 12.938262,2.5587406 C 12.778002,2.2935977 12.455321,2.1025808 12.15251,2.034848 12.095058,2.0218889 12.035878,2.0129903 11.97713,2.009189 Z m -0.05011,3.4098808 8.400511,14.0912774 -16.6429206,0.054 8.2424096,-14.1452734 z" id="foo"/> - <path inkscape:connector-curvature="0" id="path8" d="m 11.627581,18.593621 c -0.380134,-0.181859 -0.669553,-0.619876 -0.669553,-1.012968 0,-0.731325 0.764154,-1.282518 1.487271,-1.072149 0.487693,0.141686 0.819014,0.581863 0.815126,1.082516 -0.0035,0.42549 -0.187474,0.738668 -0.563288,0.958972 -0.28726,0.168468 -0.768474,0.187907 -1.069556,0.04363 z m 0.08639,-2.88858 C 11.666458,15.679123 11.554578,15.587977 11.46516,15.502879 11.15371,15.206116 11.15371,15.208708 10.950684,12.029413 10.770121,9.2034682 10.768393,9.1594073 10.846148,8.9563817 11.020231,8.4997899 11.409004,8.299788 12.056094,8.3334816 c 0.411235,0.021598 0.728301,0.1663083 0.933918,0.4263539 0.176244,0.2220324 0.214257,0.3477355 0.214257,0.7023824 -4.32e-4,0.3853168 -0.246654,5.1132231 -0.281644,5.4030741 -0.04579,0.37927 -0.266957,0.687264 -0.591798,0.822902 -0.185315,0.07732 -0.491581,0.08596 -0.616853,0.01685 z"/> - <metadata id="metadata10"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/34-1.svg b/htdocs/public/symbols/svgicons/34-1.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/34-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/34-2.svg b/htdocs/public/symbols/svgicons/34-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/34-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/35-1.svg b/htdocs/public/symbols/svgicons/35-1.svg deleted file mode 100644 index 5cd64ee5fde37939041f15d6104a28bfc8c42797..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/35-1.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> - <path d="m23.993 17.993-8.046-.076L12 23.987l-3.948-6.07-8.046.076L4.106 12l-4.1-5.994 8.046.077L12 .013l3.947 6.07 8.046-.077-4.1 5.994Z" fill="green"/> - <path d="M6.803 12a5.197 5.197 0 0 1 5.196-5.197 5.197 5.197 0 0 1 5.198 5.195 5.197 5.197 0 0 1-5.193 5.199 5.197 5.197 0 0 1-5.201-5.192" fill="#f9f9f9"/> - <text x="12" y="14.5" word-spacing="0" font-weight="bold" letter-spacing="0" font-size="7.5" style="font-weight:700;font-size:7.5px;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#000" transform="translate(.052 .234)"><tspan x="12" y="14.5">D</tspan></text> -</svg> diff --git a/htdocs/public/symbols/svgicons/35-1.svg.orig b/htdocs/public/symbols/svgicons/35-1.svg.orig deleted file mode 100755 index 7c21b5de9a5319ae41ce4fc8091d2b6fb7d3adf3..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/35-1.svg.orig +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/"> - <defs - id="defs13" /> - <metadata - id="metadata4228"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1"> - <path - id="path4232" - d="M 23.196655,18.425219 15.684703,18.34292 12,24.88961 8.3152966,18.34292 0.80334509,18.425219 4.6305938,11.960827 0.80334515,5.4964351 8.3152972,5.5787337 12,-0.96795654 15.684703,5.5787341 23.196655,5.4964352 19.369406,11.960827 Z" - transform="matrix(1.071125,0,0,0.92715745,-0.8535,0.91043026)" - fill="#008000" - stroke-linejoin="round" - stroke-width="1.124" /> - </g> - <g - id="layer2"> - <path - id="path4253" - d="m 6.8030467,12 a 5.1969533,5.1969533 0 0 1 5.1957063,-5.1969531 5.1969533,5.1969533 0 0 1 5.1982,5.1944591 5.1969533,5.1969533 0 0 1 -5.193211,5.199446 5.1969533,5.1969533 0 0 1 -5.2006929,-5.191963" - fill="#f9f9f9" - stroke-linejoin="round" - stroke-width="1.124" /> - </g> - <g - id="text" - transform="translate(0.05168457,0.23376465)"> - <text - x="12" - y="14.5" - id="text3339" - text-align="center" - word-spacing="0" - line-height="0%" - font-weight="bold" - letter-spacing="0" - font-size="7.5px" - style="font-weight:bold;font-size:7.5px;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#000000"><tspan - id="tspan2930" - x="12" - y="14.5">D</tspan></text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/35-2.svg b/htdocs/public/symbols/svgicons/35-2.svg deleted file mode 100644 index 97cae2ab92e0a33fc76ee018c8d2e6aeffb2da79..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/35-2.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> - <path d="m24.001 18.003-8.046-.076-3.947 6.07-3.948-6.07-8.046.076 4.1-5.993-4.1-5.994 8.046.077 3.948-6.07 3.947 6.07L24 6.016l-4.1 5.994Z" fill="green"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/35-2.svg.orig b/htdocs/public/symbols/svgicons/35-2.svg.orig deleted file mode 100755 index 82d97941a5fcc9c0e81c73827db2323a9be09a13..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/35-2.svg.orig +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4228"/> - <g inkscape:groupmode="layer" id="layer1" inkscape:label="Layer 1"> - <path sodipodi:type="star" id="path4232" sodipodi:sides="6" sodipodi:cx="12" sodipodi:cy="11.960827" sodipodi:r1="12.928783" sodipodi:r2="7.3694062" sodipodi:arg1="0.52359878" sodipodi:arg2="1.0471976" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 23.196655,18.425219 15.684703,18.34292 12,24.88961 8.3152966,18.34292 0.80334509,18.425219 4.6305938,11.960827 0.80334515,5.4964351 8.3152972,5.5787337 12,-0.96795654 15.684703,5.5787341 23.196655,5.4964352 19.369406,11.960827 Z" transform="matrix(1.071125,0,0,0.92715745,-0.84619502,0.91977284)" fill="#008000" stroke-linejoin="round" stroke-width="1.124"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/36-1.svg b/htdocs/public/symbols/svgicons/36-1.svg deleted file mode 100755 index ad3fee23cb372c0c9983c72f15b8f4d8ad66c439..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/36-1.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4363"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Layer 1"> - <rect id="rect4368" width="24" height="24" y="0.013" rx="3" fill="#0000cc" stroke-linejoin="round" stroke-width="1.124"/> - </g> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Lager 3"> - <path d="m 2.5688082,17.036813 c 0.01627,0.36089 0.04177,0.71077 0.07367,1.07539 0.152993,0.75716 0.4477841,1.50192 0.8625371,2.15964 0.693847,0.87314 1.596347,1.56473 2.626656,2.0257 0.662705,0.28393 1.398155,0.29103 2.052647,0.0143 6.6681927,-2.75725 11.5729997,-8.5802 13.1773497,-15.6146809 0.17485,-0.80116 0.0185,-1.65498 -0.45328,-2.32302 -0.35456,-0.49458 -0.736833,-0.95613 -1.173679,-1.34146 -1.032497,-0.89456 -2.302869,-1.4161599 -3.640831,-1.5440499 -0.16011,-0.0217 -0.337085,0.055 -0.447991,0.18718 -0.05547,0.0661 -0.09261,0.1663 -0.100274,0.2537199 l -0.847367,5.30468 c -0.04786,0.26954 0.133502,0.53433 0.408548,0.58682 l 1.656695,0.32963 c 0.09842,0.0169 0.173763,0.0613 0.23985,0.1168 0.225798,0.18946 0.244029,0.51446 0.05456,0.74026 l 0,0 -7.1027073,8.4646709 c -0.189462,0.22579 -0.5126894,0.26428 -0.7384874,0.0748 -0.0771,-0.0647 -0.131063,-0.15697 -0.164818,-0.25096 l -0.273771,-0.97113 c -0.08292,-0.2479 -0.315305,-0.39596 -0.558393,-0.37469 l -5.181511,0.56049 c -0.130783,0.0216 -0.2478891,0.0829 -0.3356941,0.18756 -0.07855,0.0936 -0.118561,0.2196 -0.133697,0.33829 z" id="path4" inkscape:connector-curvature="0" fill="none" stroke="#ffffff" stroke-width="1.2"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/36-2.svg b/htdocs/public/symbols/svgicons/36-2.svg deleted file mode 100755 index 2808185903905fb8668b24b7beba8b4fb7c6eadb..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/36-2.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4457"/> - <g inkscape:groupmode="layer" id="layer7" inkscape:label="Layer 2"> - <rect id="rect4137" width="24" height="24" rx="3" fill="#008000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.3"/> - <g transform="matrix(0.00379319,0,0,-0.00362069,0.62155767,22.86207)" id="g4" fill="#ffffff"> - <path inkscape:connector-curvature="0" d="m 2568,5643 -3,-258 -27,-3 c -16,-2 -28,-7 -28,-11 0,-4 -45,-16 -100,-26 -55,-10 -100,-22 -100,-27 0,-4 -7,-8 -17,-8 -20,0 -126,-32 -133,-40 -3,-4 -32,-15 -65,-25 -33,-10 -62,-21 -65,-24 -3,-4 -25,-15 -50,-26 -25,-11 -51,-25 -58,-32 -7,-7 -19,-13 -26,-13 -7,0 -21,-8 -32,-18 -10,-10 -34,-27 -53,-38 -19,-10 -53,-38 -76,-61 -23,-24 -46,-43 -51,-43 -5,0 -31,-26 -59,-56 -27,-31 -64,-71 -82,-89 -17,-19 -34,-43 -38,-55 -4,-11 -17,-32 -31,-47 -13,-14 -24,-34 -24,-44 0,-11 -4,-19 -8,-19 -5,0 -17,-25 -27,-55 -11,-30 -22,-55 -25,-55 -4,0 -15,-26 -26,-57 -10,-32 -22,-61 -27,-64 -9,-7 -37,-134 -37,-171 0,-16 -4,-28 -9,-28 -15,0 -27,-260 -17,-407 5,-79 13,-143 17,-143 4,0 16,-36 25,-80 10,-44 21,-80 25,-80 4,0 10,-12 13,-27 10,-40 30,-83 38,-83 4,0 14,-16 22,-35 8,-19 19,-35 23,-35 5,0 17,-17 28,-37 11,-21 28,-44 37,-51 10,-7 18,-19 18,-27 0,-8 9,-19 20,-25 11,-6 20,-16 20,-22 0,-14 72,-88 85,-88 6,0 16,-9 23,-20 7,-11 19,-20 27,-20 8,0 19,-9 25,-20 6,-11 17,-20 25,-20 8,0 20,-8 27,-17 15,-20 44,-41 71,-49 9,-4 17,-10 17,-15 0,-4 16,-16 35,-25 19,-9 35,-20 35,-24 0,-5 20,-16 45,-26 25,-9 45,-20 45,-23 0,-4 20,-15 45,-26 25,-11 45,-23 45,-26 0,-4 23,-15 50,-25 28,-10 50,-21 50,-25 0,-4 23,-15 50,-25 28,-10 50,-21 50,-25 0,-3 21,-14 47,-24 27,-10 53,-24 59,-30 7,-6 37,-17 68,-24 31,-7 56,-17 56,-22 0,-5 7,-9 15,-9 13,0 15,-103 15,-865 l 0,-866 -62,7 c -35,4 -65,10 -68,14 -3,4 -30,10 -60,14 -74,9 -150,28 -150,38 0,4 -13,8 -28,8 -29,0 -123,28 -132,40 -3,3 -25,12 -49,20 -24,8 -49,19 -55,25 -6,6 -32,20 -59,30 -26,10 -47,22 -47,26 0,5 -6,9 -12,9 -15,0 -98,82 -98,96 0,5 -9,15 -20,22 -11,7 -20,19 -20,27 0,8 -6,15 -14,15 -13,0 -34,38 -24,44 1,1 30,7 62,14 34,7 67,20 78,32 10,11 24,20 31,20 16,0 117,107 117,124 0,7 8,21 18,32 29,30 42,103 42,226 0,111 -12,188 -30,188 -5,0 -14,17 -21,37 -13,40 -96,129 -141,152 -16,8 -28,18 -28,23 0,4 -6,8 -14,8 -7,0 -27,7 -42,15 -16,8 -48,15 -71,15 -24,0 -43,5 -43,10 0,6 -25,10 -55,10 -30,0 -55,-4 -55,-8 0,-4 -34,-16 -74,-25 -86,-20 -119,-44 -211,-151 -16,-19 -37,-43 -46,-53 -9,-10 -23,-36 -30,-58 -8,-22 -16,-42 -19,-45 -19,-18 -30,-72 -30,-142 0,-77 18,-207 29,-218 4,-3 15,-31 25,-62 11,-32 22,-58 26,-58 4,0 15,-16 26,-35 10,-19 22,-35 26,-35 4,0 14,-16 22,-35 8,-19 19,-35 25,-35 5,0 12,-8 15,-18 9,-27 119,-152 135,-152 4,0 19,-13 33,-29 15,-16 42,-34 62,-41 20,-6 36,-15 36,-20 0,-5 17,-17 38,-27 20,-9 43,-25 50,-35 7,-10 22,-18 32,-18 10,0 25,-6 33,-14 8,-8 39,-23 68,-32 30,-10 56,-21 59,-25 3,-4 32,-15 65,-24 33,-10 62,-21 65,-24 3,-4 34,-16 70,-26 36,-10 67,-22 70,-26 6,-8 148,-39 179,-39 11,0 21,-4 23,-10 2,-5 57,-16 123,-22 l 120,-13 3,-273 2,-272 270,0 0,520 320,0 0,-520 270,0 0,546 132,12 c 72,6 134,15 137,20 3,4 53,15 111,25 57,9 106,21 110,25 3,4 39,16 80,26 41,11 77,22 80,25 3,4 31,15 63,24 31,10 57,22 57,26 0,4 18,14 40,21 23,8 44,18 48,24 4,6 23,20 42,30 19,11 44,28 54,38 11,10 26,18 33,18 7,0 17,9 23,20 6,11 16,20 23,20 17,0 173,162 181,188 4,12 11,22 16,22 5,0 17,16 26,35 9,19 20,35 24,35 5,0 16,20 26,45 9,25 20,45 24,45 8,0 40,94 40,116 0,8 4,14 9,14 5,0 17,35 26,78 10,42 21,80 27,83 38,24 36,799 -3,799 -4,0 -13,25 -20,56 -7,31 -18,61 -24,68 -6,6 -20,32 -30,59 -10,26 -21,47 -24,47 -4,0 -15,17 -26,38 -11,20 -28,43 -37,50 -10,7 -18,18 -18,23 0,6 -36,46 -79,90 -44,43 -84,79 -90,79 -5,0 -16,8 -23,18 -7,9 -29,26 -48,36 -19,11 -44,28 -54,38 -11,10 -25,18 -32,18 -7,0 -17,6 -21,13 -4,7 -25,21 -45,32 -21,11 -38,23 -38,26 0,4 -22,15 -50,25 -27,10 -50,21 -50,25 0,4 -22,15 -50,25 -27,10 -50,21 -50,25 0,4 -22,15 -50,25 -27,10 -50,21 -50,25 0,3 -27,14 -60,23 -33,9 -60,21 -60,25 0,4 -28,16 -62,27 -35,10 -68,23 -74,29 -7,6 -37,17 -68,25 -31,7 -56,16 -56,20 0,3 -22,14 -50,24 -27,10 -50,22 -50,27 0,5 -9,9 -20,9 -20,0 -20,7 -20,810 l 0,810 50,0 c 28,0 50,-4 50,-10 0,-5 17,-10 37,-10 43,0 196,-31 203,-41 3,-3 31,-14 63,-23 31,-9 57,-21 57,-26 0,-6 8,-10 19,-10 10,0 24,-7 31,-15 7,-8 16,-15 21,-15 4,0 19,-10 33,-22 13,-13 31,-29 40,-36 9,-7 16,-28 16,-47 0,-31 -3,-35 -35,-41 -19,-3 -35,-10 -35,-15 0,-5 -7,-9 -15,-9 -9,0 -29,-7 -46,-15 -42,-22 -139,-117 -139,-136 0,-9 -9,-26 -20,-39 -18,-21 -40,-79 -40,-107 0,-7 -4,-13 -10,-13 -6,0 -10,-42 -10,-105 0,-58 3,-105 8,-105 4,0 16,-27 26,-60 11,-33 23,-60 27,-60 4,0 10,-8 14,-19 9,-28 88,-106 124,-122 17,-8 31,-17 31,-21 0,-8 59,-38 76,-38 7,0 14,-6 16,-12 6,-17 266,-18 276,-1 4,6 21,13 37,17 17,4 44,18 59,31 16,14 32,25 36,25 11,0 70,62 70,73 0,5 11,18 25,29 14,11 25,25 25,33 0,7 6,15 14,18 8,3 20,32 26,64 22,105 -2,473 -31,473 -4,0 -15,20 -25,45 -9,25 -20,45 -23,45 -4,0 -13,17 -20,37 -9,25 -53,76 -130,151 -134,131 -136,133 -176,152 -16,8 -32,18 -35,21 -3,3 -22,14 -42,24 -21,9 -38,21 -38,25 0,3 -26,15 -57,26 -32,10 -60,22 -63,25 -3,4 -33,15 -67,24 -35,10 -63,21 -63,25 0,9 -88,28 -167,36 -35,4 -63,10 -63,15 0,4 -36,11 -80,15 l -80,7 0,507 -270,0 0,-490 -102,0 c -57,0 -120,-3 -140,-6 l -38,-7 0,503 -310,0 -2,-257 z m 592,-1243 c 0,-461 -4,-760 -9,-760 -5,0 -16,7 -25,15 -8,8 -19,15 -25,15 -16,0 -105,32 -111,39 -3,4 -27,15 -55,26 -27,10 -56,24 -62,31 -10,10 -13,162 -13,693 l 0,680 33,6 c 29,5 60,6 220,13 l 47,2 0,-760 z m -590,95 c 0,-571 -1,-604 -17,-598 -10,4 -24,13 -31,20 -7,7 -20,13 -27,13 -8,0 -20,8 -27,18 -13,17 -39,36 -68,49 -8,4 -21,15 -28,25 -7,10 -18,18 -23,18 -18,0 -165,157 -179,191 -7,19 -18,39 -25,44 -19,16 -32,47 -40,95 -4,25 -12,48 -18,52 -13,8 -11,162 3,166 5,2 10,17 10,33 0,33 30,151 41,159 3,3 9,14 13,25 3,11 19,36 36,55 17,19 33,43 36,53 3,9 9,17 14,17 5,0 16,13 24,29 8,15 30,34 48,42 18,7 42,21 52,31 11,10 25,18 32,18 7,0 19,6 27,14 14,14 81,33 125,35 l 22,1 0,-605 z m 365,-2038 c 11,-14 147,-47 195,-47 l 30,0 0,-1590 -73,0 c -41,0 -108,-3 -150,-6 l -77,-7 0,1682 33,-10 c 17,-5 37,-15 42,-22 z m 542,-199 c 15,-7 37,-21 47,-30 11,-10 26,-18 33,-18 7,0 17,-9 23,-20 6,-11 17,-20 25,-20 8,0 20,-8 27,-18 7,-10 20,-21 28,-25 53,-24 166,-139 180,-183 7,-19 15,-34 19,-34 4,0 14,-19 21,-41 8,-23 20,-48 27,-55 22,-21 33,-108 33,-251 0,-129 -15,-273 -29,-283 -4,-3 -15,-27 -26,-55 -10,-27 -29,-58 -42,-68 -13,-10 -23,-25 -23,-33 0,-8 -4,-14 -8,-14 -5,0 -14,-11 -20,-25 -7,-14 -20,-28 -29,-32 -10,-4 -34,-23 -54,-43 -19,-20 -49,-42 -67,-49 -17,-7 -41,-21 -52,-31 -11,-10 -41,-24 -65,-31 -25,-7 -45,-16 -45,-20 0,-4 -11,-9 -25,-11 l -25,-5 0,703 c 0,440 4,704 10,704 5,0 22,-6 37,-12 z" id="path6"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/37-1.svg b/htdocs/public/symbols/svgicons/37-1.svg deleted file mode 100755 index a982ac0f0436cd1a2ad78a533c1f328c764c61ac..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/37-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4641"/> - <rect id="rect3334" width="23.04" height="23.04" x="0.48" y="0.48" rx="2.88" fill="#ffffff" fill-rule="evenodd" stroke="#333333" stroke-width="0.96"/> - <text x="1.805" y="15.846" id="text4645" sodipodi:linespacing="125%" transform="scale(0.77898225,1.2837263)" font-family="sans-serif" fill="#000080" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="-1.951" font-size="17.827"><tspan sodipodi:role="line" id="tspan4647" x="1.805" y="15.846">DX</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/37-2.svg b/htdocs/public/symbols/svgicons/37-2.svg deleted file mode 100755 index d6aad82703011e2a2884a59fbab14795ba7188fa..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/37-2.svg +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg4231" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="37-2.svg"> - <defs - id="defs4233" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="7.9195959" - inkscape:cx="-10.192552" - inkscape:cy="13.794823" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:window-width="1875" - inkscape:window-height="1056" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" /> - <metadata - id="metadata4236"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1028.3622)"> - <g - id="g4251" - transform="translate(-210.85714,662.28571)" - style="fill:#1a1a1a"> - <path - sodipodi:nodetypes="csccc" - id="path5796" - style="fill:#1a1a1a" - d="m 212.15962,373.77571 c 0.1561,14.84097 4.97586,14.40251 10.69011,14.40251 5.71386,0 10.69168,-0.1021 10.70494,-14.40251 l -21.39456,0 z" - inkscape:connector-curvature="0" /> - <path - id="rect5801" - style="fill:#1a1a1a" - d="m 216.96298,366.07659 c 0.66663,0 1.20317,0.53605 1.20317,1.20317 l 0,6.73766 c 0,0.66663 -0.53703,1.20317 -1.20317,1.20317 -0.66663,0 -1.20317,-0.53703 -1.20317,-1.20317 l 0,-6.73766 c 0,-0.66663 0.53703,-1.20317 1.20317,-1.20317 z" - inkscape:connector-curvature="0" /> - <path - id="rect5803" - style="fill:#1a1a1a" - d="m 228.39639,366.07659 c 0.66663,0 1.20318,0.53703 1.20318,1.20317 l 0,6.73766 c 0,0.66663 -0.53704,1.20317 -1.20318,1.20317 -0.66662,0 -1.20317,-0.53703 -1.20317,-1.20317 l 0,-6.73766 c 0,-0.66663 0.53605,-1.20317 1.20317,-1.20317 z" - inkscape:connector-curvature="0" /> - <path - id="rect5805" - style="fill:#1a1a1a" - d="m 217.97362,380.63177 9.76704,0 c 0.92484,0 1.66972,0.53703 1.66972,1.20317 l 0,7.03828 c 0,0.66663 -0.74517,1.20317 -1.66972,1.20317 l -9.76704,0 c -0.92483,0 -1.66971,-0.53703 -1.66971,-1.20317 l 0,-7.03828 c 0,-0.66663 0.74419,-1.20317 1.66971,-1.20317 z" - inkscape:connector-curvature="0" /> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/38-1.svg b/htdocs/public/symbols/svgicons/38-1.svg deleted file mode 100755 index 8a64e97754b8982a6d59e9e346a60d144bdf2b17..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/38-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"><metadata id="metadata4733"/><g><g><g><g> - - <g inkscape:groupmode="layer" id="layer9" inkscape:label="Layer 1"> - <path sodipodi:type="star" id="path4741" sodipodi:sides="4" sodipodi:cx="12" sodipodi:cy="12" sodipodi:r1="11.990243" sodipodi:r2="8.4783821" sodipodi:arg1="0" sodipodi:arg2="0.78539816" inkscape:flatsided="true" inkscape:rounded="-3.469447e-18" inkscape:randomized="0" d="M 23.990243,12 12,23.990243 0.00975704,12 12,0.00975704 Z" transform="matrix(0.88484358,0,0,0.8847113,1.381877,1.3834644)" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="3.145"/> - </g> -<text id="textoverlay"><tspan id="tspanoverlay" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" font-weight="bold" x="12" y="12" fill="#ffff00" font-size="14" dy="4.7" dx="-0.2">G</tspan></text></g></g></g></g></svg> diff --git a/htdocs/public/symbols/svgicons/38-2.svg b/htdocs/public/symbols/svgicons/38-2.svg deleted file mode 100755 index c70d6b927ac500850ffb7bee78cd1f36d11327d8..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/38-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4733"/> - <g inkscape:groupmode="layer" id="layer9" inkscape:label="Layer 1"> - <path sodipodi:type="star" id="path4741" sodipodi:sides="4" sodipodi:cx="12" sodipodi:cy="12" sodipodi:r1="11.990243" sodipodi:r2="8.4783821" sodipodi:arg1="0" sodipodi:arg2="0.78539816" inkscape:flatsided="true" inkscape:rounded="-3.469447e-18" inkscape:randomized="0" d="M 23.990243,12 12,23.990243 0.00975704,12 12,0.00975704 Z" transform="matrix(0.88484358,0,0,0.8847113,1.381877,1.3834644)" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="3.145"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/39-1.svg b/htdocs/public/symbols/svgicons/39-1.svg deleted file mode 100755 index a1b225046ea6bfee1bbe8edeaf365bf8ddeecae5..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/39-1.svg +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="39-1.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="2.4583333" - inkscape:cx="-172.29272" - inkscape:cy="47.937368" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <path - inkscape:connector-curvature="0" - style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 2.4083407e-4,8.1162722 C -0.01838917,9.6764723 1.0466148,10.484411 2.4035078,10.73719 c 2.700071,0.37144 6.117916,0.07016 8.7605222,0.343954 0.12819,3.287784 0.20839,5.023295 0.348354,7.747571 -3.3678522,0.01565 -4.0829152,0.246165 -4.1373382,1.257336 -0.05361,0.996037 0.782894,1.165189 1.611365,1.193297 0.828467,0.02811 1.7426692,0.01809 2.6429532,0.03655 -4e-6,-4e-6 0.0043,0.494225 0.162466,0.591807 0.146984,0.09071 0.460239,0.106085 0.625114,0.03034 0.152246,-0.06993 0.205754,-0.637342 0.205758,-0.637338 0,0 1.697258,-0.0067 2.534782,0.01743 0.914595,0.02794 1.780169,-0.03316 1.803993,-1.237044 0.0238,-1.203501 -1.867308,-1.241138 -4.185258,-1.252397 0.227213,-3.628941 0.26379,-3.830654 0.453975,-7.747572 2.631603,-0.255168 5.568176,0.02749 7.851383,-0.343954 1.826305,-0.297106 2.968643,-1.0612513 2.916725,-2.6156021 -0.05192,-1.5543509 -0.935194,-2.1069768 -2.930505,-2.1096095 -3.52709,-0.00455 -7.503174,-0.3191949 -7.503174,-0.3191949 -0.03419,-1.5374531 0.351454,-3.6732247 -1.17103,-3.6792188 -1.522493,-0.006 -1.245886,2.1306675 -1.295288,3.6826712 0,0 -6.0155202,0.3410105 -8.7344712,0.3257934 -1.272077,-0.00741 -2.34478297,0.5187641 -2.36359296593,2.0942433 z" - id="path3241" - sodipodi:nodetypes="cccczzczzcczccszsczcszc" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/39-2.svg b/htdocs/public/symbols/svgicons/39-2.svg deleted file mode 100755 index ce75666bda850b5e770c4c014c61cf8b4715d53c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/39-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 24 24" width="24" height="24"> - <path inkscape:connector-curvature="0" d="M 11.926935,5.4192426 20.327446,19.51052 3.6845254,19.564516 11.926935,5.4192426 Z" id="white_bg" fill="#ffff00"/> - <path inkscape:connector-curvature="0" d="M 11.977044,2.0093618 C 11.566241,1.9828259 11.146799,2.1767499 10.883729,2.5250469 L 0.0572775,20.713555 c -0.07304604,0.274732 -0.07581064,0.44968 -0.01066964,0.70843 0.0623332,0.247518 0.3058344,0.502812 0.53862277,0.564584 l 22.54621637,0.0065 c 0.140822,-0.02549 0.335208,-0.09158 0.430673,-0.146869 0.347304,-0.201298 0.582295,-0.737372 0.336073,-1.144719 L 12.938262,2.5587406 C 12.778002,2.2935977 12.455321,2.1025808 12.15251,2.034848 12.095058,2.0218889 12.035878,2.0129903 11.97713,2.009189 Z m -0.05011,3.4098808 8.400511,14.0912774 -16.6429206,0.054 8.2424096,-14.1452734 z" id="foo"/> - <metadata id="metadata10"/> - <path d="m 15.351913,18.201835 -2.342899,-1.117795 -0.337372,2.000901 -1.7871,-1.825512 -2.3108271,1.262611 1.2808018,-2.461453 -1.6007975,-0.455922 1.4995009,-1.060977 -1.4848918,-1.584709 2.3132657,0.584318 0.781932,-1.719343 1.194351,1.469863 2.755388,-1.144062 -1.265982,2.046527 2.119454,0.781933 -2.062616,0.838701 1.247792,2.384919 z" id="path2816" sodipodi:nodetypes="ccccccccccccccccc" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-width="0.104" stroke-miterlimit="8.8"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/40-1.svg b/htdocs/public/symbols/svgicons/40-1.svg deleted file mode 100755 index 2e2fafd4734f023b231e393dacec1c46995adf80..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/40-1.svg +++ /dev/null @@ -1,145 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - id="svg4853" - inkscape:version="0.91 r13725" - sodipodi:docname="40-1.svg"> - <defs - id="defs4874" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview4872" - showgrid="false" - inkscape:zoom="13.906433" - inkscape:cx="30.299655" - inkscape:cy="28.647355" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="layer2" /> - <metadata - id="metadata3051"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:groupmode="layer" - id="layer1" - inkscape:label="Lager"> - <rect - id="rect4211" - width="4.8" - height="4.8" - x="18.02" - y="1.092" - opacity="0.4" - stroke-linejoin="round" - stroke-linecap="round" - stroke-width="0.4" /> - <rect - id="rect4215" - width="2.981" - height="2.981" - x="18.932" - y="2" - opacity="0.5" - stroke-linejoin="round" - stroke-linecap="round" - stroke-width="0.4" /> - <path - d="m 17.655966,3.4924092 c 5.532952,0 5.532952,0 5.532952,0" - id="path4199" - inkscape:connector-curvature="0" - fill-rule="evenodd" - stroke="#000000" - stroke-linecap="round" - stroke-width="0.994" /> - <path - d="m 20.422442,0.88666139 c 0,5.21149571 0,5.21149571 0,5.21149571" - id="path4197" - inkscape:connector-curvature="0" - fill-rule="evenodd" - stroke="#000000" - stroke-linecap="round" - stroke-width="0.932" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Lager#2" /> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="Lager#1"> - <path - style="fill:#1a1a1a;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.37599999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 12.012265,5.6055669 10.869091,1.2079924" - id="path4894" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <g - id="g5513" - transform="translate(-7.1997469,-0.06307911)"> - <path - inkscape:connector-curvature="0" - id="path4754" - d="M 12.120566,6.1199094 19.924108,5.9425562 24.889998,10.509402 10.790417,9.6226353 Z" - style="fill:#e6e6e6;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - <path - sodipodi:nodetypes="ccccscccccccccccccccccccsssccssscccccccccccccccccc" - style="fill:#aa0000;stroke:none;stroke-width:0.29631296;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" - id="path6-9" - d="m 30.925122,14.715807 c 0.150421,-0.941042 -0.0056,-1.022202 -0.62861,-2.409677 C 30.127356,11.929418 29.680225,11.700118 29.318658,11.502877 27.428887,10.472062 25.430189,9.8329837 25.123551,9.8265709 24.162926,8.8699239 22.590339,7.0707393 20.479805,5.6315388 20.086098,5.3630672 18.697693,5.3214637 18.697693,5.3214637 c 0,0 -3.645845,-0.4365462 -6.362043,0.2095624 -0.234324,0.055703 -0.397184,0.036273 -0.593689,0.1396825 -0.03202,0.016842 -0.596586,0.6001015 -0.62861,0.6635303 -0.03129,0.061961 -0.216168,0.2637975 -0.279364,0.3492447 C 10.414823,7.2500554 9.9010187,7.8094032 9.5418084,8.429631 9.384085,8.7020427 9.3109994,8.9612817 9.1576426,9.2328822 9.0100403,9.4943226 8.4730195,9.6954636 8.3893496,10.175778 c -0.04018,0.23046 -0.3022728,0.144318 -0.3143248,0.488927 0.1197104,0.03696 0.1341586,0.0807 0.2793638,0.104764 -0.2099861,0.76358 -0.3388526,2.126644 -0.3499781,2.270266 2.716e-4,-7.8e-5 5.027e-4,-1.93e-4 7.733e-4,-2.71e-4 -0.00178,0.01742 -0.00197,0.01645 -7.733e-4,2.71e-4 -0.6570394,0.206279 -0.5960454,1.386859 -0.6574256,1.172931 0.078997,0.314208 0.296632,0.723481 0.3787956,1.061873 0.070374,0.28991 -0.1633238,0.413561 -0.1746419,0.698451 0.050995,0.02978 0.1001182,0.342638 0.1396829,0.384126 0.1661051,0.457213 1.4659312,0.871007 1.4659312,0.871007 l 0.1287895,1.55e-4 c -0.1106719,-0.328232 -0.170702,-0.679833 -0.170702,-1.045418 0,-1.806061 1.4640788,-3.270137 3.2701388,-3.270137 1.806059,0 3.270139,1.464076 3.270139,3.270137 0,0.368444 -0.061,0.722671 -0.173329,1.053144 l 6.640748,0.02127 c -0.155443,-0.380998 -0.241353,-0.797728 -0.241353,-1.234662 0,-1.80602 1.464077,-3.270099 3.270099,-3.270099 1.806061,0 3.270139,1.464079 3.270139,3.270099 0,0.439794 -0.08704,0.859149 -0.244445,1.242156 l 0.26855,3.47e-4 c 0,0 2.007472,0.186616 2.270032,-0.454006 0.107774,-0.120252 0.147717,-0.728581 0.139682,-1.082578 0.0039,-0.364155 0.07741,-0.29389 0.174642,-0.523887 0.09445,-0.223353 -0.139567,-0.386754 -0.104761,-0.488837 z M 16.151586,9.4894943 c -0.06405,0.044889 -0.0598,0.068728 -0.139721,0.1047968 -0.254372,0.1927587 -0.336931,-0.069877 -3.711136,-0.069877 0.0574,0.081895 -0.394981,0.01124 -0.03493,-0.7683307 0.489429,-1.0596329 1.235858,-2.0237737 1.194756,-2.0386846 0.947192,-0.2821227 1.247996,-0.3717956 2.69106,-0.3348663 -0.02928,0.8381727 -0.01734,1.7798619 -3.3e-5,3.1069623 z m 1.48938,0.232315 C 17.4963,6.9730081 17.366547,6.8829639 17.675896,6.439078 c 2.779918,0 1.837221,0.00942 1.837221,0.00942 1.271994,0.026081 3.482374,2.7540307 4.141432,3.657518 -1.85567,-0.1400534 -2.978847,-0.2327808 -6.013583,-0.3842067 z" /> - <path - sodipodi:open="true" - d="m 10.520695,16.172659 a 1.8473057,1.8473057 0 0 1 1.846863,-1.847306 1.8473057,1.8473057 0 0 1 1.847748,1.846419 1.8473057,1.8473057 0 0 1 -1.845975,1.848192 1.8473057,1.8473057 0 0 1 -1.848635,-1.845532" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - sodipodi:ry="1.8473057" - sodipodi:rx="1.8473057" - sodipodi:cy="16.172659" - sodipodi:cx="12.368001" - sodipodi:type="arc" - id="path3514-1-1" - style="fill:#666666;stroke:#000000;stroke-width:1.85782993;stroke-miterlimit:4;stroke-dasharray:none" /> - <path - sodipodi:open="true" - d="m 23.308721,16.051691 a 1.8473057,1.8473057 0 0 1 1.846863,-1.847306 1.8473057,1.8473057 0 0 1 1.847748,1.846419 1.8473057,1.8473057 0 0 1 -1.845975,1.848192 1.8473057,1.8473057 0 0 1 -1.848635,-1.845532" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - sodipodi:ry="1.8473057" - sodipodi:rx="1.8473057" - sodipodi:cy="16.051691" - sodipodi:cx="25.156027" - sodipodi:type="arc" - id="path3514-1-1-1" - style="fill:#666666;stroke:#000000;stroke-width:1.85782993;stroke-miterlimit:4;stroke-dasharray:none" /> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/40-2.svg b/htdocs/public/symbols/svgicons/40-2.svg deleted file mode 100755 index d91b55c6ddf61684b9c8f123ec83133c59b74a2b..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/40-2.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3007"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-427)"> - <g id="g2984" transform="matrix(0.04041772,0,0,0.04041772,0.02960512,426.78712)"> - <path inkscape:connector-curvature="0" id="path3123" d="m 587.001,191.775 c 0,-34.867 -24.173,-64.178 -56.635,-72.094 -0.487,-0.119 -0.977,-0.23 -1.468,-0.34 -1.321,0.132 -2.625,-0.138 -3.761,-0.734 -4.019,-0.676 -8.14,-1.047 -12.347,-1.047 -14.877,0 -29.225,4.381 -41.491,12.671 -3.054,2.063 -7.2,1.261 -9.263,-1.792 -0.774,-1.146 -1.145,-2.447 -1.144,-3.735 0.002,-2.139 1.03,-4.239 2.936,-5.526 14.481,-9.786 31.411,-14.959 48.962,-14.959 1.654,0 3.297,0.051 4.928,0.142 C 499.864,65.46 460.832,40.014 417.312,40.014 c -46.851,0 -87.649,29.456 -103.479,71.663 -2.983,7.955 -5.083,16.361 -6.166,25.111 -0.418,3.378 -3.293,5.852 -6.612,5.852 -0.207,0 -0.417,-0.019 -0.627,-0.039 -0.067,-0.006 -0.133,-0.004 -0.2,-0.012 -3.656,-0.452 -6.253,-3.783 -5.801,-7.439 1.036,-8.369 2.905,-16.456 5.507,-24.189 -42.585,1.412 -76.817,35.727 -78.098,78.348 8.087,0.308 15.9,2.767 22.695,7.162 1.975,1.276 3.044,3.421 3.043,5.609 -0.001,1.24 -0.342,2.495 -1.065,3.614 -2,3.095 -6.129,3.979 -9.224,1.978 -4.437,-2.869 -9.495,-4.561 -14.755,-4.959 -0.804,-0.062 -1.611,-0.097 -2.423,-0.097 -14.922,0 -27.461,10.372 -30.804,24.284 11.929,-3.955 24.376,-6.65 37.163,-7.951 5.847,-0.594 11.765,-0.901 17.736,-0.901 5.979,0 11.893,0.314 17.732,0.909 11.826,1.203 23.331,3.594 34.384,7.062 20.481,6.429 39.406,16.55 55.945,29.621 6.605,5.221 12.835,10.904 18.624,17.02 l 135.23,0 c 44.668,0 80.877,-36.205 80.885,-80.871 0,-0.006 -10e-4,-0.01 -10e-4,-0.014 z" fill="#b3b3b3" stroke="#808080" stroke-width="12.12"/> - <path inkscape:connector-curvature="0" id="path3125" d="m 521.806,465.719 c -1.138,0 -2.266,0.055 -3.387,0.139 -14.255,1.062 -27.023,8.777 -34.622,21.114 -2.721,4.414 -8.506,5.79 -12.921,3.07 -2.88,-1.773 -4.455,-4.852 -4.456,-8.002 0,-1.681 0.439,-3.382 1.385,-4.918 11.22,-18.215 30.377,-29.352 51.597,-30.136 -1.799,-60.006 -50.021,-108.336 -109.977,-110.315 3.667,10.895 6.302,22.287 7.761,34.077 0.637,5.147 -3.02,9.836 -8.166,10.473 -0.094,0.012 -0.187,0.009 -0.281,0.018 -0.296,0.027 -0.592,0.055 -0.884,0.055 -4.672,0 -8.72,-3.482 -9.308,-8.238 -1.525,-12.323 -4.483,-24.163 -8.688,-35.367 -9.626,-25.658 -25.811,-47.963 -46.402,-65.029 -2.799,-2.319 -5.68,-4.541 -8.637,-6.662 -25.652,-18.406 -57.028,-29.169 -90.619,-29.169 -2.87,0 -5.725,0.084 -8.565,0.239 -15.718,0.86 -30.94,4.069 -45.253,9.344 -38.31,14.117 -70.116,42.994 -87.554,81 2.307,-0.129 4.63,-0.201 6.969,-0.201 24.705,0 48.537,7.281 68.921,21.057 2.683,1.812 4.13,4.769 4.133,7.779 0.002,1.812 -0.52,3.645 -1.61,5.259 -2.904,4.298 -8.741,5.427 -13.038,2.522 -17.267,-11.669 -37.463,-17.836 -58.405,-17.836 -5.904,0 -11.693,0.5 -17.333,1.446 -1.631,0.87 -3.511,1.261 -5.415,1.056 -0.665,0.148 -1.328,0.304 -1.988,0.465 -45.703,11.139 -79.73,52.417 -79.73,101.501 0,0.011 -0.001,0.021 -0.001,0.031 0.017,62.868 50.986,113.828 113.86,113.828 l 286.408,0 106.817,0 c 29.816,0 53.992,-24.176 53.992,-53.997 0,-24.594 -20.009,-44.603 -44.603,-44.603 z" fill="#b3b3b3" stroke="#808080" stroke-width="12.12"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/41-1.svg b/htdocs/public/symbols/svgicons/41-1.svg deleted file mode 100755 index 01d72c336746178d1bb839f0a4e194bd4696a048..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/41-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.0"> - <metadata id="metadata7"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-427)"> - <path d="m 2.02217,427.02661 19.95566,0 c 1.10554,0 1.99556,0.89002 1.99556,1.99556 l 0,19.95566 c 0,1.10554 -0.89002,1.99556 -1.99556,1.99556 l -19.95566,0 c -1.10554,0 -1.99556,-0.89002 -1.99556,-1.99556 l 0,-19.95566 c 0,-1.10554 0.89002,-1.99556 1.99556,-1.99556 z" id="rect1872" inkscape:connector-curvature="0" fill="#ffffff" stroke="#000000" color="#000000" stroke-width="0.053"/> - <path d="m 2.02217,427.6918 19.95566,0 c 0.73703,0 1.33037,0.59334 1.33037,1.33037 l 0,19.95566 c 0,0.73703 -0.59334,1.33037 -1.33037,1.33037 l -19.95566,0 c -0.73703,0 -1.33037,-0.59334 -1.33037,-1.33037 l 0,-19.95566 c 0,-0.73703 0.59334,-1.33037 1.33037,-1.33037 z" id="rect2760" inkscape:connector-curvature="0" fill="#003f87" color="#000000" stroke-width="0.874"/> - <path d="m 9.3994964,448.96892 c -0.55432,-0.0491 -1.0531,-0.15264 -1.54365,-0.32051 -2.24285,-0.76753 -3.90777,-2.75864 -4.29589,-5.13754 -0.0227,-0.1391 -0.0497,-0.33168 -0.0601,-0.42796 -0.0254,-0.23544 -0.0253,-1.06434 1.6e-4,-1.2983 0.0844,-0.7763 0.28718,-1.49841 0.61462,-2.18815 0.62044,-1.30697 1.64696,-2.3749 2.90333,-3.02041 l 0.1815,-0.0933 0.008,0.0762 c 0.009,0.0799 0.13589,1.79645 0.13589,1.83443 0,0.012 -0.0528,0.0579 -0.11737,0.1019 -0.27345,0.18636 -0.60334,0.48288 -0.82746,0.74375 -0.6264,0.72911 -1.00129,1.55758 -1.14858,2.53826 -0.0272,0.18088 -0.0319,0.27279 -0.0327,0.63456 -9.1e-4,0.43481 0.0101,0.58496 0.065,0.88255 0.17981,0.97628 0.61247,1.81457 1.29901,2.51689 0.2386,0.24407 0.43905,0.41171 0.72347,0.60501 1.09616,0.74502 2.45454,0.97295 3.7336096,0.62648 0.31166,-0.0844 0.55719,-0.18331 0.92177,-0.37126 0.97597,-0.50315 1.78791,-1.40988 2.20111,-2.4581 0.12308,-0.31223 0.23107,-0.70745 0.27735,-1.01506 0.0138,-0.0916 0.0284,-0.16647 0.0324,-0.16638 0.004,9e-5 0.25818,0.52688 0.56475,1.17066 l 0.55741,1.1705 -0.0722,0.1379 c -0.74906,1.4311 -2.04845,2.56179 -3.56796,3.10474 -0.47439,0.16951 -0.88808,0.26665 -1.41561,0.33241 -0.21605,0.0269 -0.9226896,0.0398 -1.1381796,0.0207 z m 7.6796396,-2.17573 c -0.0148,-0.0349 -0.60256,-1.44683 -1.30615,-3.13772 l -1.27925,-3.07434 -3.18379,0 c -1.7510796,0 -3.1843596,-0.002 -3.1850696,-0.004 -7.1e-4,-0.002 -0.14103,-2.00908 -0.31182,-4.46017 l -0.31052,-4.45653 -0.05,-0.11157 c -0.10052,-0.22448 -0.15059,-0.43902 -0.1612,-0.69074 -0.0366,-0.86881 0.5664,-1.64103 1.41419,-1.81093 0.18205,-0.0365 0.46676,-0.0329 0.65837,0.008 0.51817,0.11126 0.9531896,0.45123 1.1925796,0.93199 0.134,0.26912 0.19062,0.50783 0.19095,0.80508 6.4e-4,0.56696 -0.25428,1.08325 -0.70774,1.43339 -0.2076796,0.16036 -0.5416896,0.30223 -0.7673996,0.32594 l -0.0909,0.01 0.006,0.0747 c 0.008,0.0899 0.19028,3.43538 0.19028,3.48791 l 0,0.0368 2.2265596,0 2.22656,0 0,0.8315 0,0.83149 -2.14328,0 -2.1432796,0 0.008,0.10576 c 0.005,0.0582 0.0228,0.31436 0.0405,0.56932 l 0.0323,0.46355 0.5910996,-0.008 c 1.33284,-0.0181 5.32569,-0.0381 5.33571,-0.0268 0.006,0.007 0.5766,1.35289 1.26814,2.99154 0.69154,1.63865 1.26241,2.97944 1.2686,2.97953 0.006,8e-5 0.43764,-0.15757 0.95876,-0.35035 0.52113,-0.19277 0.95082,-0.3471 0.95488,-0.34293 0.0188,0.0193 0.52465,1.27073 0.51683,1.27867 -0.009,0.009 -3.34455,1.35253 -3.39014,1.36552 -0.017,0.005 -0.0311,-0.011 -0.0506,-0.0566 z" id="path1938" inkscape:connector-curvature="0" fill="#ffffff"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/41-2.svg b/htdocs/public/symbols/svgicons/41-2.svg deleted file mode 100755 index a50534a8c2bfe6c2a3228d8e514ec2e9b2d7f27a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/41-2.svg +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata5621"/> - <g inkscape:groupmode="layer" id="layer1" inkscape:label="Lager"> - <rect id="rect5627" width="19.622" height="19.622" x="2.189" y="2.189" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.904" rx="5.293"/> - </g> - <g inkscape:groupmode="layer" id="layer3" inkscape:label="Lager#2"> - <path d="M 12,4.3728815 C 12,19.627118 12,19.627118 12,19.627118" id="path6162" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.5"/> - <path d="M 18.864407,5.1864406 C 5.237288,18.813559 5.237288,18.813559 5.237288,18.813559 l -0.1016949,0" id="path6168" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.5"/> - <path d="M 5.135593,5.1864412 C 18.762712,18.813559 18.762712,18.813559 18.762712,18.813559 l 0.101695,0" id="path6168-7" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.5"/> - <path d="M 19.627118,12 C 4.372882,12 4.372882,12 4.372882,12" id="path6162-2" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.5"/> - </g> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Lager#1" opacity="0.94"> - <rect id="rect6157" width="3.751" height="3.675" x="10.124" y="10.163" rx="0" ry="1.837" fill="#ffff00" stroke="#ffff00" stroke-linejoin="round" stroke-linecap="round" stroke-width="1.28"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/42-1.svg b/htdocs/public/symbols/svgicons/42-1.svg deleted file mode 100755 index d24e1cb22904907293e467a7414e0c7ee7eca2c6..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/42-1.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata6439"/> - <g id="g6421" transform="matrix(0.20244323,0,0,0.20244323,-0.93762632,-0.95857977)"> - <path d="m 45.91646,26.082576 c 5.296144,0 9.570144,-4.273999 9.570144,-9.596798 0,-5.260218 -4.274,-9.5608715 -9.570144,-9.5608715 -5.286872,0 -9.570142,4.3006535 -9.570142,9.5608715 0,5.322799 4.28327,9.596798 9.570142,9.596798 z" id="path6427" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 57.189018,103.42945 h 45.550312 c 0,0 2.94243,0.19933 8.80064,-4.490712 l 9.98618,-7.61393 v 8.601312 l -10.18551,7.61393 c 0,0 -3.02355,2.46265 -8.12153,3.02355 H 53.368146 l 3.820872,-7.13415 z" id="path6429" inkscape:connector-curvature="0" fill="#1a1a1a" stroke="#1a1a1a" stroke-linejoin="round" stroke-width="1.156"/> - <polygon points="50.359,97.504 11.039,97.504 7.758,103.66 8.086,103.66 47.406,103.66 50.688,97.504 " id="polygon6431" transform="matrix(0.92339056,0,0,1.1777069,-3.0934674,-11.459588)" fill="#1a1a1a" stroke="#1a1a1a" stroke-linejoin="round" stroke-width="0.998"/> - <path d="m 50.841758,37.734093 c 0,-5.286874 -4.282112,-9.587527 -9.587527,-9.587527 -5.296143,0 -9.596797,4.300653 -9.596797,9.587527 l 0,23.458323 c 0,2.969086 1.457887,5.74 3.594888,7.496883 11.151042,0 26.275536,0.0012 31.189303,0.0012 l -15.599867,-5.93933 0,-5.830393 12.313245,0 c 0.597989,0.02665 1.222632,-0.05447 1.810192,-0.308266 2.353712,-0.878441 3.512605,-3.512607 2.60751,-5.830393 -0.679113,-1.810192 -2.381527,-2.887964 -4.165064,-2.915776 l -12.576314,-0.02665 0.01047,-10.105551" id="path6433" inkscape:connector-curvature="0" sodipodi:nodetypes="cssscccccccccc" fill="#1a1a1a"/> - <path d="m 39.820287,68.439774 -21.459232,0 -11.5970425,21.050138 c -0.253798,0.479794 -0.370846,1.014032 -0.370846,1.584207 0,1.928411 1.566824,3.503336 3.495223,3.503336 l 79.1130345,0 c 0,0 3.395546,0.543556 8.520178,-3.476681 L 118.0653,75.989967 110.30651,62.436707 c 0,0 -1.74761,-3.277351 -8.31158,-4.264728 L 86.485455,55.564468 78.162282,41.677447 78.081159,41.532585 c -1.213362,-1.384876 -3.313277,-1.529738 -4.699314,-0.334921 l 0,0.02667 c -0.987377,0.905075 -1.358223,2.372233 -0.814702,3.675989 l 6.193128,10.294451 0,0.0904 -7.750669,13.155757" id="path6433-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cccsscccccccccccccc" fill="#aa0000"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/42-2.svg b/htdocs/public/symbols/svgicons/42-2.svg deleted file mode 100755 index d0c494bb06d8ea65a5b30cd718b1d0078db85ecd..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/42-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata4746"/> - <path d="m 10.85495,-4.55e-4 0,2.98997 -2.24649,-1.29879 -1.14046,1.96884 3.38695,1.96195 0,4.41268 -3.80458,-2.19831 -0.007,-3.93079 -2.27632,0.005 0.005,2.61135 -2.59759,-1.50073 -1.13816,1.97114 2.5907,1.49613 -2.24879,1.2942 1.13357,1.97343 3.39384,-1.95277 3.81835,2.20519 -3.80458,2.19601 -3.40761,-1.95966 -1.13357,1.97343 2.26256,1.30338 -2.59759,1.49843 1.13817,1.97113 2.5907,-1.49613 -0.005,2.59528 2.27632,0.005 0.007,-3.91473 3.81835,-2.20289 0,4.39202 -3.40072,1.97113 1.14046,1.96884 2.26026,-1.30797 0,2.99915 2.27633,0 0,-2.98997 2.24649,1.29879 1.14046,-1.96884 -3.38695,-1.96195 0,-4.41268 3.80458,2.19831 0.007,3.93079 2.27632,-0.005 -0.005,-2.61135 2.59759,1.50073 1.13816,-1.97114 -2.5907,-1.49613 2.24879,-1.2942 -1.13357,-1.97343 -3.39154,1.95277 -3.82065,-2.20519 3.80688,-2.1983 3.40531,1.96195 1.13357,-1.97343 -2.26256,-1.30338 2.59759,-1.49843 -1.13817,-1.97113 -2.5907,1.49613 0.005,-2.59528 -2.27632,-0.005 -0.007,3.91473 -3.81835,2.20289 0,-4.39202 3.40072,-1.97113 -1.14046,-1.96884 -2.26026,1.30797 0,-2.99915 -2.27633,0 z" id="rect2991" inkscape:connector-curvature="0" fill="#3d7dab"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/43-1.svg b/htdocs/public/symbols/svgicons/43-1.svg deleted file mode 100755 index cb7e9efb8226355dd6d33617cb2d226f57a6be5e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/43-1.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata7115"/> - <path d="M 12,-0.00134109 C 12,24.001341 12,24.001341 12,24.001341" id="path7119" inkscape:connector-curvature="0" fill="#cc0000" stroke="#cc0000" stroke-width="6.3"/> - <path d="M 24.001341,12 C -0.001341,12 -0.001341,12 -0.001341,12" id="path7119-9" inkscape:connector-curvature="0" fill="#cc0000" stroke="#cc0000" stroke-width="6.3"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/43-2.svg b/htdocs/public/symbols/svgicons/43-2.svg deleted file mode 100755 index b24a84242baf133efd7ab106ec513cd6adf45dd4..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/43-2.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3042"/> - <path d="m 12,3.0113814 0,19.0069396 0,0" id="path3046" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-width="6"/> - <path d="m 4.9636962,10.29703 14.0726078,0" id="path3816" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" fill="none" stroke="#000000" stroke-width="6"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/44-1.svg b/htdocs/public/symbols/svgicons/44-1.svg deleted file mode 100755 index 0dead5ea5d86ee19687a102e91e9b42192cfbc37..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/44-1.svg +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3204"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g4148"> - <path id="path26" d="m 17.032497,1049.0732 c -1.35161,-0.044 -2.33959,-2.0678 -2.6015,-3.4568 l 1.54127,-0.3248 c 0.29019,1.1075 1.03171,1.7138 1.61281,1.8612 0.58133,0.1478 0.93023,0 1.32261,-0.1922 0.14546,1.0044 -0.5521,1.9794 -1.87519,2.1126" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - <path sodipodi:nodetypes="cccccccccccc" id="path28" d="m 20.241957,1043.2306 c 0.2486,-0.657 0.29827,-1.651 -0.72988,-2.2415 -0.62982,-0.337 -1.37585,-0.3027 -1.95671,0.085 -0.66309,0.5392 -1.04431,1.2978 -1.29338,2.0897 l -1.72522,-0.017 c 0,-0.4546 0.0829,-0.9434 0.14949,-1.281 0.16613,-1.0112 0.99535,-3.1849 1.55885,-3.9771 0.61414,-0.8934 1.29362,-1.8879 3.2173,-2.1238 1.12749,-0.1343 2.75313,0.2866 3.48229,1.2477 0.74652,1.0111 0.99535,1.9884 0.84586,3.3364 -0.33154,1.3656 -1.75826,3.2022 -3.5486,2.8817 z" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - <path id="path102" d="m 11.786527,1052.3619 c 1.33707,-0.8274 2.55796,-1.6106 3.42972,-2.9844 -0.61009,-0.724 -1.2929,-3.6336 -1.32214,-3.8697 l -1.46783,0.088 -0.4513,4.21 c -0.0289,0.029 -0.13034,0.015 -0.17416,0.015 l -0.26125,-4.3129 -1.52608,-0.059 c -0.3200194,1.4922 -1.1051494,3.2203 -1.4240494,3.7961 0.24629,0.6058 1.4240494,1.9357 3.1970894,3.1175" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - <path id="path112" d="m 6.8843676,1048.8709 c 1.3521801,-0.044 2.3399001,-2.068 2.60188,-3.4569 l -1.54084,-0.3246 c -0.29067,1.1077 -1.03197,1.7135 -1.61288,1.8613 -0.5817096,0.1479 -0.9303196,0 -1.3233996,-0.1921 -0.14512,1.0047 0.55229,1.9794 1.8752396,2.1123" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - <path id="path128" d="m 13.857277,1043.1636 c 0.029,0 0.11645,0 0.13119,-0.045 0.0582,-0.3696 0.0582,-0.7977 0.20344,-1.1961 0.029,-0.2809 0.14474,-0.591 0.18871,-0.8418 0.26143,-0.7539 0.43612,-1.3295 0.72631,-2.0384 0.97443,-2.0685 1.73021,-3.7968 1.11988,-6.0567 -0.30564,-1.0931 -1.55553,-2.4371 -1.99069,-2.7332 -0.4221,-0.2797 -1.8466,-1.3143 -2.00601,-1.8754 -0.0587,-0.015 -0.14557,-0.015 -0.18977,-0.015 -0.36309,0.7831 -1.42415,1.3886 -1.91833,1.8317 -0.4797793,0.4137 -1.3520893,1.078 -1.9625993,2.7621 -0.59603,1.6544 0.0728,4.4316 0.77037,6.0864 0.34899,0.8563 0.71245,1.7573 0.88709,2.6733 0.0725,0.4873 0.1883493,0.9599 0.2332893,1.4625 l 1.43808,0.029 0.63937,-11.5212 0.17454,0.014 0.11596,11.4782 1.43917,-0.015" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - <path sodipodi:nodetypes="cccccccccccc" id="path182" d="m 3.7584081,1043.2478 c -0.24919,-0.6573 -0.2982901,-1.6518 0.7295199,-2.242 0.63046,-0.3365 1.37604,-0.3028 1.9571096,0.085 0.66307,0.5393 1.04417,1.2979 1.29334,2.0906 l 1.7243901,-0.017 c 0,-0.4716 -0.0825,-0.9439 -0.14937,-1.2806 -0.14909,-1.0117 -0.97814,-3.1857 -1.55867,-3.9778 -0.6304601,-0.8597 -1.29333,-1.8876 -3.2169596,-2.1238 -1.12733,-0.134 -2.75275,0.2869 -3.48291,1.2473 -0.74578007,1.011 -0.99469007,1.9885 -0.84560007,3.3373 0.33209,1.3649 1.75810007,3.2021 3.54915007,2.8818 z" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - <path id="path184" d="m 11.900347,1043.5337 c 1.27696,0 2.45412,0.1019 3.28382,0.2195 0.84514,0.1348 1.40936,0.169 1.37609,0.5398 -0.0328,0.3703 -0.53095,0.3878 -1.37609,0.5225 -0.8297,0.1344 -2.00686,0.2362 -3.28382,0.2362 -1.19373,0 -2.3214293,-0.1018 -3.1343193,-0.2026 -0.92859,-0.1185 -1.44255,-0.1683 -1.54196,-0.5561 -0.0998,-0.3878 0.59676,-0.4552 1.54196,-0.5732 0.79654,-0.1014 1.9405893,-0.1861 3.1343193,-0.1861 z m 0,0.3209 c 1.09503,0 2.12282,0.051 2.83582,0.1179 0.74627,0.068 1.22731,0.1015 1.19404,0.3205 -0.0164,0.2183 -0.44777,0.2356 -1.19404,0.3201 -0.713,0.084 -1.74079,0.1344 -2.83582,0.1344 -1.04426,0 -2.0223993,-0.05 -2.7193293,-0.1344 -0.81216,-0.067 -1.2604,-0.085 -1.34358,-0.3201 -0.0827,-0.2365 0.51433,-0.2527 1.34358,-0.3375 0.67975,-0.068 1.6750693,-0.1009 2.7193293,-0.1009" inkscape:connector-curvature="0" fill="#ff0000" fill-rule="evenodd"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/44-2.svg b/htdocs/public/symbols/svgicons/44-2.svg deleted file mode 100755 index 928409b7c79afb07bfad1cef3a05cebbe3c5b5df..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/44-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3408"/> - <path d="m 11.98881,23.244115 c 3.22297,-1.26105 5.49011,-3.61614 5.63141,-6.09914 0.53801,0.75934 6.35191,1.92593 6.37978,-5.66883 -0.1154,-3.8627 -2.07478,-6.47315 -5.96851,-5.25496 0.49363,-4.76376 -2.77008,-5.27331 -6.00526,-5.4653 -3.4952,0.14196 -6.46711,0.88196 -6.06172,5.48174 C 3.09054,5.045855 0.11669,6.723545 0,11.274775 c 0.041,8.24728 6.12254,6.38075 6.37611,5.87956 0.21597,3.8362 5.1276,5.95378 5.6127,6.08978 z" id="path4245" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccc" fill="#01a850"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/45-1.svg b/htdocs/public/symbols/svgicons/45-1.svg deleted file mode 100755 index c106a47ffc805f3df9af33e0a9cba74d735f5c9c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/45-1.svg +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24"> - <metadata id="metadata3031"/> - <g transform="translate(0,-1028.3622)" id="layer1"> - <g transform="translate(-922.28571,-6.2856999)" id="g3047"> - <path d="m 942.53375,1050.0898 -8.24601,-7.3025 -8.25007,7.3055 0,6.86 c 0,0.27 0.21777,0.4862 0.4872,0.4862 l 5.90963,0 0,-4.5773 c 0,-0.2694 0.21625,-0.4872 0.48619,-0.4872 l 2.72953,0 c 0.26994,0 0.4862,0.2178 0.4862,0.4872 l 0,4.5773 5.91114,0 c 0.26943,0 0.48619,-0.2162 0.48619,-0.4862 z" id="rect2391" fill="#ffff00" stroke="#000000" stroke-width="2.026"/> - <path d="m 934.24043,1037.3781 -11.70152,10.3615 1.2326,1.3902 10.51643,-9.3126 10.51441,9.3126 1.23016,-1.3902 -11.69899,-10.3615 -0.0456,0.053 -0.0476,-0.053 z" id="path2399" stroke="#000000" stroke-linejoin="round" stroke-width="0.506"/> - <path d="m 926.03797,1038.8696 2.96628,0 -0.0258,1.7569 -2.94045,2.6563 0,-4.4132 z" id="rect2404"/> - <path d="m 940.37148,1034.8439 -0.95272,0 0.008,5.9798 0.94442,0.8579 z" id="rect2404-4"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/45-2.svg b/htdocs/public/symbols/svgicons/45-2.svg deleted file mode 100755 index 89a49c38322e7ed3d5cc33ff99f78b7abdcd87d2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/45-2.svg +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3010"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3032" transform="translate(469.14286,673.7143)"> - <path sodipodi:nodetypes="cccsscsssscssc" id="rect2391" d="m -448.83166,372.26523 -8.30915,-5.39133 -8.31324,5.39358 0,5.06465 c 0,0.19929 0.21944,0.35894 0.49093,0.35894 l 5.95488,0 0,-3.37934 c 0,-0.19892 0.2179,-0.3597 0.48991,-0.3597 l 2.75043,0 c 0.27201,0 0.48992,0.16078 0.48992,0.3597 l 0,3.37934 5.9564,0 c 0.2715,0 0.48992,-0.15965 0.48992,-0.35894 z" inkscape:connector-curvature="0" fill="#00ffff" stroke="#000000" stroke-width="1.747"/> - <path id="path2399" d="m -457.18848,362.88042 -11.79112,7.64972 1.24204,1.02636 10.59695,-6.87536 10.59492,6.87536 1.23958,-1.02636 -11.78857,-7.64972 -0.046,0.0389 -0.048,-0.0389 z" inkscape:connector-curvature="0" stroke="#000000" stroke-linejoin="round" stroke-width="0.437"/> - <path id="rect2404" d="m -465.45375,363.98157 h 2.98899 l -0.026,1.29708 -2.96297,1.96113 v -3.25821 z" inkscape:connector-curvature="0"/> - <path sodipodi:nodetypes="cccccc" id="rect2404-6" d="m -454.94958,359.09746 -1.74869,-0.0219 0.0221,3.249 1.65285,1.02305 0.0247,-4.2361 z" inkscape:connector-curvature="0"/> - <path inkscape:connector-curvature="0" id="path5724" d="m -461.04865,358.36317 c 11.01724,-0.0285 11.01724,-0.0285 11.01724,-0.0285 l 0,0" fill="none" stroke="#000000" stroke-width="1.021"/> - <path inkscape:connector-curvature="0" id="path5744" d="m -458.37699,355.42708 c -5.53612,5.61787 -5.56503,5.64721 -5.56503,5.64721" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.392"/> - <path inkscape:connector-curvature="0" id="path5744-7" d="m -447.04557,355.42708 c -5.53612,5.61787 -5.56503,5.64721 -5.56503,5.64721" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.392"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/45-3.svg b/htdocs/public/symbols/svgicons/45-3.svg deleted file mode 100755 index 7890b443f856e31c6eea7e1d3eff0078d2da04b6..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/45-3.svg +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - version="1.1" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="45-3.svg"> - <defs - id="defs16" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview14" - showgrid="false" - inkscape:zoom="6.9532167" - inkscape:cx="-13.752296" - inkscape:cy="17.943936" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="layer1" /> - <metadata - id="metadata3010"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1028.3622)"> - <g - id="g3351" - transform="translate(0,-7.9875566)"> - <path - sodipodi:nodetypes="cccsccsc" - id="rect2391" - d="m 20.3112,1045.9795 -8.30915,-5.3913 -8.31324,5.3936 0,13.0985 c 0,0.1993 0.21944,0.359 0.49093,0.359 l 15.64154,0 c 0.2715,0 0.48992,-0.1597 0.48992,-0.359 z" - inkscape:connector-curvature="0" - style="fill:#00ffff;stroke:#000000;stroke-width:1.74699998" /> - <path - id="path2399" - d="m 11.95438,1036.5947 -11.79112,7.6497 1.24204,1.0264 10.59695,-6.8754 10.59492,6.8754 1.23958,-1.0264 -11.78857,-7.6497 -0.046,0.039 -0.048,-0.039 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:0.43700001;stroke-linejoin:round" /> - <path - id="rect2404" - d="m 3.68911,1037.6959 2.98899,0 -0.026,1.297 -2.96297,1.9612 0,-3.2582 z" - inkscape:connector-curvature="0" /> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/46-1.svg b/htdocs/public/symbols/svgicons/46-1.svg deleted file mode 100755 index 041138708f7a598d145ab3863520d86fca7f39db..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/46-1.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata5085"/> - <path d="M 21.661017,2.338983 C 2.338983,21.661017 2.338983,21.661017 2.338983,21.661017" id="path5089" inkscape:connector-curvature="0" stroke="#ff0000" fill-opacity="0" stroke-linecap="round" stroke-width="3"/> - <path d="M 2.3389831,2.3389831 C 21.661017,21.661017 21.661017,21.661017 21.661017,21.661017" id="path5089-8" inkscape:connector-curvature="0" stroke="#ff0000" fill-opacity="0" stroke-linecap="round" stroke-width="3"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/46-2.svg b/htdocs/public/symbols/svgicons/46-2.svg deleted file mode 100755 index dfc2bf6efb02138745108e7347a8a8be57e3ac32..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/46-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata4472"/> - <g inkscape:groupmode="layer" id="layer3" inkscape:label="Lager"> - <path sodipodi:type="arc" id="path4476" sodipodi:cx="11.505466" sodipodi:cy="12.458579" sodipodi:rx="11.397602" sodipodi:ry="11.397602" d="m 0.10786438,12.458579 a 11.397602,11.397602 0 1 1 5.25e-6,0.01094" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" transform="translate(0.49453354,-0.45857906)" fill="#cccccc" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="1.2"/> - <text x="11.984" y="20.16" id="text5005" sodipodi:linespacing="0%" fill="#ff0000" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" letter-spacing="0" font-size="22"><tspan sodipodi:role="line" id="tspan5007" x="11.984" y="20.16">?</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/47-1.svg b/htdocs/public/symbols/svgicons/47-1.svg deleted file mode 100755 index 6084f496862758fe17b4480a8f6d5e0245c1b32d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/47-1.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata5697"/> - <defs id="defs5695"> - <linearGradient inkscape:collect="always" id="linearGradient4480"> - <stop id="stop4482" stop-color="#ff8080"/> - <stop offset="1" id="stop4484" stop-color="#ff8080" stop-opacity="0"/> - </linearGradient> - <radialGradient inkscape:collect="always" xlink:href="#linearGradient4480" id="radialGradient4488" cx="10.525" cy="10.169" r="4.856" gradientTransform="matrix(-0.00522198,0.93192464,-0.9999843,-0.00560335,20.74972,0.41757067)" gradientUnits="userSpaceOnUse"/> - </defs> - <path sodipodi:type="arc" id="path5701" sodipodi:cx="12" sodipodi:cy="12" sodipodi:rx="3.3559322" sodipodi:ry="3.3559322" d="m 8.6440678,12 a 3.3559322,3.3559322 0 1 1 1.5e-6,0.0032" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-linecap="round" stroke-width="3"/> - <path sodipodi:type="arc" id="path5701-9" sodipodi:cx="12" sodipodi:cy="12" sodipodi:rx="4.8559928" sodipodi:ry="4.8559937" d="m 7.1440072,12 a 4.8559928,4.8559937 0 0 1 4.8548278,-4.8559936 4.8559928,4.8559937 0 0 1 4.857157,4.8536626 4.8559928,4.8559937 0 0 1 -4.852496,4.858323 4.8559928,4.8559937 0 0 1 -4.8594866,-4.85133" sodipodi:start="3.1415927" sodipodi:end="3.1406327" sodipodi:open="true" fill="url(#radialGradient4488)" stroke="#ff6600" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/47-2.svg b/htdocs/public/symbols/svgicons/47-2.svg deleted file mode 100755 index 3ca935a54cf03773f89fdf53f9c83a45a92ab2a3..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/47-2.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata5697"/> - <defs id="defs5695"> - <linearGradient inkscape:collect="always" id="linearGradient4184"> - <stop id="stop4186" stop-color="#d45500"/> - <stop offset="1" id="stop4188" stop-color="#d45500" stop-opacity="0"/> - </linearGradient> - <radialGradient inkscape:collect="always" xlink:href="#linearGradient4184" id="radialGradient4190" cx="-0.467" cy="8.03" r="4.856" gradientTransform="matrix(-0.00522206,0.92145355,-0.99998394,-0.0056671,19.547066,11.382745)" gradientUnits="userSpaceOnUse"/> - </defs> - <path sodipodi:type="arc" id="path5701" sodipodi:cx="12" sodipodi:cy="12" sodipodi:rx="3.3559322" sodipodi:ry="3.3559322" d="m 8.6440678,12 a 3.3559322,3.3559322 0 1 1 1.5e-6,0.0032" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="3"/> - <path sodipodi:type="arc" id="path5701-9" sodipodi:cx="12" sodipodi:cy="12" sodipodi:rx="4.8559928" sodipodi:ry="4.8559937" d="m 7.1440072,12 a 4.8559928,4.8559937 0 0 1 4.8548278,-4.8559936 4.8559928,4.8559937 0 0 1 4.857157,4.8536626 4.8559928,4.8559937 0 0 1 -4.852496,4.858323 4.8559928,4.8559937 0 0 1 -4.8594866,-4.85133" sodipodi:start="3.1415927" sodipodi:end="3.1406327" sodipodi:open="true" fill="url(#radialGradient4190)" stroke="#ff6600" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/48-1.svg b/htdocs/public/symbols/svgicons/48-1.svg deleted file mode 100755 index e2ec2e7d75a9a9a053b7c1db7b4605efbf738427..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/48-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="11.994" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="11.994" y="20.372">0</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/48-2.svg b/htdocs/public/symbols/svgicons/48-2.svg deleted file mode 100755 index 6c871318314df8e41e6b8cd8fb52ac3a6664f036..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/48-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3116"/> - <path sodipodi:type="arc" id="path3120" sodipodi:cx="11.694915" sodipodi:cy="12.101695" sodipodi:rx="11.288136" sodipodi:ry="11.288136" d="m 0.40677929,12.101695 a 11.288136,11.288136 0 1 1 5.2e-6,0.01084" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" transform="matrix(1.0191414,0,0,1.0191414,0.08122772,-0.33333887)" fill="#ccd5cc" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.973"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/49-1.svg b/htdocs/public/symbols/svgicons/49-1.svg deleted file mode 100755 index 04796fadcc3390ceab564ef5ee7267ed5e1343bb..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/49-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#552200" stroke="#552200" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="11.489" y="20.384" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="11.489" y="20.384">1</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/49-2.svg b/htdocs/public/symbols/svgicons/49-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/49-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/50-1.svg b/htdocs/public/symbols/svgicons/50-1.svg deleted file mode 100755 index 61d4e6506accf3be504e07e5738593d5c6899096..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/50-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#d40000" stroke="#d40000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.08" y="20.535" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.08" y="20.535">2</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/50-2.svg b/htdocs/public/symbols/svgicons/50-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/50-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/51-1.svg b/htdocs/public/symbols/svgicons/51-1.svg deleted file mode 100755 index a39c7f406dd26015dad4e7856454b3d12cd675ee..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/51-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#ff6600" stroke="#ff6600" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">3</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/51-2.svg b/htdocs/public/symbols/svgicons/51-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/51-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/52-1.svg b/htdocs/public/symbols/svgicons/52-1.svg deleted file mode 100755 index 348670d23f0e9d7d48699383a0143a1c6f548978..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/52-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#ffff00" stroke="#ffff00" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#808080" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">4</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/52-2.svg b/htdocs/public/symbols/svgicons/52-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/52-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/53-1.svg b/htdocs/public/symbols/svgicons/53-1.svg deleted file mode 100755 index 913c938a8580fa5e0019f1e9e927374d7a4b69ff..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/53-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#00d400" stroke="#00d400" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">5</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/53-2.svg b/htdocs/public/symbols/svgicons/53-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/53-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/54-1.svg b/htdocs/public/symbols/svgicons/54-1.svg deleted file mode 100755 index 176dfaa65f76844fec33deb239f100b0035a9760..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/54-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#0000ff" stroke="#0000ff" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">6</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/54-2.svg b/htdocs/public/symbols/svgicons/54-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/54-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/55-1.svg b/htdocs/public/symbols/svgicons/55-1.svg deleted file mode 100755 index 57a21cef5572643e0b0a94d7134c1e176cc984b3..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/55-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#ff00ff" stroke="#ff00ff" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">7</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/55-2.svg b/htdocs/public/symbols/svgicons/55-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/55-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/56-1.svg b/htdocs/public/symbols/svgicons/56-1.svg deleted file mode 100755 index e84f6200f570a07f4041b74a0f2f91625197403c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/56-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#0000ff" stroke="#0000ff" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" fill="#ffffff" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">8</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/56-2.svg b/htdocs/public/symbols/svgicons/56-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/56-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/57-1.svg b/htdocs/public/symbols/svgicons/57-1.svg deleted file mode 100755 index aa1d4ea786c223777d295f8ba065ce5242652d16..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/57-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata6326"/> - <g inkscape:groupmode="layer" id="layer4" inkscape:label="Lager"> - <rect id="rect6331" width="23.551" height="23.552" x="0.224" y="0.224" fill="#ffffff" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.449" rx="5.885"/> - <text x="12.14" y="20.372" id="text6841" sodipodi:linespacing="0%" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="23"><tspan sodipodi:role="line" id="tspan6843" x="12.14" y="20.372">9</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/57-2.svg b/htdocs/public/symbols/svgicons/57-2.svg deleted file mode 100755 index 804c3f8bded6e598a1678c9b872e728f7038fc3a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/57-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata7316"/> - <path inkscape:connector-curvature="0" id="path7310" d="m 11.279486,6.517982 c 0,0.315832 -0.249759,0.561627 -0.567706,0.561627 H 4.7712145 c -0.320062,0 -0.567707,-0.245795 -0.567707,-0.561627 V 1.508528 c 0,-0.315833 0.247909,-0.561628 0.567707,-0.561628 H 10.71178 c 0.317947,0 0.567706,0.245795 0.567706,0.561628 v 5.009454 z m 6.925331,0.639859 C 17.453161,6.992656 17.180672,6.60652 17.180672,6.251308 V 4.956789 c 0,0 0.499783,0.111533 0.619509,0.142455 0.24368,0.06396 0.398557,0.437673 0.404636,0.764078 0.0082,0.32614 0,1.294519 0,1.294519 z m 1.513355,7.8649 c 0,-0.01242 -0.208529,-1.590001 -0.208529,-1.590001 V 6.148232 c 0,-0.780464 -0.256102,-1.414508 -0.784693,-1.947063 L 15.35122,0.843825 c -0.233373,0 -0.87746,0.642238 -0.87746,0.642238 0,0.233372 1.674575,1.895526 1.674575,1.895526 l -0.04969,2.826638 c 0,1.00353 0.815616,1.817031 1.82311,1.817031 l 0.452209,0.0061 -0.160956,5.401668 0.22518,1.852181 1.013837,5.465628 c 0.03727,0.887768 -0.774386,1.416359 -1.414509,1.416359 -0.59255,0 -1.280247,-0.489475 -1.280247,-1.121141 l 0.01242,-9.578592 c 0,-1.164485 -0.945649,-2.110134 -2.110134,-2.110134 0,0 -2.025559,0 -2.035867,0 0.142455,-0.0082 0.148534,-6.272785 0.148534,-7.602719 0,-0.156992 0,-0.245795 0,-0.245795 0,-1.133563 -0.925033,-2.056482 -2.060711,-2.056482 H 4.7712105 c -1.135678,0 -2.060711,0.922919 -2.060711,2.056482 v 21.711333 l 10.0617225,0.167299 0.01031,-12.684062 h 1.899755 c 0.435558,0 0.790771,0.355213 0.790771,0.790772 v 9.551898 c 0,1.282361 1.197522,2.405616 2.564458,2.405616 1.290554,0 2.735985,-1.026259 2.735985,-2.405616 -0.02273,-0.318212 -1.055331,-6.023291 -1.055331,-6.023291 z" fill="#000080"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/58-1.svg b/htdocs/public/symbols/svgicons/58-1.svg deleted file mode 100755 index d6a9fec5607f59dcbffd59c7f6ae3e4b4552aa56..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/58-1.svg +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" height="24" width="24" version="1.1"> - <metadata id="metadata3"/> - <defs id="defs3"> - <linearGradient id="linearGradient19763"> - <stop id="stop19764" stop-opacity="0.741"/> - <stop id="stop19765" offset="1" stop-color="#ffffff" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient29186"> - <stop id="stop29187" stop-color="#ffffff"/> - <stop id="stop29188" offset="1" stop-color="#ffffff" stop-opacity="0"/> - </linearGradient> - <linearGradient gradientTransform="matrix(-0.345461,-1.103135,0.825546,-0.25853,-265.0855,1483.115)" gradientUnits="userSpaceOnUse" id="linearGradient30536" inkscape:collect="always" x1="78.65" x2="122.42" xlink:href="#linearGradient29186" y1="743.14" y2="713.55"/> - <linearGradient gradientTransform="matrix(1.100206,-1.253837,0.450605,0.395393,-311.0192,864.0529)" gradientUnits="userSpaceOnUse" id="linearGradient30535" inkscape:collect="always" x1="82.56" x2="94.62" xlink:href="#linearGradient29186" y1="1126.68" y2="1102.49"/> - <linearGradient id="linearGradient17250"> - <stop id="stop17251" stop-color="#dc0000"/> - <stop id="stop17252" offset="1" stop-color="#ffb200"/> - </linearGradient> - <linearGradient id="linearGradient26051"> - <stop id="stop26052" stop-color="#ffffff" stop-opacity="0.449"/> - <stop id="stop26053" offset="1" stop-color="#ffffff" stop-opacity="0"/> - </linearGradient> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient29186" id="linearGradient4463" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.04580023,0,0,0.07975769,-1.6635904,480.27262)" x1="198.88" y1="246.21" x2="342.54" y2="403.09"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient4466" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.03648159,0,0,0.10013055,-3.162027,482.08065)" x1="349.43" x2="390.32"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient4470" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.0533835,0,0,0.09296341,72.273472,478.53617)" x1="-1131.03" y1="404.58" x2="-1102.73" y2="306.76"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient4473" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.04039753,0,0,0.09042433,-3.162027,481.96995)" x1="533.78" x2="572.41"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient29186" id="linearGradient4476" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.05330894,0,0,0.06852355,-1.5727754,480.53091)" x1="501.4" y1="384.4" x2="317.14" y2="485.78"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient4479" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.06213546,0,0,0.07986921,72.273472,478.53617)" x1="-916.9" y1="438.47" x2="-857.96" y2="362.16"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient29186" id="linearGradient4498" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.05403741,0,0,0.06759984,-1.9814393,481.34268)" x1="9.655" y1="256.78" x2="323.1" y2="500.8"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient4501" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.04069374,0,0,0.08976607,-3.162027,482.08065)" x1="468.41" x2="502.45"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient29186" id="linearGradient4504" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.0403567,0,0,0.09051581,-1.4250417,481.04359)" x1="110.45" y1="244.05" x2="239.46" y2="376.9"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient4512" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.04703865,0,0,0.10550269,72.273472,478.53617)" x1="-1308.2" y1="330.2" x2="-1335.04" y2="272.82"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient4515" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.06298454,0,0,0.07879257,72.273472,478.53617)" x1="-1006.61" y1="448.68" x2="-953.88" y2="299.89"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient3037" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.0547431,0,0,0.13541198,-47.754626,481.62834)" x1="349.43" x2="390.32"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3041" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.08010556,0,0,0.12571947,65.441451,476.83495)" x1="-1131.03" y1="404.58" x2="-1102.73" y2="306.76"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient3044" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.06061923,0,0,0.12228573,-47.754626,481.47863)" x1="533.78" x2="572.41"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3050" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.09323846,0,0,0.10801147,65.441451,476.83495)" x1="-916.9" y1="438.47" x2="-857.96" y2="362.16"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient3054" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.06106371,0,0,0.12139553,-47.754626,481.62834)" x1="468.41" x2="502.45"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3058" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.07058468,0,0,0.14267702,65.441451,476.83495)" x1="-1308.2" y1="330.2" x2="-1335.04" y2="272.82"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3064" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.09451257,0,0,0.10655547,100.83342,471.1867)" x1="-1006.61" y1="448.68" x2="-953.88" y2="299.89"/> - <linearGradient y2="299.89" x2="-953.88" y1="448.68" x1="-1006.61" gradientTransform="matrix(0.09451257,0,0,0.10655547,65.441451,476.83495)" gradientUnits="userSpaceOnUse" id="linearGradient3129" xlink:href="#linearGradient17250" inkscape:collect="always"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient3037-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.0547431,0,0,0.13541198,-74.716956,479.69588)" x1="349.43" x2="390.32"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3041-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.08010556,0,0,0.12571947,38.479121,474.90249)" x1="-1131.03" y1="404.58" x2="-1102.73" y2="306.76"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient3044-9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.06061923,0,0,0.12228573,-74.716956,479.54617)" x1="533.78" x2="572.41"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3050-1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.09323846,0,0,0.10801147,38.479121,474.90249)" x1="-916.9" y1="438.47" x2="-857.96" y2="362.16"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient26051" id="linearGradient3054-3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.06106371,0,0,0.12139553,-74.716956,479.69588)" x1="468.41" x2="502.45"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient17250" id="linearGradient3058-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.07058468,0,0,0.14267702,38.479121,474.90249)" x1="-1308.2" y1="330.2" x2="-1335.04" y2="272.82"/> - <linearGradient y2="299.89" x2="-953.88" y1="448.68" x1="-1006.61" gradientTransform="matrix(0.09451257,0,0,0.10655547,38.479121,474.90249)" gradientUnits="userSpaceOnUse" id="linearGradient3129-0" xlink:href="#linearGradient17250" inkscape:collect="always"/> - </defs> - <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(0,-497.11258)"> - <g id="g4065" transform="translate(62.335816,-3.7180513)"> - <path d="m -61.143517,517.67383 c 1.946549,4.21283 5.026163,6.4469 10.546224,6.70223 6.07207,1.42555 11.708343,-1.48938 10.110431,-6.06392 -0.726325,0.97874 -1.19117,1.51066 -2.44045,1.78726 0.493901,-2.53196 -2.672871,-2.95749 -1.133064,-5.68094 1.074961,-1.68087 1.714124,-3.74474 -0.174318,-5.42561 -0.784429,1.91492 -1.743176,3.19154 -3.660672,4.59581 0.20337,-2.34046 1.88844,-4.23411 0.871588,-6.4469 0.14527,-1.48939 -3.195826,-1.44683 -3.224879,-6.0001 -2.120865,1.95748 -3.021507,3.46814 -2.701925,6.44691 -0.784431,2.40429 -2.701924,3.27666 -2.353289,5.87243 -0.290529,-1.44683 -0.4939,-2.70216 -0.08716,-3.76601 -0.232423,-1.31916 -0.464847,-2.44685 -2.26613,-3.38303 0.552007,1.63832 1.191172,4.10645 -0.697271,4.72347 -0.522953,0.78725 -3.13772,3.48942 -0.261477,7.72353 -0.842535,-0.36172 -1.685073,-0.46811 -2.527608,-1.08513 z" id="path15991-0" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="url(#linearGradient3129-0)" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -51.207404,523.73776 c -4.619421,-3.57453 -5.403851,-6.06393 -2.35329,-8.42567 3.428249,-4.46815 2.585713,-7.27671 0.08715,-9.9576 2.35329,5.93627 -2.789085,9.76611 -4.445103,11.48953 -0.987799,-2.23407 -0.145265,-3.19152 1.220225,-5.93625 -2.672873,2.12769 -4.299839,4.7022 -3.312038,7.14905 1.801284,3.6809 6.043015,4.48942 8.803047,5.68094 z" id="path15990-3" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="url(#linearGradient3058-8)" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -45.601295,510.23227 c -0.619226,-1.31895 -0.113908,-1.6014 0.428512,-2.17763 0.559547,-0.15959 0.388044,-0.71607 0.693378,-1.95535 0.462312,1.38324 1.703436,2.01216 -1.12189,4.13298 z" id="path15994-8" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="#ffd700" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -44.905453,505.88237 c -0.18828,0.58799 -0.103164,1.236 -0.452738,1.78444 -0.819061,0.45825 -1.17621,1.30976 -0.817056,2.03238 0.111507,0.60563 0.370172,0.71013 0.828717,0.15707 0.979108,-0.73786 1.895208,-1.79505 1.337706,-2.85229 -0.251547,-0.53926 -0.471814,-1.08672 -0.752006,-1.61894 -0.04821,0.16578 -0.09641,0.33155 -0.144625,0.49734 z" id="path28563-9" inkscape:connector-curvature="0" fill="url(#linearGradient3054-3)" fill-rule="evenodd"/> - <path d="m -41.619927,518.31214 c 1.597912,-1.12767 1.27833,-1.61705 1.133065,-2.42557 -0.464848,-0.38299 0.116219,-0.89363 0.69727,-2.29791 -1.481701,1.25534 -3.224879,1.42556 -1.830335,4.72348 z" id="path15993-42" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="#ffd700" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -49.115592,523.73776 c 1.801283,-0.7447 2.295183,-3.08517 2.527609,-5.68094 0.435793,-2.51068 1.307383,-5.02136 7.059868,-5.42562 -2.353291,1.38301 -4.270784,3.08515 -3.399197,6.25542 -0.232423,4.61709 -4.909949,4.44687 -6.18828,4.85114 z" id="path15992-7" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="url(#linearGradient3050-1)" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -40.161143,513.13986 c -0.988473,0.76628 -2.422497,1.48341 -2.3879,2.66159 -0.07306,0.84412 0.337391,1.64894 0.59267,2.45919 0.858055,-0.59964 1.833394,-1.38076 1.519084,-2.32643 -0.0023,-0.41668 -0.431066,-0.7812 -0.09442,-1.1872 0.323344,-0.6429 0.661588,-1.28263 0.886172,-1.95023 -0.171872,0.11441 -0.343745,0.22872 -0.515618,0.34308 z" id="path28562-2" inkscape:connector-curvature="0" fill="url(#linearGradient3044-9)" fill-rule="evenodd"/> - <path d="m -52.25331,522.01432 c -0.232425,-2.04258 -0.552007,-3.51069 2.963402,-5.36178 5.955855,-3.0426 3.021507,-4.80859 -0.697272,-7.97884 1.104013,3.14898 -0.668218,5.65965 -2.178973,7.34053 -0.9878,1.04257 -4.416048,3.17026 -0.08715,6.00009 z" id="path15989-6" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="url(#linearGradient3041-8)" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -54.525194,507.0314 c 1.60857,-1.35648 1.195445,-1.91484 0.932717,-2.84879 -0.558868,-0.43055 0.0132,-1.04054 0.471015,-2.68762 -1.464775,1.50117 -3.355122,1.75087 -1.403732,5.53641 z" id="path15995-9" inkscape:connector-curvature="0" stroke-opacity="0.504" fill="#ffd700" fill-rule="evenodd" stroke="#ffff00" stroke-width="0.186"/> - <path d="m -53.507465,501.20597 c -0.936634,0.897 -2.356998,1.72471 -2.282552,2.96793 -0.01008,1.0337 0.546212,1.9981 0.962067,2.96794 0.849161,-0.70989 1.752609,-1.61138 1.37467,-2.61168 0.0025,-0.39578 -0.375973,-0.70305 -0.386884,-1.07686 0.206939,-0.88235 0.635105,-1.73465 0.8043,-2.62495 -0.157201,0.1259 -0.314402,0.25174 -0.471601,0.37762 z" id="path28564-1" inkscape:connector-curvature="0" fill="url(#linearGradient3037-6)" fill-rule="evenodd"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/58-2.svg b/htdocs/public/symbols/svgicons/58-2.svg deleted file mode 100755 index d0f70a000dadd9afe368bd54acb16cd9baa938e9..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/58-2.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3063"/> - <path d="m 1.513309,9.830772 20.973382,0 -10.506219,-9.2530367 z" id="path3073" inkscape:connector-curvature="0" fill="#ffffff" stroke="#000000" stroke-linejoin="round" stroke-width="1.155"/> - <path d="m 1.513309,14.169229 20.973382,0 -10.506219,9.253036 z" id="path3073-7" inkscape:connector-curvature="0" fill="#ffffff" stroke="#000000" stroke-linejoin="round" stroke-width="1.155"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/59-1.svg b/htdocs/public/symbols/svgicons/59-1.svg deleted file mode 100755 index 87044873b67afc1ae8c24d31d82c9ddeff5ae29a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/59-1.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24.000001 24" version="1.1" width="24" height="24"> - <g id="g3293" transform="translate(-0.84289,-88.891844)"> - <rect id="rect4140" width="23.04" height="23.04" x="1.322" y="89.37" rx="2.874" fill="#cccccc" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.958"/> - <path inkscape:connector-curvature="0" id="path2400" d="m 11.282037,91.475632 -0.388575,0.310588 1.631833,2.500758 -10.2781321,16.021082 7.6433279,0 0,-0.22604 0,-0.0495 0,-5.06481 5.9054792,0 0,5.06481 0,0.0495 0,0.22604 7.642649,0 -10.277453,-16.028089 1.539832,-2.465269 -0.381342,-0.311041 -1.476313,2.387735 -1.561306,-2.415764 z" fill-rule="evenodd"/> - </g> - <metadata id="metadata7"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/59-2.svg b/htdocs/public/symbols/svgicons/59-2.svg deleted file mode 100755 index 1bbaea57fe3742114fdbdc4e35e16f7d9bcfe791..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/59-2.svg +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24 23.999999" enable-background="new 0 0 100 73.649"> - <metadata id="metadata4391"/> - <rect id="rect4140" width="23.04" height="23.04" x="0.479" y="0.479" rx="2.874" fill="#cccccc" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.958"/> - <g id="g4145" transform="matrix(0.85275463,0,0,0.85275463,1.7669445,1.7669443)"> - <g id="g4139"> - <g id="g4375" transform="matrix(0.24000326,0,0,0.24000326,-1.62e-4,3.161999)" stroke-width="1.25"> - <rect x="19.818" width="61.23" height="7" id="rect4377"/> - <path d="M 50.438,3.489" id="path4379" inkscape:connector-curvature="0"/> - </g> - <polygon points="24.877,73.649 34.42,41.002 66.563,41.002 76.106,73.649 86.308,73.649 76.765,41.002 100,41.002 100,34.648 74.907,34.648 67.677,9.903 57.463,9.903 64.705,34.648 36.279,34.648 43.508,9.903 33.305,9.903 26.076,34.648 0,34.648 0,41.002 24.218,41.002 14.674,73.649 " id="polygon4381" transform="matrix(0.24000326,0,0,0.24000326,-1.62e-4,3.161999)" stroke-width="1.25"/> - </g> - <rect id="rect4383" height="1.338" width="4.44" y="8.946" stroke-width="0.3"/> - <rect id="rect4385" height="1.338" width="4.443" y="8.946" x="19.557" stroke-width="0.3"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/59-83.svg b/htdocs/public/symbols/svgicons/59-83.svg deleted file mode 100755 index ab9312f0469dc07d7f4505f7c36eca9e19484213..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/59-83.svg +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - id="svg869" - width="24" - height="24" - viewBox="0 0 24.000001 24.000001" - sodipodi:docname="59-83.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata875"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs873" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1865" - inkscape:window-height="1025" - id="namedview871" - showgrid="false" - inkscape:zoom="8" - inkscape:cx="1.2886852" - inkscape:cy="22.876366" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg869" /> - <rect - style="fill:#fd0134;fill-opacity:1;stroke:#fd0134;stroke-width:4.81033421;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect887" - width="19.189665" - height="19.189665" - x="2.4051681" - y="2.4051681" /> - <path - style="fill:#60fe61;fill-opacity:1;stroke:#60fe61;stroke-width:1.06600618;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 4.3925127,12.449221 1.7774363,20.348234 22.222581,20.321454 12.624061,3.6665908 11.821709,4.4431037 9.7415332,1.7119202 5.4028832,12.984747 Z" - id="path881" - inkscape:connector-curvature="0" /> - <text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.02321291px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.5646801" - x="3.2019567" - y="18.966843" - id="text909" - transform="scale(0.95198711,1.0504344)"><tspan - sodipodi:role="line" - id="tspan907" - x="3.2019567" - y="18.966843" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.02321291px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#4d4d4d;fill-opacity:1;stroke-width:0.5646801">SOTA</tspan></text> -</svg> diff --git a/htdocs/public/symbols/svgicons/60-1.svg b/htdocs/public/symbols/svgicons/60-1.svg deleted file mode 100755 index 0f4f0a54446fe67970f8c092444cea33840f2a2a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/60-1.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata5140"/> - <g id="layer1" transform="matrix(-0.03993015,0,0,0.03993015,25.603209,2.0469741)"> - <path d="m 438.12826,429.16927 c -62.79839,-3.16426 -155.20224,7.89495 -186.20451,-31.3992 -14.20607,-74.76934 -54.80076,-112.40662 -124.50145,-113.18313 -42.795768,-82.64828 34.88862,-95.59972 87.99076,-116.8342 3.3733,38.41563 1.30629,78.34741 62.06817,100.7695 2.43911,-11.88771 7.42309,-21.59411 23.36684,-21.90641 l 89.81629,0.36511 63.52859,-49.65454 c 10.2664,16.32783 30.63852,37.24918 30.66898,48.92432 l 96.38822,0.36511 c 7.01925,5.97861 12.97283,21.84281 -1.09532,37.60601 -57.74129,-1.75276 -162.68681,4.55533 -142.02657,144.94743 z" id="path4749" inkscape:connector-curvature="0" fill-rule="evenodd"/> - <path d="m 281.45311,113.13794 0.25817,-34.043529 38.12235,-5.174139 0,-27.017909 -38.89686,6.464987 c 2.8605,-24.34011 18.51028,-41.939346 52.98479,-47.0361453 21.6463,1.5255947 44.34631,2.6992313 57.25914,43.1895493 3.78428,16.060343 1.42553,32.309362 -8.54869,46.305931 -32.28759,-17.699463 -56.45288,-5.617153 -78.49798,14.239165 l -22.68092,3.07209 z" id="path5636" inkscape:connector-curvature="0" fill-rule="evenodd"/> - <path d="m 215.04795,186.7383 113.54824,-85.80012 c 15.26233,-8.1407 32.0941,-9.689721 52.21028,2.55575 17.19617,15.62165 46.2444,58.89814 69.37031,88.35586 l -64.62391,48.37667 -62.06818,-86.34778 -98.21375,75.21202 c -7.55995,-13.19498 -9.32895,-28.68129 -10.22299,-42.3524 z" id="path6523" inkscape:connector-curvature="0" fill-rule="evenodd"/> - <path d="m 241.70075,414.19989 a 83.609474,83.609474 0 1 1 -167.218946,0 83.609474,83.609474 0 1 1 167.218946,0 z" transform="matrix(0.974466,0,0,0.974466,-15.37667,-10.08382)" id="path7410" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="35"/> - <path d="m 241.70075,414.19989 a 83.609474,83.609474 0 1 1 -167.218946,0 83.609474,83.609474 0 1 1 167.218946,0 z" transform="matrix(0.974466,0,0,0.974466,388.6178,-9.97323)" id="path8297" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="35"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/60-2.svg b/htdocs/public/symbols/svgicons/60-2.svg deleted file mode 100755 index df54d2efffa38bd8666dbef9fef6c16fb0e948c7..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/60-2.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4230"/> - <path sodipodi:type="star" id="path4774" sodipodi:sides="3" sodipodi:cx="11.694916" sodipodi:cy="5.4915252" sodipodi:r1="5.8528838" sodipodi:r2="2.9264417" sodipodi:arg1="2.0943951" sodipodi:arg2="3.1415927" inkscape:flatsided="true" inkscape:rounded="0" inkscape:randomized="0" d="m 8.7684739,10.560271 0,-10.13749189 L 17.5478,5.4915252 Z" inkscape:transform-center-x="-1.5613875" transform="matrix(1.0670894,0,0,0.99791178,-0.99063412,0.06158974)" fill="#ce0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.969"/> - <path d="m 8.3389831,23.451316 c 0,-22.94192958 0,-22.94192958 0,-22.94192958" id="path4776" inkscape:connector-curvature="0" fill="none" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="0.997"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/61-1.svg b/htdocs/public/symbols/svgicons/61-1.svg deleted file mode 100755 index ee8dffc80ba02e7d90f7463db270f32a34b3e83e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/61-1.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata4204"/> - <path d="m 22.510718,21.63724 1.46589,-0.0155 0.0193,-0.34619 c 0.0216,-0.38726 -0.0381,-0.48381 -0.26398,-0.42712 -0.21942,0.0551 -3.20443,0.0481 -3.25999,-0.007 -0.0274,-0.0274 0.0996,-0.11729 0.28817,-0.20385 0.41002,-0.1882 0.74555,-0.55019 0.89456,-0.96509 l 0.10746,-0.29923 0.68084,-0.0161 c 0.45689,-0.0108 0.69533,-0.0389 0.72488,-0.0855 0.0242,-0.0381 0.0444,-0.39614 0.0449,-0.79563 l 8.7e-4,-0.72632 -0.96592,0 -0.96593,0 -0.23823,-0.40792 c -0.34156,-0.58483 -0.34121,-0.58583 0.21819,-0.60554 0.54303,-0.0191 0.53728,-0.0137 0.70665,-0.66605 0.20711,-0.79771 0.19344,-1.93002 -0.0311,-2.57945 l -0.0736,-0.21295 -2.09649,-0.057 -0.0285,-0.65512 c -0.0264,-0.60729 -0.0368,-0.65518 -0.14242,-0.65594 -0.10492,-7.5e-4 -0.11242,-0.0326 -0.0948,-0.40302 0.0225,-0.47303 -0.0489,-0.78033 -0.24221,-1.04233 -0.13324,-0.18059 -0.13855,-0.21823 -0.10824,-0.7675503 0.0367,-0.66458 -0.012,-0.89871 -0.27949,-1.34473 -0.35742,-0.59596 -0.9847,-0.93219 -1.73944,-0.93235 l -0.41337,-1.1e-4 -0.0625,-0.23229 c -0.13802,-0.51256 -0.48689,-0.95659 -0.93365,-1.18831 -0.34616,-0.17954 -1.04631,-0.20268 -1.45129,-0.048 l -0.31195,0.11918 -0.26381,-0.25984 -0.26381,-0.25984 0.0279,-0.53383 c 0.047,-0.8981 -0.17119,-1.46326 -0.79028,-2.04728 -0.46814,-0.44162 -0.85054,-0.60511 -1.50591,-0.64382 -0.83481,-0.0493 -1.5062997,0.21659 -2.0885697,0.82704 -0.54262,0.56888 -0.74733,1.11194 -0.74429,1.97452 l 0.002,0.57094 -0.22946,0.25785 c -0.1262,0.14181 -0.29596,0.39884 -0.37725,0.57116 -0.19855,0.42093 -0.21119,1.19615 -0.0261,1.60205 0.16421,0.36015 0.49589,0.71251 0.84137,0.89384 0.25293,0.13274 0.3551,0.15149 0.82964,0.15223 0.47916,7.5e-4 0.57864,-0.0175 0.8679997,-0.15964 0.32103,-0.15765 0.44224,-0.16182 0.44224,-0.0153 0,0.14395 0.40534,0.60205 0.67076,0.75807 0.23728,0.13948 0.32659,0.15824 0.75341,0.15824 0.48164,0 0.61286,-0.0369 0.97211,-0.27338 0.14053,-0.0925 0.15351,-0.0907 0.34031,0.0471 0.27709,0.20444 0.58857,0.2731 1.05171,0.23184 l 0.39877,-0.0355 0.10565,0.2578503 c 0.26986,0.65862 1.15817,0.90259 1.75054,0.48079 0.0854,-0.0608 0.18111,-0.11054 0.21273,-0.11054 0.0668,0 1.03577,1.22587 1.03577,1.31042 0,0.0538 -0.0839,0.0808 -0.19113,0.0615 -0.1589,-0.0285 -0.20763,0.13956 -0.20763,0.7161 0,0.42441 -0.0203,0.59936 -0.0712,0.61545 -0.10983,0.0347 -3.08059,0.079 -3.16497,0.0473 -0.041,-0.0154 -0.13393,-0.1624 -0.20655,-0.32661 -0.21226,-0.47995 -0.63416,-0.68266 -1.19992,-0.57652 -0.2599,0.0488 -0.62844,0.37649 -0.71363,0.63461 -0.0356,0.10784 -0.11224,0.22151 -0.17033,0.2526 -0.1525,0.0816 -3.9111197,0.076 -3.9617497,-0.006 -0.0212,-0.0343 -0.0343,-0.32945 -0.0291,-0.65585 0.007,-0.4411 -0.01,-0.60068 -0.0645,-0.62163 l -6.04654,0.0581 -0.0162,0.58391 -0.0162,0.58391 1.07978,0 c 0.12007,0 0.23113,0.0539 0.34418,0.16691 l 0.1669,0.1669 -0.0322,0.81578 c -0.0177,0.44867 -0.0529,1.39988 -0.0784,2.11379 -0.0254,0.71391 -0.0645,1.31633 -0.0868,1.33872 -0.0223,0.0224 -0.58324,0.0535 -1.24651,0.0692 l -1.20593995,0.0285 0,1.5338 1.28695995,-0.0171 c 1.13724,-0.0151 1.29795,-0.006 1.38145,0.0774 0.052,0.052 0.0945,0.13213 0.0945,0.17814 0,0.29978 0.49195,0.88045 0.89818,1.06014 0.14938,0.0661 0.23231,0.13298 0.20218,0.16311 -0.0284,0.0283 -1.30518,0.0577 -2.86864,0.0659 l -1.81477995,0.0148 -0.017,0.35604 L -3.165134e-5,21.68015 9.5530283,21.66655 c 5.8057197,-0.007 11.6366697,-0.0206 12.9576697,-0.0291 z m -12.03256,-0.76773 c -0.0228,-0.0228 0.007,-0.0579 0.0664,-0.0781 0.53186,-0.18093 1.03368,-0.62708 1.16539,-1.03609 0.1147,-0.35619 0.10889,-0.35407 0.97298,-0.35407 l 0.79178,0 0.0618,0.15666 c 0.16732,0.4244 0.23202,0.53921 0.42295,0.75055 0.1136,0.12575 0.34907,0.29605 0.52326,0.37846 0.17419,0.0824 0.28947,0.1665 0.25617,0.18689 -0.0836,0.0512 -4.20925,0.047 -4.26067,-0.004 z m -4.8938197,0.0162 c -0.0182,-0.0295 0.0892,-0.10782 0.23875,-0.17396 0.14957,-0.0661 0.34588,-0.18937 0.43626,-0.27385 0.20979,-0.19612 0.4908,-0.63059 0.4908,-0.75884 0,-0.23615 0.14037,-0.27775 0.93705,-0.27775 0.82655,0 0.82501,-5.8e-4 0.93845,0.3518 0.12063,0.37469 0.42651,0.70687 0.83697,0.90894 0.30209,0.14872 0.35601,0.19403 0.27078,0.22753 -0.16079,0.0632 -4.10988,0.0595 -4.14906,-0.004 z m 9.9387197,-0.0525 c 0,-0.0271 0.11507,-0.0932 0.25572,-0.14689 0.33234,-0.12692 0.71099,-0.49929 0.87225,-0.85777 0.0705,-0.15666 0.14741,-0.31996 0.17098,-0.36288 0.0332,-0.0604 0.21498,-0.077 0.80515,-0.0736 0.41927,0.002 0.77964,0.0248 0.80083,0.0496 0.0212,0.0248 0.0819,0.163 0.13482,0.3071 0.13505,0.36745 0.44132,0.70164 0.80698,0.88054 0.17152,0.0839 0.31185,0.1752 0.31185,0.20286 0,0.0281 -0.91537,0.0503 -2.07929,0.0503 -1.14361,0 -2.07929,-0.0222 -2.07929,-0.0492 z" id="path2371" inkscape:connector-curvature="0"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/61-2.svg b/htdocs/public/symbols/svgicons/61-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/61-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/62-1.svg b/htdocs/public/symbols/svgicons/62-1.svg deleted file mode 100755 index 52f5fc3cdcc47690eecf93147942acf699319a39..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/62-1.svg +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg3445" - inkscape:version="0.91 r13725" - sodipodi:docname="62-1.svg"> - <defs - id="defs3458" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview3456" - showgrid="false" - inkscape:zoom="22.553862" - inkscape:cx="7.665445" - inkscape:cy="12.118826" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg3445" /> - <metadata - id="metadata4277"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <path - style="fill:#e6e6e6;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="M 4.9215517,6.1316637 12.725093,5.9543105 17.690983,10.521156 3.5914026,9.6343896 Z" - id="path4754" - inkscape:connector-curvature="0" /> - <path - d="m 23.726107,14.727561 c 0.150421,-0.941042 -0.0056,-1.022202 -0.62861,-2.409677 C 22.928341,11.941172 22.48121,11.711872 22.119643,11.514631 20.229872,10.483816 18.231174,9.844738 17.924536,9.8383252 16.963911,8.8816782 15.391324,7.0824936 13.28079,5.6432931 12.887083,5.3748215 11.498678,5.333218 11.498678,5.333218 c 0,0 -3.6458442,-0.4365462 -6.3620422,0.2095624 C 4.9023115,5.5984832 4.739452,5.579053 4.5429462,5.6824629 4.5109246,5.6993053 3.9463606,6.2825644 3.914337,6.3459932 3.8830464,6.4079542 3.6981688,6.6097907 3.6349722,6.6952379 3.2158089,7.2618097 2.7020042,7.8211575 2.3427939,8.4413853 2.1850705,8.713797 2.1119849,8.973036 1.9586281,9.2446365 1.8110258,9.5060769 1.274005,9.7072179 1.1903351,10.187532 c -0.04018,0.23046 -0.30227278,0.144318 -0.31432481,0.488927 0.11971043,0.03696 0.13415861,0.0807 0.27936381,0.104764 -0.20998609,0.76358 -0.33885259,2.126644 -0.34997815,2.270266 2.7162e-4,-7.8e-5 5.0275e-4,-1.93e-4 7.7338e-4,-2.71e-4 -0.001778,0.01742 -0.001975,0.01645 -7.7338e-4,2.71e-4 -0.65703938,0.206279 -0.59604534,1.386859 -0.65742557,1.172931 0.078997,0.314208 0.29663197,0.723481 0.3787956,1.061873 0.0703743,0.28991 -0.16332375,0.413561 -0.17464191,0.698451 0.0509954,0.02978 0.10011821,0.342638 0.13968291,0.384126 0.16610513,0.457213 1.46593122,0.871007 1.46593122,0.871007 l 0.1287895,1.55e-4 C 1.9758558,16.9118 1.9158257,16.560199 1.9158257,16.194614 c 0,-1.806061 1.4640793,-3.270137 3.2701393,-3.270137 1.806059,0 3.2701383,1.464076 3.2701383,3.270137 0,0.368444 -0.061001,0.722671 -0.1733292,1.053144 l 6.6407479,0.02127 C 14.768079,16.88803 14.682169,16.4713 14.682169,16.034366 c 0,-1.80602 1.464077,-3.270099 3.270099,-3.270099 1.806061,0 3.270139,1.464079 3.270139,3.270099 0,0.439794 -0.08704,0.859149 -0.244445,1.242156 l 0.26855,3.47e-4 c 0,0 2.007472,0.186616 2.270032,-0.454006 0.107774,-0.120252 0.147717,-0.728581 0.139682,-1.082578 0.0039,-0.364155 0.07741,-0.29389 0.174642,-0.523887 0.09445,-0.223353 -0.139567,-0.386754 -0.104761,-0.488837 z M 8.9525711,9.5012486 C 8.8885181,9.546138 8.8927751,9.5699764 8.8128506,9.6060454 8.5584788,9.7988041 8.4759197,9.5361679 5.1017144,9.5361679 5.15912,9.6180629 4.7067332,9.547408 5.0667889,8.7678372 5.5562179,7.7082043 6.302647,6.7440635 6.2615445,6.7291526 7.2087364,6.4470299 7.5095409,6.357357 8.9526047,6.3942863 8.923329,7.232459 8.9352605,8.1741482 8.9525711,9.5012486 Z m 1.4893799,0.232315 c -0.144666,-2.7488012 -0.274419,-2.8388454 0.03493,-3.2827313 2.779918,0 1.837221,0.00942 1.837221,0.00942 1.271994,0.026081 3.482374,2.7540307 4.141432,3.6575177 -1.85567,-0.1400531 -2.978847,-0.2327805 -6.013583,-0.3842064 z" - id="path6-9" - inkscape:connector-curvature="0" - style="fill:#aa0000;stroke:none;stroke-width:0.29631296;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - sodipodi:nodetypes="ccccscccccccccccccccccccsssccssscccccccccccccccccc" /> - <path - style="fill:#666666;stroke:#000000;stroke-width:1.85782993;stroke-miterlimit:4;stroke-dasharray:none" - id="path3514-1-1" - sodipodi:type="arc" - sodipodi:cx="5.1689858" - sodipodi:cy="16.184412" - sodipodi:rx="1.8473057" - sodipodi:ry="1.8473057" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - d="M 3.3216802,16.184412 A 1.8473057,1.8473057 0 0 1 5.1685426,14.337106 1.8473057,1.8473057 0 0 1 7.0162913,16.183525 1.8473057,1.8473057 0 0 1 5.1703158,18.031717 1.8473057,1.8473057 0 0 1 3.321681,16.186185" - sodipodi:open="true" /> - <path - style="fill:#666666;stroke:#000000;stroke-width:1.85782993;stroke-miterlimit:4;stroke-dasharray:none" - id="path3514-1-1-1" - sodipodi:type="arc" - sodipodi:cx="17.957012" - sodipodi:cy="16.063444" - sodipodi:rx="1.8473057" - sodipodi:ry="1.8473057" - sodipodi:start="3.1415927" - sodipodi:end="3.1406327" - d="m 16.109707,16.063444 a 1.8473057,1.8473057 0 0 1 1.846862,-1.847305 1.8473057,1.8473057 0 0 1 1.847749,1.846419 1.8473057,1.8473057 0 0 1 -1.845976,1.848191 1.8473057,1.8473057 0 0 1 -1.848635,-1.845532" - sodipodi:open="true" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/62-2.svg b/htdocs/public/symbols/svgicons/62-2.svg deleted file mode 100755 index 91b345b55d332f5976d50fc43d7b3ada26892be3..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/62-2.svg +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.1" width="24" height="24"> - <defs id="defs4"> - <linearGradient id="linearGradient3759"> - <stop id="stop3761" stop-color="#1a1a1a"/> - <stop id="stop3763" stop-color="#f30000" stop-opacity="0" offset="1"/> - </linearGradient> - <linearGradient id="linearGradient4149" y2="834.68" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="848.16" gradientTransform="translate(8.3085,-2.6518)" y1="842.3" x1="871.33"/> - <linearGradient id="linearGradient4153" y2="533.5" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="812.14" gradientTransform="matrix(0.89332,0,0,0.89332,80.349,365.15)" y1="537.5" x1="879.9"/> - <linearGradient id="linearGradient4155" y2="531.91" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="815.82" gradientTransform="translate(27.625,296.49)" y1="537.5" x1="879.9"/> - <linearGradient id="linearGradient4185" y2="834.68" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="848.16" gradientTransform="matrix(1,0,0,-1,8.3085,1452)" y1="842.3" x1="871.33"/> - <linearGradient id="linearGradient4187" y2="528.42" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="876.14" gradientTransform="matrix(1,0,0,-1,21.438,1151.5)" y1="528.36" x1="887.9"/> - <linearGradient id="linearGradient4189" y2="531.91" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="815.82" gradientTransform="matrix(1,0,0,-1,27.625,1152.9)" y1="537.5" x1="879.9"/> - <linearGradient id="linearGradient4191" y2="535.37" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="883.76" gradientTransform="matrix(1,0,0,-1,21.438,1151.5)" y1="542.4" x1="897.22"/> - <linearGradient id="linearGradient4193" y2="501.08" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="835.99" gradientTransform="matrix(1,0,0,-1,21.438,1151.5)" y1="552.05" x1="880.71"/> - <linearGradient id="linearGradient4195" y2="529.61" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="805.29" gradientTransform="matrix(0.89332,0,0,-0.89332,94.156,1087.8)" y1="528.36" x1="887.9"/> - <linearGradient id="linearGradient4197" y2="533.5" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="812.14" gradientTransform="matrix(0.89332,0,0,-0.89332,80.349,1084.2)" y1="537.5" x1="879.9"/> - <linearGradient id="linearGradient4199" y2="867.68" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="205.59" gradientTransform="matrix(0.99043,-0.13799,-0.13799,-0.99043,146.05,1483.3)" y1="873.14" x1="229.7"/> - <linearGradient id="linearGradient4201" y2="872.65" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="216.56" gradientTransform="matrix(0.99043,-0.13799,-0.13799,-0.99043,156.31,1482)" y1="873.06" x1="238.83"/> - <linearGradient id="linearGradient4203" y2="528.42" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="876.14" gradientTransform="translate(21.438,297.91)" y1="528.36" x1="887.9"/> - <linearGradient id="linearGradient4205" y2="535.37" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="883.76" gradientTransform="translate(21.438,297.91)" y1="542.4" x1="897.22"/> - <linearGradient id="linearGradient4207" y2="501.08" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="835.99" gradientTransform="translate(21.438,297.91)" y1="552.05" x1="880.71"/> - <linearGradient id="linearGradient4209" y2="529.61" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="805.29" gradientTransform="matrix(0.89332,0,0,0.89332,94.156,361.57)" y1="528.36" x1="887.9"/> - <linearGradient id="linearGradient4211" y2="867.68" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="205.59" gradientTransform="matrix(0.99043,0.13799,-0.13799,0.99043,146.05,-33.885)" y1="873.14" x1="229.7"/> - <linearGradient id="linearGradient4213" y2="872.65" xlink:href="#linearGradient3759" gradientUnits="userSpaceOnUse" x2="216.56" gradientTransform="matrix(0.99043,0.13799,-0.13799,0.99043,156.31,-32.603)" y1="873.06" x1="238.83"/> - </defs> - <metadata id="metadata60"/> - <rect id="rect4814" width="2.207" height="4.682" x="2.903" y="3.318" rx="0.943" fill="#1a1a1a" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.3"/> - <rect id="rect4814-1" width="2.207" height="4.682" x="18.829" y="3.318" rx="0.943" fill="#1a1a1a" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.3"/> - <rect id="rect4814-2" width="2.207" height="4.682" x="2.85" y="16.818" rx="0.943" fill="#1a1a1a" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.3"/> - <rect id="rect4814-7" width="2.207" height="4.682" x="18.918" y="16.818" rx="0.943" fill="#1a1a1a" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.3"/> - <g id="g4179" transform="matrix(1.0127361,0,0,1,-0.15244214,0)"> - <path inkscape:connector-curvature="0" d="m 2.9101531,10.06761 c 3.542e-4,0.03757 0.011999,0.117586 0.036894,0.161112 l 0.05903,0.08717 1.4142901,-0.215595 0.011068,3.108568 c 1.968e-4,0.06068 -5.51e-4,0.121732 -0.00123,0.182905 -0.00135,0.12234 -0.00411,0.245699 -0.00861,0.36971 -0.00658,0.181633 -0.016248,0.365352 -0.028285,0.549485 -6.454e-4,0.0099 -0.0018,0.01971 -0.00246,0.02958 -0.0248,0.371902 -0.058704,0.747366 -0.095924,1.12156 -0.050479,0.506247 -0.1065459,1.009207 -0.1524952,1.497472 -0.034053,0.36184 -0.062163,0.715611 -0.078707,1.055409 -0.011363,0.233353 -0.017967,0.459872 -0.015987,0.678699 9.72e-4,0.107491 0.00367,0.213393 0.00861,0.316785 0.00494,0.103381 0.013982,0.208718 0.025826,0.315215 0.00592,0.05325 0.012209,0.106545 0.019677,0.160333 0.022369,0.161117 0.052002,0.324904 0.086086,0.488016 3.93e-5,2.51e-4 -3.94e-5,5.25e-4 0,7.77e-4 0.022769,0.108903 0.048228,0.217146 0.075016,0.325327 0.026789,0.108191 0.055009,0.216023 0.084854,0.322214 0.029776,0.105945 0.061604,0.210967 0.093465,0.313672 7.87e-5,2.49e-4 -7.87e-5,5.28e-4 0,7.77e-4 0.015972,0.05147 0.031647,0.101361 0.047964,0.151772 0.048861,0.150967 0.099014,0.297233 0.1488039,0.435862 7.87e-5,2.51e-4 -7.87e-5,5.25e-4 0,7.77e-4 0.03325,0.09256 0.065925,0.181498 0.098384,0.266972 0.06487,0.170952 0.1272932,0.326647 0.1832383,0.46154 0.083922,0.20233 0.1545495,0.358204 0.196768,0.450656 0.028169,0.06161 0.044273,0.09496 0.044273,0.09496 l 0.1475761,0.340894 c 0.00979,0.02248 0.027268,0.04429 0.051652,0.06538 0.00828,0.0072 0.017155,0.01401 0.027056,0.02102 0.038551,0.02739 0.08936,0.05357 0.1512674,0.07861 2.755e-4,1.25e-4 9.563e-4,-1.24e-4 0.00123,0 0.030882,0.01246 0.06456,0.02547 0.1008437,0.03736 3.148e-4,10e-5 9.13e-4,-10e-5 0.00123,0 0.036351,0.01189 0.075331,0.02369 0.116833,0.03502 3.542e-4,10e-5 8.736e-4,-9.9e-5 0.00123,0 0.3348796,0.09133 0.8315812,0.164881 1.4253484,0.222599 3.936e-4,2.5e-5 8.343e-4,-2.5e-5 0.00123,0 0.00921,8.94e-4 0.019024,0.0014 0.028285,0.0023 0.1311065,0.01257 0.2675337,0.02471 0.4070737,0.0358 0.00955,7.6e-4 0.0187,0.0016 0.028285,0.0023 0.1591145,0.01249 0.322798,0.02358 0.4907002,0.03425 3.935e-4,2.4e-5 8.303e-4,-2.5e-5 0.00123,0 0.08376,0.0053 0.1690159,0.01069 0.2545706,0.01557 3.936e-4,2.3e-5 8.225e-4,-2.3e-5 0.00123,0 0.085567,0.0049 0.1711567,0.0096 0.258258,0.01401 3.936e-4,2.1e-5 8.225e-4,-2e-5 0.00123,0 0.1746355,0.0089 0.3520495,0.01689 0.5312737,0.02413 3.975e-4,1.7e-5 8.225e-4,-1.6e-5 0.00123,0 0.5385148,0.02173 1.093597,0.03635 1.635615,0.04436 4.09e-4,7e-6 8.14e-4,-5e-6 0.0012,0 0.361636,0.0053 0.716747,0.0078 1.058887,0.0078 0.03808,0 0.07725,-6.85e-4 0.115601,-7.77e-4 0.03835,10e-5 0.07752,7.77e-4 0.115602,7.77e-4 0.342108,0 0.697227,-0.0024 1.058848,-0.0078 4.13e-4,-6e-6 8.18e-4,6e-6 0.0012,0 0.542056,-0.008 1.0971,-0.02263 1.635614,-0.04436 4.06e-4,-1.7e-5 8.31e-4,1.6e-5 0.0012,0 0.179224,-0.0072 0.356638,-0.01522 0.531274,-0.02413 4.05e-4,-2.1e-5 8.3e-4,2.1e-5 0.0012,0 0.0871,-0.0044 0.172691,-0.0091 0.258258,-0.01401 4.05e-4,-2.3e-5 8.3e-4,2.3e-5 0.0012,0 0.08555,-0.0049 0.17081,-0.01025 0.25457,-0.01557 4.02e-4,-2.5e-5 8.31e-4,2.5e-5 0.0012,0 0.167894,-0.01067 0.331578,-0.02175 0.4907,-0.03425 0.0096,-7.52e-4 0.01874,-0.0016 0.02829,-0.0023 0.139532,-0.0111 0.275959,-0.02323 0.407073,-0.0358 0.0093,-8.87e-4 0.01907,-0.0014 0.02829,-0.0023 3.93e-4,-2.5e-5 8.46e-4,5e-5 0.0012,0 0.593728,-0.05772 1.090449,-0.131266 1.425348,-0.222598 3.54e-4,-10e-5 8.89e-4,9.9e-5 0.0012,0 0.0415,-0.01133 0.08048,-0.02313 0.116833,-0.03502 3.15e-4,-9.9e-5 9.09e-4,10e-5 0.0012,0 0.03628,-0.01189 0.06996,-0.0249 0.100843,-0.03736 2.76e-4,-1.25e-4 9.53e-4,1.24e-4 0.0012,0 0.06191,-0.02504 0.112717,-0.05122 0.151268,-0.07861 0.0099,-0.007 0.01877,-0.01385 0.02706,-0.02101 0.02438,-0.02109 0.04187,-0.0429 0.05165,-0.06538 l 0.147576,-0.340893 c 0,0 0.0161,-0.03335 0.04427,-0.09496 0.04222,-0.09243 0.112846,-0.248317 0.196768,-0.450656 0.05595,-0.134886 0.118368,-0.290583 0.183238,-0.461541 0.03246,-0.08546 0.06513,-0.1744 0.09838,-0.266972 7.9e-5,-2.54e-4 -7.9e-5,-5.25e-4 0,-7.77e-4 0.04979,-0.138631 0.09994,-0.284879 0.148804,-0.435862 0.01631,-0.05041 0.03199,-0.100305 0.04796,-0.151772 7.9e-5,-2.51e-4 -7.9e-5,-5.28e-4 0,-7.77e-4 0.03186,-0.102694 0.06369,-0.207717 0.09347,-0.313671 0.02985,-0.106201 0.05807,-0.214033 0.08485,-0.322214 0.02679,-0.108191 0.05225,-0.216432 0.07502,-0.325328 3.9e-5,-2.54e-4 -3.9e-5,-5.25e-4 0,-7.77e-4 0.03409,-0.163102 0.06372,-0.326896 0.08609,-0.488016 0.0075,-0.05379 0.01375,-0.107082 0.01968,-0.160332 0.01184,-0.1065 0.02089,-0.211837 0.02583,-0.315216 0.0049,-0.103381 0.0076,-0.209283 0.0086,-0.316784 0.002,-0.218825 -0.0046,-0.445351 -0.01599,-0.6787 -0.01655,-0.339773 -0.04465,-0.693568 -0.07871,-1.055408 -0.04595,-0.488265 -0.102017,-0.991225 -0.152496,-1.497473 -0.03722,-0.374193 -0.07112,-0.749632 -0.09592,-1.12156 -6.61e-4,-0.0099 -0.0018,-0.01972 -0.0025,-0.02958 -0.01204,-0.184143 -0.0217,-0.367868 -0.02829,-0.549485 -0.0045,-0.124002 -0.0073,-0.24736 -0.0086,-0.369711 -6.77e-4,-0.06117 -0.0014,-0.122223 -0.0012,-0.182905 l 0.01107,-3.108568 1.41429,0.215595 0.05903,-0.08717 c 0.0249,-0.04353 0.03654,-0.123538 0.03689,-0.161112 1.97e-4,-0.02114 -0.0029,-0.04371 -0.0098,-0.06694 -0.0023,-0.00774 -0.0056,-0.01553 -0.0086,-0.02335 -0.003,-0.00759 -0.0062,-0.015755 -0.0098,-0.02335 -0.0076,-0.015652 -0.01659,-0.031469 -0.02706,-0.0467 -0.03123,-0.045367 -0.07601,-0.088024 -0.130359,-0.1190825 -4.21e-4,-2.49e-4 -8.1e-4,-5.404e-4 -0.0012,-7.77e-4 -0.02746,-0.015562 -0.05711,-0.027703 -0.08977,-0.03658 l -1.23224,-0.3027622 0.0098,-2.7382096 c 0.01471,-0.018603 0.02932,-0.036764 0.04304,-0.05526 0.05508,-0.074201 0.102202,-0.1472217 0.142657,-0.2202622 0.02017,-0.036421 0.03839,-0.072672 0.05534,-0.1089655 0.05933,-0.1270227 0.100411,-0.2537464 0.127899,-0.3821638 0.01572,-0.073379 0.02731,-0.1475929 0.03567,-0.2225985 0.0042,-0.037502 0.0071,-0.075566 0.0098,-0.113633 0.0055,-0.076139 0.0084,-0.1528904 0.0098,-0.2319383 0.0029,-0.1580934 0,-0.3232602 0,-0.498128 0,-0.2592756 -0.02091,-0.5061479 -0.06149,-0.7417375 -0.01623,-0.094233 -0.03532,-0.1865764 -0.0578,-0.2770837 -0.04496,-0.1810098 -0.103063,-0.3543683 -0.172172,-0.5206932 -0.01728,-0.041579 -0.03537,-0.08308 -0.05411,-0.1237525 -0.05623,-0.1220164 -0.11906,-0.2394202 -0.188157,-0.353347 -0.02303,-0.037977 -0.04567,-0.075765 -0.0701,-0.1128559 -0.04885,-0.074179 -0.100627,-0.1464995 -0.154955,-0.217149 -0.02716,-0.035325 -0.05512,-0.070622 -0.08363,-0.1050726 -0.05701,-0.068901 -0.117274,-0.1361583 -0.179551,-0.2015849 -0.03114,-0.032715 -0.0635,-0.064659 -0.09592,-0.096512 -0.162141,-0.159259 -0.339445,-0.3079178 -0.532494,-0.445974 -0.154246,-0.1103005 -0.317969,-0.2142324 -0.4907,-0.31133 -2.36e-4,-1.246e-4 -0.001,1.245e-4 -0.0012,0 -0.04301,-0.02417 -0.08625,-0.048244 -0.130359,-0.071606 -2.36e-4,-1.246e-4 -9.88e-4,1.245e-4 -0.0012,0 -0.04411,-0.023355 -0.08885,-0.046717 -0.134046,-0.06927 -2.36e-4,-1.245e-4 -9.8e-4,1.245e-4 -0.0012,0 C 17.4713,1.1610661 17.331173,1.0966184 17.185561,1.035929 c -2.75e-4,-1.245e-4 -9.44e-4,1.245e-4 -0.0012,0 -0.04835,-0.020145 -0.09698,-0.04057 -0.146348,-0.0599298 -3.15e-4,-1.2453e-4 -9.37e-4,1.2453e-4 -0.0012,0 -0.148682,-0.0582934 -0.301153,-0.11374255 -0.458706,-0.16500241 -3.14e-4,-9.963e-5 -9.09e-4,9.962e-5 -0.0012,0 -0.05231,-0.0170108 -0.105393,-0.0335664 -0.158643,-0.0498128 -3.14e-4,-9.963e-5 -9.01e-4,9.962e-5 -0.0012,0 -0.05326,-0.01624 -0.10692,-0.0327768 -0.161106,-0.0482561 -3.54e-4,-9.963e-5 -8.94e-4,9.962e-5 -0.0012,0 -0.108714,-0.0310433 -0.21848,-0.0607218 -0.330814,-0.0887291 -3.55e-4,-9.963e-5 -8.82e-4,9.962e-5 -0.0012,0 -0.056,-0.0139533 -0.112843,-0.0272675 -0.169713,-0.0404729 -3.54e-4,-7.472e-5 -8.73e-4,7.472e-5 -0.0012,0 -0.05687,-0.0132009 -0.11444,-0.0264581 -0.172172,-0.0389162 -0.05774,-0.012453 -0.116053,-0.0248671 -0.174631,-0.03658 -3.54e-4,-7.472e-5 -8.66e-4,7.472e-5 -0.0012,0 -0.05858,-0.0117092 -0.117687,-0.0232713 -0.177091,-0.0342463 -3.94e-4,-7.472e-5 -8.54e-4,7.472e-5 -0.0012,0 -0.05941,-0.01097 -0.119336,-0.0216708 -0.179551,-0.0319101 -3.94e-4,-7.472e-5 -8.54e-4,7.472e-5 -0.0012,0 -0.181424,-0.0308366 -0.366225,-0.0589883 -0.55465,-0.08328 l -0.0012,0 c -0.06255,-0.00806 -0.126105,-0.0152228 -0.18939,-0.0225727 l -0.0012,0 c -0.445404,-0.0516733 -0.907572,-0.0862285 -1.385994,-0.10351598 -4.06e-4,-1.245e-5 -8.31e-4,1.494e-5 -0.0012,0 -0.068,-0.002441 -0.136782,-0.004451 -0.205379,-0.006227 -4.05e-4,-9.96e-6 -8.3e-4,9.96e-6 -0.0012,0 -0.137615,-0.003552 -0.275758,-0.006144 -0.415652,-0.007004 -4.06e-4,0 -8.31e-4,2.49e-6 -0.0012,0 -0.07017,-4.2341e-4 -0.140807,-2.4906e-4 -0.211526,0 -0.02502,0 -0.05003,5.4794e-4 -0.07502,7.721e-4 -0.02498,-2.4906e-4 -0.05,-7.721e-4 -0.07502,-7.721e-4 -0.07072,-2.4906e-4 -0.141358,-4.2341e-4 -0.211525,0 -4.02e-4,2.49e-6 -8.23e-4,0 -0.0012,0 -0.139914,8.4682e-4 -0.278057,0.003452 -0.415653,0.007004 -4.01e-4,9.96e-6 -8.22e-4,-9.96e-6 -0.0012,0 -0.0686,0.001768 -0.137375,0.003786 -0.205378,0.006227 -4.02e-4,1.494e-5 -8.23e-4,-1.245e-5 -0.0012,0 -0.478422,0.0172875 -0.940552,0.0518427 -1.3859949,0.10351598 l -0.00123,0 c -0.063284,0.00735 -0.1268406,0.014513 -0.1893892,0.0225727 l -0.00123,0 c -0.1884172,0.0242934 -0.3732139,0.0524434 -0.5546498,0.08328 -3.935e-4,7.472e-5 -8.382e-4,-7.472e-5 -0.00123,0 -0.060215,0.0102403 -0.1201427,0.0209411 -0.1795509,0.0319101 -3.935e-4,7.472e-5 -8.382e-4,-7.472e-5 -0.00123,0 -0.059404,0.0109745 -0.1185095,0.0225365 -0.1770913,0.0342463 -3.542e-4,7.472e-5 -8.776e-4,-7.472e-5 -0.00123,0 -0.058578,0.011714 -0.116896,0.0241281 -0.1746316,0.03658 -0.057732,0.0124574 -0.1152983,0.0257159 -0.1721721,0.0389162 -3.542e-4,7.472e-5 -8.776e-4,-7.472e-5 -0.00123,0 -0.05687,0.0132056 -0.1137162,0.0265203 -0.1697125,0.0404729 -3.541e-4,9.962e-5 -8.775e-4,-9.963e-5 -0.00123,0 -0.1123388,0.0280048 -0.2221039,0.0576857 -0.3308143,0.0887291 -3.148e-4,9.962e-5 -8.776e-4,-9.963e-5 -0.00123,0 -0.054182,0.0154788 -0.1078486,0.0320147 -0.1611059,0.0482561 -3.148e-4,9.962e-5 -9.169e-4,-9.963e-5 -0.00123,0 -0.053253,0.016245 -0.1063374,0.0328017 -0.1586423,0.0498128 -3.148e-4,9.962e-5 -9.169e-4,-9.963e-5 -0.00123,0 -0.157564,0.0512624 -0.3100356,0.10670898 -0.4587057,0.16500241 -2.754e-4,1.2453e-4 -9.169e-4,-1.2453e-4 -0.00123,0 -0.049361,0.0193605 -0.097998,0.0397855 -0.1463482,0.0599298 -2.755e-4,1.245e-4 -9.524e-4,-1.245e-4 -0.00123,0 -0.1456045,0.060689 -0.2857309,0.1251372 -0.4218314,0.1930221 -2.361e-4,1.245e-4 -9.956e-4,-1.245e-4 -0.00123,0 -0.045198,0.022552 -0.089935,0.045915 -0.1340463,0.06927 -2.361e-4,1.245e-4 -9.956e-4,-1.246e-4 -0.00123,0 -0.044111,0.023362 -0.087349,0.047434 -0.1303589,0.071606 -2.361e-4,1.245e-4 -9.956e-4,-1.246e-4 -0.00123,0 -0.172719,0.097093 -0.3364458,0.2010245 -0.4907001,0.31133 -0.193061,0.1380562 -0.3703647,0.2867225 -0.5324937,0.445974 -0.032428,0.031853 -0.064784,0.063798 -0.095925,0.096512 -0.062552,0.065425 -0.12281,0.1326822 -0.1798255,0.2015833 C 4.799052,2.4596769 4.7710988,2.4949743 4.743933,2.530299 4.6896014,2.600951 4.6378317,2.6732692 4.5889781,2.747448 4.5645509,2.7845386 4.5419112,2.8223266 4.5188815,2.8603039 4.4497844,2.9742407 4.3869485,3.091642 4.330724,3.2136509 4.3119814,3.2543231 4.2938902,3.2958246 4.2766128,3.3374034 4.2075039,3.5037208 4.1494022,3.6770769 4.1044407,3.8580966 4.0819596,3.9486015 4.0628755,4.0409444 4.0466382,4.1351803 4.0060016,4.37076 3.985097,4.6176422 3.985097,4.8769178 c 0,0.1748529 -0.00292,0.3400221 0,0.498128 0.00146,0.079048 0.00433,0.1557995 0.00984,0.2319383 0.00275,0.038069 0.00566,0.076134 0.00984,0.113633 0.00836,0.075006 0.01995,0.1492192 0.035664,0.2225985 0.027488,0.1284074 0.068574,0.2551411 0.1278992,0.3821638 0.016952,0.036294 0.035169,0.072545 0.055339,0.1089655 0.040456,0.073043 0.087581,0.1460635 0.1426568,0.2202622 0.01372,0.018497 0.028329,0.036657 0.043045,0.05526 l 0.00984,2.7382096 -1.2322402,0.3027622 c -0.032663,0.00888 -0.062313,0.021019 -0.089774,0.03658 -4.132e-4,2.49e-4 -8.107e-4,5.305e-4 -0.00123,7.77e-4 -0.054351,0.031058 -0.099132,0.073715 -0.1303589,0.1190825 -0.010466,0.015229 -0.019458,0.031046 -0.027056,0.0467 -0.00367,0.00759 -0.00686,0.015763 -0.00984,0.02335 -0.00306,0.00782 -0.00631,0.015613 -0.00861,0.023351 -0.00692,0.02322 -0.010035,0.0458 -0.00984,0.06694 z" id="path3855" stroke="#191919" fill-opacity="0.996" stroke-width="0.436"/> - <path inkscape:connector-curvature="0" d="m 2.9101531,10.06761 c 3.542e-4,0.03757 0.012047,0.117586 0.036894,0.161112 l 0.05903,0.08717 1.4105908,-0.215595 0.011068,3.108568 c 0.00651,1.941777 -0.4527239,4.147413 -0.3738592,5.801447 0.078853,1.654084 1.101901,3.788762 1.101901,3.788762 l 0.1488039,0.340894 c 0.2084285,0.479473 3.8317429,0.640543 6.5633944,0.640543 0.0438,0 0.08867,-6.65e-4 0.132819,-7.77e-4 0.04415,1.24e-4 0.08902,7.77e-4 0.132818,7.77e-4 2.731692,0 6.354821,-0.161077 6.563395,-0.640543 l 0.148804,-0.340894 c 0,0 1.023037,-2.134752 1.101901,-3.788762 0.07885,-1.654083 -0.380368,-3.859744 -0.373859,-5.801447 l 0.01107,-3.108568 1.410591,0.215595 0.05903,-0.08717 c 0.02485,-0.04353 0.03654,-0.123535 0.03689,-0.161112 1.97e-4,-0.02114 -0.0029,-0.04371 -0.0098,-0.06694 -0.0023,-0.00774 -0.0056,-0.015529 -0.0086,-0.023349 -0.003,-0.00759 -0.0062,-0.015755 -0.0098,-0.02335 -0.0076,-0.015652 -0.01661,-0.031469 -0.02706,-0.046699 -0.03117,-0.045367 -0.07488,-0.088024 -0.129127,-0.1190824 -4.21e-4,-2.491e-4 -8.18e-4,-5.405e-4 -0.0012,-7.771e-4 -0.02741,-0.015562 -0.05717,-0.027703 -0.08977,-0.03658 l -1.2298,-0.3027622 0.0098,-2.7382096 c 0.469961,-0.5952629 0.421831,-1.1335151 0.421831,-1.8329367 0,-3.3187778 -3.407471,-4.67318829 -7.92503,-4.65749726 -0.0307,0 -0.06161,4.7322e-4 -0.09224,7.721e-4 -0.03062,-2.9888e-4 -0.06153,-7.721e-4 -0.09224,-7.721e-4 C 7.3909335,0.20378424 3.9833044,1.558125 3.9833044,4.8769277 c 0,0.6994216 -0.048153,1.2376738 0.4218314,1.8329367 l 0.00984,2.7382096 -1.2298003,0.3027622 c -0.032602,0.00888 -0.062364,0.021019 -0.089774,0.03658 -4.093e-4,2.49e-4 -8.107e-4,5.305e-4 -0.00123,7.771e-4 -0.054249,0.031058 -0.097959,0.073715 -0.1291271,0.1190824 -0.010446,0.01523 -0.019473,0.031046 -0.027056,0.046699 -0.00366,0.00759 -0.00687,0.015763 -0.00984,0.02335 -0.00305,0.00782 -0.00631,0.015611 -0.00861,0.023349 -0.00691,0.02322 -0.010035,0.0458 -0.00984,0.06694 z" id="path2853" fill="#ca0000" fill-opacity="0.996"/> - <path inkscape:connector-curvature="0" d="m 16.046782,0.64053789 0.02337,0.12686573 C 16.169032,1.304012 17.092515,1.706076 18.21614,1.7457519 l 0.280394,0.00934 -0.190621,-0.1307561 C 17.728202,1.2285977 17.026645,0.91940962 16.23001,0.69268666 l -0.182994,-0.0520544 z" id="path3707" fill="#212121" stroke="#191919" color="#000000" stroke-width="0.156"/> - <path inkscape:connector-curvature="0" d="M 7.9552859,0.64053789 7.9319197,0.76740362 C 7.8330359,1.304012 6.9095523,1.706076 5.785928,1.7457519 L 5.5055335,1.7550916 5.6961546,1.6243355 C 6.2738656,1.2285977 6.9754224,0.91940962 7.7720575,0.69268666 l 0.1832383,-0.0521465 z" id="path4161" fill="#212121" stroke="#191919" color="#000000" stroke-width="0.156"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/63-1.svg b/htdocs/public/symbols/svgicons/63-1.svg deleted file mode 100755 index 0aa40f1fc8b7f54d7de3525d982facd32fef6d29..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/63-1.svg +++ /dev/null @@ -1,99 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.1" width="24" height="24"> - <defs id="defs55"> - <linearGradient gradientTransform="matrix(0.07561054,0,0,0.07561054,418.95066,390.49482)" x2="0" y1="53.39" gradientUnits="userSpaceOnUse" y2="6.431" id="XMLID_3_"> - <stop id="stop4284" stop-color="#ffffff"/> - <stop id="stop4286" offset="0.386" stop-color="#fdfdfe"/> - <stop id="stop4288" offset="0.561" stop-color="#f6f8fb"/> - <stop id="stop4290" offset="0.693" stop-color="#e9edf5"/> - <stop id="stop4292" offset="0.804" stop-color="#d7dfee"/> - <stop id="stop4294" offset="0.901" stop-color="#bfcee4"/> - <stop id="stop4296" offset="0.988" stop-color="#a3bad9"/> - <stop id="stop4298" offset="1" stop-color="#9eb6d7"/> - </linearGradient> - <linearGradient gradientTransform="matrix(0.07561054,0,0,0.07561054,418.95066,390.49482)" x2="0" y1="93.1" gradientUnits="userSpaceOnUse" y2="2.985" id="XMLID_2_"> - <stop id="stop4276" stop-color="#4041c5"/> - <stop id="stop4278" offset="1" stop-color="#5f86a2"/> - </linearGradient> - <radialGradient id="XMLID_1_" gradientUnits="userSpaceOnUse" cy="126.75" cx="42.36" r="91.43" gradientTransform="matrix(-0.07561054,0,0,0.07561054,416.50935,390.49482)"> - <stop id="stop12" stop-color="#e3ebef"/> - <stop offset="1" id="stop14"/> - </radialGradient> - <linearGradient id="linearGradient4280" y2="2.985" gradientUnits="userSpaceOnUse" y1="93.1" x2="0" gradientTransform="matrix(0.07561054,0,0,0.07561054,418.95066,390.49482)"> - <stop id="stop21" stop-color="#e3ebef"/> - <stop offset="1" id="stop23" stop-color="#5f86a2"/> - </linearGradient> - <radialGradient id="radialGradient4205" gradientUnits="userSpaceOnUse" cy="126.75" cx="42.36" r="91.43"> - <stop id="stop4207" stop-color="#e3ebef"/> - <stop offset="1" id="stop4209"/> - </radialGradient> - <linearGradient id="linearGradient4213" y2="2.985" gradientUnits="userSpaceOnUse" y1="93.1" x2="0"> - <stop id="stop4215" stop-color="#e3ebef"/> - <stop offset="1" id="stop4217" stop-color="#5f86a2"/> - </linearGradient> - <linearGradient id="linearGradient4220" y2="6.431" gradientUnits="userSpaceOnUse" y1="53.39" x2="0"> - <stop id="stop4222" stop-color="#ffffff"/> - <stop offset="0.386" id="stop4224" stop-color="#fdfdfe"/> - <stop offset="0.561" id="stop4226" stop-color="#f6f8fb"/> - <stop offset="0.693" id="stop4228" stop-color="#e9edf5"/> - <stop offset="0.804" id="stop4230" stop-color="#d7dfee"/> - <stop offset="0.901" id="stop4232" stop-color="#bfcee4"/> - <stop offset="0.988" id="stop4234" stop-color="#a3bad9"/> - <stop offset="1" id="stop4236" stop-color="#9eb6d7"/> - </linearGradient> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_2_" id="linearGradient4358" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.07561054,0,0,0.07561054,416.50935,390.49482)" y1="93.1" x2="0" y2="2.985"/> - </defs> - <g id="layer1" inkscape:label="Capa 1" inkscape:groupmode="layer" transform="translate(-405.73,-376.36)"> - <g id="g4374" transform="matrix(0.98735242,0,0,0.98735242,5.2338987,4.8592025)"> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g14" fill="#c7c7c7" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 5903,2361 c 50,82 34,3995 -31,4149 -51,122 -1703,1495 -1789,1531 -1117,-7 -1870,-414 -1995,-629 -48,-270 -7,-4433 38,-4520 40,-76 2153,-833 2227,-851 67,-15 1493,229 1550,320 z" id="path16"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g18" fill="#000000" stroke="#000000" stroke-width="50.43"> - <path inkscape:connector-curvature="0" d="m 5881,2374 2,-1 -2,2 c 0,-1 -1,-1 -1,-1 l 0,-2 7,-3 -2,2 -5,1 5,-1 -2,2 -2,1 z m 2,-1 2,-2 2,-2 5,-2 -5,4 5,-4 1,0 -6,3 0,1 0,-1 -4,3 z m 10,-6 -1,0 1,0 -1,0 11,-6 -10,5 0,1 z m 11,-4 -11,4 0,-1 11,-3 z m 20,-15 c -2,-3 -4,-6 -7,-9 -2,-3 -5,-5 -8,-7 -5,-4 -12,-8 -20,-12 -7,-4 -15,-7 -24,-11 -9,-4 -19,-7 -30,-11 -21,-8 -47,-16 -75,-24 -29,-8 -61,-16 -95,-25 -136,-34 -313,-72 -494,-106 -181,-35 -364,-66 -511,-90 -73,-11 -138,-21 -189,-27 -25,-3 -47,-6 -65,-8 -9,-1 -17,-1 -24,-2 -4,0 -7,0 -10,-1 l -9,0 c -3,0 -5,0 -7,1 l -4,0 c -2,0 -3,0 -4,1 -2,0 -4,1 -7,2 -2,0 -5,1 -8,2 -3,1 -7,2 -11,3 -4,2 -8,3 -13,5 -10,3 -22,7 -35,12 -13,4 -28,9 -44,15 -33,11 -71,25 -115,40 -43,15 -91,32 -144,51 -209,75 -481,173 -753,274 -271,101 -542,203 -747,285 -51,21 -98,40 -140,57 -43,18 -80,34 -111,48 -16,7 -30,14 -42,20 -13,6 -24,12 -33,17 -5,2 -9,5 -13,7 -4,3 -8,5 -10,7 -4,3 -7,5 -9,7 -5,4 -7,8 -9,11 -1,2 -2,5 -4,9 0,3 -1,6 -1,9 -1,3 -1,7 -2,11 -1,4 -1,8 -2,13 0,9 -1,20 -3,32 0,13 -1,27 -2,42 -2,31 -4,69 -6,111 -2,43 -4,91 -5,144 -7,213 -14,504 -19,835 -11,662 -19,1482 -19,2144 0,308 2,583 5,791 1,52 2,100 3,143 1,43 3,82 4,115 1,34 3,62 4,85 1,12 2,22 3,30 1,5 1,9 1,13 1,3 2,7 2,10 l 1,4 2,4 c 9,15 20,30 33,46 14,16 30,32 48,49 35,32 80,66 135,101 107,70 249,142 423,207 173,65 377,124 608,167 231,43 489,70 769,72 l 6,0 5,-2 8,-4 c 2,-2 5,-3 8,-6 3,-2 6,-4 10,-6 l 12,-9 c 9,-6 19,-13 30,-22 11,-8 23,-17 37,-28 27,-20 58,-45 93,-73 35,-28 74,-59 116,-93 169,-136 385,-315 600,-497 215,-181 430,-366 593,-512 41,-37 79,-71 113,-103 34,-31 64,-59 89,-84 13,-13 24,-24 34,-35 11,-11 20,-20 28,-29 8,-9 14,-17 19,-23 3,-4 5,-8 7,-10 2,-4 4,-8 6,-11 0,-2 1,-5 2,-8 1,-3 2,-5 3,-9 1,-6 2,-13 3,-22 2,-8 3,-17 4,-28 1,-11 2,-22 3,-35 2,-25 4,-55 7,-89 1,-34 3,-72 5,-113 8,-166 14,-391 19,-648 10,-516 16,-1164 16,-1743 0,-389 -3,-747 -8,-1012 -1,-66 -2,-127 -4,-181 -1,-53 -3,-100 -5,-139 -1,-20 -2,-38 -3,-53 -1,-16 -2,-30 -3,-41 -1,-6 -1,-11 -2,-16 -1,-5 -1,-10 -2,-13 -1,-4 -1,-8 -2,-11 -1,-2 -1,-4 -2,-5 -1,-3 -2,-5 -3,-6 z m -37,21 12,-12 -12,12 z m -6,9 c 1,3 1,7 2,11 0,4 1,9 1,15 1,11 3,24 4,39 0,15 1,33 2,52 2,39 4,86 6,139 1,53 2,114 4,180 5,264 7,622 7,1011 0,578 -5,1227 -15,1742 -6,257 -12,481 -19,646 -2,42 -4,79 -6,113 -2,33 -4,63 -6,88 -1,12 -2,24 -4,34 0,10 -2,18 -3,26 -1,7 -2,14 -3,18 0,3 -1,4 -1,6 0,1 -1,2 -1,2 0,1 -1,2 -2,4 -1,1 -3,4 -4,6 -5,6 -10,13 -17,21 -7,7 -16,17 -26,27 l -34,34 c -25,24 -54,52 -88,83 -33,31 -71,66 -112,102 -163,146 -377,330 -592,512 -215,181 -431,360 -598,495 -42,34 -81,65 -116,93 -35,28 -66,52 -93,73 -13,10 -26,20 -37,28 -10,8 -20,15 -28,21 -4,3 -8,6 -12,8 -3,2 -6,4 -8,6 -2,1 -4,2 -5,3 -276,-2 -528,-29 -755,-71 -228,-42 -429,-100 -600,-164 -169,-64 -308,-134 -413,-202 -51,-33 -94,-66 -128,-97 -17,-15 -31,-30 -43,-44 -10,-12 -19,-23 -26,-34 l 0,-4 c -1,-3 -1,-7 -1,-11 -1,-8 -2,-18 -3,-28 -2,-23 -3,-51 -5,-84 -1,-33 -2,-71 -3,-115 -1,-42 -2,-90 -3,-142 -3,-208 -5,-482 -5,-790 0,-662 7,-1481 18,-2143 6,-330 12,-622 19,-834 2,-53 4,-101 6,-144 2,-42 3,-79 5,-109 1,-16 2,-30 3,-42 1,-12 2,-22 3,-31 0,-4 1,-8 1,-11 1,-4 1,-6 2,-9 l 0,-2 c 0,-1 1,-1 2,-2 2,-1 4,-3 7,-5 4,-1 7,-4 11,-6 9,-5 19,-10 31,-16 12,-6 26,-12 41,-19 31,-14 67,-29 109,-47 42,-17 89,-37 140,-57 205,-82 475,-184 746,-284 271,-101 543,-200 752,-274 52,-19 101,-36 144,-51 43,-16 82,-29 114,-40 17,-6 31,-11 44,-16 13,-4 25,-8 35,-11 4,-2 9,-3 13,-4 4,-2 7,-3 10,-4 3,-1 5,-1 8,-2 l 3,-1 -2,-8 1,8 1,0 4,0 7,0 c 2,0 5,0 8,1 7,0 14,1 23,2 17,1 39,4 64,7 50,6 114,16 187,27 147,23 329,55 509,89 180,35 357,72 492,106 34,9 65,17 92,25 28,8 53,15 73,23 10,3 20,7 28,10 7,3 15,6 20,9 5,3 10,5 13,8 0,0 1,0 1,1 0,1 1,3 1,4 z M 4075,8017 c 1,0 1,-1 2,-1 l 6,0 0,14 -8,-13 8,13 0,11 -10,-23 c 0,0 1,-1 2,-1 z M 2110,7400 c 1,1 1,3 2,4 1,1 1,3 1,4 l -25,4 21,-11 1,-1 -1,1 1,-1 2,0 -2,0 z m 39,-4498 0,3 c -1,0 -1,1 -2,1 l -5,-6 -17,-4 17,4 -2,-1 4,2 5,1 z m -7,-2 2,1 -2,-1 z m -16,-8 14,7 -14,-7 z m 14,7 -10,-11 10,11 z m 2217,-841 -2,-17 2,17 z m -4,-17 4,17 0,1 -4,-18 z" id="path20"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g22" stroke-opacity="0.541" fill="#ffffff" stroke="#ffffff" fill-opacity="0.541" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 5822,2442 -52,22 -52,23 -52,23 -53,25 -53,25 -53,26 -53,26 -54,27 -54,27 -54,28 -55,28 -54,29 -55,29 -55,29 -111,60 -112,60 -112,60 -113,61 -114,60 -114,60 -114,59 -57,29 -57,29 -58,28 -57,28 -27,-6 -28,-7 -56,-13 -58,-14 -59,-13 -60,-14 -61,-14 -61,-14 -63,-14 -62,-14 -63,-15 -127,-28 -127,-28 -64,-14 -63,-14 -62,-13 -62,-13 -61,-13 -60,-13 -60,-13 -58,-12 -57,-12 -28,-5 -28,-6 -27,-5 -27,-6 -27,-5 -26,-5 -26,-5 -25,-6 -25,-4 -24,-5 -24,-5 -24,-4 -23,-4 -22,-5 -22,-4 -21,-3 -21,-4 -20,-4 52,16 52,16 53,16 54,15 55,16 55,15 57,16 56,15 57,16 58,15 116,31 117,30 118,31 118,31 117,30 116,31 58,15 57,16 57,15 56,16 55,15 55,16 54,15 53,16 52,16 52,16 1,60 2,61 1,61 1,63 1,64 2,64 1,65 1,66 1,67 1,67 1,68 0,69 1,69 1,70 1,70 0,71 1,71 0,72 1,72 1,73 1,146 1,147 0,149 1,149 2,299 1,300 1,149 1,148 1,147 1,146 1,73 0,72 1,72 1,71 0,71 1,71 1,69 1,70 0,68 1,68 1,67 1,67 1,66 1,65 1,65 2,63 1,63 1,62 2,61 1,60 1,-61 1,-61 0,-63 1,-63 1,-64 1,-65 1,-66 1,-67 1,-67 1,-68 1,-69 2,-69 1,-70 1,-71 1,-71 1,-72 1,-72 2,-73 1,-73 1,-73 3,-148 3,-149 2,-151 3,-151 6,-303 5,-303 3,-151 3,-150 2,-149 3,-149 1,-73 2,-73 1,-73 1,-72 1,-71 1,-72 1,-70 2,-70 1,-70 1,-68 1,-68 1,-68 1,-66 1,-66 1,-65 1,-64 1,-64 0,-62 1,-62 1,-60 110,-59 109,-59 109,-57 109,-58 108,-57 107,-58 107,-57 107,-58 105,-58 105,-58 104,-60 103,-60 51,-30 50,-31 51,-31 50,-31 50,-31 50,-32 49,-32 50,-32 z" id="path24"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g32" stroke-opacity="0.161" fill="#000000" stroke="#ffffff" fill-opacity="0.161" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 2420,6628 10,14 10,13 11,13 12,13 12,12 12,12 14,12 13,12 14,12 15,11 15,11 16,11 15,11 17,10 16,10 17,11 18,9 18,10 18,9 18,8 19,9 19,8 19,8 19,8 40,15 40,14 41,12 41,11 42,10 41,9 42,8 41,6 41,6 41,3 21,2 20,1 19,1 20,0 20,0 19,0 19,-1 19,-1 18,-1 19,-1 17,-2 18,-3 17,-2 17,-3 17,-4 16,-4 15,-4 15,-4 15,-5 15,-5 -2,-1 -1,0 -5,-2 -6,-1 -7,-2 -8,-2 -10,-3 -10,-3 -12,-3 -13,-4 -14,-3 -15,-4 -16,-5 -16,-4 -18,-5 -18,-5 -19,-5 -20,-6 -20,-5 -21,-6 -22,-6 -22,-6 -22,-6 -23,-7 -24,-6 -48,-13 -49,-14 -50,-14 -50,-13 -50,-15 -50,-13 -49,-14 -49,-13 -23,-7 -24,-6 -23,-7 -22,-6 -22,-6 -21,-6 -21,-6 -20,-5 -19,-6 -19,-5 -18,-5 -17,-5 -16,-4 -15,-5 -15,-4 -13,-4 -12,-3 -12,-3 -10,-3 -9,-3 -7,-2 -7,-2 -5,-2 -2,0 -2,-1 z" id="path34"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g42" stroke-opacity="0.388" fill="#ffffff" stroke="#ffffff" fill-opacity="0.388" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 3454,6093 -936,-361 -9,4 -8,4 -8,4 -6,5 -6,6 -6,6 -5,7 -5,6 -4,7 -4,7 -3,7 -3,8 -3,8 -2,7 -3,15 -2,15 -2,14 0,6 0,7 0,5 0,6 0,5 0,4 0,4 1,4 0,2 0,2 0,1 0,1 146,51 1,1 1,1 1,1 1,2 2,2 1,3 3,3 2,3 3,4 3,4 3,4 4,5 4,4 4,6 5,4 10,12 10,11 13,12 13,12 14,13 15,12 17,13 17,12 19,12 19,11 21,11 22,10 11,4 11,5 12,4 12,4 13,3 12,3 13,3 13,3 13,2 13,1 14,2 14,1 14,0 15,0 15,0 15,-1 15,-2 15,-2 16,-2 16,-3 16,-4 16,-4 17,-5 17,-6 1,0 2,1 3,0 6,1 6,1 7,1 8,1 9,1 10,1 11,1 12,1 12,1 12,0 13,1 26,0 14,-1 13,-1 14,-1 13,-2 13,-2 12,-3 12,-3 12,-3 10,-5 11,-5 9,-6 8,-6 8,-8 3,-4 3,-4 3,-4 2,-4 2,-5 2,-5 z" id="path44"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g52" fill="#606060" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 3446,5971 c -311,-81 -622,-161 -933,-242 -12,44 -13,107 6,140 47,23 142,41 189,64 136,131 255,142 472,124 84,17 168,31 251,48 26,-51 33,-72 15,-134 z" id="path54"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g60" stroke-opacity="0.4" fill="#ffffff" stroke="#ffffff" fill-opacity="0.4" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 5856,2414 -1813,1017 7,4549 1775,-1494 31,-4072 z" id="path62"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g70" stroke-opacity="0.161" fill="#000000" stroke="#ffffff" fill-opacity="0.161" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 2525,6916 10,13 11,12 10,13 11,11 11,12 11,11 12,11 12,10 12,10 12,10 13,10 12,9 13,9 13,8 27,17 28,15 28,14 28,13 29,11 29,11 30,9 30,8 29,8 30,6 30,5 30,4 30,3 30,2 29,2 29,0 29,-1 27,-2 28,-2 27,-3 26,-5 25,-5 24,-6 24,-6 22,-8 -2,-1 -4,0 -4,-2 -5,-1 -6,-2 -8,-2 -8,-2 -9,-2 -10,-3 -10,-3 -11,-3 -12,-3 -13,-4 -13,-3 -14,-4 -15,-4 -15,-4 -15,-5 -16,-4 -16,-5 -17,-4 -18,-5 -35,-10 -36,-10 -38,-10 -38,-10 -38,-11 -76,-21 -37,-10 -37,-11 -36,-10 -17,-4 -17,-5 -17,-5 -16,-4 -16,-5 -15,-4 -15,-4 -14,-4 -14,-4 -13,-4 -12,-3 -11,-3 -12,-3 -10,-3 -9,-3 -8,-2 -8,-3 -7,-1 -6,-2 -5,-2 -4,-1 -3,-1 z" id="path72"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g80" stroke-opacity="0.161" fill="#000000" stroke="#ffffff" fill-opacity="0.161" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 2680,7199 12,15 12,14 13,14 14,12 14,13 14,11 15,11 16,11 15,9 17,9 16,9 17,7 18,7 17,7 18,5 18,5 18,5 19,3 18,4 19,2 18,2 19,1 19,0 19,0 18,-1 19,-2 18,-2 19,-3 18,-4 18,-4 18,-5 17,-6 -1,0 -2,-1 -3,0 -4,-1 -3,-1 -5,-2 -5,-1 -6,-2 -6,-1 -6,-2 -7,-2 -8,-2 -8,-2 -8,-3 -9,-2 -9,-2 -19,-6 -20,-5 -22,-6 -22,-6 -23,-6 -23,-7 -48,-13 -48,-13 -23,-7 -23,-6 -23,-6 -21,-6 -21,-6 -19,-6 -9,-2 -9,-3 -9,-2 -8,-2 -8,-2 -7,-2 -7,-2 -6,-2 -6,-2 -5,-2 -5,-1 -5,-1 -3,-1 -3,-1 -3,-1 -2,0 z" id="path82"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g90" stroke-opacity="0.439" fill="#fcfcfc" stroke="#ffffff" fill-opacity="0.439" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 2356,3259 -92,13 -17,2173 1425,399 35,-116 -1369,-365 18,-2104 z" id="path92"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g100" stroke-opacity="0.231" fill="#000000" stroke="#ffffff" fill-opacity="0.231" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 3700,4065 -2,61 -1340,-386 1342,325 z" id="path102"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g106" stroke-opacity="0.231" fill="#000000" stroke="#ffffff" fill-opacity="0.231" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 3720,4507 -3,61 -1339,-386 1342,325 z" id="path108"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g112" stroke-opacity="0.231" fill="#000000" stroke="#ffffff" fill-opacity="0.231" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 3700,4916 -2,61 -1340,-386 1342,325 z" id="path114"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g118" stroke-opacity="0.231" fill="#000000" stroke="#ffffff" fill-opacity="0.231" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 3700,5318 -2,61 -1340,-387 1342,326 z" id="path120"/> - </g> - <g transform="matrix(-0.0039657,0,0,0.0039657,435.9735,368.36892)" id="g124" fill="#9e9e9e" stroke-width="25.22"> - <path inkscape:connector-curvature="0" d="m 2361,3309 1332,333 -11,2197 11,0 11,0 11,-2205 0,-9 -8,-2 -1341,-335 -2,11 -3,10 z m 1340,335 -8,-2 0,-8 11,0 -3,10 z" id="path126"/> - </g> - <path id="path16-1" d="m 408.34342,399.31706 c 0,0.39 1.56241,0.7062 3.48972,0.7062 1.92732,0 3.48973,-0.3162 3.48973,-0.7062 0,-0.39008 -1.56241,-0.70628 -3.48973,-0.70628 -1.92731,0 -3.48972,0.31605 -3.48972,0.7062 z" i:knockout="Off" inkscape:connector-curvature="0" fill="url(#XMLID_1_)" stroke="#333333" stroke-width="0.227"/> - <path id="path18" i:knockout="Off" d="m 411.39528,399.24749 0.99708,0 0,-3.15696 -0.99708,0 0,3.15696 z" inkscape:connector-curvature="0" fill="#333333" stroke="#333333" stroke-width="0.227"/> - <path id="path25" d="m 407.80734,396.62646 c 0,0.50107 0.40625,0.90732 0.90732,0.90732 l 6.66054,0 c 0.50107,0 0.90732,-0.40625 0.90732,-0.90732 l 0,-4.99862 c 0,-0.50107 -0.40625,-0.90732 -0.90732,-0.90732 l -6.66039,0 c -0.50107,0 -0.90732,0.40625 -0.90732,0.90732 l 0,4.99862 z" i:knockout="Off" inkscape:connector-curvature="0" fill="url(#linearGradient4358)" stroke="#333333" stroke-width="0.454"/> - </g> - </g> - <metadata id="metadata53"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/63-2.svg b/htdocs/public/symbols/svgicons/63-2.svg deleted file mode 100755 index ea76685b17fa50243f3fdae6b84f7ba9f33b6508..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/63-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata5882"/> - <rect id="rect4202" width="24" height="24" rx="4" fill="#009bff" stroke-linejoin="round" stroke-linecap="round"/> - <text x="4.675" y="22.21" id="text4204" sodipodi:linespacing="125%" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="125%" letter-spacing="0" font-size="27.5"><tspan sodipodi:role="line" id="tspan4206" x="4.675" y="22.21">?</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/64-1.svg b/htdocs/public/symbols/svgicons/64-1.svg deleted file mode 100755 index 85c78f36a28ddacc83478639f09355f96e32d7ed..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/64-1.svg +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 24 24" width="24" height="24" shape-rendering="geometricPrecision" fill-rule="evenodd" image-rendering="optimizeQuality" clip-rule="evenodd"> - <defs id="defs4841"> - <linearGradient inkscape:collect="always" id="linearGradient4142"> - <stop id="stop4144" stop-color="#0000ff"/> - <stop offset="1" id="stop4146" stop-color="#0000ff" stop-opacity="0"/> - </linearGradient> - <radialGradient inkscape:collect="always" xlink:href="#linearGradient4142" id="radialGradient4150" cx="1070" cy="1447.5" r="1070" gradientTransform="matrix(2.6317987,2.4065414e-8,-2.5363448e-8,2.773752,-1746.0246,-2567.5061)" gradientUnits="userSpaceOnUse"/> - </defs> - <g id="Layer_x0020_1" transform="matrix(0,-0.00690846,0.00690846,0,2,19.392055)" fill="url(#radialGradient4150)"> - <path d="M 1633.2577,2021.4393 C 1198.0447,2456.6523 412.73502,2851.9645 0,2895 561,2620 790.30306,2335.9546 752.30306,2138.9546 268.30306,1952.9546 123,1408 424,988 797,402 1369,73 2140,0 c -564,276 -825,512 -785,710 305,128 505,483 505,739 2.3564,226.1977 -119.0281,482.4327 -226.7423,572.4393 z" id="path4835" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/> - </g> - <metadata id="metadata4837"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/64-2.svg b/htdocs/public/symbols/svgicons/64-2.svg deleted file mode 100755 index 6ee944dc7f3cb4fe31213da9958dab7b8ea29359..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/64-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 24 24" width="24" height="24" shape-rendering="geometricPrecision" fill-rule="evenodd" image-rendering="optimizeQuality" clip-rule="evenodd"> - <g id="Layer_x0020_1" transform="matrix(0,-0.00829019,0.00829019,0,-5.0025e-5,20.870503)"> - <path d="M 1633.2577,2021.4393 C 1198.0447,2456.6523 412.73502,2851.9645 0,2895 561,2620 790.30306,2335.9546 752.30306,2138.9546 268.30306,1952.9546 123,1408 424,988 797,402 1369,73 2140,0 c -564,276 -825,512 -785,710 305,128 505,483 505,739 2.3564,226.1977 -119.0281,482.4327 -226.7423,572.4393 z" id="path4835" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc" fill="#0000ff"/> - </g> - <metadata id="metadata4837"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/65-1.svg b/htdocs/public/symbols/svgicons/65-1.svg deleted file mode 100755 index 1a2ac56e2c53453cf6ad026b21c39c7b6eb0bb03..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/65-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4228"/> - <rect id="rect4772" width="24" height="24" rx="2" fill="#009cff" stroke-linejoin="round" stroke-linecap="round"/> - <text x="0.27" y="20.777" id="text3010" sodipodi:linespacing="125%" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="28" fill="#ffffff" font-family="Sans"><tspan sodipodi:role="line" id="tspan3012" x="0.27" y="20.777" dx="-0.5" dy="-0.5">+</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/65-2.svg b/htdocs/public/symbols/svgicons/65-2.svg deleted file mode 100755 index 606c0602844ac61dca26cea6cf10cb8549359769..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/65-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4908"/> - <rect id="rect5452" width="21.493" height="21.493" x="1.254" y="1.254" fill="#ffffff" stroke="#000000" stroke-linecap="round" stroke-width="2.507"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/66-1.svg b/htdocs/public/symbols/svgicons/66-1.svg deleted file mode 100755 index 99fcda5d8607f8e9c63ae2ab12f10c33b174c7cf..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/66-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata5545"/> - <rect id="rect4134" width="23.02" height="17.208" x="0.489" y="3.396" rx="3" fill="#cccccc" stroke="#4d4d4d" stroke-linejoin="round" stroke-linecap="round"/> - <text x="2.45" y="14.252" id="text6089" sodipodi:linespacing="125%" transform="scale(0.82782149,1.2079899)" font-family="sans-serif" fill="#330098" word-spacing="0" line-height="125%" letter-spacing="0" font-size="11.864"><tspan sodipodi:role="line" id="tspan6091" x="2.45" y="14.252">BBS</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/66-2.svg b/htdocs/public/symbols/svgicons/66-2.svg deleted file mode 100755 index b2f1694294db1bb0d25b384ff6735d95592b1c72..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/66-2.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3937"/> - <rect id="rect3943" width="23" height="23" x="0.499" y="0.499" rx="1.917" fill="#cccccc" stroke="#000000" stroke-width="0.998"/> - <g id="g3337" transform="translate(0,-0.3249971)"> - <text transform="scale(0.82585399,1.2108678)" sodipodi:linespacing="0%" id="text4459-9" y="9.17" x="14.324" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="6.875"><tspan y="9.17" x="14.324" id="tspan4461-6" sodipodi:role="line">BLOW</tspan> - </text> - <text transform="scale(0.82585399,1.2108678)" sodipodi:linespacing="0%" id="text4459" y="16.193" x="14.386" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="0" font-size="6.875"><tspan y="16.193" x="14.386" id="tspan4461" sodipodi:role="line">SNOW</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/67-1.svg b/htdocs/public/symbols/svgicons/67-1.svg deleted file mode 100755 index f87b4e0a34a527353662bb8ac9186422204cd3be..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/67-1.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata13"/> - <g id="g3197" transform="matrix(0.04229602,0,0,0.04229602,-2.7000875,-7.7034529)"> - <path d="m 377.53,372.82 c 20.564,0 37.18,-16.714 37.18,-37.278 0,-20.564 -16.617,-37.229 -37.18,-37.229 -20.564,0 -37.229,16.665 -37.229,37.229 0,20.564 16.665,37.278 37.229,37.278" id="path7088" inkscape:connector-curvature="0"/> - <path d="m 240.16,576.32 c 8.723,0 17.104,-1.998 24.609,-5.36 7.699,-3.557 16.421,-5.653 25.485,-5.653 9.015,0 17.737,2.096 25.388,5.653 7.553,3.362 15.983,5.311 24.803,5.311 8.771,0 17.152,-1.949 24.705,-5.311 7.651,-3.557 16.373,-5.653 25.437,-5.653 9.063,0 17.688,2.096 25.485,5.653 7.456,3.362 15.934,5.311 24.657,5.311 8.771,0 17.25,-1.949 24.706,-5.311 7.748,-3.557 16.421,-5.653 25.534,-5.653 9.014,0 17.688,2.096 25.387,5.653 7.553,3.362 15.984,5.311 24.755,5.311 8.82,0 17.201,-1.949 24.754,-5.311 7.651,-3.557 16.373,-5.653 25.388,-5.653 7.748,0 15.301,1.462 22.074,4.142 11.062,-12.084 17.932,-28.165 17.932,-45.805 0,-37.473 -30.358,-67.831 -67.83,-67.831 l -7.602,0.78 c -8.333,33.867 -42.151,35.28 -42.151,35.28 l -154.86,-0.049 -12.962,-7.602 31.235,-52.383 34.159,19.735 c 20.466,13.254 31.138,-5.36 31.138,-5.36 l 34.256,-55.844 c 14.863,-24.267 -16.714,-43.71 -31.527,-19.345 l -23.975,39.129 -57.013,-31.527 c -39.471,-22.026 -56.233,14.472 -56.233,14.472 l -44.782,76.699 c -7.602,15.935 -0.82898,22.806 -0.82898,22.806 l -22.123,-0.049 v 83.765 z" id="path7090" inkscape:connector-curvature="0"/> - <path d="m 620.45,633.38 c -12.136,0 -23.802,-1.949 -34.117,-5.311 -10.721,-3.606 -22.723,-5.702 -35.331,-5.702 -12.474,0 -24.542,2.096 -35.129,5.702 -10.451,3.362 -22.048,5.311 -34.252,5.311 -12.136,0 -23.802,-1.949 -34.253,-5.311 -10.653,-3.606 -22.655,-5.702 -35.128,-5.702 -12.609,0 -24.611,2.096 -35.331,5.702 -10.317,3.362 -22.049,5.311 -34.185,5.311 -12.07,0 -23.801,-1.949 -34.117,-5.311 -10.788,-3.606 -22.723,-5.702 -35.263,-5.702 -12.542,0 -24.61,2.096 -35.197,5.702 -10.451,3.362 -22.048,5.311 -34.184,5.311 -12.204,0 -23.868,-1.949 -34.319,-5.311 -10.586,-3.606 -22.655,-5.702 -35.129,-5.702 -12.542,0 -24.61,2.096 -35.263,5.702 -10.384,3.362 -22.049,5.311 -34.185,5.311 v -37.034 c 12.136,0 23.801,-1.998 34.185,-5.36 10.653,-3.557 22.721,-5.653 35.263,-5.653 12.474,0 24.542,2.096 35.129,5.653 10.451,3.362 22.115,5.36 34.319,5.36 12.136,0 23.733,-1.998 34.184,-5.36 10.586,-3.557 22.655,-5.653 35.197,-5.653 12.54,0 24.474,2.096 35.263,5.653 10.317,3.362 22.048,5.36 34.117,5.36 12.136,0 23.868,-1.998 34.185,-5.36 10.721,-3.557 22.721,-5.653 35.331,-5.653 12.472,0 24.474,2.096 35.128,5.653 10.451,3.362 22.117,5.36 34.253,5.36 12.204,0 23.801,-1.998 34.252,-5.36 10.586,-3.557 22.655,-5.653 35.129,-5.653 12.608,0 24.61,2.096 35.331,5.653 10.315,3.362 21.981,5.36 34.117,5.36 v 37.034 z" id="path7092" inkscape:connector-curvature="0" fill="#000080"/> - <path d="m 430.75,575.73 c -8.1834,0 -16.046,-1.998 -23.087,-5.36 -7.2227,-3.557 -15.405,-5.653 -23.908,-5.653 -8.4573,0 -16.64,2.096 -23.817,5.653 -7.0857,3.362 -14.994,5.311 -23.269,5.311 -8.2284,0 -16.091,-1.949 -23.177,-5.311 -7.1776,-3.557 -15.36,-5.653 -23.863,-5.653 -8.5024,0 -16.594,2.096 -23.908,5.653 -6.9947,3.362 -14.948,5.311 -23.132,5.311 -8.2284,0 -16.183,-1.949 -23.178,-5.311 -7.2687,-3.557 -15.405,-5.653 -23.954,-5.653 -8.4563,0 -16.594,2.096 -23.816,5.653 -7.0857,3.362 -14.995,5.311 -23.224,5.311 -8.2744,0 -16.137,-1.949 -23.223,-5.311 -7.1777,-3.557 -15.36,-5.653 -23.817,-5.653 -7.2687,0 -14.354,1.462 -20.708,4.142 -10.378,-12.084 -16.823,-28.165 -16.823,-45.805 0,-37.473 28.48,-67.831 63.634,-67.831 l 7.1317,0.78 c 7.8174,33.867 39.543,35.28 39.543,35.28 l 145.28,-0.049 12.16,-7.602 -9.3026,41.617 -22.046,-44.265 c -19.2,13.254 54.788,53.64 4.7884,28.64 l 47.863,-8.844 c -21.944,-5.267 83.68,46.29 38.577,43.655 l -63.508,-15.871 -2.5141,10.473 c 37.029,-22.026 -1.2459,86.472 37.754,-18.528 l 46.012,-5.301 c 7.1317,15.935 0.77768,22.806 0.77768,22.806 l 20.754,-46.049 v 83.765 z" id="svg_1" inkscape:connector-curvature="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/67-2.svg b/htdocs/public/symbols/svgicons/67-2.svg deleted file mode 100755 index 99db17ee8299719195ea17575435e2a8db246620..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/67-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3069"/> - <path sodipodi:type="arc" id="path3073" sodipodi:cx="-3.5643563" sodipodi:cy="7.0759077" sodipodi:rx="6.1254125" sodipodi:ry="6.1254125" d="m 2.5610561,7.0759077 a 6.1254125,6.1254125 0 1 1 -12.2508249,0 6.1254125,6.1254125 0 1 1 12.2508249,0 z" transform="matrix(1.3587811,0,0,1.3587811,16.84318,2.3853903)" fill="none" stroke="#ff5b00" stroke-width="3.925"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/68-1.svg b/htdocs/public/symbols/svgicons/68-1.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/68-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/68-2.svg b/htdocs/public/symbols/svgicons/68-2.svg deleted file mode 100755 index a89d4bc99fbb44700259a471b155c75007003e77..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/68-2.svg +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="68-2.svg"> - <defs - id="defs14" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview12" - showgrid="false" - inkscape:zoom="8" - inkscape:cx="20.200219" - inkscape:cy="-2.8996853" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata3937"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <rect - id="rect3943" - width="23" - height="23" - x="0.5" - y="0.5" - rx="3.1373389" - style="fill:#217867;stroke:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" /> - <rect - id="rect3943-9" - width="20.02396" - height="20.02396" - x="1.9880199" - y="1.9880199" - rx="2.7313888" - style="fill:#217867;stroke:#ffffff;stroke-width:0.97604084;stroke-miterlimit:4;stroke-dasharray:none" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/69-1.svg b/htdocs/public/symbols/svgicons/69-1.svg deleted file mode 100755 index bf919f489e7a966fb6412e1f7efd40b41aba524c..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/69-1.svg +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" version="1.1"> - <metadata id="metadata57"/> - <defs id="defs55"> - <filter filterUnits="objectBoundingBox" id="AI_Shadow_1"> - <feGaussianBlur id="feGaussianBlur6" stdDeviation="4" in="SourceAlpha" result="blur"/> - <feOffset id="feOffset8" dx="4" in="blur" dy="4" result="offsetBlurredAlpha"/> - <feMerge id="feMerge10"> - <feMergeNode id="feMergeNode12" in="offsetBlurredAlpha"/> - <feMergeNode id="feMergeNode14" in="SourceGraphic"/> - </feMerge> - </filter> - <filter id="AI_GaussianBlur_4"> - <feGaussianBlur id="feGaussianBlur17" stdDeviation="4"/> - </filter> - <linearGradient gradientTransform="translate(279.44081,-282.1023)" y2="456.16" x2="432.1" y1="44.829" x1="71.43" gradientUnits="userSpaceOnUse" id="SVGID_1_"> - <stop id="stop26" stop-color="#ffffff"/> - <stop id="stop28" offset="1" stop-color="#e6e6e6"/> - </linearGradient> - <linearGradient y2="198.65" x2="250.74" y1="338.65" x1="251.45" gradientUnits="userSpaceOnUse" id="SVGID_2_"> - <stop id="stop35" stop-color="#ffffff"/> - <stop id="stop37" offset="1" stop-color="#4279cb"/> - </linearGradient> - </defs> - <g transform="matrix(0.08175062,0,0,0.08175062,-8.5298643,-6.8353428)" id="g4185"> - <path d="m 389.3,270.7 c 0,0 -62.5,86.1 -138.8,86.1 -76.3,0 -137.6,-86.1 -137.6,-86.1 0,0 61.3,-88.1 137.6,-88.1 76.3,0 138.8,88.1 138.8,88.1 z" id="path32" fill="#ffffff" stroke="#000000" stroke-width="14" stroke-miterlimit="10"/> - <circle cx="251.1" cy="269.7" r="70" id="circle39" fill="url(#SVGID_2_)" stroke="#000000" stroke-width="8" stroke-miterlimit="10"/> - <path d="m 251.1,298.7 c -16,0 -29,-13 -29,-29 0,-16 13,-29 29,-29 16,0 29,13 29,29 0,16 -13,29 -29,29 z" id="path41"/> - <g id="g43" filter="url(#AI_GaussianBlur_4)"> - <circle cx="225.3" cy="248.3" r="24.7" id="circle45" fill="#ffffff"/> - </g> - <line x1="250" y1="97" x2="250" y2="171" id="line47" fill="none" stroke="#000000" stroke-width="14" stroke-miterlimit="10"/> - <line x1="363.9" y1="130.6" x2="320.4" y2="190.5" id="line49" fill="none" stroke="#000000" stroke-width="14" stroke-miterlimit="10"/> - <line x1="136.6" y1="132" x2="180.1" y2="191.9" id="line51" fill="none" stroke="#000000" stroke-width="14" stroke-miterlimit="10"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/69-2.svg b/htdocs/public/symbols/svgicons/69-2.svg deleted file mode 100755 index 10611c92ad5be3e5009cd4f15614be3c7cc3af29..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/69-2.svg +++ /dev/null @@ -1,114 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - height="24" - width="24" - version="1.0" - viewBox="-0.7 -0.596 24.478088 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="69-2.svg"> - <defs - id="defs13" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="861" - inkscape:window-height="534" - id="namedview11" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-0.76271186" - inkscape:cy="12" - inkscape:window-x="317" - inkscape:window-y="158" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <metadata - id="metadata1952"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3341" - transform="matrix(1,0,0,0.97809776,0.29016846,0.82007813)"> - <path - style="fill:#4d4d4d" - sodipodi:open="true" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - d="M 0.0690856,12.101988 A 4.3146133,3.6947634 0 0 1 4.3826636,8.4072245 4.3146133,3.6947634 0 0 1 8.6983118,12.100215 4.3146133,3.6947634 0 0 1 4.3868053,15.79675 4.3146133,3.6947634 0 0 1 0.06908759,12.105535" - sodipodi:ry="3.6947634" - sodipodi:rx="4.3146133" - sodipodi:cy="12.101988" - sodipodi:cx="4.3836989" - id="path3064" - sodipodi:type="arc" /> - <path - style="fill:#4d4d4d" - sodipodi:open="true" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - d="M -0.52747869,17.618847 A 6.8988371,5.2170744 0 0 1 6.369703,12.401773 6.8988371,5.2170744 0 0 1 13.270195,17.616343 6.8988371,5.2170744 0 0 1 6.3763252,22.83592 6.8988371,5.2170744 0 0 1 -0.52747552,17.623855" - sodipodi:ry="5.2170744" - sodipodi:rx="6.8988371" - sodipodi:cy="17.618847" - sodipodi:cx="6.3713584" - id="path3070" - sodipodi:type="arc" /> - <path - style="fill:#4d4d4d" - sodipodi:open="true" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - d="M 0.56472778,4.8770544 A 5.8142023,5.4726467 0 0 1 6.377535,-0.59559186 5.8142023,5.4726467 0 0 1 12.193132,4.8744281 5.8142023,5.4726467 0 0 1 6.383116,10.3497 5.8142023,5.4726467 0 0 1 0.56473046,4.8823082" - sodipodi:ry="5.4726467" - sodipodi:rx="5.8142023" - sodipodi:cy="4.8770547" - sodipodi:cx="6.3789301" - id="path3074" - sodipodi:type="arc" /> - <path - style="fill:#4d4d4d" - sodipodi:open="true" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - d="M 8.2794294,16.240707 A 7.2528496,6.6843758 0 0 1 15.530539,9.5563318 7.2528496,6.6843758 0 0 1 22.785128,16.237499 7.2528496,6.6843758 0 0 1 15.537501,22.925081 7.2528496,6.6843758 0 0 1 8.2794328,16.247124" - sodipodi:ry="6.6843758" - sodipodi:rx="7.2528496" - sodipodi:cy="16.240707" - sodipodi:cx="15.532279" - id="path3076" - sodipodi:type="arc" /> - <path - style="fill:#4d4d4d" - sodipodi:open="true" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - d="M 5.8055601,7.2356263 A 8.6098347,7.9886446 0 0 1 14.413329,-0.75301767 8.6098347,7.9886446 0 0 1 23.025228,7.2317925 8.6098347,7.9886446 0 0 1 14.421593,15.224269 8.6098347,7.9886446 0 0 1 5.8055641,7.2432954" - sodipodi:ry="7.9886446" - sodipodi:rx="8.6098347" - sodipodi:cy="7.2356267" - sodipodi:cx="14.415395" - id="path3084" - sodipodi:type="arc" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/70-1.svg b/htdocs/public/symbols/svgicons/70-1.svg deleted file mode 100755 index f4d71b32feb2bb9f7ac933b2ec82f58a2e014d33..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/70-1.svg +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata18"/> - <path d="m 1.2088042,11.331373 -0.136115,0.168782 -0.13067037,0.179672 -0.11978117,0.179672 -0.11978116,0.185116 -0.1034474,0.190561 -0.10344739,0.196006 -0.0871136,0.20145 -0.0871136,0.20145 -0.0707798,0.212339 -0.0653352,0.21234 -0.054446,0.217784 -0.04900139,0.217784 -0.01633382,0.114336 -0.01633381,0.114337 -0.0163338,0.108892 -0.0108892,0.114336 -0.0108892,0.114337 -0.00544459,0.119781 -0.005444604,0.114337 0,0.114336 c 0,2.803969 2.286731704,5.090701 5.079811304,5.090701 2.2812869,0 4.2195644,-1.513599 4.8565822,-3.593436 l 0,0 0,0 5.9346134,0 0,0 0,0 c 0.234118,2.030836 1.960056,3.615214 4.050782,3.615214 2.24862,0 4.078005,-1.83483 4.078005,-4.083449 0,-1.056252 -0.397456,-2.019947 -1.061697,-2.749523 C 22.878309,12.556407 22.73675,12.022837 22.410074,11.63627 21.898282,11.021031 20.716803,10.68891 19.704108,10.3459 18.881973,10.068226 16.295789,9.5019872 14.466403,9.2515358 14.43918,8.8377462 14.341178,7.6344898 13.878387,6.5129023 13.36115,5.2660891 13.078031,4.9503024 13.197812,4.5855143 13.312148,4.220726 12.931026,4.3840642 12.843913,4.4820667 12.762244,4.5855143 12.566238,4.8522996 12.811245,5.3477581 13.050808,5.8268828 13.83483,7.5691546 13.938277,9.1862006 13.758605,9.1698667 13.600712,9.1535328 13.453708,9.1480882 13.399262,8.8377462 13.328482,8.5001811 13.301259,8.3477323 13.252258,8.0918361 12.707798,6.4257888 12.397456,5.7234354 12.092558,5.0265267 12.13067,5.1245295 12.13067,5.1245295 c 0,0 -0.163337,-0.6315735 -0.969139,-0.6696855 C 10.355731,4.4221762 9.1415853,4.3132844 8.3248954,4.2860612 7.5136501,4.258838 5.6951541,4.3078397 4.8675749,4.3895088 4.0508851,4.4820667 4.0889972,4.4439547 3.9365484,4.71074 3.7786551,4.9666361 3.7786551,4.9666361 3.7786551,4.9666361 c 0,0 -0.4410126,1.0671415 -0.6860196,1.83483 C 2.8530732,7.5691546 2.5753986,8.7669664 2.5481756,8.9684166 2.5155082,9.1589774 2.5862876,9.2950924 2.4229499,9.3658722 2.2541673,9.4420967 1.3666976,9.7959957 0.82768225,10.198896 0.29411153,10.596352 0.24511014,10.61813 0.23422094,10.667132 c -0.0217784,0.049 -0.0707798,0.098 0.12522578,0.179672 0.1796718,0.07078 0.52268153,0.245006 0.84935748,0.484569 l 0,0 0,0 0,0 0,0 z" id="path18" inkscape:connector-curvature="0" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 14.482737,12.12084 0,-0.05445 0,-0.05989 0,-0.06534 0,-0.07078 0,-0.07622 0,-0.08167 0.0054,-0.08711 0,-0.08711 0,-0.098 0,-0.09256 0,-0.103447 0,-0.098 0,-0.206895 0,-0.212339 0,-0.206895 0,-0.103447 0,-0.098 0,-0.098 0,-0.098 0,-0.09256 -0.0054,-0.087114 0,-0.081669 0,-0.081669 0,-0.076224 0,-0.07078 0,-0.059891 0,-0.05989 -0.0054,-0.049001 0,-0.038112 c 1.252257,0.1633381 3.288537,0.4954586 5.194147,1.072586 0.914693,0.277675 1.70416,0.539015 2.166951,0.854802 0.653352,0.451902 0.827579,1.007251 0.892914,1.328483 -0.735021,-0.702354 -1.720493,-1.132477 -2.809413,-1.132477 -1.21959,0 -2.319399,0.539015 -3.070754,1.393817 l 0,0 0,0 -2.368401,-0.822134 0,0 0,0 z" id="path12" inkscape:connector-curvature="0" fill="#00ff00" stroke="#000000" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 13.938277,9.354983 0,0.00544 0.0054,0 0,0.00544 0,0 0,0.00544 0,0 0,0.00544 0,0 0,0.00544 0,0.00544 0,0 0,0.00544 0,0 0,0.00544 0,0.00544 0,0 c 0.02722,1.274036 -0.0054,2.16695 -0.02722,2.520849 l 0,0 0,0 -0.41379,-0.147004 0,0 0,0 c 0.0054,-0.381122 0.01089,-1.9056095 0.01089,-2.1397275 0,-0.076224 -0.01089,-0.1960055 -0.03267,-0.3321205 0.114337,0.010889 0.266785,0.027223 0.457346,0.049001 l 0,0 0,0 0,0 0,0 z" id="path14" inkscape:connector-curvature="0" fill="#00ff00" stroke="#000000" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 12.749933,10.66625 0,0 0,0 -0.02208,0.310468 -2.237731,0 0,0 0,0 C 9.4917681,9.7076835 7.6226321,9.0607444 6.3049492,8.8076023 l 0,0 0,0 0.8439126,-3.3275478 0,0 0,0 c 0,0 2.2159522,0.038643 3.1796462,0.098753 0.95825,0.055817 1.029029,0.055817 1.127032,0.077285 0.098,0.021468 0.223229,0.055817 0.326676,0.2447359 0.098,0.1846251 0.73725,1.5547825 0.971367,2.7398188 0,0 -0.01779,2.0293468 -0.0037,2.0256028 z" id="path16" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccscccc" fill="#b3b3b3" stroke="#000000" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 19.921892,17.875781 -0.114337,-0.0054 -0.114336,-0.0054 -0.108892,-0.01633 -0.108892,-0.02178 -0.108892,-0.02178 -0.108892,-0.03267 -0.103448,-0.03267 -0.098,-0.04356 -0.103447,-0.04356 -0.09256,-0.049 -0.09256,-0.05445 -0.09256,-0.05989 -0.08711,-0.05989 -0.08711,-0.06533 -0.08167,-0.07078 -0.07623,-0.07622 -0.07622,-0.07622 -0.06534,-0.08167 -0.07078,-0.08711 -0.05989,-0.08711 -0.05989,-0.09256 -0.05445,-0.09256 -0.049,-0.098 -0.04356,-0.098 -0.03811,-0.098 -0.03811,-0.108892 -0.02722,-0.103447 -0.02722,-0.108892 -0.02178,-0.108892 -0.01089,-0.114336 -0.01089,-0.108893 0,-0.114336 c 0,-1.235924 1.001806,-2.243175 2.232285,-2.243175 1.23048,0 2.237731,1.007251 2.237731,2.243175 0,1.230479 -1.007251,2.23773 -2.237731,2.23773 l 0,0 0,0 0,0 z" id="path20" inkscape:connector-curvature="0" stroke-width="0" stroke-miterlimit="10.433" fill="#ffff00" stroke="#000000"/> - <path d="m 5.0799144,17.418435 -0.1415596,0 -0.1415597,-0.01089 -0.1415596,-0.02178 -0.136115,-0.02178 -0.1361149,-0.03267 -0.136115,-0.03811 -0.1306704,-0.04356 -0.1252258,-0.049 -0.1252257,-0.05989 -0.1197812,-0.05989 -0.1197812,-0.07078 -0.108892,-0.07078 -0.1143366,-0.07622 -0.1034474,-0.08711 -0.1034474,-0.08711 -0.098003,-0.09256 -0.092558,-0.098 -0.087114,-0.103447 -0.081669,-0.103447 -0.081669,-0.108892 -0.07078,-0.114337 -0.07078,-0.119781 -0.05989,-0.119782 -0.054446,-0.125225 -0.054446,-0.130671 -0.043557,-0.13067 -0.038112,-0.13067 -0.027223,-0.136115 -0.027223,-0.136115 -0.016334,-0.14156 -0.010889,-0.141559 -0.00544,-0.147005 c 0,-1.546266 1.2577024,-2.803968 2.8039689,-2.803968 1.546266,0 2.8094133,1.257702 2.8094133,2.803968 0,1.551711 -1.2631473,2.809414 -2.8094133,2.809414 l 0,0 0,0 0,0 z" id="path22" inkscape:connector-curvature="0" stroke-width="0" stroke-miterlimit="10.433" fill="#ffff00" stroke="#000000"/> - <path d="m 9.0708055,11.026475 -0.00544,-0.0054 -0.010889,-0.01633 -0.016334,-0.02178 -0.027223,-0.03267 -0.038112,-0.03811 -0.038112,-0.049 -0.054445,-0.049 -0.054446,-0.05989 -0.065335,-0.06533 -0.07078,-0.06533 -0.081669,-0.07623 -0.092558,-0.07622 -0.092558,-0.07622 L 8.3194508,10.313232 8.2051143,10.231564 8.0853332,10.14445 7.9601075,10.062781 7.8239925,9.981112 7.6824329,9.8939987 7.529984,9.8123296 7.3720905,9.7361052 7.2033082,9.6598807 7.0290808,9.5836563 6.8439645,9.5128765 6.6534036,9.4529859 6.4573981,9.3876508 6.2505033,9.3332049 6.0381639,9.2896478 5.8149352,9.2460907 5.5808172,9.2134229 5.3412551,9.1861997 5.0962483,9.1698658 C 2.4175053,9.0391964 0.70790109,10.443903 0.46833871,10.705244 l 0,0 0,0 0.45190176,0.239562 0,0 0,0 C 0.942019,10.955695 2.1724983,9.5292104 4.7913505,9.4529859 6.8112967,9.39854 8.3357847,10.384012 8.9728029,11.021031 c 0.098003,0.103447 0.098003,0.0054 0.098003,0.0054 l 0,0 0,0 0,0 z" id="path24" inkscape:connector-curvature="0" fill="#00ff00" stroke="#000000" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 19.921892,16.460185 -0.04356,0 -0.04356,0 -0.03811,-0.0054 -0.04356,-0.01089 -0.03811,-0.0054 -0.03811,-0.01089 -0.03811,-0.01633 -0.03811,-0.01633 -0.03811,-0.01633 -0.03811,-0.01633 -0.03267,-0.02178 -0.03267,-0.02178 -0.03267,-0.02178 -0.03267,-0.02178 -0.03267,-0.02722 -0.02722,-0.02722 -0.02722,-0.03267 -0.02722,-0.02722 -0.02178,-0.03267 -0.02722,-0.03267 -0.01633,-0.03267 -0.02178,-0.03267 -0.02178,-0.03811 -0.01633,-0.03811 -0.01089,-0.03267 -0.01633,-0.04356 -0.01089,-0.03811 -0.0054,-0.03811 -0.01089,-0.04356 -0.0054,-0.03811 0,-0.04356 -0.0054,-0.03811 c 0,-0.46279 0.375677,-0.833023 0.833024,-0.833023 0.457346,0 0.827579,0.370233 0.827579,0.833023 0,0.451902 -0.370233,0.822135 -0.827579,0.822135 l 0,0 0,0 0,0 z" id="path28" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 5.0799144,15.442045 -0.043557,-0.0054 -0.038112,0 -0.043557,-0.0054 -0.038113,-0.01089 -0.043557,-0.0054 -0.038113,-0.01089 -0.038112,-0.01633 -0.038112,-0.01089 -0.038113,-0.01633 -0.032668,-0.02178 -0.032668,-0.01633 -0.038112,-0.02178 -0.032668,-0.02722 -0.027223,-0.02178 -0.032668,-0.02722 -0.027223,-0.02722 -0.027223,-0.02722 -0.027223,-0.03267 -0.021779,-0.03267 -0.027223,-0.03267 -0.021779,-0.03267 -0.016334,-0.03267 -0.021778,-0.03811 -0.016334,-0.03811 -0.010889,-0.03267 -0.016334,-0.03811 -0.010889,-0.04356 -0.010889,-0.03811 -0.00544,-0.04356 -0.00544,-0.03811 0,-0.04356 -0.00544,-0.04356 c 0,-0.457346 0.3702329,-0.827579 0.8275791,-0.827579 0.4627909,0 0.8330238,0.370233 0.8330238,0.827579 0,0.457347 -0.3702329,0.833024 -0.8330238,0.833024 l 0,0 0,0 0,0 z" id="path30" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0" stroke-miterlimit="10.433"/> - <path d="m 6.3669949,5.3998846 -0.8971328,3.4514683 0,0 0,0 c 0,0 -0.8205483,-0.087906 -2.1717178,0.064773 0,0 -0.1969315,0 -0.1586393,-0.2035717 0.038291,-0.203572 0.3282193,-1.9107996 1.0995347,-3.067458 0,0 0.043763,-0.1156657 0.3555709,-0.1526789 0.3063379,-0.02776 1.0885941,-0.078652 1.7723843,-0.092533 l 0,0 0,0 0,0 z" id="path26" inkscape:connector-curvature="0" fill="#b3b3b3" stroke="#000000" stroke-width="0.185" stroke-miterlimit="10.433"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/70-2.svg b/htdocs/public/symbols/svgicons/70-2.svg deleted file mode 100755 index 668c42e1b16cf1426423cbeab3f9300e7c26bd18..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/70-2.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3937"/> - <rect id="rect3943" width="23" height="23" x="0.499" y="0.499" rx="1.917" fill="#cccccc" stroke="#000000" stroke-width="0.998"/> - <g id="g3338" transform="translate(0,-0.57361507)"> - <text transform="scale(0.99533893,1.0046829)" sodipodi:linespacing="0%" id="text4453" y="10.894" x="11.849" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="-0.184" font-size="7.5"><tspan y="10.894" x="11.757" id="tspan4455" sodipodi:role="line">FRZ</tspan><tspan id="tspan4457" y="10.894" x="11.849" sodipodi:role="line"/> - </text> - <text transform="scale(0.89906163,1.1122708)" sodipodi:linespacing="0%" id="text4459" y="17.708" x="13.351" font-family="Sans" text-anchor="middle" text-align="center" word-spacing="0" line-height="0%" font-weight="bold" letter-spacing="-0.252" font-size="7.5"><tspan y="17.708" x="13.225" id="tspan4461" sodipodi:role="line">RAIN</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/71-1.svg b/htdocs/public/symbols/svgicons/71-1.svg deleted file mode 100755 index 17f83b5c822575d01f42c95af33fd49815e935cb..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/71-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3077"/> - <rect id="rect3923" width="22.31" height="22.31" x="0.845" y="0.845" fill="#cccccc" stroke="#000099" stroke-width="1.69"/> - <path d="M 8,0.66006602 8,22.943895" id="path3925" inkscape:connector-curvature="0" fill="none" stroke="#000099" stroke-width="1.6"/> - <path d="M 16,0.92409211 16,23.207922" id="path3925-1" inkscape:connector-curvature="0" fill="none" stroke="#000099" stroke-width="1.6"/> - <path d="M 23.075911,16 0.7920807,16" id="path3925-1-6" inkscape:connector-curvature="0" fill="none" stroke="#000099" stroke-width="1.6"/> - <path d="M 23.287129,8 1.0032995,8" id="path3925-1-6-5" inkscape:connector-curvature="0" fill="none" stroke="#000099" stroke-width="1.6"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/71-2.svg b/htdocs/public/symbols/svgicons/71-2.svg deleted file mode 100755 index 98e4c8252eb3ac9e372a08f2aa72f180b5e8c68e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/71-2.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata4038"/> - <path d="m 0.79240343,11.317982 22.41519257,0 -11.228467,11.939825 z" id="path3073-7" inkscape:connector-curvature="0" fill="#ffffff" stroke="#000000" stroke-linejoin="round" stroke-width="1.585"/> - <g transform="translate(-2e-7,0.4661015)" id="g4597"> - <path d="M 8.0847458,0.0847458 15.915254,7.915254" id="path4049" fill="none" stroke="#000000" stroke-linecap="round"/> - <path d="M 15.915255,0.084746 8.0847452,7.915254" id="path4049-3" fill="none" stroke="#000000" stroke-linecap="round"/> - <path d="m 7.5597724,3.898305 8.8804556,0" id="path4069" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="1.058"/> - <path d="M 12,0.0338985 12,7.966102" id="path4069-0" fill="none" stroke="#000000" stroke-linecap="round"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/72-1.svg b/htdocs/public/symbols/svgicons/72-1.svg deleted file mode 100755 index 4c83e26583a4743c842e5a499d5f7a0400408964..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/72-1.svg +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3012"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3036" transform="translate(289.14285,1125.1429)"> - <rect rx="1.995" y="-96.78" x="-289.14" height="24" width="24" id="rect3284" fill="#0078ff" fill-rule="evenodd"/> - <g transform="matrix(0.0525723,0,0,0.0525723,-288.14285,-100.97938)" id="g1882" fill="#e2e3db"> - <g id="g1884"> - <path id="path1886" d="m 89.25,279.01 c 21.59,0 39.09,-17.5 39.09,-39.08 0,-21.59 -17.5,-39.09 -39.09,-39.09 -21.585,0 -39.085,17.5 -39.085,39.09 0,21.58 17.5,39.08 39.085,39.08 z" inkscape:connector-curvature="0"/> - <path id="path1888" d="M 89.25,239.93" inkscape:connector-curvature="0"/> - </g> - <path id="path1890" d="m 173.65,228.84 h 156.23 c 22.92,0 36.43,14.76 36.43,34.51 V 319.9 H 173.65 v -91.06 z" inkscape:connector-curvature="0"/> - <path id="path1892" d="M 131.12,249.08 V 283 H 71.054 c -29,0.1 -29.047,37.38 0,37.38 H 149.8 c 11.5,0 18.7,-9.28 18.7,-19.78 v -51.52 c 0,-28.22 -37.38,-28.22 -37.38,0 z" inkscape:connector-curvature="0"/> - <path id="path1894" d="M 42.702,196.26 C 42.702,165.48 0,165.48 0,196.26 v 246.81 h 43.651 v -63.74 h 332.12 v 63.26 h 42.7 V 251.96 c 0,-32.48 -43.17,-32.48 -43.17,0 v 76.09 h -332.6 l 0.002,-131.79 z" inkscape:connector-curvature="0"/> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/72-2.svg b/htdocs/public/symbols/svgicons/72-2.svg deleted file mode 100755 index 178ca43b10d85c22a834b64beea1a7b2c9e9d566..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/72-2.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - version="1.1" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="72-2.svg"> - <defs - id="defs33" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1277" - inkscape:window-height="747" - id="namedview31" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-16.830508" - inkscape:cy="12" - inkscape:window-x="212" - inkscape:window-y="418" - inkscape:window-maximized="0" - inkscape:current-layer="layer1" /> - <metadata - id="metadata3212"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1028.3622)"> - <rect - style="fill:#ff6600;fill-rule:evenodd;stroke:#000000;stroke-width:1.14321816px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - id="rect3334" - width="21.856783" - height="21.856781" - x="1.0716085" - y="1029.4338" - ry="0" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/73-1.svg b/htdocs/public/symbols/svgicons/73-1.svg deleted file mode 100755 index 80b2d43f7a46fdb6338c05b88fe3354c10d11ae7..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/73-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata4744"/> - <path d="m 0,1.1917886 24,0 L 17.938828,24 6.104348,24 z" id="path4752" inkscape:connector-curvature="0" fill="#ffff00"/> - <text x="2.623" y="10.633" id="text5262" sodipodi:linespacing="125%" transform="scale(0.98919696,1.010921)" fill="#0e6600" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="9"><tspan sodipodi:role="line" id="tspan5264" x="2.623" y="10.633">TCP</tspan> - </text> - <text x="6.773" y="22.18" id="text5262-9" sodipodi:linespacing="125%" transform="scale(1.0579262,0.94524551)" fill="#0e6600" font-family="Sans" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="9"><tspan sodipodi:role="line" id="tspan5264-7" x="6.773" y="22.18">IP</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/73-2.svg b/htdocs/public/symbols/svgicons/73-2.svg deleted file mode 100755 index d1c7d5c0dafe88148db9b548f4fd75123bb6118f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/73-2.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata4038"/> - <path d="m 0.79240343,11.317982 22.41519257,0 -11.228467,11.939825 z" id="path3073-7" inkscape:connector-curvature="0" fill="#ffffff" stroke="#000000" stroke-linejoin="round" stroke-width="1.585"/> - <path sodipodi:type="arc" id="path3756" sodipodi:cx="-16.576271" sodipodi:cy="4.6779661" sodipodi:rx="4.1694913" sodipodi:ry="4.1694913" d="m -12.40678,4.6779661 a 4.1694913,4.1694913 0 1 1 -8.338982,0 4.1694913,4.1694913 0 1 1 8.338982,0 z" transform="matrix(1.2682927,0,0,1.2682927,33.023564,-0.64489491)" stroke-width="1.6"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/74-1.svg b/htdocs/public/symbols/svgicons/74-1.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/74-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/74-2.svg b/htdocs/public/symbols/svgicons/74-2.svg deleted file mode 100755 index 472fbb36e4b95759b0fc574191f3c9e87937ca4d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/74-2.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3612" transform="matrix(0.10386872,0,0,0.10386872,-31.118241,990.7961)" stroke="#d45500" stroke-width="6.657"> - <g id="g3620"> - <path inkscape:connector-curvature="0" d="m 480.641,428.896 c -0.08,0 -54.669,1.311 -54.669,1.311 l 43.71,-62.555 c 0.465,-0.676 1.057,-1.586 1.672,-2.652 l -79.879,0 -48.62,102.676 c -1.448,3.059 -1.251,6.643 0.524,9.525 1.776,2.881 4.89,4.67 8.273,4.75 l 42.475,1.021 -53.1,90.703 c -2.462,4.193 -1.66,9.635 1.91,12.945 1.936,1.793 4.455,2.779 7.092,2.779 2.898,-0.002 5.689,-1.221 7.649,-3.338 l 130.29,-140.363 c 2.735,-2.947 3.439,-7.246 1.788,-10.91 -1.617,-3.593 -5.19,-5.892 -9.115,-5.892 z" id="path3622" fill="#ffdc21"/> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/75-1.svg b/htdocs/public/symbols/svgicons/75-1.svg deleted file mode 100755 index c71b0bd4af3654bf2854f35e9343833ea6f68208..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/75-1.svg +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3010"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3032" transform="translate(614.85714,1462.2857)"> - <path sodipodi:nodetypes="cccsscsssscssc" id="rect2391" d="m -594.6091,-422.9064 -8.24601,-6.1895 -8.25007,6.19208 0,11.62589 c 0,0.2288 0.21777,0.41209 0.4872,0.41209 l 4.63803,0 0,-3.87965 c 0,-0.22837 0.21625,-0.41296 0.48619,-0.41296 l 5.30971,0 c 0.26994,0 0.4862,0.18459 0.4862,0.41296 l 0,3.87965 4.60256,0 c 0.26943,0 0.48619,-0.18329 0.48619,-0.41209 z" inkscape:connector-curvature="0" fill="#ff0000" stroke="#000000" stroke-width="1.865"/> - <path id="path2399-0" d="m -602.90242,-433.68061 -11.70152,8.78223 1.2326,1.17832 10.51643,-7.89324 10.51441,7.89324 1.23016,-1.17832 -11.69899,-8.78223 -0.0456,0.0447 -0.0476,-0.0447 z" inkscape:connector-curvature="0" stroke="#000000" stroke-linejoin="round" stroke-width="0.466"/> - <path id="rect2404" d="m -611.10488,-432.41644 2.96628,0 -0.0258,1.4891 -2.94045,2.25147 0,-3.74057 z" inkscape:connector-curvature="0"/> - <path transform="matrix(1.3354475,0,0,1.3354475,-572.93556,-438.8482)" d="m -19.929245,12.915094 c 0,1.367687 -1.108729,2.476416 -2.476416,2.476416 -1.367686,0 -2.476415,-1.108729 -2.476415,-2.476416 0,-1.367686 1.108729,-2.476415 2.476415,-2.476415 1.367687,0 2.476416,1.108729 2.476416,2.476415 z" sodipodi:ry="2.4764152" sodipodi:rx="2.4764152" sodipodi:cy="12.915094" sodipodi:cx="-22.405661" id="path3003" sodipodi:type="arc" fill="#ffffff" stroke="#000000" stroke-width="0.834"/> - <path inkscape:connector-curvature="0" id="path3793" d="m -602.85714,-422.35748 0,-1.58471" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.613"/> - <path inkscape:connector-curvature="0" id="path3793-6" d="m -603.60832,-421.60077 -0.99519,0" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="0.562"/> - <path transform="matrix(16.977259,0,0,16.977259,51.188677,-608.51344)" d="m -38.480178,11.009591 c 0,0.02465 -0.01999,0.04464 -0.04464,0.04464 -0.02465,0 -0.04464,-0.01999 -0.04464,-0.04464 0,-0.02465 0.01999,-0.04464 0.04464,-0.04464 0.02465,0 0.04464,0.01999 0.04464,0.04464 z" sodipodi:ry="0.044640578" sodipodi:rx="0.044640578" sodipodi:cy="11.009591" sodipodi:cx="-38.524818" id="path3813" sodipodi:type="arc"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/75-2.svg b/htdocs/public/symbols/svgicons/75-2.svg deleted file mode 100755 index c84a79fefa0ba2fdfda11657f9b4f3f8f36f5923..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/75-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata17"/> - <path sodipodi:nodetypes="cccc" d="m 8.97624,2.120499 6.94776,0 L 11.99999,8.890666 8.076,2.1205" id="path22355" inkscape:connector-curvature="0" fill="#ec1b24" fill-rule="evenodd"/> - <path d="M 11.999,15.922856 15.75,21.895125 24,2.104875 20.496008,2.136125 15.49975,13.955375 11.999,9.226959" id="path22353-6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" fill="#1a1a1a" fill-rule="evenodd"/> - <path d="M 12.001,15.922856 8.25,21.895125 0,2.104875 3.503992,2.136125 8.50025,13.955375 12.001,9.226959" id="path22353-6-1" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" fill="#1a1a1a" fill-rule="evenodd"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/76-1.svg b/htdocs/public/symbols/svgicons/76-1.svg deleted file mode 100755 index 5a32cf8d5be46134dae1a956693beb4a57b6db24..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/76-1.svg +++ /dev/null @@ -1,124 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <defs id="defs3"> - <linearGradient id="linearGradient2985" inkscape:collect="always"> - <stop id="stop2987" stop-color="#d8dfd6"/> - <stop id="stop2989" offset="1" stop-color="#d8dfd6" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2752"> - <stop id="stop2754" stop-color="#9d9d9d"/> - <stop id="stop2756" offset="1" stop-color="#b9b9b9"/> - </linearGradient> - <linearGradient id="linearGradient2711"> - <stop id="stop2713" stop-color="#909090"/> - <stop id="stop2715" offset="1" stop-color="#bebebe" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2701"> - <stop id="stop2703" stop-color="#585956"/> - <stop id="stop2705" offset="1" stop-color="#bbbeb8"/> - </linearGradient> - <linearGradient id="linearGradient2691"> - <stop id="stop2693" stop-color="#868686"/> - <stop id="stop2695" offset="1" stop-color="#e9e9e9"/> - </linearGradient> - <linearGradient id="linearGradient2683" inkscape:collect="always"> - <stop id="stop2685"/> - <stop id="stop2687" offset="1" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2675"> - <stop id="stop2677" stop-color="#5b5b97"/> - <stop id="stop2679" offset="1" stop-color="#1b1b43"/> - </linearGradient> - <linearGradient id="linearGradient2667"> - <stop id="stop2669" stop-color="#ffffff"/> - <stop id="stop2671" offset="1" stop-color="#fcfcff" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2635" inkscape:collect="always"> - <stop id="stop2637" stop-color="#f9fff5"/> - <stop id="stop2639" offset="1" stop-color="#f9fff5" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2623"> - <stop id="stop2625" stop-color="#dfdfde"/> - <stop id="stop2627" offset="1" stop-color="#9d9f9a"/> - </linearGradient> - <linearGradient inkscape:collect="always" id="linearGradient2415"> - <stop id="stop2417" stop-color="#ffffff"/> - <stop offset="1" id="stop2419" stop-color="#ffffff" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2379"> - <stop id="stop2381" stop-color="#1a4876"/> - <stop offset="1" id="stop2383" stop-color="#3f54a3" stop-opacity="0"/> - </linearGradient> - <linearGradient inkscape:collect="always" id="linearGradient2307"> - <stop id="stop2309" stop-color="#5a7aa4"/> - <stop offset="1" id="stop2311" stop-color="#5a7aa4" stop-opacity="0"/> - </linearGradient> - <linearGradient id="linearGradient2253"> - <stop id="stop2255" stop-color="#8f8f8f"/> - <stop offset="1" id="stop2257" stop-color="#494949"/> - </linearGradient> - <linearGradient id="linearGradient2245"> - <stop id="stop2247" stop-color="#dde1d9"/> - <stop offset="1" id="stop2249" stop-color="#cacdc6"/> - </linearGradient> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2245" id="linearGradient2251" gradientTransform="matrix(0.59023401,0,0,0.46235188,10.909502,10.860705)" x1="8.612" y1="7.229" x2="34.784" y2="33.34" gradientUnits="userSpaceOnUse"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2307" id="linearGradient2313" gradientTransform="matrix(1.208393,0,0,0.98441,-0.789284,-0.50338)" x1="16.852" y1="9.324" x2="24.419" y2="53.735" gradientUnits="userSpaceOnUse"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2415" id="linearGradient2334" gradientTransform="matrix(1.289166,0,0,0.922731,-0.789284,-0.50338)" x1="16.12" y1="10.842" x2="27.29" y2="39.03" gradientUnits="userSpaceOnUse"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2415" id="linearGradient2421" gradientTransform="matrix(0.57884895,0,0,0.47144572,12.280787,12.064496)" x1="17.698" y1="13" x2="34.975" y2="55.2" gradientUnits="userSpaceOnUse"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2379" id="linearGradient2445" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.02787,0,0,0.822296,1.523986,1.001198)" x1="21.356" y1="30.08" x2="19.995" y2="-1.322"/> - <radialGradient inkscape:collect="always" xlink:href="#linearGradient2683" id="radialGradient2460" gradientTransform="matrix(1.0060312,0,0,0.37133584,10.724808,4.4285903)" cx="12.576" cy="67.5" r="8.766" gradientUnits="userSpaceOnUse"/> - <radialGradient inkscape:collect="always" xlink:href="#linearGradient2683" id="radialGradient2464" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0060312,0,0,0.37133584,10.724808,1.6055035)" cx="12.576" cy="67.5" r="8.766"/> - <linearGradient y2="92.57" x2="0" y1="84.03" gradientTransform="scale(1.983556,0.504145)" gradientUnits="userSpaceOnUse" id="linearGradient2653" xlink:href="#linearGradient2623" inkscape:collect="always"/> - <linearGradient y2="74.1" x2="8.649" y1="101.28" x1="13.629" gradientTransform="scale(2.143634,0.466498)" gradientUnits="userSpaceOnUse" id="linearGradient2655" xlink:href="#linearGradient2635" inkscape:collect="always"/> - <radialGradient r="8.766" cy="67.5" cx="12.576" gradientTransform="matrix(1.2720238,0,0,0.35026711,8.5110164,9.4523034)" gradientUnits="userSpaceOnUse" id="radialGradient2659" xlink:href="#linearGradient2683" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="26.729" x2="17.199" y1="1.654" x1="11.492" gradientTransform="matrix(0.64723455,0,0,0.4680418,12.066894,10.846521)" id="linearGradient2673" xlink:href="#linearGradient2667" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="8.867" x2="16.316" y1="32.622" x1="19.15" gradientTransform="matrix(0.61336354,0,0,0.49388778,12.13547,10.846521)" id="linearGradient2681" xlink:href="#linearGradient2675" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="162.45" x2="0" y1="171.29" gradientTransform="matrix(2.9803427,0,0,0.09156528,12.280787,11.187201)" id="linearGradient2689" xlink:href="#linearGradient2683" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="64.893" x2="12.13" y1="53.54" x1="12.207" gradientTransform="matrix(0.94884831,0,0,0.28760733,11.758393,11.542102)" id="linearGradient2707" xlink:href="#linearGradient2701" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="3.845" x2="35.521" y1="3.938" x1="34.3" id="linearGradient2717" xlink:href="#linearGradient2711" inkscape:collect="always" gradientTransform="matrix(0.69543065,0,0,0.34397002,6.3153941,13.032945)"/> - <linearGradient y2="3.845" x2="35.521" y1="3.938" x1="34.3" gradientUnits="userSpaceOnUse" id="linearGradient2721" xlink:href="#linearGradient2711" inkscape:collect="always" gradientTransform="matrix(0.69543065,0,0,0.34397002,6.3747381,14.132995)"/> - <linearGradient y2="3.845" x2="35.521" y1="3.938" x1="34.3" gradientUnits="userSpaceOnUse" id="linearGradient2725" xlink:href="#linearGradient2711" inkscape:collect="always" gradientTransform="matrix(0.69543065,0,0,0.34397002,6.4340821,15.177784)"/> - <linearGradient y2="3.845" x2="35.521" y1="3.938" x1="34.3" gradientUnits="userSpaceOnUse" id="linearGradient2729" xlink:href="#linearGradient2711" inkscape:collect="always" gradientTransform="matrix(0.69543065,0,0,0.34397002,6.4934261,16.222572)"/> - <linearGradient y2="3.845" x2="35.521" y1="3.938" x1="34.3" gradientUnits="userSpaceOnUse" id="linearGradient2733" xlink:href="#linearGradient2711" inkscape:collect="always" gradientTransform="matrix(0.69543065,0,0,0.34397002,6.5527701,17.267361)"/> - <linearGradient y2="74.1" x2="8.649" y1="101.28" x1="13.629" gradientTransform="matrix(1.1198222,0,0,0.24369591,12.280787,11.276294)" gradientUnits="userSpaceOnUse" id="linearGradient2741" xlink:href="#linearGradient2635" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="100.2" x2="0" y1="88.51" gradientTransform="matrix(1.206653,0,0,0.22615913,11.758393,11.542102)" id="linearGradient2758" xlink:href="#linearGradient2752" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="31.25" x2="32.537" y1="5.382" x1="10.391" gradientTransform="matrix(0.57693072,0,0,0.47301291,11.758393,11.542102)" id="linearGradient2979" xlink:href="#linearGradient2253" inkscape:collect="always"/> - <linearGradient y2="52.54" x2="18.18" y1="48.643" x1="18.317" gradientTransform="matrix(0.59023401,0,0,0.46235188,11.758393,11.542102)" gradientUnits="userSpaceOnUse" id="linearGradient2981" xlink:href="#linearGradient2245" inkscape:collect="always"/> - <linearGradient gradientUnits="userSpaceOnUse" y2="44.879" x2="0" y1="49.953" gradientTransform="matrix(0.73329015,0,0,0.32902483,40.700924,13.381553)" id="linearGradient2991" xlink:href="#linearGradient2985" inkscape:collect="always"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2752" id="linearGradient3096" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.206653,0,0,0.22615913,-0.861067,23.375509)" y1="88.51" x2="0" y2="100.2"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2245" id="linearGradient3108" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.59023401,0,0,0.46235188,-0.861067,23.375509)" x1="18.317" y1="48.643" x2="18.18" y2="52.54"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2667" id="linearGradient3112" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.64723455,0,0,0.4680418,-0.552566,22.679928)" x1="11.492" y1="1.654" x2="17.199" y2="26.729"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2683" id="linearGradient3116" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.9803427,0,0,0.09156528,-0.338673,23.020608)" y1="171.29" x2="0" y2="162.45"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2245" id="linearGradient3120" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.59023401,0,0,0.46235188,-1.709958,22.694112)" x1="8.612" y1="7.229" x2="34.784" y2="33.34"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient2701" id="linearGradient3123" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.94884831,0,0,0.28760733,-0.861067,23.375509)" x1="12.207" y1="53.54" x2="12.13" y2="64.893"/> - </defs> - <metadata id="metadata4"/> - <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,-24)"> - <ellipse id="path2452" cx="23.376" cy="29.494" rx="8.819" ry="3.255" transform="translate(-12.61946,11.833407)" fill="url(#radialGradient2460)" fill-rule="evenodd" color="#000000"/> - <ellipse id="path2407" cx="23.19" cy="28.739" rx="4.908" ry="2.058" transform="translate(-12.61946,11.833407)" fill="#adb0aa" fill-rule="evenodd" stroke="#1a1a1a" color="#000000" stroke-width="0.522"/> - <ellipse id="path1825" cx="23.19" cy="28.37" rx="4.614" ry="1.935" transform="translate(-12.61946,11.833407)" fill="none" stroke="#7b7f7a" color="#000000" stroke-width="0.491"/> - <ellipse id="path2983" cx="23.19" cy="27.978" rx="4.614" ry="1.935" transform="translate(-12.61946,11.833407)" fill="none" stroke="url(#linearGradient2991)" color="#000000" stroke-width="0.334"/> - <path sodipodi:nodetypes="ccccccccccccccccc" d="m 12.557937,38.402831 -0.03265,0.522394 c 0,0 2.25889,1.880184 4.701549,2.195366 1.22133,0.15759 2.483293,0.366936 3.526162,0.620343 1.042869,0.253407 1.874537,0.584876 2.154876,0.865216 0.162157,0.162157 0.235633,0.299665 0.261198,0.40812 0.02556,0.108455 0.01996,0.185354 -0.04897,0.293847 -0.137877,0.216987 -0.564111,0.505496 -1.289661,0.734617 -1.451099,0.458242 -4.033105,0.750942 -7.607367,0.750942 l 0,0.522394 c 3.60243,0 6.197511,-0.275652 7.754291,-0.767267 0.778389,-0.245807 1.319015,-0.530589 1.583507,-0.946839 0.132247,-0.208125 0.186663,-0.464121 0.130599,-0.701968 -0.05606,-0.237846 -0.200889,-0.462086 -0.408121,-0.669317 -0.458437,-0.458438 -1.325229,-0.734717 -2.399749,-0.995814 -1.074519,-0.261098 -2.358994,-0.477641 -3.59146,-0.636669 -2.464932,-0.318055 -4.734199,-2.195365 -4.734199,-2.195365 z" id="path2411" inkscape:connector-curvature="0" fill="#d0d0d0" fill-rule="evenodd" stroke="#1a1a1a" stroke-linejoin="round" stroke-width="0.209"/> - <ellipse id="path2462" cx="23.376" cy="26.671" rx="8.819" ry="3.255" transform="translate(-12.61946,11.833407)" fill="url(#radialGradient2464)" fill-rule="evenodd" color="#000000"/> - <rect y="39.41" x="8.266" height="1.431" width="4.722" id="rect2699" fill="url(#linearGradient3123)" fill-rule="evenodd" color="#000000" stroke-width="0.609"/> - <path d="m 2.837956,24.261292 15.456705,0 c 0.47608,0 0.848445,0.304808 0.870702,0.732181 l 0.695852,13.361862 c 0.03041,0.583898 -0.470707,1.055395 -1.055396,1.055395 l -16.479021,0 c -0.584689,0 -1.085804,-0.471497 -1.055396,-1.055395 L 1.967254,24.993473 c 0.02104,-0.40409 0.286013,-0.732181 0.870702,-0.732181 z" id="rect2404" sodipodi:nodetypes="cssssssss" inkscape:connector-curvature="0" fill="url(#linearGradient3120)" fill-rule="evenodd" stroke="#1a1a1a" color="#000000" stroke-width="0.522"/> - <path sodipodi:nodetypes="ccccc" id="path2377" d="m 4.1898777,26.200665 -0.5840244,10.364714 12.9999657,0 -0.627665,-10.320787 -11.7882763,-0.04393 z" inkscape:connector-curvature="0" fill="#008000" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="0.535"/> - <path d="m 2.365989,38.386922 16.418058,0" id="path2393" inkscape:connector-curvature="0" stroke-opacity="0.248" fill="none" stroke="url(#linearGradient3116)" stroke-linecap="round" stroke-width="0.52"/> - <path sodipodi:nodetypes="cssssssss" id="path2397" d="m 2.75108,24.789285 15.591121,-0.01975 c 0.148202,-1.88e-4 0.292176,0.123938 0.304088,0.340885 l 0.711445,12.957076 c 0.03032,0.552187 -0.281962,0.932929 -0.83498,0.932929 l -15.945548,0 c -0.553018,0 -0.832182,-0.380716 -0.80233,-0.932929 L 2.466573,25.271882 c 0.02021,-0.373946 0.08692,-0.48235 0.284507,-0.4826 z" inkscape:connector-curvature="0" stroke-opacity="0.701" fill="none" stroke="#333333" color="#000000" stroke-width="0.522"/> - <path sodipodi:nodetypes="ccccc" d="m 3.68979,25.854982 -0.419237,9.335359 c 5.769656,-1.254076 5.966508,-5.481066 13.140324,-6.867788 l -0.08435,-2.43306 -12.636735,-0.03451 z" id="path2443" inkscape:connector-curvature="0" opacity="0.531" fill="url(#linearGradient3112)" fill-rule="evenodd"/> - <ellipse id="path2657" cx="24.508" cy="33.1" rx="11.151" ry="3.071" transform="translate(-12.61946,11.833407)" fill="url(#radialGradient2659)" fill-rule="evenodd" color="#000000"/> - <path sodipodi:nodetypes="cssssssss" id="path2409" d="m 2.514741,42.608736 16.195481,0 c 0.584689,0 0.510565,0.141798 0.570573,0.320148 l 1.480803,4.401073 c 0.06001,0.17835 0.01412,0.320147 -0.570573,0.320147 l -19.157087,0 c -0.584689,0 -0.630582,-0.141797 -0.570573,-0.320147 l 1.480803,-4.401073 c 0.06001,-0.17835 -0.01412,-0.320148 0.570573,-0.320148 z" inkscape:connector-curvature="0" fill="url(#linearGradient3108)" fill-rule="evenodd" stroke="#1a1a1a" color="#000000" stroke-width="0.522"/> - <path sodipodi:nodetypes="ccccccccc" id="path2611" d="m 2.477915,43.659617 -0.923471,2.678067 2.862761,0 0.277042,-1.061992 7.757159,0 0.287149,1.084028 3.222042,0 -0.877297,-2.700103 -12.605385,0 z" inkscape:connector-curvature="0" fill="#7a7d77" fill-rule="evenodd"/> - <path id="path2613" d="m 4.925114,45.460387 -0.230867,0.877298 7.710986,0 -0.230868,-0.923472 -7.249251,0.04617 z" inkscape:connector-curvature="0" fill="#777874" fill-rule="evenodd"/> - <path d="m 18.777186,43.659617 0.877298,2.631894 -2.862762,-0.04617 -0.784951,-2.539546 2.770415,-0.04617 z" id="path2619" inkscape:connector-curvature="0" fill="#777a75" fill-rule="evenodd" color="#000000" stroke-width="0.313"/> - <path id="path2615" d="m 18.777186,43.382577 0.877298,2.631894 -2.862762,-0.04617 -0.784951,-2.539547 2.770415,-0.04617 z" inkscape:connector-curvature="0" fill="url(#linearGradient3096)" fill-rule="evenodd" color="#000000" stroke-width="0.313"/> - <path d="m 2.477915,43.336403 -0.923471,2.678068 2.862761,0 0.277042,-1.061993 7.757159,0 0.287149,1.084028 3.222042,0 -0.877297,-2.700103 -12.605385,0 z" id="path2617" sodipodi:nodetypes="ccccccccc" inkscape:connector-curvature="0" fill="url(#linearGradient3096)" fill-rule="evenodd"/> - <path d="m 4.925114,45.183346 -0.230867,0.877299 7.710986,0 -0.230868,-0.923472 -7.249251,0.04617 z" id="path2621" inkscape:connector-curvature="0" fill="url(#linearGradient3096)" fill-rule="evenodd" color="#000000" stroke-width="0.313"/> - <path d="m 2.340071,43.006103 16.625625,0 1.377647,4.227509 -19.464971,0 1.461699,-4.227509 z" id="path2631" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" fill="none" stroke="#b3b3b3" stroke-linejoin="round" color="#000000" stroke-width="0.261"/> - <ellipse id="path2709" cx="30.503" cy="14.388" rx="0.584" ry="0.289" transform="translate(-12.61946,11.833407)" fill="url(#linearGradient2717)" fill-rule="evenodd" color="#000000" stroke-width="0.5"/> - <ellipse id="path2719" cx="30.562" cy="15.488" rx="0.584" ry="0.289" transform="translate(-12.61946,11.833407)" fill="url(#linearGradient2721)" fill-rule="evenodd" color="#000000" stroke-width="0.5"/> - <ellipse id="path2723" cx="30.622" cy="16.532" rx="0.584" ry="0.289" transform="translate(-12.61946,11.833407)" fill="url(#linearGradient2725)" fill-rule="evenodd" color="#000000" stroke-width="0.5"/> - <ellipse id="path2727" cx="30.681" cy="17.577" rx="0.584" ry="0.289" transform="translate(-12.61946,11.833407)" fill="url(#linearGradient2729)" fill-rule="evenodd" color="#000000" stroke-width="0.5"/> - <ellipse id="path2731" cx="30.74" cy="18.622" rx="0.584" ry="0.289" transform="translate(-12.61946,11.833407)" fill="url(#linearGradient2733)" fill-rule="evenodd" color="#000000" stroke-width="0.5"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/76-2.svg b/htdocs/public/symbols/svgicons/76-2.svg deleted file mode 100755 index 9ae22bd0c15c919b7e9a63562698642849f2601e..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/76-2.svg +++ /dev/null @@ -1,78 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" height="24" width="24" version="1.1"> - <metadata id="metadata3"/> - <defs id="defs1572"> - <linearGradient id="linearGradient1669"> - <stop id="stop1670" stop-color="#fd5a00"/> - <stop id="stop1671" offset="1" stop-color="#fffa7d"/> - </linearGradient> - <linearGradient id="linearGradient1655"> - <stop id="stop1656" stop-color="#fde700"/> - <stop id="stop1657" offset="1" stop-color="#fffaff"/> - </linearGradient> - <linearGradient id="linearGradient1651"> - <stop id="stop1652" stop-color="#6b6b6a"/> - <stop id="stop1653" offset="1" stop-color="#bdbdbd"/> - </linearGradient> - <linearGradient id="linearGradient1643"> - <stop id="stop1644" stop-color="#522722"/> - <stop id="stop1645" offset="1" stop-color="#975a00"/> - </linearGradient> - <linearGradient id="linearGradient1625"> - <stop id="stop1626"/> - <stop id="stop1627" offset="1" stop-color="#a7a6a6"/> - </linearGradient> - <linearGradient id="linearGradient1618"> - <stop id="stop1619" stop-color="#7f7f7f"/> - <stop id="stop1620" offset="1" stop-color="#f0f0f0"/> - </linearGradient> - <linearGradient id="linearGradient1607"> - <stop id="stop1608" stop-color="#870000"/> - <stop id="stop1609" offset="1" stop-color="#ff0000"/> - </linearGradient> - <linearGradient id="linearGradient1610" xlink:href="#linearGradient1625" gradientTransform="matrix(0.03846753,0,0,0.02113344,-1.1884015,-2.607463)" x1="281.43" x2="403.99" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1611" xlink:href="#linearGradient1625" gradientTransform="matrix(0.0520113,0,0,0.01563028,-1.1884015,-2.607463)" x1="208.15" x2="298.83" gradientUnits="userSpaceOnUse"/> - <radialGradient cx="173.15" cy="453.05" id="radialGradient1612" r="62.09" xlink:href="#linearGradient1625" gradientTransform="matrix(0.0638069,-0.00112233,2.2019652e-4,0.01251865,-1.0938389,-2.4122535)" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1617" x1="244.75" x2="383.17" xlink:href="#linearGradient1618" y1="826.31" y2="820.08" gradientTransform="matrix(0.04465307,0,0,0.02401902,-3.1582371,-4.0909887)" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1628" x1="311.75" x2="429.89" xlink:href="#linearGradient1625" y1="655.36" y2="643.29" gradientTransform="matrix(0.04372273,0,0,0.0245301,-3.1582371,-4.0909887)" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1629" x1="0" x2="1" xlink:href="#linearGradient1618"/> - <linearGradient id="linearGradient1638" x1="683.62" x2="620.93" xlink:href="#linearGradient1625" y1="479.49" y2="542.28" gradientTransform="matrix(0.02162252,0,0,0.04960209,-4.8715715,-3.8205162)" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1642" x1="555.12" x2="466.77" xlink:href="#linearGradient1643" y1="658.4" y2="743.48" gradientTransform="matrix(0.02975007,0,0,0.0360511,-4.8715715,-3.8205162)" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.15406935,0,0,0.0069613,-3.1582371,-4.0909887)" id="linearGradient1647" x1="69.39" x2="127.7" xlink:href="#linearGradient1651" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.16164309,0,0,0.00663513,-3.1582371,-4.0909887)" id="linearGradient1648" x1="63.19" x2="124.36" xlink:href="#linearGradient1651" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.16850448,0,0,0.00636495,-3.1582371,-4.0909887)" id="linearGradient1649" x1="58.07" x2="121.84" xlink:href="#linearGradient1651" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1650" x1="504.56" x2="1035.09" xlink:href="#linearGradient1625" gradientTransform="matrix(0.02220578,0,0,0.04829925,-3.1582371,-4.0909887)" gradientUnits="userSpaceOnUse"/> - <radialGradient cx="410.12" cy="281.45" id="radialGradient1654" r="3.801" spreadMethod="reflect" xlink:href="#linearGradient1655" gradientTransform="scale(1.0187186,0.98162532)" gradientUnits="userSpaceOnUse"/> - <radialGradient cx="1070.94" cy="112.3" id="radialGradient1661" r="0.943" spreadMethod="reflect" xlink:href="#linearGradient1655" gradientTransform="scale(0.42008915,2.3804471)" gradientUnits="userSpaceOnUse"/> - <radialGradient cx="923.81" cy="109.91" id="radialGradient1662" r="0.901" spreadMethod="reflect" xlink:href="#linearGradient1655" gradientTransform="scale(0.41100851,2.4330396)" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1668" spreadMethod="reflect" x1="143.84" x2="151.66" xlink:href="#linearGradient1669" y1="647.74" y2="647.54" gradientTransform="scale(2.7026083,0.37001293)" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.02248161,0,0,0.04770663,-3.1582371,-4.0909887)" id="linearGradient672" x1="665.93" x2="681.55" xlink:href="#linearGradient1625" gradientUnits="userSpaceOnUse"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient1618" id="linearGradient4235" x1="245.44" y1="542.1" x2="365.1" y2="536.72" gradientTransform="matrix(0.04619997,0,0,0.02321479,-3.1582371,-4.0909887)" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.16850448,0,0,0.00654644,26.105757,-4.4799845)" id="linearGradient1649-2" x1="58.07" x2="121.84" xlink:href="#linearGradient1651" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.16164309,0,0,0.00682433,26.105757,-4.4799845)" id="linearGradient1648-8" x1="63.19" x2="124.36" xlink:href="#linearGradient1651" gradientUnits="userSpaceOnUse"/> - <linearGradient gradientTransform="matrix(0.15406935,0,0,0.0071598,26.105757,-4.4799845)" id="linearGradient1647-9" x1="69.39" x2="127.7" xlink:href="#linearGradient1651" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1638-9" x1="683.62" x2="620.93" xlink:href="#linearGradient1625" y1="479.49" y2="542.28" gradientTransform="matrix(0.02162252,0,0,0.05101649,24.392423,-4.2017994)" gradientUnits="userSpaceOnUse"/> - <linearGradient id="linearGradient1650-0" x1="507.69" x2="859.37" xlink:href="#linearGradient1651" gradientTransform="matrix(0.02220578,0,0,0.04967651,26.105757,-4.4799845)" gradientUnits="userSpaceOnUse"/> - </defs> - <rect id="rect3405" width="4.564" height="3.867" x="9.685" y="2.748" fill="#cccccc"/> - <path sodipodi:nodetypes="cccc" id="path1578" d="m 14.483576,3.0641418 -4.9839696,0 c 0,-0.5184774 1.1156986,-0.9387874 2.4919836,-0.9387874 1.376287,0 2.491986,0.42031 2.491986,0.9387874 z" inkscape:connector-curvature="0" fill="url(#radialGradient1612)" fill-rule="evenodd" stroke="#000000" stroke-width="0.073"/> - <path id="path1586" d="m 9.6558587,3.0248651 0,2.5607126 4.6779183,0 0,-2.5607126 -4.6779183,0 z m 0.1503714,0.1089605 0,2.3698829 1.2028349,0 0,-2.3698829 -1.2028349,0 z m 1.3531869,0 0,2.3698804 1.672689,0 0,-2.3698804 -1.672689,0 z m 1.823042,0 0,2.3698829 1.202831,0 0,-2.3698829 -1.202831,0 z" inkscape:connector-curvature="0" fill="url(#linearGradient1610)" fill-rule="evenodd" stroke="#000000" stroke-width="0.073"/> - <rect y="5.568" x="9.656" width="4.68" id="rect1606" height="1.388" fill="url(#linearGradient1611)" fill-rule="evenodd" stroke="#000000" stroke-width="0.073"/> - <path inkscape:connector-curvature="0" d="M 8.9844364,6.7531278 8.1344467,23.70939 l 7.7713113,0 -0.971415,-16.9562622 -5.9499066,0 z" id="path1574" sodipodi:nodetypes="ccccc" fill="url(#linearGradient1650)" fill-rule="evenodd" stroke="#000000" stroke-width="0.089"/> - <path inkscape:connector-curvature="0" d="M 8.9464909,6.93346 8.8009459,10.104253 15.132273,10.084559 14.96247,6.953154 8.9464909,6.93346 Z" id="path1622" sodipodi:nodetypes="ccccc" fill="url(#linearGradient4235)" fill-rule="evenodd" stroke="#000000" stroke-width="0.089"/> - <path inkscape:connector-curvature="0" d="m 8.6311364,13.885562 -0.169806,3.80101 7.0833266,0 -0.218321,-3.80101 -6.6951996,0 z" id="path1623" sodipodi:nodetypes="ccccc" fill="#ffffff" fill-rule="evenodd" stroke="#000000" stroke-width="0.089"/> - <rect height="1.147" id="rect1613" width="0.291" x="12.173" y="7.386" fill="#3b3a3a" fill-rule="evenodd" stroke="#000000" stroke-width="0.033"/> - <rect height="1.185" id="rect1615" width="0.291" x="12.221" y="10.831" fill="#010000" fill-rule="evenodd" stroke="#000000" stroke-width="0.033"/> - <path inkscape:connector-curvature="0" d="m 10.351367,19.930301 c -0.6818126,0 -1.2307063,0.471152 -1.2307063,1.056397 l 0.036204,1.957452 2.4386113,0 -0.03619,-1.957452 c 0,-0.585245 -0.45371,-1.056397 -1.135515,-1.056397 l -0.07239,0 z" id="path1631" sodipodi:nodetypes="ccccccc" fill="url(#linearGradient1642)" fill-rule="evenodd" stroke="#000000" stroke-width="0.033"/> - <path inkscape:connector-curvature="0" d="m 10.351367,19.930301 c -0.6818126,0 -1.2307063,0.471152 -1.2307063,1.056397 l 0.036204,1.957452 0.2493497,0 -0.036197,-1.957452 c 0,-0.585245 0.5933257,-0.94048 1.0537476,-1.056397 l -0.0724,0 z" id="path1632" sodipodi:nodetypes="ccccccc" fill="url(#linearGradient1638)" fill-rule="evenodd" stroke="#000000" stroke-width="0.033"/> - <rect height="0.376" id="rect1639" width="8.947" x="7.55" y="22.925" fill="url(#linearGradient1647)" fill-rule="evenodd" stroke="#000000" stroke-width="0.089"/> - <rect height="0.376" id="rect1640" width="9.852" x="7.07" y="23.23" fill="url(#linearGradient1648)" fill-rule="evenodd" stroke="#000000" stroke-width="0.089"/> - <rect height="0.376" id="rect1641" width="10.71" x="6.645" y="23.582" fill="url(#linearGradient1649)" fill-rule="evenodd" stroke="#000000" stroke-width="0.089"/> - <path inkscape:connector-curvature="0" d="m 10.46374,20.002227 0.04763,2.861497" id="path1646" fill="none" fill-rule="evenodd" stroke="#000000" stroke-width="0.033"/> - <g id="g7546" transform="matrix(2.6057113,0,0,-2.6800134,0.00521142,6.4130072)" opacity="0.5" fill="#ffff00"> - <path inkscape:connector-curvature="0" d="M 0,0 -0.002,1.449 3.412,1.012 3.414,0.434 0,0 Z" id="path7548"/> - </g> - <g id="g7546-6" transform="matrix(-2.6057113,0,0,-2.6800134,23.994776,6.4130072)" opacity="0.5" fill="#ffff00" stroke="#000000" stroke-width="0"> - <path inkscape:connector-curvature="0" d="M 0,0 -0.002,1.449 3.412,1.012 3.414,0.434 0,0 Z" id="path7548-6"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/77-1.svg b/htdocs/public/symbols/svgicons/77-1.svg deleted file mode 100755 index 70a5f130ec4a0bf2e2e5b157ece551b8baf26604..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/77-1.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 23.999999" overflow="visible" enable-background="new 0 0 499.524 554.546"> - <metadata id="metadata25"/> - <g id="g4149" transform="matrix(0.04378904,0,0,0.04378904,1.5563356,-0.04001019)"> - <path stroke-miterlimit="2.613" d="m 28.987206,199.7257 c 0.16383,-0.27056 0.337529,-0.53715 0.511228,-0.79879 28.075115,-43.40744 72.361496,-68.81326 114.007846,-68.81326 42.40727,0 69.06516,23.34442 104.11883,23.34442 34.01247,0 54.72906,-23.37812 103.75762,-23.37812 37.04333,0 76.31809,20.25628 104.29254,55.28232 -7.73455,4.25363 -14.71212,9.08306 -20.94852,14.39118 l -405.739544,-0.0277 0,0 z" id="path5" inkscape:connector-curvature="0" fill="#61bb46" fill-rule="evenodd" stroke="#61bb46" stroke-width="2.952"/> - <path stroke-miterlimit="2.613" d="M 314.19335,90.969749 C 331.98962,68.01779 345.52631,35.610127 340.62029,2.4760176 311.52371,4.4789499 277.4915,23.081147 257.6138,47.296707 c -18.03708,21.998559 -32.92783,54.624253 -27.13062,86.316373 31.76622,0.99205 64.62694,-18.05513 83.71017,-42.643331 l 0,0 z" id="path7" inkscape:connector-curvature="0" fill="#61bb46" fill-rule="evenodd" stroke="#61bb46" stroke-width="2.952"/> - <path stroke-miterlimit="2.613" d="m 27.538934,199.08608 c -12.090475,19.0213 -20.4561492,46.2843 -22.6761741,70.19718 l 392.2413601,-0.0101 c 4.24099,-26.16153 18.34267,-51.15586 40.69396,-70.15816 l -410.259146,-0.0289 0.02315,0 z" id="path9" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc" fill="#fdb827" fill-rule="evenodd"/> - <path stroke-miterlimit="2.613" d="M 8.4245798,338.85665 C 4.6130673,314.43297 3.9962379,290.88638 6.390523,269.28424 l 389.185817,-0.01 c -3.80658,23.42668 -0.61189,47.80576 9.01657,69.59719 l -396.1683302,-0.0149 0,0 z" id="path11" inkscape:connector-curvature="0" fill="#f5821f" fill-rule="evenodd" stroke="#f5821f" stroke-width="2.952"/> - <path stroke-miterlimit="2.613" d="M 27.444639,408.42411 C 18.254374,385.05095 11.961727,361.57571 8.4245798,338.85665 l 396.1683302,0.0149 c 12.26454,27.76752 34.96189,51.35772 66.92155,63.48037 -0.94942,2.11988 -1.86529,4.14758 -2.74662,6.10195 l -441.323201,-0.0297 0,0 z" id="path13" inkscape:connector-curvature="0" fill="#e03a3e" fill-rule="evenodd" stroke="#e03a3e" stroke-width="2.952"/> - <path stroke-miterlimit="2.613" d="m 468.76686,408.45285 c -10.97266,24.22448 -17.3334,36.79707 -32.51826,60.00571 -2.04294,3.11689 -4.15398,6.30513 -6.35187,9.5231 l -365.683135,0.0337 c -1.171483,-1.7522 -2.332109,-3.5034 -3.47497,-5.24073 C 47.066723,451.86426 35.998336,430.18482 27.444639,408.42312 l 441.322221,0.0297 0,0 z" id="path15" inkscape:connector-curvature="0" fill="#963d97" fill-rule="evenodd" stroke="#963d97" stroke-width="2.952"/> - <path stroke-miterlimit="2.613" d="m 429.89673,477.98166 c -22.36969,32.90617 -52.40188,69.11752 -88.84318,69.46141 -35.55898,0.32408 -44.68115,-23.23738 -92.92412,-22.97178 -48.24297,0.27056 -58.31456,23.38307 -93.87354,23.04909 -38.01742,-0.35282 -67.538383,-35.91602 -90.042295,-69.50502 l 365.683135,-0.0337 0,0 z" id="path19" inkscape:connector-curvature="0" fill="#009ddc" fill-rule="evenodd" stroke="#009ddc" stroke-width="2.952"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/77-2.svg b/htdocs/public/symbols/svgicons/77-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/77-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/78-1.svg b/htdocs/public/symbols/svgicons/78-1.svg deleted file mode 100755 index 5b5351c7e8eb6e9ac3e16ef0e8b16b158ade7253..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/78-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4397"/> - <path d="m 7.2163337,1.7669242 9.5479813,0 5.468785,10.0789058 -5.63609,10.387246 -9.3499754,0 -5.480134,-10.099823 z" id="path4403" inkscape:connector-curvature="0" fill="#330099" fill-rule="evenodd" stroke="#330099" stroke-linejoin="round" stroke-width="3.534"/> - <text x="6.883" y="8.577" id="text4945" sodipodi:linespacing="100%" transform="scale(1.2019576,0.8319761)" font-family="sans-serif" fill="#ffffff" word-spacing="0" line-height="100%" font-weight="bold" letter-spacing="0" font-size="9.1"><tspan sodipodi:role="line" id="tspan4947" x="6.883" y="8.577" dx="-0.722">N</tspan><tspan sodipodi:role="line" x="6.883" y="17.676" id="tspan4949">T</tspan><tspan sodipodi:role="line" x="6.883" y="26.775" id="tspan4951">S</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/78-2.svg b/htdocs/public/symbols/svgicons/78-2.svg deleted file mode 100755 index 3f8a24f7abe988f3697a0ff00201bf4b3300ddea..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/78-2.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata7"/> - <path inkscape:connector-curvature="0" id="path6-9" d="m 1.6815843,20.853317 c 0.9502396,0.794117 1.9829631,1.409751 3.0796704,1.727888 1.8362904,0.636055 3.4796759,1.003464 5.3431013,1.17928 0.962716,0.09853 2.162599,0.122316 3.099463,0.104649 1.023669,0.03261 2.730414,0.135066 2.730414,0.135066 1.330419,-0.09803 2.691892,-0.126078 3.858106,-0.528673 1.037153,-0.504085 1.909223,-1.492041 2.658279,-2.5465 0.490411,-1.138307 -0.51139,-2.079014 -1.202219,-2.467056 -1.411688,-1.100026 -2.998531,-1.500455 -4.80136,-2.116441 -1.429824,-0.47595 -2.640232,-0.700866 -4.818916,-1.380938 -1.8601541,-0.248546 -3.5921275,0.271622 -4.7123163,0.664393 -1.7448241,0.784465 -1.2245414,0.703572 -3.2663106,1.716979 -0.9231758,0.594098 -2.0862461,1.325204 -2.2302008,2.84614 -0.00624,0.262978 0.086352,0.533494 0.262289,0.665219 z" sodipodi:nodetypes="cccccccccccccc" fill="#2a7fff" stroke-width="0.255"/> - <path d="m 5.6033084,19.634505 2.9053805,-8.939635 11.0069271,3.631726 -1.8438,5.475528 -4.078708,-0.111751 -0.558728,1.31193 -1.049428,0.515859 L 10.787316,21.378056 10.017253,20.530164 9.73789,19.6345 Z" id="path4215" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccc" fill="#ff0000" fill-rule="evenodd"/> - <circle id="path3337" cx="11.625" cy="19.626" r="1.918" fill="#ffffff"/> - <path inkscape:connector-curvature="0" d="m 14.644279,8.2925329 -1.106472,3.4256831 -5.6136224,-1.7691029 -3.044358,9.1518289 -1.594068,0 0,1.131477 5.938686,0 c 0.2575161,1.106811 1.2469034,1.931634 2.4317364,1.931635 1.185227,0 2.174625,-0.824269 2.431736,-1.931635 l 5.969943,0 0,-1.131477 -1.537806,0 1.800358,-5.238547 -5.988696,-1.887878 1.106471,-3.4256833 -0.793908,-0.2563008 z m -5.7136424,3.3819241 9.4331354,3.19439 -1.444039,4.232095 -2.831816,0 c -0.257111,-1.107366 -1.246509,-1.931635 -2.431736,-1.931635 -1.184833,1e-6 -2.1742203,0.824824 -2.4317364,1.931635 l -2.744298,0 2.45049,-7.426485 z m 2.7255444,6.488798 c 0.828166,0 1.5003,0.672135 1.5003,1.5003 0,0.828166 -0.672134,1.500299 -1.5003,1.500299 -0.828165,0 -1.5003,-0.672133 -1.5003,-1.500299 0,-0.828165 0.672135,-1.5003 1.5003,-1.5003 z m 0.468844,-12.2174417 3.588217,-1.7878574 -1.787857,-3.58821749 0.895178,-0.45008993 1.855372,3.61322242 3.590717,-1.7928585 0.447589,0.90018 -3.65573,1.7678534 1.787857,3.5882177 -0.830166,0.4700941 -1.85537,-3.6132228 -3.588217,1.7903583 -0.44759,-0.8976798 z" id="path90440" fill="#000407" fill-rule="evenodd"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/79-1.svg b/htdocs/public/symbols/svgicons/79-1.svg deleted file mode 100755 index 1b452882be652db25757c60837baf0afccf093b7..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/79-1.svg +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 24 24" height="24" width="24"> - <metadata id="metadata4411"/> - <g transform="translate(0,-1028.3622)" id="layer1"> - <g id="g4221" transform="matrix(0.08983967,0,0,0.08983967,3.0740715,1050.2035)"> - <path id="path3" d="m 118.63,-26.848002 c 15.074,-19.321 30.347,-38.382 44.727,-58.238 7.056,-9.743 13.26,-19.966998 19.409,-30.290998 5.39,-9.048 11.323,-20.028 13.408,-30.449 5.933,-29.642 -2.521,-64.016 -33.229,-75.906 -15.567,53.601 -31.135,107.2 -46.702,160.799998 -3.625,12.479 -7.249,24.96 -10.874,37.439 4.41,-1.12 8.83,-2.24 13.25,-3.36" fill="#ff7021"/> - <path id="path5" d="m 108.89,-24.498002 c 3.879,-19.206 7.882,-37.785 13.32,-56.565 9.576,-33.072998 19.152,-66.146998 28.729,-99.220998 4.001,-13.816 8.001,-27.633 12.002,-41.449 10.804,3.34 18.13,10.481 21.915,21.075 3.994,11.178 6.092,22.935 5.496,34.836 -1.217,24.32 -15.943,46.695 -27.798,67.213998 -7.764,13.438 -16.307,26.452 -24.586,39.575 -4.313,6.837 -8.61,13.686 -12.795,20.603 -2.252,3.724 -4.447,7.482 -6.67,11.223 -0.9,1.5 -8.2,2.77 -9.62,2.71" fill="#eb490c"/> - <path id="path7" d="m 105.53,-23.658002 c 7.811,-10.503 15.621,-21.005 23.431,-31.508 4.405,-5.924 8.811,-11.848 13.216,-17.771 2.489,-3.347 4.872,-4.609 9.012,-1.751 4.482,3.095 0.207,6.056 -2.236,9.415 -3.515,4.831 -7.318,9.487 -11.03,14.168 -3.6,4.538 -7.176,9.107 -10.885,13.557 -2.604,3.123 -5.896,10.055 -9.91,11.084 -3.51,0.89 -8.3,2.85 -11.6,2.8" fill="#ff0000"/> - <path id="path9" d="m 198.36,-160.465 c -2.91,-3.669 -6.505,-7.132 -11.985,-7.678 -2.199,-0.219 -1.919,0.025 -2.738,-2.018 -1.237,-3.083 -2.474,-6.166 -3.711,-9.248 -5.661,-14.108 -11.322,-28.217 -16.983,-42.326 12.712,5.262 20.685,13.15 27.757,24.833 6.51,10.776 7.26,24.235 7.65,36.437" fill="#ffd900"/> - <path id="path11" d="m 148.5,-75.868002 c -5.722,9.441 -11.751,18.685 -17.573,28.063 -2.942,4.738 -5.979,9.447 -8.766,14.277 -0.686,1.189 -2.879,6.407 -4.013,6.711 l -9.264,2.481 c 1.02,-5.265 2.479,-7.181 5.683,-11.488 5.308,-7.137 10.614,-14.272 15.922,-21.408 4.322,-5.812 8.645,-11.623 12.967,-17.435 1.48,-1.99 3.27,-1.74 5.04,-1.2" fill="#bf0000"/> - <path id="path13" d="m 178.55,-212.67 c 8.959,13.786 11.75,29.27 11.75,45.49 -1.117,-0.555 -5.741,-0.672 -6.039,-1.415 -2.179,-5.431 -4.358,-10.862 -6.538,-16.294 l -14.784,-36.846 c 5.51,1.704 12.06,5.581 15.61,9.065" fill="#ffa300"/> - <path id="path15" d="m 114.93,-26.848002 c 12.064,-21.341 25.105,-42.117 37.716,-63.139 6.388,-10.647998 12.223,-21.590998 17.978,-32.590998 5.198,-9.936 10.331,-21.109 12.269,-32.208 4.255,-24.375 -2.2,-49.595 -19.481,-67.477 -2.74,-2.834 -20.133,-14.417 -21.46,-6.954 -1.583,8.899 -3.165,17.798 -4.748,26.697 -10.49,58.955 -20.98,117.909998 -31.46,176.869998 -0.128,0.72 -0.256,1.438 -0.384,2.158 3.18,-1.12 6.37,-2.24 9.56,-3.36" fill="#ff7021"/> - <path id="path17" d="m 106.54,-25.508002 c 7.363,-54.338 18.51,-108.279998 28.072,-162.259998 l 6.426,-36.273 c 0.406,-2.293 0.813,-4.587 1.219,-6.88 0.434,-2.447 10.843,1.668 12.291,2.392 10.501,5.245 14.186,18.755 16.617,29.389 2.496,10.911 3.019,23.603 1.179,34.631 -4.021,24.107 -16.497,47.163 -26.669,69.158998 -10.192,22.042 -20.627,43.942 -30.337,66.207 -1.5,3.41 -5.11,3.91 -8.8,3.63" fill="#eb490c"/> - <path id="path19" d="m 143.8,-105.908 c 3.767,-2.278 9.362,-1.846 13.094,0.336 3.905,2.283 3.182,3.741 1.424,7.136998 -4.831,9.329 -9.974,18.437 -15.523,27.357 -5.344,8.59 -11.085,16.934 -16.545,25.452 -2.781,4.339 -5.641,8.657 -8.164,13.153 -1.133,2.02 -2.012,5.224 -4.286,6.021 -2.813,0.987 -5.626,1.975 -8.438,2.962 1.514,-8.483 3.026,-16.967 4.54,-25.45 1.016,-5.692 6.324,-12.913 9.131,-17.989 3.896,-7.047 7.875,-14.04 11.909,-21.009 3.34,-5.75 7.55,-13.879998 12.87,-17.969998" fill="#ff0000"/> - <path id="path21" d="m 150.18,-107.418 c -6.394,14.827998 -13.331,29.406998 -19.888,44.157998 -3.068,6.903 -6.078,13.835 -9.184,20.721 -1.83,4.06 -3.612,8.12 -5.33,12.228 -0.484,1.159 -0.826,3.511 -2.177,3.751 -2.299,0.408 -4.598,0.817 -6.896,1.226 0.613,-4.954 1.227,-9.907 1.84,-14.861 0.39,-3.144 0.329,-7.357 1.769,-10.129 4.222,-8.129 8.503,-16.213 12.936,-24.229 4.209,-7.613 8.617,-15.112 13.502,-22.313 3.67,-5.419998 6.4,-10.519998 13.43,-10.559998" fill="#bf0000"/> - <path id="path23" d="m 184.09,-168.354 c -3.42,-4.807 -10.932,-5.508 -16.213,-4.447 -2.85,0.572 -6.052,-11.322 -7.052,-13.728 -6.178,-14.869 -12.354,-29.738 -18.532,-44.606 7.312,0.188 12.541,1.951 18.351,6.518 5.877,4.619 10.353,10 14.296,16.308 3.31,5.294 6.396,12.573 7.327,18.782 0.87,5.869 3.46,15.595 1.81,21.173" fill="#ffd900"/> - <path id="path25" d="m 148.67,-230.967 c 11.84,2.759 17.198,13.519 20.516,24.214 1.832,5.908 2.765,11.81 3.549,17.932 0.365,2.857 1.717,14.308 -0.229,15.599 -1.279,0.849 -5.86,0.707 -6.343,-0.455 -2.428,-5.844 -4.856,-11.688 -7.284,-17.531 -5.499,-13.238 -10.999,-26.475 -16.499,-39.713 -0.029,-0.071 -0.06,-0.143 -0.089,-0.214 1.93,0.05 5.05,0.118 6.37,0.168" fill="#ffa300"/> - <path id="path27" d="m 110.23,-26.848002 c 9.29,-22.388 19.429,-44.345 29.203,-66.518 5.021,-11.390998 10.175,-22.738998 14.773,-34.307998 4.339,-10.914 9.518,-22.341 11.217,-34.034 3.163,-21.763 0.569,-52.576 -17.426,-67.913 -4.104,-3.497 -9.334,-6.483 -14.771,-7.051 -1.786,-0.187 -8.86,0.024 -9.115,2.51 -0.768,7.469 -1.535,14.938 -2.302,22.408 -6.231,60.654 -12.462,121.309998 -18.693,181.959998 -0.146,1.429 -0.294,2.858 -0.44,4.287 2.53,-0.45 5.05,-0.89 7.56,-1.34" fill="#ff7021"/> - <path id="path29" d="m 109.73,-26.848002 c -2.084,0.273 -4.674,-0.28 -6.881,-0.5 L 119.94,-193.558 c 1.181,-11.49 2.362,-22.98 3.544,-34.47 0.221,-2.145 0.441,-4.289 0.661,-6.434 0.276,-2.68 9.355,-2.349 11.016,-1.875 9.373,2.678 13.825,15.111 16.391,23.736 3.442,11.57 3.501,23.8 3.501,35.761 0,10.674 -3.781,22.104 -6.704,32.271 -3.565,12.4 -7.409,24.702 -11.337,36.991 -7.209,22.553998 -14.904,44.978998 -22.618,67.363998 -1.44,4.2 -2.97,9.89 -4.66,13.37" fill="#eb490c"/> - <path id="path31" d="m 102.68,-25.508002 c 0.695,-6.738 1.391,-13.477 2.087,-20.216 0.556,-5.387 2.11,-9.155 4.173,-14.201 4.487,-10.973 8.973,-22.03 13.985,-32.776 1.975,-4.232 3.846,-12.095998 8.794,-13.379998 1.543,-0.4 13.289,0.132 12.02,3.18 -4.54,10.902998 -9.343,21.694998 -14.248,32.437998 -3.897,8.536 -7.712,17.108 -11.595,25.65 -1.793,3.946 -3.552,7.912 -5.192,11.924 -0.37,0.904 -1.739,5.906 -2.645,6.067 -2.44,0.45 -4.9,0.88 -7.36,1.32" fill="#ff0000"/> - <path id="path33" d="m 109.73,-26.848002 c -2.084,0.273 -4.674,-0.28 -6.881,-0.5 0.438,-4.212 0.877,-8.424 1.315,-12.636 0.354,-3.404 -0.091,-8.529 1.271,-11.702 3.241,-7.557 6.24,-15.219 9.546,-22.747 3.35,-7.628 6.569,-15.317 10.092,-22.866 2.509,-5.378998 4.556,-10.521998 11.515,-8.942998 -4.268,13.105998 -8.819,26.116998 -13.178,39.192998 -2.442,7.329 -4.987,14.62 -7.385,21.964 -1.89,5.81 -3.89,13.23 -6.29,18.25" fill="#bf0000"/> - <path id="path35" d="m 135.75,-236.17 c 26.932,8.57 30.719,39.412 30.719,63.62 -2.412,-2.985 -6.776,-3.854 -10.39,-4.153 -1.105,-0.092 -7.426,1.242 -7.558,0.925 -3.324,-8.037 -6.647,-16.073 -9.972,-24.11 -4.215,-10.19 -8.43,-20.381 -12.645,-30.571 -0.633,-1.529 -2.688,-4.057 -0.646,-4.871 3.4,-1.353 6.96,-1.927 10.5,-0.84" fill="#ffd900"/> - <path id="path37" d="m 135.75,-236.17 c 3.534,0.334 6.646,4.67 8.646,7.47 3.595,5.032 5.656,10.714 7.404,16.59 1.553,5.219 2.481,11.038 2.783,16.469 0.159,2.867 0.472,5.767 0.472,8.638 0,1.857 1.146,8.993 0,10.257 -0.544,0.601 -6.468,1.126 -6.618,0.763 -2.209,-5.341 -4.418,-10.682 -6.627,-16.023 -5.767,-13.943 -11.533,-27.885 -17.301,-41.828 -1.32,-3.207 9.46,-2.885 11.25,-2.336" fill="#ffa300"/> - <path id="path39" d="m 105.53,-26.848002 c 15.168,-46.276 32.349,-92.581998 42.231,-140.349998 2.383,-11.52 0.677,-24.06 -0.589,-35.607 -1.205,-10.985 -6.014,-23.88 -14.448,-31.26 -4.167,-3.646 -9.2,-5.915 -14.772,-6.127 -2.479,-0.095 -4.997,0.316 -7.218,1.428 -3.129,1.565 -2.593,4.958 -2.993,8.084 -1.631,12.71 -1.8,25.842 -2.615,38.622 -3.044,47.65 -5.808,95.386998 -7.836,143.089998 -0.222,5.217 -0.363,10.443 -0.67,15.655 -0.12,2.042 -1.434,5.344 0.949,5.599 2.457,0.25 6.127,0.59 7.967,0.86" fill="#ff7021"/> - <path id="path41" d="m 98.986,-27.518002 c 1.78,-48.048 2.055,-96.081998 4.848,-144.099998 0.676,-11.61 1.494,-23.211 2.209,-34.818 0.367,-5.964 0.798,-11.92 1.222,-17.88 0.282,-3.961 -0.808,-13.319 4.06,-14.709 2.445,-0.699 4.364,-1.176 6.967,-1.176 2.564,0 5.06,3.894 6.45,5.71 3.482,4.55 5.336,10.411 6.447,15.97 2.37,11.86 2.849,23.946 2.493,36.024 -0.677,22.971 -4.314,46.571 -8.856,69.077 -4.899,24.282998 -10.216,48.465998 -16.679,72.385998 -1.088,4.025 -2.176,8.05 -3.263,12.075 -0.84,3.1 -2.84,1.71 -5.894,1.43" fill="#eb490c"/> - <path id="path43" d="m 105.53,-26.848002 c -2.294,-0.224 -4.587,-0.446 -6.881,-0.67 1.614,-10.52 3.862,-21.046 6.922,-31.249 1.583,-5.276 3.035,-10.587 4.829,-15.795 0.532,-1.543 1.321,-5.354 2.937,-6 2.146,-0.858 4.378,-0.794 6.63,-0.419 5.059,0.842 0.928,7.06 -0.026,10.24 -1.454,4.845 -3.12,9.622 -4.674,14.435 -1.528,4.734 -3.144,9.435 -4.627,14.185 -1.45,4.66 -2.6,11.31 -5.11,15.28" fill="#ff0000"/> - <path id="path45" d="m 104.19,-27.018002 c -1.735,-0.168 -3.47,-0.335 -5.205,-0.503 0.888,-4.311 1.16,-9.059 2.182,-13.526 1.386,-6.055 3.022,-12.049 4.603,-18.056 1.511,-5.743 3.144,-11.499 5.134,-17.098 1.543,-4.34 2.945,-5.035 7.219,-5.035 -2.084,8.923 -4.264,17.812 -6.421,26.715 -1.219,5.034 -2.593,10.021 -3.917,15.028 -0.94,3.57 -1.75,9.51 -3.59,12.48" fill="#bf0000"/> - <path id="path47" d="m 120.3,-240.031 c 27.469,5.782 28.299,42.466 28.369,64.625 -5.033,-4.205 -15.783,-6.076 -21.484,-2.18 -4.461,-11.89 -8.241,-24.079 -11.796,-36.269 -1.845,-6.325 -3.712,-12.65 -5.632,-18.952 -1.123,-3.687 -1.499,-5.351 2.654,-6.721 2.46,-0.808 6.09,-0.705 7.89,-0.503" fill="#ffd900"/> - <path id="path49" d="m 118.79,-240.199 c 12.12,7.795 13.899,25.745 14.602,38.857 0.34,6.331 0.338,12.632 0.338,18.971 0,2.308 0.081,2.285 -1.68,3.106 -1.582,0.738 -3.332,0.722 -4.865,1.679 -4.346,-11.582 -8.059,-23.453 -11.521,-35.327 -1.839,-6.306 -3.739,-12.594 -5.602,-18.894 -0.896,-3.033 -2.538,-5.242 0.67,-7.049 2.41,-1.353 5.39,-1.343 8.06,-1.343" fill="#ffa300"/> - <path id="path51" d="m 70.955,-29.538002 c -14.217,-20.137 -28.029,-40.467 -41.22,-61.291 C 17.59,-109.999 4.002,-132.999 1.107,-155.828 c -3.657,-28.835 9.525,-60.545 38.625,-69.936 12.529,54.446 25.059,108.89 37.588,163.339998 2.857,12.418 5.715,24.835 8.573,37.253 -4.66,-1.3 -10.896,-2.07 -14.938,-4.36" fill="#eb490c"/> - <path id="path53" d="m 49.636,-79.388002 c 6.009,9.279 12.018,18.558 18.027,27.837 3.949,6.098 7.898,12.195 11.847,18.293 1.75,2.702 3.318,6.613 6.383,8.087 -3.992,-1.121 -7.984,-2.243 -11.977,-3.364 -3.528,-0.991 -4.297,-2.748 -6.319,-5.784 -4.132,-6.203 -8.567,-12.249 -12.904,-18.315 -3.986,-5.577 -7.703,-11.336 -11.543,-17.011 -1.652,-2.441 -4.973,-4.959 -2.746,-7.729 1.967,-2.46 6.488,-2.46 9.232,-2.02" fill="#bf0000"/> - <path id="path55" d="m 39.565,-225.763 c -4.618,12.587 -10.611,24.742 -16.601,36.728 -1.409,2.82 -6.089,15.812 -8.982,15.521 -6.49,-0.653 -10.922,3.812 -13.527,9.188 1.151,-27.288 12.235,-51.58 39.11,-61.437" fill="#ffa300"/> - <path id="path57" d="m 74.982,-28.188002 c -10.59,-22.119 -22.398,-43.587 -33.458,-65.469 C 35.941,-104.704 30.649,-115.803 25.789,-127.185 c -4.454,-10.43 -8.899,-21.692 -10.139,-33.03 -2.656,-24.295 5.052,-49.185 23.373,-65.728 4.294,-3.877 9.798,-6.216 15.22,-7.959 2.641,-0.849 6.656,-1.018 7.011,1.959 1.049,8.805 2.098,17.61 3.147,26.416 7.078,59.392 14.155,118.779998 21.232,178.179998 0.086,0.728 0.173,1.454 0.26,2.182 -3.617,-1.02 -7.246,-2.24 -10.911,-3.02" fill="#eb490c"/> - <path id="path59" d="m 83.375,-27.858002 c -10.473,-22.18 -22.399,-43.581 -33.458,-65.468 C 44.314,-104.415 39.06,-115.596 34.182,-127.02 c -4.426,-10.366 -8.905,-21.596 -10.138,-32.865 -2.658,-24.29 5.039,-49.34 23.373,-65.894 4.295,-3.878 9.745,-6.236 15.22,-7.801 2.702,-0.772 6.648,-1.241 7.011,1.801 1.049,8.805 2.098,17.61 3.147,26.416 7.077,59.392 14.154,118.779998 21.231,178.179998 0.086,0.728 0.173,1.454 0.26,2.182 -3.619,-0.97 -7.249,-2.12 -10.911,-2.86" fill="#ff7021"/> - <path id="path61" d="m 36.544,-103.398 c -0.42,-4.696 13.913,-6.11 15.484,-2.546 3.796,8.612998 7.592,17.226998 11.389,25.839998 7.966,18.075 17.245,35.854 22.477,54.929 -1.924,-0.541 -10.063,-1.58 -10.84,-3.227 -1.921,-4.069 -3.923,-8.054 -6.02,-12.036 -3.735,-7.093 -7.438,-14.2 -11.209,-21.274 -3.544,-6.647 -7.124,-13.266 -10.548,-19.978 -3.465,-6.78 -6.212,-15.79 -10.733,-21.699998" fill="#bf0000"/> - <path id="path63" d="m 85.223,-27.518002 c -3.368,0.189 -8.938,-15.129 -10.634,-18.373 -3.348,-6.405 -6.531,-12.9 -9.967,-19.261 -7.528,-13.937 -14.729,-28.044 -21.7,-42.267998 2.428,-0.655 5.319,-0.421 7.637,0.505 1.84,0.733 2.005,2.195 2.804,4.008 4.089,9.276998 8.179,18.555998 12.268,27.833998 4.603,10.443 9.206,20.887 13.808,31.329 2.055,4.65 5.84,11.71 5.784,16.22" fill="#ff0000"/> - <path id="path65" d="m 54.503,-233.988 c 2.107,0.108 4.215,0.216 6.322,0.324 0.591,0.03 0.767,5.027 0.837,5.675 0.494,4.569 0.725,7.874 -0.334,12.375 -1.991,8.465 -3.988,16.89 -6.565,25.201 -1.193,3.846 -2.555,7.751 -3.532,11.652 -0.332,1.322 -12.082,1.458 -13.704,1.609 -7.858,0.734 -15.29,-1.414 -22.302,3.763 -1.207,-5.01 1.21,-13.271 2.267,-18.551 1.343,-6.711 4.311,-12.668 7.506,-18.659 6.083,-11.404 17.379,-19.657 29.505,-23.389" fill="#ffa300"/> - <path id="path67" d="m 61.05,-233.316 c 0.431,3.875 0.861,7.749 1.292,11.624 0.352,3.167 -1.362,7.563 -2.088,10.649 -1.709,7.265 -3.574,14.451 -5.786,21.582 -1.016,3.277 -1.896,6.585 -2.979,9.843 -0.86,2.583 -7.363,1.851 -9.861,2.084 -6.005,0.562 -11.98,-0.362 -17.842,0.62 2.005,-12.03 4.574,-23.314 10.911,-33.908 3.225,-5.391 7.122,-9.99 11.874,-14.063 4.467,-3.831 9.791,-5.531 14.479,-8.431" fill="#ffd900"/> - <path id="path69" d="m 79.683,-27.858002 c -7.629,-22.892 -16.476,-45.277 -24.663,-67.963 C 50.775,-107.584 46.327,-119.29 42.415,-131.167 c -3.695,-11.218 -7.82,-23.051 -8.915,-34.871 -2.038,-22.006 3.096,-52.358 21.842,-66.609 3.876,-2.947 10.683,-6.762 15.78,-6.126 1.958,0.244 8.155,0.708 8.254,3.375 0.297,7.906 0.594,15.813 0.891,23.719 2.277,60.676 4.554,121.349998 6.832,182.029998 0.046,1.213 0.091,2.425 0.137,3.638 -2.518,-0.62 -5.036,-1.23 -7.553,-1.85" fill="#eb490c"/> - <path id="path71" d="m 86.732,-27.688002 c -7.646,-22.934 -16.439,-45.387 -24.716,-68.09 C 53.743,-118.471 42.709,-142.537 40.462,-166.813 c -1.116,-12.06 0.704,-24.749 4.053,-36.372 3.057,-10.608 8.46,-23.136 18.119,-29.45 4.686,-3.063 10.375,-6.339 16.209,-5.885 2.02,0.157 7.493,0.869 7.59,3.452 0.304,8.104 0.608,16.208 0.913,24.312 2.272,60.53 4.544,121.059998 6.816,181.589998 0.042,1.108 0.083,2.216 0.125,3.323 -2.519,-0.61 -5.037,-1.22 -7.555,-1.84" fill="#ff7021"/> - <path id="path73" d="m 48.964,-112.458 c 7.533,-4.791 14.92,-1.439 20.982,3.526 2.248,1.841 3.741,2.542 4.258,5.313 0.88,4.716998 1.76,9.432998 2.641,14.148998 3.904,20.921 9.649,42.15 10.391,63.459 l -6.174,-1.509 c -2.139,-0.522 -2.014,-2.206 -2.716,-4.272 -1.447,-4.263 -2.957,-8.496 -4.481,-12.731 -2.768,-7.69 -5.67,-15.305 -8.649,-22.916 -2.947,-7.531 -5.914,-15.046 -8.753,-22.618 -2.669,-7.12 -4.395,-15.819998 -7.499,-22.399998" fill="#bf0000"/> - <path id="path75" d="m 87.068,-27.518002 c -1.896,-2.246 -2.539,-6.688 -3.524,-9.568 -1.19,-3.476 -2.36,-6.961 -3.621,-10.411 -2.854,-7.809 -5.752,-15.598 -8.706,-23.368 -5.516,-14.51 -11.213,-28.895 -16.209,-43.602998 7.183,-1.362 11.464,2.673 16.617,6.966 4.838,4.031 4.47,14.020998 5.577,19.951998 2.446,13.107 4.892,26.216 7.338,39.323 1.169,6.26 3.71,14.51 2.528,20.71" fill="#ff0000"/> - <path id="path77" d="m 67.765,-238.352 c 3.01,-0.919 7.438,-0.37 10.155,1.258 2.178,1.306 -1.97,8.585 -2.939,10.923 -3.285,7.923 -7.259,15.518 -10.958,23.25 -3.432,7.172 -7.193,14.371 -11.175,21.253 -0.507,0.875 -1.049,1.725 -1.448,2.654 -0.501,1.169 -0.791,0.023 -1.763,0.083 -1.809,0.113 -3.823,-0.572 -5.708,-0.503 -3.531,0.128 -7.891,0.829 -10.911,2.687 2.145,-23.286 7.508,-55.419 34.747,-61.605" fill="#ffa300"/> - <path id="path79" d="m 74.814,-238.184 c 1.147,0.307 2.284,0.722 3.357,1.258 1.778,0.889 -0.928,5.296 -1.639,7.011 -3.083,7.436 -6.577,14.591 -10.048,21.846 -3.431,7.171 -7.213,14.115 -10.864,21.171 -0.907,1.753 -1.785,3.521 -2.774,5.229 -1.039,1.795 -1.041,3.205 -2.96,2.821 -3.271,-0.652 -6.349,-0.621 -9.652,-0.25 1.536,-12.453 3.259,-24.487 8.717,-35.921 2.593,-5.431 5.943,-10.602 10.403,-14.704 4.782,-4.398 10.067,-6.347 15.46,-8.461" fill="#ffd900"/> - <path id="path81" d="M 84.215,-27.518002 C 72.5,-74.778002 58.023,-122.048 51.474,-170.378 c -1.589,-11.723 0.944,-23.916 2.843,-35.459 1.852,-11.264 7.931,-23.497 16.898,-30.592 4.083,-3.231 10.221,-5.523 15.519,-4.864 2.5,0.311 5.444,0.83 7.302,2.686 1.899,1.898 1.401,5.336 1.428,7.902 0.134,13.091 0.166,26.177 0.166,39.269 0,48.09 -0.523,96.244998 -1.558,144.319998 -0.109,5.077 -0.288,10.157 -0.288,15.236 0,2.995 0.909,3.983 -2.122,4.092 -2.483,0.1 -4.965,0.2 -7.447,0.27" fill="#eb490c"/> - <path id="path83" d="m 88.914,-27.688002 c -5.965,-24.06 -11.926,-48.117 -17.618,-72.243 C 65.775,-123.337 60.354,-146.954 57.875,-170.897 c -1.14,-11.008 0.023,-23.996 2.879,-34.7 3.109,-11.657 6.734,-24.599 17.25,-31.915 3.776,-2.627 9.251,-4.5 13.598,-2.518 4.639,2.116 3.827,5.945 3.875,10.651 0.132,12.845 0.188,25.687 0.152,38.532 -0.138,48.846 -0.568,97.735998 -1.619,146.579998 -0.078,3.595 -0.227,7.196 -0.227,10.792 0,0.952 0.61,5.004 0,5.623 -0.56,0.57 -3.969,0.14 -4.869,0.17" fill="#ff7021"/> - <path id="path85" d="m 91.938,-32.728002 c 0.154,0.626 1.247,3.912 1.006,4.366 -0.544,1.026 -3.065,0.619 -4.448,0.671 -2.471,0.094 -4.192,1.087 -4.883,-1.399 -2.242,-8.071 -4.201,-16.24 -6.194,-24.378 -3.876,-15.826 -7.833,-31.656 -12.005,-47.408998 1.658,-0.603 3.162,-1.773 5.204,-1.846 1.168,-0.041 3.527,0.213 4.533,0.839 1.598,0.993 1.484,2.252998 1.973,4.133998 1.849,7.126 3.627,14.291 5.292,21.462 1.796,7.735 3.676,15.452 5.502,23.181 1.387,5.88 4.668,14.69 4.02,20.39" fill="#bf0000"/> - <path id="path87" d="m 92.943,-27.858002 c -0.646,0.028 -3.772,0.5 -3.918,-0.052 -0.521,-1.979 -1.042,-3.959 -1.563,-5.938 -0.76,-2.888 -1.364,-5.817 -2.103,-8.711 -1.862,-7.29 -3.606,-14.606 -5.362,-21.923 -3.061,-12.759 -6.111,-25.531 -9.379,-38.239998 1.62,0.158 3.366,0.255 4.868,1.007 1.972,0.985 2.385,6.859998 2.941,9.194998 1.943,8.16 3.949,16.306 5.917,24.46 3.22,13.32 6.032,26.83 8.599,40.19" fill="#ff0000"/> - <path id="path89" d="m 83.375,-241.206 c 2.19,0.086 13.146,0.294 11.42,4.705 -2.343,5.988 -4.687,11.977 -7.03,17.966 -5.1,13.034 -10.201,26.068 -15.301,39.102 -5.71,-3.131 -16.424,-3.493 -21.486,1.008 0.259,-22.297 5.741,-58.334 32.397,-62.781" fill="#ffa300"/> - <path id="path91" d="m 57.526,-181.281 c 1.234,-11.389 1.548,-24.762 6.275,-35.398 4.62,-10.395 10.566,-22.814 23.379,-24.241 2.304,-0.257 6.42,1.028 7.274,2.736 0.994,1.988 -1.006,5.125 -2.005,7.677 -3.02,7.717 -6.04,15.435 -9.06,23.152 -3.642,9.307 -7.284,18.615 -10.926,27.922 -4.086,-2.497 -10.31,-2.405 -14.937,-1.848" fill="#ffd900"/> - <path id="path93" d="M 89.754,-27.188002 C 80.825,-75.345002 74.026,-123.247 72.469,-172.248 c -0.357,-11.231 0.404,-23.042 2.464,-34.077 2.238,-11.986 4.798,-24.591 14.424,-32.905 2.797,-2.416 12.048,-6.127 13.788,-0.91 1.794,5.376 1.549,11.233 1.549,16.84 0,12.122 -0.584,24.21 -1.176,36.313 -2.402,49.116 -5.198,98.219998 -7.869,147.319998 -0.263,4.829 -0.482,9.661 -0.692,14.493 -1.707,-0.68 -3.439,-1.49 -5.195,-2.01" fill="#eb490c"/> - <path id="path95" d="m 78.509,-186.148 c 0.997,-12.302 2.127,-24.353 6.054,-36.126 1.953,-5.854 4.72,-10.628 8.685,-15.339 1.491,-1.771 4.127,-3.167 6.3,-3.892 3.001,-1 3.922,0.659 4.36,3.872 1.55,11.36 1.122,23.466 0.407,34.896 -0.795,12.708 -1.281,25.441 -1.895,38.16 -2.174,45.079 -4.84,90.143998 -7.294,135.209998 C 86.428,-77.047002 78.34,-125.237 78.34,-173.857 c 0,-4.101 0.047,-8.187 0.169,-12.29" fill="#ff7021"/> - <path id="path97" d="m 94.622,-107.418 c 4.258,5.68 4.119,9.976998 3.81,16.992998 -0.335,7.637 -0.863,15.267 -1.232,22.903 -0.679,14.048 -2.305,28.298 -2.242,42.354 -0.842,-0.337 -4.906,-1.378 -5.066,-2.166 -0.566,-2.778 -1.132,-5.557 -1.699,-8.335 -0.853,-4.183 -1.636,-8.383 -2.364,-12.589 -1.634,-9.443 -3.119,-18.899 -4.727,-28.346 -1.521,-8.941 -2.586,-18.034 -3.686,-27.037998 -0.589,-4.828 0.878,-4.607 5.523,-5.537 3.499,-0.67 9.021,0.44 11.683,1.79" fill="#bf0000"/> - <path id="path99" d="m 98.818,-99.198002 c -0.843,23.293 -2.633,46.548 -3.692,69.83 -3.269,-17.64 -6.383,-35.276 -9.082,-53.014 -0.441,-2.901 -4.251,-26.612998 -2.92,-26.803998 3.042,-0.435 9.112,-0.215 11.665,1.763 2.159,1.67 3.214,5.77 4.029,8.219998" fill="#ff0000"/> - <path id="path101" d="m 72.634,-186.484 c 1.159,-11.986 2.486,-23.51 5.882,-35.098 2.729,-9.313 10.515,-23.456 22.402,-20.715 6.772,1.561 3.628,24.59 2.771,29.384 -2.004,11.21 -3.971,22.595 -6.715,33.648 -6.513,-2.87 -18.157,-4.043 -24.509,-0.169 -0.058,-2.307 0.228,-4.879 0.168,-7.05" fill="#ff0000"/> - <path id="path103" d="m 101.84,-242.213 c 3.518,3.955 2.855,11.431 2.855,16.376 0,5.54 -0.078,11.069 -0.204,16.608 -0.226,9.932 -1.703,20.076 -1.308,29.964 -4.991,-0.834 -10.003,-1.506 -15.064,-1.738 -4.723,-0.216 -11.367,-0.663 -15.654,1.569 -0.068,-11.209 1.609,-22.64 3.82,-33.706 2.543,-12.764 10.161,-32 25.548,-29.073" fill="#ffa300"/> - <path id="path105" d="m 78.509,-186.148 c 0.895,-11.037 1.506,-22.492 5.038,-33.081 1.83,-5.484 3.624,-11.164 7.414,-15.667 2.343,-2.784 8.992,-9.892 12.055,-5.639 2.714,3.769 1.68,12.071 1.68,16.45 0,5.655 -0.123,11.3 -0.252,16.953 -0.21,9.241 -1.628,18.664 -1.26,27.866 -7.795,-2.112 -16.852,-2.155 -24.843,-1.511 -0.007,-1.817 0.125,-3.578 0.162,-5.371" fill="#ffd900"/> - <path id="path107" d="m 99.994,-26.848002 c 12.418,-47.117 22.991,-94.877998 26.847,-143.549998 0.902,-11.387 0.923,-22.938 -0.272,-34.301 -1.282,-12.193 -3.398,-24.607 -12.143,-33.789 -1.852,-1.943 -4.554,-2.828 -7.049,-3.616 -1.109,-0.35 -2.603,-0.362 -3.751,-0.186 -2.217,0.341 -1.793,1.476 -2.13,3.495 -0.887,5.316 -1.76,10.617 -2.371,15.975 -1.35,11.835 -1.988,23.762 -2.32,35.668 -1.375,49.221 -1.148,98.544998 -1.678,147.779998 -0.051,4.734 -0.169,9.467 -0.169,14.202 1.494,-0.49 4.147,-1.26 5.032,-1.68" fill="#eb490c"/> - <path id="path109" d="m 99.658,-26.848002 c 1.116,-49.069 1.269,-98.173998 1.819,-147.249998 0.255,-22.663 0.776,-45.735 4.728,-68.109 11.416,1.792 17,15.047 18.669,25.252 2.062,12.608 2.854,25.17 2.488,37.946 -0.656,22.971 -4.316,46.267 -8.474,68.833 -2.567,13.936998 -5.243,27.849998 -8.444,41.654998 -1.558,6.718 -3.035,13.457 -4.751,20.137 -1.266,4.928 -2.53,9.855 -3.796,14.782 -0.43,1.63 -0.92,6.29 -2.252,6.76" fill="#ff7021"/> - <path id="path111" d="m 119.97,-108.928 c -2.232,14.690998 -5.581,29.118998 -9.398,43.475998 -1.887,7.094 -3.867,14.161 -5.758,21.254 -1.043,3.911 -2.089,7.821 -3.14,11.729 -0.344,1.281 -0.583,4.644 -1.511,5.623 -0.883,0.933 -3.944,1.273 -5.204,1.68 0.146,-19.243 -0.503,-38.533 -0.503,-57.789 0,-4.44 -0.053,-8.884 10e-4,-13.324 0.029,-2.387 -1.246,-13.033998 0.768,-14.040998 8.398,-4.2 17.228,-2.05 24.748,1.39" fill="#bf0000"/> - <path id="path113" d="m 119.97,-108.928 c -2.139,14.070998 -5.008,27.955998 -8.528,41.745998 -1.736,6.8 -3.486,13.61 -5.403,20.362 -0.921,3.246 -1.951,6.461 -2.892,9.701 -0.887,3.052 -1.372,8.077 -3.319,10.441 l 0,-52.726 c 0,-9.611 0.158,-19.219 0.288,-28.828998 0.039,-2.891 -0.597,-3.205 2.062,-4.053 1.983,-0.633 5.056,-0.45 7.114,-0.292 3.75,0.28 8.07,1.57 10.68,3.65" fill="#ff0000"/> - <path id="path115" d="m 81.026,20.151998 c -1.015,4.249 7.103,2.604 9.681,2.706 2.136,0.084 14.052,2.581 13.315,-1.529 -4.019,-0.176 -8.036,-0.352 -12.055,-0.527 -3.288,-0.15 -8.021,0.32 -10.939,-0.65" fill="#84442f"/> - <path id="path117" d="m 102.01,8.0619983 c 0.16,-3.537 0.32,-7.07400001 0.481,-10.611 0.225,-4.969 0.039,-4.172 -5.014,-4.496 -0.102,3.021 -0.203,6.04 -0.305,9.061 -0.061,1.805 1.023,6.7 -1.877,5.88 0.204,-4.802 0.408,-9.604 0.612,-14.405 0.125,-2.94 1.153,-2.201 4.255,-2.047 2.341,0.116 4.264,-0.541 4.163,1.807 -0.213,4.994 -0.425,9.987 -0.638,14.98 -0.51,-0.05 -1.19,0.02 -1.67,-0.17" fill="#c1d8f1"/> - <path id="path119" d="m 102.01,8.0619983 c 0.16,-3.537 0.32,-7.07400001 0.481,-10.611 0.225,-4.969 0.039,-4.172 -5.014,-4.496 -0.102,3.021 -0.203,6.04 -0.305,9.061 -0.061,1.805 1.023,6.7 -1.877,5.88 0.204,-4.802 0.408,-9.604 0.612,-14.405 0.125,-2.94 1.153,-2.201 4.255,-2.047 2.341,0.116 4.264,-0.541 4.163,1.807 -0.213,4.994 -0.425,9.987 -0.638,14.98 -0.51,-0.05 -1.19,0.02 -1.67,-0.17" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="1.1" stroke-miterlimit="10"/> - <path id="path121" d="m 89.083,-2.0080017 c 0.259,1.98799999 0.717,3.045 1.343,4.197 0.438,0.806 0.999,1.229 1.343,2.518 0.162,0.606 0.711,3.093 0.336,3.691 -0.753,1.2 -7.042,1.7959997 -8.561,2.1839997 0.515,-2.5129997 2.794,-6.5989997 2.668,-8.8739997 -0.103,-1.86000001 -0.201,-5.5 2.871,-3.72" fill="#ffd900"/> - <path id="path123" d="m 89.083,-2.0080017 c 0.259,1.98799999 0.717,3.045 1.343,4.197 0.438,0.806 0.999,1.229 1.343,2.518 0.162,0.606 0.711,3.093 0.336,3.691 -0.753,1.2 -7.042,1.7959997 -8.561,2.1839997 0.515,-2.5129997 2.794,-6.5989997 2.668,-8.8739997 -0.103,-1.86000001 -0.201,-5.5 2.871,-3.72" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="0.9" stroke-miterlimit="10"/> - <path id="path125" d="m 85.558,6.5519983 c -0.224,1.642 0.241,4.1589997 -2.014,4.0289997 0.351,-2.3419997 0.927,-4.8519997 1.847,-7.0509997 0.055,1.01 0.111,2.02 0.167,3.02"/> - <path id="path127" d="m 86.229,-0.99800171 c 1.819,0.614 2.502,2.99800001 0.337,3.52400001 -0.112,-1.17 -0.224,-2.35000001 -0.337,-3.52000001"/> - <path id="path129" d="m 87.571,0.17199829 c -0.571,-0.116 -0.623,0.245 -1.005,-0.169 -0.142,0.74 -0.012,1.02400001 0.166,1.84800001 1.06,-0.628 0.64,-0.534 0.672,-1.00800001 0.368,-0.3 0.315,-0.4 0.167,-0.67" fill="#ffb8bd"/> - <path id="path131" d="m 89.754,2.3519983 c -0.422,1.436 -0.42,2.879 -0.503,4.365 0.448,-0.167 0.895,-0.335 1.343,-0.502 -0.882,1.442 -1.449,3.34 -3.358,3.523 0.336,-1.119 0.672,-2.237 1.009,-3.356 -0.867,0.051 -1.558,-0.468 -1.847,-0.505 2.439,0.75 2.632,-2.3 3.356,-3.52" fill="#ffa300"/> - <path id="path133" d="m 90.426,7.5619983 c 0.161,-3.536 0.322,-7.07200001 0.483,-10.608 0.226,-4.97 0.038,-4.171 -5.016,-4.499 -0.102,3.021 -0.203,6.04 -0.305,9.061 -0.061,1.804 1.023,6.699 -1.876,5.88 0.212,-4.993 0.425,-9.986 0.638,-14.98 0.127,-2.9810003 4.516,-1.456 6.89,-1.337 2.377,0.119 1.477,2.313 1.377,4.65 -0.094,2.19 0.818,13.26 -2.191,11.84" fill="#c1d8f1"/> - <path id="path135" d="m 90.426,7.5619983 c 0.161,-3.536 0.322,-7.07200001 0.483,-10.608 0.226,-4.97 0.038,-4.171 -5.016,-4.499 -0.102,3.021 -0.203,6.04 -0.305,9.061 -0.061,1.804 1.023,6.699 -1.876,5.88 0.205,-4.802 0.409,-9.604 0.613,-14.405 0.148,-3.4740003 2.952,-2.11 6.162,-1.95 2.851,0.144 2.292,0.856 2.167,3.794 -0.129,3.04 -0.259,6.08099999 -0.389,9.122 -0.073,1.7 0.707,4.507 -1.84,3.775" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="1.1" stroke-miterlimit="10"/> - <path id="path137" d="m 98.147,-2.3380017 c 1.864,1.098 0.72,2.04499999 1.006,3.526 0.165,0.854 0.768,0.979 0.988,2.082 0.611,3.057 2.16,4.816 -1.07,5.723 -2.758,0.772 -3.508,-0.352 -5.905,-1.949 -0.554,-0.369 0.38,-2.665 0.522,-3.258 0.381,-1.589 1.889,-0.779 2.276,-1.758 0.611,-1.54000001 -1.345,-5.18 2.184,-4.36" fill="#ff7f00"/> - <path id="path139" d="m 98.147,-2.3380017 c 1.751,1.032 0.694,1.87099999 1.006,3.18899999 0.105,0.44300001 -0.378,0.48300001 -0.336,0.83900001 0.091,0.762 1.081,0.365 1.216,1.04 0.367,1.833 2.126,5.396 0.048,5.979 -3.306,0.928 -3.467,0.633 -6.339,-1.281 -1.85,-1.232 -0.039,-4.647 1.7,-5.226 1.211,-0.402 -1.087,-5.77 2.705,-4.371" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="0.9" stroke-miterlimit="10"/> - <path id="path141" d="m 99.322,-0.66800171 c -4.051,0.01 -0.901,5.39000001 0,0"/> - <path id="path143" d="m 98.484,0.85199829 c 0.105,-0.304 0.522,-0.252 0.168,-0.84 -1.058,0.134 -1.271,0.663 -0.504,1.67900001 0.696,-0.2 0.34,-0.51 0.336,-0.84000001" fill="#ffb8bd"/> - <path id="path145" d="m 89.083,5.7119983 c -0.144,4.3149997 -0.287,8.6299997 -0.431,12.9449997 -0.121,3.64 -0.689,2.831 -4.491,2.736 -3.372,-0.085 -3.18,0.113 -3.039,-3.046 0.191,-4.268 0.383,-8.5349997 0.574,-12.8029997 2.217,0.11 5.514,0.73 7.387,0.17" fill="#bf7242"/> - <path id="path147" d="m 88.747,13.101998 c 0.056,-1.008 0.111,-2.016 0.167,-3.023 -1.93,-0.088 -3.86,-0.1749997 -5.79,-0.2629997 -2.335,-0.105 -1.647,0.9009997 -1.764,3.1179997 2.217,0.09 5.514,0.71 7.387,0.16" fill="#84442f"/> - <path id="path149" d="m 88.914,7.0619983 c 0.056,-0.393 0.113,-0.784 0.169,-1.177 -1.815,-0.082 -7.816,-1.54 -7.554,1.009 2.138,0.09 6.012,0.61 7.385,0.17" fill="#84442f"/> - <path id="path151" d="m 104.53,6.3919983 c -0.167,5.0029997 -0.334,10.0049997 -0.501,15.0079997 -0.056,1.695 -6.423,0.583 -7.779,0.537 -1.297,-0.044 -8.922,0.683 -8.838,-1.21 0.222,-5.002 0.444,-10.005 0.667,-15.0069997 4.31,0.21 13.16,2.12 16.45,0.67" fill="#ffc461"/> - <path id="path153" d="m 104.19,13.771998 c 0.056,-1.063 0.112,-2.127 0.168,-3.19 -3.622,-0.147 -7.244,-0.296 -10.865,-0.443 -4.264,-0.1749997 -5.52,-1.4779997 -5.753,2.962 5.482,0.22 10.966,0.45 16.448,0.67" fill="#e3622d"/> - <path id="path155" d="m 104.36,7.7319983 c 0.056,-0.447 0.112,-0.896 0.168,-1.343 l -16.452,-0.672 c -0.442,2.56 5.864,1.644 7.69,1.736 2.204,0.1 7.152,0.93 8.592,0.27" fill="#e3622d"/> - <path id="path157" d="m 80.857,21.661998 c 0.59,-3.916 0.471,-8.002 0.65,-11.9509997 0.03,-0.649 -0.285,-3.673 0.189,-4.162 0.608,-0.628 5.177,0.136 6.16,0.161 3.732,0.098 7.467,0.372 11.196,0.56 4.183,0.212 5.701,-1.026 5.51,3.247 -0.161,3.5699997 0.556,8.5749997 -0.539,11.9789997 -0.737,2.293 -0.697,1.858 -3.368,1.753 -2.886,-0.114 -19.032,0.834 -19.628,-1.586" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="1.3" stroke-miterlimit="10"/> - <path id="path159" d="M 85.391,-7.2080017 C 81.329,-13.633002 77.267,-20.057002 73.205,-26.481002 c -0.485,-0.767 -6.296,-9.207 -3.089,-7.418 1.613,0.9 3.305,5.227 4.265,6.745 2.64,4.176 5.28,8.353 7.92,12.528 0.877,1.387 4.26,5.0500003 4.265,6.7450003 0.004,1.18 -0.529,1.13 -1.175,0.66"/> - <path id="path161" d="m 90.594,-7.7080017 9.201,-20.8890003 c 0.354,-0.802 3.996,-10.144 4.564,-6.976 0.232,1.296 -2.438,5.422 -2.963,6.639 -1.962,4.542 -3.924,9.084 -5.886,13.627 -1.184,2.741 -2.368,5.4810003 -3.552,8.2230003 -0.594,1.36 -1.358,-0.42 -1.368,-0.62"/> - <path id="path163" d="m 101.84,-242.213 c 15.437,-1.69 22.554,16.828 23.884,29.477 0.858,8.159 1.417,16.123 1.68,24.322 0.105,3.314 0.618,7.842 -0.214,10.828 -7.595,-5.089 -21.862,-5.328 -30.215,-1.679 -1.257,-8.376 0.089,-18.071 0.68,-26.546 0.441,-6.342 0.923,-12.656 1.713,-18.966 0.652,-5.213 3.222,-12.409 2.472,-17.436" fill="#ffa300"/> - <path id="path165" d="m 101.67,-187.156 c 0.402,-18.308 1.342,-36.997 4.531,-55.057 14.667,2.302 17.913,20.627 19.878,32.648 1.155,7.063 1.174,14.354 1.354,21.489 0.081,3.215 0.557,7.605 -0.247,10.49 -6.164,-5.114 -18.132,-4.238 -25.516,-3.023 0.01,-2.182 0.01,-4.365 0.01,-6.547" fill="#ffd900"/> - <path id="path167" d="m 70.955,-29.538002 c 2.408,2.393 6.544,3.047 9.73,3.783 2.397,0.555 9.896,3.255 8.566,-0.594 -1.539,-4.454 -18.068,-9.4 -18.296,-3.021" fill="none" stroke="#000000" stroke-linecap="square" stroke-width="2.7" stroke-miterlimit="10"/> - <path id="path169" d="m 70.955,-29.538002 c 2.408,2.393 6.544,3.047 9.73,3.783 2.397,0.555 9.896,3.255 8.566,-0.594 -1.747,-5.05 -18.988,-8.28 -18.296,-3.19" fill="#bf0000"/> - <path id="path171" d="m 70.955,-29.538002 c -14.217,-20.137 -28.029,-40.467 -41.22,-61.291 C 17.59,-109.999 4.002,-132.999 1.107,-155.828 c -3.032,-23.906 5.262,-49.519 25.358,-63.774 4.625,-3.281 10.063,-5.022 14.803,-8.039 4.097,-2.608 8.34,-5.489 13.235,-6.348 1.681,-0.295 2.138,-0.01 3.693,-0.671 1.173,-0.499 2.186,-1.322 3.357,-1.847 2.124,-0.951 4.314,-1.372 6.547,-1.93 1.274,-0.318 2.443,-0.252 3.692,-0.252 2.269,0 3.142,-0.345 5.371,-1.175 3.394,-1.263 6.729,-1.343 10.24,-1.343 2.167,0 2.651,0.53 4.7,0 2.565,-0.663 5.08,-1.804 7.805,-1.259 4.259,0.852 8.124,-0.386 12.183,2.148 1.992,1.245 6.815,0.006 9.472,0.538 1.983,0.396 3.65,0.946 5.455,1.846 2.2,1.098 2.809,0.923 5.035,1.091 3.705,0.279 7.091,1.617 10.408,3.273 1.216,0.607 2.178,1.399 3.273,2.182 1.119,0.799 2.502,0.193 3.776,0.672 2.464,0.926 4.63,1.904 6.882,3.273 2.328,1.416 4.427,2.987 6.547,4.7 2.297,1.855 4.84,2.612 7.334,4.191 22.305,14.126 28.289,37.483 27.92,62.491 -0.169,11.441 -6.459,23.51 -11.583,33.41 -5.69,10.993 -12.271,21.373 -19.184,31.627998 -11.658,17.295 -24.517,33.87 -37.637,50.076 -3.542,4.373 -7.022,8.784 -10.484,13.222 -1.684,2.158 -8.313,0.47 -10.791,0.339 -12.52,-0.66 -25.041,-1.321 -37.561,-1.982" fill="none" stroke="#000000" stroke-linecap="square" stroke-miterlimit="10"/> - <path id="path173" d="m 118.79,-27.348002 c -4.174,5.347 -8.348,10.692 -12.521,16.039 -0.602,0.77 -2.824,4.6540003 -3.883,4.5860003 -4.394,-0.282 -4.672,0.002 -6.563,-3.7790003 -5.091,-10.178 -13.132,-18.44 -24.873,-18.862 3.848,-8.856 49.099,-6.413 48.007,2.017" fill="none" stroke="#000000" stroke-linecap="square" stroke-miterlimit="10"/> - <path id="path175" d="m 118.79,-27.348002 c -7.265,-5.329 -20.801,-4.535 -29.375,-4.535 -4.961,0 -10.075,-0.169 -14.92,1.046 -2.479,0.621 -3.073,2.146 -4.633,-0.088 -1.707,-2.445 -3.415,-4.89 -5.122,-7.335 3.856,-2.594 9.683,-2.7 14.167,-2.914 5.469,-0.26 10.914,-0.389 16.384,-0.108 9.01,0.462 22.675,-0.034 30.215,5.708 -2.183,2.742 -4.364,5.484 -6.547,8.227" fill="none" stroke="#000000" stroke-linecap="square" stroke-miterlimit="10"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/79-2.svg b/htdocs/public/symbols/svgicons/79-2.svg deleted file mode 100755 index be049687ca015714cc43ce5cceb192fe58a7253a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/79-2.svg +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata7">image/svg+xml</metadata> - <g id="g7" transform="matrix(0.1034433,-0.1034433,0.1034433,0.1034433,-1.4469352,12.187413)" fill="#4d4d4d"> - <g id="layer1"> - <path id="path3297" d="M 27.233047,80.190277 50.521446,102.74008 C 80.457618,77.648438 118.54006,55.793946 120.62015,7.044739 71.963279,10.694428 50.380767,48.797791 27.233047,80.190277 Z" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="6"/> - <path d="M 105.79237,32.142879 A 7.099771,7.181993 0 1 1 95.534653,22.210502 7.099771,7.181993 0 1 1 105.79237,32.142879 Z" id="path3301" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="3.61"/> - <path id="path3303" d="M 91.621361,46.777889 A 7.0997695,7.1819915 0 1 1 81.363648,36.845512 7.0997695,7.1819915 0 1 1 91.621361,46.777889 Z" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="3.61"/> - <path d="M 77.256363,61.612881 A 7.0997695,7.1819915 0 1 1 66.99865,51.680504 7.0997695,7.1819915 0 1 1 77.256363,61.612881 Z" id="path3305" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="3.61"/> - <path id="path3307" d="M 27.233047,80.190277 7.460029,87.048248 C 11.736541,74.369049 18.503852,57.978424 27.636146,52.378753 33.63639,48.699554 47.960906,51.440612 47.960906,51.440612 L 27.233047,80.190276 Z" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="6"/> - <path d="m 51.231438,102.00681 -6.217346,19.9837 c 12.534836,-4.6828 28.698914,-11.97467 34.001465,-21.28266 3.483932,-6.115657 0.282806,-20.344416 0.282806,-20.344416 L 51.231438,102.00681 Z" id="path3309" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linejoin="round" stroke-width="6"/> - </g> - </g> - <path inkscape:connector-curvature="0" d="m 12.663647,24.000053 -0.146243,-0.253609 c -0.281073,-0.491613 -0.365476,-0.855758 -0.360977,-1.556829 0.0037,-0.573683 0.02786,-0.720946 0.199926,-1.232875 0.174389,-0.51883 0.192684,-0.633696 0.168456,-1.066271 l -0.02592,-0.485006 0.118474,0.266569 c 0.135263,0.300825 0.148471,0.626473 0.07034,1.760457 l -0.04998,0.723805 0.183265,0.372084 c 0.187565,0.380772 0.658443,0.916001 0.581266,0.660865 -0.05557,-0.183695 0.101748,-0.591639 0.479451,-1.245833 0.469321,-0.812878 0.569167,-1.130555 0.536838,-1.679007 -0.0391,-0.66333 -0.372644,-1.268016 -0.953349,-1.727135 C 13.27539,18.387204 13.117825,18.309575 12.9987,18.309575 l -0.179563,0 0.249907,0.272121 c 0.345508,0.374833 0.544888,0.837375 0.581266,1.345796 0.02163,0.30224 0.01061,0.40267 -0.03887,0.372084 -0.0373,-0.02306 -0.06664,-0.09006 -0.06664,-0.148093 0,-0.168138 -0.331888,-0.785432 -0.573861,-1.068122 -0.121983,-0.142509 -0.379963,-0.375097 -0.57201,-0.516475 -0.333196,-0.245283 -0.366654,-0.257311 -0.760829,-0.257311 -0.227194,0 -0.403017,0.01999 -0.390595,0.04443 0.355079,0.698455 0.372338,0.755718 0.370233,1.229174 -0.0019,0.437648 -0.02464,0.519208 -0.279526,1.066271 -0.316737,0.679812 -0.395968,0.981433 -0.398,1.486484 -0.003,0.73232 0.345394,1.282872 1.016289,1.606811 0.205689,0.09932 0.448907,0.198953 0.54054,0.220288 l 0.166605,0.03702 z m -2.471305,-1.928913 0.04628,-0.266567 c 0.06547,-0.379236 0.146956,-0.559475 0.490559,-1.09589 0.166957,-0.260644 0.337697,-0.561507 0.38134,-0.66827 0.123544,-0.30223 0.05492,-0.920239 -0.148094,-1.330987 l -0.168455,-0.342466 -0.07405,0.255461 c -0.05696,0.195346 -0.184194,0.360983 -0.544242,0.703442 -0.5221647,0.496655 -0.5992159,0.658928 -0.5997775,1.269899 -4.096e-4,0.448141 0.1188643,0.797232 0.3998516,1.179191 L 10.19234,22.07114 Z" id="path2396" fill="#ff0000"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/79-3.svg b/htdocs/public/symbols/svgicons/79-3.svg deleted file mode 100755 index f898767c4711a6878e1c8ff206b9c5be640b48e2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/79-3.svg +++ /dev/null @@ -1,459 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - viewBox="0 0 24 24" - height="24" - width="24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="79-3.svg"> - <defs - id="defs96" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview94" - showgrid="false" - inkscape:zoom="13.906433" - inkscape:cx="-6.6869741" - inkscape:cy="17.701382" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4411"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - id="path3" - d="m 13.731752,19.429284 c 1.354243,-1.735792 2.726364,-3.448226 4.018258,-5.232082 0.633909,-0.875308 1.191274,-1.793829 1.743699,-2.721334 0.484235,-0.812869 1.017254,-1.7993085 1.20457,-2.7355277 0.533019,-2.6630275 -0.226486,-5.7511763 -2.985282,-6.81937 -1.398535,4.8154961 -2.797159,9.6308127 -4.195693,14.4462187 -0.325669,1.121109 -0.651248,2.242398 -0.976916,3.363507 0.396193,-0.10062 0.793284,-0.20124 1.190375,-0.301861" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path5" - d="m 12.856713,19.640408 c 0.348488,-1.725461 0.708116,-3.394592 1.196665,-5.081781 0.860304,-2.971268 1.720609,-5.9426248 2.581003,-8.9139821 0.359449,-1.2412248 0.718808,-2.4825396 1.078256,-3.7237644 0.970628,0.3000644 1.628793,0.9416095 1.968837,1.893371 0.358819,1.0042278 0.547303,2.0604728 0.493758,3.1296547 -0.109335,2.1849008 -1.432313,4.1950638 -2.497363,6.0384838 -0.697515,1.207265 -1.465015,2.376439 -2.208798,3.555405 -0.387478,0.614233 -0.773519,1.229545 -1.149498,1.850966 -0.202319,0.334563 -0.399517,0.672181 -0.599231,1.008271 -0.08086,0.134759 -0.736685,0.248856 -0.864258,0.243465" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path7" - d="m 12.554852,19.715873 c 0.701738,-0.943586 1.403385,-1.887082 2.105033,-2.830668 0.395744,-0.532211 0.791578,-1.064421 1.187321,-1.596541 0.223611,-0.300694 0.437699,-0.414071 0.809635,-0.157309 0.402662,0.278053 0.0186,0.544069 -0.200881,0.84584 -0.315787,0.434015 -0.657447,0.852309 -0.990932,1.272848 -0.323423,0.407693 -0.644689,0.81817 -0.977905,1.217957 -0.233942,0.280569 -0.529694,0.903338 -0.890311,0.995783 -0.315337,0.07996 -0.745669,0.256043 -1.04214,0.251551" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path9" - d="M 20.894668,7.4251774 C 20.633235,7.0955556 20.310261,6.7844408 19.81794,6.7353884 19.620383,6.7157135 19.645538,6.7376344 19.571959,6.5540919 19.460827,6.2771162 19.349696,6.0001405 19.238564,5.7232546 18.729982,4.4557966 18.221399,3.1882487 17.712817,1.9207008 c 1.142042,0.4727363 1.858333,1.1813916 2.49368,2.2309885 0.584856,0.9681123 0.652236,2.1772644 0.687273,3.2734881" - inkscape:connector-curvature="0" - style="fill:#ffd900" /> - <path - id="path11" - d="m 16.415262,15.025344 c -0.514062,0.848176 -1.055705,1.678654 -1.578752,2.52117 -0.264308,0.425661 -0.537151,0.848716 -0.787535,1.282641 -0.06163,0.10682 -0.258648,0.575603 -0.360526,0.602914 l -0.832275,0.222893 c 0.09164,-0.473006 0.222713,-0.645139 0.510559,-1.032079 0.476869,-0.641185 0.953558,-1.282191 1.430427,-1.923287 0.388287,-0.522148 0.776664,-1.044207 1.164951,-1.566355 0.132963,-0.178781 0.357335,-0.28344 0.516351,-0.234926" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" - sodipodi:nodetypes="ccccccccc" /> - <path - id="path13" - d="M 19.114945,2.7350974 C 19.919818,3.9736271 20.170561,5.3647045 20.170561,6.821904 20.07021,6.772043 19.654791,6.7615317 19.628019,6.6947808 19.432258,6.2068616 19.236498,5.7189423 19.040647,5.2309333 l -1.32819,-3.3102325 c 0.495017,0.1530868 1.083467,0.5013952 1.402398,0.8143966" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path15" - d="m 13.399345,19.429284 c 1.083826,-1.917268 2.255425,-3.783777 3.388393,-5.672387 0.573896,-0.956612 1.09811,-1.939728 1.615137,-2.927964 C 18.869862,9.936286 19.331009,8.9325073 19.505118,7.9353768 19.887386,5.7455349 19.307471,3.4797784 17.754952,1.8732654 17.508791,1.6186598 15.94621,0.5780469 15.826992,1.2485204 15.684776,2.0480036 15.54265,2.8474868 15.400434,3.64697 c -0.942419,5.2964978 -1.884837,10.592995 -2.826356,15.889942 -0.0115,0.06469 -0.023,0.12919 -0.0345,0.193874 0.28569,-0.10062 0.572279,-0.201241 0.858867,-0.301861" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path17" - d="m 12.64559,19.54967 c 0.661489,-4.881708 1.662932,-9.7278398 2.521979,-14.5773852 l 0.57731,-3.2587543 c 0.03648,-0.2060024 0.07304,-0.4120946 0.109514,-0.6180969 0.03899,-0.21983771 0.974132,0.1498525 1.10422,0.2148965 0.943406,0.471209 1.274465,1.684943 1.492866,2.640298 0.224239,0.9802407 0.271226,2.1204857 0.105921,3.1112376 -0.361246,2.165765 -1.482085,4.2371083 -2.395935,6.2132213 -0.915645,1.980246 -1.853122,3.947735 -2.725466,5.948015 -0.134759,0.306354 -0.45908,0.351273 -0.790589,0.326118" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path19" - d="m 15.993016,12.32656 c 0.338426,-0.204655 0.841079,-0.165844 1.176361,0.03019 0.350824,0.205104 0.28587,0.336091 0.127931,0.641186 -0.434015,0.838114 -0.89606,1.656374 -1.394581,2.457744 -0.480103,0.771723 -0.995873,1.521345 -1.486397,2.286599 -0.249844,0.389814 -0.506786,0.777742 -0.733451,1.181661 -0.101789,0.181476 -0.180758,0.469323 -0.385053,0.540925 -0.252719,0.08867 -0.505438,0.177433 -0.758067,0.266105 0.136017,-0.76211 0.271855,-1.52431 0.407872,-2.28642 0.09128,-0.511367 0.568146,-1.160099 0.820326,-1.616125 0.350015,-0.633101 0.707487,-1.261349 1.069901,-1.887442 0.300064,-0.516578 0.678289,-1.246975 1.156236,-1.614419" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path21" - d="m 16.6806,12.165478 c -0.574435,1.332143 -1.31206,2.667339 -1.901138,3.992564 -0.275628,0.620164 -0.546046,1.242932 -0.825088,1.861568 -0.164406,0.364749 -0.324501,0.729498 -0.478845,1.09856 -0.04348,0.104124 -0.07421,0.315427 -0.195581,0.336988 -0.206542,0.03665 -0.413083,0.0734 -0.619535,0.110144 0.05507,-0.445066 0.110234,-0.890042 0.165305,-1.335108 0.03504,-0.282456 0.02956,-0.66095 0.158927,-0.909986 0.379303,-0.730306 0.763907,-1.45657 1.162166,-2.176725 0.378135,-0.68395 0.774148,-1.357657 1.213015,-2.004593 0.329712,-0.48693 0.574974,-1.148503 1.206547,-1.152096" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" - sodipodi:nodetypes="ccccccccccc" /> - <path - id="path23" - d="m 19.612656,6.7164322 c -0.307251,-0.4318593 -0.982127,-0.4948369 -1.45657,-0.399517 -0.256043,0.051388 -0.54371,-1.0171648 -0.63355,-1.233319 -0.555029,-1.3358261 -1.109879,-2.6716521 -1.664908,-4.0073883 0.656907,0.01689 1.126679,0.1752772 1.648647,0.5855749 0.527988,0.4149695 0.930111,0.8983967 1.284348,1.4651054 0.29737,0.4756112 0.574615,1.1295542 0.658256,1.6873687 0.07816,0.527269 0.310845,1.4010496 0.162609,1.9021753" - inkscape:connector-curvature="0" - style="fill:#ffd900" /> - <path - id="path25" - d="m 16.430535,1.0913009 c 1.063702,0.2478677 1.545063,1.2145425 1.843151,2.1753778 0.164586,0.5307728 0.248407,1.0610065 0.318841,1.611005 0.03279,0.2566719 0.154255,1.285426 -0.02057,1.401409 -0.114905,0.076274 -0.526461,0.063517 -0.569853,-0.040877 C 17.78397,5.7131926 17.565839,5.1881696 17.347708,4.6632364 16.85368,3.4739388 16.359562,2.2847311 15.865444,1.0954336 c -0.0026,-0.00638 -0.0054,-0.012847 -0.008,-0.019226 0.173391,0.00449 0.45369,0.010601 0.572279,0.015093" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path27" - d="m 12.977098,19.429284 c 0.834611,-2.01133 1.745495,-3.98394 2.623588,-5.975955 0.451085,-1.023363 0.914119,-2.042864 1.327202,-3.082219 0.389814,-0.9805102 0.855094,-2.0071081 1.007731,-3.0576034 0.284163,-1.9551807 0.05112,-4.7234104 -1.565546,-6.1012815 -0.368702,-0.31416929 -0.838563,-0.58243055 -1.327022,-0.63345948 -0.160453,-0.0168 -0.795979,0.002156 -0.818888,0.22549757 -0.069,0.67101251 -0.137904,1.34202501 -0.206811,2.01312731 -0.559791,5.4491354 -1.119582,10.8984505 -1.679373,16.3472265 -0.01312,0.128381 -0.02641,0.256761 -0.03953,0.385142 0.227295,-0.04043 0.453691,-0.07996 0.679188,-0.120385" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path29" - d="m 12.932178,19.429284 c -0.187225,0.02453 -0.41991,-0.02515 -0.618186,-0.04492 l 1.53545,-14.9322518 c 0.1061,-1.0322579 0.212201,-2.0645157 0.318391,-3.0967735 0.01985,-0.1927061 0.03962,-0.38532232 0.05938,-0.57802841 0.0248,-0.24077031 0.84045,-0.21103338 0.989674,-0.16844938 0.842067,0.24059064 1.242034,1.35756729 1.472562,2.13243439 0.309228,1.039445 0.314529,2.1381842 0.314529,3.2127565 0,0.9589486 -0.339684,1.985816 -0.602285,2.8992159 -0.320279,1.114012 -0.665622,2.2192193 -1.018513,3.3232593 -0.647654,2.026244 -1.33897,4.040898 -2.031993,6.051959 -0.129369,0.377327 -0.266824,0.888515 -0.418653,1.201157" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path31" - d="m 12.298809,19.54967 c 0.06244,-0.60534 0.124967,-1.21077 0.187495,-1.816199 0.04995,-0.483967 0.189562,-0.822482 0.374901,-1.275813 0.403111,-0.985811 0.806132,-1.979168 1.256408,-2.944585 0.177433,-0.380202 0.345523,-1.086701 0.79005,-1.202055 0.138623,-0.03594 1.193879,0.01186 1.079873,0.28569 -0.407872,0.979522 -0.839372,1.949072 -1.280036,2.914219 -0.350105,0.766872 -0.692843,1.536977 -1.041691,2.304388 -0.161082,0.354507 -0.31911,0.710811 -0.466447,1.071248 -0.03324,0.08122 -0.156232,0.530593 -0.237626,0.545057 -0.219209,0.04043 -0.440215,0.07906 -0.66122,0.118589" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path33" - d="m 12.932178,19.429284 c -0.187225,0.02453 -0.41991,-0.02515 -0.618186,-0.04492 0.03935,-0.378405 0.07879,-0.75681 0.118139,-1.135215 0.0318,-0.305814 -0.0082,-0.766242 0.114186,-1.051303 0.29117,-0.678919 0.5606,-1.36727 0.85761,-2.043583 0.300962,-0.685297 0.590156,-1.376075 0.906662,-2.054274 0.225407,-0.483248 0.409309,-0.945293 1.034503,-0.803436 -0.383435,1.177438 -0.792296,2.346342 -1.183907,3.521086 -0.219388,0.658435 -0.44803,1.313456 -0.663466,1.973238 -0.169797,0.521969 -0.349476,1.188579 -0.565091,1.639574" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path35" - d="M 15.269807,0.62386514 C 17.689369,1.3937911 18.029592,4.1646262 18.029592,6.3394649 17.812898,6.0712935 17.420838,5.9932229 17.096157,5.9663608 16.996885,5.9580955 16.429008,6.0779417 16.417149,6.0494625 16.118522,5.3274211 15.819985,4.6054695 15.521268,3.883428 15.142594,2.9679618 14.76392,2.0524057 14.385245,1.1369395 14.328377,0.99957464 14.143756,0.77245995 14.327209,0.69933046 14.632664,0.57777739 14.952493,0.52620941 15.270525,0.62386514" - inkscape:connector-curvature="0" - style="fill:#ffd900" /> - <path - id="path37" - d="m 15.269807,0.62386514 c 0.317493,0.0300064 0.597074,0.41955126 0.776753,0.67110236 0.322974,0.4520732 0.508134,0.9625422 0.665173,1.4904401 0.139521,0.4688732 0.222893,0.9916503 0.250024,1.4795695 0.01429,0.2575704 0.04241,0.5181054 0.04241,0.7760351 0,0.1668323 0.102956,0.8079281 0,0.9214855 -0.04887,0.053994 -0.581083,0.1011595 -0.594559,0.068548 C 16.211147,5.5512117 16.012691,5.071378 15.814235,4.5915443 15.29613,3.3389098 14.778114,2.0863651 14.259919,0.83373061 14.141331,0.54561478 15.109802,0.57454316 15.270615,0.62386514" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path39" - d="m 12.554852,19.429284 c 1.362688,-4.15742 2.906223,-8.317536 3.794019,-12.6089971 0.214088,-1.034953 0.06082,-2.1615425 -0.05292,-3.1989212 C 16.187699,2.634477 15.75566,1.4759944 14.997952,0.81297764 14.62359,0.4854222 14.171427,0.28157599 13.67084,0.26252998 c -0.222712,-0.008535 -0.448929,0.0283893 -0.648462,0.12829105 -0.281109,0.14059909 -0.232955,0.44542509 -0.268891,0.72626387 -0.146528,1.1418622 -0.161711,2.3216368 -0.23493,3.4697878 -0.273472,4.2808602 -0.521789,8.5695363 -0.703984,12.8551583 -0.01994,0.468693 -0.03261,0.938196 -0.06019,1.40644 -0.01078,0.183452 -0.12883,0.480103 0.08526,0.503012 0.220736,0.02246 0.550448,0.05301 0.715753,0.07726" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path41" - d="m 11.966941,19.369092 c 0.159915,-4.316617 0.184621,-8.631975 0.435543,-12.9458965 0.06073,-1.0430386 0.13422,-2.0852686 0.198456,-3.1280376 0.03297,-0.5358038 0.07169,-1.0708889 0.109784,-1.6063333 0.02533,-0.3558549 -0.07259,-1.19657458 0.364749,-1.32145172 0.219658,-0.0627979 0.39206,-0.10565145 0.625913,-0.10565145 0.230349,0 0.454588,0.34983567 0.579466,0.51298451 0.312821,0.40877046 0.479384,0.93532076 0.579196,1.43473956 0.21292,1.0654985 0.255953,2.1513007 0.22397,3.2363842 -0.06082,2.0637071 -0.387568,4.1839233 -0.79562,6.2058553 -0.440124,2.181576 -0.917802,4.354169 -1.498436,6.503134 -0.09774,0.361604 -0.195491,0.723209 -0.293147,1.084814 -0.07546,0.278503 -0.255144,0.153626 -0.529515,0.128471" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path43" - d="m 12.554852,19.429284 c -0.206092,-0.02012 -0.412095,-0.04007 -0.618187,-0.06019 0.145001,-0.945114 0.346961,-1.890766 0.62187,-2.8074 0.142216,-0.473994 0.272664,-0.951133 0.433836,-1.419018 0.04779,-0.138622 0.118678,-0.481001 0.263859,-0.539038 0.192796,-0.07708 0.393318,-0.07133 0.595637,-0.03764 0.454499,0.07564 0.08337,0.634268 -0.0023,0.919958 -0.130627,0.435273 -0.280299,0.864437 -0.41991,1.296835 -0.137275,0.425301 -0.282456,0.847638 -0.415688,1.274376 -0.130268,0.418653 -0.233584,1.016087 -0.459081,1.37275" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path45" - d="m 12.434467,19.414012 c -0.155872,-0.01509 -0.311744,-0.0301 -0.467616,-0.04519 0.07978,-0.387299 0.104214,-0.813857 0.19603,-1.215171 0.124518,-0.543979 0.271496,-1.082478 0.413532,-1.622145 0.135748,-0.515949 0.282456,-1.033067 0.461237,-1.536079 0.138623,-0.389904 0.264578,-0.452343 0.648553,-0.452343 -0.187226,0.80164 -0.383077,1.600225 -0.576861,2.400067 -0.109514,0.452253 -0.232954,0.900284 -0.351902,1.350111 -0.08445,0.320727 -0.157219,0.854375 -0.322524,1.121199" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path47" - d="M 13.881784,0.27699417 C 16.34959,0.79644714 16.424157,4.0921256 16.430445,6.0828828 15.978282,5.705107 15.012506,5.537017 14.50033,5.8870324 14.099555,4.8188387 13.759961,3.7237829 13.440581,2.6286374 13.274827,2.0604015 13.107096,1.4921655 12.934604,0.92599595 c -0.10089,-0.33123887 -0.13467,-0.48073208 0.238435,-0.60381243 0.221005,-0.0725905 0.547123,-0.063337 0.708835,-0.0451894" - inkscape:connector-curvature="0" - style="fill:#ffd900" /> - <path - id="path49" - d="m 13.746126,0.26190111 c 1.088857,0.70030022 1.248681,2.31292229 1.311839,3.49090009 0.03055,0.5687749 0.03037,1.1348547 0.03037,1.7043483 0,0.20735 0.0073,0.2052837 -0.150931,0.2790421 -0.142126,0.066302 -0.299346,0.064864 -0.43707,0.1508408 C 14.109887,4.8465093 13.776312,3.7800226 13.465287,2.7132663 13.300072,2.1467374 13.129377,1.5818255 12.962005,1.0158356 12.881509,0.7433519 12.733992,0.54489607 13.022198,0.38255578 13.238711,0.26100271 13.506434,0.26190111 13.746306,0.26190111" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path51" - d="M 9.4486453,19.187616 C 8.1713947,17.378514 6.9305292,15.552074 5.7454541,13.681252 4.6543513,11.959026 3.4336099,9.8927137 3.173524,7.8417639 2.8449803,5.251237 4.0292469,2.4024211 6.6435813,1.5587367 7.7691825,6.4501474 8.8948736,11.341378 10.020475,16.233148 c 0.256672,1.115629 0.513433,2.231168 0.770195,3.346797 -0.418653,-0.116791 -0.9788928,-0.185968 -1.3420247,-0.3917" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path53" - d="m 7.5333534,14.709108 c 0.5398465,0.833622 1.0796931,1.667245 1.6195397,2.500867 0.3547768,0.547842 0.7095537,1.095595 1.0643309,1.643437 0.157219,0.242747 0.298088,0.59411 0.573446,0.726533 -0.35864,-0.10071 -0.71728,-0.20151 -1.0760095,-0.30222 C 9.3977062,19.188694 9.3286195,19.030845 9.1469637,18.758092 8.7757462,18.200817 8.3773072,17.657646 7.9876726,17.112679 7.6295716,16.611643 7.2956376,16.094256 6.9506533,15.584416 6.8022381,15.365117 6.5038806,15.138901 6.7039535,14.890045 6.8806682,14.66904 7.2868333,14.66904 7.5333534,14.708569" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path55" - d="M 6.628578,1.5588266 C 6.2136984,2.6896385 5.6752893,3.7816397 5.1371497,4.858458 5.0105656,5.1118059 4.5901159,6.2790028 4.3302098,6.2528595 3.7471503,6.1941942 3.3489809,6.5953283 3.1149485,7.0783064 3.218354,4.6267615 4.2141369,2.4443762 6.628578,1.5588266" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path57" - d="M 9.8104296,19.308899 C 8.8590275,17.321736 7.7982007,15.393058 6.804574,13.427186 6.3029991,12.434727 5.8275675,11.437597 5.3909467,10.415042 4.9908009,9.4780138 4.5914635,8.4662394 4.4800623,7.4476373 4.2414482,5.2649825 4.9339323,3.0288731 6.5798849,1.5426554 6.9656565,1.194347 7.460134,0.98421205 7.9472447,0.82762151 8.1845113,0.75134763 8.5452176,0.73616472 8.5771106,1.0036174 8.6713525,1.7946557 8.7655943,2.585694 8.8598361,3.3768221 9.4957213,8.7125798 10.131517,14.047978 10.767312,19.384454 c 0.0077,0.0654 0.01554,0.130627 0.02336,0.196031 -0.32495,-0.09164 -0.650978,-0.201241 -0.9802404,-0.271316" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path59" - d="M 10.564454,19.338546 C 9.6235631,17.345902 8.5521352,15.423244 7.5585983,13.456923 7.0552266,12.460691 6.583209,11.456194 6.1449711,10.429865 5.7473407,9.4985871 5.3449488,8.4896876 5.2341765,7.4772844 4.9953827,5.2950788 5.6868786,3.044595 7.3339991,1.5573891 7.7198605,1.2089909 8.2094867,0.99714896 8.7013589,0.85654988 8.9441057,0.78719366 9.298613,0.74505885 9.3312248,1.0183511 9.4254666,1.8093894 9.5197085,2.6004277 9.6139503,3.3915558 10.249746,8.7273135 10.885541,14.062712 11.521336,19.399188 c 0.0077,0.0654 0.01554,0.130627 0.02336,0.19603 -0.32513,-0.08714 -0.651248,-0.19046 -0.980241,-0.256941" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path61" - d="m 6.3571724,12.552058 c -0.037733,-0.421887 1.2499393,-0.548921 1.3910775,-0.228732 0.3410313,0.773789 0.6820627,1.547668 1.023184,2.321457 0.7156628,1.623852 1.5492851,3.221111 2.0193261,4.934803 C 10.617909,19.530983 9.8867035,19.437639 9.8168981,19.289674 9.6443161,18.924116 9.4644571,18.566105 9.2760633,18.208363 8.9405121,17.57113 8.6078358,16.93264 8.2690504,16.297114 7.9506586,15.69995 7.6290326,15.105301 7.3214216,14.502297 7.0101271,13.893184 6.7633375,13.083729 6.3571724,12.552777" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path63" - d="M 10.730478,19.369092 C 10.427898,19.386071 9.9274907,18.009907 9.7751226,17.718468 9.4743394,17.143044 9.1883798,16.559536 8.8796907,15.988066 8.2033776,14.73597 7.3859226,13.090066 6.7596502,11.812187 c 0.2181307,-0.05884 0.6214109,0.25083 0.8296593,0.33402 0.165305,0.06585 0.2070944,0.287084 0.2788763,0.449963 0.3673544,0.833443 0.7347987,1.667065 1.1021531,2.500597 0.413532,0.938196 0.827064,1.876481 1.2405061,2.814587 0.184621,0.417755 0.524664,1.052023 0.519633,1.4572" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" - sodipodi:nodetypes="ccccccccc" /> - <path - id="path65" - d="m 7.970603,0.8198953 c 0.1892922,0.009703 0.3786742,0.0194054 0.5679664,0.0291081 0.053095,0.002695 0.068907,0.45162405 0.075196,0.50984015 C 8.658146,1.7693209 8.678899,2.066241 8.5837588,2.4706094 8.404888,3.2311022 8.2254782,3.9880014 7.9939613,4.7346589 7.8867826,5.0801823 7.764421,5.4310062 7.6766476,5.7814708 7.6468209,5.9002388 6.5912047,5.912457 6.4454848,5.9260228 5.7395247,5.9919651 5.0718362,5.7989895 4.4418805,6.2640895 4.333444,5.8139927 4.5505865,5.0718272 4.645547,4.5974737 4.7662017,3.9945597 5.0328458,3.4593848 5.3198836,2.9211553 5.8663783,1.8966237 6.8812072,1.1551769 7.970603,0.8198953" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path67" - d="M 8.5587834,0.88026755 C 8.5975043,1.2283963 8.6361353,1.5764352 8.6748562,1.9245639 8.7064798,2.2090861 8.5524946,2.6040213 8.487271,2.8812665 8.333735,3.5339517 8.166184,4.1795396 7.9674586,4.8201863 7.8761815,5.1145909 7.7971226,5.4117805 7.6998263,5.7044782 7.6225642,5.936534 7.0383368,6.099585 6.8139173,6.1205176 6.2744301,6.1710075 5.737638,5.8591821 5.2109979,5.9474046 5.3911264,4.8666334 5.6219245,3.8528826 6.1912385,2.9011211 6.4809715,2.4167954 6.8310767,2.0036228 7.2579948,1.6377058 7.6593086,1.29353 8.137615,1.1408026 8.5587834,0.88026755" - inkscape:connector-curvature="0" - style="fill:#ffd900" - sodipodi:nodetypes="cccccccccc" /> - <path - id="path69" - d="M 10.232766,19.338546 C 9.5473791,17.281937 8.7525675,15.270876 8.0170501,13.232773 7.6356807,12.175989 7.2360739,11.124326 6.8846211,10.0573 6.5526635,9.0494786 6.1820749,7.9864058 6.0837004,6.9245009 5.9006072,4.9474891 6.3618441,2.2206754 8.0459785,0.94037029 c 0.3482186,-0.2647575 0.9597572,-0.60749585 1.41767,-0.55035781 0.1759061,0.0219209 0.7326425,0.0636065 0.7415365,0.30320888 0.02668,0.71027244 0.05336,1.42063474 0.08005,2.13090714 0.204565,5.4511118 0.40913,10.9020435 0.613785,16.3535145 0.0041,0.108976 0.0082,0.217862 0.01231,0.326837 -0.226216,-0.0557 -0.452433,-0.110503 -0.678559,-0.166203" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path71" - d="M 10.866046,19.353819 C 10.179132,17.293436 9.3891714,15.276266 8.6455685,13.236636 7.9023249,11.197904 6.911034,9.035823 6.7091642,6.8548751 6.6089032,5.7714087 6.7724114,4.6314331 7.0732844,3.5872267 7.3479243,2.6342074 7.833328,1.508696 8.7010894,0.94144837 9.1220781,0.66626946 9.633176,0.3719547 10.157301,0.41274191 c 0.181476,0.0141048 0.673168,0.0780707 0.681883,0.31012654 0.02731,0.72806065 0.05462,1.45612135 0.08202,2.18418205 0.204116,5.4379952 0.408232,10.8759905 0.612348,16.3139855 0.0038,0.09954 0.0075,0.199085 0.01123,0.298537 -0.226306,-0.0548 -0.452522,-0.109604 -0.678738,-0.165305" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path73" - d="m 7.4729811,11.73811 c 0.6767622,-0.430421 1.3404079,-0.129279 1.885016,0.316775 0.2019595,0.165395 0.3360902,0.228373 0.3825373,0.477318 0.079059,0.423774 0.1581178,0.847458 0.2372665,1.271142 0.3507341,1.879535 0.8668631,3.786742 0.9335241,5.701135 l -0.55467,-0.135568 C 10.164488,19.322016 10.175718,19.170726 10.11265,18.985117 9.9826523,18.602131 9.8469944,18.221839 9.7100787,17.841368 9.4614025,17.150501 9.2006878,16.466372 8.9330554,15.782602 8.6682979,15.10602 8.4017436,14.430875 8.1466888,13.750609 7.9069067,13.11095 7.7518434,12.329345 7.4729811,11.7382" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path75" - d="M 10.896232,19.369092 C 10.725896,19.167312 10.668129,18.768244 10.579637,18.509506 10.472728,18.197223 10.367615,17.884132 10.254327,17.574185 9.997925,16.872627 9.7375697,16.172866 9.4721833,15.474812 8.9766277,14.171238 8.4139636,12.751775 7.9651246,11.430414 c 0.6453183,-0.122362 1.0807694,0.36726 1.5437133,0.752942 0.4346443,0.362144 0.4015833,1.259642 0.5010361,1.792481 0.219748,1.177528 0.439495,2.355237 0.659243,3.532765 0.105023,0.562396 0.333305,1.303574 0.227115,1.86058" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" - sodipodi:nodetypes="ccccccccc" /> - <path - id="path77" - d="M 9.1620567,0.42783498 C 9.4324741,0.34527232 9.8302842,0.3945943 10.074379,0.54085328 10.270049,0.65818389 9.8973944,1.3121268 9.8103398,1.522172 9.5152165,2.2339717 9.1581936,2.916304 8.8258767,3.6109443 8.5175469,4.2552744 8.1796599,4.9020302 7.8219184,5.5203068 7.7763697,5.5989165 7.7276766,5.6752803 7.6918305,5.7587413 7.6468209,5.8637639 7.6207674,5.7608076 7.5334432,5.766198 7.3709232,5.7763499 7.1899861,5.7148097 7.0206384,5.7210087 6.7034145,5.7325081 6.3117135,5.7954857 6.0403977,5.9624078 6.2331038,3.8704013 6.714914,0.98358317 9.1620567,0.42783498" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path79" - d="M 9.7953366,0.44292804 C 9.8983827,0.47050882 10.00053,0.50779228 10.096928,0.55594635 10.256663,0.63581381 10.013557,1.0317372 9.9496811,1.1858123 9.6727054,1.8538601 9.3588056,2.4966629 9.0469721,3.1484497 8.7387322,3.79269 8.3989586,4.4165366 8.0709539,5.0504454 7.9894694,5.2079343 7.9105901,5.3667708 7.8217387,5.520217 7.7283953,5.6814792 7.7027919,5.9861192 7.5303896,5.9516208 7.236524,5.8930453 6.9854212,5.7178643 6.6886808,5.7511948 6.8266745,4.6324214 6.9814683,3.5512908 7.4718132,2.524064 7.7047675,2.0361447 8.0057303,1.5715838 8.4064153,1.2030615 8.8360286,0.80794662 9.3108312,0.6328491 9.7953366,0.44292804" - inkscape:connector-curvature="0" - style="fill:#ffd900" - sodipodi:nodetypes="ccccccccccc" /> - <path - id="path81" - d="M 10.639919,19.369092 C 9.5874476,15.123269 8.2868387,10.876548 7.6984787,6.5345967 7.5557234,5.4814063 7.7832873,4.3859912 7.9538929,3.3489718 8.1202759,2.3370178 8.6664113,1.2380091 9.4720036,0.60059666 9.838819,0.31032469 10.390255,0.10441216 10.866225,0.16361651 c 0.2246,0.0279401 0.489088,0.0745669 0.65601,0.24130935 0.170605,0.17051569 0.125865,0.47938448 0.128291,0.70991304 0.01204,1.1760912 0.01491,2.3517331 0.01491,3.527914 0,4.3203898 -0.04699,8.6466191 -0.13997,12.9656611 -0.0098,0.456116 -0.02587,0.912501 -0.02587,1.368797 0,0.26907 0.08166,0.357832 -0.19064,0.367624 -0.223072,0.009 -0.446054,0.01797 -0.669036,0.02426" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path83" - d="M 11.062076,19.353819 C 10.526182,17.192277 9.990648,15.031004 9.4792806,12.863532 8.9832758,10.760745 8.4962549,8.6390011 8.2735424,6.4879699 8.1711252,5.4990148 8.2756087,4.3321772 8.5321908,3.3705334 8.8115023,2.3232723 9.1371711,1.1605673 10.081925,0.5033003 c 0.339235,-0.23600881 0.831107,-0.40427852 1.22164,-0.22621629 0.416766,0.19010074 0.343816,0.53409684 0.348129,0.95688229 0.01186,1.1539906 0.01689,2.3077116 0.01365,3.4617022 -0.0124,4.3883085 -0.05103,8.7805695 -0.14545,13.1686985 -0.007,0.322974 -0.02039,0.646486 -0.02039,0.96955 0,0.08553 0.0548,0.449558 0,0.505168 -0.05031,0.05121 -0.356573,0.01258 -0.437429,0.01527" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path85" - d="m 11.333751,18.901027 c 0.01384,0.05624 0.11203,0.351453 0.09038,0.39224 -0.04887,0.09218 -0.275359,0.05561 -0.399607,0.06028 -0.221994,0.0084 -0.376608,0.09766 -0.438687,-0.125686 C 10.384415,18.502768 10.208419,17.768868 10.029369,17.037752 9.6811504,15.61595 9.3256548,14.193788 8.9508437,12.778544 9.0997978,12.72437 9.2349167,12.619258 9.4183693,12.6127 c 0.1049328,-0.0037 0.3168645,0.01914 0.4072432,0.07537 0.1435638,0.08921 0.1333221,0.202409 0.1772535,0.371397 0.166114,0.640198 0.325849,1.283899 0.475432,1.928139 0.161352,0.69491 0.33025,1.388203 0.494298,2.082573 0.124607,0.528258 0.419371,1.319745 0.361155,1.831831" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path87" - d="m 11.42404,19.338546 c -0.05804,0.0025 -0.338875,0.04492 -0.351992,-0.0047 -0.04681,-0.177793 -0.09361,-0.355676 -0.140419,-0.533468 -0.06828,-0.259457 -0.122542,-0.522598 -0.188933,-0.782594 -0.167282,-0.654931 -0.323962,-1.312198 -0.48172,-1.969555 -0.2749996,-1.146264 -0.5759765,-2.410548 -0.8695726,-3.552321 0.1455403,0.0142 0.3293662,0.139762 0.4643054,0.207322 0.1771642,0.08849 0.3221312,0.6163 0.3720822,0.826076 0.174559,0.733091 0.354777,1.464925 0.531582,2.197478 0.289283,1.196664 0.434049,2.410398 0.664667,3.610656" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" - sodipodi:nodetypes="cccccccscc" /> - <path - id="path89" - d="m 10.564454,0.17143256 c 0.196749,0.007726 1.181032,0.0264129 1.025969,0.42269565 C 11.379929,1.1320881 11.169344,1.6701379 10.95885,2.2081877 10.500668,3.379158 10.042396,4.5501282 9.5842133,5.7210985 9.0712288,5.4398105 8.1086866,5.4072885 7.6539182,5.8116569 7.6771867,3.8085018 8.1696877,0.57094957 10.564454,0.17143256" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path91" - d="M 8.2421884,5.5550748 C 8.3530505,4.5318908 8.3812602,3.3304649 8.8059323,2.3749301 9.2209916,1.4410468 9.7551782,0.32532791 10.906294,0.1971267 c 0.206991,-0.0230888 0.576771,0.0923552 0.653494,0.24580134 0.0893,0.17860126 -0.09038,0.46042831 -0.180129,0.68969916 -0.271316,0.6932927 -0.542631,1.3866753 -0.813947,2.079968 C 10.238516,4.048733 9.9113196,5.1137743 9.5841235,5.9499121 9.2170386,5.7255824 8.6578765,5.5050341 8.2421884,5.5550748" - inkscape:connector-curvature="0" - style="fill:#ffd900" - sodipodi:nodetypes="cscscccc" /> - <path - id="path93" - d="M 11.137541,19.398739 C 10.335363,15.07233 9.7245429,10.76883 9.5846625,6.3665965 9.5525898,5.3576072 9.6209578,4.2965108 9.8060275,3.3051301 10.007089,2.2283118 10.237078,1.0958828 11.101875,0.34895575 c 0.251281,-0.21705265 1.082388,-0.55044766 1.238709,-0.0817541 0.161173,0.48297806 0.139162,1.00916905 0.139162,1.51290005 0,1.0890365 -0.05247,2.1750184 -0.105652,3.2623479 -0.215794,4.4125653 -0.466986,8.8240524 -0.706948,13.2351804 -0.02363,0.433835 -0.0433,0.867941 -0.06217,1.302046 -0.153356,-0.06109 -0.308959,-0.133861 -0.466717,-0.180578" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path95" - d="m 10.127294,5.1178251 c 0.08957,-1.1052076 0.191089,-2.1878655 0.54389,-3.2455479 0.175456,-0.5259214 0.424043,-0.95481602 0.780257,-1.37805071 0.133951,-0.15910605 0.370768,-0.28452223 0.56599,-0.34965599 0.269609,-0.08983967 0.352351,0.0592043 0.391701,0.3478592 0.139251,1.0205787 0.1008,2.1081777 0.03656,3.1350451 -0.07142,1.1416825 -0.115085,2.2856111 -0.170246,3.4282818 -0.195312,4.0498824 -0.434825,8.0985074 -0.655291,12.1472214 -0.781426,-4.283555 -1.508049,-8.612929 -1.508049,-12.9809335 0,-0.3684325 0.0042,-0.7355174 0.01518,-1.1041296" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path97" - d="m 11.574881,12.190902 c 0.382537,0.51029 0.370049,0.896331 0.342289,1.526646 -0.0301,0.686105 -0.07753,1.371582 -0.110683,2.057598 -0.061,1.262067 -0.20708,2.542283 -0.20142,3.805069 -0.07564,-0.03028 -0.440754,-0.123799 -0.455128,-0.194593 -0.05085,-0.249574 -0.101698,-0.499239 -0.152637,-0.748813 -0.07663,-0.3758 -0.146978,-0.753126 -0.212381,-1.130992 -0.146798,-0.848356 -0.28021,-1.69788 -0.424673,-2.546595 -0.118669,-0.794268 -0.19637,-1.629158 -0.286206,-2.429085 -0.008,-0.451723 0.03394,-0.413891 0.451242,-0.497442 0.314349,-0.06019 0.810444,0.03953 1.049597,0.160813" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" - sodipodi:nodetypes="ccscccccccc" /> - <path - id="path99" - d="m 11.951848,12.929384 c -0.07573,2.092636 -0.236548,4.181857 -0.331688,6.273504 -0.293686,-1.584771 -0.573447,-3.169184 -0.815924,-4.76276 -0.03962,-0.260625 -0.334241,-2.533903 -0.334241,-2.533903 0.372168,-0.182898 0.899517,0.106521 1.128878,0.284228 0.193964,0.150032 0.198858,0.536352 0.352975,0.738482" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" - sodipodi:nodetypes="cccccc" /> - <path - id="path101" - d="M 9.5994861,5.087639 C 9.7036103,4.0108207 9.8228275,2.9755083 10.127923,1.9344462 10.373095,1.0977694 11.072587,-0.17283306 12.140511,0.07341748 12.748906,0.2136572 12.46645,2.282575 12.389457,2.7132663 12.209418,3.720369 12.032704,4.7431937 11.786184,5.7361916 11.201058,5.4783517 10.154965,5.3729698 9.5843032,5.7210087 9.5790925,5.5137485 9.6047866,5.2826809 9.5993963,5.087639" - inkscape:connector-curvature="0" - style="fill:#ff0000" /> - <path - id="path103" - d="m 12.223343,0.08096401 c 0.316056,0.3553159 0.256493,1.02695729 0.256493,1.47121439 0,0.4977118 -0.007,0.9944354 -0.01833,1.4920573 -0.0203,0.8922876 -0.152997,1.8036212 -0.11751,2.6919559 C 11.895608,5.6612653 11.445332,5.600893 10.990653,5.5800502 10.566341,5.5606448 9.9694459,5.5204865 9.5843032,5.7210087 9.5781941,4.7139958 9.7288552,3.6870385 9.9274907,2.6928727 10.155953,1.5461592 10.840352,-0.1819967 12.222715,0.08096401" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path105" - d="m 10.127294,5.1178251 c 0.08041,-0.9915604 0.135299,-2.0206738 0.452612,-2.9719861 0.164407,-0.4926808 0.325579,-1.0029701 0.666072,-1.40751812 0.210494,-0.25011365 0.807838,-0.88869402 1.083017,-0.5066059 0.243825,0.33860571 0.150931,1.08445462 0.150931,1.47786252 0,0.5080434 -0.01105,1.0151883 -0.02264,1.523052 -0.01887,0.8302084 -0.171683,1.9055812 -0.138622,2.7322858 -0.7003,-0.1897414 -1.488554,-0.4224181 -2.206463,-0.3645613 -6.29e-4,-0.1632387 0.01123,-0.3214464 0.01455,-0.4825289" - inkscape:connector-curvature="0" - style="fill:#ffd900" - sodipodi:nodetypes="ccccscccc" /> - <path - id="path107" - d="M 12.057499,19.429284 C 13.173128,15.196309 14.123003,10.905476 14.469425,6.5327999 14.55046,5.5097956 14.552347,4.4720576 14.444989,3.4512094 14.329814,2.3557943 14.139713,1.2405246 13.354066,0.41561678 13.187683,0.2410583 12.944936,0.16155019 12.720786,0.09075653 12.621154,0.05931265 12.486933,0.05823457 12.383797,0.07404636 12.184623,0.10468168 12.222715,0.20664971 12.192439,0.388036 c -0.07969,0.47758769 -0.158118,0.9538278 -0.21301,1.4351887 -0.121284,1.0632525 -0.178601,2.1347703 -0.208428,3.2044014 -0.12353,4.4219984 -0.103136,8.8532499 -0.150751,13.2765059 -0.0046,0.425301 -0.01518,0.850512 -0.01518,1.275903 0.13422,-0.04402 0.372565,-0.113198 0.452073,-0.15093" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" /> - <path - id="path109" - d="m 12.027313,19.429284 c 0.100261,-4.408342 0.114007,-8.819919 0.163419,-13.2288909 0.02291,-2.0360364 0.06971,-4.1088173 0.424762,-6.11889005 1.025609,0.16099269 1.527274,1.35181755 1.677216,2.26863135 0.18525,1.1326986 0.256403,2.2612645 0.223522,3.4090561 -0.05893,2.0637071 -0.387748,4.156612 -0.761302,6.1839345 -0.230618,1.252095 -0.471029,2.502034 -0.758606,3.742271 -0.13997,0.603543 -0.272663,1.208972 -0.426828,1.809101 -0.113737,0.44273 -0.227295,0.88537 -0.341032,1.32801 -0.03863,0.146439 -0.08265,0.565092 -0.202319,0.607316" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path111" - d="m 13.852137,12.055244 c -0.200522,1.319835 -0.501395,2.616042 -0.844314,3.90587 -0.169527,0.637322 -0.34741,1.272219 -0.517296,1.909452 -0.0937,0.351363 -0.187675,0.702636 -0.282097,1.05373 -0.03091,0.115084 -0.05238,0.417215 -0.135748,0.505168 -0.07933,0.08382 -0.354327,0.114366 -0.467525,0.150931 0.01312,-1.728785 0.0087,-3.479769 0.0087,-5.209722 0,-0.398888 0.01318,-0.780159 0.01807,-1.179047 0.0026,-0.214447 -0.01025,-0.475495 0.09879,-1.464828 0.260098,-0.0807 1.446063,0.01922 2.121657,0.328267" - inkscape:connector-curvature="0" - style="fill:#ffa300;fill-opacity:1" - sodipodi:nodetypes="ccccccsccc" /> - <path - id="path113" - d="m 13.73773,11.997301 c -0.192167,1.28492 -0.33551,2.489296 -0.651746,3.748556 -0.155962,0.620955 -0.313181,1.242823 -0.485404,1.859395 -0.08274,0.296415 -0.175277,0.589999 -0.259816,0.885865 -0.07969,0.2787 -0.12326,0.737567 -0.298178,0.95344 l 0,-4.814774 c 0,-0.877647 0.07776,-1.767732 0.08943,-2.632575 0.0035,-0.263997 -0.04092,-0.851993 0.197961,-0.92943 0.178152,-0.05781 0.377959,0.518232 0.562849,0.532662 0.336898,0.02556 0.636023,0.05438 0.870504,0.244323" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" - sodipodi:nodetypes="cccccscccc" /> - <path - id="path115" - d="m 10.353421,23.651749 c -0.09119,0.381729 0.638131,0.233942 0.869737,0.243106 0.191898,0.0075 1.262427,0.231876 1.196216,-0.137365 -0.361066,-0.01581 -0.721952,-0.03162 -1.083018,-0.04734 -0.295392,-0.01348 -0.720604,0.02875 -0.982756,-0.0584" - inkscape:connector-curvature="0" - style="fill:#84442f" /> - <path - id="path117" - d="m 12.238616,22.565587 c 0.01437,-0.317763 0.02875,-0.635526 0.04321,-0.953288 0.02021,-0.446414 0.0035,-0.374812 -0.450456,-0.40392 -0.0092,0.271406 -0.01824,0.542632 -0.0274,0.814038 -0.0055,0.16216 0.09191,0.601925 -0.168629,0.528257 0.01833,-0.43141 0.03665,-0.86282 0.05498,-1.294141 0.01123,-0.264128 0.103585,-0.197737 0.382268,-0.183901 0.210314,0.01042 0.383076,-0.0486 0.374002,0.16234 -0.01914,0.448659 -0.03818,0.897229 -0.05732,1.345798 -0.04582,-0.0045 -0.106909,0.0018 -0.150032,-0.01527" - inkscape:connector-curvature="0" - style="fill:#c1d8f1" /> - <path - id="path119" - d="m 12.238616,22.565587 c 0.01437,-0.317763 0.02875,-0.635526 0.04321,-0.953288 0.02021,-0.446414 0.0035,-0.374812 -0.450456,-0.40392 -0.0092,0.271406 -0.01824,0.542632 -0.0274,0.814038 -0.0055,0.16216 0.09191,0.601925 -0.168629,0.528257 0.01833,-0.43141 0.03665,-0.86282 0.05498,-1.294141 0.01123,-0.264128 0.103585,-0.197737 0.382268,-0.183901 0.210314,0.01042 0.383076,-0.0486 0.374002,0.16234 -0.01914,0.448659 -0.03818,0.897229 -0.05732,1.345798 -0.04582,-0.0045 -0.106909,0.0018 -0.150032,-0.01527" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.09882364;stroke-linecap:square;stroke-miterlimit:10" /> - <path - id="path125" - d="m 10.760574,22.429929 c -0.02012,0.147517 0.02165,0.373644 -0.180937,0.361964 0.03153,-0.210404 0.08328,-0.435902 0.165934,-0.633459 0.0049,0.09074 0.01,0.181476 0.015,0.271316" - inkscape:connector-curvature="0" /> - <path - id="path133" - d="m 11.197913,22.520667 c 0.01446,-0.317673 0.02893,-0.635346 0.04339,-0.953019 0.0203,-0.446503 0.0034,-0.374721 -0.450636,-0.404188 -0.0092,0.271405 -0.01824,0.542631 -0.0274,0.814037 -0.0055,0.162071 0.09191,0.601836 -0.168539,0.528257 0.01905,-0.448569 0.03818,-0.897139 0.05732,-1.345798 0.01141,-0.267812 0.405716,-0.130807 0.618995,-0.120116 0.213549,0.01069 0.132693,0.207799 0.123709,0.417755 -0.0084,0.196748 0.07349,1.191274 -0.196839,1.063701" - inkscape:connector-curvature="0" - style="fill:#c1d8f1" /> - <path - id="path135" - d="m 11.197913,22.520667 c 0.01446,-0.317673 0.02893,-0.635346 0.04339,-0.953019 0.0203,-0.446503 0.0034,-0.374721 -0.450636,-0.404188 -0.0092,0.271405 -0.01824,0.542631 -0.0274,0.814037 -0.0055,0.162071 0.09191,0.601836 -0.168539,0.528257 0.01842,-0.43141 0.03674,-0.86282 0.05507,-1.29414 0.0133,-0.312103 0.265206,-0.189562 0.553592,-0.175188 0.256133,0.01294 0.205912,0.0769 0.194682,0.340852 -0.01159,0.273113 -0.02327,0.546315 -0.03495,0.819517 -0.0066,0.152728 0.06352,0.404908 -0.165305,0.339145" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.09882364;stroke-linecap:square;stroke-miterlimit:10" /> - <path - id="path145" - d="m 11.077259,22.354464 c -0.01294,0.387658 -0.02578,0.775316 -0.03872,1.162975 -0.01087,0.327016 -0.0619,0.254336 -0.40347,0.245801 -0.302939,-0.0076 -0.28569,0.01015 -0.273023,-0.273652 0.01716,-0.383435 0.03441,-0.766781 0.05157,-1.150217 0.199175,0.0099 0.495376,0.06558 0.663646,0.01527" - inkscape:connector-curvature="0" - style="fill:#bf7242" /> - <path - id="path147" - d="m 11.047073,23.018379 c 0.005,-0.09056 0.01,-0.181117 0.015,-0.271585 -0.173391,-0.0079 -0.346781,-0.01572 -0.520172,-0.02363 -0.209775,-0.0094 -0.147966,0.08095 -0.158477,0.28012 0.199175,0.0081 0.495376,0.06379 0.663646,0.01437" - inkscape:connector-curvature="0" - style="fill:#84442f" /> - <path - id="path149" - d="m 11.062076,22.475748 c 0.005,-0.03531 0.01015,-0.07043 0.01518,-0.105742 -0.163059,-0.0074 -0.702187,-0.138353 -0.678649,0.09065 0.192077,0.0081 0.540116,0.0548 0.663466,0.01527" - inkscape:connector-curvature="0" - style="fill:#84442f" /> - <path - id="path151" - d="m 12.465012,22.415555 c -0.015,0.449468 -0.03001,0.898846 -0.04501,1.348314 -0.005,0.152278 -0.577041,0.05238 -0.698863,0.04824 -0.116522,-0.004 -0.80155,0.06136 -0.794003,-0.108706 0.01994,-0.449378 0.03989,-0.898846 0.05992,-1.348224 0.387209,0.01887 1.18229,0.19046 1.477862,0.06019" - inkscape:connector-curvature="0" - style="fill:#ffc461" /> - <path - id="path153" - d="m 12.434467,23.078572 c 0.005,-0.0955 0.01006,-0.191089 0.01509,-0.286589 -0.3254,-0.01321 -0.650799,-0.02659 -0.976108,-0.0398 -0.383077,-0.01572 -0.495915,-0.132783 -0.516848,0.266105 0.492501,0.01976 0.985182,0.04043 1.477683,0.06019" - inkscape:connector-curvature="0" - style="fill:#e3622d" /> - <path - id="path155" - d="m 12.449739,22.53594 c 0.005,-0.04016 0.01006,-0.0805 0.01509,-0.120655 l -1.478043,-0.06037 c -0.03971,0.22999 0.52682,0.147697 0.690867,0.155962 0.198007,0.009 0.642534,0.08355 0.771903,0.02426" - inkscape:connector-curvature="0" - style="fill:#e3622d" /> - <path - id="path157" - d="m 10.338238,23.787407 c 0.053,-0.351812 0.04231,-0.718897 0.05839,-1.073674 0.0027,-0.05831 -0.0256,-0.329981 0.01698,-0.373913 0.05462,-0.05642 0.4651,0.01222 0.553413,0.01446 0.335281,0.0088 0.670832,0.03342 1.005844,0.05031 0.3758,0.01905 0.512176,-0.09218 0.495017,0.291709 -0.01446,0.320728 0.04995,0.770375 -0.04842,1.076189 -0.06621,0.206003 -0.06262,0.166922 -0.30258,0.157489 -0.259277,-0.01024 -1.709828,0.07493 -1.763373,-0.142485" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.11679157;stroke-linecap:square;stroke-miterlimit:10" /> - <path - id="path159" - d="m 10.745571,21.193736 c -0.364929,-0.57722 -0.729858,-1.15435 -1.0947865,-1.73148 -0.043572,-0.06891 -0.5656305,-0.827154 -0.2775147,-0.666431 0.1449114,0.08086 0.2969201,0.469592 0.3831662,0.605968 0.2371767,0.375171 0.474353,0.750431 0.71153,1.125512 0.07879,0.124607 0.382717,0.45369 0.383166,0.605968 3.6e-4,0.106011 -0.04753,0.101519 -0.105561,0.0593" - inkscape:connector-curvature="0" /> - <path - id="path161" - d="m 11.213007,21.148816 0.826614,-1.876661 c 0.0318,-0.07205 0.359,-0.911334 0.410029,-0.626722 0.02084,0.116432 -0.219029,0.487111 -0.266195,0.596446 -0.176266,0.408052 -0.352531,0.816103 -0.528797,1.224245 -0.10637,0.246251 -0.21274,0.492411 -0.31911,0.738752 -0.05336,0.122182 -0.122002,-0.03773 -0.122901,-0.0557" - inkscape:connector-curvature="0" /> - <path - id="path163" - d="m 12.223343,0.08096401 c 1.386855,-0.15182904 2.026244,1.51182199 2.145731,2.64820399 0.07708,0.7330018 0.127303,1.448485 0.150931,2.1850804 0.0094,0.2977287 0.05552,0.7045227 -0.01923,0.972784 -0.682332,-0.4571941 -1.964075,-0.4786658 -2.714506,-0.1508408 -0.112928,-0.7524971 0.008,-1.6234927 0.06109,-2.3848839 0.03962,-0.5697632 0.08292,-1.1370109 0.153896,-1.7038992 0.05857,-0.4683342 0.289463,-1.11482047 0.222083,-1.56644449" - inkscape:connector-curvature="0" - style="fill:#ffa300" /> - <path - id="path165" - d="m 12.208071,5.0272667 c 0.03611,-1.6447847 0.120565,-3.3237982 0.407063,-4.94630269 1.317679,0.20681092 1.609298,1.85312289 1.785833,2.93308559 0.103765,0.6345375 0.105472,1.2895586 0.121643,1.9305646 0.0073,0.2888346 0.05004,0.9883154 -0.02219,1.2475029 C 13.946648,5.732677 12.871447,5.5062918 12.208071,5.615447 c 8.98e-4,-0.1960301 8.98e-4,-0.3921501 8.98e-4,-0.5881803" - inkscape:connector-curvature="0" - style="fill:#ffd900" - sodipodi:nodetypes="ccccccc" /> - <path - id="path167" - d="m 9.4486453,19.187616 c 0.2163339,0.214986 0.5879107,0.273741 0.8741397,0.339863 0.215346,0.04986 0.889054,0.292428 0.769567,-0.05336 -0.138263,-0.400146 -1.6232233,-0.844493 -1.6437067,-0.271405" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.24256711;stroke-linecap:square;stroke-miterlimit:10" /> - <path - id="path169" - d="m 9.4486453,19.187616 c 0.2163339,0.214986 0.5879107,0.273741 0.8741397,0.339863 0.215346,0.04986 0.889054,0.292428 0.769567,-0.05336 -0.15695,-0.45369 -1.7058758,-0.743872 -1.6437067,-0.286588" - inkscape:connector-curvature="0" - style="fill:#ffd900;fill-opacity:1" /> - <path - id="path171" - d="M 9.4486453,19.187616 C 8.1713947,17.378514 6.9305292,15.552074 5.7454541,13.681252 4.6543513,11.959026 3.4336099,9.8927137 3.173524,7.8417639 2.9011301,5.6940568 3.6462604,3.3929933 5.4516784,2.1123288 5.8671868,1.8175648 6.355735,1.661154 6.781575,1.3901077 7.1496481,1.1558058 7.5308378,0.89697773 7.970603,0.81980546 8.1216235,0.79330275 8.1626802,0.81890706 8.3023809,0.75952304 8.4077629,0.71469304 8.4987705,0.64075499 8.6039727,0.59358917 8.7947922,0.50815164 8.991541,0.47032914 9.192153,0.4201986 9.3066088,0.3916296 9.4116313,0.397559 9.5238411,0.397559 c 0.2038462,0 0.2822762,-0.0309947 0.4825289,-0.10556161 0.304916,-0.11346751 0.604531,-0.12065468 0.919958,-0.12065468 0.194683,0 0.238165,0.047615 0.422247,0 0.230438,-0.0595637 0.456385,-0.16207077 0.701198,-0.11310815 0.382627,0.0765434 0.729858,-0.03467811 1.094517,0.19297561 0.178961,0.11185039 0.612257,5.3904e-4 0.850961,0.0483338 0.178152,0.0355765 0.327915,0.0849883 0.490076,0.16584403 0.197647,0.098644 0.252359,0.082922 0.452342,0.0980151 0.332856,0.0250653 0.637054,0.14527074 0.935052,0.29404524 0.109245,0.0545327 0.195671,0.1256857 0.294045,0.19603016 0.100531,0.071782 0.224779,0.017339 0.339235,0.060372 0.221365,0.083192 0.415957,0.1710547 0.618276,0.2940452 0.209147,0.127213 0.39772,0.2683511 0.58818,0.4222465 0.206362,0.1666526 0.434824,0.2346612 0.658885,0.376518 2.003873,1.2690752 2.541474,3.3674604 2.508323,5.6141709 -0.01518,1.0278556 -0.580274,2.1121306 -1.040613,3.0015439 -0.511187,0.987607 -1.102422,1.920143 -1.723484,2.841449 -1.047351,1.553777 -2.202599,3.042869 -3.381296,4.498811 -0.318212,0.392869 -0.630854,0.789152 -0.941879,1.18786 -0.15129,0.193874 -0.746837,0.04223 -0.96946,0.03046 -1.124792,-0.05929 -2.249675,-0.118679 -3.3744674,-0.178063" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.08983967;stroke-linecap:square;stroke-miterlimit:10" /> - <path - id="path173" - d="m 13.746126,19.384365 c -0.374991,0.480372 -0.749982,0.960565 -1.124883,1.440938 -0.05408,0.06918 -0.253707,0.418114 -0.348847,0.412005 -0.394756,-0.02533 -0.419731,1.79e-4 -0.589618,-0.339504 -0.457374,-0.914389 -1.179774,-1.656644 -2.2345819,-1.694556 0.345703,-0.79562 4.4110379,-0.576142 4.3129329,0.181206" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.08983967;stroke-linecap:square;stroke-miterlimit:10" /> - <path - id="path175" - d="m 13.746126,19.384365 c -0.652685,-0.478756 -1.868755,-0.407423 -2.63904,-0.407423 -0.445695,0 -0.905135,-0.01518 -1.3404083,0.09397 -0.2227125,0.05579 -0.2760773,0.192796 -0.4162272,-0.0079 C 9.1970942,18.84335 9.0436481,18.623692 8.8902917,18.404034 9.2367135,18.17099 9.7602093,18.161467 10.16305,18.142241 c 0.491333,-0.02336 0.98051,-0.03495 1.471933,-0.0097 0.809456,0.0415 2.037115,-0.0031 2.714506,0.512804 -0.19612,0.246341 -0.39206,0.492681 -0.58818,0.739111" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:0.08983967;stroke-linecap:square;stroke-miterlimit:10" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/80-1.svg b/htdocs/public/symbols/svgicons/80-1.svg deleted file mode 100755 index a105726389b838c625cd97e5dd7c33a6ded034d3..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/80-1.svg +++ /dev/null @@ -1,109 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="80-1.svg"> - <defs - id="defs17" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview15" - showgrid="false" - inkscape:zoom="7.9739945" - inkscape:cx="-14.367507" - inkscape:cy="40.658751" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata4277"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g4181" - transform="translate(-37.932203,-10.548736)"> - <path - style="fill:#8080ff;stroke:none;stroke-width:0.676;stroke-linejoin:round" - transform="matrix(0,1,-1,0,0,0)" - d="m 16.884163,-46.322253 a 1.9606265,2.0019734 0 0 1 -1.697952,-1.000987 1.9606265,2.0019734 0 0 1 0,-2.001973 1.9606265,2.0019734 0 0 1 1.697952,-1.000987 l 0,2.001974 z" - sodipodi:end="4.712389" - sodipodi:start="1.5707963" - sodipodi:ry="2.0019734" - sodipodi:rx="1.9606265" - sodipodi:cy="-48.324226" - sodipodi:cx="16.884163" - sodipodi:type="arc" - id="path4167-7" /> - <path - inkscape:connector-curvature="0" - id="path4754" - d="m 42.853023,17.344966 7.803541,-0.177353 4.96589,4.566846 -14.09958,-0.886767 z" - style="fill:#e6e6e6;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - <path - sodipodi:nodetypes="ccccscccccccccccccccccccsssccssscccccccccccccccccc" - style="fill:#000080;stroke:none;stroke-width:0.29631296;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" - id="path6-9" - d="m 61.657578,25.940864 c 0.150421,-0.941042 -0.0056,-1.022202 -0.62861,-2.409677 -0.169156,-0.376712 -0.616287,-0.606012 -0.977854,-0.803253 -1.889771,-1.030815 -3.888469,-1.669893 -4.195107,-1.676306 -0.960625,-0.956647 -2.533212,-2.755832 -4.643746,-4.195032 -0.393707,-0.268472 -1.782112,-0.310075 -1.782112,-0.310075 0,0 -3.645844,-0.436547 -6.362042,0.209562 -0.234324,0.0557 -0.397184,0.03627 -0.59369,0.139682 -0.03202,0.01684 -0.596585,0.600102 -0.628609,0.663531 -0.03129,0.06196 -0.216168,0.263797 -0.279365,0.349244 -0.419163,0.566572 -0.932968,1.12592 -1.292178,1.746148 -0.157723,0.272412 -0.230809,0.531651 -0.384166,0.803251 -0.147602,0.26144 -0.684623,0.462581 -0.768293,0.942896 -0.04018,0.23046 -0.302273,0.144318 -0.314325,0.488927 0.119711,0.03696 0.134159,0.0807 0.279364,0.104764 -0.209986,0.76358 -0.338852,2.126644 -0.349978,2.270266 2.72e-4,-7.8e-5 5.03e-4,-1.93e-4 7.73e-4,-2.71e-4 -0.0018,0.01742 -0.002,0.01645 -7.73e-4,2.71e-4 -0.657039,0.206279 -0.596045,1.386859 -0.657426,1.172931 0.079,0.314208 0.296632,0.723481 0.378796,1.061873 0.07037,0.28991 -0.163324,0.413561 -0.174642,0.698451 0.051,0.02978 0.100118,0.342638 0.139683,0.384126 0.166105,0.457213 1.465931,0.871007 1.465931,0.871007 l 0.12879,1.55e-4 c -0.110672,-0.328232 -0.170702,-0.679833 -0.170702,-1.045418 0,-1.806061 1.464079,-3.270137 3.270139,-3.270137 1.806059,0 3.270138,1.464076 3.270138,3.270137 0,0.368444 -0.061,0.722671 -0.173329,1.053144 l 6.640748,0.02127 C 52.69955,28.101333 52.61364,27.684603 52.61364,27.247669 c 0,-1.80602 1.464077,-3.270099 3.270099,-3.270099 1.806061,0 3.270139,1.464079 3.270139,3.270099 0,0.439794 -0.08704,0.859149 -0.244445,1.242156 l 0.26855,3.47e-4 c 0,0 2.007472,0.186616 2.270032,-0.454006 0.107774,-0.120252 0.147717,-0.728581 0.139682,-1.082578 0.0039,-0.364155 0.07741,-0.29389 0.174642,-0.523887 0.09445,-0.223353 -0.139567,-0.386754 -0.104761,-0.488837 z M 46.884042,20.714551 c -0.06405,0.04489 -0.0598,0.06873 -0.13972,0.104797 -0.254372,0.192759 -0.336931,-0.06988 -3.711137,-0.06988 0.05741,0.0819 -0.394981,0.01124 -0.03493,-0.76833 0.489429,-1.059633 1.235858,-2.023774 1.194756,-2.038685 0.947191,-0.282123 1.247996,-0.371795 2.69106,-0.334866 -0.02928,0.838173 -0.01734,1.779862 -3.4e-5,3.106962 z m 1.48938,0.232315 c -0.144666,-2.748801 -0.274419,-2.838845 0.03493,-3.282731 2.779918,0 1.837221,0.0094 1.837221,0.0094 1.271994,0.02608 3.482374,2.754031 4.141432,3.657518 -1.85567,-0.140054 -2.978847,-0.232781 -6.013583,-0.384207 z" /> - <path - sodipodi:open="true" - d="m 41.253151,27.397715 a 1.8473057,1.8473057 0 0 1 1.846862,-1.847306 1.8473057,1.8473057 0 0 1 1.847749,1.846419 1.8473057,1.8473057 0 0 1 -1.845976,1.848192 1.8473057,1.8473057 0 0 1 -1.848635,-1.845532" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - sodipodi:ry="1.8473057" - sodipodi:rx="1.8473057" - sodipodi:cy="27.397715" - sodipodi:cx="43.100456" - sodipodi:type="arc" - id="path3514-1-1" - style="fill:#666666;stroke:#000000;stroke-width:1.85782993;stroke-miterlimit:4;stroke-dasharray:none" /> - <path - sodipodi:open="true" - d="M 54.041179,27.276747 A 1.8473057,1.8473057 0 0 1 55.888042,25.429441 1.8473057,1.8473057 0 0 1 57.73579,27.27586 1.8473057,1.8473057 0 0 1 55.889815,29.124052 1.8473057,1.8473057 0 0 1 54.04118,27.27852" - sodipodi:end="3.1406327" - sodipodi:start="3.1415927" - sodipodi:ry="1.8473057" - sodipodi:rx="1.8473057" - sodipodi:cy="27.276747" - sodipodi:cx="55.888485" - sodipodi:type="arc" - id="path3514-1-1-1" - style="fill:#666666;stroke:#000000;stroke-width:1.85782993;stroke-miterlimit:4;stroke-dasharray:none" /> - <rect - transform="matrix(0.99920529,0.03985973,-0.02474987,0.99969368,0,0)" - y="20.746895" - x="42.759113" - height="0.5083794" - width="11.700276" - id="rect4170" - style="fill:#ffffff;stroke:none" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/80-2.svg b/htdocs/public/symbols/svgicons/80-2.svg deleted file mode 100755 index 9794f2ea2c5923af6a3991ff0f6358594c8ce185..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/80-2.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.0"> - <metadata id="metadata5438"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-104)"> - <g id="g2984" transform="matrix(0.1875,0,0,0.1875,0,104)"> - <rect rx="14.173" height="128" width="128" id="rect1869" fill="#204a87"/> - <path id="text1871" d="m 23.520836,11.511719 44.929687,0 c 13.359304,1.05e-4 23.601481,2.976664 30.726563,8.929687 7.171774,5.90634 10.757714,14.343832 10.757814,25.3125 -1e-4,11.015685 -3.58604,19.500051 -10.757814,25.453125 -7.125082,5.90629 -17.367259,8.859412 -30.726563,8.859375 l -17.859375,0 0,36.421874 -27.070312,0 0,-104.976561 m 27.070312,19.617187 0,29.320313 14.976563,0 c 5.249939,5.6e-5 9.304623,-1.265568 12.164062,-3.796875 2.859305,-2.578063 4.288991,-6.210872 4.289063,-10.898438 -7.2e-5,-4.687424 -1.429758,-8.296796 -4.289063,-10.828125 -2.859439,-2.531166 -6.914123,-3.796789 -12.164062,-3.796875 l -14.976563,0" inkscape:connector-curvature="0" fill="#ffffff"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/81-1.svg b/htdocs/public/symbols/svgicons/81-1.svg deleted file mode 100755 index eb2fee4dc16524e7147a485b45671e4c06cf2704..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/81-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3276"/> - <path sodipodi:type="arc" id="path3280" sodipodi:cx="11.898305" sodipodi:cy="12.101695" sodipodi:rx="12.20339" sodipodi:ry="12.20339" d="m 24.101695,12.101695 a 12.20339,12.20339 0 1 1 -24.40678018,0 12.20339,12.20339 0 1 1 24.40678018,0 z" transform="matrix(0.9201921,0,0,0.9201921,1.0512738,0.86411581)" fill="#ffffff" stroke="#000000" stroke-width="1.675"/> - <path sodipodi:type="arc" id="path3282" sodipodi:cx="12" sodipodi:cy="11.898305" sodipodi:rx="7.2203388" sodipodi:ry="7.2203388" d="m 19.220339,11.898305 a 7.2203388,7.2203388 0 1 1 -14.4406778,0 7.2203388,7.2203388 0 1 1 14.4406778,0 z" transform="matrix(0.93617311,0,0,0.93617311,0.76592268,0.86112686)" fill="#ffffff" stroke="#000000" stroke-width="1.582"/> - <path sodipodi:type="arc" id="path3284" sodipodi:cx="11.79661" sodipodi:cy="12" sodipodi:rx="1.2203389" sodipodi:ry="1.2203389" d="m 13.016949,12 a 1.2203389,1.2203389 0 1 1 -2.440678,0 1.2203389,1.2203389 0 1 1 2.440678,0 z" transform="translate(0.20339012,0)" stroke="#000000" stroke-width="1.582"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/81-2.svg b/htdocs/public/symbols/svgicons/81-2.svg deleted file mode 100755 index eb2fee4dc16524e7147a485b45671e4c06cf2704..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/81-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3276"/> - <path sodipodi:type="arc" id="path3280" sodipodi:cx="11.898305" sodipodi:cy="12.101695" sodipodi:rx="12.20339" sodipodi:ry="12.20339" d="m 24.101695,12.101695 a 12.20339,12.20339 0 1 1 -24.40678018,0 12.20339,12.20339 0 1 1 24.40678018,0 z" transform="matrix(0.9201921,0,0,0.9201921,1.0512738,0.86411581)" fill="#ffffff" stroke="#000000" stroke-width="1.675"/> - <path sodipodi:type="arc" id="path3282" sodipodi:cx="12" sodipodi:cy="11.898305" sodipodi:rx="7.2203388" sodipodi:ry="7.2203388" d="m 19.220339,11.898305 a 7.2203388,7.2203388 0 1 1 -14.4406778,0 7.2203388,7.2203388 0 1 1 14.4406778,0 z" transform="matrix(0.93617311,0,0,0.93617311,0.76592268,0.86112686)" fill="#ffffff" stroke="#000000" stroke-width="1.582"/> - <path sodipodi:type="arc" id="path3284" sodipodi:cx="11.79661" sodipodi:cy="12" sodipodi:rx="1.2203389" sodipodi:ry="1.2203389" d="m 13.016949,12 a 1.2203389,1.2203389 0 1 1 -2.440678,0 1.2203389,1.2203389 0 1 1 2.440678,0 z" transform="translate(0.20339012,0)" stroke="#000000" stroke-width="1.582"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/82-1.svg b/htdocs/public/symbols/svgicons/82-1.svg deleted file mode 100755 index 34dbf9317a9b4d2b8b63ff1a318e09bcec2cc536..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/82-1.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24 23.999999" enable-background="new 0 0 100 73.649"> - <metadata id="metadata4391"/> - <rect id="rect4140" width="23.04" height="23.04" x="0.479" y="0.479" rx="2.874" fill="#cccccc" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.958"/> - - - <text id="textoverlay"><tspan id="tspanoverlay" line-height="125%" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" x="12" y="12" fill="#000000" font-size="17.5" dy="6.5" dx="-10">R</tspan></text> - <text id="textoverlay"><tspan id="tspanoverlay" line-height="125%" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" x="12" y="12" fill="#000000" font-size="17.5" dy="6.5" dx="10">V</tspan></text> -</svg> diff --git a/htdocs/public/symbols/svgicons/82-1.svg~ b/htdocs/public/symbols/svgicons/82-1.svg~ deleted file mode 100755 index b8a0765090c3fe58f4b884d0f9b0a24e7d9bac56..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/82-1.svg~ +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24 23.999999" enable-background="new 0 0 100 73.649"> - <metadata id="metadata4391"/> - <rect id="rect4140" width="23.04" height="23.04" x="0.479" y="0.479" rx="2.874" fill="#cccccc" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.958"/> - - - <text id="textoverlay"><tspan id="tspanoverlay" line-height="125%" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" x="12" y="12" fill="#000000" font-size="17.5" dy="6.5" dx="-9">R</tspan></text> - <text id="textoverlay"><tspan id="tspanoverlay" line-height="125%" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" x="12" y="12" fill="#000000" font-size="17.5" dy="6.5" dx="9">V</tspan></text> -</svg> diff --git a/htdocs/public/symbols/svgicons/82-2.svg b/htdocs/public/symbols/svgicons/82-2.svg deleted file mode 100755 index 73707c3d113457c0655b7c1d7a58850c5bd2818f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/82-2.svg +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" viewBox="0 0 19.2 19.2" version="1.1"> - <metadata id="metadata28"/> - <defs id="defs4"> - <clipPath id="clip0"> - <rect width="613" height="614" id="rect7"/> - </clipPath> - </defs> - <path inkscape:connector-curvature="0" id="path14" d="M 1.604758,0.06952736 C 1.7625114,0.04362326 1.9223224,0.02981971 2.0821728,0.02733721 7.0737472,0.02752566 12.065322,0.02782914 17.0569,0.02718512 c 0.539089,0.0028419 1.115964,0.13308216 1.511562,0.5226716 0.415734,0.39426025 0.56682,0.98697028 0.580152,1.54299378 -5.66e-4,5.0698973 3.59e-4,10.1398085 -4.63e-4,15.2097015 -0.01933,0.51838 -0.17125,1.065417 -0.5621,1.428542 -0.389149,0.368051 -0.942727,0.487456 -1.463001,0.496275 -5.047611,-9.9e-5 -10.0952288,-6.6e-5 -15.1428377,-2.6e-5 -0.5493575,-0.0078 -1.13492185,-0.162009 -1.51608879,-0.581107 -0.37358438,-0.404708 -0.48755143,-0.974179 -0.4907003,-1.508866 -1.161e-5,-4.970902 -1.461e-5,-9.9418123 2.01e-6,-14.9127118 C -0.0233684,1.7214326 0.06661653,1.1952838 0.36990312,0.78057058 0.65440497,0.37793323 1.1263722,0.1454494 1.604758,0.06952736 z m 0,0" fill="none" stroke="#000000" stroke-width="0.003" stroke-miterlimit="10"/> - <path inkscape:connector-curvature="0" id="path16" d="M 1.633454,0.0422503 C 1.7914115,0.0163462 1.9514292,0.00254265 2.1114863,6.015e-5 7.1095164,2.486e-4 12.107547,5.5208e-4 17.10558,-9.194e-5 c 0.539787,0.0028419 1.117408,0.13308216 1.513517,0.5226716 C 19.035369,0.91683991 19.18665,1.5095499 19.2,2.0655734 c -5.67e-4,5.0698973 3.59e-4,10.1398086 -4.64e-4,15.2097016 -0.01936,0.51838 -0.171471,1.065417 -0.562827,1.428542 -0.389652,0.368051 -0.943946,0.487456 -1.464893,0.496275 -5.054139,-9.9e-5 -10.108285,-6.6e-5 -15.1624221,-2.6e-5 C 1.4593259,19.192266 0.87300425,19.038057 0.49134434,18.618959 0.1172768,18.214251 0.00316235,17.64478 9.4079049e-6,17.110093 c -1.162e-5,-4.970902 -1.463e-5,-9.9418124 2.0100001e-6,-14.9127119 C 0.00322195,1.6941555 0.09332326,1.1680067 0.3970021,0.75329352 0.6818719,0.35065617 1.1544495,0.11817234 1.633454,0.0422503 z m 0,0" fill="#000080"/> - <g id="g2994" transform="translate(1.0060726,0.07373165)"> - <path d="m 3.4728087,2.0010816 c 0.00138,-0.1708048 0.1709478,-0.3110212 0.3391428,-0.2812512 0.1545729,0.013421 0.2646869,0.1615458 0.2629,0.3112065 0.00107,1.1646728 -1.653e-4,2.3293977 5.952e-4,3.4940983 0.1625127,-1.985e-4 0.3250499,2.313e-4 0.4876223,-2.976e-4 1.323e-4,-1.1852932 -0.00133,-2.3706502 6.976e-4,-3.5558917 0.011179,-0.1979393 0.2603406,-0.3076961 0.4252605,-0.2117066 0.1143448,0.052513 0.154541,0.1864385 0.1521275,0.3033371 8.728e-4,1.1548519 -1.322e-4,2.3097353 4.86e-4,3.4646067 0.165158,-1.653e-4 0.3303424,-1.653e-4 0.4955685,3.6e-6 3.669e-4,-1.1667829 9.91e-5,-2.3335686 9.91e-5,-3.5003379 -0.010748,-0.1518673 0.1086753,-0.3020027 0.2646061,-0.3078944 0.1575032,-0.01787 0.2981664,0.1214766 0.2968879,0.2766415 0.00152,1.1771637 -6.61e-5,2.3543938 7.638e-4,3.5315901 0.1679247,-1.652e-4 0.3358812,-9.91e-5 0.5038824,-6.6e-5 5.388e-4,-1.1766086 -3.307e-4,-2.353235 4.067e-4,-3.5298205 -0.00646,-0.1540869 0.1400726,-0.2841741 0.2911416,-0.2736707 0.1641936,-0.011239 0.3002875,0.1412094 0.2942986,0.3008784 0.00258,1.5892636 3.305e-4,3.178635 0.00112,4.767939 0.00363,0.5639413 -0.4984761,1.0809111 -1.0662497,1.0758746 -1.653e-4,2.8711612 2.975e-4,5.7423332 -2.316e-4,8.6134912 -0.00631,0.267496 -0.1202482,0.544438 -0.3442624,0.701187 -0.249048,0.185615 -0.6036462,0.205261 -0.8768842,0.06146 C 4.7235476,17.100228 4.5631771,16.7859 4.5624825,16.478971 4.5633587,13.608156 4.5624164,10.737345 4.5629487,7.8665346 4.2845706,7.8656124 4.0032698,7.7635043 3.8046501,7.5654307 3.5846567,7.3591136 3.4706267,7.0554499 3.4714678,6.7565577 c 0.00149,-1.5851483 -0.00116,-3.1703581 0.00132,-4.7554619 z m 0,0" id="path18" inkscape:connector-curvature="0" fill="none" stroke="#ffffff" stroke-width="0.003" stroke-miterlimit="10"/> - <path d="m 3.4728087,2.0010816 c 0.00138,-0.1708048 0.1709478,-0.3110212 0.3391428,-0.2812512 0.1545729,0.013421 0.2646869,0.1615458 0.2629,0.3112065 0.00107,1.1646728 -1.653e-4,2.3293977 5.952e-4,3.4940983 0.1625127,-1.985e-4 0.3250499,2.313e-4 0.4876223,-2.976e-4 1.323e-4,-1.1852932 -0.00133,-2.3706502 6.976e-4,-3.5558917 0.011179,-0.1979393 0.2603406,-0.3076961 0.4252605,-0.2117066 0.1143448,0.052513 0.154541,0.1864385 0.1521275,0.3033371 8.728e-4,1.1548519 -1.322e-4,2.3097353 4.86e-4,3.4646067 0.165158,-1.653e-4 0.3303424,-1.653e-4 0.4955685,3.6e-6 3.669e-4,-1.1667829 9.91e-5,-2.3335686 9.91e-5,-3.5003379 -0.010748,-0.1518673 0.1086753,-0.3020027 0.2646061,-0.3078944 0.1575032,-0.01787 0.2981664,0.1214766 0.2968879,0.2766415 0.00152,1.1771637 -6.61e-5,2.3543938 7.638e-4,3.5315901 0.1679247,-1.652e-4 0.3358812,-9.91e-5 0.5038824,-6.6e-5 5.388e-4,-1.1766086 -3.307e-4,-2.353235 4.067e-4,-3.5298205 -0.00646,-0.1540869 0.1400726,-0.2841741 0.2911416,-0.2736707 0.1641936,-0.011239 0.3002875,0.1412094 0.2942986,0.3008784 0.00258,1.5892636 3.305e-4,3.178635 0.00112,4.767939 0.00363,0.5639413 -0.4984761,1.0809111 -1.0662497,1.0758746 -1.653e-4,2.8711612 2.975e-4,5.7423332 -2.316e-4,8.6134912 -0.00631,0.267496 -0.1202482,0.544438 -0.3442624,0.701187 -0.249048,0.185615 -0.6036462,0.205261 -0.8768842,0.06146 C 4.7235476,17.100228 4.5631771,16.7859 4.5624825,16.478971 4.5633587,13.608156 4.5624164,10.737345 4.5629487,7.8665346 4.2845706,7.8656124 4.0032698,7.7635043 3.8046501,7.5654307 3.5846567,7.3591136 3.4706267,7.0554499 3.4714678,6.7565577 c 0.00149,-1.5851483 -0.00116,-3.1703581 0.00132,-4.7554619 z m 0,0" id="path20" inkscape:connector-curvature="0" fill="#ffffff"/> - <path d="m 11.578286,2.0708961 c 0.38596,-0.3710011 1.014634,-0.4386066 1.478693,-0.1777347 0.288585,0.1579719 0.4998,0.4403753 0.589571,0.755071 0.06485,0.2206266 0.07062,0.4527967 0.06977,0.6811213 -5.62e-4,4.3532356 4.04e-4,8.7064793 -4.8e-4,13.0597113 0.0012,0.256899 -0.06735,0.530945 -0.263201,0.70989 -0.324777,0.313029 -0.906566,0.283913 -1.198022,-0.06072 -0.139638,-0.159969 -0.207469,-0.373875 -0.208181,-0.584304 2.31e-4,-1.765608 1.66e-4,-3.53121 3.3e-5,-5.296808 -0.294772,-1.65e-4 -0.589506,6.7e-5 -0.88422,-9.8e-5 4.6e-4,-2.676446 -10e-4,-5.3529103 7.43e-4,-8.0293333 0.0029,-0.3860244 0.125432,-0.7888934 0.415297,-1.0567865 z m 0,0" id="path22" inkscape:connector-curvature="0" fill="none" stroke="#ffffff" stroke-width="0.003" stroke-miterlimit="10"/> - <path d="m 11.578286,2.0708961 c 0.38596,-0.3710011 1.014634,-0.4386066 1.478693,-0.1777347 0.288585,0.1579719 0.4998,0.4403753 0.589571,0.755071 0.06485,0.2206266 0.07062,0.4527967 0.06977,0.6811213 -5.62e-4,4.3532356 4.04e-4,8.7064793 -4.8e-4,13.0597113 0.0012,0.256899 -0.06735,0.530945 -0.263201,0.70989 -0.324777,0.313029 -0.906566,0.283913 -1.198022,-0.06072 -0.139638,-0.159969 -0.207469,-0.373875 -0.208181,-0.584304 2.31e-4,-1.765608 1.66e-4,-3.53121 3.3e-5,-5.296808 -0.294772,-1.65e-4 -0.589506,6.7e-5 -0.88422,-9.8e-5 4.6e-4,-2.676446 -10e-4,-5.3529103 7.43e-4,-8.0293333 0.0029,-0.3860244 0.125432,-0.7888934 0.415297,-1.0567865 z m 0,0" id="path24" inkscape:connector-curvature="0" fill="#ffffff"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/83-1.svg b/htdocs/public/symbols/svgicons/83-1.svg deleted file mode 100755 index 9a5d0bdf63d8791cfb14acaba0c354edea818230..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/83-1.svg +++ /dev/null @@ -1,115 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 23.999999 24" version="1.1" width="24" height="24"> - <defs id="defs5222"> - <clipPath id="clipPath854"> - <path id="path856" d="m 220.41,353.78 c 0.127,8.395 -2.341,8.539 -2.341,8.539 l -2.786,0 c 0,0 -2.313,-0.227 -2.187,-8.622 l 7.314,0.083"/> - </clipPath> - <clipPath id="clipPath830"> - <path id="path832" d="m 72.5,499.91 227.51,0 0,-336.13 -227.51,0 0,336.13 z"/> - </clipPath> - <clipPath id="clipPath836"> - <path id="path838" d="M 0,792 612,792 612,0 0,0 0,792 Z"/> - </clipPath> - <clipPath id="clipPath842"> - <path id="path844" d="m 0.06,792 612,0 0,-792 -612,0 0,792 z"/> - </clipPath> - <clipPath id="clipPath820"> - <path id="path822" d="m 211.29,353.78 c 0.127,8.395 -2.341,8.539 -2.341,8.539 l -2.786,0 c 0,0 -2.313,-0.227 -2.187,-8.622 l 7.314,0.083"/> - </clipPath> - <clipPath id="clipPath786"> - <path id="path788" d="m 212.4,349.75 c 0,0 1.186,6.305 1.334,13.756 0.148,7.451 -1.104,12.421 -1.104,12.421 l -1.037,0 c 0,0 -1.186,-4.97 -1.038,-12.421 0.148,-7.451 1.845,-13.756 1.845,-13.756"/> - </clipPath> - <clipPath id="clipPath750"> - <path id="path752" d="m 204.1,360.99 15.426,-0.067 -0.162,48.24 c 0,0 0.485,8.94 -1.132,23.557 -0.855,7.722 -4.009,13.491 -6.498,13.7 -2.49,-0.209 -5.482,-5.978 -6.337,-13.7 -1.617,-14.617 -1.132,-23.557 -1.132,-23.557 l -0.17,-48.17"/> - </clipPath> - <clipPath id="clipPath708"> - <path id="path710" d="m 204.69,425.61 c 0,0 -2.668,-21.73 -9.714,-32.63 -7.046,-10.9 -14.484,-12.325 -15.87,-21.872 -0.297,-2.043 -0.445,-4.157 -0.445,-4.157 l 25.584,-6.117 1.818,63.886 -1.373,0.89"/> - </clipPath> - <clipPath id="clipPath672"> - <path id="path674" d="m 186.9,347.49 13.459,0 -1.45,5.415 c 0,0 -0.016,91.334 -0.016,92.532 0,1.198 0,2.935 -0.31,3.962 -0.31,1.027 -2.967,9.407 -3.367,10.605 -0.399,1.198 -0.712,1.565 -1.739,1.565 -1.027,0 -1.337,-0.367 -1.736,-1.565 -0.4,-1.198 -3.367,-10.605 -3.367,-10.605 -0.31,-1.027 -0.31,-2.764 -0.31,-3.962 l 0,-92.532 -1.164,-5.415"/> - </clipPath> - <clipPath id="clipPath638"> - <path id="path640" d="m 199.47,342.41 c -0.748,9.305 -3.562,9.457 -3.562,9.457 l -4.5,0 c 0,0 -2.612,-0.295 -3.322,-9.457 l 11.384,0"/> - </clipPath> - <clipPath id="clipPath592"> - <path id="path594" d="m 218.78,425.61 c 0,0 2.669,-21.73 9.714,-32.63 7.046,-10.9 14.485,-12.325 15.87,-21.872 0.297,-2.043 0.445,-4.157 0.445,-4.157 l -25.584,-6.117 -1.818,63.886 1.373,0.89"/> - </clipPath> - <clipPath id="clipPath556"> - <path id="path558" d="m 236.03,347.49 -13.459,0 1.449,5.415 c 0,0 0.017,91.334 0.017,92.532 0,1.198 0,2.935 0.31,3.962 0.31,1.027 2.967,9.407 3.366,10.605 0.4,1.198 0.712,1.565 1.739,1.565 1.027,0 1.338,-0.367 1.737,-1.565 0.399,-1.198 3.366,-10.605 3.366,-10.605 0.31,-1.027 0.31,-2.764 0.31,-3.962 l 0,-92.532 1.165,-5.415"/> - </clipPath> - <clipPath id="clipPath522"> - <path id="path524" d="m 223.46,342.41 c 0.748,9.305 3.562,9.457 3.562,9.457 l 4.5,0 c 0,0 2.612,-0.295 3.322,-9.457 l -11.384,0"/> - </clipPath> - </defs> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 13.743669,5.2157578 c 0,0 0.660591,5.3782792 2.404262,8.0760822 1.743919,2.697802 3.585107,3.050497 3.927901,5.413425 0.07351,0.505652 0.11014,1.028877 0.11014,1.028877 L 13.853809,21.248129 13.403845,5.4360371 13.743669,5.2157578 Z" id="path622" fill="#ffffff" stroke="#231f20" stroke-width="0.43"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 17.12211,20.365527 0,-1.66249" id="path628" fill="none" stroke="#231f20" stroke-width="0.23"/> - <g clip-path="url(#clipPath836)" id="g726" transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" fill="#ffffff" stroke="#1a1a1a" stroke-width="0.808" stroke-miterlimit="3.864"> - <g clip-path="url(#clipPath842)" id="g732"> - <path inkscape:connector-curvature="0" d="m 204.69,425.61 c 0,0 -2.668,-21.73 -9.714,-32.63 -7.046,-10.9 -14.484,-12.325 -15.87,-21.872 -0.297,-2.043 -0.445,-4.157 -0.445,-4.157 l 25.584,-6.117 1.818,63.886 -1.373,0.89 z" id="path738" stroke-width="1.616"/> - <path inkscape:connector-curvature="0" d="m 204.1,360.99 15.426,-0.067 -0.162,48.24 c 0,0 0.485,8.94 -1.132,23.557 -0.855,7.722 -4.009,13.491 -6.498,13.7 -2.49,-0.209 -5.482,-5.978 -6.337,-13.7 -1.617,-14.617 -1.132,-23.557 -1.132,-23.557 l -0.17,-48.17" id="path744"/> - </g> - </g> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g588"> - <g clip-path="url(#clipPath592)" id="g590"> - <path inkscape:connector-curvature="0" d="m 220.56,359.02 25.14,4.19 0,13.162 -15.722,19.251 -4.347,0 c 1.867,-3.637 4.205,-7.064 7.168,-10.21 5.984,-6.354 9.706,-7.58 10.613,-17.446 l -22.923,-5.481 0.071,-3.466" id="path596" fill="#231f20"/> - <path inkscape:connector-curvature="0" d="m 219.52,372.33 26.029,0 0,-2.224 -25.881,-2.263 -0.148,4.487" id="path598" fill="#231f20"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 228.64,395.69 -11.235,0" id="path600" fill="none" stroke="#231f20" stroke-width="0.667"/> - </g> - </g> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 17.12211,18.915149 0,-0.600942" id="path630" fill="none" stroke="#ffffff" stroke-width="0.13"/> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g704" fill="#1a1a1a"> - <g clip-path="url(#clipPath708)" id="g706"> - <path inkscape:connector-curvature="0" d="m 202.91,359.02 -25.139,4.19 0,13.162 15.722,19.251 4.346,0 c -1.866,-3.637 -4.205,-7.064 -7.168,-10.21 -5.983,-6.354 -9.705,-7.58 -10.613,-17.446 l 22.923,-5.481 -0.071,-3.466" id="path712"/> - <path inkscape:connector-curvature="0" d="m 203.95,372.33 -26.029,0 0,-2.224 25.881,-2.263 0.148,4.487" id="path714"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 194.83,395.69 11.235,0" id="path716" stroke="#231f20" stroke-width="0.667"/> - </g> - </g> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g746" fill="#1a1a1a" stroke="#1a1a1a"> - <g clip-path="url(#clipPath750)" id="g748"> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 205.62,445.08 c 0,1.905 2.681,3.449 5.988,3.449 3.308,0 5.989,-1.544 5.989,-3.449 0,-1.905 -2.681,-3.449 -5.989,-3.449 -3.307,0 -5.988,1.544 -5.988,3.449 z" id="path754" stroke-width="0.262"/> - </g> - </g> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g756" stroke="#1a1a1a" stroke-width="0.808" stroke-miterlimit="3.864"> - <g clip-path="url(#clipPath830)" id="g758"> - <g clip-path="url(#clipPath836)" id="g764"> - <g clip-path="url(#clipPath842)" id="g770"> - <path inkscape:connector-curvature="0" d="m 204.1,360.99 15.426,-0.067 -0.162,48.24 c 0,0 0.485,8.94 -1.132,23.557 -0.855,7.722 -4.009,13.491 -6.498,13.7 -2.49,-0.209 -5.482,-5.978 -6.337,-13.7 -1.617,-14.617 -1.132,-23.557 -1.132,-23.557 l -0.17,-48.17 z" id="path776" fill="none" stroke-width="1.616"/> - <path inkscape:connector-curvature="0" d="m 214.18775,428.16727 c -0.57209,1.53782 -1.46074,2.29766 -2.40346,2.26928 -1.11099,-0.0335 -2.03373,-0.68546 -2.50309,-2.26928 l -2.26873,-0.007 c 0.558,2.594 2.37664,4.40534 4.76582,4.40991 2.37171,0.005 4.13318,-1.87291 4.67918,-4.40991 z" id="path778" sodipodi:nodetypes="csccscc" fill="#918f90" stroke-width="1.212"/> - <path inkscape:connector-curvature="0" d="m 212.4,349.75 c 0,0 1.186,6.305 1.334,13.756 0.148,7.451 -1.104,12.421 -1.104,12.421 l -1.037,0 c 0,0 -1.186,-4.97 -1.038,-12.421 0.148,-7.451 1.845,-13.756 1.845,-13.756" id="path780" fill="#ffffff"/> - </g> - </g> - </g> - </g> - <g clip-path="url(#clipPath836)" id="g800" transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)"> - <g clip-path="url(#clipPath842)" id="g806"> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 212.4,349.75 c 0,0 1.186,6.305 1.334,13.756 0.148,7.451 -1.104,12.421 -1.104,12.421 l -1.037,0 c 0,0 -1.186,-4.97 -1.038,-12.421 0.148,-7.451 1.845,-13.756 1.845,-13.756 z" id="path812" fill="none" stroke="#231f20" stroke-width="1.071"/> - <path inkscape:connector-curvature="0" d="m 211.29,353.78 c 0.127,8.395 -2.341,8.539 -2.341,8.539 l -2.786,0 c 0,0 -2.313,-0.227 -2.187,-8.622 l 7.314,0.083" id="path814" fill="#231f20"/> - </g> - </g> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g816"> - <g clip-path="url(#clipPath820)" id="g818"> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 202.62,354.84 9.121,0 m -9.121,1.571 9.121,0 m -9.121,1.572 9.121,0 m -9.121,1.571 9.121,0" id="path824" fill="none" stroke="#7b7979" stroke-width="0.524"/> - </g> - </g> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g826"> - <g clip-path="url(#clipPath830)" id="g828"> - <g clip-path="url(#clipPath836)" id="g834"> - <g clip-path="url(#clipPath842)" id="g840"> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 211.29,353.78 c 0.127,8.395 -2.341,8.539 -2.341,8.539 l -2.786,0 c 0,0 -2.313,-0.227 -2.187,-8.622 l 7.314,0.083 z" id="path846" fill="none" stroke="#231f20" stroke-width="0.524"/> - <path inkscape:connector-curvature="0" d="m 220.41,353.78 c 0.127,8.395 -2.341,8.539 -2.341,8.539 l -2.786,0 c 0,0 -2.313,-0.227 -2.187,-8.622 l 7.314,0.083" id="path848" fill="#231f20"/> - </g> - </g> - </g> - </g> - <g transform="matrix(0.24750481,0,0,-0.24750481,-40.405433,110.55628)" id="g850"> - <g clip-path="url(#clipPath854)" id="g852"> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 211.74,354.84 9.122,0 m -9.122,1.571 9.122,0 m -9.122,1.572 9.122,0 m -9.122,1.571 9.122,0" id="path858" fill="none" stroke="#7b7979" stroke-width="0.524"/> - </g> - </g> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 14.147661,22.993493 c 0.03143,-2.077861 -0.579418,-2.113433 -0.579418,-2.113433 l -0.689549,0 c 0,0 -0.572482,0.05618 -0.5413,2.134027 l 1.81023,-0.02054 z" id="path880" fill="none" stroke="#231f20" stroke-width="0.13"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 11.789626,21.24673 c 0.03663,-3.707891 -0.67842,-3.771733 -0.67842,-3.771733 l -0.807124,0 c 0,0 -0.6702477,0.10049 -0.6336181,3.808428 l 2.1191431,-0.03663 z" id="path882" fill="#ffffff" stroke="#231f20" stroke-width="0.33"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 14.569842,21.24673 c 0.03688,-3.707891 -0.678419,-3.771733 -0.678419,-3.771733 l -0.807124,0 c 0,0 -0.670005,0.10049 -0.633366,3.808428 l 2.118862,-0.03663 z" id="path884" fill="#ffffff" stroke="#231f20" stroke-width="0.33"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 6.743111,20.36586 0,-1.662513" id="path886" fill="#1a1a1a" stroke="#1a1a1a" stroke-width="0.23"/> - <path inkscape:connector-curvature="0" stroke-miterlimit="3.864" d="m 6.743111,18.915842 0,-0.600949" id="path888" fill="none" stroke="#ffffff" stroke-width="0.13"/> - <metadata id="metadata183"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/83-2.svg b/htdocs/public/symbols/svgicons/83-2.svg deleted file mode 100755 index 8cd3f1f16c6456103c0d2465890d566290acabf3..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/83-2.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3001"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3013" transform="translate(-528,648.00002)"> - <g transform="matrix(0.05291658,0,0,0.05291658,518.73976,375.22261)" id="layer1-1"> - <path inkscape:connector-curvature="0" d="m 287.44,286.58 c 8.8583,-0.0756 18.161,1.2414 27.843,4.3505 23.639,7.5916 49.437,23.77 72.544,46.876 22.316,22.316 38.195,47.044 46.114,70.042 3.5848,10.411 5.3257,20.665 5.3294,30.127 34.464,-34.381 74.719,-74.501 74.719,-74.501 8.8046,-8.8046 10.662,-25.016 4.0244,-45.788 -6.6374,-20.772 -21.622,-44.897 -43.287,-66.562 -21.664,-21.665 -45.789,-36.649 -66.561,-43.287 -20.772,-6.6373 -36.984,-4.7803 -45.788,4.0241 a 7.3368,7.3368 0 0 1 -0.32655,0.32655 c 1.5e-4,-3.8e-4 -0.15572,-0.0378 -0.32656,0.10658 a 7.3368,7.3368 0 0 1 -0.10733,0.10809 c -0.0755,0.0755 -0.23434,0.23735 -0.3258,0.32655 a 7.3368,7.3368 0 0 1 -0.10734,0.10734 c -0.0227,0.0227 -0.0755,0.0907 -0.10734,0.10734 -0.27741,0.27062 -0.46261,0.46942 -0.87004,0.87005 -1.3246,1.3035 -3.2358,3.2497 -5.7641,5.7642 -5.0603,5.0256 -12.407,12.42 -21.317,21.317 -11.973,11.959 -29.332,29.327 -45.679,45.68 z m -40.639,-122.78 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m -115.4,-38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 233,156.07 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m -115.4,-38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m 38.467,38.467 -33.338,-33.338 33.338,-33.338 33.338,33.338 z m -26.89,-249.86 c 14.671,-18.593 23.601,-32.737 23.601,-32.737 6.0975,-9.8498 8.7897,-20.878 6.5255,-33.498 -2.2639,-12.621 -9.7854,-27.187 -25.667,-43.069 -15.989,-15.989 -29.977,-23.759 -42.199,-26.103 -12.222,-2.3439 -23.154,0.29026 -34.586,6.9608 a 8.7573,8.7573 0 0 1 -0.10733,0.10734 c -0.90581,0.51174 -0.23131,0.0975 -0.4354,0.21694 -0.20486,0.11566 -0.55106,0.2948 -0.97959,0.54275 -0.85462,0.49889 -2.117,1.2198 -3.8063,2.284 -3.3786,2.1287 -8.3084,5.4327 -14.574,10.006 -3.793,2.7685 -8.1932,6.2168 -12.943,10.115 20.824,8.7749 42.483,23.558 62.211,43.287 19.646,19.646 34.196,41.165 42.96,61.885 z m -243.08,138.23 c 15.825,15.825 27.262,20.215 35.673,20.012 8.2898,-0.19956 16.009,-4.9974 24.362,-13.269 0.18141,-0.20258 0.17082,-0.17235 0.32654,-0.32579 0.67351,-0.65991 1.1912,-1.0953 1.5228,-1.3049 0.81396,-0.51552 1.1331,-0.63722 1.4148,-0.75877 0.5639,-0.24415 0.87103,-0.43313 1.196,-0.54349 0.65234,-0.22073 1.3406,-0.40517 2.1753,-0.65311 1.67,-0.49361 3.9356,-1.1132 6.6343,-1.8491 5.3972,-1.4715 12.536,-3.2413 19.686,-5.1116 12.5,-3.2709 22.067,-5.7697 25.015,-6.5254 5.2003,-6.2337 6.9486,-16.641 2.8278,-30.888 -4.3795,-15.141 -14.954,-33.009 -30.779,-48.834 -15.825,-15.825 -33.693,-26.4 -48.834,-30.779 -14.246,-4.121 -24.654,-2.3723 -30.888,2.8278 -0.39307,1.4287 -0.92984,3.0175 -1.5226,5.2205 -1.4259,5.3024 -3.3261,12.432 -5.2202,19.577 -3.793,14.289 -7.613,28.713 -7.613,28.713 a 9.2981,9.2981 0 0 1 -2.3919,4.1331 c -8.4974,8.4974 -13.392,16.277 -13.595,24.689 -0.20259,8.4119 4.1869,19.848 20.012,35.673 z" id="path7145"/> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/84-1.svg b/htdocs/public/symbols/svgicons/84-1.svg deleted file mode 100755 index bd78e41136201b837d6780843f7a956b62448b67..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/84-1.svg +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24.000001 24"> - <metadata id="metadata51"/> - <defs id="defs86"> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_9_" id="linearGradient3825" gradientUnits="userSpaceOnUse" x1="0.125" x2="30.13" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_10_" id="linearGradient3827" gradientUnits="userSpaceOnUse" x1="1.029" x2="23.18" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_11_" id="linearGradient3829" gradientUnits="userSpaceOnUse" x1="24.11" x2="29.09" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_12_" id="linearGradient3831" gradientUnits="userSpaceOnUse" x1="2.099" x2="22.11" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_13_" id="linearGradient3833" gradientUnits="userSpaceOnUse" x1="25.2" y1="6.891" x2="28" y2="9.691" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_14_" id="linearGradient3835" gradientUnits="userSpaceOnUse" x1="25.2" y1="2.501" x2="28" y2="5.302" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_15_" id="linearGradient3837" gradientUnits="userSpaceOnUse" y1="11.9" x2="0" y2="19.02" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient x1="0.125" x2="30.13" id="XMLID_9_" gradientUnits="userSpaceOnUse"> - <stop id="stop4" stop-color="#696969"/> - <stop offset="0.298" id="stop6" stop-color="#aaadb6"/> - <stop offset="0.438" id="stop8" stop-color="#999a9e"/> - <stop offset="0.562" id="stop10" stop-color="#adb1ba"/> - <stop offset="1" id="stop12" stop-color="#828387"/> - </linearGradient> - <linearGradient x1="1.029" x2="23.18" id="XMLID_10_" gradientUnits="userSpaceOnUse"> - <stop id="stop17" stop-color="#aaadb6"/> - <stop offset="0.079" id="stop19" stop-color="#696969"/> - <stop offset="0.438" id="stop21" stop-color="#828387"/> - <stop offset="0.933" id="stop23" stop-color="#828387"/> - <stop offset="1" id="stop25" stop-color="#adb1ba"/> - </linearGradient> - <linearGradient x1="24.11" x2="29.09" id="XMLID_11_" gradientUnits="userSpaceOnUse"> - <stop id="stop32" stop-color="#383838"/> - <stop offset="0.562" id="stop34" stop-color="#616369"/> - <stop offset="1" id="stop36" stop-color="#525252"/> - </linearGradient> - <linearGradient x1="2.099" x2="22.11" id="XMLID_12_" gradientUnits="userSpaceOnUse"> - <stop id="stop41" stop-color="#8c8c8c"/> - <stop offset="1" id="stop43" stop-color="#5e5e5e"/> - </linearGradient> - <linearGradient x1="25.2" y1="6.891" x2="28" y2="9.691" id="XMLID_13_" gradientUnits="userSpaceOnUse"> - <stop offset="0.264" id="stop48" stop-color="#9698a1"/> - <stop offset="0.36" id="stop50" stop-color="#787a82"/> - <stop offset="0.725" id="stop52" stop-color="#abaeb8"/> - </linearGradient> - <linearGradient x1="25.2" y1="2.501" x2="28" y2="5.302" id="XMLID_14_" gradientUnits="userSpaceOnUse"> - <stop offset="0.264" id="stop57" stop-color="#9698a1"/> - <stop offset="0.36" id="stop59" stop-color="#787a82"/> - <stop offset="0.725" id="stop61" stop-color="#abaeb8"/> - </linearGradient> - <linearGradient y1="11.9" x2="0" y2="19.02" id="XMLID_15_" gradientUnits="userSpaceOnUse"> - <stop id="stop66" stop-color="#3b3b3b"/> - <stop offset="0.522" id="stop68" stop-color="#424345"/> - <stop offset="1" id="stop70" stop-color="#3b3b3b"/> - </linearGradient> - <linearGradient x1="2.874" x2="21.336" id="XMLID_16_" gradientUnits="userSpaceOnUse"> - <stop id="stop75" stop-color="#8c8c8c"/> - <stop offset="1" id="stop77" stop-color="#7c7c7c"/> - </linearGradient> - </defs> - <rect width="23.802" height="16.344" x="0.099" y="3.322" id="rect14" fill="url(#linearGradient3825)" stroke="#000000" stroke-width="0.198"/> - <rect width="17.613" height="14.202" x="0.813" y="4.433" id="rect27" fill="url(#linearGradient3827)" stroke="#000000" stroke-width="0.079"/> - <rect width="20.787" height="1.111" x="1.607" y="19.666" id="rect29"/> - <rect width="3.967" height="14.995" x="19.14" y="4.04" id="rect38" fill="url(#linearGradient3829)" stroke="#000000" stroke-width="0.079"/> - <path inkscape:connector-curvature="0" d="m 17.236364,16.333884 c -0.07934,0.634711 -0.63471,1.110744 -1.269421,1.190083 -5.077686,0.396694 -7.6165294,0.396694 -12.6942155,0 -0.6347107,-0.07934 -1.1900826,-0.555372 -1.2694215,-1.190083 -0.3966942,-3.887603 -0.3966942,-5.791736 0,-9.6000001 C 2.0826449,6.178512 2.6380168,5.62314 3.2727275,5.5438012 c 5.0776861,-0.3966942 7.6165295,-0.3966942 12.6942155,0 0.634711,0.079339 1.190082,0.5553719 1.269421,1.1900827 0.476033,3.8082641 0.476033,5.7123971 0,9.6000001 z" id="path45" fill="url(#linearGradient3831)" stroke="#000000" stroke-width="0.397"/> - <circle cx="21.12" cy="9.828" r="1.587" id="circle54" fill="url(#linearGradient3833)" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="6.337" r="1.587" id="circle63" fill="url(#linearGradient3835)" stroke="#000000" stroke-width="0.079"/> - <rect width="2.539" height="5.712" x="19.855" y="12.605" id="rect72" fill="url(#linearGradient3837)" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="6.337" r="0.793" id="circle81" fill="#8c8c8c" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="9.828" r="0.793" id="circle83" fill="#8c8c8c" stroke="#000000" stroke-width="0.079"/> - <g id="g3802" transform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)" opacity="0.6"> - <circle r="4.67" cy="-0.729" cx="-24.385" transform="matrix(1.1299292,0,0,1.110931,39.538735,11.339575)" id="path3025" fill="#ffff00" fill-rule="evenodd" stroke="#000000"/> - <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path3027" d="m 9.2895291,11.685109 c 1.6066949,1.955462 3.3983769,2.348098 5.6279769,0" fill="none" stroke="#000000" stroke-width="1.12"/> - <circle r="1.245" cy="-2.597" cx="-25.838" transform="matrix(1.1299292,0,0,1.110931,39.305401,11.572493)" id="path3031" stroke="#ffff00"/> - <circle r="1.245" cy="-2.597" cx="-25.838" id="path3031-3" transform="matrix(1.1299292,0,0,1.110931,42.940134,11.572492)" stroke="#ffff00"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/84-2.svg b/htdocs/public/symbols/svgicons/84-2.svg deleted file mode 100755 index 5591f380bbbd0d2080e4209e2c038c80f8e916c7..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/84-2.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <path inkscape:connector-curvature="0" d="m 21.848666,1037.81 c -0.04754,0 -0.09459,0 -0.141384,0.01 -0.595046,0.042 -1.128019,0.353 -1.445267,0.8491 -0.113582,0.1776 -0.355024,0.2328 -0.539319,0.1234 -0.120262,-0.071 -0.185965,-0.1951 -0.186049,-0.3217 0,-0.067 0.01833,-0.1361 0.05786,-0.1977 0.468357,-0.7325 1.267984,-1.1804 2.153812,-1.2119 -0.0751,-2.413 -2.088025,-4.3565 -4.590767,-4.4361 0.153072,0.4381 0.263023,0.8963 0.323926,1.3704 0.02659,0.207 -0.126022,0.3955 -0.340873,0.4211 -0.0039,5e-4 -0.0078,3e-4 -0.01169,7e-4 -0.01235,0 -0.02476,0 -0.03689,0 -0.195024,0 -0.363998,-0.14 -0.388586,-0.3312 -0.06361,-0.4955 -0.187092,-0.9716 -0.362621,-1.4222 -0.401817,-1.0318 -1.077428,-1.9286 -1.937,-2.6149 -0.116838,-0.094 -0.237099,-0.1827 -0.360492,-0.2679 -1.070832,-0.7401 -2.380518,-1.173 -3.782706,-1.173 -0.119803,0 -0.239021,0 -0.3575287,0.01 -0.6561161,0.035 -1.291486,0.1636 -1.8889949,0.3757 -1.5991734,0.5677 -2.9268503,1.7289 -3.6547644,3.2572 0.096301,-0.01 0.1932699,-0.01 0.2909068,-0.01 1.0312602,0 2.0260787,0.2927 2.8769675,0.8467 0.1119965,0.073 0.1723986,0.1918 0.1725238,0.3127 8.34e-5,0.073 -0.021706,0.1467 -0.067207,0.2116 -0.1212216,0.1728 -0.3648754,0.2182 -0.5442449,0.1013 -0.720776,-0.4692 -1.563817,-0.7171 -2.4379985,-0.7171 -0.2464505,0 -0.4881007,0.02 -0.723531,0.059 -0.068082,0.035 -0.1465595,0.051 -0.2260382,0.042 -0.02776,0.01 -0.055434,0.013 -0.082985,0.018 -1.9077792,0.448 -3.32820921,2.1078 -3.32820921,4.0817 0,4e-4 -4.175e-5,8e-4 -4.175e-5,0 7.0964e-4,2.528 2.12830736,4.5773 4.75285526,4.5773 l 11.9555222,0 4.4589,0 c 1.24461,0 2.253787,-0.9722 2.253787,-2.1714 0,-0.989 -0.835276,-1.7936 -1.861861,-1.7936 z" id="path3614" fill="#b3b3b3" stroke="#808080" stroke-width="0.491"/> - <g id="g3616" transform="matrix(0.04172682,0,0,0.04172682,-0.60141574,1027.4975)" stroke="#d45500" stroke-width="11.983"> - <path inkscape:connector-curvature="0" d="m 242.641,428.896 c -0.08,0 -54.669,1.311 -54.669,1.311 l 43.71,-62.555 c 0.465,-0.676 1.056,-1.586 1.671,-2.652 l -79.878,0 -48.62,102.676 c -1.449,3.059 -1.251,6.643 0.525,9.525 1.776,2.881 4.889,4.67 8.273,4.75 l 42.474,1.021 -53.1,90.703 c -2.461,4.193 -1.66,9.635 1.911,12.945 1.936,1.793 4.454,2.779 7.091,2.779 2.898,-0.002 5.689,-1.221 7.649,-3.338 l 130.29,-140.363 c 2.735,-2.947 3.439,-7.246 1.788,-10.91 -1.617,-3.593 -5.19,-5.892 -9.115,-5.892 z" id="path3618" fill="#ffdc21"/> - </g> - <g id="g3620" transform="matrix(0.04172682,0,0,0.04172682,-0.60141574,1027.4975)" stroke="#d45500" stroke-width="11.983"> - <path inkscape:connector-curvature="0" d="m 480.641,428.896 c -0.08,0 -54.669,1.311 -54.669,1.311 l 43.71,-62.555 c 0.465,-0.676 1.057,-1.586 1.672,-2.652 l -79.879,0 -48.62,102.676 c -1.448,3.059 -1.251,6.643 0.524,9.525 1.776,2.881 4.89,4.67 8.273,4.75 l 42.475,1.021 -53.1,90.703 c -2.462,4.193 -1.66,9.635 1.91,12.945 1.936,1.793 4.455,2.779 7.092,2.779 2.898,-0.002 5.689,-1.221 7.649,-3.338 l 130.29,-140.363 c 2.735,-2.947 3.439,-7.246 1.788,-10.91 -1.617,-3.593 -5.19,-5.892 -9.115,-5.892 z" id="path3622" fill="#ffdc21"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/85-1.svg b/htdocs/public/symbols/svgicons/85-1.svg deleted file mode 100755 index 63b7bfc6fb32a311f443a7e26e0c47d7c9fb2dc2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/85-1.svg +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24"> - <metadata id="metadata16"/> - <path inkscape:connector-curvature="0" id="path1966" d="m 22.800572,8.2688913 0.01595,-0.7329406 c -0.0157,-0.049247 -0.02412,-0.1057818 -0.09126,-0.1035977 L 1.8714751,7.4189727 C 0.92545083,7.6072532 0.73794541,10.068642 0.24866478,11.442638 l 0,2.980094 c 0.23834022,0.560104 0.4957278,0.605926 0.7512842,0.701199 l 3.10530832,-0.02505 c 0,-2.707608 4.1070207,-2.692523 4.1070207,0 l 8.339255,0 c 0,-2.697709 4.006849,-2.698447 4.006849,0 l 2.879923,0 c 0.136502,-0.04003 0.229533,-0.167006 0.313035,-0.313035 L 23.717887,12.11382 22.498519,8.5944457 c -0.04247,-0.2337777 0.201264,-0.2171274 0.30205,-0.3255564 z" fill="#ffcc00" fill-rule="evenodd" stroke="#000000" stroke-width="0.497"/> - <path inkscape:connector-curvature="0" id="path2856" d="m 4.6644943,15.108229 a 1.4907993,1.4904321 0 1 0 2.9815985,0 1.4907993,1.4904321 0 1 0 -2.9815985,0 z"/> - <path inkscape:connector-curvature="0" id="path3745" d="m 17.049313,15.117691 a 1.4907998,1.4907998 0 0 0 2.981599,0 1.4907998,1.4907998 0 1 0 -2.981599,0 z"/> - <path inkscape:connector-curvature="0" id="path3747" d="M 5.2756717,8.7631877 4.5560579,11.216442 c -0.042363,0.10005 -0.083941,0.200711 -0.2011915,0.242515 l -2.4948567,-0.0061 C 1.7604904,11.366142 1.6579002,11.285068 1.6422613,11.106107 L 2.3490748,8.6534092 C 2.40683,8.4599115 2.486435,8.4047941 2.5694668,8.3713791 l 2.5425805,0.0032 c 0.1239524,0.074007 0.1674796,0.2123551 0.1636244,0.3886085 z" fill="#cccccc" fill-rule="evenodd" stroke="#000000" stroke-width="0.397"/> - <path inkscape:connector-curvature="0" id="path4634" d="M 9.5750061,8.7585694 8.8553922,11.211823 c -0.042364,0.100051 -0.083941,0.200712 -0.2011914,0.242516 l -2.4948567,-0.0062 C 6.0598247,11.361523 5.9572344,11.28045 5.9415956,11.101488 L 6.648409,8.6487909 C 6.7061646,8.4552932 6.7857693,8.4001758 6.8688011,8.3667608 l 2.5425806,0.0032 c 0.1239523,0.074007 0.1674795,0.2123551 0.1636244,0.3886084 z" fill="#cccccc" fill-rule="evenodd" stroke="#000000" stroke-width="0.397"/> - <path inkscape:connector-curvature="0" id="path4636" d="m 13.874341,8.7585691 -0.719614,2.4532539 c -0.04236,0.100051 -0.08394,0.200712 -0.201191,0.242516 l -2.494858,-0.0062 c -0.09952,-0.08666 -0.20211,-0.167727 -0.217748,-0.346689 l 0.706813,-2.4526973 c 0.05775,-0.1934977 0.13736,-0.2486152 0.220393,-0.2820302 l 2.542581,0.0032 c 0.123952,0.074007 0.167479,0.2123552 0.163624,0.3886085 z" fill="#cccccc" fill-rule="evenodd" stroke="#000000" stroke-width="0.397"/> - <path inkscape:connector-curvature="0" id="path4640" d="m 17.87754,8.587075 4.22e-4,2.638863 c -0.04237,0.10005 -0.115944,0.194311 -0.233194,0.236115 l -2.590861,-0.0093 c -0.09952,-0.0867 -0.20211,-0.167767 -0.217748,-0.346728 L 15.542973,8.6533051 C 15.600726,8.4598074 15.680333,8.40469 15.763364,8.371275 l 1.921751,-0.0032 c 0.123952,0.074007 0.151479,0.074749 0.192425,0.2190002 z" fill="#cccccc" fill-rule="evenodd" stroke="#000000" stroke-width="0.397"/> - <path inkscape:connector-curvature="0" id="path4642" d="M 18.9754,8.6678402 18.98,11.22066 c 0.04237,0.100049 0.08394,0.20071 0.201191,0.242515 l 2.93385,-0.01518 c 0.09952,-0.08669 0.20211,-0.167768 0.217748,-0.346728 L 21.453952,8.6576271 C 21.396196,8.4641294 21.316592,8.409012 21.23356,8.375597 l -2.094536,0.00772 c -0.123952,0.07401 -0.167479,0.1082663 -0.163624,0.2845197 z" fill="#cccccc" fill-rule="evenodd" stroke="#000000" stroke-width="0.397"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/85-2.svg b/htdocs/public/symbols/svgicons/85-2.svg deleted file mode 100755 index 4cf7c575569f6aa46211f6bcacf2487f19eb0eb0..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/85-2.svg +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3050"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <switch transform="matrix(0.0408403,0,0,0.0408403,-0.20169302,1028.1994)" id="switch3786"> - <g id="g3790"> - <g id="g3792"> - <circle cx="298.49" cy="306.12" r="216.75" id="circle3794" fill="#ffaa00"/> - <g id="g3796"> - <g id="g3798"> - <path inkscape:connector-curvature="0" d="m 339.642,72.042 c -0.225,0 -0.451,-0.019 -0.677,-0.058 -13.323,-2.287 -26.942,-3.446 -40.478,-3.446 -12.325,0 -24.765,0.969 -36.975,2.879 -0.207,0.033 -0.414,0.048 -0.619,0.048 -1.305,0 -2.545,-0.64 -3.298,-1.737 -0.872,-1.271 -0.936,-2.928 -0.166,-4.263 l 26.545,-45.98 c 4.29,-7.429 10.016,-11.52 16.125,-11.52 6.11,0 11.836,4.091 16.126,11.52 l 26.879,46.556 c 0.775,1.343 0.704,3.014 -0.183,4.287 -0.754,1.085 -1.985,1.714 -3.279,1.714 z" id="path3800" fill="#ffaa00"/> - </g> - <g id="g3802"> - <path inkscape:connector-curvature="0" d="m 116.291,151.497 c -0.356,0 -0.716,-0.047 -1.07,-0.146 -1.485,-0.412 -2.602,-1.641 -2.87,-3.159 l -9.225,-52.317 c -1.279,-7.254 -0.111,-13.48 3.287,-17.53 2.774,-3.306 6.873,-5.053 11.852,-5.053 2.971,0 6.19,0.624 9.568,1.854 l 50.512,18.385 c 1.458,0.531 2.478,1.857 2.616,3.403 0.138,1.546 -0.63,3.032 -1.972,3.812 -22.481,13.09 -42.561,29.703 -59.682,49.377 -0.769,0.885 -1.876,1.374 -3.016,1.374 z" id="path3804" fill="#ffaa00"/> - </g> - <g id="g3806"> - <path inkscape:connector-curvature="0" d="m 56.946,305.711 c -0.924,0 -1.837,-0.319 -2.572,-0.936 L 13.69,270.639 C 7.119,265.123 4.084,258.773 5.145,252.757 6.206,246.741 11.23,241.812 19.291,238.878 l 50.482,-18.375 c 0.446,-0.163 0.909,-0.241 1.368,-0.241 1.041,0 2.062,0.406 2.825,1.167 1.099,1.096 1.465,2.729 0.938,4.189 -8.797,24.401 -13.495,50.026 -13.96,76.164 -0.027,1.541 -0.938,2.93 -2.341,3.568 -0.53,0.243 -1.095,0.361 -1.657,0.361 z" id="path3808" fill="#ffaa00"/> - </g> - <g id="g3810"> - <path inkscape:connector-curvature="0" d="m 57.515,462.003 c -8.579,0 -14.986,-2.914 -18.041,-8.204 -3.055,-5.291 -2.375,-12.297 1.915,-19.728 l 26.863,-46.524 c 0.718,-1.244 2.043,-2 3.463,-2 0.114,0 0.229,0.005 0.344,0.015 1.547,0.133 2.877,1.149 3.412,2.606 8.962,24.402 21.833,47.051 38.254,67.317 0.971,1.198 1.167,2.848 0.503,4.24 -0.664,1.392 -2.069,2.278 -3.611,2.278 l -53.102,0 z" id="path3812" fill="#ffaa00"/> - </g> - <g id="g3814"> - <path inkscape:connector-curvature="0" d="m 199.747,586.558 c -7.979,-10e-4 -14.094,-6.577 -15.961,-17.162 l -9.333,-52.934 c -0.27,-1.529 0.37,-3.077 1.642,-3.969 0.687,-0.482 1.491,-0.726 2.298,-0.726 0.686,0 1.374,0.177 1.993,0.532 22.592,12.986 46.999,22.081 72.543,27.031 1.514,0.293 2.725,1.431 3.111,2.924 0.386,1.493 -0.12,3.076 -1.301,4.067 l -40.646,34.104 c -4.781,4.013 -9.742,6.133 -14.346,6.133 10e-4,0 10e-4,0 0,0 z" id="path3816" fill="#ffaa00"/> - </g> - <g id="g3818"> - <path inkscape:connector-curvature="0" d="m 394.197,587.662 c -4.604,0 -9.564,-2.12 -14.343,-6.13 l -41.179,-34.556 c -1.189,-0.999 -1.693,-2.596 -1.293,-4.097 0.4,-1.5 1.634,-2.634 3.163,-2.906 25.633,-4.565 50.176,-13.286 72.947,-25.921 0.605,-0.336 1.274,-0.502 1.94,-0.502 0.817,0 1.631,0.25 2.322,0.743 1.256,0.896 1.885,2.433 1.617,3.951 l -9.215,52.253 c -1.865,10.588 -7.981,17.165 -15.959,17.165 z" id="path3820" fill="#ffaa00"/> - </g> - <g id="g3822"> - <path inkscape:connector-curvature="0" d="m 484.058,464.795 c -1.554,0 -2.966,-0.898 -3.624,-2.306 -0.657,-1.406 -0.441,-3.067 0.554,-4.259 16.732,-20.028 29.945,-42.48 39.271,-66.732 0.553,-1.438 1.884,-2.432 3.421,-2.552 0.104,-0.009 0.209,-0.013 0.313,-0.013 1.42,0 2.745,0.756 3.463,2 l 26.517,45.932 c 4.29,7.429 4.971,14.434 1.917,19.725 -3.056,5.291 -9.463,8.205 -18.043,8.205 h -53.789 z" id="path3824" fill="#ffaa00"/> - </g> - <g id="g3826"> - <path inkscape:connector-curvature="0" d="m 540.069,309.322 c -0.571,0 -1.146,-0.122 -1.684,-0.372 -1.408,-0.653 -2.311,-2.062 -2.315,-3.615 -0.084,-26.152 -4.398,-51.846 -12.821,-76.367 -0.501,-1.458 -0.12,-3.073 0.98,-4.153 0.761,-0.748 1.772,-1.146 2.803,-1.146 0.459,0 0.922,0.079 1.368,0.241 l 49.841,18.144 c 8.061,2.934 13.085,7.863 14.146,13.879 1.061,6.016 -1.974,12.367 -8.546,17.882 l -41.199,34.572 c -0.736,0.616 -1.65,0.935 -2.573,0.935 z" id="path3828" fill="#ffaa00"/> - </g> - <g id="g3830"> - <path inkscape:connector-curvature="0" d="m 483.04,154.215 c -1.16,0 -2.284,-0.506 -3.056,-1.419 -16.812,-19.901 -36.645,-36.804 -58.95,-50.239 -1.32,-0.795 -2.066,-2.278 -1.918,-3.812 0.149,-1.534 1.166,-2.846 2.614,-3.373 L 471.611,77.22 c 3.377,-1.229 6.596,-1.853 9.566,-1.853 4.98,0 9.08,1.748 11.854,5.056 3.398,4.051 4.564,10.276 3.284,17.528 l -9.337,52.959 c -0.27,1.529 -1.399,2.764 -2.897,3.167 -0.345,0.093 -0.694,0.138 -1.041,0.138 z" id="path3832" fill="#ffaa00"/> - </g> - </g> - </g> - </g> - </switch> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/86-1.svg b/htdocs/public/symbols/svgicons/86-1.svg deleted file mode 100755 index fc6727b9198bf9f326b376bfd9746798f197242d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/86-1.svg +++ /dev/null @@ -1,76 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24.000001 24"> - <metadata id="metadata51"/> - <defs id="defs86"> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_9_" id="linearGradient3825" gradientUnits="userSpaceOnUse" x1="0.125" x2="30.13" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_10_" id="linearGradient3827" gradientUnits="userSpaceOnUse" x1="1.029" x2="23.18" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_11_" id="linearGradient3829" gradientUnits="userSpaceOnUse" x1="24.11" x2="29.09" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_13_" id="linearGradient3833" gradientUnits="userSpaceOnUse" x1="25.2" y1="6.891" x2="28" y2="9.691" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_14_" id="linearGradient3835" gradientUnits="userSpaceOnUse" x1="25.2" y1="2.501" x2="28" y2="5.302" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient inkscape:collect="always" xlink:href="#XMLID_15_" id="linearGradient3837" gradientUnits="userSpaceOnUse" y1="11.9" x2="0" y2="19.02" gradientTransform="matrix(0.79338845,0,0,0.79338845,0.0198349,3.2429747)"/> - <linearGradient x1="2.099" x2="22.11" id="linearGradient4289" gradientUnits="userSpaceOnUse"> - <stop id="stop41-0" stop-color="#8c8c8c"/> - <stop offset="1" id="stop43-2" stop-color="#5e5e5e"/> - </linearGradient> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient4289" id="linearGradient3831-3" gradientUnits="userSpaceOnUse" x1="2.099" x2="22.11" gradientTransform="matrix(0.79338855,0,0,0.79338855,0.0198333,3.2429735)"/> - <linearGradient x1="0.125" x2="30.13" id="XMLID_9_" gradientUnits="userSpaceOnUse"> - <stop id="stop4" stop-color="#696969"/> - <stop offset="0.298" id="stop6" stop-color="#aaadb6"/> - <stop offset="0.438" id="stop8" stop-color="#999a9e"/> - <stop offset="0.562" id="stop10" stop-color="#adb1ba"/> - <stop offset="1" id="stop12" stop-color="#828387"/> - </linearGradient> - <linearGradient x1="1.029" x2="23.18" id="XMLID_10_" gradientUnits="userSpaceOnUse"> - <stop id="stop17" stop-color="#aaadb6"/> - <stop offset="0.079" id="stop19" stop-color="#696969"/> - <stop offset="0.438" id="stop21" stop-color="#828387"/> - <stop offset="0.933" id="stop23" stop-color="#828387"/> - <stop offset="1" id="stop25" stop-color="#adb1ba"/> - </linearGradient> - <linearGradient x1="24.11" x2="29.09" id="XMLID_11_" gradientUnits="userSpaceOnUse"> - <stop id="stop32" stop-color="#383838"/> - <stop offset="0.562" id="stop34" stop-color="#616369"/> - <stop offset="1" id="stop36" stop-color="#525252"/> - </linearGradient> - <linearGradient x1="25.2" y1="6.891" x2="28" y2="9.691" id="XMLID_13_" gradientUnits="userSpaceOnUse"> - <stop offset="0.264" id="stop48" stop-color="#9698a1"/> - <stop offset="0.36" id="stop50" stop-color="#787a82"/> - <stop offset="0.725" id="stop52" stop-color="#abaeb8"/> - </linearGradient> - <linearGradient x1="25.2" y1="2.501" x2="28" y2="5.302" id="XMLID_14_" gradientUnits="userSpaceOnUse"> - <stop offset="0.264" id="stop57" stop-color="#9698a1"/> - <stop offset="0.36" id="stop59" stop-color="#787a82"/> - <stop offset="0.725" id="stop61" stop-color="#abaeb8"/> - </linearGradient> - <linearGradient y1="11.9" x2="0" y2="19.02" id="XMLID_15_" gradientUnits="userSpaceOnUse"> - <stop id="stop66" stop-color="#3b3b3b"/> - <stop offset="0.522" id="stop68" stop-color="#424345"/> - <stop offset="1" id="stop70" stop-color="#3b3b3b"/> - </linearGradient> - <linearGradient x1="2.874" x2="21.336" id="XMLID_16_" gradientUnits="userSpaceOnUse"> - <stop id="stop75" stop-color="#8c8c8c"/> - <stop offset="1" id="stop77" stop-color="#7c7c7c"/> - </linearGradient> - </defs> - <rect width="23.802" height="16.344" x="0.099" y="3.322" id="rect14" fill="url(#linearGradient3825)" stroke="#000000" stroke-width="0.198"/> - <rect width="17.613" height="14.202" x="0.813" y="4.433" id="rect27" fill="url(#linearGradient3827)" stroke="#000000" stroke-width="0.079"/> - <rect width="20.787" height="1.111" x="1.607" y="19.666" id="rect29"/> - <rect width="3.967" height="14.995" x="19.14" y="4.04" id="rect38" fill="url(#linearGradient3829)" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="9.828" r="1.587" id="circle54" fill="url(#linearGradient3833)" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="6.337" r="1.587" id="circle63" fill="url(#linearGradient3835)" stroke="#000000" stroke-width="0.079"/> - <rect width="2.539" height="5.712" x="19.855" y="12.605" id="rect72" fill="url(#linearGradient3837)" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="6.337" r="0.793" id="circle81" fill="#8c8c8c" stroke="#000000" stroke-width="0.079"/> - <circle cx="21.12" cy="9.828" r="0.793" id="circle83" fill="#8c8c8c" stroke="#000000" stroke-width="0.079"/> - <path d="M 1.8710486,7.4082056 C 1.9254792,6.2299476 2.535135,5.8349808 3.7634784,5.5371574 l 0,11.9967196 C 2.9529507,17.319004 2.2857243,18.12995 1.7609869,15.479393 Z" id="rect3404" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" fill="#ff0000" fill-rule="evenodd"/> - <path d="m 5.706614,5.3109102 2.0024917,-0.140625 0,12.6570908 -2.0024917,-0.171875 z" id="rect3404-1" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" fill="#ffff00" fill-rule="evenodd"/> - <rect id="rect3404-2" width="2" height="12.657" x="7.679" y="5.17" fill="#00ff00" fill-rule="evenodd"/> - <rect id="rect3404-6" width="2" height="12.657" x="9.652" y="5.17" fill="#008080" fill-rule="evenodd"/> - <path d="m 11.625056,5.1702843 1.986867,0.125 0.01563,12.3914667 -2.002492,0.140625 z" id="rect3404-6-4" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" fill="#0000ff" fill-rule="evenodd"/> - <path d="m 13.582247,5.3087127 2.018117,0.1605066 0,12.0612817 -2.002492,0.125 z" id="rect3404-6-8" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" fill="#ff00ff" fill-rule="evenodd"/> - <path d="m 15.570685,5.4270948 c 1.358396,-0.1278255 1.809434,1.1809982 2.002492,2.8982904 l 0,6.5670128 c -0.204175,2.374062 -1.021926,2.754002 -2.002492,2.604793 z" id="rect3404-6-6" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" fill="#00ffff" fill-rule="evenodd"/> - <path d="m 3.7337995,5.5140343 2.0024919,-0.21875 0,12.3445917 -2.0024919,-0.04687 z" id="rect3404-6-7" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" fill="#ff6600" fill-rule="evenodd"/> - <g inkscape:groupmode="layer" id="layer1" inkscape:label="Layer 1"> - <path inkscape:connector-curvature="0" d="m 17.236365,16.333886 c -0.07934,0.63471 -0.63471,1.110743 -1.269421,1.190082 -5.077688,0.396694 -7.6165306,0.396694 -12.6942178,0 -0.6347107,-0.07934 -1.1900827,-0.555372 -1.2694216,-1.190082 -0.3966942,-3.887605 -0.3966942,-5.791738 0,-9.6000033 0.079339,-0.555372 0.6347109,-1.1107441 1.2694216,-1.1900831 5.0776872,-0.396694 7.6165298,-0.396694 12.6942178,0 0.634711,0.07934 1.190082,0.5553721 1.269421,1.1900831 0.476033,3.8082653 0.476033,5.7123983 0,9.6000033 z" id="path45-2" opacity="0.3" fill="url(#linearGradient3831-3)" stroke="#000000" stroke-width="0.397"/> - <path inkscape:connector-curvature="0" d="m 17.236364,16.333884 c -0.07934,0.634711 -0.63471,1.110744 -1.269421,1.190083 -5.077686,0.396694 -7.6165299,0.396694 -12.6942159,0 -0.6347107,-0.07934 -1.1900826,-0.555372 -1.2694215,-1.190083 -0.3966942,-3.887603 -0.3966942,-5.791737 0,-9.600001 0.079339,-0.5553719 0.6347108,-1.1107439 1.2694215,-1.1900827 5.077686,-0.3966942 7.6165299,-0.3966942 12.6942159,0 0.634711,0.079339 1.190082,0.5553719 1.269421,1.1900827 0.476033,3.808264 0.476033,5.712398 0,9.600001 z" id="path45" fill="none" stroke="#000000" stroke-width="0.397"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/86-2.svg b/htdocs/public/symbols/svgicons/86-2.svg deleted file mode 100755 index 81ba54f74c5864c72c0805abb3f10c50b1448b37..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/86-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1" stroke="#000000" stroke-width="2"> - <metadata id="metadata14"/> - <path inkscape:connector-curvature="0" d="m 5.2476657,11.063511 3.1920126,5.401868 7.1206437,0 3.192012,-5.401868 0,-6.1384855 -13.5046683,0" id="path6" fill="#ffffff" stroke-width="0.491"/> - <path inkscape:connector-curvature="0" d="M 0.33687708,8.1170381 4.0199685,1.9785523 8.9307571,4.9250255 5.2476657,11.063511 Z M 15.069243,4.9250255 19.980031,1.9785523 23.663123,8.1170381 18.752334,11.063511 Z m -6.6295647,11.5403535 7.1206437,0 0,5.647407 -7.1206437,0 z" id="path4" stroke-width="0.491"/> - <circle cx="11.877" cy="10.818" r="1.719" id="circle8" stroke-width="0.491"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/87-1.svg b/htdocs/public/symbols/svgicons/87-1.svg deleted file mode 100755 index c4f0d3a31806d19b5d363348f9f01d7a4313b946..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/87-1.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" height="24" width="24" version="1.1"><metadata id="metadata3412"/><g><g><g><g> - - <circle r="12" cy="12" cx="12" id="path3416" fill="#000080" fill-rule="evenodd"/> -<text id="textoverlay"><tspan id="tspanoverlay" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" font-weight="bold" x="12" y="12" fill="#ffffff" font-size="11" dy="4.0" dx="-0.4">WX</tspan></text></g></g></g></g></svg> diff --git a/htdocs/public/symbols/svgicons/87-2.svg b/htdocs/public/symbols/svgicons/87-2.svg deleted file mode 100755 index b9982b7a96a37b54e4dc645d65e156540e1fd279..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/87-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" version="1.1"> - <metadata id="metadata3412"/> - <circle r="11.52" cy="12" cx="12" id="path3416" fill="#008000" fill-rule="evenodd" stroke="#000000" stroke-width="0.96"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/88-1.svg b/htdocs/public/symbols/svgicons/88-1.svg deleted file mode 100755 index 3b100285996f64d91a1dfa962338ecbba4655320..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/88-1.svg +++ /dev/null @@ -1,221 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="88-1.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="22.627417" - inkscape:cx="6.3336698" - inkscape:cy="19.236151" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - style="fill:#1a1a1a;stroke:#1a1a1a" - transform="matrix(-0.04229117,0,0,-0.03508931,28.159572,29.493315)" - id="g4241"> - <path - style="fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 326.12263,515.52088 27.3184,11.99722 -1.97231,4.49106 -27.3184,-11.99722 z" - id="path4239" - inkscape:connector-curvature="0" /> - <path - sodipodi:nodetypes="ccccc" - inkscape:connector-curvature="0" - id="rect4236" - d="m 326.61151,514.77002 37.16036,-30.66177 0,4.41682 -37.16036,30.66177 z" - style="fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <rect - ry="6.0592961" - y="502.09976" - x="317.90591" - height="31.949015" - width="11.617825" - id="rect4232" - style="fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - <g - style="fill:#1a1a1a;stroke:#1a1a1a" - id="g4271" - transform="matrix(0.04229117,0,0,-0.03508931,-6.1286271,29.420561)"> - <path - inkscape:connector-curvature="0" - id="path4273" - d="m 326.12263,515.52088 27.3184,11.99722 -1.97231,4.49106 -27.3184,-11.99722 z" - style="fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - style="fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 326.61151,514.77002 37.16036,-30.66177 0,4.41682 -37.16036,30.66177 z" - id="path4275" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccc" /> - <rect - style="fill:#1a1a1a;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4277" - width="11.617825" - height="31.949015" - x="317.90591" - y="502.09976" - ry="6.0592961" /> - </g> - <rect - style="display:inline;fill:#4d4d4d;stroke:#4d4d4d;stroke-width:0.03676214;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4203" - width="0.97268414" - height="0.17276153" - x="-12.10735" - y="-22.702787" - transform="scale(-1,-1)" /> - <path - style="display:inline;fill:#1a1a1a;stroke:#1a1a1a;stroke-width:0.03676214;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 11.465088,3.3466272 c 0.474867,0.084361 0.949281,0.3976852 1.165821,0.7699635 0.09435,0.1622165 0.182284,0.4619006 0.283655,0.9667747 0.03525,0.175543 0.08708,0.401754 0.115167,0.5026916 l 0.05109,-0.4934377 0.15915,0 c 0.204818,0 0.225309,0.030887 0.308503,0.4650482 0.177261,0.9250644 0.186103,1.0841274 0.178538,3.2116134 l -0.0074,2.0648571 -0.141937,0.11038 c -0.179805,0.139822 -0.324288,0.162592 -0.503792,0.0794 l -0.137615,-0.06379 -0.0032,0.377627 c -0.0047,0.563096 -0.01948,0.680253 -0.158442,1.259653 -0.112009,0.467042 -0.151114,0.566912 -0.324967,0.829841 -0.248189,0.37535 -0.399348,0.570194 -0.442359,0.570194 -0.01839,0 -0.08192,0.05387 -0.141226,0.119688 -0.09802,0.108831 -0.110162,0.158783 -0.133684,0.550567 -0.0282,0.469505 -0.05738,0.917571 -0.08734,1.340511 -0.01049,0.149211 -0.02989,0.486733 -0.04295,0.750047 -0.01305,0.263316 -0.04133,0.730099 -0.06282,1.037301 -0.02149,0.307199 -0.04902,0.304645 -0.06114,0.506519 -0.01207,0.201875 -0.03462,0.548095 -0.04999,0.769379 -0.01569,0.225928 -0.01144,0.409848 0.0096,0.419472 0.02069,0.0095 0.123351,0.02598 0.228148,0.03676 0.1048,0.01079 0.23818,0.02556 0.2964,0.03282 0.05823,0.0073 0.305927,0.03751 0.550458,0.06724 0.24453,0.02972 0.468418,0.06852 0.49753,0.08622 0.0707,0.043 0.06935,0.357371 -0.0017,0.401833 -0.07462,0.04669 -0.323935,0.08583 -1.043574,0.163915 -0.336211,0.03647 -0.61496,0.06961 -0.619443,0.07366 -0.0083,0.0073 -0.03558,0.492315 -0.08846,1.563289 -0.02075,0.420025 -0.01529,0.566527 0.02105,0.566527 0.02697,0 0.04903,0.02873 0.04903,0.06383 0,0.0351 -0.02143,0.06025 -0.04763,0.05585 -0.007,0.08796 -0.0023,0.185628 -0.0031,0.18995 -0.04582,0.009 -0.128779,0.04717 -0.144544,0.08478 -0.01577,0.0376 -0.05716,0.101195 -0.09195,0.141339 l -0.06329,0.07297 -0.08448,-0.104705 c -0.09087,-0.112629 -0.09976,-0.197038 -0.199265,-1.890377 -0.02469,-0.420183 -0.05208,-0.769384 -0.06086,-0.776004 -0.0088,-0.0066 -0.338229,-0.04634 -0.7321044,-0.08829 -0.953844,-0.101556 -0.9545792,-0.101804 -0.9545792,-0.318673 0,-0.271581 -0.076965,-0.242873 0.9015809,-0.336271 0.3798967,-0.03625 0.7077807,-0.07387 0.7286307,-0.08358 0.02085,-0.0097 0.02733,-0.156203 0.01438,-0.325531 -0.02481,-0.324748 -0.05129,-0.374508 -0.08951,-1.165479 -0.03719,-0.769747 -0.104025,-1.899116 -0.12466,-2.106516 -0.01049,-0.105324 -0.03001,-0.464392 -0.04341,-0.797924 -0.03727,-0.928033 -0.03552,-0.920577 -0.252036,-1.071017 C 9.8566166,13.872005 9.4669609,13.300175 9.3422649,12.944183 9.213914,12.577755 9.1257546,12.154533 9.1256046,11.904067 L 9.1254939,11.677833 8.7861528,11.479562 C 8.5995156,11.370518 8.4298354,11.289202 8.409086,11.298867 8.3871879,11.309087 8.3689249,10.475332 8.3655572,9.311828 8.3600856,7.4218728 8.3641016,7.3042885 8.4356381,7.256065 8.5506504,7.1785417 8.8109473,7.1585071 8.9580716,7.2158544 l 0.1250703,0.048756 0,-1.3371496 c 0,-1.411183 0.022808,-0.9606821 0.2134346,-1.4422411 C 9.3728197,4.2926123 9.5835897,3.9844966 9.7282371,3.8541883 9.8814172,3.7161965 10.41948,3.4180375 10.565142,3.3904327 c 0.01168,-0.00221 0.07481,-0.020762 0.140372,-0.041234 0.136741,-0.042701 0.526282,-0.044018 0.759588,-0.00257 z" - id="path3357" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccsccssccccccssscsccscscsccccsccssccccccsccscccccscsccccscccssscccc" /> - <path - style="fill:#999999;fill-opacity:1;stroke:#333333;stroke-width:0.04528588;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 11.254222,4.5545287 -0.405992,0 c -0.07049,0 -0.127221,-0.052935 -0.127221,-0.1186868 l 0,-0.8447472 c 0,-0.065753 0.05675,-0.1186866 0.127221,-0.1186866 l 0.405992,0 c 0.07049,0 0.12722,0.052934 0.12722,0.1186866 l 0,0.8447472 c 0,0.065752 -0.05674,0.1186868 -0.12722,0.1186868 z" - id="rect4280" - inkscape:connector-curvature="0" /> - <path - id="path4283" - d="m 11.923185,4.6831344 -0.325896,-0.07595 c -0.06503,-0.015148 -0.113861,-0.06659 -0.107625,-0.1340487 l 0.07133,-0.7722527 c 0.0062,-0.067462 0.07037,-0.1352479 0.132003,-0.1093034 l 0.341281,0.1436735 c 0.06163,0.025948 0.115907,0.066816 0.107637,0.1340486 l -0.08671,0.7045278 c -0.0083,0.067233 -0.06697,0.1244559 -0.132001,0.1093021 z" - style="fill:#999999;fill-opacity:1;stroke:#333333;stroke-width:0.04528588;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" - sodipodi:nodetypes="sssssssss" /> - <path - sodipodi:nodetypes="sssssssss" - inkscape:connector-curvature="0" - style="fill:#999999;fill-opacity:1;stroke:#333333;stroke-width:0.04528588;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 10.211293,4.6908172 0.325894,-0.075949 C 10.602217,4.59972 10.651048,4.54828 10.644824,4.4808196 l -0.07133,-0.7722519 c -0.0062,-0.067462 -0.07037,-0.1352491 -0.132001,-0.109302 l -0.341278,0.1436728 c -0.06163,0.025948 -0.115907,0.066816 -0.1076376,0.1340486 l 0.086711,0.704528 c 0.0083,0.067232 0.06697,0.1244558 0.132001,0.109302 z" - id="path4285" /> - <path - id="path4287" - d="M 9.4521724,5.1325653 9.8948551,4.8491864 C 9.9499179,4.8139258 10.016948,4.7815167 10.00248,4.7151376 L 9.8894364,4.1964102 c -0.014461,-0.06638 -0.09503,-0.1616147 -0.132001,-0.1093037 l -0.4705695,0.66609 c -0.03696,0.052312 -0.061393,0.096646 -0.028383,0.1570972 l 0.061691,0.1129696 c 0.033015,0.060449 0.076923,0.1445611 0.1319997,0.109302 z" - style="fill:#999999;fill-opacity:1;stroke:#333333;stroke-width:0.04528588;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" - sodipodi:nodetypes="sssssssss" /> - <path - sodipodi:nodetypes="sssssssss" - inkscape:connector-curvature="0" - style="fill:#999999;fill-opacity:1;stroke:#333333;stroke-width:0.04528588;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 12.721004,5.1325653 12.278321,4.8491864 c -0.05506,-0.035261 -0.122093,-0.06767 -0.107625,-0.1340488 l 0.113042,-0.5187275 c 0.01446,-0.066381 0.09503,-0.1616147 0.132001,-0.1093036 l 0.470583,0.6660893 c 0.03695,0.052312 0.06141,0.096646 0.02839,0.1570971 l -0.06167,0.1129696 c -0.03302,0.060449 -0.07692,0.144561 -0.132,0.109302 z" - id="path4289" /> - <rect - style="display:inline;fill:#4d4d4d;stroke:#4d4d4d;stroke-width:0.03676214;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4205" - width="0.21801542" - height="0.2991724" - x="-12.033846" - y="-22.765993" - ry="0.04213696" - transform="scale(-1,-1)" /> - <rect - style="display:inline;fill:#4d4d4d;stroke:#4d4d4d;stroke-width:0.44347614;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4207" - width="0.11262723" - height="1.1137763" - x="-11.939633" - y="-23.778214" - ry="0.014238616" - transform="scale(-1,-1)" /> - <rect - ry="0.014238616" - y="-22.483994" - x="-11.939633" - height="1.1137763" - width="0.11262723" - id="rect4209" - style="display:inline;fill:#4d4d4d;stroke:#4d4d4d;stroke-width:0.44347614;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - transform="scale(-1,-1)" /> - <g - id="g4730" - style="fill:#4d4d4d;stroke:#4d4d4d"> - <path - inkscape:transform-center-y="-177.95367" - inkscape:transform-center-x="75.786419" - sodipodi:nodetypes="ssssscscss" - inkscape:connector-curvature="0" - id="rect4213" - d="M 15.335599,19.308888 14.86082,19.45435 c -0.05239,0.01605 -0.110055,-0.0073 -0.128038,-0.0529 l -3.695104,-9.35558 c -0.01798,-0.04552 0.0087,-0.094791 0.06111,-0.1108426 l 0.150504,0.065081 0.689638,1.714982 c 0.03751,0.0933 0.268397,-0.03571 0.47442,-0.07057 l 2.98336,7.553527 c 0.01798,0.04552 -0.0087,0.09479 -0.06111,0.110842 z" - style="fill:#4d4d4d;fill-opacity:1;stroke:#4d4d4d;stroke-width:0.44347614;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - style="fill:#4d4d4d;fill-opacity:1;stroke:#4d4d4d;stroke-width:0.41295668;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 3.2522389,16.066201 2.9944015,15.714178 c -0.028453,-0.03885 -0.020388,-0.09344 0.018761,-0.121475 L 11.058274,9.8312911 c 0.03915,-0.028036 0.09302,-0.020085 0.121475,0.018761 L 11.15491,9.9936786 9.6832178,11.06 c -0.08006,0.05801 0.1011744,0.212406 0.1859704,0.373304 l -6.4954755,4.651657 c -0.039147,0.02804 -0.093024,0.02009 -0.1214758,-0.01876 z" - id="path4216" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ssssscscss" - inkscape:transform-center-x="-154.08386" - inkscape:transform-center-y="-113.34617" /> - <path - inkscape:transform-center-y="108.716" - inkscape:transform-center-x="-157.12942" - sodipodi:nodetypes="ssssscscss" - inkscape:connector-curvature="0" - id="path4218" - d="M 2.7291705,4.5029931 2.9729637,4.1411019 c 0.026902,-0.039935 0.080999,-0.050851 0.1206436,-0.023523 l 8.1472117,5.6161043 c 0.03964,0.027328 0.05042,0.080709 0.02353,0.1206439 L 11.120804,9.8796414 9.6187754,8.8564858 C 9.5370656,8.8008265 9.4532362,9.0236647 9.330603,9.1579763 L 2.7526939,4.6236373 C 2.7130494,4.596309 2.7022679,4.5429274 2.7291705,4.5029931 Z" - style="fill:#4d4d4d;fill-opacity:1;stroke:#4d4d4d;stroke-width:0.41295668;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - style="fill:#4d4d4d;fill-opacity:1;stroke:#4d4d4d;stroke-width:0.41295668;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 13.901821,0.20974224 0.417462,0.12698873 c 0.04607,0.0140127 0.07236,0.0625329 0.05786,0.10844682 l -2.98089,9.43567551 c -0.0145,0.045914 -0.06238,0.071871 -0.108446,0.057858 l -0.06628,-0.1298155 0.537864,-1.7359792 c 0.02926,-0.094437 -0.208364,-0.1092554 -0.372726,-0.1871255 l 2.406717,-7.61819076 c 0.0145,-0.0459145 0.06238,-0.0718717 0.108448,-0.0578584 z" - id="path4220" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ssssscscss" - inkscape:transform-center-x="58.885611" - inkscape:transform-center-y="180.05033" /> - <path - inkscape:transform-center-y="6.6577419" - inkscape:transform-center-x="187.21113" - sodipodi:nodetypes="ssssscscss" - inkscape:connector-curvature="0" - id="path4222" - d="m 21.276474,9.4810214 0.0075,0.4362837 c 8.34e-4,0.048144 -0.03725,0.088089 -0.0854,0.088408 l -9.895119,0.06563 c -0.04815,3.2e-4 -0.08758,-0.03725 -0.0884,-0.085395 l 0.103136,-0.1029966 1.817259,-0.022124 c 0.09886,-0.00121 0.03987,-0.2318665 0.06342,-0.4122111 l 7.989136,-0.052988 c 0.04815,-3.198e-4 0.08758,0.037252 0.0884,0.085395 z" - style="fill:#4d4d4d;fill-opacity:1;stroke:#4d4d4d;stroke-width:0.41295668;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - <ellipse - style="fill:#4d4d4d;stroke:#4d4d4d;stroke-width:0.06478313;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4211-2" - cx="-11.171059" - cy="-9.9016705" - transform="scale(-1,-1)" - rx="0.59183103" - ry="0.51234722" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/88-2.svg b/htdocs/public/symbols/svgicons/88-2.svg deleted file mode 100755 index 848ecbc42232a246bde1148ab3b70566056de8de..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/88-2.svg +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" version="1.1" width="24" height="24"> - <metadata id="metadata30"/> - <defs id="defs4"> - <linearGradient id="linearGradient1697-1-3-6-5-5"> - <stop stop-color="#69db0e" id="stop7"/> - <stop offset="1" stop-color="#397607" id="stop9"/> - </linearGradient> - <linearGradient gradientTransform="matrix(0.56414,0,0,0.23364,101.88495,314.1874)" gradientUnits="userSpaceOnUse" id="linearGradient3890" x1="213.83" x2="214.59" y1="183.48" y2="463.47"> - <stop stop-color="#fff" stop-opacity="0.691" id="stop12"/> - <stop offset="1" stop-color="#fff" stop-opacity="0" id="stop14"/> - </linearGradient> - <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3886" x2="0" xlink:href="#linearGradient1697-1-3-6-5-5" y1="485.97" y2="352.9"/> - <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3888" x2="0" xlink:href="#linearGradient1697-1-3-6-5-5" y1="363.61" y2="481.97"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient3890" id="linearGradient3004" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.56414,0,0,0.23364,101.88495,314.1874)" x1="213.83" y1="183.48" x2="214.59" y2="463.47"/> - <linearGradient inkscape:collect="always" xlink:href="#linearGradient3890" id="linearGradient3007" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.09716758,0,0,0.0402422,-8.9028609,-6.5743117)" x1="213.83" y1="183.48" x2="214.59" y2="463.47"/> - </defs> - <path inkscape:connector-curvature="0" id="path20" d="m 23.516371,12.000002 c 0,6.360314 -5.156055,11.51637 -11.516374,11.51637 -6.3603182,0 -11.51636845,-5.156056 -11.51636845,-11.51637 0,-6.3603134 5.15605675,-11.51637357 11.51636845,-11.51637357 6.360313,0 11.516374,5.15605517 11.516374,11.51637357 z" fill="#000080" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0.967"/> - <g transform="matrix(0.04520444,0,0,0.04520444,3.0214508,-10.289896)" id="g24" stroke="#000000" stroke-width="7.62"> - <path d="m 41.6875,328.15625 0,231.09375 71.71875,0 0,-93.8125 6.3125,0 c 6.5152,10e-5 13.95135,0.18768 17.46875,5.375 l 67.5157,99.56963 -60.84375,87.625 69.5,0 36.4375,-53.90625 30.875,53.90625 74.875,0 -61.15625,-87.625 57.0625,-79.78125 -70.78125,0 -30.875,46.6875 c -26.84406,-34.64846 -28.95636,-45.20921 -55.3907,-80.03838 10.61345,-2.41686 18.96735,-5.47814 25.0625,-9.15625 9.56258,-5.77958 17.09783,-13.29356 22.5625,-22.59375 5.46467,-9.30019 8.18727,-20.36691 8.1875,-33.1875 -2.3e-4,-14.7118 -3.57316,-27.19146 -10.71875,-37.4375 -7.14559,-10.24604 -16.55446,-17.2792 -28.21875,-21.0625 -11.66429,-3.7833 -28.52595,-5.65602 -50.59375,-5.65625 l -119,0 z m 71.71875,46.65625 31.375,0 c 13.03047,1.8e-4 21.896,2.00693 26.625,6 4.729,3.99307 7.09359,9.69535 7.09375,17.15625 -1.6e-4,5.04427 -1.50522,9.51824 -4.5,13.40625 -2.9951,3.88831 -6.86505,6.30438 -11.59375,7.25 -9.35275,2.10185 -15.64872,3.15639 -18.90625,3.15625 l -30.09375,0 0,-46.96875 z" id="path26" inkscape:connector-curvature="0" fill="#ffffff"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/89-1.svg b/htdocs/public/symbols/svgicons/89-1.svg deleted file mode 100755 index 6ad5e26c2d05f81caba28c6640875043a1281d70..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/89-1.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" viewBox="0 0 24.000001 24.000001" version="1.1"> - <metadata id="metadata7399"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <path inkscape:connector-curvature="0" d="m 22.936001,1052.3622 c -0.473761,0 -0.935763,-0.1113 -1.345204,-0.298 -0.417842,-0.1985 -0.892324,-0.3137 -1.386966,-0.3137 -0.491761,0 -0.965283,0.1149 -1.383845,0.3137 -0.414961,0.1867 -0.871923,0.298 -1.350965,0.298 -0.473762,0 -0.937203,-0.1113 -1.345205,-0.298 -0.420001,-0.1985 -0.894243,-0.3137 -1.389125,-0.3137 -0.489602,0 -0.964083,0.1149 -1.383365,0.3137 -0.413522,0.1867 -0.872163,0.298 -1.350965,0.298 -0.479762,0 -0.936484,-0.1113 -1.345685,-0.298 -0.420001,-0.1985 -0.894723,-0.3137 -1.387445,-0.3137 -0.494642,0 -0.969364,0.1149 -1.386965,0.3137 -0.410642,0.1867 -0.869523,0.298 -1.349285,0.298 -0.475922,0 -0.936004,-0.1113 -1.347125,-0.298 -0.420722,-0.1985 -0.893763,-0.3137 -1.387445,-0.3137 -0.492002,0 -0.965524,0.1149 -1.385766,0.3137 -0.411601,0.1867 -0.867603,0.298 -1.346645,0.298 v -2.0438 c 0.479042,0 0.935044,-0.1099 1.346645,-0.2981 0.420242,-0.1922 0.894004,-0.3062 1.385766,-0.3062 0.493682,0 0.966723,0.1147 1.387445,0.3062 0.411121,0.1882 0.871203,0.2981 1.347125,0.2981 0.479042,0 0.938643,-0.1099 1.349285,-0.2981 0.417841,-0.1922 0.892323,-0.3062 1.386965,-0.3062 0.492962,0 0.967444,0.1147 1.387445,0.3062 0.409201,0.1882 0.865923,0.2981 1.345685,0.2981 0.478802,0 0.937203,-0.1099 1.350725,-0.2981 0.419281,-0.1922 0.894003,-0.3062 1.383365,-0.3062 0.494882,0 0.969124,0.1147 1.389125,0.3062 0.408002,0.1882 0.871683,0.2981 1.345205,0.2981 0.479042,0 0.936004,-0.1099 1.350965,-0.2981 0.418322,-0.1922 0.892084,-0.3062 1.383845,-0.3062 0.494642,0 0.969124,0.1147 1.386965,0.3062 0.409442,0.1882 0.871444,0.2981 1.345205,0.2981 v 2.0438 h 2.4e-4 z" id="path3" fill="#333333"/> - <path inkscape:connector-curvature="0" d="m 15.339493,1032.0001 c 3.664814,1.7227 8.01651,6.3156 7.445308,11.8267 h -7.445308 v -11.8267 l 0,0 z" id="path5" fill="#808080"/> - <path inkscape:connector-curvature="0" d="m 21.211115,1044.939 -3.398653,0 -13.168608,0 c -0.979148,0 -1.851739,2.6193 -2.55001,3.4896 1.279342,-0.9148 2.921291,-0.3458 3.090252,-0.2635 0.411121,0.181 0.871203,0.2926 1.347125,0.2926 0.479762,0 0.939363,-0.1116 1.349285,-0.2926 0.417841,-0.1975 0.892323,-0.3137 1.386965,-0.3137 0.492962,0 0.967444,0.1159 1.387445,0.3137 0.409681,0.181 0.866643,0.2926 1.345685,0.2926 0.478802,0 0.937203,-0.1116 1.350725,-0.2926 0.420002,-0.1975 0.894003,-0.3137 1.383365,-0.3137 0.494882,0 0.969604,0.1159 1.389125,0.3137 0.408002,0.181 0.871683,0.2926 1.345205,0.2926 0.0924,0 0.180241,-0.023 0.266401,-0.033 0.01056,0 0.01056,0.01 0.02136,0.01 0.06048,0 0.104641,-0.027 0.164401,-0.027 0.10896,-0.015 0.217441,-0.028 0.327361,-0.054 0.979684,-0.2049 1.612086,-0.976 1.612086,-0.976 l 1.905127,-2.438 -0.554162,0 0,0 -4.8e-4,0 z" id="path7" sodipodi:nodetypes="cccccscscscscscscccccccc" fill="#165016"/> - <path inkscape:connector-curvature="0" d="m 14.199249,1028.3785 c -0.03048,-0.022 -0.07056,-0.025 -0.10224,0.011 -2.4e-4,0 -7.2e-4,0 -0.0012,0 -4.8e-4,0 -9.6e-4,0 -0.0014,0 -4.151295,5.1241 -8.302831,10.2478 -12.454126,15.3721 -0.04704,0.058 -0.02112,0.1529 0.06336,0.1529 4.151295,0 8.302831,0 12.454366,0 0.04896,0 0.08976,-0.041 0.08976,-0.09 0,-5.1241 0,-10.2481 0,-15.3719 2.4e-4,-0.039 -0.02112,-0.064 -0.04848,-0.077 z" id="path9" fill="#808080"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/89-2.svg b/htdocs/public/symbols/svgicons/89-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/89-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/90-1.svg b/htdocs/public/symbols/svgicons/90-1.svg deleted file mode 100755 index 907b537d2b22e132a938a791e6fd6eb7e3c3e652..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/90-1.svg +++ /dev/null @@ -1,102 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" height="24" width="24" version="1.1"> - <metadata id="metadata200"/> - <g id="g4353" transform="matrix(0.11470234,0,0,0.11470234,1.3941528e-4,2.2500365)"> - <g id="g4" fill="#666666"> - <path id="path6" d="m 108.812,10.5291 0,146.377 c 31.3021,-18.1855 64.5445,-16.3965 99.2748,0.44656 l 0,-145.183 c -34.432,-16.3981 -67.376,-15.5036 -99.275,-1.6409" inkscape:connector-curvature="0"/> - <path id="path8" d="m 87.3481,20.8139 0,18.4837 18.4837,-9.6884 0,-17.7389 -18.4837,8.94367" inkscape:connector-curvature="0"/> - <path id="path10" d="m 87.3481,41.9797 0,18.4837 18.4837,-9.6884 0,-17.8873 -18.4837,9.09206" inkscape:connector-curvature="0"/> - <path id="path12" d="m 87.3481,62.8487 0,18.4837 18.4837,-9.54 0,-17.8873 -18.4837,8.94367" inkscape:connector-curvature="0"/> - <path id="path14" d="m 87.3481,84.0159 0,18.4837 18.4837,-9.68839 0,-17.7403 -18.4837,8.94506" inkscape:connector-curvature="0"/> - <path id="path16" d="m 87.3481,104.884 0,18.3353 18.4837,-9.5414 0,-17.8859 -18.4837,9.09205" inkscape:connector-curvature="0"/> - <path id="path18" d="m 87.3481,126.347 0,18.4823 18.4837,-9.53723 0,-17.8873 -18.4837,8.94228" inkscape:connector-curvature="0"/> - <path id="path20" d="m 87.3481,147.515 0,18.4837 18.4837,-9.68839 0,-17.7403 -18.4837,8.94505" inkscape:connector-curvature="0"/> - <path id="path22" d="m 66.4819,27.2238 17.1398,-8.64689 0,16.696 -17.1398,8.6455 0,-16.6947" inkscape:connector-curvature="0"/> - <path id="path24" d="m 66.4819,48.5394 17.1398,-8.6455 0,16.6947 -17.1398,8.6455 0,-16.6947" inkscape:connector-curvature="0"/> - <path id="path26" d="m 66.4819,68.8107 17.1398,-8.6455 0,16.696 -17.1398,8.64411 0,-16.6947" inkscape:connector-curvature="0"/> - <path id="path28" d="m 66.4819,89.9779 17.1398,-8.6455 0,16.6947 -17.1398,8.79527 0,-16.8444" inkscape:connector-curvature="0"/> - <path id="path30" d="m 66.4819,111.293 17.1398,-8.6455 0,16.6947 -17.1398,8.79527 0,-16.8444" inkscape:connector-curvature="0"/> - <path id="path32" d="m 66.4819,131.716 17.1398,-8.64827 0,16.696 -17.1398,8.79389 0,-16.8417" inkscape:connector-curvature="0"/> - <path id="path34" d="m 66.4819,152.88 17.1398,-8.64411 0,16.6947 -17.1398,8.64134 0,-16.6919" inkscape:connector-curvature="0"/> - <path id="path36" d="m 47.9982,26.4791 14.6061,-6.85788 0,14.6075 -14.6061,7.00765 0,-14.7573" inkscape:connector-curvature="0"/> - <path id="path38" d="m 47.9982,47.9417 14.6061,-7.00349 0,14.7559 -14.6061,7.00626 0,-14.7586" inkscape:connector-curvature="0"/> - <path id="path40" d="m 47.9982,68.2143 14.6061,-6.85649 0,14.6089 -14.6061,7.00488 0,-14.7573" inkscape:connector-curvature="0"/> - <path id="path42" d="m 47.9982,89.3815 14.6061,-6.85649 0,14.6075 -14.6061,7.00627 0,-14.7573" inkscape:connector-curvature="0"/> - <path id="path44" d="m 47.9982,110.847 14.6061,-7.00765 0,14.7586 -14.6061,7.00488 0,-14.7559" inkscape:connector-curvature="0"/> - <path id="path46" d="m 47.9982,131.12 14.6061,-7.00766 0,14.7586 -14.6061,6.8551 0,-14.6061" inkscape:connector-curvature="0"/> - <path id="path48" d="m 47.9982,152.136 14.6061,-6.85649 0,14.6075 -14.6061,7.00627 0,-14.7573" inkscape:connector-curvature="0"/> - <path id="path50" d="m 30.8542,37.8067 11.9254,-5.36565 0,-10.8811 -11.9254,5.66381 0,10.5829" inkscape:connector-curvature="0"/> - <path id="path52" d="m 30.8542,59.1223 11.9254,-5.36565 0,-10.8811 -11.9254,5.66381 0,10.5829" inkscape:connector-curvature="0"/> - <path id="path54" d="m 30.8542,79.395 11.9254,-5.36565 0,-11.0322 -11.9254,5.81359 0,10.5843" inkscape:connector-curvature="0"/> - <path id="path56" d="m 30.8542,100.561 11.9254,-5.36704 0,-10.8825 -11.9254,5.66659 0,10.5829" inkscape:connector-curvature="0"/> - <path id="path58" d="m 30.8542,122.026 11.9254,-5.51542 0,-10.8811 -11.9254,5.66381 0,10.7327" inkscape:connector-curvature="0"/> - <path id="path60" d="m 30.8542,142.447 11.9254,-5.51543 0,-10.8811 -11.9254,5.6652 0,10.7313" inkscape:connector-curvature="0"/> - <path id="path62" d="m 30.8542,163.463 11.9254,-5.36565 0,-10.8811 -11.9254,5.66382 0,10.5829" inkscape:connector-curvature="0"/> - <path id="path64" d="m 14.7559,20.2175 8.64411,-5.21587 0,9.09206 -8.64411,4.9177 0,-8.79389" inkscape:connector-curvature="0"/> - <path id="path66" d="m 14.7559,41.5331 8.64411,-5.21587 0,9.24045 -8.64411,4.7707 0,-8.79528" inkscape:connector-curvature="0"/> - <path id="path68" d="m 14.7559,61.8058 8.64411,-5.21726 0,9.24184 -8.64411,4.9177 0,-8.94228" inkscape:connector-curvature="0"/> - <path id="path70" d="m 14.7559,82.9716 8.64411,-5.21726 0,9.24184 -8.64411,4.91909 0,-8.94367" inkscape:connector-curvature="0"/> - <path id="path72" d="m 14.7559,104.434 8.64411,-5.21448 0,9.09206 -8.64411,4.91909 0,-8.79667" inkscape:connector-curvature="0"/> - <path id="path74" d="m 14.7559,124.708 8.64411,-5.21587 0,9.24045 -8.64411,4.91909 0,-8.94367" inkscape:connector-curvature="0"/> - <path id="path76" d="m 14.7559,145.875 8.64411,-5.21726 0,9.24045 -8.64411,4.77209 0,-8.79528" inkscape:connector-curvature="0"/> - <path id="path78" d="M 3.12992e-6,15.2985 6.70671,11.8702 l 0,6.55971 L 0,21.41021 0,15.29845" inkscape:connector-curvature="0"/> - <path id="path80" d="M 3.12992e-6,36.4656 6.70671,33.1858 l 0,6.55832 L 0,42.7258 0,36.46565" inkscape:connector-curvature="0"/> - <path id="path82" d="M 3.12992e-6,56.7369 6.70671,53.6083 l 0,6.55693 L 0,62.99714 0,56.73699" inkscape:connector-curvature="0"/> - <path id="path84" d="M 3.12992e-6,77.9041 6.70671,74.6243 l 0,6.55693 L 0,84.1643 0,77.90415" inkscape:connector-curvature="0"/> - <path id="path86" d="M 3.12992e-6,99.3695 6.70671,96.0896 l 0,6.40992 L 0,105.47982 0,99.36945" inkscape:connector-curvature="0"/> - <path id="path88" d="M 3.12992e-6,119.791 6.70671,116.511 l 0,6.40993 L 0,125.90261 0,119.79085" inkscape:connector-curvature="0"/> - <path id="path90" d="M 3.12992e-6,140.956 6.70671,137.528 l 0,6.55832 L 0,147.068 0,140.95624" inkscape:connector-curvature="0"/> - </g> - <path d="m 1.14772,141.389 6.70671,-3.42824 0,6.55832 -6.70671,2.98168 0,-6.11176" id="path94" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 1.14772,15.7315 6.70671,-3.42824 0,6.55971 -6.70671,2.9803 0,-6.11176" id="path96" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 1.14772,78.3372 6.70671,-3.27985 0,6.55693 -6.70671,2.98307 0,-6.26015" id="path98" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 109.96,10.9622 0,146.377 c 31.3021,-18.1855 64.5445,-16.3965 99.2748,0.44656 l 0,-145.183 c -34.433,-16.3981 -67.377,-15.5036 -99.275,-1.6408" id="path100" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 15.9036,146.308 8.64411,-5.21725 0,9.24044 -8.64411,4.77209 0,-8.79528" id="path102" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 15.9036,20.6506 8.64411,-5.21587 0,9.09206 -8.64411,4.9177 0,-8.79389" id="path104" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 15.9036,83.4047 8.64411,-5.21726 0,9.24184 -8.64411,4.91908 0,-8.94366" id="path106" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 32.0019,100.994 11.9254,-5.36704 0,-10.8825 -11.9254,5.66658 0,10.5829" id="path112" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 32.0019,163.896 11.9254,-5.36565 0,-10.8811 -11.9254,5.66382 0,10.5829" id="path114" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 32.0019,38.2398 11.9254,-5.36565 0,-10.8811 -11.9254,5.66381 0,10.5829" id="path116" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 49.1459,152.569 14.6061,-6.85649 0,14.6075 -14.6061,7.00627 0,-14.7573" id="path118" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 49.1459,26.9121 14.6061,-6.85788 0,14.6075 -14.6061,7.00765 0,-14.7573" id="path120" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 49.1459,89.8146 14.6061,-6.85648 0,14.6075 -14.6061,7.00627 0,-14.7573" id="path122" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 67.6296,153.313 17.1398,-8.64411 0,16.6947 -17.1398,8.64134 0,-16.6919" id="path124" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 67.6296,27.6569 17.1398,-8.64689 0,16.696 -17.1398,8.6455 0,-16.6947" id="path126" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 67.6296,90.4109 17.1398,-8.6455 0,16.6947 -17.1398,8.79527 0,-16.8444" id="path128" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,105.317 0,18.3353 18.4837,-9.54139 0,-17.886 -18.4837,9.09206" id="path130" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,126.781 0,18.4823 18.4837,-9.53723 0,-17.8873 -18.4837,8.94229" id="path132" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,147.948 0,18.4837 18.4837,-9.6884 0,-17.7403 -18.4837,8.94505" id="path134" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,21.2469 0,18.4837 18.4837,-9.6884 0,-17.7389 -18.4837,8.94367" id="path136" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,42.4127 0,18.4837 18.4837,-9.6884 0,-17.8873 -18.4837,9.09206" id="path138" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,63.2818 0,18.4837 18.4837,-9.54 0,-17.8873 -18.4837,8.94367" id="path140" inkscape:connector-curvature="0" fill="#231f20"/> - <path d="m 88.4958,84.4489 0,18.4837 18.4837,-9.68839 0,-17.7403 -18.4837,8.94506" id="path142" inkscape:connector-curvature="0" fill="#231f20"/> - <g id="g144" fill="#0000fe"> - <path id="path146" d="m 1.14772,120.224 6.70671,-3.27985 0,6.40993 -6.70671,2.98168 0,-6.11176" inkscape:connector-curvature="0"/> - <path id="path148" d="m 1.14772,99.8025 6.70671,-3.27985 0,6.40992 -6.70671,2.9803 0,-6.11037" inkscape:connector-curvature="0"/> - <path id="path150" d="m 109.811,91.9018 c 12.2221,-5.96337 23.253,-8.6455 33.2409,-9.39022 l 0,44.1192 c -11.7756,2.08856 -23.1046,5.22003 -33.2409,9.98933 l 0,-44.7183" inkscape:connector-curvature="0"/> - <path id="path152" d="m 15.9036,104.867 8.64411,-5.21448 0,9.09206 -8.64411,4.91909 0,-8.79667" inkscape:connector-curvature="0"/> - <path id="path154" d="m 15.9036,125.141 8.64411,-5.21587 0,9.24045 -8.64411,4.91909 0,-8.94367" inkscape:connector-curvature="0"/> - <path id="path156" d="m 32.0019,122.459 11.9254,-5.51542 0,-10.8811 -11.9254,5.66381 0,10.7327" inkscape:connector-curvature="0"/> - <path id="path158" d="m 32.0019,142.88 11.9254,-5.51543 0,-10.8811 -11.9254,5.6652 0,10.7313" inkscape:connector-curvature="0"/> - <path id="path160" d="m 49.1459,111.28 14.6061,-7.00765 0,14.7586 -14.6061,7.00488 0,-14.7559" inkscape:connector-curvature="0"/> - <path id="path162" d="m 49.1459,131.553 14.6061,-7.00766 0,14.7586 -14.6061,6.8551 0,-14.6061" inkscape:connector-curvature="0"/> - <path id="path164" d="m 67.6296,111.726 17.1398,-8.64549 0,16.6947 -17.1398,8.79527 0,-16.8444" inkscape:connector-curvature="0"/> - <path id="path166" d="m 67.6296,132.149 17.1398,-8.64827 0,16.696 -17.1398,8.79389 0,-16.8417" inkscape:connector-curvature="0"/> - </g> - <path id="path168" d="m 156.019,19.7575 0,47.2507 13.1194,0 c 5.81221,0 15.3522,2.98168 19.675,4.62092 l 0,-46.6557 c -10.882,-4.6196 -21.909,-6.2602 -32.794,-5.2159" inkscape:connector-curvature="0" fill="#007f00"/> - <g id="g170" fill="#fe0000"> - <path id="path172" d="m 1.14772,36.8987 6.70671,-3.27985 0,6.55832 -6.70671,2.98168 0,-6.26015" inkscape:connector-curvature="0"/> - <path id="path174" d="m 1.14772,57.17 6.70671,-3.12869 0,6.55693 -6.70671,2.83191 0,-6.26015" inkscape:connector-curvature="0"/> - <path id="path176" d="m 109.811,31.3833 c 13.1166,-5.81359 23.8493,-8.94367 33.2409,-9.54 l 0,46.2092 c -11.1792,0.893119 -22.2101,4.32275 -33.2409,9.39023 l 0,-46.0594" inkscape:connector-curvature="0"/> - <path id="path178" d="m 15.9036,41.9662 8.64411,-5.21587 0,9.24045 -8.64411,4.7707 0,-8.79528" inkscape:connector-curvature="0"/> - <path id="path180" d="m 15.9036,62.2389 8.64411,-5.21726 0,9.24184 -8.64411,4.9177 0,-8.94228" inkscape:connector-curvature="0"/> - <path id="path182" d="m 32.0019,59.5553 11.9254,-5.36565 0,-10.8811 -11.9254,5.66381 0,10.5829" inkscape:connector-curvature="0"/> - <path id="path184" d="m 32.0019,79.828 11.9254,-5.36565 0,-11.0322 -11.9254,5.81359 0,10.5843" inkscape:connector-curvature="0"/> - <path id="path186" d="m 49.1459,48.3747 14.6061,-7.00349 0,14.7559 -14.6061,7.00627 0,-14.7586" inkscape:connector-curvature="0"/> - <path id="path188" d="m 49.1459,68.6474 14.6061,-6.85649 0,14.6089 -14.6061,7.00488 0,-14.7573" inkscape:connector-curvature="0"/> - <path id="path190" d="m 67.6296,48.9724 17.1398,-8.6455 0,16.6947 -17.1398,8.6455 0,-16.6947" inkscape:connector-curvature="0"/> - <path id="path192" d="m 67.6296,69.2437 17.1398,-8.6455 0,16.696 -17.1398,8.64411 0,-16.6947" inkscape:connector-curvature="0"/> - </g> - <path id="path194" d="m 156.019,80.5728 0,45.4631 c 12.6715,-0.59634 22.3599,1.34245 32.7944,4.77069 l 0,-45.911 c -10.882,-4.3232 -21.909,-5.6643 -32.794,-4.3232" inkscape:connector-curvature="0" fill="#fefe00"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/90-2.svg b/htdocs/public/symbols/svgicons/90-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/90-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/91-1.svg b/htdocs/public/symbols/svgicons/91-1.svg deleted file mode 100755 index 534203f19a844bc8713795a6017578ca51da864d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/91-1.svg +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3010"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g2997" transform="matrix(1.2,0,0,1.2,-2.4,1025.9622)"> - <path id="path4" d="M 6,12 C 6,12 6.8,10.8 7.4,9.9 7.8,9.3 8.3,8.9 9,8.7 l 2.1,-0.6 c 1.2,-0.3 2.4,0.3 2.8,1.4 l 0.6,1.3 c 0.3,0.8 0.9,1.3 1.7,1.6 L 18,13" stroke-miterlimit="10" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-width="2"/> - <circle id="circle6" r="2" cy="4" cx="13"/> - <path id="path8" d="m 10.6,8.1 -1,4.6 c -0.2,0.7 0.1,1.4 0.5,1.9 l 3.4,3.7 -1,-4.7 0.9,-4.1 -0.7,-1.4 h -2.1 z" inkscape:connector-curvature="0"/> - <g id="g10"> - <path id="path12" d="m 14.6,22 h 2.1 c -0.4,-1 -1.4,-3.5 -1.8,-4.7 l -2.9,-4.2 -1.6,1.2 2.7,3.6 1.5,4.1 z" inkscape:connector-curvature="0"/> - <polygon id="polygon14" points="10.7,17 9.2,15.3 8.3,18.2 5.3,22 7.6,22 9.9,19.4 "/> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/91-2.svg b/htdocs/public/symbols/svgicons/91-2.svg deleted file mode 100755 index 3b64f6e28bebff3f35a48f729ec632fc1ecf2744..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/91-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <path inkscape:connector-curvature="0" d="m 21.86501,1044.7757 c -0.04762,0 -0.09474,0 -0.141619,0.012 -0.596033,0.058 -1.129891,0.4887 -1.447665,1.1754 -0.11377,0.2458 -0.355613,0.3225 -0.540213,0.171 -0.120461,-0.098 -0.186274,-0.27 -0.186358,-0.4454 0,-0.093 0.01835,-0.1884 0.05795,-0.2737 0.469134,-1.0142 1.270088,-1.6342 2.157386,-1.6779 -0.07522,-3.3405 -2.09149,-6.0311 -4.598384,-6.1414 0.153326,0.6066 0.26346,1.2408 0.324463,1.8972 0.02664,0.2865 -0.126231,0.5475 -0.341438,0.5831 -0.0039,7e-4 -0.0078,4e-4 -0.01171,0 -0.01238,0 -0.0248,0 -0.03696,0 -0.195347,0 -0.364602,-0.1938 -0.38923,-0.4585 -0.06372,-0.6862 -0.187403,-1.3452 -0.363223,-1.9691 -0.402484,-1.4284 -1.079215,-2.67 -1.940213,-3.6202 -0.117032,-0.129 -0.237493,-0.2529 -0.36109,-0.3709 -1.072609,-1.0246 -2.384467,-1.624 -3.788982,-1.624 -0.120002,0 -0.239418,0 -0.358122,0.013 -0.6572047,0.047 -1.2936286,0.2264 -1.8921288,0.52 -1.6018266,0.786 -2.9317062,2.3937 -3.6608279,4.5095 0.096461,-0.012 0.1935906,-0.012 0.2913894,-0.012 1.0329711,0 2.0294401,0.4053 2.8817406,1.1722 0.1121822,0.1008 0.1726845,0.2655 0.17281,0.4331 8.35e-5,0.1007 -0.021742,0.203 -0.067318,0.2928 -0.1214227,0.2393 -0.3654807,0.3021 -0.5451478,0.1403 -0.7219718,-0.6496 -1.5664116,-0.9929 -2.4420433,-0.9929 -0.2468594,0 -0.4889104,0.027 -0.7247314,0.082 -0.068196,0.048 -0.1468027,0.07 -0.2264132,0.058 -0.027805,0.014 -0.055527,0.017 -0.083122,0.025 -1.9109443,0.6203 -3.33373081,2.9184 -3.33373081,5.651 0,5e-4 -4.182e-5,0 -4.182e-5,0 7.1082e-4,3.4998 2.13183823,6.3369 4.76074043,6.3369 l 11.9753576,0 4.466298,0 c 1.246674,0 2.257526,-1.3459 2.257526,-3.006 0,-1.3693 -0.836662,-2.4832 -1.86495,-2.4832 z" id="path3614" fill="#b3b3b3" stroke="#808080" stroke-width="0.5"/> - <text x="2.684" y="1048.01" id="text3355" sodipodi:linespacing="125%" font-family="sans-serif" fill="#000080" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="9.212"><tspan sodipodi:role="line" id="tspan3357" x="2.684" y="1048.01">WC</tspan> - </text> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/91-3.svg b/htdocs/public/symbols/svgicons/91-3.svg deleted file mode 100755 index 4174a33bbe25d3f8bf3d6aab1395dc75168c73f4..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/91-3.svg +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - version="1.1" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="91-3.svg"> - <defs - id="defs15" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview13" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="12" - inkscape:cy="12" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="layer1" /> - <metadata - id="metadata3010"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1028.3622)"> - <g - id="g2997" - transform="matrix(1.2,0,0,1.2,-6.2015396,1025.9622)"> - <path - id="path4" - d="M 6,12 C 6,12 6.8,10.8 7.4,9.9 7.8,9.3 8.3,8.9 9,8.7 l 2.1,-0.6 c 1.2,-0.3 2.4,0.3 2.8,1.4 l 0.6,1.3 c 0.3,0.8 0.9,1.3 1.7,1.6 L 18,13" - stroke-miterlimit="10" - inkscape:connector-curvature="0" - style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10" /> - <circle - id="circle6" - r="2" - cy="4" - cx="13" /> - <path - id="path8" - d="m 10.6,8.1 -1,4.6 c -0.2,0.7 0.1,1.4 0.5,1.9 l 3.4,3.7 -1,-4.7 0.9,-4.1 -0.7,-1.4 -2.1,0 z" - inkscape:connector-curvature="0" /> - <g - id="g10"> - <path - id="path12" - d="m 14.6,22 2.1,0 c -0.4,-1 -1.4,-3.5 -1.8,-4.7 l -2.9,-4.2 -1.6,1.2 2.7,3.6 1.5,4.1 z" - inkscape:connector-curvature="0" /> - <polygon - id="polygon14" - points="9.2,15.3 8.3,18.2 5.3,22 7.6,22 9.9,19.4 10.7,17 " /> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/92-1.svg b/htdocs/public/symbols/svgicons/92-1.svg deleted file mode 100755 index 632c136e06f1ecc3856b1840849755a3c1d31463..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/92-1.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 24 24" width="24" height="24"> - <path inkscape:connector-curvature="0" d="M 11.977044,2.0093513 C 11.566241,1.9828154 11.146799,2.1767394 10.883729,2.5250364 L 0.05727741,20.713545 c -0.07304604,0.274732 -0.07581064,0.44968 -0.01066964,0.70843 0.0623332,0.247518 0.3058344,0.502812 0.53862277,0.564584 l 22.54621646,0.0065 c 0.140822,-0.02549 0.335208,-0.09158 0.430673,-0.146869 0.347304,-0.201298 0.582295,-0.737372 0.336073,-1.144719 L 12.938262,2.5587301 C 12.778002,2.2935872 12.455321,2.1025703 12.15251,2.0348375 12.095058,2.0218784 12.035878,2.0129798 11.97713,2.0091785 Z M 11.926934,5.4192321 20.327445,19.51051 3.6845243,19.56451 11.926934,5.4192361 Z" id="foo"/> - <path inkscape:connector-curvature="0" d="M 11.901229,3.1629299 22.397442,20.769604 1.6025581,20.83707 11.901229,3.1629299 Z" id="white_bg" fill="#ffff00"/> - <metadata id="metadata10"/> - <text x="5.821" y="19.554" id="text3335" sodipodi:linespacing="125%" font-family="sans-serif" word-spacing="0" line-height="125%" font-weight="bold" letter-spacing="0" font-size="8.125"><tspan sodipodi:role="line" id="tspan3337" x="5.821" y="19.554">DF</tspan> - </text> -</svg> diff --git a/htdocs/public/symbols/svgicons/92-2.svg b/htdocs/public/symbols/svgicons/92-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/92-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/93-1.svg b/htdocs/public/symbols/svgicons/93-1.svg deleted file mode 100755 index 2c842e053663ea3dd3172a660e145570d049acdd..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/93-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="-0.258 -0.548 24.000001 24"> - <metadata id="metadata15"/> - <path inkscape:connector-curvature="0" id="path7" d="m 2.6059382,-0.06530034 c -1.3113268,0 -2.37826117,1.07281774 -2.37826117,2.38552874 l 0,18.2635426 c 0,1.312711 1.06693437,2.379507 2.37826117,2.379507 l 18.2674628,0 c 1.312881,0 2.379815,-1.066796 2.379815,-2.379507 l 0,-18.2635426 c 0,-1.312711 -1.066934,-2.38552874 -2.379815,-2.38552874 l -18.2674628,0 z" fill="#231f20"/> - <path inkscape:connector-curvature="0" id="path5" d="m 20.873401,-0.54800036 -18.2674628,0 c -1.5829172,0 -2.86393777,1.28376838 -2.86393777,2.86822876 l 0,18.2635426 c 0,1.582712 1.28102057,2.868229 2.86393777,2.868229 l 18.2674628,0 c 1.582917,0 2.8686,-1.285322 2.8686,-2.868229 l 0,-18.2635426 c -1.94e-4,-1.58426614 -1.285683,-2.86822876 -2.8686,-2.86822876 z" fill="#000080"/> - <path inkscape:connector-curvature="0" id="path9" d="m 19.990052,16.386321 -4.96614,-4.969965 4.965946,-4.9699651 0,9.9399301 z m -15.5097907,0.943838 4.9750769,-4.965303 0.212532,0.203375 c 1.1747548,1.12002 3.0415008,1.12002 4.1661338,0 l 0.214086,-0.212504 4.998001,4.974432 -14.5658297,0 z M 3.587782,6.4463909 8.5463458,11.416356 3.5788456,16.386321 3.587782,6.4463909 z M 19.03696,5.4978902 12.927926,11.601472 c -0.620695,0.625276 -1.731729,0.611484 -2.370685,-0.02428 l -6.0678489,-6.0793008 14.5475679,0 z M 2.2385724,4.1412798 c 0,0.5691392 0,13.9522642 0,14.5258712 0.5783437,0 18.5679996,0 19.1463426,0 0,-0.573607 0,-13.9569262 0,-14.5258712 -0.578343,0 -18.5679989,0 -19.1463426,0 z" fill="#ffffff"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/93-2.svg b/htdocs/public/symbols/svgicons/93-2.svg deleted file mode 100755 index 6afb3ddd9cfb3b2b8eea9ca5d0804e7d5e2522f2..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/93-2.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4305"/> - <g inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 1"> - <path d="M 3.2869998,12 C 20.713,12 20.713,12 20.713,12" id="path4312" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.722"/> - <path d="M 12,20.473983 C 12,3.5260173 12,3.5260173 12,3.5260173" id="path4312-3" inkscape:connector-curvature="0" fill-rule="evenodd" stroke="#000000" stroke-linecap="round" stroke-width="2.687"/> - <path id="path4314" sodipodi:type="arc" sodipodi:cx="12" sodipodi:cy="12.026115" sodipodi:rx="3.1077249" sodipodi:ry="3.1077249" sodipodi:start="3.1415927" sodipodi:end="9.423818" sodipodi:open="true" d="m 8.8922751,12.026115 a 3.1077249,3.1077249 0 1 1 1.4e-6,0.003" transform="translate(0,-0.02611542)" fill="#cb0000" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-1.svg b/htdocs/public/symbols/svgicons/94-1.svg deleted file mode 100755 index dc9e489dfaa46fcbe1ea3c02ffd1965738228dc6..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-1.svg +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="94-1.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="27.812867" - inkscape:cx="16.996021" - inkscape:cy="11.227399" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - inkscape:connector-curvature="0" - style="fill:#333333;fill-rule:evenodd" - id="path5724" - d="M 23.852939,15.898417 13.434529,8.1557394 c 0.07711,-1.1961361 0.127255,-5.1254658 0.0821,-5.6212684 -0.378513,-4.1562174 -3.000001,-2.36599271 -3.024321,-0.5110796 -0.0067,0.5073326 -0.0975,4.3898428 -0.106119,6.141825 l -10.282381,7.9227256 -0.02731,2.480306 10.614792,-4.849387 0.383602,6.45448 -3.07804,2.203462 -0.01958,1.623135 4.060667,-1.11389 7.68e-4,0.0134 4.103063,1.048869 -0.04892,-1.621714 -3.117538,-2.151672 0.250846,-6.460284 10.697344,4.659543 -0.0706,-2.475774 z" - sodipodi:nodetypes="ccsccccccccccccccccc" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-2.svg b/htdocs/public/symbols/svgicons/94-2.svg deleted file mode 100755 index 13c80b224ad1e8dee3c96f3ea6574242f9083d31..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-2.svg +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="94-2.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="19.666667" - inkscape:cx="15.507465" - inkscape:cy="16.399191" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - inkscape:connector-curvature="0" - style="fill:#333333" - id="path13" - d="m 12.000001,2.3295018 c -0.10843,8e-7 -0.172538,0.074557 -0.389749,0.6661681 -0.02564,0.06983 -0.0774,0.3676365 -0.0774,0.3676365 2e-6,0 -0.173556,0.0083 -0.21837,0.0083 -0.08664,3.2e-6 -0.203812,0.077251 -0.262599,0.1713784 -0.182379,0.2920431 -0.467145,1.899345 -0.467146,2.6397943 0,0.4595005 -0.0385,0.7348981 -0.110569,0.7905564 -0.06081,0.04697 -0.379711,0.1917754 -0.7076317,0.3206462 C 9.187937,7.52137 9.0428824,7.5348662 4.85735,7.7583642 1.542796,7.9353556 0.49942198,8.0186875 0.34343998,8.1177078 c -0.432501,0.2745545 -0.455019,0.9088912 -0.07463,2.1090722 l 0.196257,0.619177 c 0,0 10.20259802,1.688917 10.20259802,1.688917 l 0.856898,6.27193 -0.226663,0.06358 c -0.12459,0.03449 -0.961589,0.126537 -1.8602956,0.20455 -0.8987071,0.07801 -1.6848407,0.183399 -1.7469648,0.234956 -0.2497381,0.207267 -0.053487,1.840946 0.2211364,1.840946 0.4334372,0 2.0359995,0.215503 2.120127,0.28471 0.06004,0.04942 1.437291,0.234956 1.968098,0.234955 0.530808,10e-7 1.908036,-0.185542 1.968099,-0.234955 0.08416,-0.06919 1.686691,-0.284709 2.120129,-0.28471 0.274619,0 0.470875,-1.633682 0.221133,-1.840947 -0.06216,-0.05153 -0.848254,-0.156939 -1.746962,-0.234955 -0.898707,-0.07801 -1.735705,-0.170054 -1.860296,-0.20455 l -0.226662,-0.06358 0.856896,-6.271931 c 0,0 10.202601,-1.688918 10.202602,-1.688916 L 23.731192,10.22677 C 24.111579,9.0265907 24.08906,8.3922573 23.656561,8.1177011 23.500576,8.0186805 22.457205,7.9353476 19.142651,7.7583572 14.957117,7.5348578 14.812064,7.5213617 14.233462,7.293975 13.905541,7.1651045 13.586645,7.0202984 13.52583,6.9733301 c -0.07206,-0.05566 -0.110569,-0.3310565 -0.110569,-0.790557 0,-0.74045 -0.284764,-2.3477543 -0.467148,-2.6397947 -0.05878,-0.094127 -0.175951,-0.1713818 -0.262596,-0.1713794 -0.04482,-3.2e-6 -0.215607,-0.0083 -0.215607,-0.0083 0,0 -0.05176,-0.2978087 -0.0774,-0.3676357 C 12.175301,2.4040549 12.10843,2.3294986 12,2.3294986 Z" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-3.svg b/htdocs/public/symbols/svgicons/94-3.svg deleted file mode 100755 index ab03ba1ef9ff2b7312fe464755993c24b71e3d9a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-3.svg +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="94-2.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="27.812867" - inkscape:cx="16.996021" - inkscape:cy="11.227399" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - inkscape:connector-curvature="0" - style="fill:#333333;fill-rule:evenodd" - id="path5724" - d="M 23.852939,17.3366 13.434529,9.5939227 c 0.07711,-1.1961361 0.127255,-6.5636491 0.0821,-7.0594517 -0.378513,-4.1562174 -3.000001,-2.36599271 -3.024321,-0.5110796 -0.0067,0.5073326 -0.0975,5.8280261 -0.106119,7.5800083 l -10.282381,7.9227253 -0.02731,2.480306 10.614792,-4.849387 0.383602,5.016297 -3.07804,2.203462 -0.01958,1.623135 4.060667,-1.11389 7.68e-4,0.0134 4.103063,1.048869 -0.04892,-1.621714 -3.117538,-2.151672 0.250846,-5.022101 10.697344,4.659543 -0.0706,-2.475774 z" - sodipodi:nodetypes="ccsccccccccccccccccc" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-68.svg b/htdocs/public/symbols/svgicons/94-68.svg deleted file mode 100755 index e4ebc3f895f58b6d54501da4b5aebaa1296a9a54..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-68.svg +++ /dev/null @@ -1,116 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="94-68.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1865" - inkscape:window-height="1025" - id="namedview7" - showgrid="false" - inkscape:zoom="6.9532165" - inkscape:cx="-40.448274" - inkscape:cy="0.54852928" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3596" - transform="matrix(0.66667404,0,0,0.66667404,15.835203,-1.9387406)"> - <path - inkscape:connector-curvature="0" - class="st0" - d="m -12.75489,19.005988 c 0.569295,0 1.117121,-0.09741 1.62815,-0.272811 0.01739,-0.0059 0.03553,-0.0099 0.05292,-0.01594 l -3.28e-4,-5.62e-4 c 0.0025,-7.03e-4 0.005,-0.0013 0.0073,-0.0022 -0.18328,-0.455389 -0.483232,-0.874731 -0.858043,-1.194043 -0.266577,0.06389 -0.544217,0.09722 -0.830013,0.09722 -1.990727,0 -3.609548,-1.618635 -3.609548,-3.609361 0,-1.987961 1.618821,-3.609502 3.609548,-3.609502 1.990727,0 3.6093613,1.621587 3.6093613,3.609502 0,0.313686 -0.041531,0.619075 -0.1166245,0.91059 0.3065144,0.338342 0.6914036,0.610826 1.1365269,0.806575 0.016078,0.0075 0.031125,0.01645 0.04739,0.02358 l 1.875e-4,-5.16e-4 c 0.00239,0.0011 0.00459,0.0023 0.00698,0.0033 0.2026868,-0.544217 0.313827,-1.129965 0.313827,-1.743556 0,-2.754271 -2.2408508,-4.9976529 -4.9977002,-4.9976529 -2.754223,4.69e-5 -4.997793,2.2434289 -4.997793,4.9976529 0,2.757036 2.24357,4.997699 4.99784,4.997699 z" - style="fill:#333333" - id="path3408" /> - <path - inkscape:connector-curvature="0" - class="st0" - d="m -3.4511287,15.708814 c 0,0 3.75e-4,-1.88e-4 7.032e-4,-1.88e-4 7.5e-4,0.0024 0.0015,0.0048 0.0022,0.0072 0.4664044,-0.197015 0.8744966,-0.496967 1.1856048,-0.880028 -0.06389,-0.266577 -0.097218,-0.544217 -0.097218,-0.827481 0,-1.987961 1.61863443,-3.609502 3.6093612,-3.609502 1.9906798,0 3.6095017,1.621588 3.6095017,3.609502 0,1.990727 -1.6188219,3.609361 -3.6095017,3.609361 -0.31368634,0 -0.61907579,-0.04153 -0.9107778,-0.116625 -0.22757725,0.191718 -0.42754523,0.416577 -0.58846649,0.666513 -0.0974059,0.147187 -0.18145243,0.310734 -0.25870213,0.485577 -0.003469,0.0073 -0.007172,0.01355 -0.0106406,0.02105 l 5.625e-4,1.87e-4 c -0.001078,0.0024 -0.002203,0.0044 -0.003281,0.0068 0.54984164,0.210937 1.14679247,0.324842 1.77139942,0.324842 2.7542707,0 4.9976527,-2.240663 4.9976527,-4.997699 -9.38e-5,-2.754224 -2.2434758,-4.997606 -4.9977464,-4.997606 -2.7570363,0 -4.9976996,2.243382 -4.9976996,4.997653 0,0.575154 0.099422,1.12612 0.2789052,1.640618 0.00656,0.01978 0.011156,0.04027 0.01814,0.05986 z" - style="fill:#333333" - id="path3410" /> - <path - inkscape:connector-curvature="0" - class="st0" - d="m -8.0045956,26.254195 -5.156e-4,1.87e-4 c -7.5e-4,-0.0023 -0.00131,-0.005 -0.00202,-0.0073 -0.4693107,0.172124 -0.8858403,0.449904 -1.2162141,0.808028 0.049969,0.244218 0.077812,0.494154 0.077812,0.752341 0,1.987961 -1.6186347,3.609361 -3.6093617,3.609361 -1.990727,0 -3.609548,-1.6214 -3.609548,-3.609361 0,-1.990914 1.618821,-3.609361 3.609548,-3.609361 0.344061,0 0.677341,0.04978 0.993887,0.141515 0.317718,-0.325921 0.570373,-0.727075 0.742497,-1.183589 0.0031,-0.0077 0.007,-0.015 0.01008,-0.02274 -1.87e-4,-1.4e-4 -1.87e-4,-1.4e-4 -1.87e-4,-1.4e-4 7.03e-4,-0.0024 0.0018,-0.0046 0.0027,-0.007 -0.544216,-0.205405 -1.13287,-0.316405 -1.74904,-0.316405 -2.754223,9.4e-5 -4.997793,2.240711 -4.997793,4.997747 0,2.75427 2.24357,4.997653 4.99784,4.997653 2.7568494,0 4.9977001,-2.243383 4.9977001,-4.997653 0,-0.526779 -0.084984,-1.034715 -0.2362022,-1.512651 -0.00422,-0.01355 -0.00703,-0.02728 -0.011203,-0.04064 z" - style="fill:#333333" - id="path3412" /> - <path - inkscape:connector-curvature="0" - class="st0" - d="m 1.2495252,22.809833 c -0.64377882,0 -1.26271395,0.123234 -1.8279774,0.347155 -0.002719,0.0011 -0.005672,0.0018 -0.008578,0.0029 0,0 0,0 0,1.88e-4 -0.002203,7.5e-4 -0.004781,0.0015 -0.006984,0.0024 0.13884322,0.374624 0.33327997,0.730216 0.59690396,1.035653 0.05278105,0.05822 0.10565584,0.113718 0.16096813,0.169405 0.34152994,-0.11114 0.70809103,-0.169405 1.08566771,-0.169405 1.9906798,0 3.6095017,1.618447 3.6095017,3.609361 0,1.987961 -1.6188219,3.609361 -3.6095017,3.609361 -1.99072673,0 -3.6093612,-1.6214 -3.6093612,-3.609361 0,-0.222093 0.019406,-0.438702 0.058219,-0.649826 -0.2987801,-0.345702 -0.6785599,-0.625122 -1.1196519,-0.828184 -0.027469,-0.01303 -0.052922,-0.02878 -0.080906,-0.0412 0,3.75e-4 -1.875e-4,7.5e-4 -1.875e-4,0.0011 -0.00239,-0.0011 -0.00459,-0.0024 -0.00698,-0.0033 -0.1554369,0.480279 -0.2387803,0.991121 -0.2387803,1.521416 0,2.75427 2.2406632,4.997652 4.9976995,4.997652 2.7542707,0 4.9976527,-2.243382 4.9976527,-4.997652 -4.69e-5,-2.757083 -2.2434289,-4.9977 -4.9976995,-4.9977 z" - style="fill:#333333" - id="path3414" /> - <path - inkscape:connector-curvature="0" - class="st0" - d="M 0.74594881,28.6769 2.2812866,27.141563 c -0.1887649,-0.272109 -3.5054863,-3.296124 -3.6248765,-3.604514 -0.2942801,-0.746903 -0.4110922,-1.57415 -0.4247796,-2.362585 -0.016641,-0.94134 0.108234,-1.971273 0.4969668,-2.854395 0.083859,-0.192843 2.7270674,-2.831617 2.83877,-3.008523 0.012656,-0.01903 0.022734,-0.03881 0.036094,-0.05784 0.00253,-0.0031 0.010785,-0.0062 0.00769,-0.0093 L 0.05640435,13.689443 c -0.191718,0.127781 -2.93800395,2.689915 -3.14912815,2.784414 -0.07214,0.03056 -0.1444682,0.06113 -0.2193742,0.08897 -0.7747001,0.285843 -1.61315,0.421873 -2.4515999,0.421873 -0.6747162,0 -1.3465261,-0.08883 -1.9879611,-0.252702 -0.2332491,-0.05822 -0.4582951,-0.136031 -0.6747162,-0.230343 -0.2414991,-0.10289 -3.1640388,-2.869114 -3.3778818,-3.010676 l -1.560415,1.560463 c 0.14428,0.210937 2.958773,3.080051 3.053085,3.313112 0.02508,0.05278 0.04725,0.105469 0.06666,0.161156 0.5220452,1.427151 0.5414513,3.101285 0.127781,4.556186 -0.039,0.13603 -0.08348,0.272108 -0.136218,0.402467 -0.124875,0.324842 -3.126255,3.293824 -3.32341,3.571417 l 1.538244,1.538244 c 0.266577,-0.183281 3.3983159,-2.996638 3.7037522,-3.113263 0.013922,-0.0057 0.030562,-0.01116 0.044484,-0.01664 0.7802314,-0.28603 1.6159157,-0.419342 2.4516,-0.419342 0.6719974,0 1.3439948,0.08606 1.9852424,0.249936 0.2305303,0.05822 0.449717,0.133312 0.6635599,0.224859 0.2719677,0.116671 3.729859,3.363308 3.93584031,3.157326 z" - style="fill:#333333" - id="path3424" - sodipodi:nodetypes="sccccccscccsccccccccccccsccs" /> - <path - inkscape:connector-curvature="0" - class="st0" - d="m -9.5815114,15.726954 -0.02489,0.02213 c 0.00277,0.0028 0.00553,0.0057 0.00825,0.0057 0.00567,-0.0082 0.011156,-0.01669 0.01664,-0.02784 z" - style="fill:#333333" - id="path3426" /> - <circle - r="2.0134568" - cy="14.0083" - cx="-12.755002" - id="path3479" - style="fill:#333333" /> - <circle - r="2.0134568" - cy="14.008369" - cx="1.2495462" - id="path3479-3" - style="fill:#333333" /> - <circle - r="2.0134568" - cy="27.807472" - cx="1.2495538" - id="path3479-6" - style="fill:#333333" /> - <circle - r="2.0134568" - cy="27.847139" - cx="-12.763877" - id="path3479-7" - style="fill:#333333" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-71.svg b/htdocs/public/symbols/svgicons/94-71.svg deleted file mode 100755 index aa7d339faebce10556e50461b0bd2705984c8b8a..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-71.svg +++ /dev/null @@ -1,66 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="94-71.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="32" - inkscape:cx="6.2227228" - inkscape:cy="14.589176" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3" - transform="matrix(0.25417844,0,0,0.25417844,3.6293682e-4,3.20202)" - style="fill:#333333" /> - <g - id="g3388" - transform="matrix(-0.00411188,-0.0177399,0.0177399,-0.00411188,1.8254364,20.496882)" - style="fill:#333333"> - <path - inkscape:connector-curvature="0" - d="m 14.765,576.732 13.394,5.834 c 0,0 -14.377,5.953 -14.425,6.161 C 13.686,588.933 0,700.341 0,700.341 c 0,0 56.171388,14.76393 58.943388,9.39893 2.772,-5.365 43.074602,-96.35537 43.074602,-96.35537 0,0 144.08575,43.97258 164.40175,50.09958 20.316,6.127 58.97,20.325 58.97,20.325 L 275.487,1069.888 260.77389,1307.8528 c 0,0 83.23646,26.8259 86.02846,16.6599 2.792,-10.167 140.20085,-596.70168 140.20085,-596.70168 0,0 20.429,5.17 39.623,9.07 19.194,3.901 109.1458,11.68398 115.5018,-14.80502 6.355,-26.489 -64.54128,-54.75626 -96.89928,-63.12726 -32.358,-8.37 -39.103,-10.37 -39.103,-10.37 0,0 134.68085,-590.009666 136.10185,-596.451666 2.178,-9.872 -84.32346,-24.019872 -84.32346,-24.019872 C 558.38368,18.105466 465.036,249.822 465.036,249.822 L 340.92026,617.72486 c 0,0 -14.559,-0.299 -61.054,-8.028 -25.032,-4.161 -170.75348,-27.86756 -170.75348,-27.86756 0,0 4.39261,-98.47337 4.71861,-103.82137 C 114.45439,467.77593 56.014,457.62 56.014,457.62 c 0,0 -36.357,106.482 -36.309,106.275 0.048,-0.207 10.062,13.144 10.062,13.144 z" - id="path3390" - style="fill:#333333" - sodipodi:nodetypes="ccccscscccccccccccccscccscc" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-74.svg b/htdocs/public/symbols/svgicons/94-74.svg deleted file mode 100755 index 7ead4782af1167e710501aa880dd40ae4756af46..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-74.svg +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.0" - width="24" - height="24" - viewBox="0 0 24.000001 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="94-74.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1875" - inkscape:window-height="1056" - id="namedview7" - showgrid="false" - inkscape:zoom="13.906433" - inkscape:cx="4.2736353" - inkscape:cy="10.331998" - inkscape:window-x="45" - inkscape:window-y="24" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata8"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - transform="matrix(0.03832955,-0.03832955,0.03832955,0.03832955,-12.977414,15.441768)" - id="g3388" - style="fill:#333333"> - <path - d="m 157.98695,184.38488 15.38788,-16.18471 c 9.01133,-9.01133 24.18529,-5.8854 24.18529,-5.8854 l 45.02946,6.16135 22.80617,-22.31567 c 12.01512,-11.80056 22.86694,6.25375 18.14672,12.47586 l -11.70942,13.61004 48.49336,8.98159 16.46066,-19.18912 c 17.59356,-21.02645 30.68334,-2.08353 22.74478,9.07336 l -10.63664,13.45688 72.86283,9.50247 c 62.65024,-60.29014 88.22733,-85.29891 104.71135,-70.44132 16.59028,14.95339 -12.75624,44.75856 -69.82804,103.5468 l 10.36069,75.06977 15.2651,-12.72081 c 9.01133,-7.50944 25.01187,4.53795 8.49108,20.20051 l -20.99733,19.80177 8.8588,49.13702 13.11954,-10.08475 c 11.586,-9.22589 25.65553,2.97466 9.99297,19.71 l -20.84417,20.99734 c -0.85822,0.64367 6.80502,43.09845 6.80502,43.09845 4.72022,20.8119 -7.01958,28.41564 -7.01958,28.41564 l -14.31509,12.47587 -54.37876,-153.60343 c -4.50567,-13.51701 -15.92502,-28.19577 -35.00611,-26.45363 -10.08411,1.07278 -35.55799,18.2695 -38.99088,22.34606 l -58.97684,56.70849 c -1.50189,1.07278 9.07336,73.72104 9.07336,73.72104 0,2.14556 -18.69861,26.66819 -18.69861,26.66819 l -37.36621,-66.51729 -18.45305,8.58285 10.7898,-16.79799 -67.28375,-37.97951 25.22769,-18.45304 c 12.01512,2.78922 75.00838,9.87019 76.29571,9.22652 0,0 51.29689,-50.87264 54.2256,-53.94965 16.9499,-17.80812 22.65302,-24.46187 25.22769,-33.25865 2.57678,-8.80401 -1.81285,-21.70583 -28.41564,-38.04088 -36.68901,-22.52835 -151.64143,-61.09202 -151.64143,-61.09202 z" - id="path3166" - style="fill:#333333;stroke:none" - inkscape:connector-curvature="0" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-76.svg b/htdocs/public/symbols/svgicons/94-76.svg deleted file mode 100755 index 3c3ec3b60003b927aa492753ec48a596baca4e25..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-76.svg +++ /dev/null @@ -1,982 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - width="24" - height="24" - viewBox="0 0 24 24" - version="1.1" - id="svg5" - inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" - sodipodi:docname="Paraglider.svg" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - <sodipodi:namedview - id="namedview7" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageshadow="2" - inkscape:pageopacity="0.0" - inkscape:pagecheckerboard="0" - inkscape:document-units="px" - showgrid="false" - height="31px" - inkscape:snap-global="true" - inkscape:lockguides="false" - inkscape:snap-to-guides="true" - inkscape:snap-grids="true" - inkscape:snap-others="false" - inkscape:snap-nodes="false" - inkscape:zoom="42.364278" - inkscape:cx="9.9140129" - inkscape:cy="16.192888" - inkscape:window-width="1920" - inkscape:window-height="1137" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="layer1" /> - <defs - id="defs2"> - <inkscape:path-effect - effect="bspline" - id="path-effect8960" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8956" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8952" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8948" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8944" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8940" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8936" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8932" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8928" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8924" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8920" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8916" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8912" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8908" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8904" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8900" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8896" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8892" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8888" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8884" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8880" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8596" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8133" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8129" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect8092" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7918" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7914" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7910" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7906" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7902" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7898" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7894" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7890" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7886" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7882" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7878" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7874" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7870" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7866" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7862" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7858" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7854" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7704" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7700" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7696" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7692" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7468" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7464" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect7257" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect6383" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect5893" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect5319" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - <inkscape:path-effect - effect="bspline" - id="path-effect4762" - is_visible="true" - lpeversion="1" - weight="33.333333" - steps="2" - helper_size="0" - apply_no_weight="true" - apply_with_weight="true" - only_selected="false" /> - </defs> - <g - inkscape:label="Ebene 1" - inkscape:groupmode="layer" - id="layer1"> - <path - style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 0.96892735,14.996352 C 0.92502693,14.652466 0.88098473,14.307469 0.86255026,13.995432 0.84411579,13.683396 0.85145601,13.404468 0.8954117,13.143696 0.93936739,12.882925 1.0201098,12.640698 1.122876,12.394693 1.2256423,12.148689 1.3504261,11.899121 1.4716284,11.711757 1.5928306,11.524392 1.7102742,11.399608 1.8754677,11.238085 2.0406611,11.076563 2.2535269,10.878377 2.4885356,10.69847 2.7235443,10.518563 2.9804518,10.357079 3.2925463,10.20291 3.6046407,10.048741 3.9716512,9.9019369 4.3901208,9.7588061 4.8085905,9.6156753 5.2783641,9.4762112 5.6967409,9.3440788 6.1151177,9.2119464 6.4821283,9.0871628 6.8712847,8.9917724 7.2604411,8.8963819 7.671493,8.83032 8.0642765,8.7899948 8.45706,8.7496697 8.8314108,8.7349892 9.2828075,8.6982569 9.7342042,8.6615245 10.262699,8.6028028 10.725207,8.5734902 c 0.462508,-0.029313 0.858879,-0.029313 1.262594,-0.032992 0.403715,-0.00368 0.814767,-0.011019 1.240552,3.58e-5 0.425785,0.011055 0.866198,0.040416 1.317646,0.077134 0.451448,0.036718 0.913881,0.08076 1.405716,0.1468682 0.491836,0.066108 1.012991,0.154191 1.512159,0.2570058 0.499168,0.1028147 0.976282,0.2202582 1.361666,0.3267446 0.385383,0.1064863 0.678991,0.2019089 0.998303,0.3304539 0.319312,0.128545 0.664302,0.2900297 1.053343,0.480904 0.38904,0.190875 0.822112,0.411081 1.108201,0.616872 0.286088,0.205791 0.425553,0.396637 0.546602,0.580174 0.121049,0.183537 0.223812,0.359702 0.322769,0.587267 0.09896,0.227565 0.194379,0.506491 0.249275,0.726644 0.0549,0.220153 0.06958,0.381638 0.07318,0.601796 0.0036,0.220159 -0.0037,0.499088 -0.05519,0.821928 -0.05146,0.32284 -0.146883,0.689849 -0.242128,1.056174" - id="path5891" - inkscape:path-effect="#path-effect5893" - inkscape:original-d="m 0.96892735,14.996352 c -0.0430421,-0.343996 -0.0870843,-0.688993 -0.13212646,-1.03499 0.00834,-0.277939 0.0156807,-0.556867 0.0220211,-0.836801 C 0.94056753,12.883325 1.0213099,12.641098 1.1010538,12.397866 1.2268424,12.149289 1.351626,11.899721 1.4754121,11.649149 1.5938602,11.525361 1.7113036,11.400577 1.8277493,11.274791 2.041624,11.077597 2.2544901,10.879412 2.4663605,10.680222 2.7242782,10.519731 2.9811856,10.358246 3.2370982,10.195758 3.6051235,10.049948 3.972134,9.9031439 4.338152,9.7553367 4.8089443,9.6168671 5.2787179,9.4774031 5.7475008,9.3369362 6.1155261,9.2131476 6.4825367,9.088364 6.8485546,8.9625779 7.260623,8.8975134 7.6716748,8.8314515 8.0817349,8.7643883 8.4571007,8.7507073 8.8314515,8.7360268 9.2048098,8.7203461 9.7343262,8.6626221 10.262821,8.6039004 10.790327,8.5441775 c 0.397388,10e-4 0.793759,10e-4 1.189138,0 0.412069,-0.00634 0.823121,-0.013681 1.233181,-0.022021 0.44143,0.030362 0.881843,0.059723 1.321264,0.088084 0.463452,0.045043 0.925885,0.089084 1.387328,0.1321265 0.522176,0.089086 1.043331,0.1771686 1.563496,0.2642529 0.478133,0.1184481 0.955247,0.2358915 1.43137,0.3523372 0.294621,0.096427 0.588229,0.1918493 0.880843,0.286274 0.346004,0.1624911 0.690994,0.3239758 1.034991,0.4844639 0.43409,0.221215 0.867162,0.441421 1.299243,0.660632 0.14047,0.191853 0.279934,0.382699 0.418401,0.572548 0.103767,0.177172 0.20653,0.353337 0.308295,0.528506 0.09643,0.279939 0.191849,0.558867 0.286274,0.836801 0.01568,0.162491 0.03036,0.323976 0.04404,0.484464 -0.0063,0.279939 -0.01368,0.558867 -0.02202,0.836801 -0.09443,0.368025 -0.189849,0.735035 -0.286274,1.101053" - sodipodi:nodetypes="ccccccccccccccccccccccccccccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 0.96892735,14.996352 c 1.15346115,0.02939 2.30589745,0.05875 3.33354815,0.07709 1.0276507,0.01834 1.9304971,0.02568 3.1013046,0.04404 1.1708076,0.01836 2.6094889,0.04772 4.0665419,0.04402 1.457053,-0.0037 2.932436,-0.04039 4.2317,-0.06241 1.299264,-0.02201 2.422317,-0.02935 3.589461,-0.01833 1.167144,0.01103 2.378278,0.04039 3.588412,0.06972" - id="path6381" - inkscape:path-effect="#path-effect6383" - inkscape:original-d="m 0.96892735,14.996352 c 1.15343635,0.03036 2.30587265,0.05972 3.45730895,0.08808 0.9038822,0.0083 1.8067282,0.01568 2.7085923,0.02202 1.4397391,0.03036 2.8784204,0.05972 4.3161314,0.08808 1.476441,-0.0357 2.951824,-0.0724 4.426236,-0.110105 1.124097,-0.0063 2.24715,-0.01368 3.369224,-0.02202 1.212183,0.03036 2.423317,0.05972 3.633475,0.08808" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 10.548095,16.846123 c 0.507485,0 1.01397,0 1.519455,0" - id="path7255" - inkscape:path-effect="#path-effect7257" - inkscape:original-d="m 10.548095,16.846123 c 0.507485,0.001 1.01397,0.001 1.519455,0" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 11.05458,16.890165 c 0.0189,-0.160758 0.0379,-0.322387 0.05099,-0.479731 0.01308,-0.157344 0.02019,-0.310503 0.04102,-0.456226 0.02083,-0.145723 0.0557,-0.284529 0.0904,-0.422616 0.03593,-0.02604 0.07204,-0.0522 0.116441,-0.05452 0.0444,-0.0023 0.09625,0.01846 0.124378,0.100376 0.02813,0.08191 0.03369,0.22439 0.03976,0.3746 0.0061,0.150211 0.01264,0.308142 0.01629,0.458605 0.0036,0.150463 0.0044,0.293479 0.0052,0.435494" - id="path7462" - inkscape:path-effect="#path-effect7464" - inkscape:original-d="m 11.05458,16.890165 c 0.02001,-0.160628 0.03901,-0.322257 0.05701,-0.484885 0.0081,-0.152142 0.01521,-0.305301 0.02132,-0.459427 0.03569,-0.137072 0.104077,-0.414261 0.104077,-0.414261 0,0 0.07286,-0.05107 0.107788,-0.07811 0.05285,0.02178 0.1047,0.04256 0.155553,0.06235 0.0066,0.143487 0.01213,0.285964 0.01669,0.427447 0.0076,0.158935 0.01414,0.316867 0.01971,0.473804 0.0018,0.144023 0.0025,0.28704 0.0023,0.42906" - sodipodi:nodetypes="ccccccccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 11.05458,16.890165 c 0.05888,0.412178 0.117604,0.823229 0.198184,0.815687 0.08058,-0.0075 0.183341,-0.433271 0.286279,-0.859728" - id="path7466" - inkscape:path-effect="#path-effect7468" - inkscape:original-d="m 11.05458,16.890165 c 0.05972,0.412058 0.118444,0.823109 0.176169,1.23318 0.103767,-0.424751 0.20653,-0.850481 0.308294,-1.277221" - sodipodi:nodetypes="ccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 0.96892735,14.996352 C 4.1473862,15.550195 7.3247056,16.103839 10.500886,16.657285" - id="path7690" - inkscape:path-effect="#path-effect7692" - inkscape:original-d="M 0.96892735,14.996352 C 4.1472466,15.550996 7.3245661,16.10464 10.500886,16.657285" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 12.185574,16.63368 c 3.565619,-0.494511 7.130392,-0.988904 10.694321,-1.48318" - id="path7694" - inkscape:path-effect="#path-effect7696" - inkscape:original-d="m 12.185574,16.63368 c 3.565774,-0.493393 7.130547,-0.987787 10.694321,-1.48318" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 12.209179,16.63368 c 1.237856,-0.509281 2.475209,-1.018355 3.712059,-1.527222" - id="path7698" - inkscape:path-effect="#path-effect7700" - inkscape:original-d="m 12.209179,16.63368 c 1.238353,-0.508074 2.475706,-1.017148 3.712059,-1.527222" - sodipodi:nodetypes="cc" /> - <path - style="fill:#ff0000;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 10.477281,16.657284 C 9.3569956,16.14823 8.2355043,15.638628 7.1128076,15.128479" - id="path7702" - inkscape:path-effect="#path-effect7704" - inkscape:original-d="M 10.477281,16.657284 C 9.3567899,16.148683 8.2352987,15.639081 7.1128076,15.128479" - sodipodi:nodetypes="cc" /> - <path - style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.00220211;stroke-miterlimit:4;stroke-dasharray:none;paint-order:fill markers stroke" - d="m 7.8284925,15.016432 c -0.5571332,-0.0093 -1.7363471,-0.02786 -2.6204754,-0.04126 -1.5618499,-0.02368 -4.1308014,-0.082 -4.1400142,-0.09399 -0.00251,-0.0033 -0.021802,-0.149631 -0.04287,-0.325249 -0.0580295,-0.483717 -0.0688949,-1.0838 -0.024522,-1.354296 0.069887,-0.426022 0.3208645,-1.051043 0.5780229,-1.439476 0.073626,-0.11121 0.2228026,-0.286027 0.3595134,-0.421305 C 2.7028828,10.584132 3.344552,10.227099 4.6574576,9.7264325 5.2133314,9.5144541 6.4542679,9.2216015 6.7054177,9.1524646 7.2744092,8.9958319 7.8029454,8.9182273 8.819441,8.842064 9.2312351,8.8112094 9.7762567,8.7663602 10.0306,8.742399 10.860334,8.664232 11.338782,8.64922 12.641423,8.660481 c 1.264689,0.010934 1.476402,0.021568 2.531098,0.1271348 1.263779,0.1264943 2.552612,0.3675001 3.699672,0.6918213 0.620508,0.1754434 1.055615,0.3472517 1.8424,0.7274989 1.093783,0.528616 1.408945,0.750947 1.714033,1.209163 0.273976,0.41149 0.503292,0.957859 0.595547,1.418955 0.04806,0.240219 0.03497,0.986773 -0.02284,1.302477 -0.04118,0.224906 -0.19729,0.875952 -0.214053,0.892715 -0.0056,0.0056 -0.356169,-1.99e-4 -0.779061,-0.01287 -1.474855,-0.0442 -5.23737,-0.05052 -7.24309,-0.01218 -1.925623,0.03682 -5.0948443,0.04195 -6.9366385,0.01124 z" - id="path7780" - sodipodi:nodetypes="cccssscsssssssssssscccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 11.913402,8.6322618 c 0.0073,2.1957702 0.01468,4.3905372 0.02202,6.5843022" - id="path7852" - inkscape:path-effect="#path-effect7854" - inkscape:original-d="m 11.913402,8.6322618 c 0.0083,2.1957672 0.01568,4.3905342 0.02202,6.5843022" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 11.098622,8.6542829 c 0.02203,2.1590751 0.04405,4.3171411 0.06606,6.4741961" - id="path7856" - inkscape:path-effect="#path-effect7858" - inkscape:original-d="m 11.098622,8.6542829 c 0.02302,2.1590651 0.04504,4.3171311 0.06606,6.4741961" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 10.327885,8.698325 c 0.03672,2.151742 0.07342,4.302467 0.110105,6.452175" - id="path7860" - inkscape:path-effect="#path-effect7862" - inkscape:original-d="m 10.327885,8.698325 c 0.0377,2.151725 0.0744,4.30245 0.110105,6.452175" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 12.816266,8.6102407 c -0.0073,2.1664023 -0.01468,4.3318083 -0.02202,6.4962173" - id="path7864" - inkscape:path-effect="#path-effect7866" - inkscape:original-d="m 12.816266,8.6102407 c -0.0063,2.1664063 -0.01368,4.3318113 -0.02202,6.4962173" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 13.564983,8.6322618 c 0,2.1957672 0,4.3905342 0,6.5843022" - id="path7868" - inkscape:path-effect="#path-effect7870" - inkscape:original-d="m 13.564983,8.6322618 c 10e-4,2.1957672 10e-4,4.3905342 0,6.5843022" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 14.357742,8.7203461 c -0.0073,2.1370399 -0.01468,4.2730859 -0.02202,6.4081329" - id="path7872" - inkscape:path-effect="#path-effect7874" - inkscape:original-d="m 14.357742,8.7203461 c -0.0063,2.1370439 -0.01368,4.2730889 -0.02202,6.4081329" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 15.084437,8.7423672 c -0.05875,2.1076538 -0.117473,4.2143368 -0.176169,6.3200488" - id="path7876" - inkscape:path-effect="#path-effect7878" - inkscape:original-d="M 15.084437,8.7423672 C 15.026714,10.85005 14.967991,12.956733 14.908268,15.062416" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 15.921238,8.8524726 c -0.08812,2.0709364 -0.176209,4.1409184 -0.264253,6.2099434" - id="path7880" - inkscape:path-effect="#path-effect7882" - inkscape:original-d="m 15.921238,8.8524726 c -0.08708,2.0709804 -0.175169,4.1409624 -0.264253,6.2099434" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 16.625912,8.984599 c 0.02204,1.175475 0.04406,2.349933 -0.0074,3.370161 -0.05146,1.020229 -0.176239,1.886374 -0.300904,2.751698" - id="path7884" - inkscape:path-effect="#path-effect7886" - inkscape:original-d="m 16.625912,8.984599 c 0.02302,1.175457 0.04504,2.349915 0.06606,3.523372 -0.123789,0.867179 -0.248572,1.733325 -0.374359,2.598487" - sodipodi:nodetypes="ccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 17.39665,9.0506622 c 0.0073,1.1093998 0.01469,2.2177958 -0.0441,3.2306948 -0.05878,1.012899 -0.183568,1.930425 -0.308239,2.847122" - id="path7888" - inkscape:path-effect="#path-effect7890" - inkscape:original-d="m 17.39665,9.0506622 c 0.0083,1.1093938 0.01568,2.2177888 0.02202,3.3251828 -0.123788,0.918563 -0.248572,1.836089 -0.374358,2.752634" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 17.969198,9.2488519 c 0.01469,1.0506851 0.02937,2.1003571 -0.05145,3.0728431 -0.08083,0.972485 -0.256994,1.867991 -0.433011,2.762742" - id="path7892" - inkscape:path-effect="#path-effect7894" - inkscape:original-d="m 17.969198,9.2488519 c 0.01568,1.0506711 0.03036,2.1003431 0.04404,3.1490141 -0.175172,0.896541 -0.351337,1.792047 -0.528506,2.686571" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 18.607809,9.3589573 c -0.0073,0.7350257 -0.01469,1.4690617 -0.02939,2.0819687 -0.0147,0.612906 -0.03672,1.1047 -0.124863,1.688156 -0.08815,0.583456 -0.242293,1.258754 -0.396273,1.933334" - id="path7896" - inkscape:path-effect="#path-effect7898" - inkscape:original-d="m 18.607809,9.3589573 c -0.0063,0.7350357 -0.01368,1.4690717 -0.02202,2.2021077 -0.02102,0.492814 -0.04304,0.984608 -0.06606,1.475412 -0.153151,0.676327 -0.307295,1.351626 -0.462443,2.025939" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 19.158336,9.4910838 c -0.0073,0.8671532 -0.01469,1.7333152 -0.04043,2.3241442 -0.02575,0.590828 -0.06979,0.906457 -0.117496,1.266146 -0.04771,0.359689 -0.09909,0.763401 -0.165195,1.104629 -0.06611,0.341229 -0.146847,0.620156 -0.227401,0.898434" - id="path7900" - inkscape:path-effect="#path-effect7902" - inkscape:original-d="m 19.158336,9.4910838 c -0.0063,0.8671622 -0.01368,1.7333242 -0.02202,2.5984872 -0.04304,0.316641 -0.08708,0.632271 -0.132126,0.946906 -0.05038,0.404728 -0.101765,0.808439 -0.154148,1.211159 -0.07975,0.279939 -0.160488,0.558867 -0.242232,0.836801" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 19.774926,9.6672524 c 0,0.6542916 0,1.3075836 -0.02207,1.8323616 -0.02207,0.524779 -0.06611,0.921151 -0.128525,1.357872 -0.06241,0.436721 -0.143156,0.913835 -0.231272,1.299108 -0.08812,0.385274 -0.183539,0.678881 -0.278765,0.971885" - id="path7904" - inkscape:path-effect="#path-effect7906" - inkscape:original-d="m 19.774926,9.6672524 c 10e-4,0.6542916 10e-4,1.3075836 0,1.9598756 -0.04304,0.397387 -0.08708,0.793759 -0.132126,1.189138 -0.07975,0.478133 -0.160488,0.955247 -0.242232,1.43137 -0.09443,0.29462 -0.189849,0.588229 -0.286274,0.880843" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 20.325453,9.8874631 c -0.02205,0.7570269 -0.04407,1.5130839 -0.08449,2.0965809 -0.04042,0.583497 -0.09914,0.99455 -0.216624,1.493602 -0.117484,0.499051 -0.293649,1.086268 -0.469624,1.672854" - id="path7908" - inkscape:path-effect="#path-effect7910" - inkscape:original-d="m 20.325453,9.8874631 c -0.02102,0.7570569 -0.04304,1.5131139 -0.06606,2.2681709 -0.05772,0.412068 -0.116446,0.82312 -0.176169,1.23318 -0.175172,0.588241 -0.351337,1.175458 -0.528505,1.761686" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 20.787896,10.129695 c -0.04411,0.566124 -0.08816,1.131331 -0.139549,1.69653 -0.05139,0.565198 -0.110115,1.130395 -0.209258,1.669812 -0.09914,0.539418 -0.238606,1.053233 -0.377889,1.566379" - id="path7912" - inkscape:path-effect="#path-effect7914" - inkscape:original-d="m 20.787896,10.129695 c -0.04304,0.566208 -0.08708,1.131415 -0.132127,1.695623 -0.05772,0.566219 -0.116445,1.131415 -0.176168,1.695623 -0.13847,0.514835 -0.277934,1.02865 -0.418401,1.541475" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 21.184275,10.371927 c -0.0074,0.448745 -0.0147,0.896507 -0.05146,1.322167 -0.03676,0.42566 -0.102823,0.829372 -0.172561,1.236757 -0.06974,0.407384 -0.143141,0.818437 -0.220233,1.185414 -0.07709,0.366976 -0.157833,0.689944 -0.238401,1.012214" - id="path7916" - inkscape:path-effect="#path-effect7918" - inkscape:original-d="m 21.184275,10.371927 c -0.0063,0.448762 -0.01368,0.896524 -0.02202,1.343285 -0.06506,0.404728 -0.131126,0.80844 -0.19819,1.21116 -0.0724,0.412068 -0.145807,0.82312 -0.22021,1.23318 -0.07975,0.323982 -0.160488,0.646951 -0.242232,0.968927" - sodipodi:nodetypes="ccccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 21.69076,10.592138 c -0.04414,0.404599 -0.08818,0.808319 -0.12855,1.193697 -0.04037,0.385378 -0.07707,0.752389 -0.128493,1.075283 -0.05143,0.322894 -0.117487,0.601822 -0.198222,0.983552 -0.08074,0.381729 -0.176159,0.866182 -0.271431,1.349872" - id="path8090" - inkscape:path-effect="#path-effect8092" - inkscape:original-d="m 21.69076,10.592138 c -0.04304,0.404719 -0.08708,0.808439 -0.132127,1.211159 -0.0357,0.368025 -0.0724,0.735036 -0.110105,1.101054 -0.06506,0.279939 -0.131126,0.558867 -0.19819,0.8368 -0.09443,0.485474 -0.189849,0.969928 -0.286274,1.453391" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 22.153202,10.878412 c -0.03678,0.448673 -0.07348,0.896435 -0.121221,1.296437 -0.04774,0.400002 -0.106465,0.752334 -0.161506,1.123047 -0.05504,0.370713 -0.106424,0.759744 -0.176205,1.07156 -0.06978,0.311815 -0.157863,0.546701 -0.245742,0.781044" - id="path8127" - inkscape:path-effect="#path-effect8129" - inkscape:original-d="m 22.153202,10.878412 c -0.0357,0.448761 -0.0724,0.896523 -0.110105,1.343285 -0.05772,0.353344 -0.116446,0.705675 -0.176168,1.057012 -0.05038,0.390047 -0.101766,0.779078 -0.154148,1.167117 -0.08709,0.235896 -0.175169,0.470783 -0.264253,0.704674" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 22.527561,11.186707 c -0.102886,0.712852 -0.205651,1.424867 -0.286393,1.993753 -0.08074,0.568885 -0.139465,0.994619 -0.194548,1.310186 -0.05508,0.315567 -0.106464,0.521093 -0.15767,0.725917" - id="path8131" - inkscape:path-effect="#path-effect8133" - inkscape:original-d="m 22.527561,11.186707 c -0.101765,0.713014 -0.20453,1.425029 -0.308295,2.136044 -0.05772,0.426749 -0.116446,0.852482 -0.176169,1.277222 -0.05038,0.206535 -0.101765,0.41206 -0.154147,0.61659" - sodipodi:nodetypes="cccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 22.70373,11.737234 c -0.07352,0.551377 -0.146921,1.101904 -0.227672,1.667107 -0.08075,0.565203 -0.168834,1.14508 -0.256792,1.724138" - id="path8594" - inkscape:path-effect="#path-effect8596" - inkscape:original-d="m 22.70373,11.737234 c -0.0724,0.551526 -0.145807,1.102053 -0.220211,1.65158 -0.08709,0.5809 -0.175169,1.160778 -0.264253,1.739665" - sodipodi:nodetypes="ccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 22.945961,12.111592 c -0.05147,0.500031 -0.102856,0.999177 -0.161617,1.395483 -0.05876,0.396307 -0.124823,0.689917 -0.183544,0.954175 -0.05872,0.264259 -0.110103,0.499147 -0.161321,0.733292" - id="path8878" - inkscape:path-effect="#path-effect8880" - inkscape:original-d="m 22.945961,12.111592 c -0.05038,0.500144 -0.101765,0.999289 -0.154147,1.497433 -0.06506,0.29462 -0.131127,0.588229 -0.19819,0.880843 -0.05038,0.235896 -0.101764,0.470783 -0.154145,0.704674" - sodipodi:nodetypes="cccc" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 23.210214,12.772224 c -0.08091,0.360415 -0.161654,0.720093 -0.224048,0.995355 -0.0624,0.275261 -0.106436,0.466105 -0.157828,0.667939 -0.05139,0.201833 -0.110114,0.414701 -0.168651,0.626898" - id="path8882" - inkscape:path-effect="#path-effect8884" - inkscape:original-d="m 23.210214,12.772224 c -0.07974,0.360678 -0.160488,0.720355 -0.242232,1.079033 -0.04304,0.191853 -0.08708,0.382698 -0.132126,0.572548 -0.05772,0.213874 -0.116446,0.426741 -0.176169,0.638611" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 23.254256,13.763173 c -0.169032,0.463002 -0.337861,0.925445 -0.506484,1.387327" - id="path8886" - inkscape:path-effect="#path-effect8888" - inkscape:original-d="M 23.254256,13.763173 C 23.086428,14.226615 22.9176,14.689058 22.747772,15.1505" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 9.5351259,8.676304 c 0.066095,2.129734 0.1321584,4.258438 0.1981897,6.386112" - id="path8890" - inkscape:path-effect="#path-effect8892" - inkscape:original-d="m 9.5351259,8.676304 c 0.067063,2.129704 0.1331265,4.258408 0.1981897,6.386112" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="M 8.8084304,8.7423672 C 8.8524938,10.85741 8.896536,12.971434 8.9405569,15.084437" - id="path8894" - inkscape:path-effect="#path-effect8896" - inkscape:original-d="m 8.8084304,8.7423672 c 0.045042,2.1150228 0.089084,4.2290468 0.1321265,6.3420698" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 7.9936506,8.8304515 c 0.066124,1.1534901 0.1321869,2.3059265 0.1798852,3.3555955 0.047698,1.049669 0.077059,1.996556 0.1063885,2.942432" - id="path8898" - inkscape:path-effect="#path-effect8900" - inkscape:original-d="m 7.9936506,8.8304515 c 0.067063,1.1534363 0.1331265,2.3058725 0.1981897,3.4573085 0.030362,0.947926 0.059723,1.894813 0.088084,2.840719" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 7.3109972,9.0066201 c 0.080821,1.1168019 0.1615651,2.2325359 0.2276202,3.2418379 0.066055,1.009301 0.1174367,1.912147 0.1687592,2.813958" - id="path8902" - inkscape:path-effect="#path-effect8904" - inkscape:original-d="m 7.3109972,9.0066201 c 0.081744,1.1167349 0.1624879,2.2324689 0.2422319,3.3472039 0.052383,0.903882 0.103765,1.806728 0.1541475,2.708592" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 6.6063228,9.1167255 c 0.058783,1.0360435 0.1175055,2.0710345 0.1872558,3.0620045 0.06975,0.990969 0.1504926,1.937857 0.2311447,2.883686" - id="path8906" - inkscape:path-effect="#path-effect8908" - inkscape:original-d="m 6.6063228,9.1167255 c 0.059723,1.0359905 0.1184457,2.0709815 0.1761686,3.1049715 0.081746,0.947925 0.1624879,1.894813 0.2422319,2.840719" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 5.9236695,9.3149152 c 0.058782,1.0433838 0.1175051,2.0857148 0.183583,3.0583318 0.066078,0.972617 0.1394801,1.875463 0.2127963,2.777253" - id="path8910" - inkscape:path-effect="#path-effect8912" - inkscape:original-d="m 5.9236695,9.3149152 c 0.059723,1.0433308 0.1184457,2.0856618 0.1761686,3.1269928 0.074405,0.903882 0.1478071,1.806728 0.2202107,2.708592" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 5.3511215,9.5131048 c 0.044088,0.9919902 0.088131,1.9829392 0.1322055,2.6949822 0.044075,0.712043 0.088116,1.145115 0.1432049,1.567211 0.055089,0.422095 0.1211508,0.833147 0.1870322,1.243076" - id="path8914" - inkscape:path-effect="#path-effect8916" - inkscape:original-d="m 5.3511215,9.5131048 c 0.045042,0.9919482 0.089084,1.9828972 0.1321264,2.9728452 0.045043,0.43409 0.089084,0.867162 0.1321265,1.299244 0.067064,0.412068 0.1331264,0.82312 0.1981897,1.23318" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 4.7345313,9.6892735 c 0.051453,0.7791385 0.1028351,1.5572165 0.1468796,2.2105155 0.044044,0.653299 0.080745,1.181794 0.150564,1.692001 0.069819,0.510207 0.1725814,1.002001 0.2751044,1.492647" - id="path8918" - inkscape:path-effect="#path-effect8920" - inkscape:original-d="m 4.7345313,9.6892735 c 0.052383,0.7790775 0.1037651,1.5571555 0.1541476,2.3342345 0.037702,0.529516 0.074404,1.058011 0.1101054,1.585517 0.103767,0.492814 0.20653,0.984608 0.308295,1.475412" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 4.1179412,9.8874631 c 0.0441,0.8084909 0.088142,1.6159299 0.1395478,2.3279679 0.051406,0.712038 0.1101278,1.328616 0.1725942,1.7911 0.062466,0.462483 0.1285283,0.770772 0.1943428,1.077906" - id="path8922" - inkscape:path-effect="#path-effect8924" - inkscape:original-d="m 4.1179412,9.8874631 c 0.045042,0.8084399 0.089084,1.6158789 0.1321265,2.4223189 0.059724,0.617602 0.1184457,1.23418 0.1761686,1.84977 0.067064,0.309301 0.1331264,0.61759 0.1981897,0.924885" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 3.5894354,10.085653 c 0.036764,0.624985 0.073466,1.248916 0.1248993,1.78847 0.051433,0.539555 0.1174954,0.994648 0.1651534,1.508442 0.047658,0.513794 0.077019,1.086331 0.1063264,1.65783" - id="path8926" - inkscape:path-effect="#path-effect8928" - inkscape:original-d="m 3.5894354,10.085653 c 0.037702,0.62493 0.074404,1.248861 0.1101054,1.871791 0.067065,0.456112 0.1331264,0.911205 0.1981897,1.365307 0.030362,0.573559 0.059723,1.146096 0.088084,1.717644" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 3.193056,10.305864 c 0.022058,0.617624 0.044079,1.234214 0.069787,1.762738 0.025708,0.528524 0.055069,0.968937 0.095461,1.446079 0.040391,0.477142 0.091773,0.990957 0.1430466,1.503693" - id="path8930" - inkscape:path-effect="#path-effect8932" - inkscape:original-d="m 3.193056,10.305864 c 0.023021,0.61759 0.045042,1.23418 0.066063,1.84977 0.030362,0.44143 0.059723,0.881843 0.088084,1.321265 0.052384,0.514835 0.103765,1.02865 0.1541475,1.541475" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 2.7526345,10.680222 c 0.066153,0.793835 0.1322161,1.586593 0.1982896,2.313302 0.066074,0.726709 0.1321355,1.387328 0.1980898,2.046871" - id="path8934" - inkscape:path-effect="#path-effect8936" - inkscape:original-d="m 2.7526345,10.680222 c 0.067063,0.793759 0.1331265,1.586517 0.1981897,2.378276 0.067064,0.661646 0.1331264,1.322265 0.1981897,1.981897" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 2.2461498,10.988517 c 0.1102778,0.720482 0.2203832,1.439837 0.3010874,2.100451 0.080704,0.660613 0.1320857,1.262511 0.1833762,1.863343" - id="path8938" - inkscape:path-effect="#path-effect8940" - inkscape:original-d="m 2.2461498,10.988517 c 0.1111053,0.720355 0.2212107,1.43971 0.3303161,2.158065 0.052383,0.602922 0.103765,1.204819 0.1541475,1.805729" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 2.0479601,11.208728 c 0.073526,0.66173 0.146929,1.322362 0.2019529,1.957288 0.055024,0.634926 0.091725,1.244164 0.1283632,1.852358" - id="path8942" - inkscape:path-effect="#path-effect8944" - inkscape:original-d="m 2.0479601,11.208728 c 0.074404,0.661632 0.1478071,1.322264 0.2202107,1.981897 0.037703,0.610261 0.074404,1.219499 0.1101054,1.827749" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 1.7176439,11.583086 c 0.073559,0.529623 0.1469625,1.058129 0.1982996,1.564589 0.051337,0.506459 0.080698,0.990913 0.1212289,1.31396 0.040531,0.323048 0.091912,0.484532 0.1429138,0.644823" - id="path8946" - inkscape:path-effect="#path-effect8948" - inkscape:original-d="m 1.7176439,11.583086 c 0.074404,0.529506 0.1478072,1.058012 0.2202108,1.585517 0.030362,0.485474 0.059723,0.969928 0.088084,1.453391 0.052383,0.162492 0.103765,0.323976 0.1541475,0.484464" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 1.4974332,11.759255 c 0.066187,0.588327 0.13225,1.175556 0.183611,1.715062 0.051361,0.539507 0.088062,1.031301 0.124684,1.522036" - id="path8950" - inkscape:path-effect="#path-effect8952" - inkscape:original-d="m 1.4974332,11.759255 c 0.067063,0.588228 0.1331264,1.175457 0.1981897,1.761686 0.037702,0.492814 0.074404,0.984608 0.1101053,1.475412" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 1.2552013,12.221697 c 0.058853,0.500247 0.1175755,0.999391 0.1763083,1.469184 0.058733,0.469794 0.1174545,0.910206 0.176029,1.349514" - id="path8954" - inkscape:path-effect="#path-effect8956" - inkscape:original-d="m 1.2552013,12.221697 c 0.059723,0.500145 0.1184458,0.999289 0.1761686,1.497433 0.059724,0.441431 0.1184458,0.881843 0.1761687,1.321265" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 1.0570116,12.750203 c 0.080866,0.727794 0.1616098,1.454489 0.2422319,2.180087" - id="path8958" - inkscape:path-effect="#path-effect8960" - inkscape:original-d="m 1.0570116,12.750203 c 0.081744,0.727696 0.1624879,1.454391 0.2422319,2.180087" /> - <ellipse - style="fill:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:fill markers stroke" - id="path4899" - cx="11.318498" - cy="16.605972" - rx="0.27145511" - ry="0.29505992" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 10.456923,16.523355 0.07081,0.306862" - id="path5083" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 12.227283,16.523355 -0.118024,0.330467" - id="path5085" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.01;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 5.2638688,15.154277 5.2166592,1.487102" - id="path6003" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.01;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="m 12.250887,16.594169 5.853989,-1.463497" - id="path6038" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-77.svg b/htdocs/public/symbols/svgicons/94-77.svg deleted file mode 100755 index 1e59f4a8736cb6aa7bdedce05e5d56a16d120b2d..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-77.svg +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - version="1.1" - id="svg12" - sodipodi:docname="94-77.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <defs - id="defs16" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1865" - inkscape:window-height="1025" - id="namedview14" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="11.898305" - inkscape:cy="12" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg12" /> - <metadata - id="metadata7">image/svg+xml<rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> -</rdf:RDF> -</metadata> - <path - id="path3297" - d="m 9.4318167,19.959558 5.2158203,-0.08404 C 15.198885,13.61403 17.045425,6.7939484 11.735056,1.0102032 6.6137959,6.9620427 8.4936644,13.753557 9.4318167,19.959558 Z" - inkscape:connector-curvature="0" - style="fill:#4d4d4d;fill-rule:evenodd;stroke:#000000;stroke-width:0.96552008;stroke-linejoin:round" /> - <path - id="path3307" - d="M 9.4318167,19.959558 7.9622442,22.989835 C 7.0061223,21.060485 5.9111082,18.425398 6.313077,16.749083 6.5771832,15.647682 8.5190345,14.329627 8.5190345,14.329627 Z" - inkscape:connector-curvature="0" - style="fill:#4d4d4d;fill-rule:evenodd;stroke:#000000;stroke-width:0.96552008;stroke-linejoin:round" /> - <path - d="m 14.644988,19.711289 1.566441,2.981355 c 0.893465,-1.959154 1.903012,-4.628151 1.447243,-6.290649 -0.299458,-1.092315 -2.282763,-2.347123 -2.282763,-2.347123 z" - id="path3309" - inkscape:connector-curvature="0" - style="fill:#4d4d4d;fill-rule:evenodd;stroke:#000000;stroke-width:0.96552008;stroke-linejoin:round" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-80.svg b/htdocs/public/symbols/svgicons/94-80.svg deleted file mode 100755 index 810f68aee2b8a6c249ddf58fb90732bfedc910f1..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-80.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata11"/> - <g id="g3" transform="matrix(0.25417844,0,0,0.25417844,3.6293682e-4,1.6054998)" fill="#333333"> - <path d="m 47.209,81.789 -3.312,-6.008 h -13.25 c -0.414,-1.047 0.625,-3.32 0.625,-3.32 2.688,-3.523 11.594,-7.234 11.594,-7.234 l -2.688,-35 L 5.389,28.148 C -0.408,27.32 0.006,23.195 0.006,23.195 c 0,-3.32 6,-4.359 6,-4.359 L 40.592,14.922 43.069,4.555 H 38.311 V 3.102 h 6.406 L 47.413,0 49.694,3.102 h 6.422 v 1.453 h -4.758 l 2.477,10.367 34.57,3.914 c 0,0 6.008,1.039 6.008,4.359 0,0 0.414,4.125 -5.383,4.953 l -34.781,2.078 -2.694,35 c 0,0 8.913,3.711 11.594,7.233 0,0 1.039,2.272 0.625,3.32 H 50.53 l -3.321,6.01" id="path5" inkscape:connector-curvature="0"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-82.svg b/htdocs/public/symbols/svgicons/94-82.svg deleted file mode 100755 index c5a68e3441e8bd2d44d9b722dc0deef151339666..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-82.svg +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="94-82.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1865" - inkscape:window-height="1025" - id="namedview7" - showgrid="false" - inkscape:zoom="19.666667" - inkscape:cx="6.4566177" - inkscape:cy="16.399191" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <path - inkscape:connector-curvature="0" - style="fill:#333333;stroke-width:0.63999999" - id="path13" - d="m 12.000001,5.8108807 c -0.06939,5e-7 -0.110425,0.047717 -0.249439,0.4263476 -0.01641,0.044691 -0.04954,0.2352874 -0.04954,0.2352874 0,0 -0.111076,0.00531 -0.139757,0.00531 -0.05545,2e-6 -0.13044,0.049441 -0.168064,0.1096821 -0.116723,0.1869076 -0.298973,1.2155808 -0.298973,1.6894683 0,0.2940804 -0.02464,0.4703348 -0.07077,0.5059562 C 10.984544,8.8129951 10.78045,8.9056705 10.57058,8.9881478 10.20028,9.1336764 10.107445,9.1423139 7.428704,9.2853526 5.3073894,9.3986271 4.6396301,9.4519596 4.5398016,9.5153325 4.263001,9.6910474 4.2485894,10.097023 4.4920384,10.865139 l 0.1256045,0.396273 c 0,0 6.5296631,1.080907 6.5296631,1.080907 l 0.548414,4.014035 -0.145064,0.04069 c -0.07974,0.02207 -0.615417,0.08098 -1.190589,0.130912 -0.5751728,0.04993 -1.0782982,0.117375 -1.1180576,0.150372 -0.1598324,0.132651 -0.034232,1.178206 0.1415272,1.178206 0.2773999,0 1.3030394,0.137921 1.3568814,0.182214 0.03842,0.03163 0.919866,0.150372 1.259583,0.150371 0.339717,10e-7 1.221143,-0.118747 1.259583,-0.150371 0.05386,-0.04428 1.079482,-0.182214 1.356882,-0.182214 0.175756,0 0.30136,-1.045557 0.141526,-1.178207 -0.03978,-0.03298 -0.542883,-0.100441 -1.118056,-0.150371 -0.575173,-0.04993 -1.110851,-0.108834 -1.19059,-0.130912 l -0.145063,-0.04069 0.548413,-4.014036 c 0,0 6.529665,-1.080907 6.529666,-1.080906 l 0.125601,-0.39628 C 19.75141,10.097018 19.736998,9.6910442 19.460199,9.5153282 19.360369,9.4519551 18.692611,9.398622 16.571297,9.2853481 13.892555,9.1423085 13.799721,9.133671 13.429416,8.9881436 13.219546,8.9056665 13.015453,8.8129905 12.976531,8.7829308 c -0.04612,-0.035622 -0.07076,-0.2118762 -0.07076,-0.5059565 0,-0.473888 -0.182249,-1.5025627 -0.298975,-1.6894686 -0.03762,-0.060242 -0.112608,-0.1096844 -0.168061,-0.1096828 -0.02869,-2e-6 -0.137989,-0.00531 -0.137989,-0.00531 0,0 -0.03313,-0.1905976 -0.04954,-0.2352868 C 12.112193,5.8585947 12.069395,5.8108786 12,5.8108786 Z" /> -</svg> diff --git a/htdocs/public/symbols/svgicons/94-83.svg b/htdocs/public/symbols/svgicons/94-83.svg deleted file mode 100755 index 2837088deb1382160c017ed86c76a9f2ba3f293b..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/94-83.svg +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="94-83.svg"> - <defs - id="defs9" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1865" - inkscape:window-height="1025" - id="namedview7" - showgrid="false" - inkscape:zoom="32" - inkscape:cx="5.4950825" - inkscape:cy="14.589176" - inkscape:window-x="55" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <metadata - id="metadata11"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="g3" - transform="matrix(0.25417844,0,0,0.25417844,3.6293682e-4,3.20202)" - style="fill:#333333" /> - <g - id="g3388" - transform="matrix(-0.00411188,-0.0177399,0.0177399,-0.00411188,1.8254364,20.496882)" - style="fill:#4d4d4d"> - <path - inkscape:connector-curvature="0" - d="m 14.765,576.732 13.394,5.834 c 0,0 -14.377,5.953 -14.425,6.161 C 13.686,588.933 0,700.341 0,700.341 c 0,0 56.171388,14.76393 58.943388,9.39893 2.772,-5.365 43.074602,-96.35537 43.074602,-96.35537 0,0 144.08575,43.97258 164.40175,50.09958 20.316,6.127 58.97,20.325 58.97,20.325 L 275.487,1069.888 260.77389,1307.8528 c 0,0 83.23646,26.8259 86.02846,16.6599 2.792,-10.167 140.20085,-596.70168 140.20085,-596.70168 0,0 20.429,5.17 39.623,9.07 19.194,3.901 109.1458,11.68398 115.5018,-14.80502 6.355,-26.489 -64.54128,-54.75626 -96.89928,-63.12726 -32.358,-8.37 -39.103,-10.37 -39.103,-10.37 0,0 134.68085,-590.009666 136.10185,-596.451666 2.178,-9.872 -84.32346,-24.019872 -84.32346,-24.019872 C 558.38368,18.105466 465.036,249.822 465.036,249.822 L 340.92026,617.72486 c 0,0 -14.559,-0.299 -61.054,-8.028 -25.032,-4.161 -170.75348,-27.86756 -170.75348,-27.86756 0,0 4.39261,-98.47337 4.71861,-103.82137 C 114.45439,467.77593 56.014,457.62 56.014,457.62 c 0,0 -36.357,106.482 -36.309,106.275 0.048,-0.207 10.062,13.144 10.062,13.144 z" - id="path3390" - style="fill:#4d4d4d" - sodipodi:nodetypes="ccccscscccccccccccccscccscc" /> - </g> - <g - id="g4645" - transform="translate(-0.02734375)"> - <rect - y="9.1875" - x="8.4375" - height="1.4375" - width="2.59375" - id="rect4604" - style="fill:#1a1a1a;stroke:#1a1a1a;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none" /> - <rect - y="9.1875" - x="5.078125" - height="1.4375" - width="2.59375" - id="rect4604-6" - style="fill:#1a1a1a;stroke:#1a1a1a;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none" /> - <rect - y="9.1875" - x="16.382812" - height="1.4375" - width="2.59375" - id="rect4604-2" - style="fill:#1a1a1a;stroke:#1a1a1a;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none" /> - <rect - y="9.1875" - x="13.023438" - height="1.4375" - width="2.59375" - id="rect4604-6-9" - style="fill:#1a1a1a;stroke:#1a1a1a;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none" /> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/95-1.svg b/htdocs/public/symbols/svgicons/95-1.svg deleted file mode 100755 index ce3f30782e012a27a96626194e440be6c35a1f9f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/95-1.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" height="24" width="24" version="1.1"><metadata id="metadata3412"/><g><g><g><g> - - <circle r="12" cy="12" cx="12" id="path3416" fill="#0000ff" fill-rule="evenodd"/> -<text id="textoverlay"><tspan id="tspanoverlay" font-family="Sans-Serif" text-anchor="middle" text-align="center" word-spacing="0" letter-spacing="0" font-weight="bold" x="12" y="12" fill="#ffffff" font-size="11" dy="4.0" dx="-0.4">WX</tspan></text></g></g></g></g></svg> diff --git a/htdocs/public/symbols/svgicons/95-2.svg b/htdocs/public/symbols/svgicons/95-2.svg deleted file mode 100755 index 9f31dca64bcf6a301a6c42ce34e522f8b6a642f7..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/95-2.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 24 24" height="24" width="24" version="1.1"> - <metadata id="metadata3412"/> - <circle r="12" cy="12" cx="12" id="path3416" fill="#0000ff" fill-rule="evenodd"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/96-1.svg b/htdocs/public/symbols/svgicons/96-1.svg deleted file mode 100755 index 15d8c948fac5228f4f4ba0150c21999778b4d652..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/96-1.svg +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata4106"/> - <g inkscape:label="Ebene 1" inkscape:groupmode="layer" id="layer1" transform="translate(-317.72197,-453.96166)"> - <g id="g4068" transform="matrix(0.24863142,0.13038661,-0.13038661,0.24863142,298.90668,257.36886)"> - <g transform="matrix(0.83109018,-0.84335752,0.84335752,0.83109018,-425.72131,478.52845)" id="g4046"> - <path d="m 443.65385,563.57293 c -1.05193,-0.0129 -2.10701,0.0598 -3.12744,0.18048 l 0.06,2.75094 c 0.99036,-0.12733 2.00989,-0.19417 3.0337,-0.18162 12.83055,0.15709 23.11001,11.57671 22.93914,25.53274 -0.002,0.17643 -0.001,0.35569 -0.007,0.53121 l 2.50057,-0.0319 c 0.004,-0.15699 0.004,-0.31113 0.006,-0.46872 0.18944,-15.473 -11.18011,-28.13898 -25.40528,-28.31315 z" id="path3194" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0"/> - <path d="m 442.89836,570.53348 c -0.79783,-0.01 -1.59802,0.0454 -2.37195,0.13688 l 0.0455,2.52833 c 0.75111,-0.0966 1.52436,-0.14725 2.30084,-0.13774 9.73108,0.11913 16.95911,8.33817 16.82952,18.92284 -0.002,0.1338 -10e-4,0.26976 -0.005,0.40289 l 2.46472,-0.0242 c 0.003,-0.11907 0.003,-0.23598 0.004,-0.35547 0.14368,-11.73519 -8.47933,-21.34145 -19.26811,-21.47354 z" id="path3194-4" inkscape:connector-curvature="0" sodipodi:nodetypes="cccscccccc" stroke="#000000" stroke-width="0"/> - <path d="m 442.20847,576.88946 c -0.56577,-0.007 -1.13323,0.0322 -1.68206,0.0971 l 0.0323,2.42658 c 0.53265,-0.0685 1.081,-0.10442 1.63165,-0.0977 6.90079,0.46331 10.91426,5.09 11.13804,12.78552 -10e-4,0.0949 -7.7e-4,0.19129 -0.003,0.28572 l 2.54446,-0.0171 c 0.002,-0.0845 0.002,-0.16735 0.003,-0.25208 0.10189,-8.32201 -6.01312,-15.13429 -13.66399,-15.22797 z" id="path3194-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc" stroke="#000000" stroke-width="0"/> - </g> - <g transform="translate(4.3272904,0)" id="g4061"> - <path inkscape:connector-curvature="0" d="m 428.82958,632.50381 c 1.51739,8.39514 3.18843,16.70366 3.25039,25.86381 13.43389,-7.07008 16.24573,-8.60045 29.67957,-15.67062 -4.84405,-3.37683 -9.59166,-7.39353 -13.56307,-11.22903 -6.14118,1.98174 -12.37667,2.63171 -19.36689,1.03584 z m 3.03559,3.5588 2.90054,0.34654 c 1.65734,7.68989 1.24429,15.11973 -0.19508,18.63703 -0.5999,-6.11993 -0.9108,-10.44519 -2.70546,-18.98357 z" id="path4401"/> - <path inkscape:connector-curvature="0" d="m 398.11826,602.8218 c 5.46403,15.3042 20.05405,26.26585 37.2409,26.32057 17.18753,0.0547 31.81943,-10.80285 37.38029,-26.07291 l -74.62119,-0.24766 z m 6.11343,4.37701 6.55964,0.18844 c 4.52018,8.23085 9.05564,11.77782 15.40988,16.82483 -9.13544,-2.75636 -16.94711,-7.80772 -21.96952,-17.01327 z" id="path3423-9-5"/> - <g id="g4055" transform="translate(2.1996971,2)"> - <rect y="594.76" x="431.59" height="8.08" width="3.283" id="rect4051" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - <ellipse id="path4053" cx="433.23" cy="594.01" rx="3.409" ry="3.788" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-width="0"/> - </g> - </g> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/96-2.svg b/htdocs/public/symbols/svgicons/96-2.svg deleted file mode 100755 index 2d693f80ad9a46263f72433ab90a4ac58b6bc037..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/96-2.svg +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata3212"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <g id="g3121"> - <path d="m 587.001,191.775 c 0,-34.867 -24.173,-64.178 -56.635,-72.094 -0.487,-0.119 -0.977,-0.23 -1.468,-0.34 -1.321,0.132 -2.625,-0.138 -3.761,-0.734 -4.019,-0.676 -8.14,-1.047 -12.347,-1.047 -14.877,0 -29.225,4.381 -41.491,12.671 -3.054,2.063 -7.2,1.261 -9.263,-1.792 -0.774,-1.146 -1.145,-2.447 -1.144,-3.735 0.002,-2.139 1.03,-4.239 2.936,-5.526 14.481,-9.786 31.411,-14.959 48.962,-14.959 1.654,0 3.297,0.051 4.928,0.142 C 499.864,65.46 460.832,40.014 417.312,40.014 c -46.851,0 -87.649,29.456 -103.479,71.663 -2.983,7.955 -5.083,16.361 -6.166,25.111 -0.418,3.378 -3.293,5.852 -6.612,5.852 -0.207,0 -0.417,-0.019 -0.627,-0.039 -0.067,-0.006 -0.133,-0.004 -0.2,-0.012 -3.656,-0.452 -6.253,-3.783 -5.801,-7.439 1.036,-8.369 2.905,-16.456 5.507,-24.189 -42.585,1.412 -76.817,35.727 -78.098,78.348 8.087,0.308 15.9,2.767 22.695,7.162 1.975,1.276 3.044,3.421 3.043,5.609 -0.001,1.24 -0.342,2.495 -1.065,3.614 -2,3.095 -6.129,3.979 -9.224,1.978 -4.437,-2.869 -9.495,-4.561 -14.755,-4.959 -0.804,-0.062 -1.611,-0.097 -2.423,-0.097 -14.922,0 -27.461,10.372 -30.804,24.284 11.929,-3.955 24.376,-6.65 37.163,-7.951 5.847,-0.594 11.765,-0.901 17.736,-0.901 5.979,0 11.893,0.314 17.732,0.909 11.826,1.203 23.331,3.594 34.384,7.062 20.481,6.429 39.406,16.55 55.945,29.621 6.605,5.221 12.835,10.904 18.624,17.02 h 135.23 c 44.668,0 80.877,-36.205 80.885,-80.871 0,-0.006 -10e-4,-0.01 -10e-4,-0.014 z" id="path3123" inkscape:connector-curvature="0" fill="#b3b3b3"/> - <path d="m 521.806,465.719 c -1.138,0 -2.266,0.055 -3.387,0.139 -14.255,1.062 -27.023,8.777 -34.622,21.114 -2.721,4.414 -8.506,5.79 -12.921,3.07 -2.88,-1.773 -4.455,-4.852 -4.456,-8.002 0,-1.681 0.439,-3.382 1.385,-4.918 11.22,-18.215 30.377,-29.352 51.597,-30.136 -1.799,-60.006 -50.021,-108.336 -109.977,-110.315 3.667,10.895 6.302,22.287 7.761,34.077 0.637,5.147 -3.02,9.836 -8.166,10.473 -0.094,0.012 -0.187,0.009 -0.281,0.018 -0.296,0.027 -0.592,0.055 -0.884,0.055 -4.672,0 -8.72,-3.482 -9.308,-8.238 -1.525,-12.323 -4.483,-24.163 -8.688,-35.367 -9.626,-25.658 -25.811,-47.963 -46.402,-65.029 -2.799,-2.319 -5.68,-4.541 -8.637,-6.662 -25.652,-18.406 -57.028,-29.169 -90.619,-29.169 -2.87,0 -5.725,0.084 -8.565,0.239 -15.718,0.86 -30.94,4.069 -45.253,9.344 -38.31,14.117 -70.116,42.994 -87.554,81 2.307,-0.129 4.63,-0.201 6.969,-0.201 24.705,0 48.537,7.281 68.921,21.057 2.683,1.812 4.13,4.769 4.133,7.779 0.002,1.812 -0.52,3.645 -1.61,5.259 -2.904,4.298 -8.741,5.427 -13.038,2.522 -17.267,-11.669 -37.463,-17.836 -58.405,-17.836 -5.904,0 -11.693,0.5 -17.333,1.446 -1.631,0.87 -3.511,1.261 -5.415,1.056 -0.665,0.148 -1.328,0.304 -1.988,0.465 -45.703,11.139 -79.73,52.417 -79.73,101.501 0,0.011 -0.001,0.021 -0.001,0.031 0.017,62.868 50.986,113.828 113.86,113.828 H 405.6 512.417 c 29.816,0 53.992,-24.176 53.992,-53.997 0,-24.594 -20.009,-44.603 -44.603,-44.603 z" id="path3125" inkscape:connector-curvature="0" fill="#b3b3b3"/> - </g> - <path inkscape:connector-curvature="0" d="m 21.88398,1038.5155 c -0.04769,0 -0.09489,0 -0.141856,0.01 -0.597215,0.045 -1.132066,0.3756 -1.450436,0.9034 -0.11399,0.189 -0.356287,0.2478 -0.541245,0.1314 -0.120706,-0.076 -0.186688,-0.2076 -0.186768,-0.3423 0,-0.072 0.01841,-0.1448 0.05806,-0.2105 0.469996,-0.7795 1.272514,-1.256 2.161522,-1.2895 -0.07535,-2.5677 -2.09554,-4.6358 -4.607196,-4.7205 0.153595,0.4662 0.263928,0.9537 0.325044,1.4582 0.0267,0.2202 -0.126455,0.4209 -0.342093,0.4481 -0.0039,5e-4 -0.0077,4e-4 -0.01174,8e-4 -0.01238,0 -0.02485,0 -0.03703,0 -0.195694,0 -0.365293,-0.1491 -0.389981,-0.3525 -0.06386,-0.5273 -0.187772,-1.0339 -0.363886,-1.5134 -0.403249,-1.0979 -1.081283,-2.0523 -1.943954,-2.7826 -0.117288,-0.099 -0.237952,-0.1944 -0.361794,-0.2851 -1.07473,-0.7876 -2.389102,-1.2481 -3.796314,-1.2481 -0.120224,0 -0.239844,0 -0.3587801,0.01 -0.6584926,0.037 -1.2961572,0.174 -1.895825,0.3997 -1.6048771,0.604 -2.9373425,1.8398 -3.6678885,3.4661 0.096661,-0.01 0.1939652,-0.01 0.291953,-0.01 1.0349234,0 2.0333377,0.3115 2.8872831,0.901 0.1123824,0.077 0.1730167,0.204 0.1731373,0.3328 8.04e-5,0.077 -0.021793,0.156 -0.06747,0.225 -0.1216706,0.184 -0.3661778,0.2323 -0.5461907,0.1079 -0.7233486,-0.4993 -1.5694133,-0.7631 -2.4467601,-0.7631 -0.2473619,0 -0.4898988,0.021 -0.7261633,0.062 -0.068354,0.037 -0.1470822,0.054 -0.2268556,0.045 -0.027864,0.01 -0.055648,0.013 -0.083311,0.02 -1.9144816,0.4768 -3.33994892,2.243 -3.33994892,4.3434 0,5e-4 -4.021e-5,9e-4 -4.021e-5,0 6.8354e-4,2.6902 2.13594933,4.8707 4.76987943,4.8707 l 11.9984616,0 4.47487,0 c 1.249034,0 2.261883,-1.0344 2.261883,-2.3105 0,-1.0524 -0.838265,-1.9086 -1.868564,-1.9086 z" id="path4305" fill="#b3b3b3" stroke="#808080" stroke-width="0.495"/> - <g id="g4307" transform="matrix(0.04105515,0,0,0.04105515,-0.37250317,1028.0717)"> - <path inkscape:connector-curvature="0" d="m 45.378,497.42 c -3.818,10.365 1.488,21.863 11.853,25.682 2.281,0.84 4.616,1.238 6.912,1.238 8.14,0 15.791,-5.008 18.769,-13.092 l 49.855,-135.322 -42.627,0 -44.762,121.494 z" id="path4309" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" d="m 181.378,497.42 c -3.818,10.365 1.488,21.863 11.853,25.682 2.281,0.84 4.616,1.238 6.912,1.238 8.14,0 15.791,-5.008 18.769,-13.092 l 49.855,-135.322 -42.627,0 -44.762,121.494 z" id="path4311" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" d="m 317.379,497.42 c -3.818,10.365 1.488,21.863 11.853,25.682 2.28,0.84 4.616,1.238 6.912,1.238 8.14,0 15.79,-5.008 18.769,-13.092 l 49.855,-135.322 -42.628,0 -44.761,121.494 z" id="path4313" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" d="m 498.139,375.926 -44.76,121.494 c -3.818,10.365 1.488,21.863 11.853,25.682 2.28,0.84 4.616,1.238 6.912,1.238 8.14,0 15.79,-5.008 18.769,-13.092 l 49.855,-135.322 -42.629,0 z" id="path4315" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" d="m 91.823,555.93 c -3.818,10.363 1.488,21.861 11.853,25.68 2.281,0.842 4.616,1.24 6.912,1.24 8.14,0 15.791,-5.008 18.769,-13.092 l 71.411,-193.832 -42.628,0 -66.317,180.004 z" id="path4317" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" d="m 227.823,555.93 c -3.818,10.363 1.488,21.861 11.853,25.68 2.281,0.842 4.616,1.24 6.912,1.24 8.141,0 15.791,-5.008 18.77,-13.092 l 71.41,-193.832 -42.628,0 -66.317,180.004 z" id="path4319" fill="#b3b3b3"/> - <path inkscape:connector-curvature="0" d="m 363.822,555.93 c -3.818,10.363 1.488,21.861 11.854,25.68 2.281,0.842 4.615,1.24 6.912,1.24 8.141,0 15.791,-5.008 18.77,-13.092 l 71.41,-193.832 -42.629,0 -66.317,180.004 z" id="path4321" fill="#b3b3b3"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/97-1.svg b/htdocs/public/symbols/svgicons/97-1.svg deleted file mode 100755 index da0c794672be032c91a50f568a27f8b130b23f93..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/97-1.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="24" height="24" viewBox="0 0 24 24" enable-background="new 0 0 100 68.387"> - <metadata id="metadata15"/> - <path inkscape:connector-curvature="0" d="m 12.349522,5.5937539 0,-0.5564514 0.72689,0 0,-0.352091 c 0,-0.6262128 0.547149,-1.1323266 1.223973,-1.1323266 0.675731,0 1.222335,0.5063872 1.222335,1.1323266 l 0,0.352091 0.711293,0 0,0.5564514 -3.884491,0 z" id="path3" fill="#0000ff" stroke="#000000" stroke-width="0"/> - <g id="g4137" transform="matrix(0.99169525,0,0,0.99169525,0.09965485,0.10761902)"> - <path id="path5" d="m 18.133659,15.805247 c -1.105106,0 -2.000949,0.895303 -2.000949,1.999789 0,1.104698 0.895843,2.000211 2.000949,2.000211 1.104261,0 1.999051,-0.895513 1.999051,-2.000211 0,-1.104486 -0.89479,-1.999789 -1.999051,-1.999789 z m -4.23e-4,2.956815 c -0.528738,0 -0.957166,-0.428271 -0.957166,-0.956814 0,-0.528545 0.428428,-0.956183 0.957166,-0.956183 0.528108,0 0.956115,0.427428 0.956115,0.956183 0,0.528543 -0.428007,0.956814 -0.956115,0.956814 z" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0.4"/> - <path id="path7" d="m 5.3582413,15.783389 c -1.1040294,0 -1.9996839,0.896239 -1.9996839,2.000421 0,1.104815 0.8954438,1.999579 1.9996839,1.999579 1.1048723,0 2.0003161,-0.894764 2.0003161,-1.999579 0,-1.104182 -0.8954438,-2.000421 -2.0003161,-2.000421 z m 0.00442,2.959234 c -0.528417,0 -0.956966,-0.427895 -0.956966,-0.956916 0,-0.52839 0.428549,-0.956285 0.956966,-0.956285 0.5284173,0 0.9567554,0.427895 0.9567554,0.956285 -2.108e-4,0.529021 -0.4283381,0.956916 -0.9567554,0.956916 z" inkscape:connector-curvature="0" stroke="#000000" stroke-width="0.4"/> - <ellipse ry="3.917" rx="3.957" cy="12" cx="10.695" id="path4147" fill="#ff0000" stroke-width="0.1"/> - <path sodipodi:nodetypes="cccscsccscsssscscccccccccccccccccccc" id="path9" d="m 21.878581,11.460007 c 0.666324,0.12974 1.065414,0.417658 1.366258,2.062197 l 0.475711,2.968492 c 0.171341,0.965994 -0.374646,1.318312 -1.055072,1.318312 l -1.634669,0 c 0,-1.600589 -1.296688,-2.902683 -2.897041,-2.902683 -1.600589,0 -2.898687,1.302329 -2.898687,2.902683 l -6.9861805,0 c 0,-1.600589 -1.2973932,-2.902683 -2.8979817,-2.902683 -1.6012936,0 -2.8986868,1.302329 -2.8986868,2.902683 l -1.3545068,0 c -0.47688607,0 -0.84871145,-0.361015 -0.84871145,-0.827089 l 0,-9.7605333 c 0,-0.5318841 0.41977253,-0.9591779 0.93426415,-0.9591779 l 15.0765561,0 2.463401,0 c 0.666325,0 1.153788,0.3309294 1.394698,0.9107608 z m -5.846731,-3.7820206 0,3.6337136 4.183427,0 -1.644539,-3.6337136 z m -4.193965,3.1133456 0,-2.487845 -2.4878456,0 0,2.487845 -2.4883156,0 0,2.488316 2.4883156,0 0,2.48761 2.4878456,0 0,-2.48761 2.487846,0 0,-2.488316 z" inkscape:connector-curvature="0" fill="#ffffff" stroke="#000000" stroke-width="0.7"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/97-2.svg b/htdocs/public/symbols/svgicons/97-2.svg deleted file mode 100755 index 0685dd72c67f3d9473511b9abf28fc575ae6df17..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/97-2.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24" viewBox="0 0 24 24"> - <metadata id="metadata4733"/> - <g inkscape:groupmode="layer" id="layer9" inkscape:label="Layer 1"> - <path sodipodi:type="star" id="path4741" sodipodi:sides="4" sodipodi:cx="12" sodipodi:cy="12" sodipodi:r1="11.990243" sodipodi:r2="8.4783821" sodipodi:arg1="0" sodipodi:arg2="0.78539816" inkscape:flatsided="true" inkscape:rounded="-3.469447e-18" inkscape:randomized="0" d="M 23.990243,12 12,23.990243 0.00975704,12 12,0.00975704 Z" transform="matrix(0.88484358,0,0,0.8847113,1.381877,1.3834644)" fill="#ff0000" stroke="#ff0000" stroke-linejoin="round" stroke-linecap="round" stroke-width="3.145"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/98-1.svg b/htdocs/public/symbols/svgicons/98-1.svg deleted file mode 100755 index 38cb96725fce33463bf4722fb51cde65480b4ef9..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/98-1.svg +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.0"> - <metadata id="metadata3205"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-73)"> - <text x="-35.536" y="68.786" id="text3301" font-family="RoadSign" font-size="72"><tspan sodipodi:role="line" id="tspan3303" x="-35.536" y="68.786"/> - </text> - <text x="-14.286" y="63.25" id="text3305" font-family="RoadSign" font-size="72"><tspan sodipodi:role="line" id="tspan3307" x="-14.286" y="63.25"/> - </text> - <text x="-10.536" y="52.54" id="text3309" font-family="RoadSign" font-size="72"><tspan sodipodi:role="line" id="tspan3311" x="-10.536" y="52.54"/> - </text> - <g id="g4201" transform="translate(-24.61803,17.041885)"> - <path id="path3555" d="m 40.755457,59.2729 c -1.8e-5,-0.549346 -0.194586,-1.007152 -0.583704,-1.37342 -0.366262,-0.366222 -0.824068,-0.549344 -1.373419,-0.549368 -0.526493,2.4e-5 -0.984299,0.194592 -1.37342,0.583703 -0.36626,0.366269 -0.549382,0.81263 -0.549368,1.339085 -1.4e-5,0.526499 0.183108,0.984305 0.549368,1.373419 0.389121,0.366266 0.846927,0.549388 1.37342,0.549368 0.549351,2e-5 1.007157,-0.183102 1.373419,-0.549368 0.389118,-0.366224 0.583686,-0.82403 0.583704,-1.373419" inkscape:connector-curvature="0"/> - <path id="path3551" d="m 41.957199,64.938256 c -1.9e-5,-0.572241 -0.274702,-0.85837 -0.824052,-0.858387 l -2.300478,0 -1.716775,-3.227537 c -0.274697,-0.389114 -0.652388,-0.583682 -1.133071,-0.583703 -0.5036,2.1e-5 -0.88129,0.183144 -1.133071,0.549368 l -3.708234,3.639562 c -0.297582,0.297591 -0.446369,0.709617 -0.446361,1.236078 -8e-6,0.686725 0.21745,1.144531 0.652374,1.37342 l 4.188931,2.300478 -0.03434,4.18893 c -1.2e-5,0.686717 0.343342,1.030072 1.030065,1.030065 0.709586,7e-6 1.064386,-0.343348 1.0644,-1.030065 l 0,-5.150324 c -1.4e-5,-0.27467 -0.125911,-0.62947 -0.37769,-1.0644 l -2.815511,-1.510762 2.266143,-2.300478 0.961394,1.854117 c 0.137327,0.251809 0.377675,0.377706 0.721045,0.37769 l 2.74684,0 c 0.572239,1.6e-5 0.858368,-0.274668 0.858387,-0.824052" inkscape:connector-curvature="0"/> - <path id="path3547" d="m 47.857557,73.316117 c -2.7e-5,1.232373 -0.434978,2.283509 -1.304859,3.153408 -0.86993,0.86991 -1.921065,1.304863 -3.153408,1.304859 -1.232387,4e-6 -2.283522,-0.434949 -3.153408,-1.304859 -0.869924,-0.869899 -1.304876,-1.921035 -1.304859,-3.153408 -1.7e-5,-1.232357 0.434935,-2.283492 1.304859,-3.153408 0.869886,-0.869893 1.921021,-1.304845 3.153408,-1.304859 1.232343,1.4e-5 2.283478,0.434966 3.153408,1.304859 0.869881,0.869916 1.304832,1.921051 1.304859,3.153408" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-width="1.583"/> - <path id="text3540" d="m 34.295036,73.316117 c -1.1e-5,1.232373 -0.434964,2.283509 -1.304858,3.153408 -0.869915,0.86991 -1.92105,1.304863 -3.153408,1.304859 -1.232373,4e-6 -2.283508,-0.434949 -3.153409,-1.304859 -0.869909,-0.869899 -1.304861,-1.921035 -1.304858,-3.153408 -3e-6,-1.232357 0.434949,-2.283492 1.304858,-3.153408 0.869901,-0.869893 1.921036,-1.304845 3.153409,-1.304859 1.232358,1.4e-5 2.283493,0.434966 3.153408,1.304859 0.869894,0.869916 1.304847,1.921051 1.304858,3.153408" inkscape:connector-curvature="0" fill="none" stroke="#000000" stroke-width="1.583"/> - </g> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/98-2.svg b/htdocs/public/symbols/svgicons/98-2.svg deleted file mode 100755 index f037c812fded8c30d2d1ad14d972a0880a66c7a8..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/98-2.svg +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="24" height="24" version="1.1"> - <metadata id="metadata4044"/> - <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1028.3622)"> - <path sodipodi:type="spiral" id="path4049" sodipodi:cx="334.28571" sodipodi:cy="423.79074" sodipodi:expansion="0.69" sodipodi:revolution="0.98159838" sodipodi:radius="259.73999" sodipodi:argument="-10.691573" sodipodi:t0="0.27220243" d="M 237.31145,381.40835 C 239.11471,299.73947 328.93243,255.98729 401.1349,270.8345 508.43992,292.89994 562.8951,410.94953 535.07058,511.54334 505.06609,620.0184 395.6532,687.41952 285.64468,678.93563" transform="matrix(0.02139504,-0.00206403,0.00238602,0.0185078,10.27631,1029.4979)" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="99.89"/> - <path d="m 18.038234,1041.4669 -4.258212,-0.026 -12.79635679,0" id="path4561" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="1.9"/> - <path sodipodi:type="spiral" id="path4049-7" sodipodi:cx="334.28571" sodipodi:cy="423.79074" sodipodi:expansion="0.69" sodipodi:revolution="0.98159838" sodipodi:radius="259.73999" sodipodi:argument="-10.691573" sodipodi:t0="0.27220243" d="M 237.31145,381.40835 C 239.11471,299.73947 328.93243,255.98729 401.1349,270.8345 508.43992,292.89994 562.8951,410.94953 535.07058,511.54334 505.06609,620.0184 395.6532,687.41952 285.64468,678.93563" transform="matrix(0.01283702,-0.00123842,0.00143161,0.01110468,5.8580561,1031.741)" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="166.48"/> - <path d="m 10.521214,1038.9285 -1.4203126,-0.028 -4.2681873,0" id="path4561-9" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="1.9"/> - <path sodipodi:type="spiral" id="path4049-0" sodipodi:cx="334.28571" sodipodi:cy="423.79074" sodipodi:expansion="0.69" sodipodi:revolution="0.98159838" sodipodi:radius="259.73999" sodipodi:argument="-10.691573" sodipodi:t0="0.27220243" d="M 237.31145,381.40835 C 239.11471,299.73947 328.93243,255.98729 401.1349,270.8345 508.43992,292.89994 562.8951,410.94953 535.07058,511.54334 505.06609,620.0184 395.6532,687.41952 285.64468,678.93563" transform="matrix(0.00855802,8.25612e-4,9.54408e-4,-0.00740312,12.757315,1048.7221)" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="249.72"/> - <path d="m 15.912862,1043.9369 -3.193959,0 -9.5981739,0" id="path4561-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="1.9"/> - </g> -</svg> diff --git a/htdocs/public/symbols/svgicons/99-1.svg b/htdocs/public/symbols/svgicons/99-1.svg deleted file mode 100755 index 23524be4e242dee3ec8fd63b81c3f46203d4d3d8..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/99-1.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3070"/> - <rect id="rect3080" width="24" height="24" fill="#ffffff"/> - <path d="M 24,-2e-7 1.5e-7,24 24,24 z" id="path3076" inkscape:connector-curvature="0" fill="#00a900"/> - <rect id="rect3074" width="23" height="23" x="0.499" y="0.499" fill="none" stroke="#000000" stroke-width="0.998"/> -</svg> diff --git a/htdocs/public/symbols/svgicons/99-2.svg b/htdocs/public/symbols/svgicons/99-2.svg deleted file mode 100755 index 58dc6a8ad829c13fa1a36978ab46e2736e948524..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/svgicons/99-2.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="24" height="24"> - <metadata id="metadata3070"/> - <path sodipodi:type="arc" id="path3877" sodipodi:cx="12" sodipodi:cy="10.881356" sodipodi:rx="9.0508471" sodipodi:ry="9.0508471" d="m 21.050847,10.881356 a 9.0508471,9.0508471 0 1 1 -18.1016941,0 9.0508471,9.0508471 0 1 1 18.1016941,0 z" transform="matrix(1.3258428,0,0,1.3258428,-3.9101136,-2.4269678)"/> - <path sodipodi:type="star" id="path3879" sodipodi:sides="3" sodipodi:cx="11.186441" sodipodi:cy="12.610169" sodipodi:r1="12.604427" sodipodi:r2="6.3022137" sodipodi:arg1="0.52359878" sodipodi:arg2="1.5707963" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="m 22.102196,18.912383 -10.915754,0 -10.91575488,0 L 5.7285642,9.4590627 11.186441,0.00574207 16.644318,9.4590624 z" inkscape:transform-center-y="-2.8060175" transform="matrix(0.80756234,0,0,0.8904864,2.9662512,1.3039895)" fill="#ffff00" stroke="#ffff00" stroke-linejoin="round" stroke-width="1.125"/> -</svg> diff --git a/htdocs/public/symbols/symbol.php b/htdocs/public/symbols/symbol.php deleted file mode 100755 index 95afbcdeb17e54c84b2a8c3186e346d5310a2b8f..0000000000000000000000000000000000000000 --- a/htdocs/public/symbols/symbol.php +++ /dev/null @@ -1,464 +0,0 @@ -<?php -header('Access-Control-Allow-Origin: *'); -header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days) - - -// Contains ascii values that corresponds to symbols with overlay support (for symbols in the alternative table) -$alternativeSymbolWithOverlaySupport = [33, 35, 37, 38, 39, 45, 62, 64, 79, 87, 91, 95, 97, 115, 122, 48, 65, 68, 69, 72, 94, 99, 105, 110, 117, 118]; - -$alternativeSymbolThatShouldNotBeFlipped = [115, 62, 94, 79]; -$primarySymbolThatShouldNotBeFlipped = [94, 83, 39, 88]; - -$primarySymbolRotateDiff[40] = -90; -$primarySymbolRotateDiff[42] = -90; -$primarySymbolRotateDiff[60] = -90; -$primarySymbolRotateDiff[61] = -90; -$primarySymbolRotateDiff[62] = -90; -$primarySymbolRotateDiff[67] = -90; -$primarySymbolRotateDiff[70] = -90; -$primarySymbolRotateDiff[80] = -90; -$primarySymbolRotateDiff[85] = -90; -$primarySymbolRotateDiff[89] = -90; -$primarySymbolRotateDiff[91] = -90; -$primarySymbolRotateDiff[97] = -90; -$primarySymbolRotateDiff[98] = -90; -$primarySymbolRotateDiff[101] = -90; -$primarySymbolRotateDiff[102] = -90; -$primarySymbolRotateDiff[103] = -90; -$primarySymbolRotateDiff[106] = -90; -$primarySymbolRotateDiff[107] = -90; -$primarySymbolRotateDiff[115] = -90; -$primarySymbolRotateDiff[117] = -90; -$primarySymbolRotateDiff[118] = -90; - -$primarySymbolRotateDiff[39] = 0; // Small Airplace -$primarySymbolRotateDiff[94] = 0; // Large Airplane -$primarySymbolRotateDiff[83] = 0; -$primarySymbolRotateDiff[88] = 0; // Helicopter - -$alternativeSymbolRotateDiff[106] = -90; -$alternativeSymbolRotateDiff[107] = -90; -$alternativeSymbolRotateDiff[117] = -90; -$alternativeSymbolRotateDiff[115] = 0; -$alternativeSymbolRotateDiff[118] = -90; -$alternativeSymbolRotateDiff[91] = -90; -$alternativeSymbolRotateDiff[94] = 0; -$alternativeSymbolRotateDiff[79] = 0; -$alternativeSymbolRotateDiff[62] = 0; - -$svgContent = null; -if (isset($_GET['symbol']) && isset($_GET['symbol_table'])) { - - // symbol and symbol_table is ascii values so everything should be numbers - $symbol = preg_replace("/[^0-9]/","",$_GET['symbol']); - $symbolTable = preg_replace("/[^0-9]/","",$_GET['symbol_table']); - - if ($symbol >= 32 && $symbol <= 126) { - - // Init $course - if (isset($_GET['course'])) { - $course = preg_replace("/[^0-9]/","",$_GET['course']); - while ($course > 360) { - $course = $course - 360; - } - while ($course < 0) { - $course = $course + 360; - } - if ($course == 360) { - $course = 0; - } - } else { - $course = null; - } - - // Init hight and width - if (isset($_GET['width']) && isset($_GET['height'])) { - $width = preg_replace("/[^0-9]/","",$_GET['width']); - $height = preg_replace("/[^0-9]/","",$_GET['height']); - - if ($width > 1024) { - $width = 1024; - } - - if ($height > 1024) { - $height = 1024; - } - } else { - $width = null; - $height = null; - } - - // Init scale hight and width - if (isset($_GET['scale_width']) && isset($_GET['scale_height'])) { - $scaleWidth = preg_replace("/[^0-9]/","",$_GET['scale_width']); - $scaleHeight = preg_replace("/[^0-9]/","",$_GET['scale_height']); - - if ($scaleWidth > 1024) { - $scaleWidth = 1024; - } - - if ($scaleHeight > 1024) { - $scaleHeight = 1024; - } - - if ($scaleWidth == 24 && $scaleHeight == 24) { - $scaleWidth = null; - $scaleHeight = null; - } - } else { - $scaleWidth = null; - $scaleHeight = null; - } - - // Init $symbolCategory and $overlay - $overlay = null; - if ($symbolTable == 47) { - // Primary table (47 == '/') - $symbolCategory = 1; - - } else if ($symbolTable == 92) { - // Alternative table (92 == '\') - $symbolCategory = 2; - - } else if (preg_match("/^[a-zA-Z\d]$/", chr($symbolTable))) { - // Alternative table with overlay - - $filepath1 = './svgicons/' . $symbol . '-' . $symbolTable . '.svg'; - $filepath2 = './svgicons/' . $symbol . '-' . '3.svg'; - if (file_exists($filepath1)) { - $symbolCategory = $symbolTable; - } else if (file_exists($filepath2)) { - $symbolCategory = 3; - } else { - $symbolCategory = 2; - } - - if (in_array($symbol, $alternativeSymbolWithOverlaySupport) && ($symbolCategory == 2 || $symbolCategory == 3)) { - $overlay = chr($symbolTable); - } - - } else { - // Use primary if nothing else fits - $symbolCategory = 1; - } - - // Init $filepath - $name = $symbol . '-' . $symbolCategory; - $filepath = './svgicons/' . $name . '.svg'; - - if (file_exists($filepath)) { - $svgContent = file_get_contents($filepath); - - if ($overlay !== null || $course !== null || ($width !== null && $height !== null) || ($scaleWidth !== null && $scaleHeight !== null)) { - - // We will do changes to symbol (course or overlay) - - $doc = new DOMDocument(); - $doc->loadXML($svgContent); - $svg = $doc->getElementsByTagName('svg')->item(0); - - $childs = Array(); - foreach ($svg->childNodes as $child) { - if (isset($child->tagName) && $child->tagName != 'metadata') { - $childs[] = $child; - } - } - - // Wrapper1 used for width and height transfrom - $wrapper1 = $doc->createElement('g'); - $wrapper1 = $svg->appendChild($wrapper1); - - // Wrapper 2 used for rotate - $wrapper2 = $doc->createElement('g'); - $wrapper2 = $wrapper1->appendChild($wrapper2); - - // Wrapper 3 used for flip - $wrapper3 = $doc->createElement('g'); - $wrapper3 = $wrapper2->appendChild($wrapper3); - - // Wrapper 4 used for text - $wrapper4 = $doc->createElement('g'); - $wrapper4 = $wrapper3->appendChild($wrapper4); - - foreach ($childs as $child) { - $removedChild = $svg->removeChild($child); - $wrapper4->appendChild($child); - } - - if ($overlay !== null) { - // We should add overlay - // dominant-baseline do not seem to be supported by internet explorer so we have to do vertical alignment manual by changing y - - $text = $doc->createElement('text'); - $text->setAttribute('id','textoverlay'); - $text = $wrapper4->appendChild($text); - - $tspan = $doc->createElement('tspan', chr($symbolTable)); - $tspan = $text->appendChild($tspan); - - $tspan->setAttribute('id','tspanoverlay'); - //$tspan->setAttribute('sodipodi:linespacing','0%'); - $tspan->setAttribute('font-family','Helvetica'); - $tspan->setAttribute('text-anchor','middle'); - $tspan->setAttribute('text-align','center'); - $tspan->setAttribute('word-spacing','0'); - //$tspan->setAttribute('line-height','0%'); - $tspan->setAttribute('letter-spacing','0'); - $tspan->setAttribute('font-weight','bold'); - $tspan->setAttribute('x','12'); // left/right (higher means more to the right) - $tspan->setAttribute('y','12'); // up/down (higher means more down) - - - // White text, normal size, bold, centered - if (in_array($symbol, Array(35, 38, 62, 87, 95, 97))) { - $tspan->setAttribute('fill','#ffffff'); - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','5.2'); - $tspan->setAttribute('dx','0'); - - if (in_array(chr($symbolTable), array('Y', 'V'))) { - $tspan->setAttribute('dx','-0.2'); - } - - if (in_array(chr($symbolTable), array('S', 'W', 'Q'))) { - $tspan->setAttribute('dx','-0.1'); - } - - if (in_array(chr($symbolTable), array('R', 'P', 'D', 'F', 'K', 'L'))) { - $tspan->setAttribute('dx','0.4'); - } - } - - // White text, normal size, bold, centered (little bit to the left) - if (in_array($symbol, Array(105))) { - $tspan->setAttribute('fill','#ffffff'); - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','4.5'); - $tspan->setAttribute('dx','-0.5'); - - if (in_array(chr($symbolTable), array('S', 'W'))) { - $tspan->setAttribute('dx','-0.6'); - } - - if (in_array(chr($symbolTable), array('R', 'P', 'D', 'F', 'K', 'L'))) { - $tspan->setAttribute('dx','-0.1'); - } - } - - // White/Yellow text, normal size, bold, centered, a bit lower - if (in_array($symbol, Array(37, 110, 115, 122))) { - if ($symbol == 37) { - $tspan->setAttribute('fill','#ffff00'); - } else { - $tspan->setAttribute('fill','#ffffff'); - } - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','8'); - $tspan->setAttribute('dx','-0.1'); - - if (in_array(chr($symbolTable), array('T'))) { - $tspan->setAttribute('dx','0'); - } - - if (in_array(chr($symbolTable), array('S', 'Y'))) { - $tspan->setAttribute('dx','-0.2'); - } - } - - // Black text, normal size, bold, centered, a bit lower - if (in_array($symbol, Array(45))) { - $tspan->setAttribute('fill','#000000'); - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','8'); - $tspan->setAttribute('dx','-0.1'); - - if (in_array(chr($symbolTable), array('S', 'Y'))) { - $tspan->setAttribute('dx','-0.2'); - } - } - - // White text, normal size, bold, centered - if (in_array($symbol, Array(68, 69))) { - $tspan->setAttribute('fill','#ffffff'); - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','4.6'); - - if (in_array(chr($symbolTable), array('R', 'P', 'D', 'F', 'K', 'L'))) { - $tspan->setAttribute('dx','0.4'); - } - - - if (in_array(chr($symbolTable), array('S', 'Y'))) { - $tspan->setAttribute('dx','-0.2'); - } - } - - // Black text, normal size, bold, centered - if (in_array($symbol, Array(48, 65, 72))) { - $tspan->setAttribute('fill','#000000'); - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','4.6'); - - if (in_array(chr($symbolTable), array('R', 'P', 'D', 'F', 'K', 'L'))) { - $tspan->setAttribute('dx','0.4'); - } - } - - // Black text, normal size, bold, centered, a bit higher - if (in_array($symbol, Array(79))) { - $tspan->setAttribute('fill','#000000'); - $tspan->setAttribute('font-size','14'); - $tspan->setAttribute('dy','1.5'); - - if (in_array(chr($symbolTable), array('R', 'P', 'D', 'F', 'K', 'L'))) { - $tspan->setAttribute('dx','0.4'); - } - } - - // Black text, smaller size, bold, centered - if (in_array($symbol, Array(99))) { - $tspan->setAttribute('fill','#000000'); - $tspan->setAttribute('font-size','12'); - $tspan->setAttribute('dy','5'); - - if (in_array(chr($symbolTable), array('S', 'W'))) { - $tspan->setAttribute('dx','-0.1'); - } - } - - // Black text, very very small size, bold, right upper corner (besides airplane, human, symbol) - if (in_array($symbol, Array(33, 39, 91, 94))) { - $tspan->setAttribute('fill','#000000'); - $tspan->setAttribute('font-size','9'); - if ($symbol == 39 || $symbol == 33) { - $tspan->setAttribute('dx','17'); - } else { - $tspan->setAttribute('dx','11'); - } - $tspan->setAttribute('dy','-4'); - } - - // White text, small size, bold, centered, a bit lower - if (in_array($symbol, Array(64))) { - $tspan->setAttribute('fill','#ffffff'); - $tspan->setAttribute('font-size','10'); - $tspan->setAttribute('dy','3.4'); - $tspan->setAttribute('dx','-0.1'); - } - - // White text, very small size, bold, a bit to the right (on trucks) - if (in_array($symbol, Array(117))) { - $tspan->setAttribute('fill','#ffffff'); - $tspan->setAttribute('font-size','9'); - $tspan->setAttribute('dy','0.7'); - $tspan->setAttribute('dx','-3'); - } - - // White text, very small size, bold, a bit to the right (on vans) - if (in_array($symbol, Array(118))) { - $tspan->setAttribute('fill','#ffffff'); - $tspan->setAttribute('font-size','9'); - $tspan->setAttribute('dy','0.3'); - $tspan->setAttribute('dx','-3'); - } - } - - - if ($course !== null) { - // We should rotate symbol - if ($symbolCategory == 1 && isset($primarySymbolRotateDiff[$symbol])) { - $adjustedCourse = $course + $primarySymbolRotateDiff[$symbol]; - } else if ($symbolCategory != 1 && isset($alternativeSymbolRotateDiff[$symbol])) { - $adjustedCourse = $course + $alternativeSymbolRotateDiff[$symbol]; - } else { - $course = 0; - $adjustedCourse = 0; - } - - $wrapper2->setAttribute('transform', 'rotate(' . $adjustedCourse . ' 12 12)'); - if (($symbolCategory == 1 && !in_array($symbol, $primarySymbolThatShouldNotBeFlipped)) - || ($symbolCategory != 1 && !in_array($symbol, $alternativeSymbolThatShouldNotBeFlipped))) { - - if ($course > 180) { - // Symbols that rotate more than 180 deg should be flipped - $wrapper3->setAttribute('transform', 'translate(0,24) scale(1, -1)'); - - if (isset($tspan)) { - // Flip letter back - $x = 24 + $tspan->getAttribute('dx'); - $tspan->setAttribute('transform', 'translate(' . $x . ', 0) scale(-1, 1)'); - } - - } - } - } - - if ($width !== null && $height !== null) { - // We should change svg size (not scaling!), center existing stuff - $wrapper1->setAttribute('transform', 'translate('.(($width-24)/2).' '.(($height-24)/2).')'); - $svg->setAttribute('viewBox', '0 0 '.$width.' '.$height); - $svg->setAttribute('width', $width); - $svg->setAttribute('height', $height); - } - - if ($scaleWidth !== null && $scaleHeight !== null) { - $svg->setAttribute('preserveAspectRatio',"xMinYMin meet"); - if ($width !== null && $height !== null) { - $svg->setAttribute('viewBox', '0 0 '.$width.' '.$height); - } else { - $svg->setAttribute('viewBox', "0 0 24 24"); - } - $svg->setAttribute('width', $scaleWidth); - $svg->setAttribute('height', $scaleHeight); - } - - $svgContent = $doc->saveXML(); - } - } - } -} - -if ($svgContent === null) { - $filepath = './svgicons/125-1.svg'; - $svgContent = file_get_contents($filepath); -} - -if (isset($_GET['format']) && $_GET['format'] == 'png') { - str_replace('#000000', '#010101', $svgContent); - - $im = new Imagick(); - - // Hack to set needed density to get correct size?! - if ($width !== null && $height !== null) { - $im->setResolution($width*4,$height*4); - } else { - $im->setResolution(96,96); - } - - $im->setBackgroundColor(new ImagickPixel('transparent')); - $im->readImageBlob($svgContent); - $im->setImageFormat("png32"); - - if ((!isset($scaleWidth) && !isset($scaleHeight)) || ($scaleWidth == null && $scaleHeight == null) - || ($scaleWidth == 24 && $scaleHeight == 24) - || ($scaleWidth == 64 && $scaleHeight == 64) - || ($scaleWidth == 150 && $scaleHeight == 150)) { - $im->writeImage('./' . basename($_SERVER['REQUEST_URI'])); - } - - header('Pragma: public'); - header('Cache-Control: max-age=86400, public'); - header('Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + 86400)); - header('Content-type: image/png'); - echo $im->getImageBlob(); - - $im->destroy(); - -} else { - - header('Pragma: public'); - header('Cache-Control: max-age=86400, public'); - header('Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + 86400)); - header('Content-type: image/svg+xml'); - echo $svgContent; -} diff --git a/htdocs/public/views/about.php b/htdocs/public/views/about.php deleted file mode 100644 index 20404be21959448a7fcc2bdc8e339c76f2e0992d..0000000000000000000000000000000000000000 --- a/htdocs/public/views/about.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<title>About / FAQ</title> -<div class="modal-inner-content modal-inner-content-about" style="padding-bottom: 30px;"> - <div class="modal-inner-content-menu"> - <span>About</span> - <a href="/views/faq.php" class="tdlink" title="Frequently asked questions">FAQ</a> - </div> - <div class="horizontal-line"> </div> - - <p> - Welcome to this APRS tracking website! Our goal is to bring you a fast and easy-to-use map with APRS data from <a href="http://www.aprs-is.net" target="_blank">APRS-IS</a>, <a href="http://www.wxqa.com" target="_blank">CWOP-IS</a>, <a href="https://www.glidernet.org" target="_blank">OGN</a> or some other APRS data sourcei (depending on how this specific website is configured). We give you fast map updates and nice looking APRS symbols! - </p> - - <img src="/images/aprs-symbols.png" title="APRS symbols" style="width:100%"/> - - <p> - This website is based on the APRS Track Direct tools. Read more about APRS Track Direct <a href="https://www.aprsdirect.com" target="_blank">here</a> or go directly to <a href="https://github.com/qvarforth/trackdirect" target="_blank">GitHub</a>. In addition to a map with fast APRS data updates, APRS Track direct also provides related functions such as <a href="/views/latest.php" class="tdlink" title="List latest heard stations">Latest heard</a> and <a href="/views/search.php" class="tdlink" title="Search for stations">Station search</a> etc. - </p> - - <h3>What is APRS?</h3> - <p> - APRS (Automatic Packet Reporting System) is a digital communications system that uses packet radio to send real time tactical information (on amateur radio frequencies). - The APRS network is used by ham radio operators all over the world. - Information shared over the APRS network is for example coordinates, altitude, speed, heading, text messages, alerts, announcements, bulletins and weather data. - APRS has been developed by Bob Bruninga, callsign WB4APR. - More information about APRS can be found at <a target="_blank" rel="nofollow" href="http://www.aprs.org/">www.aprs.org</a> or at <a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System">wikipedia</a>. - </p> - <p> - But as you probably already understood, the APRS specification is not only used by ham radio operators, but also for several other areas of use, such as e.g. for CWOP and OGN data. - </p> - -</div> diff --git a/htdocs/public/views/faq.php b/htdocs/public/views/faq.php deleted file mode 100644 index 655ed1ae249f671ab5be894be59c8934820342a6..0000000000000000000000000000000000000000 --- a/htdocs/public/views/faq.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<title>About / FAQ</title> -<div class="modal-inner-content modal-inner-content-about" style="padding-bottom: 30px;"> - <div class="modal-inner-content-menu"> - <a href="/views/about.php" class="tdlink" title="More about this website!">About</a> - <span>FAQ</span> - </div> - <div class="horizontal-line"> </div> - - <h2>1. I have a question. Who may I contact?</h2> - <p> - Maintainer of this website is <a href="mailto:<?php echo getWebsiteConfig('owner_email'); ?>"><?php echo getWebsiteConfig('owner_name'); ?></a>. - </p> - - <h2>2. What is APRS?</h2> - <p> - APRS (Automatic Packet Reporting System) is a digital communications system that uses packet radio to send real time tactical information. The APRS network is used by ham radio operators all over the world. - </p> - <p> - Information shared over the APRS network is for example coordinates, altitude, speed, heading, text messages, alerts, announcements, bulletins and weather data. - </p> - - <h2>3. What is APRS Track Direct</h2> - <p> - This website is based on the APRS Track Direct tools. Read more on <a href="https://github.com/qvarforth/trackdirect" target="_blank">GitHub</a>. But please note that the maintainer of APRS Track Direct has nothing to do with this website. - </p> - - <h2>4. I have a map created in <a target="_blank" href="https://mymaps.google.com/">Google My Maps</a>, can I render it on top of this map?</h2> - <p> - Sure! Follow the following instructions... - </p> - <ol> - <li>Open your map at <a target="_blank" href="https://mymaps.google.com/">Google My Maps</a>.</li> - <li>Look at the current URL and try to find a value named <b>mid</b>. Copy that value!</li> - <li>Open this website. Add <b>"&mid={the mid value}"</b> to the end of the URL.</li> - <li>Press Enter!</li> - </ol> - - <h2>5. My latest packet seems to be using different path's depending on what website I look at (APRS-IS related). Why?</h2> - <p> - The websites you compare are not collecting packets from the same APRS-IS servers. Each APRS-IS server performes duplicate filtering, and which packet that is considered to be a duplicate may differ depending on which APRS-IS server you ask. - </p> - - <h2>6. Where does the displayed data come from?</h2> - <p>On each station you can see the specified source. APRS data can be received from <a href="http://www.aprs-is.net" target="_blank">APRS-IS</a>, <a href="http://www.wxqa.com" target="_blank">CWOP-IS</a> or <a href="https://www.glidernet.org" target="_blank">OGN</a> (and more). - - <h2>7. How do I prevent my data from being displayed on websites such as this?</h2> - <h3>A. Answer for APRS-IS/CWOP-IS and more</h3> - <p> - If you do not want your APRS data to be publiched on APRS-websites you can append <b>NOGATE</b> to the end of your path (or use <b>RFONLY</b>). If your digipeater path is <b>WIDE1-1,WIDE2-1</b>, you just change it to <b>WIDE1-1,WIDE2-1,NOGATE</b>. - </p> - - <h3>B. Answer for OGN (Open Glider Network)</h3> - <p> - Not all information that is sent to the Open Glider Network is published. - </p> - <p> - Aircrafts that meet any of the following condition is not shown at all.<br/> - → Has the "no-tracking" flag in FLARM device configuration set.<br/> - → Has activated the setting "I don't want this device to be tracked" in the the <a target="_blank" href="http://wiki.glidernet.org/ddb">OGN Devices DataBase</a>. - </p> - <p> - This website will only display information that can be used to identify an aircraft if the aircraft device details exists in the <a target="_blank" href="http://wiki.glidernet.org/ddb">OGN Devices DataBase</a>, and if the setting "I don't want this device to be identified" is deactivated. If the website is configured to also render aircrafts that does not exists in the OGN database, the aircraft is given a temporary name that is only used for a maximum of 24h (to make sure it can not be identified). - </p> - <p> - Read more about how to "Opt In" or "Opt Out" <a target="_blank" href="http://wiki.glidernet.org/opt-in-opt-out">here</a>. - </p> - - <h2>8. How is the coverage map created?</h2> - <p> - Note that the coverage map is only available for receiving stations, it tries to show from which area the station is able to receive packets. - </p> - <p> - The coverage map consists of two parts: - <ul> - <li><span>The heatmap that shows all recorded coordinates.</span></li> - <li><span>The interpolated max range plot polygon that shows the coverage.</span></li> - </ul> - </p> - <p> - The max range plot is created by: - <ol> - <li><span>We exclude positions that have a distance that is further away than the 95th percentile.</span></li> - <li><span>We use a convex hull algorithm to get a polygon of the covered area.</span></li> - <li><span>We add some padding to the area received in the previous step. This step is just used to make the polygon look a bit nicer.</span></li> - </ol> - </p> - - <h2>9. Can you tell me how the marker logic works?</h2> - <p> - Okay, let me tell you more about our brilliant marker logic :-) - </p> - <ul> - <li>We have a speed limit filter and other filters that sorts out packets that has a faulty position.</li> - <li>If a moving station sends a packet that is sorted out by our speed limit filter the packet will be marked as unconfirmed, if we later receive a packet that confirmes that the station is moving in that direction, the previous packet will be confirmed then.</li> - <li>If a station moves in one area and suddently appear in another area the two tails will be connected by a dashed polyline.</li> - <li>A moving station that reports it's speed and direction will have an animated direction polyline (will be hidden after 15min).</li> - <li>The dotted polyline shows the packet transmit path, will be shown when you hover over a marker or a "dotmarker". If a station in the path hasn't sent a position packet in a long time it will show up for some seconds and than disappear again.</li> - <li>Note that the time-interval specified in the station info-window (on the map) is how long a station has been on that location <u>without any downtime longer than 24h</u>.</li> - </ul> - - <h2>10. Can I link to this website?</h4> - <p> - Yes absolutely! - </p> - <ul> - <li> - To link to a station tracking map view, use one of the following alternatives: - <br/><span style="color:darkblue;">https://www.thiswebsite.com?sname=<b>STATION-NAME</b></span> - <br/><span style="color:darkblue;">https://www.thiswebsite.com?sid=<b>STATION-ID</b></span> - </li> - <br/> - <li> - To link to a tracking map view for multiple stations, use one of the following alternatives: - <br/><span style="color:darkblue;">https://www.thiswebsite.com?snamelist=<b>STATION-NAME-1,STATION-NAME-2,STATION-NAME-3</b></span> - <br/><span style="color:darkblue;">https://www.thiswebsite.com?sidlist=<b>STATION-ID-1,STATION-ID-2,STATION-ID-3</b></span> - </li> - <br/> - <li> - To link to a map view, centered on a position, use the following: - <br/><span style="color:darkblue;">https://www.thiswebsite.com?center=<b>LATITUDE</b>,<b>LONGITUDE</b>&zoom=<b>ZOOM-LEVEL</b></span> - </li> - - </ul> - - <h2>11. What browsers do this website support?</h2> - <p> - Our goal is that APRS Direct should work on all broswers that supports websockets (an HTML5 feature). The following browser version (and newer) supports the websocket-protocol. - </p> - <ul> - <li>Internet Explorer 10 (released 4/9 2012)</li> - <li>Edge 12 (released 30/3 2015)</li> - <li>Firefox 11 (released 31/1 2012)</li> - <li>Chrome 16 (released 25/10 2012)</li> - <li>Safari 7 (released 22/10 2013)</li> - <li>Opera 6.1 (released 5/11 2012)</li> - <li>iOS Safari 6.1 (released 28/1 2013)</li> - <li>Android Browser 4.4 (released 9/12 2013)</li> - <li>Blackberry browser 7 (released 1/1 2012)</li> - <li>Opera Mobile 12.1 (released 9/10 2012)</li> - <li>Chrome 53 for Android (released 8/9 2016)</li> - <li>Firefox 49 for Android (released 20/9 2016)</li> - <li>IE Mobile 10 (released 20/6 2012)</li> - <li>UC Browser 11 (released 17/8 2016)</li> - <li>Samsung Internet 4 (released 19/4 2016)</li> - </ul> -</div> diff --git a/htdocs/public/views/latest.php b/htdocs/public/views/latest.php deleted file mode 100644 index 178a47ad9340eab9ab1ca1118149bf9e062f8b95..0000000000000000000000000000000000000000 --- a/htdocs/public/views/latest.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php - $stations = []; - $seconds = 60*60*24; - $page = $_GET['page'] ?? 1; - $rows = 50; - $offset = ($page - 1) * $rows; - - $stations = StationRepository::getInstance()->getObjectList($seconds, $rows, $offset); - $count = StationRepository::getInstance()->getNumberOfStations($seconds); - - $pages = ceil($count / $rows); -?> - -<title>Latest heard stations</title> -<div class="modal-inner-content" style="padding-bottom: 30px;"> - <?php if (count($stations) > 0) : ?> - <p> - <?php echo $count; ?> station(s) have been heard in the last 24 hours. - </p> - - <?php if ($pages > 1): ?> - <div class="pagination"> - <a class="tdlink" href="/views/latest.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=1"><<</a> - <?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?> - <a href="/views/latest.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a> - <?php endfor; ?> - <a class="tdlink" href="/views/latest.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $pages; ?>">>></a> - </div> - <?php endif; ?> - - <div class="datagrid datagrid-search" style="max-width:1000px;"> - <table> - <thead> - <tr> - <th> </th> - <th>Name/Id</th> - <th>Latest heard</th> - <th>Comment/Other</th> - <th>Map</th> - - </tr> - </thead> - <tbody> - <?php foreach ($stations as $foundStation) : ?> - <tr> - <td> - <img src="<?php echo $foundStation->getIconFilePath(22, 22); ?>" alt="Symbol"/> - </td> - <td> - <a class="tdlink" href="/views/overview.php?id=<?php echo $foundStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($foundStation->name) ?></a> - </td> - <td class="station-latest-heard-timestamp" style="white-space: nowrap;"> - <?php echo $foundStation->latestConfirmedPacketTimestamp; ?> - </td> - <td> - <?php if ($foundStation->sourceId == 5 && $foundStation->getOgnDevice() !== null) : ?> - <div style="width: 100px; display: inline-block;">Registration:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->registration); ?> <?php echo $foundStation->getOgnDevice()->cn ? '[' .htmlspecialchars($foundStation->getOgnDevice()->cn) . ']' : ''; ?><br/> - <div style="width: 100px; display: inline-block;">Aircraft Model:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->aircraftModel); ?> - <?php else : ?> - <?php $latestPacket = PacketRepository::getInstance()->getObjectById($foundStation->latestPacketId, $foundStation->latestPacketTimestamp); ?> - <?php echo htmlspecialchars($latestPacket->comment); ?> - <?php endif; ?> - </td> - <td> - <?php if ($foundStation->latestConfirmedPacketTimestamp > (time() - 60*60*24)) : ?> - <a href="?sid=<?php echo $foundStation->id; ?>" onclick=" - if (window.parent && window.parent.trackdirect) { - $('.modal', parent.document).hide(); - window.parent.trackdirect.filterOnStationId([]); - window.parent.trackdirect.filterOnStationId([<?php echo $foundStation->id; ?>]); - return false; - }">Map</a> - <?php else : ?> - - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - </div> - <?php endif; ?> - - <?php if (count($stations) == 0) : ?> - <p> - <b><i>No station have been heard in the last 24 hours.</i></b> - </p> - <?php endif; ?> -</div> -<script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.station-latest-heard-timestamp').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - }); -</script> diff --git a/htdocs/public/views/overview.php b/htdocs/public/views/overview.php deleted file mode 100644 index d52b097684113a1097621829b57d4f9fbfdfa243..0000000000000000000000000000000000000000 --- a/htdocs/public/views/overview.php +++ /dev/null @@ -1,549 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?> -<?php if ($station->isExistingObject()) : ?> - <title><?php echo $station->name; ?> Overview</title> - <div class="modal-inner-content"> - <div class="modal-inner-content-menu"> - <span>Overview</span> - <a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Statistics</a> - <a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Trail Chart</a> - <a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Weather</a> - <a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Telemetry</a> - <a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Raw packets</a> - </div> - - <div class="horizontal-line"> </div> - - <div class="overview-content-summary"> - <div> - <div class="overview-content-summary-hr"> - <?php if ($station->sourceId == 5) : ?> - ID: - <?php else: ?> - Name: - <?php endif; ?> - </div> - <div class="overview-content-station" title="Name of the station/object"> - <?php echo htmlentities($station->name); ?> - </div> - </div> - - <div> - <div class="overview-content-summary-hr"> - Station ID: - </div> - <div class="overview-content-station" title="Website station id"> - <?php echo $station->id; ?> - </div> - </div> - - <?php if ($station->sourceId != null) : ?> - <div> - <div class="overview-content-summary-hr">Source:</div> - <div class="overview-content-station" title="Source of this station"> - <?php echo $station->getSourceDescription(); ?> - </div> - </div> - <?php endif; ?> - - <?php if ($station->getOgnDevice() !== null) : ?> - <br/> - <?php if ($station->getOgnDevice()->registration != null) : ?> - <div> - <div class="overview-content-summary-hr">Aircraft Registration:</div> - <div class="overview-content-station" title="Aircraft Registration"> - <b><?php echo htmlspecialchars($station->getOgnDevice()->registration); ?></b> - </div> - </div> - <?php endif; ?> - - <?php if ($station->getOgnDevice()->cn != null) : ?> - <div> - <div class="overview-content-summary-hr">Aircraft CN:</div> - <div class="overview-content-station" title="Aircraft CN"> - <b><?php echo htmlspecialchars($station->getOgnDevice()->cn); ?></b> - </div> - </div> - <?php endif; ?> - <?php endif; ?> - - <?php if ($station->getOgnDdbAircraftTypeName() !== null) : ?> - <div> - <div class="overview-content-summary-hr">Aircraft Type:</div> - <div class="overview-content-station" title="Type of aircraft"> - <?php echo htmlspecialchars($station->getOgnDdbAircraftTypeName()); ?> - </div> - </div> - <?php if ($station->getOgnDevice()->aircraftModel != null) : ?> - <div> - <div class="overview-content-summary-hr">Aircraft Model:</div> - <div class="overview-content-station" title="Aircraft Model"> - <?php echo htmlspecialchars($station->getOgnDevice()->aircraftModel); ?> - </div> - </div> - <?php endif; ?> - <?php elseif ($station->getOgnAircraftTypeName() != null) : ?> - <div> - <div class="overview-content-summary-hr">Aircraft Type:</div> - <div class="overview-content-station" title="Type of aircraft"> - <?php echo htmlspecialchars($station->getOgnAircraftTypeName()); ?> - </div> - </div> - <?php else : ?> - <div> - <div class="overview-content-summary-hr">Symbol:</div> - <div class="overview-content-station" title="Symbol type"> - <img src="<?php echo $station->getIconFilePath(24, 24); ?>" alt="Latest symbol" /> - <span> <?php echo htmlentities($station->getLatestSymbolDescription()); ?></span> - </div> - </div> - <?php endif; ?> - - <!-- Latest Packet --> - <?php if ($station->latestPacketId !== null) : ?> - <?php $latestPacket = PacketRepository::getInstance()->getObjectById($station->latestPacketId, $station->latestPacketTimestamp); ?> - <div class="overview-content-divider"></div> - - <div> - <div class="overview-content-summary-hr">Latest Packet:</div> - <div class="overview-content-summary-cell-type overview-content-summary-indent"><?php echo $latestPacket->getPacketTypeName(); ?> Packet</div> - </div> - - <?php $latestPacketSender = SenderRepository::getInstance()->getObjectById($latestPacket->senderId); ?> - <?php if ($latestPacketSender->name != $station->name) : ?> - <div> - <div class="overview-content-summary-hr-indent">Sender:</div> - <div class="overview-content-summary-indent" title="Sender of current packet"> - <?php $latestPacketSenderStation = StationRepository::getInstance()->getObjectByNameAndSenderId($latestPacketSender->name, $latestPacketSender->id); ?> - <?php if ($latestPacketSenderStation->isExistingObject()) : ?> - <a class="tdlink" title="Sender of the object" href="/views/overview.php?id=<?php echo $latestPacketSenderStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"> - <?php echo htmlentities($latestPacketSenderStation->name); ?> - </a> - <?php else : ?> - <?php echo $latestPacketSender->name; ?> - <?php endif; ?> - </div> - </div> - <?php endif; ?> - - <div> - <div class="overview-content-summary-hr-indent">Receive Time:</div> - <div title="Timestamp of the latest packet" id="latest-timestamp" class="overview-content-summary-cell-time overview-content-summary-indent"> - <?php echo $station->latestPacketTimestamp; ?> - </div> - </div> - - - <div> - <div class="overview-content-summary-hr-indent">Age:</div> - <div title="Age of the latest packet" id="latest-timestamp-age" class="overview-content-summary-cell-time overview-content-summary-indent"> - <?php echo $station->latestPacketTimestamp; ?> - </div> - </div> - - - <div> - <div class="overview-content-summary-hr-indent">Path:</div> - <div class="overview-content-summary-cell-path overview-content-summary-indent" title="Latest path"><?php echo $latestPacket->rawPath; ?></div> - </div> - - <?php if ($latestPacket->comment != '') : ?> - <div> - <div class="overview-content-summary-hr-indent">Comment:</div> - <div title="Comment found in thelatest packet" id="latest-packet-comment" class="overview-content-summary-indent"> - <?php echo htmlentities($latestPacket->comment); ?> - </div> - </div> - <?php endif;?> - - <?php if ($latestPacket->getPacketOgn()->isExistingObject()) : ?> - <div style="line-height: 8px"> </div> - <?php if ($latestPacket->getPacketOgn()->ognSignalToNoiseRatio !== null) : ?> - <div> - <div class="overview-content-summary-hr-indent">Signal to Noise Ratio:</div> - <div class="overview-content-summary-indent" title="Signal to Noise Ratio measured upon reception"><?php echo $latestPacket->getPacketOgn()->ognSignalToNoiseRatio; ?> dB</div> - </div> - <?php endif;?> - - <?php if ($latestPacket->getPacketOgn()->ognBitErrorsCorrected !== null) : ?> - <div> - <div class="overview-content-summary-hr-indent">Bits corrected:</div> - <div class="overview-content-summary-indent" title="The number of bit errors corrected in the packet upon reception"><?php echo $latestPacket->getPacketOgn()->ognBitErrorsCorrected; ?></div> - </div> - <?php endif;?> - - <?php if ($latestPacket->getPacketOgn()->ognFrequencyOffset !== null) : ?> - <div> - <div class="overview-content-summary-hr-indent">Frequency Offset:</div> - <div class="overview-content-summary-indent" title="The frequency offset measured upon reception"><?php echo $latestPacket->getPacketOgn()->ognFrequencyOffset; ?> kHz</div> - </div> - <?php endif;?> - <?php endif;?> - - <?php endif;?> - - - <!-- Latest Weather --> - <?php if ($station->latestWeatherPacketTimestamp !== null) : ?> - <div class="overview-content-divider"></div> - - <div> - <div class="overview-content-summary-hr">Latest Weather:</div> - <div id="weather-timestamp" class="overview-content-summary-cell-weather-time" title="Latest received weather"> - <?php echo $station->latestWeatherPacketTimestamp; ?> - </div> - </div> - - <?php if ($station->latestWeatherPacketComment != '') : ?> - <div> - <div class="overview-content-summary-hr-indent">Comment/Software:</div> - <div class="overview-content-summary-cell-time overview-content-summary-indent" title="Weather packet comment/software"> - <?php echo htmlentities($station->latestWeatherPacketComment); ?><br/> - </div> - </div> - <?php endif;?> - <?php endif;?> - - <!-- Latest Telemetry --> - <?php if ($station->latestTelemetryPacketTimestamp !== null) : ?> - <div class="overview-content-divider"></div> - - <div> - <div class="overview-content-summary-hr">Latest Telemetry:</div> - <div id="telemetry-timestamp" class="overview-content-summary-cell-telemetry-time" title="Latest received telemetry"> - <?php echo $station->latestTelemetryPacketTimestamp; ?> - </div> - </div> - <?php endif;?> - - <!-- Latest Position --> - <?php if ($station->latestConfirmedPacketId !== null) : ?> - - <div class="overview-content-divider"></div> - - <div> - <div class="overview-content-summary-hr">Latest Position:</div> - <div id="overview-content-latest-position" class="overview-content-summary-cell-position" title="Latest position (that is approved by our filters)"> - <?php echo round($station->latestConfirmedLatitude, 5); ?>, <?php echo round($station->latestConfirmedLongitude, 5); ?> - </div> - </div> - - <div> - <div class="overview-content-summary-hr-indent">Receive Time:</div> - <div id="position-timestamp" class="overview-content-summary-cell-time overview-content-summary-indent" title="Latest position receive time"> - <?php if ($station->latestPacketId == $station->latestConfirmedPacketId && $station->latestPacketTimestamp == $station->latestConfirmedPacketTimestamp) : ?> - (Received in latest packet) - <?php else : ?> - <?php echo $station->latestConfirmedPacketTimestamp; ?> - <?php endif; ?> - </div> - </div> - <div> - <div class="overview-content-summary-hr"> </div> - <div class="overview-content-summary-cell-position"> - <a href="?sid=<?php echo $station->id; ?>" onclick=" - if (window.parent && window.parent.trackdirect) { - $('.modal', parent.document).hide(); - window.parent.trackdirect.filterOnStationId([]); - window.parent.trackdirect.filterOnStationId([<?php echo $station->id; ?>]); - return false; - }">Show on map</a> - </div> - </div> - - - <?php $latestConfirmedPacket = PacketRepository::getInstance()->getObjectById($station->latestConfirmedPacketId, $station->latestConfirmedPacketTimestamp); ?> - <?php if ($latestConfirmedPacket->isExistingObject() && $latestConfirmedPacket->posambiguity > 0) : ?> - <div> - <div class="overview-content-summary-hr-indent">Posambiguity:</div> - <div class="overview-content-summary-cell-posambiguity overview-content-summary-indent" title="If posambiguity is active the gps position is inaccurate">Yes</div> - </div> - <?php endif;?> - - <?php if ($latestConfirmedPacket->isExistingObject()) : ?> - <?php if ($latestConfirmedPacket->speed != '' || $latestConfirmedPacket->course != '' || $latestConfirmedPacket->altitude != '') : ?> - <?php if (round($latestConfirmedPacket->speed) != 0 || round($latestConfirmedPacket->course) != 0 || round($latestConfirmedPacket->altitude) != 0) : ?> - - <?php if ($latestConfirmedPacket->speed != '') : ?> - <div> - <div class="overview-content-summary-hr-indent">Speed:</div> - <div title="Latest speed" class="overview-content-summary-indent"> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertKilometerToMile($latestConfirmedPacket->speed), 2); ?> mph - <?php else : ?> - <?php echo round($latestConfirmedPacket->speed, 2); ?> km/h - <?php endif; ?> - </div> - </div> - <?php endif;?> - - <?php if ($latestConfirmedPacket->course != '') : ?> - <div> - <div class="overview-content-summary-hr-indent">Course:</div> - <div title="Latest course" class="overview-content-summary-indent"><?php echo $latestConfirmedPacket->course; ?>°</div> - </div> - <?php endif;?> - - <?php if ($latestConfirmedPacket->altitude != '') : ?> - <div> - <div class="overview-content-summary-hr-indent">Altitude:</div> - <div title="Latest altitude" class="overview-content-summary-indent"> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertMeterToFeet($latestConfirmedPacket->altitude), 2); ?> ft - <?php else : ?> - <?php echo round($latestConfirmedPacket->altitude, 2); ?> m - <?php endif; ?> - </div> - </div> - <?php endif;?> - - <?php endif;?> - <?php endif;?> - - <?php if ($latestConfirmedPacket->getPacketOgn()->isExistingObject()) : ?> - <?php if ($latestConfirmedPacket->getPacketOgn()->ognClimbRate !== null) : ?> - <div> - <div class="overview-content-summary-hr-indent">Climb Rate:</div> - <div class="overview-content-summary-indent" title="The climb rate in feet-per-minute"><?php echo $latestConfirmedPacket->getPacketOgn()->ognClimbRate; ?> fpm</div> - </div> - <?php endif;?> - - <?php if ($latestConfirmedPacket->getPacketOgn()->ognTurnRate !== null) : ?> - <div> - <?php $turnRateNote = true; ?> - <div class="overview-content-summary-hr-indent">Turn Rate:</div> - <div class="overview-content-summary-indent" title="Current turn rate."><?php echo $latestConfirmedPacket->getPacketOgn()->ognTurnRate; ?> rot</div> - </div> - <?php endif;?> - <?php endif;?> - <?php endif;?> - - <!-- Latest PHG and RNG --> - <?php if ($latestConfirmedPacket && $latestConfirmedPacket->isExistingObject()) : ?> - <?php if ($latestConfirmedPacket->phg != null || $latestConfirmedPacket->latestPhgTimestamp != null) : ?> - <div class="overview-content-divider"></div> - <div> - <div class="overview-content-summary-hr">Latest PHG:</div> - <div class="overview-content-summary-cell-phg" title="Power-Height-Gain (and directivity)"> - <?php echo $latestConfirmedPacket->getPHGDescription(true); ?><br/> - (Calculated range: - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertKilometerToMile($latestConfirmedPacket->getPHGRange(true)/1000),2); ?> miles) - <?php else : ?> - <?php echo round($latestConfirmedPacket->getPHGRange(true)/1000,2); ?> km) - <?php endif; ?> - </div> - </div> - <?php endif;?> - - <?php if ($latestConfirmedPacket->rng != null || $latestConfirmedPacket->latestRngTimestamp != null) : ?> - <div class="overview-content-divider"></div> - <div> - <div class="overview-content-summary-hr">Latest RNG:</div> - <div class="overview-content-summary-cell-phg" title="The pre-calculated radio range"> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertKilometerToMile($latestConfirmedPacket->getRng(true)), 2); ?> miles - <?php else : ?> - <?php echo round($latestConfirmedPacket->getRng(true), 2); ?> km - <?php endif; ?> - </div> - </div> - <?php endif;?> - <?php endif;?> - <?php endif;?> - - <!-- Latest Symbols --> - <?php $stationLatestSymbols = $station->getLatestIconFilePaths(22, 22); ?> - <?php if ($stationLatestSymbols !== null && count($stationLatestSymbols) > 1) : ?> - <div class="overview-content-divider"></div> - <div> - <div class="overview-content-summary-hr">Latest used symbols:</div> - <div title="Latest symbols that this station has used"> - <?php foreach ($stationLatestSymbols as $symbolPath) : ?> - <img src="<?php echo $symbolPath; ?>" alt="Symbol"/> - <?php endforeach; ?> - </div> - </div> - <?php endif; ?> - - - <!-- Packet Frequency --> - <?php $packetFrequencyNumberOfPackets = null; ?> - <?php $stationPacketFrequency = $station->getPacketFrequency(null, $packetFrequencyNumberOfPackets); ?> - <?php if ($stationPacketFrequency != null) : ?> - <div class="overview-content-divider"></div> - <div> - <div class="overview-content-summary-hr">Packet frequency:</div> - <div class="overview-content-packet-frequency" title="Calculated packet frequency"><span><?php echo $stationPacketFrequency; ?>s</span> <span>(Latest <?php echo $packetFrequencyNumberOfPackets; ?> packets)</span></div> - </div> - <?php endif; ?> - - - <div class="overview-content-divider"></div> - </div> - - <div class="overview-content-symbol" id ="overview-content-symbol-<?php echo $station->id; ?>"> - <img src="<?php echo $station->getIconFilePath(150, 150); ?>" alt="Latest symbol" title="<?php echo $station->getLatestSymbolDescription(); ?>"/> - <?php if ($station->latestPacketId !== null) : ?> - <br/> - <div style="text-align: center; padding-top: 30px;"> - <?php if ($station->getOgnDevice() !== null && $station->getOgnDevice()->registration != null) : ?> - <div> - Search for <a href="https://www.jetphotos.com/registration/<?php echo $station->getOgnDevice()->registration; ?>" target="_blank"><?php echo htmlspecialchars($station->getOgnDevice()->registration); ?></a> photos! - </div> - <?php endif; ?> - - <?php if ($station->sourceId == 1) : ?> - <?php if ($station->getLiklyHamRadioCallsign() !== null) : ?> - <div>Search for <a href="https://www.qrz.com/db/<?php echo $station->getLiklyHamRadioCallsign(); ?>" target="_blank"><?php echo htmlspecialchars($station->getLiklyHamRadioCallsign()); ?></a> at QRZ</div> - <?php endif; ?> - <?php endif; ?> - - <div>Export <a href="/data/kml.php?id=<?php echo $station->id; ?>"><?php echo htmlspecialchars($station->name); ?></a> data to KML</div> - </div> - <div style="clear: both;"></div> - <?php endif; ?> - </div> - - <div class="horizontal-line"> </div> - - <div class="overview-content-summary"> - - <!-- Related stations --> - <?php $relatedStations = StationRepository::getInstance()->getRelatedObjectListByStationId($station->id, 15); ?> - <?php if (count($relatedStations) > 1) : ?> - <div> - <?php $relatedStattionNote = true; ?> - <div class="overview-content-summary-hr">Related stations/objects:</div> - <div class="overview-content-station-list" title="Stations with same call except SSID or objects with related sender"> - <?php foreach ($relatedStations as $relatedStation) : ?> - <?php if ($relatedStation->id != $station->id) : ?> - <img src="<?php echo $relatedStation->getIconFilePath(22, 22); ?>" alt="Symbol"/> - <span><a class="tdlink" href="/views/overview.php?id=<?php echo $relatedStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($relatedStation->name) ?></a></span> - <br/> - <?php endif; ?> - <?php endforeach; ?> - </div> - </div> - <div class="overview-content-divider"></div> - <?php endif; ?> - - - <!-- Close by stations --> - <?php $closeByStations = StationRepository::getInstance()->getCloseByObjectListByStationId($station->id, 15); ?> - <?php if (count($closeByStations) > 1) : ?> - <div> - <div class="overview-content-summary-hr">Nearby stations/objects:</div> - <div class="overview-content-station-list" title="The closest stations/objects at the current position"> - <?php foreach ($closeByStations as $closeByStation) : ?> - <?php if ($closeByStation->id != $station->id) : ?> - - <img src="<?php echo $closeByStation->getIconFilePath(22, 22); ?>" alt="Symbol"/> - <span> - <a class="tdlink" href="/views/overview.php?id=<?php echo $closeByStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($closeByStation->name) ?></a> - <span> - <?php if (isImperialUnitUser()) : ?> - <?php if (convertMeterToYard($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude)) < 1000) : ?> - <?php echo round(convertMeterToYard($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude)), 0); ?> yd - <?php else : ?> - <?php echo round(convertKilometerToMile($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude) / 1000), 2); ?> miles - <?php endif; ?> - <?php else : ?> - <?php if ($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude) < 1000) : ?> - <?php echo round($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude), 0); ?> m - <?php else : ?> - <?php echo round($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude) / 1000, 2); ?> km - <?php endif; ?> - <?php endif; ?> - </span> - - </span> - <br/> - <?php endif; ?> - <?php endforeach; ?> - </div> - </div> - <div class="overview-content-divider"></div> - <?php endif; ?> - </div> - - <?php if (count($relatedStations) > 1 || count($closeByStations) > 1) : ?> - <div class="horizontal-line"> </div> - <?php endif; ?> - - <div class="overview-content-explanations"> - <ul> - <li>The specified "Station ID" is the ID that this station has on this website, this ID is useful when creating a link to this website. Read more in the About/FAQ.</li> - - <?php if ($station->sourceId == 5) : ?> - <li>Packets is received from the <a target="_blank" href="http://wiki.glidernet.org/">Open Glider Network</a>. The goal of the Open Glider Network project is to create a unified platform for tracking aircraft equipped with FLARM and OGN trackers.</li> - - <li>Aircraft device details such as Registration, CN and Aircraft Model is collected from the <a target="_blank" href="http://wiki.glidernet.org/ddb">OGN Devices DataBase</a>. We will only display information that can be used to identify an aircraft if the aircraft device details exists in the OGN Devices DataBase, and if the setting "I don't want this device to be identified" is deactivated.</li> - - <li>Detailed aircraft information is received from the <a target="_blank" rel="nofollow" href="http://wiki.glidernet.org/ddb">OGN Devices DataBase</a>. If the aircraft is not registered in the <a target="_blank" rel="nofollow" href="http://wiki.glidernet.org/ddb">OGN Devices DataBase</a> or if the aircraft does not want to be identified, the aircraft type indicated in the FLARM/OGN packet is displayed (but only if the website is configured to show aircrafts not registered in the database, that setting is not enabled by default). We also adapt which symbol that is used based on the selected aircraft type.</li> - - <li>According to <a target="_blank" href="http://wiki.glidernet.org/">OGN</a>, 4-5dB is about the limit of meaningful reception (but currently we still save packets with low SNR).</li> - - <li>According to <a target="_blank" href="http://wiki.glidernet.org/">OGN</a>, it is recommended that you ignore packets that have a high CRC error rate (>5) as their information may be corrupt (but currently we still save packets with high CRC error rate).</li> - - <li>1rot is the standard aircraft rotation rate of 1 half-turn per minute (equal to 1.5° per second).</li> - <?php endif; ?> - - <?php if ($station->sourceId == 1) : ?> - <li>To get a better understanding of the APRS path I recommend reading <a target="_blank" rel="nofollow" href="http://wa8lmf.net/DigiPaths/">the explanation written by wa8lmf</a>.</li> - - <li>If this packet has the "Posambiguity"-mark it means that the sent position is ambiguous (a configured number of digits has been truncated from the end of the position).</li> - - <li>PHG stands for Power-Height-Gain (and directivity). The height is not the height above sea-level, it is the height above average terrain (HAAT = Height Above Average Terrain). PHG is used to calculate the relative RF range of a station. If this station has reported several positions or symbols the PHG data will only be used for the position and symbol used in the PHG-packet.</li> - - <li>RNG is the "pre-calculated omni-directional radio range" of the station (reported by the station itself). If this station has reported several positions or symbols the RNG data will only be used for the position and symbol used in the RNG-packet. It seems like many D-STAR station use the RNG value to specifify D-STAR range.</li> - - <li>One object may be sent by several different senders. On the map they may share the same path, but they all have their own "Station information" modal.</li> - - <li>If station has more than 15 related stations we will only show the 10 closest related stations.</li> - <?php endif; ?> - - <?php if ($station->sourceId == 2) : ?> - <li>Station data is received from the CWOP network (Citizen Weather Observer Program). Visit <a href="http://www.wxqa.com/cwop_info.htm" target="_blank">CWOP Information</a> if you want know more!</li> - - - <?php endif; ?> - - </ul> - </div> - </div> - - <script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('#overview-content-comment, #overview-content-beacon, #overview-content-status').each(function() { - if ($(this).html().trim() != '') { - $(this).html(Autolinker.link($(this).html())); - } - }); - - $('#latest-timestamp, #comment-timestamp, #status-timestamp, #beacon-timestamp, #position-timestamp, #weather-timestamp, #telemetry-timestamp').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - if ($('#latest-timestamp-age').length && $('#latest-timestamp-age').html().trim() != '' && !isNaN($('#latest-timestamp-age').html().trim())) { - $('#latest-timestamp-age').html(moment(new Date(1000 * $('#latest-timestamp-age').html())).locale('en').fromNow()); - } - - if (window.trackdirect) { - <?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?> - window.trackdirect.addListener("map-created", function() { - if (!window.trackdirect.focusOnStation(<?php echo $station->id ?>, true)) { - window.trackdirect.setCenter(<?php echo $station->latestConfirmedLatitude ?>, <?php echo $station->latestConfirmedLongitude ?>); - } - }); - <?php endif; ?> - } - }); - </script> -<?php endif; ?> diff --git a/htdocs/public/views/raw.php b/htdocs/public/views/raw.php deleted file mode 100644 index 9e776baa1786b786e9e774e001d8040275b4c12a..0000000000000000000000000000000000000000 --- a/htdocs/public/views/raw.php +++ /dev/null @@ -1,510 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?> -<?php if ($station->isExistingObject()) : ?> - - <?php - $page = $_GET['page'] ?? 1; - $rows = $_GET['rows'] ?? 25; - $offset = ($page - 1) * $rows; - - if (($_GET['category'] ?? 1) == 2) { - $packets = PacketRepository::getInstance()->getObjectListWithRawBySenderStationId($station->id, $rows, $offset); - $count = PacketRepository::getInstance()->getNumberOfPacketsWithRawBySenderStationId($station->id); - } else { - $packets = PacketRepository::getInstance()->getObjectListWithRawByStationId($station->id, $rows, $offset); - $count = PacketRepository::getInstance()->getNumberOfPacketsWithRawByStationId($station->id); - } - - $pages = ceil($count / $rows); - ?> - - <title><?php echo $station->name; ?> Raw Packets</title> - <div class="modal-inner-content"> - <div class="modal-inner-content-menu"> - <a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Overview</a> - <a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Statistics</a> - <a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Trail Chart</a> - <a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Weather</a> - <a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Telemetry</a> - <span>Raw packets</span> - </div> - - <div class="horizontal-line"> </div> - - <p> - This is the latest recevied packets stored in our database for station/object <?php echo $station->name; ?>. If no packets are shown the sender has not sent any packets the latest 24 hours. - </p> - - <?php if ($station->sourceId == 5) : ?> - <p> - We do not save raw packets for aircrafts that do not exists in the <a target="_blank" href="http://wiki.glidernet.org/ddb">OGN Devices DataBase</a>. We will only display information that can be used to identify an aircraft if the aircraft device details exists in the OGN Devices DataBase, and if the setting "I don't want this device to be identified" is deactivated. - </p> - <?php else : ?> - <p> - If you compare the raw packets with similar data from other websites it may differ (especially the path), the reason is that we are not collecting packets from the same APRS-IS servers. Each APRS-IS server performes duplicate filtering, and which packet that is considered to be a duplicate may differ depending on which APRS-IS server you receive your data from. - </p> - <?php endif; ?> - - <div class="form-container"> - <?php if ($station->stationTypeId == 1) : ?> - <select id="raw-category" style="float:left; margin-right: 5px;"> - <option <?php echo (($_GET['category'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Packets regarding <?php echo $station->name; ?></option> - <option <?php echo (($_GET['category'] ?? 1) == 2 ? 'selected' : ''); ?> value="2">Packets sent by <?php echo $station->name; ?></option> - </select> - <?php endif; ?> - - <select id="raw-type" style="float:left; margin-right: 5px;"> - <option <?php echo (($_GET['type'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Raw Packets</option> - <option <?php echo (($_GET['type'] ?? 1) == 2 ? 'selected' : ''); ?> value="2">Decoded Data</option> - </select> - - <select id="raw-rows" style="float:left; margin-right: 5px;" class="pagination-rows"> - <option <?php echo ($rows == 25 ? 'selected' : ''); ?> value="25">25 rows</option> - <option <?php echo ($rows == 50 ? 'selected' : ''); ?> value="50">50 rows</option> - <option <?php echo ($rows == 100 ? 'selected' : ''); ?> value="100">100 rows</option> - <option <?php echo ($rows == 200 ? 'selected' : ''); ?> value="200">200 rows</option> - <option <?php echo ($rows == 300 ? 'selected' : ''); ?> value="300">300 rows</option> - </select> - </div> - - <?php if ($pages > 1): ?> - <div class="pagination"> - <a class="tdlink" href="/views/raw.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1) ?>&type=<?php echo ($_GET['type'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=1"><<</a> - <?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?> - <a href="/views/raw.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1) ?>&type=<?php echo ($_GET['type'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a> - <?php endfor; ?> - <a class="tdlink" href="/views/raw.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1) ?>&type=<?php echo ($_GET['type'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $pages; ?>">>></a> - </div> - <?php endif; ?> - - <div id="raw-content-output"> - <?php foreach (array_slice($packets, 0, $rows) as $packet) : ?> - <?php if (($_GET['type'] ?? 1) == 1) : ?> - <p> - <span class="raw-packet-timestamp"><?php echo $packet->timestamp; ?></span>: - - <?php if (in_array($packet->mapId, Array(3, 6))) : ?> - <span class="raw-packet-error"> - <?php else : ?> - <span> - <?php endif; ?> - - <?php echo str_replace_first(htmlspecialchars($station->name . '>'), '<b>' . htmlspecialchars($station->name) . '</b>>', htmlspecialchars($packet->raw)); ?> - - <?php if ($packet->mapId == 3) : ?> - <b>[Duplicate]</b> - <?php elseif ($packet->mapId == 6) : ?> - <b>[Received in wrong order]</b> - <?php endif; ?> - - </span> - </p> - <?php elseif (($_GET['type'] ?? 1) == 2) : ?> - <div class="decoded"> - <div class="datagrid"> - <table> - <thead> - <tr> - <th colspan="2"> - <?php if (in_array($packet->mapId, Array(3, 6))) : ?> - <span class="raw-packet-error"> - <?php else : ?> - <span> - <?php endif; ?> - <span class="raw-packet-timestamp"><?php echo $packet->timestamp; ?></span> - - <?php if ($packet->mapId == 3) : ?> - <b>[Duplicate]</b> - <?php elseif ($packet->mapId == 6) : ?> - <b>[Received in wrong order]</b> - <?php endif; ?> - </span> - </th> - </tr> - </thead> - <tbody> - <tr> - <td>Raw</td> - <td> - <?php echo str_replace_first(htmlspecialchars($station->name . '>'), '<b>' . htmlspecialchars($station->name) . '</b>>', htmlspecialchars($packet->raw)); ?> - </td> - </tr> - - <tr><td>Packet type</td><td><?php echo $packet->getPacketTypeName(); ?></td></tr> - - <?php if ($packet->getStationObject()->stationTypeId == 2) : ?> - <tr><td>Object/Item name</td><td><?php echo htmlspecialchars($packet->getStationObject()->name); ?></td></tr> - <?php else : ?> - <tr><td>Callsign</td><td><?php echo htmlspecialchars($packet->getStationObject()->name); ?></td></tr> - <?php endif; ?> - - <?php if ($packet->getStationObject()->name != $packet->getSenderObject()->name) : ?> - <tr><td>Sender</td><td><?php echo htmlspecialchars($packet->getSenderObject()->name); ?></td></tr> - <?php endif; ?> - - <tr><td>Path</td><td><?php echo htmlspecialchars($packet->rawPath); ?></td></tr> - - <?php if ($packet->reportedTimestamp != null) : ?> - <tr><td>Reported time</td><td><?php echo $packet->reportedTimestamp; ?> - <span class="raw-packet-timestamp"><?php echo $packet->reportedTimestamp; ?></span></td></tr> - <?php endif; ?> - - <?php if ($packet->latitude != null && $packet->longitude != null) : ?> - <tr><td>Latitude</td><td><?php echo round($packet->latitude, 5); ?></td></tr> - <tr><td>Longitude</td><td><?php echo round($packet->longitude, 5); ?></td></tr> - <?php endif; ?> - - <?php if ($packet->symbol != null && $packet->symbolTable != null) : ?> - <tr><td>Symbol</td><td><?php echo htmlspecialchars($packet->symbol); ?></td></tr> - <tr><td>Symbol table</td><td><?php echo htmlspecialchars($packet->symbolTable); ?></td></tr> - <?php endif; ?> - - <?php if ($packet->speed != null) : ?> - <?php if (isImperialUnitUser()) : ?> - <tr><td>Speed</td><td><?php echo convertKilometerToMile($packet->speed); ?> mph</td></tr> - <?php else : ?> - <tr><td>Speed</td><td><?php echo $packet->speed; ?> km/h</td></tr> - <?php endif; ?> - <?php endif; ?> - - <?php if ($packet->course != null) : ?> - <tr><td>Course</td><td><?php echo $packet->course; ?>°</td></tr> - <?php endif; ?> - - <?php if ($packet->altitude != null) : ?> - <?php if (isImperialUnitUser()) : ?> - <tr><td>Altitude</td><td><?php echo convertMeterToFeet($packet->altitude); ?> ft</td></tr> - <?php else : ?> - <tr><td>Altitude</td><td><?php echo $packet->altitude; ?> m</td></tr> - <?php endif; ?> - <?php endif; ?> - - <?php if ($packet->comment != null) : ?> - <?php if ($packet->packetTypeId == 10) : ?> - <tr><td>Status</td><td><?php echo htmlspecialchars($packet->comment); ?></td></tr> - <?php elseif ($packet->packetTypeId == 7) : ?> - <tr><td>Beacon</td><td><?php echo htmlspecialchars($packet->comment); ?></td></tr> - <?php else : ?> - <tr><td>Comment</td><td><?php echo htmlspecialchars($packet->comment); ?></td></tr> - <?php endif; ?> - <?php endif; ?> - - <?php if ($packet->posambiguity == 1) : ?> - <tr><td>Posambiguity</td><td>Yes</td></tr> - <?php endif; ?> - - <?php if ($packet->phg != null) : ?> - <?php if (isImperialUnitUser()) : ?> - <tr><td>PHG</td><td><?php echo $packet->phg; ?> (Calculated range: <?php echo round(convertKilometerToMile($packet->getPHGRange()/1000),2); ?> miles)</td></tr> - <?php else : ?> - <tr><td>PHG</td><td><?php echo $packet->phg; ?> (Calculated range: <?php echo round($packet->getPHGRange()/1000,2); ?> km)</td></tr> - <?php endif; ?> - <?php endif; ?> - - <?php if ($packet->rng != null) : ?> - <tr><td>RNG</td><td><?php echo $packet->rng; ?></td></tr> - <?php endif; ?> - - <?php if ($station->latestWeatherPacketTimestamp !== null) : ?> - <?php $weather = $packet->getPacketWeather(); ?> - <?php if ($weather->isExistingObject()) : ?> - <tr> - <td>Weather</td> - <td> - <table> - <tbody> - <?php if ($weather->wxRawTimestamp !== null) : ?> - <tr> - <td>Time:</td><td><span class="raw-packet-timestamp"><?php echo $weather->wxRawTimestamp; ?></span></td> - </tr> - <?php endif; ?> - - <?php if ($weather->temperature !== null) : ?> - <tr> - <td>Temperature:</td> - <?php if (isImperialUnitUser()) : ?> - <td><?php echo round(convertCelciusToFahrenheit($weather->temperature), 2); ?>° F</td> - <?php else : ?> - <td><?php echo round($weather->temperature, 2); ?>° C</td> - <?php endif; ?> - </tr> - <?php endif; ?> - - <?php if ($weather->humidity !== null) : ?> - <tr> - <td>Humidity:</td> - <td><?php echo $weather->humidity; ?>%</td> - </tr> - <?php endif; ?> - - <?php if ($weather->pressure !== null) : ?> - <tr> - <td>Pressure:</td> - <?php if (isImperialUnitUser()) : ?> - <td><?php echo round(convertMbarToMmhg($weather->pressure),1); ?> mmHg</td> - <?php else : ?> - <td><?php echo round($weather->pressure,1); ?> hPa</td> - <?php endif; ?> - </tr> - <?php endif; ?> - - <?php if ($weather->rain_1h !== null) : ?> - <tr> - <td>Rain latest hour:</td> - <?php if (isImperialUnitUser()) : ?> - <td><?php echo round(convertMmToInch($weather->rain_1h),2); ?> in</td> - <?php else : ?> - <td><?php echo round($weather->rain_1h,2); ?> mm</td> - <?php endif; ?> - </tr> - <?php endif; ?> - - <?php if ($weather->rain_24h !== null) : ?> - <tr> - <td>Rain latest 24h hours:</td> - <?php if (isImperialUnitUser()) : ?> - <td><?php echo round(convertMmToInch($weather->rain_24h),2); ?> in</td> - <?php else : ?> - <td><?php echo round($weather->rain_24h,2); ?> mm</td> - <?php endif; ?> - </tr> - <?php endif; ?> - - <?php if ($weather->rain_since_midnight !== null) : ?> - <tr> - <td>Rain since midnight:</td> - <?php if (isImperialUnitUser()) : ?> - <td><?php echo round(convertMmToInch($weather->rain_since_midnight),2); ?> in</td> - <?php else : ?> - <td><?php echo round($weather->rain_since_midnight,2); ?> mm</td> - <?php endif; ?> - </tr> - <?php endif; ?> - - <?php if (isImperialUnitUser()) : ?> - <?php if ($weather->wind_speed !== null && $weather->wind_speed > 0) : ?> - <tr> - <td>Wind Speed:</td> - <td><?php echo round(convertMpsToMph($weather->wind_speed), 2); ?> mph, <?php echo $weather->wind_direction; ?>°</td> - </tr> - <?php elseif($weather->wind_speed !== null) : ?> - <tr> - <td>Wind Speed:</td> - <td><?php echo round(convertMpsToMph($weather->wind_speed), 2); ?> mph</td> - </tr> - <?php endif; ?> - - <?php else : ?> - <?php if ($weather->wind_speed !== null && $weather->wind_speed > 0) : ?> - <tr> - <td>Wind Speed:</td> - <td><?php echo round($weather->wind_speed, 2); ?> m/s, <?php echo $weather->wind_direction; ?>°</td> - </tr> - <?php elseif($weather->wind_speed !== null) : ?> - <tr> - <td>Wind Speed:</td> - <td><?php echo round($weather->wind_speed, 2); ?> m/s</td> - </tr> - <?php endif; ?> - <?php endif; ?> - - <?php if ($weather->luminosity !== null) : ?> - <tr> - <td>Luminosity:</td><td><?php echo round($weather->luminosity,0); ?> W/m²</td> - </tr> - <?php endif; ?> - - <?php if ($weather->snow !== null) : ?> - <tr> - <?php if (isImperialUnitUser()) : ?> - <td>Snow:</td><td><?php echo round(convertMmToInch($weather->snow), 0); ?> in</td> - <?php else : ?> - <td>Snow:</td><td><?php echo round($weather->snow, 0); ?> mm</td> - <?php endif; ?> - </tr> - <?php endif; ?> - </tbody> - </table> - </td> - </tr> - - <?php endif; ?> - <?php endif; ?> - - <?php if ($station->latestTelemetryPacketTimestamp !== null) : ?> - <?php $telemetry = $packet->getPacketTelemetry(); ?> - <?php if ($telemetry->isExistingObject()) : ?> - <tr> - <td>Telemetry Analog Values</td> - <td> - <table> - <tbody> - <?php for ($i = 1; $i<=5; $i++) : ?> - <?php if ($telemetry->isValueSet($i)) : ?> - <tr> - <td><?php echo htmlspecialchars($telemetry->getValueParameterName($i)); ?>:</td> - <td><?php echo round($telemetry->getValue($i), 2); ?> <?php echo htmlspecialchars($telemetry->getValueUnit($i)); ?></td> - </tr> - <?php endif; ?> - <?php endfor; ?> - </tbody> - </table> - </td> - </tr> - <?php if ($telemetry->bits !== null) : ?> - <tr> - <td>Telemetry Bit Values</td> - <td> - <table> - <tbody> - <?php for ($i = 1; $i<=8; $i++) : ?> - <tr> - <td><?php echo htmlspecialchars($telemetry->getBitParameterName($i)); ?>:</td> - <td><?php echo $telemetry->getBit($i); ?></td> - </tr> - <?php endfor; ?> - </tbody> - </table> - </td> - </tr> - <?php endif; ?> - <?php endif; ?> - - - <?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':UNIT.')) : ?> - <?php $pos = strpos($packet->raw, ':UNIT.'); ?> - <tr> - <td>Telemetry UNIT</td> - <td> - <?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?> - </td> - </tr> - <?php endif; ?> - - <?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':BITS.')) : ?> - <?php $pos = strpos($packet->raw, ':BITS.'); ?> - <tr> - <td>Telemetry BITS</td> - <td> - <?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?> - </td> - </tr> - <?php endif; ?> - - <?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':EQNS.')) : ?> - <?php $pos = strpos($packet->raw, ':EQNS.'); ?> - <tr> - <td>Telemetry EQNS</td> - <td> - <?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?> - </td> - </tr> - <?php endif; ?> - - <?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':PARM.')) : ?> - <?php $pos = strpos($packet->raw, ':PARM.'); ?> - <tr> - <td>Telemetry PARM</td> - <td> - <?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?> - </td> - </tr> - <?php endif; ?> - <?php endif; ?> - - <?php if ($packet->getPacketOgn()->isExistingObject()) : ?> - <?php if ($packet->getPacketOgn()->ognSignalToNoiseRatio !== null) : ?> - <tr> - <td>Signal to Noise Ratio</td> - <td> - <?php echo $packet->getPacketOgn()->ognSignalToNoiseRatio; ?> dB - </td> - </tr> - <?php endif;?> - - <?php if ($packet->getPacketOgn()->ognBitErrorsCorrected !== null) : ?> - <tr> - <td>Bits corrected</td> - <td> - <?php echo $packet->getPacketOgn()->ognBitErrorsCorrected; ?> - </td> - </tr> - <?php endif;?> - - <?php if ($packet->getPacketOgn()->ognFrequencyOffset !== null) : ?> - <tr> - <td>Frequency Offset</td> - <td> - <?php echo $packet->getPacketOgn()->ognFrequencyOffset; ?> kHz - </td> - </tr> - <?php endif;?> - - <?php if ($packet->getPacketOgn()->ognClimbRate !== null) : ?> - <tr> - <td>Climb Rate</td> - <td> - <?php echo $packet->getPacketOgn()->ognClimbRate; ?> fpm - </td> - </tr> - <?php endif;?> - - <?php if ($packet->getPacketOgn()->ognTurnRate !== null) : ?> - <tr> - <td>Turn Rate</td> - <td> - <?php echo $packet->getPacketOgn()->ognTurnRate; ?> fpm - </td> - </tr> - <?php endif;?> - <?php endif;?> - </tbody> - </table> - </div> - </div> - <?php endif; ?> - <?php endforeach; ?> - </div> - - <?php if (count($packets) == 0) : ?> - <p> - <b><i>No raw packets found.</i></b> - </p> - <?php endif; ?> - </div> - - <script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.raw-packet-timestamp').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - $('#raw-category').change(function () { - loadView("/views/raw.php?id=<?php echo $station->id ?>&type=" + $('#raw-type').val() + "&category=" + $('#raw-category').val() + "&rows=" + $('#raw-rows').val() + "&page=1"); - }); - - $('#raw-type').change(function () { - loadView("/views/raw.php?id=<?php echo $station->id ?>&type=" + $('#raw-type').val() + "&category=" + $('#raw-category').val() + "&rows=" + $('#raw-rows').val() + "&page=1"); - }); - - $('#raw-rows').change(function () { - loadView("/views/raw.php?id=<?php echo $station->id ?>&type=" + $('#raw-type').val() + "&category=" + $('#raw-category').val() + "&rows=" + $('#raw-rows').val() + "&page=1"); - }); - - if (window.trackdirect) { - <?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?> - window.trackdirect.addListener("map-created", function() { - if (!window.trackdirect.focusOnStation(<?php echo $station->id ?>, true)) { - window.trackdirect.setCenter(<?php echo $station->latestConfirmedLatitude ?>, <?php echo $station->latestConfirmedLongitude ?>); - } - }); - <?php endif; ?> - } - }); - </script> -<?php endif; ?> diff --git a/htdocs/public/views/search.php b/htdocs/public/views/search.php deleted file mode 100644 index 4f5b3046e74a55d9ffe32f05a76b616ca9bf2977..0000000000000000000000000000000000000000 --- a/htdocs/public/views/search.php +++ /dev/null @@ -1,132 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php - $stations = []; - $seconds = $_GET['seconds'] ?? 0; - $page = $_GET['page'] ?? 1; - $rows = $_GET['rows'] ?? 50; - $offset = ($page - 1) * $rows; - $count = 0; - if (isset($_GET['q'])) { - $stations = StationRepository::getInstance()->getObjectListByQueryString($_GET['q'], $seconds, $rows, $offset); - $count = StationRepository::getInstance()->getNumberOfStationsByQueryString($_GET['q'], $seconds); - } - $pages = ceil($count / $rows); -?> - -<title>Station search</title> -<div class="modal-inner-content" style="padding-bottom: 30px;"> - <p> - Search by entering the beginning of the station name/id (or just click search to list all). - </p> - - <form id="station-search-form" method="get" action=""> - <div style="margin-bottom: 5px;"> - <select name ="seconds" style="width: 280px;" id="station-search-form-seconds"> - <option <?php echo ($seconds == 0 ? 'selected' : ''); ?> value="0">Include all known stations in search</option> - <option <?php echo ($seconds == 60 ? 'selected' : ''); ?> value="60">Only stations active latest hour</option> - <option <?php echo ($seconds == 360 ? 'selected' : ''); ?> value="360">Only stations active latest 6 hours</option> - <option <?php echo ($seconds == 720 ? 'selected' : ''); ?> value="720">Only stations active latest 12 hours</option> - </select> - </div> - <div> - <input type="text" style="width: 280px; margin-bottom: 5px;" id="station-search-form-q" name="q" placeholder="Search here!" title="Search for a station/vehicle here!" value="<?php echo ($_GET['q'] ?? '') ?>"> - <input type="submit" value="Search"> - </div> - </form> - - <div style="clear: both;"></div> - - <?php if (count($stations) > 0) : ?> - <p> - <?php echo $count; ?> result(s): - </p> - - <?php if ($pages > 1): ?> - <div class="pagination"> - <a class="tdlink" href="/search.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=1"><<</a> - <?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?> - <a href="/search.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a> - <?php endfor; ?> - <a class="tdlink" href="/search.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $pages; ?>">>></a> - </div> - <?php endif; ?> - - <div class="datagrid datagrid-search" style="max-width:1000px;"> - <table> - <thead> - <tr> - <th> </th> - <th>Name/Id</th> - <th>Latest heard</th> - <th>Comment/Other</th> - <th>Map</th> - - </tr> - </thead> - <tbody> - <?php foreach ($stations as $foundStation) : ?> - <tr> - <td> - <img src="<?php echo $foundStation->getIconFilePath(22, 22); ?>" alt="Symbol"/> - </td> - <td> - <a class="tdlink" href="/views/overview.php?id=<?php echo $foundStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($foundStation->name) ?></a> - </td> - <td class="station-latest-heard-timestamp" style="white-space: nowrap;"> - <?php echo $foundStation->latestConfirmedPacketTimestamp; ?> - </td> - <td> - <?php if ($foundStation->sourceId == 5 && $foundStation->getOgnDevice() !== null) : ?> - <div style="width: 100px; display: inline-block;">Registration:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->registration); ?> <?php echo $foundStation->getOgnDevice()->cn ? '[' .htmlspecialchars($foundStation->getOgnDevice()->cn) . ']' : ''; ?><br/> - <div style="width: 100px; display: inline-block;">Aircraft Model:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->aircraftModel); ?> - <?php else : ?> - <?php $latestPacket = PacketRepository::getInstance()->getObjectById($foundStation->latestPacketId, $foundStation->latestPacketTimestamp); ?> - <?php echo htmlspecialchars($latestPacket->comment); ?> - <?php endif; ?> - </td> - <td> - <?php if ($foundStation->latestConfirmedPacketTimestamp > (time() - 60*60*24)) : ?> - <a href="?sid=<?php echo $foundStation->id; ?>" onclick=" - if (window.parent && window.parent.trackdirect) { - $('.modal', parent.document).hide(); - window.parent.trackdirect.filterOnStationId([]); - window.parent.trackdirect.filterOnStationId([<?php echo $foundStation->id; ?>]); - return false; - }">Map</a> - <?php else : ?> - - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - </div> - <?php endif; ?> - - <?php if (isset($_GET['q']) && count($stations) == 0) : ?> - <p> - <b><i>No stations packets found.</i></b> - </p> - <?php endif; ?> -</div> -<script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.station-latest-heard-timestamp').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - $('#station-search-form').bind('submit',function(e) { - var q = $('#station-search-form-q').val(); - var seconds = $('#station-search-form-seconds').val(); - loadView('/views/search.php?imperialUnits=<?php echo $_GET['imperialUnits'] ?? '0'; ?>&q=' + q + '&seconds=' + seconds); - e.preventDefault(); - }); - }); -</script> diff --git a/htdocs/public/views/statistics.php b/htdocs/public/views/statistics.php deleted file mode 100644 index 38903af5dcacf1d02ff5ad612540e9334a0102f4..0000000000000000000000000000000000000000 --- a/htdocs/public/views/statistics.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?> -<?php if ($station->isExistingObject()) : ?> - <?php - $days = 10; - if (!isAllowedToShowOlderData()) { - $days = 1; - } - ?> - <?php $senderStats = PacketPathRepository::getInstance()->getSenderPacketPathSatistics($station->id, time() - (60*60*24*$days)); ?> - <?php $receiverStats = PacketPathRepository::getInstance()->getReceiverPacketPathSatistics($station->id, time() - (60*60*24*$days)); ?> - - <title><?php echo $station->name; ?> Stats</title> - <div class="modal-inner-content"> - <div class="modal-inner-content-menu"> - <a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Overview</a> - <span>Statistics</span> - <a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Trail Chart</a> - <a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Weather</a> - <a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Telemetry</a> - <a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Raw packets</a> - </div> - - <div class="horizontal-line"> </div> - - <p> - The communication statistics that we show here may differ from similar communication statistics on other websites, the reason is probably that this website is not collecting packets from the same APRS servers. Each APRS server performes duplicate filtering, and which packet that is considered to be a duplicate may differ depending on which APRS server you receive your data from. - </p> - - <?php if (count($senderStats) > 0) : ?> - <p>Stations that heard <?php echo htmlspecialchars($station->name) ?> <b>directly</b> during the latest <?php echo $days; ?> day(s).</p> - <div class="datagrid datagrid-statistics" style="max-width:700px;"> - <table> - <thead> - <tr> - <th>Station</th> - <th>Number of packets</th> - <th>Latest heard</th> - <th>Longest distance</th> - </tr> - </thead> - <tbody> - <?php foreach ($senderStats as $stats) : ?> - <?php $otherStation = StationRepository::getInstance()->getObjectById($stats["station_id"]) ?> - <tr> - <td> - <img alt="Symbol" src="<?php echo $otherStation->getIconFilePath(22, 22); ?>" style="vertical-align: middle;"/> - <a class="tdlink" href="/views/overview.php?id=<?php echo $otherStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($otherStation->name) ?></a> - </td> - <td> - <?php echo $stats["number_of_packets"]; ?> - </td> - <td class="latest-heard"> - <?php echo $stats["latest_timestamp"];?> - </td> - - <td class="longest-distance"> - <?php if ($stats["longest_distance"] !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertKilometerToMile($stats["longest_distance"] / 1000), 2); ?> miles - <?php else : ?> - <?php echo round($stats["longest_distance"] / 1000, 2); ?> km - <?php endif; ?> - <?php else : ?> - - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - </div> - <br/> - <?php endif; ?> - - - <?php if (count($receiverStats) > 0) : ?> - <p>Stations <b>directly</b> heard by <?php echo htmlspecialchars($station->name); ?> during the latest <?php echo $days; ?> day(s).</p> - <div class="datagrid datagrid-statistics" style="max-width:700px;"> - <table> - <thead> - <tr> - <th>Station</th> - <th>Number of packets</th> - <th>Latest heard</th> - <th>Longest distance</th> - </tr> - </thead> - <tbody> - <?php foreach ($receiverStats as $stats) : ?> - <?php $otherStation = StationRepository::getInstance()->getObjectById($stats["station_id"]) ?> - <tr> - <td> - <img alt="Symbol" src="<?php echo $otherStation->getIconFilePath(22, 22); ?>" style="vertical-align: middle;"/> - <a class="tdlink" href="/views/overview.php?id=<?php echo $otherStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($otherStation->name) ?></a> - - </td> - <td> - <?php echo $stats["number_of_packets"]; ?> - </td> - <td class="latest-heard"> - <?php echo $stats["latest_timestamp"];?> - </td> - <td class="longest-distance"> - <?php if ($stats["longest_distance"] !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertKilometerToMile($stats["longest_distance"] / 1000), 2); ?> miles - <?php else : ?> - <?php echo round($stats["longest_distance"] / 1000, 2); ?> km - <?php endif; ?> - <?php else : ?> - - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - </div> - <br/> - <?php endif; ?> - - - <?php if (count($senderStats) == 0 && count($receiverStats) == 0): ?> - <p><i><b>No radio communication statistics during the latest <?php echo $days; ?> days.</b></i></p> - <?php endif; ?> - </div> - <script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.latest-heard').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - if (window.trackdirect) { - <?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?> - window.trackdirect.addListener("map-created", function() { - if (!window.trackdirect.focusOnStation(<?php echo $station->id ?>, true)) { - window.trackdirect.setCenter(<?php echo $station->latestConfirmedLatitude ?>, <?php echo $station->latestConfirmedLongitude ?>); - } - }); - <?php endif; ?> - } - }); - </script> -<?php endif; ?> diff --git a/htdocs/public/views/telemetry.php b/htdocs/public/views/telemetry.php deleted file mode 100644 index a425ae09113131582ed3813fec43d2695acdc17a..0000000000000000000000000000000000000000 --- a/htdocs/public/views/telemetry.php +++ /dev/null @@ -1,287 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?> -<?php if ($station->isExistingObject()) : ?> - <?php - $maxDays = 10; - if (!isAllowedToShowOlderData()) { - $maxDays = 1; - } - $page = $_GET['page'] ?? 1; - $rows = $_GET['rows'] ?? 25; - $offset = ($page - 1) * $rows; - $telemetryPackets = PacketTelemetryRepository::getInstance()->getLatestObjectListByStationId($station->id, $rows, $offset, $maxDays); - $latestPacketTelemetry = (count($telemetryPackets) > 0 ? $telemetryPackets[0] : new PacketTelemetry(null)); - $count = PacketTelemetryRepository::getInstance()->getLatestNumberOfPacketsByStationId($station->id, $maxDays); - $pages = ceil($count / $rows); - ?> - - <title><?php echo $station->name; ?> Telemetry</title> - <div class="modal-inner-content"> - <div class="modal-inner-content-menu"> - <a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Overview</a> - <a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Statistics</a> - <a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Trail Chart</a> - <a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Weather</a> - <span>Telemetry</span> - <a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Raw packets</a> - </div> - - <div class="horizontal-line"> </div> - - <?php if (count($telemetryPackets) > 0) : ?> - - <p>This is the latest recevied telemetry packets stored in our database for station/object <?php echo $station->name; ?>. If no packets are shown the sender has not sent any telemetry packets the latest <?php echo $maxDays; ?> day(s).</p> - <p>Telemetry packets is used to share measurements like repeteater parameters, battery voltage, radiation readings (or any other measurements).</p> - - <div class="form-container"> - <select id="telemetry-category" style="float:left; margin-right: 5px;"> - <option <?php echo (($_GET['category'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Telemetry Values</option> - <option <?php echo (($_GET['category'] ?? 1) == 2 ? 'selected' : ''); ?> value="2">Telemetry Bits</option> - </select> - - <select id="telemetry-rows" style="float:left; margin-right: 5px;" class="pagination-rows"> - <option <?php echo ($rows == 25 ? 'selected' : ''); ?> value="25">25 rows</option> - <option <?php echo ($rows == 50 ? 'selected' : ''); ?> value="50">50 rows</option> - <option <?php echo ($rows == 100 ? 'selected' : ''); ?> value="100">100 rows</option> - <option <?php echo ($rows == 200 ? 'selected' : ''); ?> value="200">200 rows</option> - <option <?php echo ($rows == 300 ? 'selected' : ''); ?> value="300">300 rows</option> - </select> - </div> - - <?php if ($pages > 1): ?> - <div class="pagination"> - <a class="tdlink" href="/views/telemetry.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=1"><<</a> - <?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?> - <a href="/views/telemetry.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a> - <?php endfor; ?> - <a class="tdlink" href="/views/telemetry.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $pages; ?>">>></a> - </div> - <?php endif; ?> - - <?php if (($_GET['category'] ?? 1) == 1) : ?> - <div class="datagrid datagrid-telemetry1" style="max-width:1000px;"> - <table> - <thead> - <tr> - <th>Time</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(1)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(2)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(3)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(4)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(5)); ?>*</th> - </tr> - </thead> - <tbody> - <?php foreach ($telemetryPackets as $packetTelemetry) : ?> - - <tr> - <td class="telemetrytime"> - <?php echo ($packetTelemetry->wxRawTimestamp != null?$packetTelemetry->wxRawTimestamp:$packetTelemetry->timestamp); ?> - </td> - <td> - <?php if ($packetTelemetry->val1 !== null) : ?> - <?php echo round($packetTelemetry->getValue(1), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(1)); ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <td> - <?php if ($packetTelemetry->val1 !== null) : ?> - <?php echo round($packetTelemetry->getValue(2), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(2)); ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <td> - <?php if ($packetTelemetry->val1 !== null) : ?> - <?php echo round($packetTelemetry->getValue(3), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(3)); ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <td> - <?php if ($packetTelemetry->val1 !== null) : ?> - <?php echo round($packetTelemetry->getValue(4), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(4)); ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <td> - <?php if ($packetTelemetry->val1 !== null) : ?> - <?php echo round($packetTelemetry->getValue(5), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(5)); ?> - <?php else : ?> - - - <?php endif; ?> - </td> - </tr> - - <?php endforeach; ?> - </tbody> - </table> - </div> - - <div class="telemetry-subtable"> - <div> - <div> - *Used Equation Coefficients: - </div> - <div> - <?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(1)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(1)); ?> - </div> - <div> - <?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(2)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(2)); ?> - </div> - <div> - <?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(3)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(3)); ?> - </div> - <div> - <?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(4)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(4)); ?> - </div> - <div> - <?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(5)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(5)); ?> - </div> - </div> - </div> - <?php endif; ?> - - <?php if (($_GET['category'] ?? 1) == 2) : ?> - <div class="datagrid datagrid-telemetry2" style="max-width:1000px;"> - <table> - <thead> - <tr> - <th>Time</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(1)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(2)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(3)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(4)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(5)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(6)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(7)); ?>*</th> - <th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(8)); ?>*</th> - </tr> - </thead> - <tbody> - <?php foreach ($telemetryPackets as $i => $packetTelemetry) : ?> - <?php if ($packetTelemetry->bits !== null && $i >= 2 ) : ?> - <tr> - <td class="telemetrytime"> - <?php echo $packetTelemetry->timestamp; ?> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(1) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(1)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(2) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(2)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(3) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(3)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(4) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(4)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(5) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(5)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(6) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(6)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(7) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(7)); ?> - </div> - </td> - <td> - <div class="<?php echo ($packetTelemetry->getBit(8) == 1?'telemetry-biton':'telemetry-bitoff'); ?>"> - <?php echo htmlspecialchars($packetTelemetry->getBitLabel(8)); ?> - </div> - </td> - </tr> - <?php endif; ?> - <?php endforeach; ?> - </tbody> - </table> - </div> - - <div class="telemetry-subtable"> - <div> - <div> - *Used Bit Sense: - </div> - <div> - <?php echo $latestPacketTelemetry->getBitSense(1); ?> - <?php echo $latestPacketTelemetry->getBitSense(2); ?> - <?php echo $latestPacketTelemetry->getBitSense(3); ?> - <?php echo $latestPacketTelemetry->getBitSense(4); ?> - <?php echo $latestPacketTelemetry->getBitSense(5); ?> - <?php echo $latestPacketTelemetry->getBitSense(6); ?> - <?php echo $latestPacketTelemetry->getBitSense(7); ?> - <?php echo $latestPacketTelemetry->getBitSense(8); ?> - </div> - </div> - </div> - <?php endif; ?> - <?php endif; ?> - - - <?php if (count($telemetryPackets) > 0) : ?> - <br/> - <ul> - <li>The parameter names for the analog channels will be Value1, Value2, Value3 (up to Value5) if station has not sent a PARAM-packet that specifies the parameter names for each analog channel.</li> - <li>Each analog value is a decimal number between 000 and 255 (according to APRS specifications). The receiver use the telemetry equation coefficientsto to restore the original sensor values. If no EQNS-packet with equation coefficients is sent we will show the values as is (this corresponds to the equation coefficients a=0, b=1 and c=0).<br/>The sent equation coefficients is used in the equation: a * value<sup>2</sup> + b * value + c.</li> - <li>The units for the analog values will not be shown if station has not sent a UNIT-packet specifying what unit's to use.</li> - <li>The parameter names for the digital bits will be Bit1, Bit2, Bit3 (up to Bit8) if station has not sent a PARAM-packet that specifies the parameter names for each digital bit.</li> - <li>All bit labels will be named "On" if station has not sent a UNIT-packet that specifies the label of each bit.</li> - <li>A bit is considered to be <b>On</b> when the bit is 1 if station has not sent a BITS-packet that specifies another "Bit sense" (a BITS-packet specify the state of the bits that match the BIT labels)</li> - </ul> - <?php endif; ?> - - <?php if (count($telemetryPackets) == 0) : ?> - <p><i><b>No recent telemetry values.</b></i></p> - <?php endif; ?> - - </div> - - <script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.telemetrytime').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - $('#telemetry-category').change(function () { - loadView("/views/telemetry.php?id=<?php echo $station->id ?>&category=" + $('#telemetry-category').val() + "&rows=" + $('#telemetry-rows').val() + "&page=1"); - }); - - $('#telemetry-rows').change(function () { - loadView("/views/telemetry.php?id=<?php echo $station->id ?>&category=" + $('#telemetry-category').val() + "&rows=" + $('#telemetry-rows').val() + "&page=1"); - }); - - if (window.trackdirect) { - <?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?> - window.trackdirect.addListener("map-created", function() { - if (!window.trackdirect.focusOnStation(<?php echo $station->id ?>, true)) { - window.trackdirect.setCenter(<?php echo $station->latestConfirmedLatitude ?>, <?php echo $station->latestConfirmedLongitude ?>); - } - }); - <?php endif; ?> - } - }); - </script> -<?php endif; ?> diff --git a/htdocs/public/views/trail.php b/htdocs/public/views/trail.php deleted file mode 100644 index 5f13f2eb127b4239998f083fbf52a8e57ee70c2f..0000000000000000000000000000000000000000 --- a/htdocs/public/views/trail.php +++ /dev/null @@ -1,194 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?> -<?php if ($station->isExistingObject()) : ?> - <title><?php echo $station->name; ?> Trail Chart</title> - <div class="modal-inner-content"> - <div class="modal-inner-content-menu"> - <a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Overview</a> - <a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Statistics</a> - <span>Trail Chart</span> - <a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Weather</a> - <a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Telemetry</a> - <a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Raw packets</a> - </div> - - <div class="horizontal-line"> </div> - - <p> - Show chart for - </p> - - - <div class="form-container"> - <select id="trail-type" style="float:left; margin-right: 5px;"> - <option <?php echo (($_GET['type'] ?? 'speed') == 'speed' ? 'selected' : ''); ?> value="speed">Speed</option> - <option <?php echo (($_GET['type'] ?? 'speed') == 'altitude' ? 'selected' : ''); ?> value="altitude">Altitude</option> - </select> - - <select id="trail-hours" style="float:left; margin-right: 5px;"> - <option <?php echo (($_GET['hours'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Latest hour</option> - <option <?php echo (($_GET['hours'] ?? 1) == 3 ? 'selected' : ''); ?> value="3">Latest 3 hours</option> - <option <?php echo (($_GET['hours'] ?? 1) == 24 ? 'selected' : ''); ?> value="24">Latest 24 hours</option> - </select> - </div> - - <div style="clear: both;"></div> - - <div id="trail-curve-chart" style="width:850px; height: 350px;"></div> - - <p> - * chart x-axis is based on your timezone (not the timezone of the station). - </p> - </div> - <script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.raw-packet-timestamp').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - if (window.trackdirect) { - <?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?> - window.trackdirect.addListener("map-created", function() { - if (!window.trackdirect.focusOnStation(<?php echo $station->id ?>, true)) { - window.trackdirect.setCenter(<?php echo $station->latestConfirmedLatitude ?>, <?php echo $station->latestConfirmedLongitude ?>); - } - }); - <?php endif; ?> - } - - function loadTrailChart(stationId, hours, type, imperialUnits) { - $('#trail-curve-chart').html('Loading!'); - - $.ajax({ - type: 'GET', - url: '/data/trail.php?id=' + stationId + '&hours=' + hours + '&type=' + type + '&imperialUnits=' + imperialUnits, - dataType: 'json' - }).done(function( result ) { - var onlyZeroValues = true; - for(i=1; i < result.length; i++) { - if (result[i][0] === parseInt(result[i][0], 10)) { - result[i][0] = new Date(result[i][0] * 1000); - } - - if (result[i][1] != 0 && result[i][1] != null) { - onlyZeroValues = false; - } - } - - var endTimestamp = new Date(); - var startTimestamp = new Date(endTimestamp.getTime() - 1000*60*60*hours); - - if (result != null && result.length > 1) { - google.charts.setOnLoadCallback( - function () { - var data = google.visualization.arrayToDataTable(result); - - var pointSize = 0; // default - var dataOpacity = 1; - var trigger = 'selection'; - var series = { - 0: { lineWidth: 2}, - 1: { lineWidth: 1, color: 'darkgreen'}, - }; - var legend = {position: 'none'}; - var title = result[0][1]; - var curveType = 'none'; // can be 'function' or 'none' - var vAxis = {}; - var hAxis = { - minValue: startTimestamp, - maxValue: endTimestamp - }; - var explorer = { - axis: 'horizontal', - keepInBounds:true, - maxZoomIn: 50, - maxZoomOut: 1, - actions: ['dragToPan', 'rightClickToReset'] - }; - explorer = null; - - if (result[0].length > 2) { - // We need to show legend if we plot more than one thing - legend = {position: 'top'}; - title = null; - } - - if (onlyZeroValues) { - // dot chart with big dots - var series = { - 0: { lineWidth: 0, pointsVisible: true, pointSize: 4 }, - } - } else if (hours < 24) { - // line chart - var series = { - 0: { lineWidth: 2, pointsVisible: false}, - } - } else { - // dot chart - var series = { - 0: { lineWidth: 0, pointsVisible: true, pointSize: 1 }, - } - } - - if (type == 'speed') { - // I'm pretty sure we won't have negative speed - var vAxis = { - viewWindow : { - min: 0 - } - }; - } - - var chartArea = {'width': '90%', 'height': '80%', 'left': '8%'}; - var options = { - title: title, - curveType: curveType, - tooltip : { - trigger: trigger - }, - pointsVisible : false, - pointSize: pointSize, - dataOpacity: dataOpacity, - series: series, - chartArea: chartArea, - legend: legend, - hAxis: hAxis, - vAxis: vAxis, - interpolateNulls: false, - crosshair: { - trigger: 'focus', - opacity: 0.5 - }, - explorer: explorer - }; - - var chart = new google.visualization.LineChart(document.getElementById('trail-curve-chart')); - - chart.draw(data, options); - }); - - } else { - $('#trail-curve-chart').html('<br/><p><i><b>No trail data to create chart from.</b></i></p>'); - } - }); - } - - $('#trail-hours').change(function() { - loadTrailChart(<?php echo $station->id; ?>, $('#trail-hours').val(), $('#trail-type').val(), <?php echo $_GET['imperialUnits'] ?? 0; ?>); - }); - - $('#trail-type').change(function() { - loadTrailChart(<?php echo $station->id; ?>, $('#trail-hours').val(), $('#trail-type').val(), <?php echo $_GET['imperialUnits'] ?? 0; ?>); - }); - - loadTrailChart(<?php echo $station->id; ?>, $('#trail-hours').val(), $('#trail-type').val(), <?php echo $_GET['imperialUnits'] ?? 0; ?>); - - }); - </script> -<?php endif; ?> diff --git a/htdocs/public/views/weather.php b/htdocs/public/views/weather.php deleted file mode 100644 index 5103cee8e5f0745740cbb9c73efce8a0d9fd0ee4..0000000000000000000000000000000000000000 --- a/htdocs/public/views/weather.php +++ /dev/null @@ -1,239 +0,0 @@ -<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?> - -<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?> -<?php if ($station->isExistingObject()) : ?> - <?php - $maxDays = 10; - if (!isAllowedToShowOlderData()) { - $maxDays = 1; - } - $page = $_GET['page'] ?? 1; - $rows = $_GET['rows'] ?? 25; - $offset = ($page - 1) * $rows; - $weatherPackets = PacketWeatherRepository::getInstance()->getLatestObjectListByStationIdAndLimit($station->id, $rows, $offset, $maxDays); - $count = PacketWeatherRepository::getInstance()->getLatestNumberOfPacketsByStationIdAndLimit($station->id, $maxDays); - $pages = ceil($count / $rows); - ?> - - <title><?php echo $station->name; ?> Weather</title> - <div class="modal-inner-content"> - <div class="modal-inner-content-menu"> - <a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Overview</a> - <a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Statistics</a> - <a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Trail Chart</a> - <span>Weather</span> - <a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Telemetry</a> - <a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Raw packets</a> - </div> - - <div class="horizontal-line"> </div> - - <?php if (count($weatherPackets) > 0) : ?> - - <p>This is the latest recevied weather packets stored in our database for station/object <?php echo $station->name; ?>. If no packets are shown the sender has not sent any weather packets the latest <?php echo $maxDays; ?> day(s).</p> - - <div class="form-container"> - <select id="weather-rows" style="float:left; margin-right: 5px;" class="pagination-rows"> - <option <?php echo ($rows == 25 ? 'selected' : ''); ?> value="25">25 rows</option> - <option <?php echo ($rows == 50 ? 'selected' : ''); ?> value="50">50 rows</option> - <option <?php echo ($rows == 100 ? 'selected' : ''); ?> value="100">100 rows</option> - <option <?php echo ($rows == 200 ? 'selected' : ''); ?> value="200">200 rows</option> - <option <?php echo ($rows == 300 ? 'selected' : ''); ?> value="300">300 rows</option> - </select> - </div> - - <?php if ($pages > 1): ?> - <div class="pagination"> - <a class="tdlink" href="/views/weather.php?id=<?php echo $station->id; ?>&rows=<?php echo $rows; ?>&page=1"><<</a> - <?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?> - <a href="/views/weather.php?id=<?php echo $station->id; ?>&rows=<?php echo $rows; ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a> - <?php endfor; ?> - <a class="tdlink" href="/views/weather.php?id=<?php echo $station->id; ?>&rows=<?php echo $rows; ?>&page=<?php echo $pages; ?>">>></a> - </div> - <?php endif; ?> - - - <div class="datagrid datagrid-weather" style="max-width:1000px;"> - <table> - <thead> - <tr> - <th>Time</th> - <th>Temp.</th> - <th>Humidity</th> - <th>Pressure</th> - <th>Rain*</th> - <th>Wind**</th> - <th>Luminosity</th> - <th>Snow</th> - </tr> - </thead> - <tbody> - <?php foreach ($weatherPackets as $packetWeather) : ?> - - <tr> - <td class="weathertime"> - <?php echo ($packetWeather->wxRawTimestamp != null?$packetWeather->wxRawTimestamp:$packetWeather->timestamp); ?> - </td> - <td> - <?php if ($packetWeather->temperature !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertCelciusToFahrenheit($packetWeather->temperature), 2); ?>° F - <?php else : ?> - <?php echo round($packetWeather->temperature, 2); ?>° C - <?php endif; ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <td> - <?php if ($packetWeather->humidity !== null) : ?> - <?php echo $packetWeather->humidity; ?>% - <?php else : ?> - - - <?php endif; ?> - </td> - <td> - <?php if ($packetWeather->pressure !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertMbarToMmhg($packetWeather->pressure),1); ?> mmHg - <?php else : ?> - <?php echo round($packetWeather->pressure,1); ?> hPa - <?php endif; ?> - - <?php else : ?> - - - <?php endif; ?> - </td> - - <?php if ($weatherPackets[0]->rain_1h !== null) : ?> - <td title="<?php echo $packetWeather->getRainSummary(false, true, true); ?>"> - <?php if ($packetWeather->rain_1h !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertMmToInch($packetWeather->rain_1h), 2); ?> in - <?php else : ?> - <?php echo round($packetWeather->rain_1h, 2); ?> mm - <?php endif; ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <?php elseif ($weatherPackets[0]->rain_24h !== null) : ?> - <td title="<?php echo $packetWeather->getRainSummary(true, false, true); ?>"> - <?php if ($packetWeather->rain_24h !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertMmToInch($packetWeather->rain_24h), 2); ?> in - <?php else : ?> - <?php echo round($packetWeather->rain_24h, 2); ?> mm - <?php endif; ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <?php else : ?> - <td title="<?php echo $packetWeather->getRainSummary(true, true, false); ?>"> - <?php if ($packetWeather->rain_since_midnight !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertMmToInch($packetWeather->rain_since_midnight), 2); ?> in - <?php else : ?> - <?php echo round($packetWeather->rain_since_midnight, 2); ?> mm - <?php endif; ?> - <?php else : ?> - - - <?php endif; ?> - </td> - <?php endif; ?> - - <td title="Wind gust: <?php echo ($packetWeather->wind_gust !== null?round($packetWeather->wind_gust,2):'-'); ?> m/s"> - - <?php if (isImperialUnitUser()) : ?> - <?php if ($packetWeather->wind_speed !== null && $packetWeather->wind_speed > 0) : ?> - <?php echo round(convertMpsToMph($packetWeather->wind_speed), 2); ?> mph, <?php echo $packetWeather->wind_direction; ?>° - <?php elseif($packetWeather->wind_speed !== null) : ?> - <?php echo round(convertMpsToMph($packetWeather->wind_speed), 2); ?> mph - <?php else : ?> - - - <?php endif; ?> - - <?php else : ?> - <?php if ($packetWeather->wind_speed !== null && $packetWeather->wind_speed > 0) : ?> - <?php echo round($packetWeather->wind_speed, 2); ?> m/s, <?php echo $packetWeather->wind_direction; ?>° - <?php elseif($packetWeather->wind_speed !== null) : ?> - <?php echo round($packetWeather->wind_speed, 2); ?> m/s - <?php else : ?> - - - <?php endif; ?> - <?php endif; ?> - </td> - - <td> - <?php if ($packetWeather->luminosity !== null) : ?> - <?php echo round($packetWeather->luminosity,0); ?> W/m² - <?php else : ?> - - - <?php endif; ?> - </td> - - <td> - <?php if ($packetWeather->snow !== null) : ?> - <?php if (isImperialUnitUser()) : ?> - <?php echo round(convertMmToInch($packetWeather->snow), 0); ?> in - <?php else : ?> - <?php echo round($packetWeather->snow, 0); ?> mm - <?php endif; ?> - <?php else : ?> - - - <?php endif; ?> - </td> - </tr> - - <?php endforeach; ?> - </tbody> - </table> - </div> - <p> - <?php if ($weatherPackets[0]->rain_1h !== null) : ?> - * Rain latest hour (hover to see other rain measurements)<br/> - <?php elseif ($weatherPackets[0]->rain_24h !== null) : ?> - * Rain latest 24 hours (hover to see other rain measurements)<br/> - <?php else : ?> - * Rain since midnight (hover to see other rain measurements)<br/> - <?php endif; ?> - ** Current wind speed in m/s (hover to see current wind gust speed) - </p> - - <?php endif; ?> - - <?php if (count($weatherPackets) == 0) : ?> - <p><i><b>No recent weather reports.</b></i></p> - <?php endif; ?> - - </div> - - <script> - $(document).ready(function() { - var locale = window.navigator.userLanguage || window.navigator.language; - moment.locale(locale); - - $('.weathertime').each(function() { - if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) { - $(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ')); - } - }); - - $('#weather-rows').change(function () { - loadView("/views/weather.php?id=<?php echo $station->id ?>&rows=" + $('#weather-rows').val() + "&page=1"); - }); - - - if (window.trackdirect) { - <?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?> - window.trackdirect.addListener("map-created", function() { - if (!window.trackdirect.focusOnStation(<?php echo $station->id ?>, true)) { - window.trackdirect.setCenter(<?php echo $station->latestConfirmedLatitude ?>, <?php echo $station->latestConfirmedLongitude ?>); - } - }); - <?php endif; ?> - } - }); - </script> -<?php endif; ?> diff --git a/hub-backend b/hub-backend new file mode 160000 index 0000000000000000000000000000000000000000..88bbf20d973a1e5a19f4b4ebc280320e4c83a098 --- /dev/null +++ b/hub-backend @@ -0,0 +1 @@ +Subproject commit 88bbf20d973a1e5a19f4b4ebc280320e4c83a098 diff --git a/jslib/build.sh b/jslib/build.sh deleted file mode 100755 index 335d84110687fd9f08b1e21458e913cc7f6d4130..0000000000000000000000000000000000000000 --- a/jslib/build.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -CURRENTDIR=$(dirname $0) - -cd $CURRENTDIR/../htdocs -mkdir -p tmp - -# -# Minimize and move to build dir -# -for file in $(find ../jslib/src/ -name '*.js') -do - if [[ ${file} != *".min."* ]];then - newFile="${file##*/}" - newFile="tmp/${newFile//.js/}.min.js" - echo "Processing $file -> $newFile" - python -m jsmin $file > $newFile - #cp $file $newFile - else - newFile="tmp/${file##*/}" - echo "Processing $file -> $newFile" - cp $file $newFile - fi -done - -# -# Create the full js file -# -cp tmp/trackdirect.min.js public/js/trackdirect.min.js -rm tmp/trackdirect.min.js -# Note that the order is important (may need to start adding digits in beginning of each js-file) -ls -vr tmp/*.js | xargs cat >> public/js/trackdirect.min.js - -# -# Remove temp dir -# -rm -R tmp - -exit 0 diff --git a/jslib/src/other/common.js b/jslib/src/other/common.js deleted file mode 100755 index 886d75d7b54eceb604ce0d2dafdca6941f529c59..0000000000000000000000000000000000000000 --- a/jslib/src/other/common.js +++ /dev/null @@ -1,206 +0,0 @@ -if (!Date.now) { - Date.now = function () { - return new Date().getTime(); - }; -} - -function escapeRegExp(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); -} - -String.prototype.replaceAll = function (search, replacement) { - var target = this; - return target.replace(new RegExp(escapeRegExp(search), "gi"), replacement); -}; - -function isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -Number.prototype.mod = function (n) { - return ((this % n) + n) % n; -}; - -function isDate(str) { - var d = new Date(str); - var now = new Date(); - if (Object.prototype.toString.call(d) === "[object Date]") { - if (isNaN(d.getTime())) { - return false; - } else { - if (d.getTime() > 0) { - return true; - } else { - return false; - } - } - } else { - return false; - } -} - -if (!Array.prototype.fill) { - Array.prototype.fill = function (value) { - // Steps 1-2. - if (this == null) { - throw new TypeError("this is null or not defined"); - } - - var O = Object(this); - - // Steps 3-5. - var len = O.length >>> 0; - - // Steps 6-7. - var start = arguments[1]; - var relativeStart = start >> 0; - - // Step 8. - var k = - relativeStart < 0 - ? Math.max(len + relativeStart, 0) - : Math.min(relativeStart, len); - - // Steps 9-10. - var end = arguments[2]; - var relativeEnd = end === undefined ? len : end >> 0; - - // Step 11. - var final = - relativeEnd < 0 - ? Math.max(len + relativeEnd, 0) - : Math.min(relativeEnd, len); - - // Step 12. - while (k < final) { - O[k] = value; - k++; - } - - // Step 13. - return O; - }; -} - -if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (elt /*, from*/) { - var len = this.length; - var from = Number(arguments[1]) || 0; - from = from < 0 ? Math.ceil(from) : Math.floor(from); - - if (from < 0) from += len; - - for (; from < len; from++) { - if (from in this && this[from] === elt) return from; - } - return -1; - }; -} - -if (typeof String.prototype.endsWith !== "function") { - String.prototype.endsWith = function (suffix) { - return this.indexOf(suffix, this.length - suffix.length) !== -1; - }; -} - -if (!String.prototype.trim) { - (function () { - // Make sure we trim BOM and NBSP - var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; - String.prototype.trim = function () { - return this.replace(rtrim, ""); - }; - })(); -} - -if (!Object.keys) { - Object.keys = function (obj) { - var keys = [], - k; - for (k in obj) { - if (Object.prototype.hasOwnProperty.call(obj, k)) { - keys.push(k); - } - } - return keys; - }; -} - -if (!Date.prototype.toISOString) { - (function () { - function pad(number) { - var r = String(number); - if (r.length === 1) { - r = "0" + r; - } - return r; - } - - Date.prototype.toISOString = function () { - return ( - this.getUTCFullYear() + - "-" + - pad(this.getUTCMonth() + 1) + - "-" + - pad(this.getUTCDate()) + - "T" + - pad(this.getUTCHours()) + - ":" + - pad(this.getUTCMinutes()) + - ":" + - pad(this.getUTCSeconds()) + - "." + - String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5) + - "Z" - ); - }; - })(); -} - -// Returnes true if we are in a iframe -function inIframe() { - try { - return window.self !== window.top; - } catch (e) { - return true; - } -} - -/** - * Returnes true if screen has high density - * @return boolean - */ -function isHighDensity() { - return ( - (window.matchMedia && - (window.matchMedia( - "only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)" - ).matches || - window.matchMedia( - "only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)" - ).matches)) || - (window.devicePixelRatio && window.devicePixelRatio > 1.3) - ); -} - -/** - * htmlspecialchars equivalent - * @param {string} text - * @return string - */ -function escapeHtml(text) { - if (typeof text === "undefined" || text == null) { - return null; - } - - var map = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", - }; - return text.replace(/[&<>"']/g, function (m) { - return map[m]; - }); -} diff --git a/jslib/src/trackdirect.js b/jslib/src/trackdirect.js deleted file mode 100755 index 4c7f33f93ccc38616c3c8c3e168d9563ced97872..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect.js +++ /dev/null @@ -1,2422 +0,0 @@ -var trackdirect = { - services: {}, - models: {}, - - _time: null, // How many minutes of history to show - _timetravel: null, // Unix timestamp to travel to - _center: null, // Position to center on (for example "46.52108,14.63379") - _zoom: null, // Zoom level - _maptype: null, // May be "roadmap", "terrain" or "satellite" - _mid: null, - - _rulers: [], - - _filterTimeoutId: null, - _waitForFilterResponse: false, - _doNotChangeLocationOnFilterResponse: false, - _doNotChangeLocationOnFilterResponseTmp: false, - - _filters: {}, - - _defaultLatitude: null, - _defaultLongitude: null, - - _eventListeners: {}, - _eventListenersOnce: {}, - - _cordinatesContainerElementId: null, - _statusContainerElementId: "td-status-text", - _mapElementId: null, - - _wsServerUrl: null, - - _map: null, - _websocket: null, - - _mapCreated: false, - _trackdirectInitDone: false, - - isMobile: false, - coverageDataUrl: null, - coveragePercentile: 95, - settings: {}, - - /** - * Initialize - * @param {string} wsServerUrl - * @param {string} mapElementId - * @param {object} options - */ - init: function (wsServerUrl, mapElementId, options) { - this._initSettings(); - this._wsServerUrl = wsServerUrl; - this._mapElementId = mapElementId; - - if ($("#" + mapElementId).length <= 0) { - // map element does not exists, nothing to do... - console.log("ERROR: Specified map element missing"); - return; - } - - if (typeof google === "object" && typeof google.maps === "object") { - // Google maps is slow with to many labels - this.settings.defaultMinZoomForMarkerLabel = 12; - this.settings.minZoomForMarkerLabel = 12; - } - - this._parseOptions(options); - - var me = this; - this.addListener("map-created", function () { - me._initTime(); - - me._websocket = new trackdirect.Websocket(me._wsServerUrl); - me._initWebsocketListeners(); - me._handleWebsocketStateChange(); - - me._initMapListeners(); - if (!me._initFilterUrlRequest()) { - trackdirect.services.callbackExecutor.add( - me, - me._sendPositionRequest, - [] - ); - } - - me._setWebsocketStateIdle(); - - if (inIframe()) { - // Somebody has included trackdirect inside an iframe... In the future we may STOP this but currently we allow it... - var parentUrl = ""; - try { - parentUrl = - window.location != window.parent.location - ? document.referrer - : document.location.href; - } catch (e) { - parentUrl = "Unknown"; - } - } - - me._emitEventListeners("trackdirect-init-done"); - }); - - this._mapInit(options); - }, - - /** - * Enable Imperial units - * @return null - */ - enableImperialUnits: function () { - this._map.state.useImperialUnit = true; - if (this._map.state.openInfoWindow !== null) { - this._map.state.openInfoWindow.hide(); - } - }, - - /** - * Enable Metric units - * @return null - */ - enableMetricUnits: function () { - this._map.state.useImperialUnit = false; - if (this._map.state.openInfoWindow !== null) { - this._map.state.openInfoWindow.hide(); - } - }, - - /** - * Enable/Disable Imperial units - * @return null - */ - toggleImperialUnits: function () { - if (this._map.state.useImperialUnit) { - this.enableMetricUnits(); - } else { - this.enableImperialUnits(); - } - }, - - /** - * Returns true if Imperial units is active - * @return boolean - */ - isImperialUnits: function () { - return this._map.state.useImperialUnit; - }, - - /** - * Add new event listener - * @param {string} event - * @param {string} handler - * @param {boolean} execOnce - * @return null - */ - addListener: function (event, handler, execOnce) { - execOnce = typeof execOnce !== "undefined" ? execOnce : false; - if ( - (event == "map-created" && this._mapCreated) || - (event == "trackdirect-init-done" && this._trackdirectInitDone) - ) { - handler(); - if (execOnce) { - return; - } - } - - if (execOnce) { - if (!(event in this._eventListenersOnce)) { - this._eventListenersOnce[event] = []; - } - this._eventListenersOnce[event].push(handler); - } else { - if (!(event in this._eventListeners)) { - this._eventListeners[event] = []; - } - this._eventListeners[event].push(handler); - } - }, - - /** - * Set map center - * @param {float} latitude - * @param {float} longitude - * @param {int} zoom - * @return None - */ - setCenter: function (latitude, longitude, zoom) { - latitude = - typeof latitude !== "undefined" ? latitude : this._defaultLatitude; - longitude = - typeof longitude !== "undefined" ? longitude : this._defaultLongitude; - zoom = - typeof zoom !== "undefined" ? zoom : this._map.getZoom(); - - if (this._map !== null) { - this._map.setCenter({ lat: latitude, lng: longitude }, zoom); - } - }, - - /** - * Set zoom - * @param {int} value - * @return None - */ - setZoom: function (value) { - if (this._map !== null) { - this._map.setZoom(value); - } - }, - - /** - * Add a ruler - * @return None - */ - addRuler: function () { - if (this._rulers.length > 0) { - var ruler = this._rulers.pop(); - ruler.hide(); - } else { - var ruler = new trackdirect.models.Ruler( - (this._map.getCurrentRadiusInKm() * 1000) / 2, - this._map - ); - this._rulers.push(ruler); - } - }, - - /** - * Returns true if we are filtering on one or several stations - * @return {boolean} - */ - isFilteredMode: function () { - return this._map.state.isFilterMode; - }, - - /** - * Stop filter on station - * @return {int} stationId - */ - stopFilterOnStationId: function (stationId) { - var currentFilterStationIds = this._map.state.getFilterStationIds(); - if ( - currentFilterStationIds.length == 1 && - currentFilterStationIds.indexOf(stationId) >= 0 - ) { - this.filterOnStationId([]); - } else { - if (this._map.state.getTrackStationId() == stationId) { - this.stopTrackStation(); - } - this._setWebsocketStateLoading(false); - this._websocket.doSendStopFilterRequest(stationId); - } - }, - - /** - * Filter on station - * @return {array} stationIdArray - */ - filterOnStationId: function (stationIdArray) { - if (!Array.isArray(stationIdArray)) { - stationIdArray = [stationIdArray]; - } - - // If user wants to start filtering and we are tracking something else, stop tracking - var currentFilterStationIds = this._map.state.getFilterStationIds(); - if (currentFilterStationIds.length == 0) { - if ( - this._map.state.getTrackStationId() !== null && - stationIdArray.indexOf(this._map.state.getTrackStationId()) == -1 - ) { - this.stopTrackStation(); - } - } - - this._setWebsocketStateLoading(false); - this._websocket.doSendFilterRequest( - stationIdArray, - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp() - ); - }, - - /** - * Filter on station by name - * @return {array} stationNameArray - */ - filterOnStationName: function (stationNameArray) { - if (!Array.isArray(stationNameArray)) { - stationNameArray = [stationNameArray]; - } - - // If user wants to start filtering and we are tracking something else, stop tracking - var currentFilterStationIds = this._map.state.getFilterStationIds(); - if (currentFilterStationIds.length == 0) { - if ( - this._map.state.getTrackStationId() !== null && - stationIdArray.indexOf(this._map.state.getTrackStationId()) == -1 - ) { - this.stopTrackStation(); - } - } - - this._setWebsocketStateLoading(false); - this._websocket.doSendFilterRequestByName( - stationNameArray, - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp() - ); - }, - - /** - * Stop track station - * @return {int} stationId - */ - stopTrackStation: function () { - this._map.state.onlyTrackRecentPackets = false; - this._map.state.trackStationId = null; - this._emitEventListeners("track-changed", [null, null]); - }, - - /** - * Track station - * @param {int} stationId - * @param {string} stationName - * @param {boolean} alsofilterOnStation - * @param {boolean} onlyTrackRecentPackets - * @return null - */ - trackStation: function ( - stationId, - stationName, - alsoFilterOnStation, - onlyTrackRecentPackets - ) { - onlyTrackRecentPackets = - typeof onlyTrackRecentPackets !== "undefined" - ? onlyTrackRecentPackets - : false; - - // if user are filtering and want to track a station that we do not filter in, start filtering on that station - if (alsoFilterOnStation) { - var currentFilterStationIds = this._map.state.getFilterStationIds(); - if (currentFilterStationIds.length > 0) { - if (currentFilterStationIds.indexOf(stationId) == -1) { - this.filterOnStationId(stationId); - } - } - } - - if (stationId !== null) { - var trackLinkElementClass = "trackStationLink" + stationId; - $("." + trackLinkElementClass).html("Untrack"); - } - - if (this._map.state.trackStationId !== null) { - var trackLinkElementClass = - "trackStationLink" + this._map.state.trackStationId; - $("." + trackLinkElementClass).html("Track"); - } - - this._map.state.onlyTrackRecentPackets = onlyTrackRecentPackets; - this._map.state.trackStationId = stationId; - - this._emitEventListeners("track-changed", [stationId, stationName]); - }, - - /** - * Move focus to specified station - * @param {int} stationId - * @param {boolean} openInfoWindow - * @return Boolean - */ - focusOnStation: function (stationId, openInfoWindow) { - var map = this._map; - openInfoWindow = - typeof openInfoWindow !== "undefined" ? openInfoWindow : false; - var marker = map.markerCollection.getStationLatestMarker(stationId); - if (marker !== null) { - marker.show(); - marker.showLabel(); - - // Set focus - if (openInfoWindow) { - map.openMarkerInfoWindow(marker, false); - } else { - this.setCenter(marker.packet.latitude, marker.packet.longitude); - } - - // This method will hide marker when infowindow is closed, if nessecery - marker.hide(5000, true); - return true; - } else { - return false; - } - }, - - /** - * Move focus to specified marker - * @param {int} markerId - * @param {int} zoom - * @return None - */ - focusOnMarkerId: function (markerId, zoom) { - var map = this._map; - var markerIdKey = map.markerCollection.getMarkerIdKey(markerId); - if (map.markerCollection.isExistingMarker(markerIdKey)) { - var marker = map.markerCollection.getMarker(markerIdKey); - - if (map.markerCollection.hasRelatedDashedPolyline(marker)) { - newerMarker = map.markerCollection.getMarker( - marker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey - ); - if (newerMarker.packet.hasConfirmedMapId()) { - return this.focusOnMarkerId(newerMarker.packet.marker_id); - } - } - - marker.show(); - marker.showLabel(); - - // Set focus - this.setCenter(marker.packet.latitude, marker.packet.longitude, zoom); - map.openMarkerInfoWindow(marker); - - // This method will hide marker when infowindow is closed, if nessecery - marker.hide(5000, true); - } - }, - - /** - * Toggle station coverage - * @param {int} stationId - * @param {string} coverageLinkElementClass - */ - toggleStationCoverage: function (stationId, coverageLinkElementClass) { - coverageLinkElementClass = - typeof coverageLinkElementClass !== "undefined" - ? coverageLinkElementClass - : null; - - var coveragePolygon = - this._map.markerCollection.getStationCoverage(stationId); - if (coveragePolygon !== null && coveragePolygon.isRequestedToBeVisible()) { - coveragePolygon.hide(); - if (coverageLinkElementClass !== null) { - $("." + coverageLinkElementClass).html("Coverage"); - } - } else { - if (coveragePolygon !== null) { - coveragePolygon.show(); - - if (!coveragePolygon.hasContent()) { - alert( - "Currently we do not have enough data to create a max range coverage plot for this station. Try again later!" - ); - } else { - if (coverageLinkElementClass !== null) { - $("." + coverageLinkElementClass).html("Hide coverage"); - } - } - } else { - var packet = - this._map.markerCollection.getStationLatestPacket(stationId); - var center = { - lat: parseFloat(packet.latitude), - lng: parseFloat(packet.longitude), - }; - var coveragePolygon = new trackdirect.models.StationCoveragePolygon( - center, - this._map, - true - ); - this._map.markerCollection.addStationCoverage( - stationId, - coveragePolygon - ); - coveragePolygon.showWhenDone(); - - if (coverageLinkElementClass !== null) { - $("." + coverageLinkElementClass).html( - 'Loading <i class="fa fa-spinner fa-spin" style="font-size:12px"></i>' - ); - coveragePolygon.addTdListener( - "visible", - function () { - if (!coveragePolygon.hasContent()) { - coveragePolygon.hide(); - alert( - "Currently we do not have enough data to create a max range coverage plot for this station. Try again later!" - ); - $("." + coverageLinkElementClass).html("Coverage"); - } else { - $("." + coverageLinkElementClass).html("Hide coverage"); - } - }, - true - ); - } - - var me = this; - $.getJSON(this.coverageDataUrl + "?id=" + stationId, function (data) { - if ("station_id" in data && "coverage" in data) { - coveragePolygon.setData(data["coverage"], me.coveragePercentile); - var marker = - me._map.markerCollection.getStationLatestMarker(stationId); - if (marker.isVisible()) { - if (coveragePolygon.isRequestedToBeVisible()) { - coveragePolygon.show(); - } - } - } - }) - .fail(function () { - coveragePolygon.hide(); - alert("Failed to fetch coverage data. Try again later!"); - $("." + coverageLinkElementClass).html("Coverage"); - }) - .always(function () {}); - } - } - }, - - /** - * Set map type - * @param {string} mapType - * @return None - */ - setMapType: function (mapType) { - if (this._map !== null) { - this._map.setMapType(mapType); - } - }, - - /** - * Set map type - * @return {string} - */ - getMapType: function () { - if (this._map !== null) { - return this._map.getMapType(); - } - }, - - /** - * Set map default location - * @param {boolean} setDefaultZoom - * @return None - */ - setMapDefaultLocation: function (setDefaultZoom) { - this._map.setMapDefaultLocation(setDefaultZoom); - }, - - /** - * Set map location based on user position by using geo location functionality - * @param {function} failCallBack - * @param {function} successCallBack - * @param int timeout - * @return None - */ - setMapLocationByGeoLocation: function ( - failCallBack, - successCallBack, - timeout - ) { - var me = this; - if (navigator && navigator.geolocation) { - navigator.geolocation.getCurrentPosition( - function (position) { - var pos = { - lat: position.coords.latitude, - lng: position.coords.longitude, - }; - me._map.setCenter(pos, 12); - if (successCallBack !== null) { - successCallBack(); - } - }, - function (error) { - // User said NO (or other error) - // Note that you will not end up here if browser is Firefox and user just says "Not now" - if (failCallBack !== null) { - failCallBack(error.message); - } - }, - { - enableHighAccuracy: false, - timeout: timeout, - maximumAge: 5000, - } - ); - } else { - // Browser doesn't support Geolocation - if (failCallBack !== null) { - failCallBack(); - } - } - }, - - /** - * Open station information dialog - * @param {int} stationId - * @return null - */ - openStationInformationDialog: function (stationId) { - var packet = this._map.markerCollection.getStationLatestPacket(stationId); - if (packet == null) { - packet = { station_id: stationId, id: null }; - } - - // Ask listener to open dialog - this._emitEventListeners("station-name-clicked", packet); - }, - - /** - * Open marker info window - * @param {int} markerId - * @return None - */ - openMarkerInfoWindow: function (markerId) { - var markerIdKey = this._map.markerCollection.getMarkerIdKey(markerId); - if (this._map.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - this._map.openMarkerInfoWindow(marker); - } - }, - - /** - * Close any open info window - * @return None - */ - closeAnyOpenInfoWindow: function () { - if (this._map !== null) { - var state = this._map.state; - if (state.isInfoWindowOpen()) { - state.openInfoWindow.hide(); - } - } - }, - - /** - * Set timetravel timestamp - * @param {int} ts - * @param {boolean} sendRequestToServer - * @return null - */ - setTimeTravelTimestamp: function (ts, sendRequestToServer) { - if (ts != 0 || this._map.state.endTimeTravelTimestamp != null) { - sendRequestToServer = - typeof sendRequestToServer !== "undefined" ? sendRequestToServer : true; - - if (this._map.state.endTimeTravelTimestamp != ts) { - if (ts != null && ts != 0 && ts != "") { - this._map.state.endTimeTravelTimestamp = ts; - } else { - this._map.state.endTimeTravelTimestamp = null; - } - - if (sendRequestToServer) { - trackdirect.services.callbackExecutor.add( - this, - this._handleTimeChange, - [] - ); - } - } - - this._emitEventListeners("time-travel-changed", ts); - this._emitEventListeners("mode-changed"); - } - }, - - /** - * Returns the time travel timestamp currently used - * @return {int} - */ - getTimeTravelTimestamp: function () { - return this._map.state.endTimeTravelTimestamp; - }, - - /** - * Set time in minutes - * @param {int} time - * @param {boolean} sendRequestToServer - */ - setTimeLength: function (time, sendRequestToServer) { - sendRequestToServer = - typeof sendRequestToServer !== "undefined" ? sendRequestToServer : true; - - if (this._map.state.getTimeLength() / 60 != time) { - this._map.state.setTimeLength(time * 60); - - if (sendRequestToServer) { - trackdirect.services.callbackExecutor.add( - this, - this._handleTimeChange, - [] - ); - } - } - - this._emitEventListeners("time-length-changed", time); - this._updateMinZoomLevels(); - }, - - /** - * Toggle PHG circles - * @return None - */ - togglePHGCircles: function () { - var state = this._map.state; - if (state.showPHGCircles == 0) { - state.showPHGCircles = 1; - } else if (state.showPHGCircles == 1) { - state.showPHGCircles = 2; - } else { - state.showPHGCircles = 0; - } - this._map.showHidePHGCircles(); - }, - - /** - * Toggle PHG circles - * @return None - */ - toggleRNGCircles: function () { - var state = this._map.state; - if (state.showRNGCircles == 0) { - state.showRNGCircles = 1; - } else if (state.showRNGCircles == 1) { - state.showRNGCircles = 2; - } else { - state.showRNGCircles = 0; - } - this._map.showHideRNGCircles(); - }, - - /** - * Toggle Stationary positions - * @return None - */ - toggleStationaryPositions: function () { - if (this.isStationaryMarkersVisible()) { - this._map.state.isStationaryMarkersVisible = false; - } else { - this._map.state.isStationaryMarkersVisible = true; - } - this._map.showHideMarkers(); - }, - - /** - * Toggle Unknown positions - * @return None - */ - toggleUnknownPositions: function () { - if (this.isUnknownMarkersVisible()) { - this._map.state.isUnknownMarkersVisible = false; - } else { - this._map.state.isUnknownMarkersVisible = true; - } - this._map.showHideMarkers(); - }, - - /** - * Toggle Ogflym positions - * @return None - */ - toggleOgflymPositions: function () { - if (this.isOgflymMarkersVisible()) { - this._map.state.isOgflymMarkersVisible = false; - } else { - this._map.state.isOgflymMarkersVisible = true; - } - this._map.showHideMarkers(); - }, - - /** - * Toggle Stationary positions - * @return None - */ - toggleInternetPositions: function () { - if (this.isInternetMarkersVisible()) { - this._map.state.isInternetMarkersVisible = false; - } else { - this._map.state.isInternetMarkersVisible = true; - } - this._map.showHideMarkers(); - }, - - /** - * Toggle the CWOP positions option - * @return None - */ - toggleCwopPositions: function () { - if (this.isCwopMarkersVisible()) { - this._map.state.isCwopMarkersVisible = false; - } else { - this._map.state.isCwopMarkersVisible = true; - } - this._map.showHideMarkers(); - }, - - /** - * Toggle the ghost positions option - * Ghost positions are positions that some filter has removed since it is unlikly - * @return None - */ - toggleGhostPositions: function () { - if (this.isGhostMarkersVisible()) { - this._map.state.isGhostMarkersVisible = false; - } else { - this._map.state.isGhostMarkersVisible = true; - } - this._map.showHideMarkers(); - }, - - /** - * Returns true if ghost markers is visible - * @return {boolean} - */ - isGhostMarkersVisible: function () { - return this._map.state.isGhostMarkersVisible; - }, - - /** - * Returns true if CWOP markers is visible - * @return {boolean} - */ - isCwopMarkersVisible: function () { - return this._map.state.isCwopMarkersVisible; - }, - - /** - * Returns true if INTERNET markers is visible - * @return {boolean} - */ - isInternetMarkersVisible: function () { - return this._map.state.isInternetMarkersVisible; - }, - - /** - * Returns true if stationary markers is visible - * @return {boolean} - */ - isStationaryMarkersVisible: function () { - return this._map.state.isStationaryMarkersVisible; - }, - - /** - * Set visible symbols, argument should be an array of two value arrays (first value should be the ascii value for the symbol code and the second should be the ascii value for the symbol table) - * @param {array} symbols - * @return None - */ - setVisibleSymbols: function (symbols) { - this._map.state.visibleSymbols = symbols; - this._map.showHideMarkers(); - }, - - /** - * Add visible symbol, argument should be a two value array (first value should be the ascii value for the symbol code and the second should be the ascii value for the symbol table) - * @param {array} symbols - * @return None - */ - addVisibleSymbol: function (symbol) { - this._map.state.visibleSymbols.push(symbol); - this._map.showHideMarkers(); - }, - - /** - * Remove visible symbol, argument should be a two value array (first value should be the ascii value for the symbol code and the second should be the ascii value for the symbol table) - * @param {array} symbols - * @return None - */ - removeVisibleSymbol: function (symbol) { - var indexToRemove = null; - for (var i = 0; i < this._map.state.visibleSymbols.length; i++) { - if ( - this._map.state.visibleSymbols[i][0] == symbol[0] && - this._map.state.visibleSymbols[i][1] == symbol[1] - ) { - indexToRemove = i; - break; - } - } - if (indexToRemove !== null) { - this._map.state.visibleSymbols.splice(indexToRemove, 1); - } - this._map.showHideMarkers(); - }, - - /** - * Returns array of visible symbols - * @return {array} - */ - getVisibleSymbols: function () { - return this._map.state.visibleSymbols; - }, - - /** - * Returns true if unknown markers is visible - * @return {boolean} - */ - isUnknownMarkersVisible: function () { - return this._map.state.isUnknownMarkersVisible; - }, - - /** - * Returns true if ogflym markers is visible - * @return {boolean} - */ - isOgflymMarkersVisible: function () { - return this._map.state.isOgflymMarkersVisible; - }, - - /** - * Handle filter station request - * @param {int} stationId - * @param {string} linkElementId - * @return {boolean} - */ - handleFilterStationRequest: function (stationId, filterLinkElementClass) { - filterLinkElementClass = - typeof filterLinkElementClass !== "undefined" - ? filterLinkElementClass - : null; - if ( - this._map.state.filterStationIds.length > 0 && - this._map.state.filterStationIds.indexOf(stationId) > -1 - ) { - // We want to stop filtering - this.stopFilterOnStationId(stationId); - if (filterLinkElementClass !== null) { - $("." + filterLinkElementClass).html("Filter"); - } - } else { - this.filterOnStationId(stationId); - if (filterLinkElementClass !== null) { - $("." + filterLinkElementClass).html("Unfilter"); - } - } - }, - - /** - * Handle track station request - * @param {int} stationId - * @param {string} trackLinkElementClass - * @return null - */ - handleTrackStationRequest: function (stationId, trackLinkElementClass) { - stationId = typeof stationId !== "undefined" ? stationId : 0; - trackLinkElementClass = - typeof trackLinkElementClass !== "undefined" - ? trackLinkElementClass - : null; - - if ( - this._map.state.getTrackStationId() !== null && - (stationId === 0 || this._map.state.getTrackStationId() == stationId) - ) { - // We want to stop tracking - if (trackLinkElementClass !== null) { - $("." + trackLinkElementClass).html("Track"); - } else if (this._map.state.openInfoWindow !== null) { - this._map.state.openInfoWindow.hide(); - } - this.stopTrackStation(); - } else if (stationId !== 0) { - if (trackLinkElementClass !== null) { - $("." + trackLinkElementClass).html("Untrack"); - } - - var packet = this._map.markerCollection.getStationLatestPacket(stationId); - if (packet !== null) { - var stationName = packet.station_name; - if (packet.sender_name != packet.station_name) { - stationName = packet.station_name + " (" + packet.sender_name + ")"; - } - this.trackStation(stationId, stationName, true); - } - } - }, - - /** - * Init settings - * @return null - */ - _initSettings: function () { - this.settings = { - animate: true, - - defaultMinZoomForMarkerLabel: 11, - defaultMinZoomForMarkerPrevPosition: 11, - defaultMinZoomForMarkerTail: 9, - defaultMinZoomForMarkers: 8, - - minZoomForMarkerLabel: 11, - minZoomForMarkerPrevPosition: 11, - minZoomForMarkerTail: 9, - minZoomForMarkers: 8, - - markerSymbolBaseDir: "/symbols/", - imagesBaseDir: "/images/", - - defaultCurrentZoom: 11, - defaultCurrentZoomMobile: 11, - - dateFormat: "L LTSZ", - dateFormatNoTimeZone: "L LTS", - - host: "www.aprsdirect.com", - baseUrl: "https://www.aprsdirect.com", - - defaultTimeLength: 60, - - symbolsToScale: [], - - // Contains ascii values that corresponds to symbols without support for direction polyline (for symbols in the primary table) - primarySymbolWithNoDirectionPolyline: [87, 64, 95], - - // Contains ascii values that corresponds to symbols without support for direction polyline (for symbols in the alterantive table) - alternativeSymbolWithNoDirectionPolyline: [ - 40, 42, 64, 74, 84, 85, 96, 98, 101, 102, 112, 116, 119, 121, 123, - ], - }; - }, - - /** - * Parse the options - * @param {object} options - */ - _parseOptions: function (options) { - if (typeof options["cordinatesContainerElementId"] !== undefined) { - this._cordinatesContainerElementId = - options["cordinatesContainerElementId"]; - } - if (typeof options["statusContainerElementId"] !== undefined) { - this._statusContainerElementId = options["statusContainerElementId"]; - } - if (typeof options["isMobile"] !== undefined) { - this.isMobile = options["isMobile"]; - } - if (typeof options["coverageDataUrl"] !== undefined) { - this.coverageDataUrl = options["coverageDataUrl"]; - } - if (typeof options["coveragePercentile"] !== undefined) { - this.coveragePercentile = options["coveragePercentile"]; - } - if (typeof options["time"] !== undefined) { - this._time = options["time"]; - } - if (typeof options["timetravel"] !== undefined) { - this._timetravel = options["timetravel"]; - } - if (typeof options["center"] !== undefined) { - this._center = options["center"]; - } - if (typeof options["zoom"] !== undefined) { - this._zoom = options["zoom"]; - } - if (typeof options["maptype"] !== undefined) { - this._maptype = options["maptype"]; - } - if (typeof options["mid"] !== undefined) { - this._mid = options["mid"]; - } - if ( - typeof options["filters"] !== undefined && - options["filters"] !== null - ) { - for (var i in options["filters"]) { - if (options["filters"][i] !== null && options["filters"][i] != "") { - this._filters[i] = options["filters"][i]; - } - } - } - if ( - typeof options["disableLocationChangeOnFilterResponse"] !== undefined && - options["disableLocationChangeOnFilterResponse"] - ) { - this._doNotChangeLocationOnFilterResponse = true; - } - if ( - typeof options["defaultMinZoomForMarkerLabel"] !== undefined && - options["defaultMinZoomForMarkerLabel"] != null - ) { - this.settings.defaultMinZoomForMarkerLabel = - options["defaultMinZoomForMarkerLabel"]; - } - if ( - typeof options["defaultMinZoomForMarkerPrevPosition"] !== undefined && - options["defaultMinZoomForMarkerPrevPosition"] != null - ) { - this.settings.defaultMinZoomForMarkerPrevPosition = - options["defaultMinZoomForMarkerPrevPosition"]; - } - if ( - typeof options["defaultMinZoomForMarkerTail"] !== undefined && - options["defaultMinZoomForMarkerTail"] != null - ) { - this.settings.defaultMinZoomForMarkerTail = - options["defaultMinZoomForMarkerTail"]; - } - if ( - typeof options["defaultMinZoomForMarkers"] !== undefined && - options["defaultMinZoomForMarkers"] != null - ) { - this.settings.defaultMinZoomForMarkers = - options["defaultMinZoomForMarkers"]; - } - - if (typeof options["animate"] !== undefined && options["animate"] != null) { - this.settings.animate = options["animate"]; - } - - if (typeof options["host"] !== undefined && options["host"] != null) { - this.settings.host = options["host"]; - this.settings.baseUrl = this._getMapBaseUrl(options["host"]); - } else { - this.settings.baseUrl = this._getMapBaseUrl(); - } - - if ( - typeof options["defaultTimeLength"] !== undefined && - options["defaultTimeLength"] != null - ) { - this.settings.defaultTimeLength = options["defaultTimeLength"]; - } - - if ( - typeof options["symbolsToScale"] !== undefined && - options["symbolsToScale"] !== null - ) { - this.settings.symbolsToScale = options["symbolsToScale"]; - } - - this._initDefaultLocation(options); - }, - - /** - * Initialize default location - * @param {object} options - */ - _initDefaultLocation: function (options) { - if ( - typeof options["defaultLatitude"] !== "undefined" && - typeof options["defaultLongitude"] !== "undefined" - ) { - this._defaultLatitude = options["defaultLatitude"]; - this._defaultLongitude = options["defaultLongitude"]; - } else { - this._defaultLatitude = 0; - this._defaultLongitude = 0; - } - }, - - /** - * Init time - * @return null - */ - _initTime: function () { - var filterMode = false; - if ( - "sid" in this._filters || - "sidlist" in this._filters || - "sname" in this._filters || - "snamelist" in this._filters - ) { - filterMode = true; - } - - if (this._time != null && this._isValidTime(this._time, filterMode)) { - this.setTimeLength(this._time, false); - } else { - this.setTimeLength(this.settings.defaultTimeLength, false); - } - - now = new Date(); - if ( - this._timetravel != null && - this._timetravel >= 0 && - this._timetravel <= now.getTime() / 1000 - ) { - this.setTimeTravelTimestamp(this._timetravel, false); - } - - this._updateMinZoomLevels(); - }, - - /** - * Init map - * @param {object} options - * @return null - */ - _mapInit: function (options) { - if ( - "sid" in this._filters || - "sidlist" in this._filters || - "sname" in this._filters || - "snamelist" in this._filters - ) { - // To avoid flicker we wait with sending feed requests until we get the filter response - this._waitForFilterResponse = true; - if (window.location.href.indexOf("/center/") >= 0) { - this._doNotChangeLocationOnFilterResponseTmp = true; - } - } - - var tdMapOptions = this._getMapInitOptions(options); - var me = this; - - $(document).ready(function () { - me._map = new trackdirect.models.Map(me._mapElementId, tdMapOptions); - me._markerCreator = new trackdirect.MarkerCreator(me._map); - - if ( - typeof options["useImperialUnit"] !== "undefined" && - options["useImperialUnit"] == true - ) { - me.enableImperialUnits(); - } - - me._emitEventListeners("map-created"); - }); - }, - - /** - * Returns the map init options - * @param {array} options - * @return string - */ - _getMapInitOptions: function (options) { - var center = this._getMapInitCenter(); - var tdMapOptions = { - zoom: this._getMapInitZoom(), - maptype: this._getMapInitMapType(), - cordinatesContainer: this._cordinatesContainerElementId, - defaultLatitude: this._defaultLatitude, - defaultLongitude: this._defaultLongitude, - initCenter: center, - mid: this._getMapInitMid(), - }; - - if ("supportedMapTypes" in options) { - tdMapOptions["supportedMapTypes"] = options["supportedMapTypes"]; - } - - if ("mapboxGLStyle" in options) { - tdMapOptions["mapboxGLStyle"] = options["mapboxGLStyle"]; - } - - if ("mapboxGLAccessToken" in options) { - tdMapOptions["mapboxGLAccessToken"] = options["mapboxGLAccessToken"]; - } - - if ("mapboxGLAttribution" in options) { - tdMapOptions["mapboxGLAttribution"] = options["mapboxGLAttribution"]; - } - - return tdMapOptions; - }, - - /** - * Returns the map init center - * @return string - */ - _getMapInitCenter: function () { - if (this._center != null) { - var centerParts = this._center.split(","); - if ( - centerParts.length == 2 && - this._isValidLatitude(centerParts[0]) && - this._isValidLongitude(centerParts[1]) - ) { - return { - lat: parseFloat(centerParts[0]), - lng: parseFloat(centerParts[1]), - }; - } - } - return null; - }, - - /** - * Returns the map init zoom - * @return string - */ - _getMapInitZoom: function () { - var zoom = null; - if (this._zoom != null && this._isValidZoom(this._zoom)) { - zoom = this._zoom; - } - return zoom; - }, - - /** - * Returns the map init mid value - * @return string - */ - _getMapInitMid: function () { - var mid = null; - if (this._mid != null) { - mid = this._mid; - } - return mid; - }, - - /** - * Returns the map init map type - * @return string - */ - _getMapInitMapType: function () { - var maptype = null; - if (this._maptype != null) { - maptype = this._maptype; - } - return maptype; - }, - - /** - * Init filter url request, returnes true if filter request is sent otherwise false - * @return boolean - */ - _initFilterUrlRequest: function () { - if ("sid" in this._filters) { - stationId = this._filters["sid"]; - if (isNumeric(stationId)) { - this.filterOnStationId(stationId); - } - } else if ("sname" in this._filters) { - stationName = this._filters["sname"]; - if (stationName != "") { - this.filterOnStationName(stationName); - } - } else if ("sidlist" in this._filters) { - stationIdArray = this._filters["sidlist"].split(","); - var isValid = true; - for (var i = 0; i < stationIdArray.length; i++) { - if (!isNumeric(stationIdArray[i])) { - isValid = false; - } - } - if (isValid) { - this.filterOnStationId(stationIdArray); - } - } else if ("snamelist" in this._filters) { - stationNameArray = this._filters["snamelist"].split(","); - var isValid = true; - for (var i = 0; i < stationNameArray.length; i++) { - if ( - typeof stationNameArray[i] == "undefined" || - stationNameArray[i] == "" - ) { - isValid = false; - } - } - if (isValid) { - this.filterOnStationName(stationNameArray); - } - } else { - return false; - } - - // This timeout is just to be safe, if we get a bad station request we should at least show regular aprs data after a while - var me = this; - this._filterTimeoutId = window.setTimeout(function () { - // Remember to clear _filterTimeoutId and _waitForFilterResponse when we have received a filter response - if (me._waitForFilterResponse) { - // We give up, we have not received any filter response, ask for everything instead - me._waitForFilterResponse = false; - trackdirect.services.callbackExecutor.add( - me, - me._sendPositionRequest, - [] - ); - } - }, 5000); - - return true; - }, - - /** - * Returns true if parameter is a valid zoom - * @param {int} time - * @param {boolean} filteredMode - * @return {boolean} - */ - _isValidTime: function (time, filteredMode) { - if (isNumeric(time)) { - if (filteredMode && time <= 14400 && time > 0) { - return true; - } else if (filteredMode == false && time <= 1440 && time > 0) { - return true; - } - } - return false; - }, - - /** - * Returns true if parameter is a valid zoom - * @param {int} zoom - * @return {boolean} - */ - _isValidZoom: function (zoom) { - if (isNumeric(zoom)) { - if (zoom <= 21 && zoom >= 0) { - return true; - } - } - return false; - }, - - /** - * Returns true if parameter is a valid latitude - * @param {object} lat - * @return {boolean} - */ - _isValidLatitude: function (lat) { - if (isNumeric(lat)) { - if (lat <= 90 && lat >= -90) { - return true; - } - } - return false; - }, - - /** - * Returns true if parameter is a valid longitude - * @param {object} lng - * @return {boolean} - */ - _isValidLongitude: function (lng) { - if (isNumeric(lng)) { - if (lng <= 180 && lng >= -180) { - return true; - } - } - return false; - }, - - /** - * Initializes the map listeners - * @return null - */ - _initMapListeners: function () { - var me = this; - this._map.addTdListener("change", function () { - trackdirect.services.callbackExecutor.add( - me, - me._sendPositionRequest, - [] - ); - trackdirect.services.mapAttributionModifier.update(me._map); - }); - this._map.addTdListener("moving", function () { - // This event will happen many times, but same message will never be sent twice (handled by both ws-part and queue) - trackdirect.services.callbackExecutor.addIfUnique( - me, - me._sendIdleRequest, - [] - ); - }); - this._map.addTdListener("station-tail-needed", function (stationId) { - me._websocket.doSendCompleteStationRequest( - stationId, - me._map.state.getTimeLength() / 60, - me.getTimeTravelTimestamp() - ); - }); - this._map.addTdListener("station-information", function (stationId) { - me.openStationInformationDialog(stationId); - }); - }, - - /** - * Initializes the websocket listeners - * @return null - */ - _initWebsocketListeners: function () { - this._initWebsocketStateChangeListener(); - this._initWebsocketAprsPacketListener(); - this._initWebsocketPayloadDoneListener(); - this._initWebsocketFilterResponseListener(); - this._initWebsocketServerTimestampResponseListener(); - this._initWebsocketResetListener(); - }, - - /** - * Initializes websocket state change listener - * @return null - */ - _initWebsocketStateChangeListener: function () { - var me = this; - this._websocket.addListener("state-change", function () { - var callback = function () { - me._handleWebsocketStateChange(); - }; - trackdirect.services.callbackExecutor.add(this, callback, []); - }); - }, - - /** - * Initializes websocket new aprs packet listener - * @return null - */ - _initWebsocketAprsPacketListener: function () { - var me = this; - this._websocket.addListener("aprs-packet", function (packetData) { - var packet = new trackdirect.models.Packet(packetData); - - var queueTimestamp = Math.floor(Date.now() / 1000); - var callback = function () { - var dequeueTimestamp = Math.floor(Date.now() / 1000); - if (dequeueTimestamp - queueTimestamp > 5 || !this.settings.animate) { - // More than 5 seconds has passed since queued or we do not want to animate - me._handleAprsPacket(packet, false); - } else { - me._handleAprsPacket(packet, true); - } - }; - trackdirect.services.callbackExecutor.add(me, callback, []); - }); - }, - - /** - * Initializes websocket payload done listener - * @return null - */ - _initWebsocketPayloadDoneListener: function () { - var me = this; - this._websocket.addListener("aprs-packet-payload-done", function () { - var callback = function () { - me._map.showNewMarkersInQueue(true); - }; - trackdirect.services.callbackExecutor.add(this, callback, []); - }); - }, - - /** - * Initializes websocket filter response listener - * @return null - */ - _initWebsocketFilterResponseListener: function () { - var me = this; - this._websocket.addListener("filter-response", function (data) { - var callback = function () { - me._handleFilterResponse(data); - }; - trackdirect.services.callbackExecutor.add(this, callback, []); - }); - }, - - /** - * Initializes websocket server timestamp response listener - * @return null - */ - _initWebsocketServerTimestampResponseListener: function () { - var me = this; - this._websocket.addListener("server-timestamp-response", function (data) { - var callback = function () { - me._map.state.setServerCurrentTimestamp(data.timestamp); - }; - trackdirect.services.callbackExecutor.add(this, callback, []); - - // Just make sure we have not forgotten any markers in queue (should not be needed, but just to be safe) - if (me._map.getNumberOfNewMarkersToShow() > 0) { - var callback2 = function () { - me._map.showNewMarkersInQueue(true); - }; - trackdirect.services.callbackExecutor.addIfUnique(this, callback2, []); - } - }); - }, - - /** - * Initializes websocket reset listener - * @return null - */ - _initWebsocketResetListener: function () { - var me = this; - this._websocket.addListener("reset", function () { - // Important that everything happens in order!!! - trackdirect.services.callbackExecutor.add( - me._map, - me._map.resetAllMarkers, - [] - ); - }); - }, - - /** - * Update min zoom level based on time settings - * @return null - */ - _updateMinZoomLevels: function () { - if (this._map.state.getTimeLength() / 60 > 720) { - trackdirect.settings.minZoomForMarkerPrevPosition = - trackdirect.settings.defaultMinZoomForMarkerPrevPosition + 1; - trackdirect.settings.minZoomForMarkerTail = - trackdirect.settings.defaultMinZoomForMarkerTail + 1; - trackdirect.settings.minZoomForMarkerLabel = - trackdirect.settings.defaultMinZoomForMarkerLabel + 1; - trackdirect.settings.minZoomForMarkers = - trackdirect.settings.defaultMinZoomForMarkers; - } else { - trackdirect.settings.minZoomForMarkerPrevPosition = - trackdirect.settings.defaultMinZoomForMarkerPrevPosition; - trackdirect.settings.minZoomForMarkerTail = - trackdirect.settings.defaultMinZoomForMarkerTail; - trackdirect.settings.minZoomForMarkerLabel = - trackdirect.settings.defaultMinZoomForMarkerLabel; - trackdirect.settings.minZoomForMarkers = - trackdirect.settings.defaultMinZoomForMarkers; - } - }, - - /** - * Handle time change request - * @return null - */ - _handleTimeChange: function () { - this._updateMinZoomLevels(); - - // A reset request will soon be sent by server, but if server takes time we do it now also so user will notice that something happens - this._map.resetAllMarkers(); - - this._websocket.clearLastSentPositionRequest(); - trackdirect.services.callbackExecutor.add( - this, - this._sendPositionRequest, - [] - ); - this._emitEventListeners("mode-changed"); - }, - - /** - * Handle filter response - * @param {array} data - * @return null - */ - _handleFilterResponse: function (data) { - // We have received a filter response, reset timeout and stop waiting for response - if (this._filterTimeoutId !== null) { - clearTimeout(this._filterTimeoutId); - this._filterTimeoutId = null; - } - - if (data.length == 0) { - this._handleEmptyFilterResponse(); - } else { - this._handleNonEmptyFilterResponse(data); - } - }, - - /** - * Unmark all stations as filtered that has no packet in the specified array - * @param {array} data - * @return null - */ - _unMarkMissingStationsAsFiltered: function (data) { - var filterStationIds = this._map.state.getFilterStationIds(); - for (var key in filterStationIds) { - var stationId = filterStationIds[key]; - var foundStation = false; - for (var i = 0; i < data.length; i++) { - var packetData = data[i]; - if (packetData.station_id == stationId && packetData["related"] == 0) { - foundStation = true; - } - } - if (!foundStation) { - this._unMarkStationAsFiltered(stationId); - } - } - }, - - /** - * Unmark station as a station that we are filtering on - * @param {int} stationId - * @return None - */ - _unMarkStationAsFiltered: function (stationId) { - var map = this._map; - var index = map.state.filterStationIds.indexOf(stationId); - if (index > -1) { - map.state.filterStationIds.splice(index, 1); - - // If we for some reason have infoWindow open and doesn't close it, update link name - var filterLinkElementClass = "filterStationLink" + stationId; - $("." + filterLinkElementClass).html("Filter"); - - // We only hide the marker since it may exist in a station transmit event - for (var markerIdKey in map.markerCollection.getStationMarkerIdKeys( - stationId - )) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - marker.hideCompleteMarker(); - } - } - } - }, - - /** - * Returns the number of uniqe stations in array (excluding packets marked as related) - * @param {array} data - * @return int - */ - _getNumberOfUniqeStationsInArray: function (data) { - var numberOfStationPackets = 0; - for (var i = 0; i < data.length; i++) { - var packetData = data[i]; - if (packetData["related"] == 0) { - numberOfStationPackets++; - } - } - return numberOfStationPackets; - }, - - /** - * Track station in packet array (only if only one uniqe station exists) - * @param {array} data - * @param {boolean} onlyTrackRecentPackets - * @return null - */ - _trackStationInArray: function (data, onlyTrackRecentPackets) { - if (this._getNumberOfUniqeStationsInArray(data) == 1) { - for (var i = 0; i < data.length; i++) { - var packet = new trackdirect.models.Packet(data[i]); - if (packet["related"] == 0) { - // If we filter on only one station, track it - this.trackStation( - packet.station_id, - escapeHtml(packet.getStationName()), - false, - onlyTrackRecentPackets - ); - } - } - } - }, - - /** - * Add a packet from a filter response - * @param {array} data - * @return null - */ - _addFilterResponsePacketsToMap: function (data) { - // We add packet to map if it is so old that it will not be replaced by a newPositionRequest or if we will not call a newPositionRequest (if info window is open) - var tryToShowPacket = this._isAnyPacketInArrayOlderThanCurrentLimit(data); - for (var i = 0; i < data.length; i++) { - var packet = new trackdirect.models.Packet(data[i]); - if (packet["related"] == 0) { - this._markStationAsFiltered(packet.station_id); - } - - // This may look unnessecery since we will add it later again (by calling doSendNewPositionRequest), - // but if latest packet is old it may not be received any more, so don't remove the following calls... - var markerIdKey = this._markerCreator.addPacket(packet, tryToShowPacket); - var marker = this._map.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - marker.markToBeOverWritten(); - } - } - }, - - /** - * Mark station as a station that we are filtering on - * @param {int} stationId - * @return None - */ - _markStationAsFiltered: function (stationId) { - var map = this._map; - if (map.state.filterStationIds.indexOf(stationId) == -1) { - map.state.filterStationIds.push(stationId); - } - - // If we for some reason have infoWindow open and doesn't close it, update link name - var filterLinkElementClass = "filterStationLink" + stationId; - $("." + filterLinkElementClass).html("Unfilter"); - - // If we allready have markers for this station we should show them - for (var markerIdKey in map.markerCollection.getStationMarkerIdKeys( - stationId - )) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - marker.showCompleteMarker(); - } - } - }, - - /** - * Handle non empty filter response - * @param {array} data - * @return null - */ - _handleNonEmptyFilterResponse: function (data) { - var isFilterModeNew = !this.isFilteredMode(); - this._map.activateFilteredMode(); - this._waitForFilterResponse = false; - - if (isFilterModeNew) { - this._map.resetAllMarkers(); - - this._emitEventListeners("mode-changed"); - } else { - this._unMarkMissingStationsAsFiltered(data); - } - - this._addFilterResponsePacketsToMap(data); - - var packets = []; - for (var i = 0; i < data.length; i++) { - packets.push(new trackdirect.models.Packet(data[i])); - } - this._emitEventListeners("filter-changed", packets); - - if (isFilterModeNew) { - var onlyTrackRecentPackets = true; - if ( - !this._doNotChangeLocationOnFilterResponse && - !this._doNotChangeLocationOnFilterResponseTmp - ) { - onlyTrackRecentPackets = false; - this._setFilteredMapBounds(data); - } - this._doNotChangeLocationOnFilterResponseTmp = false; - this._trackStationInArray(data, onlyTrackRecentPackets); - this._emitEventListeners("filter-new"); - } - trackdirect.services.callbackExecutor.add( - this, - this._requestFilteredUpdate, - [] - ); - }, - - /** - * Request filtered update from server - * @return null - */ - _requestFilteredUpdate: function () { - // request update from server (request is filtered), but if information dialog is open we wait until it closes - this._websocket.clearLastSentPositionRequest(); - this._setWebsocketStateLoading(false); - this._websocket.doSendNewPositionRequest( - 90, - 180, - -90, - -180, - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp(), - false - ); - }, - - /** - * Handle empty filter response - * @param {array} data - * @return null - */ - _handleEmptyFilterResponse: function () { - // Response indicate that user are not demanding anything, we will reset and restart everything - this._deactivateFiltered(true); - this._waitForFilterResponse = false; - }, - - /** - * Returns true if any packet in array is older than current timelimit - * @param {array} data - * @return {boolean} - */ - _isAnyPacketInArrayOlderThanCurrentLimit: function (data) { - for (var i = 0; i < data.length; i++) { - var packetData = data[i]; - if (packetData["related"] == 0) { - // The 60 seconds is just a marginal - if (packetData.timestamp < packetData.requested_timestamp + 60) { - return true; - } - - if (packetData["source"] == 0 || packetData["source_id"] == 0) { - // packet seems to be simulated, we better treat it as a very old packet - return true; - } - } - } - return false; - }, - - /** - * Set map bounds after receiving a filter response - * @param {array} data - * @return {int} - */ - _setFilteredMapBounds: function (data) { - if (data.length == 1) { - this._map.setCenter( - { - lat: parseFloat(data[0].latitude), - lng: parseFloat(data[0].longitude), - }, - 12 - ); - } else { - var positions = []; - for (var i = 0; i < data.length; i++) { - var packetData = data[i]; - if (packetData["related"] == 0) { - positions.push({ - lat: parseFloat(packetData.latitude), - lng: parseFloat(packetData.longitude), - }); - } - } - - this._map.fitBounds(positions); - if (this._map.getZoom() > 12) { - this._map.setZoom(12); - } - } - }, - - /** - * Handle a received APRS packet! - * @param {trackdirect.models.Packet} packet - * @param {boolean} animate - * @return null - */ - _handleAprsPacket: function (packet, animate) { - var markerIdKey = this._markerCreator.addPacket(packet, true); - if (markerIdKey !== null) { - var highlight = false; - var autoRender = false; - var marker = this._map.markerCollection.getMarker(markerIdKey); - if ( - animate && - packet.db == 0 && - packet.station_name == packet.sender_name && - marker.shouldMarkerBeVisible() && - (this.isFilteredMode() || this._isPacketOnMap(packet)) - ) { - highlight = true; - - var tdTransmitAnimation = new trackdirect.models.TransmitAnimation( - marker, - this._map - ); - tdTransmitAnimation.show(); - } - - if (packet.realtime == 1 && animate) { - autoRender = true; - } - } - }, - - /** - * Returns linkified packet.raw - * @param {trackdirect.models.Packet} packet - * @return {string} - */ - _linkifyPacketRaw: function (packet) { - if (typeof packet.raw !== "undefined" && typeof packet.raw == "string") { - var raw = escapeHtml(packet.raw); - var stationNameReplacement = - '<a href="#" onclick="trackdirect.focusOnMarkerId(' + - packet.marker_id + - '); return false;">' + - escapeHtml(packet.sender_name) + - "</a>"; - raw = raw.replaceAll( - escapeHtml(packet.sender_name) + ">", - stationNameReplacement + ">" - ); - - for (var i = 0; i < packet.station_id_path.length; i++) { - var relatedStationId = packet.station_id_path[i]; - var relatedStationLatestPacket = - this._map.markerCollection.getStationLatestPacket(relatedStationId); - if (relatedStationLatestPacket !== null) { - var relatedStationNameReplacement = - '<a href="#" onclick="trackdirect.focusOnStation(' + - relatedStationId + - ', true); return false;">' + - escapeHtml(relatedStationLatestPacket.sender_name) + - "</a>"; - - var relatedStationSenderName = escapeHtml( - relatedStationLatestPacket.sender_name - ); - raw = raw.replaceAll( - ">" + relatedStationSenderName + ":", - ">" + relatedStationNameReplacement + ":" - ); - raw = raw.replaceAll( - ">" + relatedStationSenderName + ",", - ">" + relatedStationNameReplacement + "," - ); - raw = raw.replaceAll( - ">" + relatedStationSenderName + "*", - ">" + relatedStationNameReplacement + "*" - ); - - raw = raw.replaceAll( - "," + relatedStationSenderName + ":", - "," + relatedStationNameReplacement + ":" - ); - raw = raw.replaceAll( - "," + relatedStationSenderName + ",", - "," + relatedStationNameReplacement + "," - ); - raw = raw.replaceAll( - "," + relatedStationSenderName + "*", - "," + relatedStationNameReplacement + "*" - ); - } - } - - // Before returning we also linkify any url - raw = Autolinker.link(raw, { newWindow: true }); - return raw; - } - return ""; - }, - - /** - * Returns true if packet is on map, false otherwise - * @param {trackdirect.models.Packet} packet - * @return boolean - */ - _isPacketOnMap: function (packet) { - if ( - packet.latitude <= this._map.getNorthEastLat() && - packet.latitude >= this._map.getSouthWestLat() - ) { - if ( - packet.longitude <= this._map.getNorthEastLng() && - packet.longitude >= this._map.getSouthWestLng() - ) { - return true; - } - } - return false; - }, - - /** - * Modify website when websocket state has changed - * @return null - */ - _handleWebsocketStateChange: function () { - switch (this._websocket.getState()) { - case this._websocket.State.CONNECTING: - this._setWebsocketStateConnecting(); - break; - - case this._websocket.State.CONNECTED: - this._setWebsocketStateConnected(); - - // Trigger map change event since we now have access to websocket - trackdirect.services.callbackExecutor.add( - this, - this._sendPositionRequest, - [] - ); - break; - - case this._websocket.State.CLOSED: - case this._websocket.State.ERROR: - this._setWebsocketStateError(); - break; - - case this._websocket.State.LOADING: - this._setWebsocketStateLoading(true, false); - break; - - case this._websocket.State.LOADING_DONE: - this._setWebsocketStateLoadingDone(); - break; - - case this._websocket.State.LISTENING_APRSIS: - this._setWebsocketStateAprsISConnected(); - break; - - case this._websocket.State.CONNECTING_APRSIS: - this._setWebsocketStateAprsISConnecting(); - break; - - case this._websocket.State.IDLE: - this._setWebsocketStateIdle(); - break; - - case this._websocket.State.INACTIVE: - this._setWebsocketStateInactive(); - break; - } - }, - - /** - * Show that websocket is Connecting - * @return null - */ - _setWebsocketStateConnecting: function () { - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Connecting") - .css("color", "blue"); - } - }, - - /** - * Show that websocket is Connected - * @return null - */ - _setWebsocketStateConnected: function () { - this._map.resetAllMarkers(); - - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Connected") - .css("color", "green"); - } - }, - - /** - * Show that websocket has a problem - * @return null - */ - _setWebsocketStateError: function () { - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Disconnected") - .css("color", "red"); - } - - this._map.resetAllMarkers(); - this._deactivateFiltered(false); - - var me = this; - if ( - confirm( - "You have been disconnected, this can be caused by a network error, by the timeout limit or if maintenance occurs while you’re logged in. Do you want to reconnect?" - ) - ) { - me._websocket = new trackdirect.Websocket(me._wsServerUrl); - me._initWebsocketListeners(); - trackdirect.services.callbackExecutor.add( - me, - me._sendPositionRequest, - [] - ); - } - }, - - /** - * Show that websocket is loading - * @param {boolean} isStateConfirmed - * @param {boolean} showOnMobile - * @return null - */ - _setWebsocketStateLoading: function (isStateConfirmed, showOnMobile) { - isStateConfirmed = - typeof isStateConfirmed !== "undefined" ? isStateConfirmed : true; - showOnMobile = typeof showOnMobile !== "undefined" ? showOnMobile : true; - - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html( - 'Loading <i class="fa fa-spinner fa-spin" style="font-size:14px"></i>' - ) - .css("color", "green"); - } - }, - - /** - * Show that websocket is done loading - * @return null - */ - _setWebsocketStateLoadingDone: function () { - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Complete") - .css("color", "green"); - } - }, - - /** - * Show that websocket is receiving packets from APRS-IS - * @return null - */ - _setWebsocketStateAprsISConnected: function () { - // APRS-IS Connection is up for this area! - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Connected to APRS feed") - .css("color", "green"); - } - }, - - /** - * Show that websocket waiting for packets from APRS-IS - * @return null - */ - _setWebsocketStateAprsISConnecting: function () { - // Waiting for APRS-IS Connection - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Waiting for APRS feed") - .css("color", "green"); - } - }, - - /** - * Show that websocket is IDLE - * @return null - */ - _setWebsocketStateIdle: function () { - // We are zoomed out and not doing anything - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Idle") - .css("color", "green"); - } - }, - - /** - * Show that websocket is INACTIVE - * @return null - */ - _setWebsocketStateInactive: function () { - if (this._statusContainerElementId !== null) { - $("#" + this._statusContainerElementId) - .html("Inactive") - .css("color", "orange"); - } - - this._websocket.close(); - this._map.resetAllMarkers(); - var me = this; - if ( - confirm( - "No activity for a long time, map updates has been stopped. Do you want to reconnect?" - ) - ) { - me._websocket = new trackdirect.Websocket(me._wsServerUrl); - me._initWebsocketListeners(); - trackdirect.services.callbackExecutor.add( - me, - me._sendPositionRequest, - [] - ); - } - }, - - /** - * Send a position request to server - * @return null - */ - _sendPositionRequest: function () { - if (!this._waitForFilterResponse && this._map.isMapReady()) { - if (!this.isFilteredMode()) { - if (this._map.getZoom() < trackdirect.settings.minZoomForMarkers) { - // Just stop connection to APRS-IS - this._websocket.doSendNewPositionRequest( - 0, - 0, - 0, - 0, - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp(), - false - ); - } else if ( - this._map.getZoom() >= trackdirect.settings.minZoomForMarkerTail - ) { - // We need all details, send regular request - this._websocket.doSendNewPositionRequest( - this._map.getNorthEastLat(), - this._map.getNorthEastLng(), - this._map.getSouthWestLat(), - this._map.getSouthWestLng(), - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp(), - false - ); - } else { - // We only need markers, only request the last packet for each station (server my still send everything, but we do not force server to do that) - this._websocket.doSendNewPositionRequest( - this._map.getNorthEastLat(), - this._map.getNorthEastLng(), - this._map.getSouthWestLat(), - this._map.getSouthWestLng(), - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp(), - true - ); - } - } else { - // We are filtering, request everything everywhere for our filter - this._websocket.doSendNewPositionRequest( - 90, - 180, - -90, - -180, - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp(), - false - ); - } - - var data = { - center: this._map.getCenterLiteral(), - zoom: this._map.getZoom(), - }; - this._emitEventListeners("position-request-sent", data); - } - }, - - /** - * Send a idle request to server if needed - * @return null - */ - _sendIdleRequest: function () { - // The position 0,0,0,0 means that we request server to be IDLE - if (this._websocket.isPositionRequestSent()) { - this._websocket.doSendNewPositionRequest( - 0, - 0, - 0, - 0, - this._map.state.getTimeLength() / 60, - this.getTimeTravelTimestamp(), - false - ); - } - }, - - /** - * Deactivate filtered mode is confirmed - * @param {boolean} sendNewRequest - * @return null - */ - _deactivateFiltered: function (sendNewRequest) { - // Reset Time travel - this.setTimeTravelTimestamp(null); - - // clear everything - this._map.resetAllMarkers(); - - if (this._map.state.openInfoWindow !== null) { - this._map.state.openInfoWindow.hide(); - } - this._map.deactivateFilteredMode(); - - // If we was tracking one station that we was filtering on, stop tracking it - this.stopTrackStation(); - this.setTimeLength(this.settings.defaultTimeLength, false); - - this._emitEventListeners("filter-changed", []); - this._emitEventListeners("filter-stopped"); - - if (sendNewRequest) { - trackdirect.services.callbackExecutor.add( - this, - this._sendPositionRequest, - [] - ); - } - - this._emitEventListeners("mode-changed"); - }, - - /** - * Returns the website base URL - * @param {string} host - * @return string - */ - _getMapBaseUrl: function (host) { - host = typeof host !== "undefined" ? host : ""; - host = host.replace("http://", ""); - host = host.replace("https://", ""); - if (host == "") { - host = window.location.host; - } - if (location.protocol === "https:") { - return "https://" + host; - } else { - return "http://" + host; - } - }, - - /** - * Call all listeners that are listening on specified event - * @param {string} event - * @param {string} arg - * @return null - */ - _emitEventListeners: function (event, arg) { - if (event in this._eventListeners) { - for (var i = 0; i < this._eventListeners[event].length; i++) { - this._eventListeners[event][i](arg); - } - } - - if (event in this._eventListenersOnce) { - for (var i = 0; i < this._eventListenersOnce[event].length; i++) { - this._eventListenersOnce[event][i](arg); - this._eventListenersOnce[event].splice(i, 1); - i--; - } - } - - if (event == "trackdirect-init-done") { - this._trackdirectInitDone = true; - } - - if (event == "map-created") { - this._mapCreated = true; - } - }, -}; diff --git a/jslib/src/trackdirect/MarkerCreator.js b/jslib/src/trackdirect/MarkerCreator.js deleted file mode 100755 index 4c6a6a88c9a14dcc972d442ce4de4d5ecb0a18b5..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/MarkerCreator.js +++ /dev/null @@ -1,914 +0,0 @@ -/** - * Class trackdirect.MarkerCreator - * @param {trackdirect.models.Map} map - */ -trackdirect.MarkerCreator = function (map) { - this._map = map; - - // Station id for the packet sequence that is currenly being added to the map - this._currentPacketSequenceStationId = null; -}; - -/** - * Add new packet to map - * @param {object} packet - * @param {boolean} tryToShowPacket - * @return {int} markerIdKey - */ -trackdirect.MarkerCreator.prototype.addPacket = function ( - packet, - tryToShowPacket -) { - if (this.isBadPacket(packet)) { - return null; - } - var markerIdKey = this._map.markerCollection.getMarkerIdKey(packet.marker_id); - - if (this._map.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - if ( - marker.packet.is_moving == 1 && - packet.is_moving != 1 - ) { - // If server for some reason decides to change move-type we keep the original moving since we have started to plot it - // Server should not do this... - packet.is_moving = 1; - } - } else { - if (packet.packet_order_id == 2) { - // Something is wrong, a packet should not have order id 2 if no marker exists - packet.packet_order_id = 3; // Force first packet - } - } - - markerIdKeyToOverwrite = this._getMarkerIdKeyToOverwrite(packet); - if (markerIdKeyToOverwrite !== null) { - this._overwriteMarker(markerIdKeyToOverwrite, markerIdKey); - } - - if (this._map.markerCollection.isPacketReplacingMarker(packet)) { - this._replaceMarker(markerIdKey); - } - - this._setCurrentPacketSequenceStationId(packet); - this._convertLostMarkersToGhost(packet); - this._connectToPreviousMarker(packet); - - marker = this._createMarker(packet); - - // Add to map sector and show it if that should be done - this._map.addMarkerToMapSectors(markerIdKey, packet, tryToShowPacket); - - if (packet.overwrite == 1) { - marker.overwrite = true; // Mark it to be overwritten - } - return markerIdKey; -}; - -/** - * Should packet overwrite any previous marker? - * If so the markerIdKey will be returned otherwise null - * @param {object} packet - * @return {int} - */ -trackdirect.MarkerCreator.prototype._getMarkerIdKeyToOverwrite = function ( - packet -) { - var markerIdKey = this._map.markerCollection.getMarkerIdKey(packet.marker_id); - if (this._map.markerCollection.isExistingMarker(markerIdKey)) { - // This marker exists on map, overwrite if it is marked to be overwritten - var marker = this._map.markerCollection.getMarker(markerIdKey); - if (marker.overwrite == true && packet.overwrite == 0) { - return markerIdKey; - } - } else { - // If packet is stationary and station has another marker allready, check if it may be the same thing - // It may be the same thing but different marker id's if it is more than 24h between packets - // (collector only connects packets that has less than 24h apart from eachother) - var prevMarker = this._map.markerCollection.getStationLatestMarker( - packet.station_id - ); - if (prevMarker !== null) { - if ( - packet.is_moving == 0 && - packet.station_id == prevMarker.packet.station_id && - packet.timestamp - prevMarker.packet.timestamp > 86400 && - Math.round(prevMarker.packet.latitude * 100000) == - Math.round(packet.latitude * 100000) && - Math.round(prevMarker.packet.longitude * 100000) == - Math.round(packet.longitude * 100000) && - prevMarker.packet.symbol == packet.symbol && - prevMarker.packet.symbol_table == packet.symbol_table - ) { - return prevMarker.markerIdKey; - } - } - } - return null; -}; - -/** - * Replace marker - * Replace is bit different from overwrite: - * - replace is just replacing the latest position, used for stationary when a new packet for the same position is received - * - overwrite is used when only the latest packet has been added to map and we now want to add the history - * @param {int} markerIdKey - * @return {null} - */ -trackdirect.MarkerCreator.prototype._replaceMarker = function (markerIdKey) { - if (this._map.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - if (this._map.state.isMarkerInfoWindowOpen(marker)) { - this._map.state.openInfoWindowForMarkerIdKey = markerIdKey; - } - - // We hide old marker since we will just overwrite the variable which will not remove it from map - marker.hide(0, false, false); - marker.stopDirectionPolyline(); - } -}; - -/** - * Prepare marker to be overwritten - * @param {int} prevMarkerIdKey - * @param {int} newMarkerIdKey - * @return {null} - */ -trackdirect.MarkerCreator.prototype._overwriteMarker = function ( - prevMarkerIdKey, - newMarkerIdKey -) { - var prevMarker = this._map.markerCollection.getMarker(prevMarkerIdKey); - if (this._map.state.isMarkerInfoWindowOpen(prevMarker)) { - this._map.state.openInfoWindowForMarkerIdKey = newMarkerIdKey; - } - - var markerLabel = prevMarker.label; - var markerPolyLine = - this._map.markerCollection.getMarkerPolyline(prevMarkerIdKey); - var markerDotMarkers = - this._map.markerCollection.getDotMarkers(prevMarkerIdKey); - var markerOriginDashedPolyline = - this._map.markerCollection.getMarkerDashedPolyline(prevMarkerIdKey); - - clearTimeout(prevMarker.toOldTimerId); - if (markerDotMarkers != null) { - for (var i = 0; i < markerDotMarkers.length; i++) { - clearTimeout(markerDotMarkers[i].toOldTimerId); - } - } - - this._map.markerCollection.resetMarker(prevMarkerIdKey); - if (this._map.oms) { - this._map.oms.removeMarker(prevMarker); - } - - if ( - prevMarker != null && - typeof prevMarker.packet.latitude != "undefined" && - typeof prevMarker.packet.longitude != "undefined" - ) { - this._map.markerCollection.removePostionMarkerId( - prevMarker.packet.latitude, - prevMarker.packet.longitude, - prevMarkerIdKey - ); - this._map.showTopLabelOnPosition( - prevMarker.packet.latitude, - prevMarker.packet.longitude - ); - } - - // Note that the marker needs to be hidden after it has been removed from array - // (otherwise it may be shown again before it is removed) - prevMarker.hide(0, false, false); - if (markerPolyLine !== null) { - markerPolyLine.hide(); - } - if (markerDotMarkers != null) { - for (var i = 0; i < markerDotMarkers.length; i++) { - markerDotMarkers[i].hide(); - } - } - if (markerOriginDashedPolyline !== null) { - markerOriginDashedPolyline.hide(); - - // Remove dashed polyline from related marker also - if ( - typeof markerOriginDashedPolyline.relatedMarkerIdKey !== "undefined" && - markerOriginDashedPolyline.relatedMarkerIdKey !== null - ) { - var prevMarker = this._map.markerCollection.getMarker( - markerOriginDashedPolyline.relatedMarkerIdKey - ); - if ( - prevMarker !== null && - typeof prevMarker._relatedMarkerOriginDashedPolyLine !== "undefined" - ) { - prevMarker._relatedMarkerOriginDashedPolyLine = null; - } - } - } - - prevMarker.hidePHGCircle(); - prevMarker.hideRNGCircle(); - - if (prevMarker.directionPolyLine !== null) { - prevMarker.directionPolyLine.stop(); - } -}; - -/** - * Remember the station that we are currently working, if we receive a series of packet for a station - * @param {object} packet - */ -trackdirect.MarkerCreator.prototype._setCurrentPacketSequenceStationId = - function (packet) { - if (packet.packet_order_id == 3) { - this._currentPacketSequenceStationId = packet.station_id; - } - - if ( - packet.packet_order_id == 2 && - this._currentPacketSequenceStationId === null - ) { - // Looks like we marked the start-packet as bad... - this._currentPacketSequenceStationId = packet.station_id; - packet.packet_order_id = 3; - } - - if (packet.packet_order_id == 1) { - this._currentPacketSequenceStationId = null; - } - }; - -/** - * Create a new marker! - * @param {object} packet - */ -trackdirect.MarkerCreator.prototype._createMarker = function (packet) { - var markerIdKey = this._map.markerCollection.getMarkerIdKey(packet.marker_id); - var prevmarker = this._map.markerCollection.getMarker(markerIdKey); - this._map.state.currentMarkerZindex += 1; - - if (packet.packet_order_id == 1 || packet.is_moving == 0) { - if (prevmarker !== null) { - if ( - prevmarker.packet.latitude != packet.latitude && - prevmarker.packet.longitude != packet.longitude - ) { - this._map.markerCollection.removePostionMarkerId( - prevmarker.latitude, - prevmarker.longitude, - markerIdKey - ); - this._map.showTopLabelOnPosition( - prevmarker.latitude, - prevmarker.longitude - ); - } - } - var marker = new trackdirect.models.Marker(packet, false, this._map); - this._addInfoWindowClickListener(marker, true); - } else { - var marker = new trackdirect.models.Marker(packet, true, this._map); - this._map.markerCollection.addDotMarker(markerIdKey, marker); - this._addInfoWindowClickListener(marker, false); - } - marker.markerIdKey = markerIdKey; - - if (prevmarker !== null) { - if (!this._map.markerCollection.isPacketReplacingMarker(packet)) { - // We need to extend the marker polyline since this is not the first dotmarker - this._extendTail(prevmarker, marker); - } else { - // update marker for the latest polyline point - this._replaceTailMarker(markerIdKey); - } - } - - if (packet.packet_order_id == 1) { - if (packet.hasDirectionSupport() && packet.hasConfirmedMapId()) { - marker.directionPolyLine = new trackdirect.models.DirectionPolyline( - marker, - this._map - ); - } - } - - this._map.markerCollection.setMarker(markerIdKey, marker); - - if (!marker.isDotMarker()) { - this._createMarkerLabel(marker); - this._map.showTopLabelOnPosition(packet.latitude, packet.longitude); - } - - return marker; -}; - -/** - * Add listener for InfoWindow - * @param {object} marker - * @param {boolean} useOmsIfExists - */ -trackdirect.MarkerCreator.prototype._addInfoWindowClickListener = function ( - marker, - useOmsIfExists -) { - var me = this; - if (useOmsIfExists && this._map.oms) { - me._map.oms.addMarker(marker); - } else if (typeof google === "object" && typeof google.maps === "object") { - marker.addListener("click", function () { - me._map.openMarkerInfoWindow(marker, false); - }); - } else if (typeof L === "object") { - marker.on("click", function () { - me._map.openMarkerInfoWindow(marker, false); - }); - } -}; - -/** - * Convert marker to dot marker - * @param {int} markerIdKey - * @param {object} packet - */ -trackdirect.MarkerCreator.prototype._convertToDotMarker = function ( - markerIdKey, - packet -) { - // Check that marker has not allready been converted to dot-marker - var dotMarker = this._map.markerCollection.getMarker(markerIdKey); - if (dotMarker != null && dotMarker.showAsMarker) { - dotMarker.stopDirectionPolyline(); - - if (this._map.state.isMarkerInfoWindowOpen(dotMarker)) { - this._map.state.openInfoWindowForMarkerIdKey = markerIdKey; - } - - if (!this._map.state.isFilterMode) { - if ( - this._map.getZoom() < trackdirect.settings.minZoomForMarkerPrevPosition - ) { - dotMarker.hide(); - } - } - - var icon = this._getDotMarkerIcon(packet); - dotMarker.setOpacity(1.0); - dotMarker.setIcon(icon); - if (typeof google === "object" && typeof google.maps === "object") { - dotMarker.setOptions({ anchorPoint: null }); - } - this._map.markerCollection.addDotMarker(markerIdKey, dotMarker); - - // Remove from oms - if (this._map.oms) { - this._map.oms.removeMarker(dotMarker); - - // markers that is not handled by oms need to have their own clicklistener - var me = this; - if (typeof google === "object" && typeof google.maps === "object") { - dotMarker.addListener("click", function () { - me._map.openMarkerInfoWindow(dotMarker, false); - }); - } else if (typeof L === "object") { - dotMarker.on("click", function () { - me._map.openMarkerInfoWindow(dotMarker, false); - }); - } - } - - // Allways hide label for marker that is converted to dot-marker (we are not sure if label will still be used) - if (this._map.markerCollection.hasMarkerLabel(markerIdKey)) { - var markerLabel = this._map.markerCollection.getMarkerLabel(markerIdKey); - markerLabel.hide(); - } - dotMarker.hasLabel = false; - - // Mark that marker has been converted to dot marker - dotMarker.showAsMarker = false; - } -}; - -/** - * Get dot marker icon - * @param {object} packet - * @return {object} - */ -trackdirect.MarkerCreator.prototype._getDotMarkerIcon = function (packet) { - var colorId = trackdirect.services.stationColorCalculator.getColorId(packet); - if (typeof google === "object" && typeof google.maps === "object") { - var icon = { - url: - trackdirect.settings.baseUrl + - trackdirect.settings.imagesBaseDir + - "dotColor" + - colorId + - ".png", - size: new google.maps.Size(12, 12), - origin: new google.maps.Point(0, 0), - anchor: new google.maps.Point(6, 6), - }; - } else if (typeof L === "object") { - var icon = L.icon({ - iconUrl: - trackdirect.settings.baseUrl + - trackdirect.settings.imagesBaseDir + - "dotColor" + - colorId + - ".png", - iconSize: [12, 12], - iconAnchor: [6, 6], - popupAnchor: [-3, -12], - }); - } - return icon; -}; - -/** - * Remove existing related marker origin dashed polyline if it should no longer be used - * @param {object} prevMarker - * @param {int} newMarkerIdKey - */ -trackdirect.MarkerCreator.prototype._removeExistingRelatedMarkerOriginDashedPolyLine = - function (prevMarker, newMarkerIdKey) { - // We only connect confirmed and moving previous markers with longer length than 1 packet - if ( - typeof prevMarker._relatedMarkerOriginDashedPolyLine !== "undefined" && - prevMarker._relatedMarkerOriginDashedPolyLine !== null - ) { - // - // Check if it should be overwritten! - // (If this marker allready has a related-origin-dashed-polyline and the owner marker is alone we exclude it from path) - // - var ownerMarkerIdKey = - prevMarker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey; - var ownerMarker = this._map.markerCollection.getMarker(ownerMarkerIdKey); - var isConfirmedMapId = true; - if ( - ownerMarker !== null && - ownerMarker.packet.map_id != 1 && - ownerMarker.packet.map_id != 2 && - ownerMarker.packet.map_id != 12 - ) { - isConfirmedMapId = false; - } - - if ( - ownerMarkerIdKey != newMarkerIdKey && - (!isConfirmedMapId || - !this._map.markerCollection.hasDotMarkers(ownerMarkerIdKey)) && - ownerMarker.showAsMarker - ) { - // overwrite it! - this._map.markerCollection.resetMarkerDashedPolyline( - prevMarker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey - ); - prevMarker._relatedMarkerOriginDashedPolyLine.hide(); - prevMarker._relatedMarkerOriginDashedPolyLine = null; - } - } - }; - -/** - * Create related marker origin dashed polyline if possible - * @param {object} prevMarker - * @param {object} packet - * @param {int} newMarkerIdKey - */ -trackdirect.MarkerCreator.prototype._createMarkerOriginDashedPolyLine = - function (prevMarker, packet, newMarkerIdKey) { - if ( - this._map.state.getClientTimestamp(prevMarker.packet.timestamp) <= - this._map.state.getOldestAllowedPacketTimestamp() - ) { - // previous marker is to old, no need to connect them - return; - } - - if ( - typeof prevMarker._relatedMarkerOriginDashedPolyLine === "undefined" || - prevMarker._relatedMarkerOriginDashedPolyLine === null - ) { - var color = trackdirect.services.stationColorCalculator.getColor(packet); - var newDashedPolyline = new trackdirect.models.DashedTailPolyline( - color, - this._map - ); - newDashedPolyline.setMarkerIdKey(newMarkerIdKey); // Add alias for owner - newDashedPolyline.setRelatedMarkerIdKey(prevMarker.markerIdKey); - newDashedPolyline.addPacket(prevMarker.packet); - newDashedPolyline.addPacket(packet); - - this._map.markerCollection.setMarkerDashedPolyline( - newMarkerIdKey, - newDashedPolyline - ); - prevMarker._relatedMarkerOriginDashedPolyLine = newDashedPolyline; - - this._map.addMarkerToMapSectorInterval( - newMarkerIdKey, - prevMarker.packet.getLatLngLiteral(), - packet.getLatLngLiteral() - ); - } - }; - -/** - * Looks for lost markers and converts them to ghost markers - * @param {object} newPacket - */ -trackdirect.MarkerCreator.prototype._convertLostMarkersToGhost = function ( - newPacket -) { - // Look for lost markers if this is a confirmed and moving marker - if ( - newPacket.packet_order_id != 2 && - newPacket.hasConfirmedMapId() && - newPacket.is_moving == 1 && - this._map.markerCollection.isPacketReplacingMarker(newPacket) == false - ) { - if (this._map.markerCollection.hasNonRelatedMovingMarkerId(newPacket)) { - // Loop over all markers for this station - list = this._map.markerCollection.getStationMarkerIdKeys( - newPacket.station_id - ); - for (var markerIdKey in list) { - var newMarkerIdKey = this._map.markerCollection.getMarkerIdKey( - newPacket.marker_id - ); - var marker = this._map.markerCollection.getMarker(markerIdKey); - if ( - marker !== null && - markerIdKey !== newMarkerIdKey && - marker.packet.is_moving == 1 && - marker.packet.timestamp <= newPacket.timestamp && - marker.packet.hasConfirmedMapId() && - marker.isSingleMovingMarker() - ) { - // This marker is considered lost - // This is the CLIENT PART of the adaptive speed filter - // If we have a confirmed previous marker but it has no dot-markers, we convert it to a ghost marker - - // If marker has a dashed polyline (it is a origin of another marker), that dashed polyline should be removed - // Actually this should not happen (or it may happen for OBJECTS) - if (this._map.markerCollection.hasRelatedDashedPolyline(marker)) { - masterMarkerIdKey = - this._map.markerCollection.getMarkerMasterMarkerKeyId( - markerIdKey - ); - if ( - masterMarkerIdKey !== markerIdKey && - this._map.markerCollection.isExistingMarker(masterMarkerIdKey) !== - null - ) { - // Another packet is connected to this one with a dashed polyline, this marker is probably an OBJECT sent by several senders - continue; - } else { - // This on the other hand should never happen... - // but if it does the dashed polyline should be removed - this._map.markerCollection.resetMarkerDashedPolyline( - marker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey - ); - marker._relatedMarkerOriginDashedPolyLine.hide(); - marker._relatedMarkerOriginDashedPolyLine = null; - } - } - - marker.packet.map_id = 9; // Abnormal position (not releted to any previous or any newer positions) - marker.setOpacity(0.5); - marker.hasLabel = false; - marker.hideLabel(); - marker.stopDirectionPolyline(); - - if (!this._map.state.isGhostMarkersVisible) { - marker.hide(); - } - } - } - } - } -}; - -/** - * Get the latest markerIdKey to connect new marker to, regular polyline if possible, otherwise dashed polyline - * @param {object} newPacket - * @param {int} newMarkerIdKey - * @return {int} - */ -trackdirect.MarkerCreator.prototype._getLatestStationMarkerToConnectTo = - function (newPacket, newMarkerIdKey) { - if ( - this._map.markerCollection.getStationLatestMovingMarkerIdKey( - newPacket.station_id - ) === newMarkerIdKey - ) { - // This markerId is known and is the latest, just go on and use it - return newMarkerIdKey; - } - - var latestPrevMarkerIdKey = null; - var latestPrevMarkerIdKeyTimestamp = null; - // Loop over all markers for this station - - var list = this._map.markerCollection.getStationMarkerIdKeys( - newPacket.station_id - ); - for (var markerIdKey in list) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - if (markerIdKey === newMarkerIdKey) { - return markerIdKey; - } else if ( - marker.packet.hasConfirmedMapId() && - marker.packet.is_moving == 1 && - marker.overwrite !== true && - marker.isSingleMovingMarker() == false && - (latestPrevMarkerIdKeyTimestamp === null || - latestPrevMarkerIdKeyTimestamp < marker.packet.timestamp) - ) { - // We exclude single packet markers from the same station since they will allways be converted to ghost-markers by server when found - // (This is not allways true when we speak about objects with different stations) - latestPrevMarkerIdKey = markerIdKey; - latestPrevMarkerIdKeyTimestamp = marker.packet.timestamp; - } - } - } - return latestPrevMarkerIdKey; - }; - -/** - * Convert all stations previous markers to dot markers since a new packet has been received - * @param {object} newPacket - */ -trackdirect.MarkerCreator.prototype._connectToPreviousMarker = function ( - newPacket -) { - var newMarkerIdKey = this._map.markerCollection.getMarkerIdKey( - newPacket.marker_id - ); - // Create dot-marker for old position (is needed even if marker is new since same station may have other markers) - if ( - newPacket.packet_order_id != 2 && - newPacket.is_moving == 1 && - this._map.markerCollection.isPacketReplacingMarker(newPacket) == false - ) { - var latestPrevMarkerIdKey = this._getLatestStationMarkerToConnectTo( - newPacket, - newMarkerIdKey - ); - var latestPrevMarker = this._map.markerCollection.getMarker( - latestPrevMarkerIdKey - ); - if (latestPrevMarker !== null) { - // Since we will add a new packet for this station any direction polylines should be stopped - if (newPacket.hasConfirmedMapId()) { - latestPrevMarker.stopDirectionPolyline(); - } - - if (latestPrevMarkerIdKey == newMarkerIdKey) { - if ( - this._map.markerCollection.hasDashedPolyline(latestPrevMarkerIdKey) && - newPacket.hasConfirmedMapId() - ) { - // If previous marker is connected to a prev marker by a origin dashed polyline, - // we need to convert that marker to a dot-marker also (this happens when the prev marker is a mapId 7) - // We don't do this until our new markerId gets a packet with mapId 1 (some never get it and will be abandoned) - var dashedPolyline = - this._map.markerCollection.getMarkerDashedPolyline( - latestPrevMarkerIdKey - ); - var latestPrevRelatedMarkerIdKey = dashedPolyline.relatedMarkerIdKey; - this._convertToDotMarker(latestPrevRelatedMarkerIdKey, newPacket); - } - - // We can use the new packet here since it will only be used to get the correct color - this._convertToDotMarker(latestPrevMarkerIdKey, newPacket); - } else { - // Connect it with previous polyline with a dashed polyline - // Remember that we should create a origin dashed polyline even if new packet has mapId 7 since it may be converted to 1 later - // If it wont't be converted to a mapId 1 the origin dashed polyline will be removed when next packet with mapId 1 or is received for this station - this._removeExistingRelatedMarkerOriginDashedPolyLine( - latestPrevMarker, - newMarkerIdKey - ); - this._createMarkerOriginDashedPolyLine( - latestPrevMarker, - newPacket, - newMarkerIdKey - ); - - if (newPacket.hasConfirmedMapId()) { - // We only convert previous packet to a dot-marker if this marker has mapId 1 (or equal) - // We can use the new packet here since it will only be used to get the correct color - this._convertToDotMarker(latestPrevMarkerIdKey, newPacket); - } - } - } - } -}; - -/** - * Create label for marker - * @param {trackdirect.models.Marker} marker - */ -trackdirect.MarkerCreator.prototype._createMarkerLabel = function (marker) { - var position = marker.packet.getLatLngLiteral(); - - if (this._map.markerCollection.hasMarkerLabel(marker.markerIdKey)) { - // Just move existing label - this._map.markerCollection.setMarkerLabelPosition( - marker.markerIdKey, - position - ); - } else if (marker.packet.packet_order_id == 1) { - if (marker.packet.getOgnRegistration() != null) { - labelText = marker.packet.getOgnRegistration(); - if (marker.packet.getOgnCN() !== null) { - labelText += " [" + marker.packet.getOgnCN() + "]"; - } - } else { - if (marker.packet.station_name == marker.packet.sender_name) { - labelText = escapeHtml(marker.packet.station_name); - } else { - labelText = - escapeHtml(marker.packet.station_name) + - ' <span style="font-weight: normal;">(' + - escapeHtml(marker.packet.sender_name) + - ")</span>"; - } - - // Add operator in comment to label - if (marker.packet.comment) { - var opIndex = marker.packet.comment.indexOf("OP:"); - if (opIndex > -1) { - opStr = marker.packet.comment.substring(opIndex + 3).replace(/^\s+/, "") + " "; - opStr = opStr.substring(0, opStr.indexOf(" ")); - if (opStr.length <= 10 && opStr.length > 0) { - labelText += - ' <span style="font-weight: normal;">[' + - escapeHtml(opStr) + - "]</span>"; - } - } - } - } - - var markerLabel = new trackdirect.models.Label( - { - position: position, - text: labelText, - }, - this._map - ); - this._map.markerCollection.setMarkerLabel(marker.markerIdKey, markerLabel); - } -}; - -/** - * Extend marker tail polyline with another position - * @param {trackdirect.models.Marker} prevmarker - * @param {trackdirect.models.Marker} newmarker - */ -trackdirect.MarkerCreator.prototype._extendTail = function ( - prevmarker, - newmarker -) { - if ( - this._map.state.getClientTimestamp(newmarker.packet.timestamp) <= - this._map.state.getOldestAllowedPacketTimestamp() - ) { - // received packet is allready to old... - return; - } - - if (this._map.markerCollection.hasPolyline(newmarker.markerIdKey)) { - var polyline = this._map.markerCollection.getMarkerPolyline( - newmarker.markerIdKey - ); - polyline.addMarker(newmarker); - } else { - if ( - this._map.state.getClientTimestamp( - this._map.markerCollection.getMarker(newmarker.markerIdKey).packet.timestamp - ) <= this._map.state.getOldestAllowedPacketTimestamp() - ) { - // previous marker is to old, no need to connect them - return; - } else { - var color = trackdirect.services.stationColorCalculator.getColor( - newmarker.packet - ); - var newTailPolyline = new trackdirect.models.TailPolyline( - color, - this._map - ); - newTailPolyline.setMarkerIdKey(newmarker.markerIdKey); - newTailPolyline.addMarker(prevmarker); - newTailPolyline.addMarker(newmarker); - this._map.markerCollection.setMarkerPolyline( - newmarker.markerIdKey, - newTailPolyline - ); - } - } -}; - -/** - * Replace latest marker in marker tail polyline - * @param {int} markerIdKey - */ -trackdirect.MarkerCreator.prototype._replaceTailMarker = function ( - markerIdKey -) { - if (this._map.markerCollection.hasPolyline(markerIdKey)) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - var polylines = this._map.markerCollection.getMarkerPolyline(markerIdKey); - var latestIndex = polylines.getPath().length - 1; - if (latestIndex >= 0) { - polylines.getPathItem(latestIndex).marker = marker; - } - } -}; - -/** - * Return true if packet is bad (if it should not be added to map) - * @param {trackdirect.models.Packet} markerCollection - * @return {boolean} - */ -trackdirect.MarkerCreator.prototype.isBadPacket = function (packet) { - if ( - typeof packet.latitude === "undefined" || - typeof packet.longitude === "undefined" || - packet.marker_id == null - ) { - return true; - } - var markerIdKey = this._map.markerCollection.getMarkerIdKey(packet.marker_id); - if (this._map.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this._map.markerCollection.getMarker(markerIdKey); - if ( - packet.packet_order_id == 1 && - this._currentPacketSequenceStationId == packet.station_id - ) { - // This is the last packet in an ongoing serie, do not mark this packet as bad - return false; - } - if (packet.db == 0) { - if (this._map.markerCollection.isDuplicate(packet)) { - return true; // We think this is a duplicate - } - } - if ( - packet.db == 1 && - marker.packet.db == 1 && - marker.packet.source === 0 && - packet.id === marker.packet.id - ) { - // For some reason we got the same packet again, duplicate! - // (this may happen when filtering on a station with only non confirmed packets) - return true; - } - - if (marker.overwrite == true && packet.overwrite == 0) { - return false; - } else { - if (marker.packet.timestamp >= packet.timestamp) { - // It's important that we do not allow two packets with the same timestamp since they may be the same packet, which can cause wierd problems - return true; - } - - if ( - marker.packet.reported_timestamp !== null && - packet.reported_timestamp !== null && - Math.abs(marker.packet.reported_timestamp - packet.reported_timestamp) < 600 - ) { - if (marker.packet.reported_timestamp > packet.reported_timestamp) { - return true; - } - } - } - } - - if (packet.is_moving == 1) { - var list = this._map.markerCollection.getStationMarkerIdKeys( - packet.station_id - ); - for (var relatedMarkerIdKey in list) { - var relatedMarker = - this._map.markerCollection.getMarker(relatedMarkerIdKey); - // Do not add packet to map if other packet with earlier timestamp exists - if ( - relatedMarker !== null && - relatedMarker.overwrite == false && - relatedMarker.packet.timestamp > packet.timestamp - ) { - return true; - } - } - } - - return false; -}; diff --git a/jslib/src/trackdirect/Websocket.js b/jslib/src/trackdirect/Websocket.js deleted file mode 100755 index 40bdb5edfff15530048ff1208f65181d9b078915..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/Websocket.js +++ /dev/null @@ -1,464 +0,0 @@ -/** - * Class trackdirect.Websocket - * @param {string} wsServerUrl - */ -trackdirect.Websocket = function (wsServerUrl) { - this._wsServerUrl = wsServerUrl; - this._init(); - - this._state = this.State.CONNECTING; - this._emitEventListeners("state-change"); - - // Call the parent constructor - this._instance = new WebSocket(this._wsServerUrl); - - var me = this; - this._instance.onopen = function (evt) { - me._onOpen(evt); - }; - this._instance.onclose = function (evt) { - me._onClose(evt); - }; - this._instance.onmessage = function (evt) { - me._onMessage(evt); - }; - this._instance.onerror = function (evt) { - me._onError(evt); - }; -}; - -/** - * Init object - */ -trackdirect.Websocket.prototype._init = function () { - this._instance = null; - this._eventListeners = {}; - this._lastSentPositionRequest = ""; - this._state = 0; - this._lastMessageTimestamp = null; - this._queue = []; - this._running = false; - this._sendPositionRequestIntervalId = null; - - this.State = { - CONNECTING: 0, // Not connected! - CONNECTED: 1, - CLOSING: 2, // Not connected! - CLOSED: 3, // Not connected! - ERROR: 4, // Not connected! - LOADING: 5, // Loading history from database - LOADING_DONE: 6, - LISTENING_APRSIS: 7, // Listening on APRS-IS Feed - CONNECTING_APRSIS: 8, - IDLE: 9, - INACTIVE: 10, - }; -}; - -/** - * Send data - * @param {string} data - */ -trackdirect.Websocket.prototype.send = function (data) { - this._instance.send(data); -}; - -/** - * Close websocket connection - */ -trackdirect.Websocket.prototype.close = function () { - this._instance.close(); -}; - -/** - * Get current state of websocket connection - * @return {int} - */ -trackdirect.Websocket.prototype.getState = function () { - return this._state; -}; - -/** - * Clear the last sent filter cache - */ -trackdirect.Websocket.prototype.clearLastSentPositionRequest = function () { - this._lastSentPositionRequest = ""; -}; - -/** - * Clear the last sent filter cache - */ -trackdirect.Websocket.prototype.isPositionRequestSent = function () { - if (this._lastSentPositionRequest != "") { - return true; - } else { - return false; - } -}; - -/** - * Send new filter request - * @param {array} list - * @param {int} historyMinutes - * @return {boolean} - */ -trackdirect.Websocket.prototype.doSendFilterRequest = function ( - list, - historyMinutes, - referenceTime -) { - var request = {}; - request.payload_request_type = 4; - request.list = list; - request.minutes = historyMinutes; - if (referenceTime != "") { - request.time = parseInt(referenceTime, 10); - } else { - request.time = null; - } - return this._addToSendQueue(request); -}; - -/** - * Send new filter request by names - * @param {array} list - * @param {int} historyMinutes - * @return {boolean} - */ -trackdirect.Websocket.prototype.doSendFilterRequestByName = function ( - namelist, - historyMinutes, - referenceTime -) { - var request = {}; - request.payload_request_type = 8; - request.namelist = namelist; - request.minutes = historyMinutes; - if (referenceTime != "") { - request.time = parseInt(referenceTime, 10); - } else { - request.time = null; - } - return this._addToSendQueue(request); -}; - -/** - * Send station request - * @param {int} stationId - * @param {int} historyMinutes - * @param {string} referenceTime - * @return {boolean} - */ -trackdirect.Websocket.prototype.doSendCompleteStationRequest = function ( - stationId, - historyMinutes, - referenceTime -) { - var request = {}; - request.payload_request_type = 7; - request.station_id = stationId; - request.minutes = historyMinutes; - if (referenceTime != "") { - request.time = parseInt(referenceTime, 10); - } else { - request.time = null; - } - return this._addToSendQueue(request); -}; - -/** - * Send new stop filter request - * @param {int} stationId - * @return {boolean} - */ -trackdirect.Websocket.prototype.doSendStopFilterRequest = function (stationId) { - var request = {}; - request.payload_request_type = 6; - request.station_id = stationId; - return this._addToSendQueue(request); -}; - -/** - * Send new position request - * @param {float} neLat - * @param {float} neLng - * @param {float} swLat - * @param {float} swLng - * @param {int} historyMinutes - * @param {string} referenceTime - * @param {boolean} onlyRequestLatestPacket - * @return {boolean} - */ -trackdirect.Websocket.prototype.doSendNewPositionRequest = function ( - neLat, - neLng, - swLat, - swLng, - historyMinutes, - referenceTime, - onlyRequestLatestPacket -) { - var request = {}; - request.payload_request_type = 1; - request.neLat = neLat; - request.neLng = neLng; - request.swLat = swLat; - request.swLng = swLng; - request.minutes = historyMinutes; - if (referenceTime != "") { - request.time = parseInt(referenceTime, 10); - } else { - request.time = null; - } - - - if (onlyRequestLatestPacket) { - request.onlyLatestPacket = 1; - } else { - request.onlyLatestPacket = 0; - } - - var requestStr = JSON.stringify(request); - if (requestStr != this._lastSentPositionRequest) { - this._lastSentPositionRequest = requestStr; - - if (this._sendPositionRequestIntervalId !== null) { - clearInterval(this._sendPositionRequestIntervalId); - } - - if (this._addToSendQueue(request)) { - var me = this; - this._sendPositionRequestIntervalId = window.setInterval(function () { - // Real-time update functionality may discard packets during high load, - // so it is good to send an extra update request now and then - request.payload_request_type = 11; - if (me._lastSentPositionRequest == requestStr) { - me._addToSendQueue(request); - } - }, 60 * 1000); - return true; - } - return false; - } else { - // No need to send this request... - return true; - } -}; - -/** - * Add new event listener - * @param {string} event - * @param {string} handler - */ -trackdirect.Websocket.prototype.addListener = function (event, handler) { - if (!(event in this._eventListeners)) { - this._eventListeners[event] = []; - } - this._eventListeners[event].push(handler); -}; - -/** - * On open - * @param {string} evt - */ -trackdirect.Websocket.prototype._onOpen = function (evt) { - // We still consider this to be "connecting", first when server says it ready we consider us connected - this._state = this.State.CONNECTING; - this._emitEventListeners("state-change"); -}; - -/** - * On close - * @param {string} evt - */ -trackdirect.Websocket.prototype._onClose = function (evt) { - this._state = this.State.CLOSED; - this._emitEventListeners("state-change"); -}; - -/** - * On error - * @param {string} evt - */ -trackdirect.Websocket.prototype._onError = function (evt) { - this._state = this.State.ERROR; - this._emitEventListeners("state-change"); -}; - -/** - * On message - * @param {string} evt - */ -trackdirect.Websocket.prototype._onMessage = function (evt) { - this._lastMessageTimestamp = Math.floor(Date.now() / 1000); - - // We skip try-catch since it affects performance - var packet = JSON.parse(evt.data); - - // Add to queue to make sure packets are handled in order - trackdirect.services.callbackExecutor.add(this, this._handleMessage, [ - packet, - ]); -}; - -/** - * Handle message - * @param {object} packet - */ -trackdirect.Websocket.prototype._handleMessage = function (packet) { - switch (packet.payload_response_type) { - case 1: - this._emitEventListeners("aprs-packet", packet.data); - this._emitEventListeners("aprs-packet-payload-done"); - break; - - case 2: - for ( - i = 0; - typeof packet.data !== "undefined" && i < packet.data.length; - i++ - ) { - this._emitEventListeners("aprs-packet", packet.data[i]); - } - this._emitEventListeners("aprs-packet-payload-done"); - break; - - case 5: - this._emitEventListeners("filter-response", packet.data); - this._emitEventListeners("aprs-packet-payload-done"); - break; - - case 41: - this._emitEventListeners("server-timestamp-response", packet.data); - break; - - case 31: - this._state = this.State.LISTENING_APRSIS; - this._emitEventListeners("state-change"); - break; - - case 32: - this._state = this.State.LOADING; - this._emitEventListeners("state-change"); - break; - - case 33: - this._state = this.State.IDLE; - this._emitEventListeners("state-change"); - break; - - case 34: - this._state = this.State.CONNECTING_APRSIS; - this._emitEventListeners("state-change"); - break; - - case 35: - this._state = this.State.LOADING_DONE; - this._emitEventListeners("state-change"); - break; - - case 36: - this._state = this.State.INACTIVE; - this._emitEventListeners("state-change"); - this.clearLastSentPositionRequest(); - break; - - case 40: - this._emitEventListeners("reset"); - break; - - case 42: - this.clearLastSentPositionRequest(); - this._state = this.State.CONNECTED; - this._emitEventListeners("state-change"); - break; - } - - return true; -}; - -/** - * Add object to send queue - * @param {object} request - * @return {boolean} - */ -trackdirect.Websocket.prototype._addToSendQueue = function (request) { - if (this.readyState > 1) { - return false; - } - - var currentTs = Math.floor(Date.now() / 1000); - if ( - this._lastMessageTimestamp !== null && - this._lastMessageTimestamp < currentTs - 60 - ) { - // We havn't heard anything from server in 60s, server should send a message every 10s, - // we better close the connection and force user of this class to reconnect - this.close(); // This should trigger the onClose event which should reset the map - return false; - } - - var me = this; - this._queue.push(function () { - var data = JSON.stringify(request); - if (data != null) { - me.send(data); - } - me._dequeue(); - }); - this._start(); - return true; -}; - -/** - * Start the execution - */ -trackdirect.Websocket.prototype._start = function () { - if (!this._running) { - this._dequeue(); - } -}; - -/** - * Execute the first call in queue - * @return {function} - */ -trackdirect.Websocket.prototype._dequeue = function () { - this._running = true; - var me = this; - setTimeout(function () { - if (me._instance.readyState === 1) { - // Open - var shift = me._queue.shift(); - if (shift) { - shift(); - } else { - me._running = false; - } - return; - } else if (me._instance.readyState > 1) { - // Closed (or closing) - me._running = false; - return; - } else { - // Probably on the way to open, just wait - me._dequeue(); - } - }, 5); // wait 5 milisecond for the connection... -}; - -/** - * Call all listeners that are listening on specified event - * @param {string} event - * @param {string} arg - */ -trackdirect.Websocket.prototype._emitEventListeners = function (event, arg) { - if ( - typeof this._eventListeners !== "undefined" && - event in this._eventListeners - ) { - for (var i = 0; i < this._eventListeners[event].length; i++) { - this._eventListeners[event][i](arg); - } - } -}; diff --git a/jslib/src/trackdirect/models/DashedTailPolyline.js b/jslib/src/trackdirect/models/DashedTailPolyline.js deleted file mode 100755 index 7e90e24714787931259d4bb5667323d75e1451d6..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/DashedTailPolyline.js +++ /dev/null @@ -1,264 +0,0 @@ -/** - * Class trackdirect.models.DashedTailPolyline - * @see https://developers.google.com/maps/documentation/javascript/reference#Polyline - * @param {string} color - * @param {trackdirect.models.Map} map - */ -trackdirect.models.DashedTailPolyline = function (color, map) { - this._defaultMap = map; - this.markerIdKey = null; - this.ownerMarkerIdKey = null; - this.relatedMarkerIdKey = null; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Polyline.call(this, this._getGooglePolylineOptions(color)); - } else if (typeof L === "object") { - L.Polyline.call(this, {}, this._getLeafletPolylineOptions(color)); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.DashedTailPolyline.prototype = Object.create( - google.maps.Polyline.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.DashedTailPolyline.prototype = Object.create( - L.Polyline.prototype - ); -} -trackdirect.models.DashedTailPolyline.prototype.constructor = - trackdirect.models.DashedTailPolyline; - -/** - * Get latLng object by index - */ -trackdirect.models.DashedTailPolyline.prototype.getPathItem = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - return path.getAt(index); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - if (typeof list[index] !== "undefined") { - return list[index]; - } else { - return null; - } - } - return null; -}; - -/** - * Push latLng object to path - */ -trackdirect.models.DashedTailPolyline.prototype.pushPathItem = function ( - latLng -) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - path.push(latLng); - } else if (typeof L === "object") { - this.addLatLng(latLng); - } -}; - -/** - * Remove latLng object by index - */ -trackdirect.models.DashedTailPolyline.prototype.removePathItem = function ( - index -) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - path.removeAt(index); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - if (typeof list[index] !== "undefined") { - list.splice(index, 1); - this.setLatLngs(list); - } - } -}; - -/** - * Get Path length - */ -trackdirect.models.DashedTailPolyline.prototype.getPathLength = function ( - index -) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - return path.getLength(); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - return list.length; - } -}; - -/** - * Get latLng array - */ -trackdirect.models.DashedTailPolyline.prototype.getPath = function () { - if (typeof google === "object" && typeof google.maps === "object") { - return google.maps.Polyline.prototype.getPath.call(this).getArray(); - } else if (typeof L === "object") { - return this.getLatLngs(); - } - return []; -}; - -/** - * Get Polyline currently active Map - * @return {google.maps.Map} - */ -trackdirect.models.DashedTailPolyline.prototype.getMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var map = google.maps.Polyline.prototype.getMap.call(this); - if (typeof map !== "undefined") { - return map; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return this._defaultMap; - } - } - return null; -}; - -/** - * Set markerIdKey - * @param {int} markerIdKey - */ -trackdirect.models.DashedTailPolyline.prototype.setMarkerIdKey = function ( - markerIdKey -) { - // Two names for the same thing... - this.markerIdKey = markerIdKey; - this.ownerMarkerIdKey = markerIdKey; - this._addInfoWindowListener(markerIdKey); -}; - -/** - * Set related markerIdKey - * @param {int} markerIdKey - */ -trackdirect.models.DashedTailPolyline.prototype.setRelatedMarkerIdKey = - function (markerIdKey) { - this.relatedMarkerIdKey = markerIdKey; - }; - -/** - * Show polyline on default map - */ -trackdirect.models.DashedTailPolyline.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } -}; - -/** - * Hide polyline - */ -trackdirect.models.DashedTailPolyline.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - } -}; - -/** - * Add packet to polyline - * @param {trackdirect.models.Packet} packet - */ -trackdirect.models.DashedTailPolyline.prototype.addPacket = function (packet) { - if (typeof google === "object" && typeof google.maps === "object") { - var latLng = new google.maps.LatLng( - parseFloat(packet.latitude), - parseFloat(packet.longitude) - ); - this.pushPathItem(latLng); - } else if (typeof L === "object") { - var latLng = new L.latLng( - parseFloat(packet.latitude), - parseFloat(packet.longitude) - ); - this.addLatLng(latLng); - } -}; - -/** - * Add infowindow listener - * @param {int} markerIdKey - */ -trackdirect.models.DashedTailPolyline.prototype._addInfoWindowListener = - function (markerIdKey) { - var me = this; - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.event.addListener(this, "click", function (event) { - var marker = me._defaultMap.markerCollection.getMarker(markerIdKey); - me._defaultMap.openPolylineInfoWindow(marker, event.latLng); - }); - } else if (typeof L === "object") { - this.on("click", function (event) { - var marker = me._defaultMap.markerCollection.getMarker(markerIdKey); - me._defaultMap.openPolylineInfoWindow(marker, event.latlng); - }); - } - }; - -/** - * Get a suitable google polyline options object - * @param {string} color - * @return {object} - */ -trackdirect.models.DashedTailPolyline.prototype._getGooglePolylineOptions = - function (color) { - var lineSymbol = { - path: "M 0,-1 0,1", - strokeOpacity: 0.4, - scale: 3, - }; - - var options = { - geodesic: false, - strokeOpacity: 0, - strokeColor: color, - icons: [ - { - icon: lineSymbol, - offset: "20px", - repeat: "15px", - }, - ], - map: null, - zIndex: 100, - }; - - return options; - }; - -/** - * Get a suitable leaflet polyline options object - * @param {string} color - * @return {object} - */ -trackdirect.models.DashedTailPolyline.prototype._getLeafletPolylineOptions = - function (color) { - return { - opacity: 0.6, - weight: 3, - dashArray: "6,8", - lineJoin: "round", - color: color, - }; - }; diff --git a/jslib/src/trackdirect/models/DirectionPolyline.js b/jslib/src/trackdirect/models/DirectionPolyline.js deleted file mode 100755 index fb2af923ccb9391f9115d8e213c29bda99f6f484..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/DirectionPolyline.js +++ /dev/null @@ -1,245 +0,0 @@ -/** - * Class trackdirect.models.DirectionPolyline - * @see https://developers.google.com/maps/documentation/javascript/reference#Polyline - * @param {trackdirect.models.Marker} marker - * @param {trackdirect.models.Map} map - */ -trackdirect.models.DirectionPolyline = function (marker, map) { - this._marker = marker; - this._defaultMap = map; - - this.startTimestamp = this._marker.packet.timestamp; - this.speed = this._marker.packet.speed; - this.course = this._marker.packet.course; - this.stopped = false; - this.timerId = null; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Polyline.call(this, this._getGooglePolylineOptions()); - } else if (typeof L === "object") { - L.Polyline.call(this, {}, this._getLeafletPolylineOptions()); - this.setLatLngs([ - this._getFirstCoordinate(), - this._getExpectedCoordinate(), - ]); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.DirectionPolyline.prototype = Object.create( - google.maps.Polyline.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.DirectionPolyline.prototype = Object.create( - L.Polyline.prototype - ); -} -trackdirect.models.DirectionPolyline.prototype.constructor = - trackdirect.models.DirectionPolyline; - -/** - * Set new path - */ -trackdirect.models.DirectionPolyline.prototype.setPathItems = function ( - pathItems -) { - if (typeof google === "object" && typeof google.maps === "object") { - this.setPath(pathItems); - } else if (typeof L === "object") { - this.setLatLngs(pathItems); - } -}; - -/** - * Get Polyline currently active Map - * @return {google.maps.Map} - */ -trackdirect.models.DirectionPolyline.prototype.getMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var map = google.maps.Polyline.prototype.getMap.call(this); - if (typeof map !== "undefined") { - return map; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return this._defaultMap; - } - } - return null; -}; - -/** - * Show polyline on default map - */ -trackdirect.models.DirectionPolyline.prototype.show = function () { - var timeInSeconds = this._getAgeInSeconds(); - - if ( - this.stopped === false && - timeInSeconds <= 900 && - this._marker.packet.hasConfirmedMapId() && - (this._defaultMap.state.isFilterMode || - this._defaultMap.getZoom() >= trackdirect.settings.minZoomForMarkerTail) - ) { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } - - this.recalculate(); - } -}; - -/** - * Hide polyline - */ -trackdirect.models.DirectionPolyline.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - } -}; - -/** - * Stop it and hide it - */ -trackdirect.models.DirectionPolyline.prototype.stop = function () { - this.stopped = true; - this.hide(); -}; - -/** - * Get a suitable google polyline options object - * @return {object} - */ -trackdirect.models.DirectionPolyline.prototype._getGooglePolylineOptions = - function () { - var lineCoordinates = [ - this._getFirstCoordinate(), - this._getExpectedCoordinate(), - ]; - - var lineSymbol = { - path: google.maps.SymbolPath.FORWARD_OPEN_ARROW, - strokeOpacity: 1, - scale: 0.65, - }; - - var options = { - path: lineCoordinates, - strokeOpacity: 0, - strokeColor: trackdirect.services.stationColorCalculator.getColor( - this._marker.packet - ), - map: null, - icons: [ - { - icon: lineSymbol, - offset: "0px", - repeat: "8px", - }, - ], - }; - return options; - }; - -/** - * Get a suitable leaflet polyline options object - * @return {object} - */ -trackdirect.models.DirectionPolyline.prototype._getLeafletPolylineOptions = - function () { - return { - color: trackdirect.services.stationColorCalculator.getColor( - this._marker.packet - ), - weight: 4, - opacity: 0.7, - - dashArray: "2,8", - lineJoin: "round", - }; - }; - -/** - * Returns coordinates for the transmit polyline - * @return {array} - */ -trackdirect.models.DirectionPolyline.prototype._getFirstCoordinate = - function () { - return this._marker.packet.getLatLngLiteral(); - }; - -/** - * Returns coordinates for the transmit polyline - * @return {array} - */ -trackdirect.models.DirectionPolyline.prototype._getExpectedCoordinate = - function () { - var timeInSeconds = this._getAgeInSeconds(); - var distance = (this.speed / 3.6) * timeInSeconds; - var startPosition = this._getFirstCoordinate(); - if (startPosition != null) { - return trackdirect.services.distanceCalculator.getPositionByDistance( - startPosition, - this.course, - distance - ); - } - return null; - }; - -/** - * Animate direction polyline - */ -trackdirect.models.DirectionPolyline.prototype.recalculate = function () { - var interval = 1000; - var me = this; - this.timerId = window.setInterval(function () { - if (!me._marker.isVisible() || me.stopped || !me._marker.showAsMarker) { - me.hide(); - clearInterval(me.timerId); - return; - } - var timeInSeconds = me._getAgeInSeconds(); - if (timeInSeconds > 900) { - // After 15 minutes we stop drawing directionPolyline - me.stop(); - if (me.timerId !== null) { - clearInterval(me.timerId); - } - } else { - var firstPosition = me._getFirstCoordinate(); - var newPosition = me._getExpectedCoordinate(); - if (firstPosition != null && newPosition != null) { - me.setPathItems([firstPosition, newPosition]); - } - } - }, interval); -}; - -/** - * Returnes the marker age in seconds - */ -trackdirect.models.DirectionPolyline.prototype._getAgeInSeconds = function () { - var timeInSeconds = 0; - var startTimestamp = this._defaultMap.state.getClientTimestamp( - this.startTimestamp - ); - - if (startTimestamp < Date.now() / 1000) { - timeInSeconds = Date.now() / 1000 - startTimestamp; - } - - return timeInSeconds; -}; diff --git a/jslib/src/trackdirect/models/HeatMap.js b/jslib/src/trackdirect/models/HeatMap.js deleted file mode 100755 index 25d7c5373a2b1a2db88651308b96f0ab5e8ad226..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/HeatMap.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Class trackdirect.models.HeatMap - * @see https://developers.google.com/maps/documentation/javascript/reference#ImageMapType - * @param {trackdirect.models.Map} map - */ -trackdirect.models.HeatMap = function (map) { - this._defaultMap = map; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.ImageMapType.call(this, this._getGoogleMapOptions()); - } else if (typeof L === "object") { - L.TileLayer.call(this, this._getUrlTemplate(), this._getLeafletOptions()); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.HeatMap.prototype = Object.create( - google.maps.ImageMapType.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.HeatMap.prototype = Object.create(L.TileLayer.prototype); -} -trackdirect.models.HeatMap.prototype.constructor = trackdirect.models.HeatMap; - -/** - * Get a suitable leaflet heatmap options object - * @return {object} - */ -trackdirect.models.HeatMap.prototype._getLeafletOptions = function () { - var options = { - errorTileUrl: trackdirect.settings.baseUrl + "/heatmaps/transparent.png", - tileSize: 256, - maxZoom: 9, - minZoom: 0, - }; - return options; -}; - -/** - * Get a suitable google heatmap options object - * @return {object} - */ -trackdirect.models.HeatMap.prototype._getGoogleMapOptions = function () { - var me = this; - var options = { - getTileUrl: function (coord, zoom) { - if (zoom > trackdirect.settings.minZoomForMarkers - 1) { - // It should be possible to return null here, but chrome tries to fetch www.website.com/null - return trackdirect.settings.baseUrl + "/heatmaps/transparent.png"; - } - - var normalizedCoord = me._getNormalizedCoord(coord, zoom); - if (!normalizedCoord) { - // It should be possible to return null here, but chrome tries to fetch www.website.com/null - return trackdirect.settings.baseUrl + "/heatmaps/transparent.png"; - } - - var xString = String(normalizedCoord.x); - var yString = String(normalizedCoord.y); - - return me - ._getUrlTemplate() - .replace("{z}", zoom) - .replace("{y}", yString) - .replace("{x}", xString); - }, - tileSize: new google.maps.Size(256, 256), - maxZoom: 9, - minZoom: 0, - radius: 1738000, - name: "APRSHEAT", - }; - return options; -}; - -/** - * Get tile url - * @return {object} - */ -trackdirect.models.HeatMap.prototype._getUrlTemplate = function () { - return ( - trackdirect.settings.baseUrl + - "/heatmaps/latest-heatmap.{z}.{y}.{x}.png?version=" + - this._getHeatMapVersion() - ); -}; - -/** - * Returns the heat map version - * (This method is just used to force update of heatmap at least once every day) - * @return String - */ -trackdirect.models.HeatMap.prototype._getHeatMapVersion = function () { - var today = new Date(); - var dd = today.getDate(); - var mm = today.getMonth() + 1; //January is 0! - var yyyy = today.getFullYear(); - var hh = today.getHours(); - - if (dd < 10) { - dd = "0" + dd; - } - - if (mm < 10) { - mm = "0" + mm; - } - - return yyyy + "-" + mm + "-" + dd + "-" + hh; -}; - -/** - * get normalized coords - * Normalizes the coords that tiles repeat across the x axis (horizontally) - * like the standard Google map tiles. - * @param {object} coord - * @param {int} zoom - * @return {object} - */ -trackdirect.models.HeatMap.prototype._getNormalizedCoord = function ( - coord, - zoom -) { - var y = coord.y; - var x = coord.x; - - // tile range in one direction range is dependent on zoom level - // 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc - var tileRange = 1 << zoom; - - // don't repeat across y-axis (vertically) - if (y < 0 || y >= tileRange) { - return null; - } - - // repeat across x-axis - if (x < 0 || x >= tileRange) { - x = ((x % tileRange) + tileRange) % tileRange; - } - - return { x: x, y: y }; -}; diff --git a/jslib/src/trackdirect/models/InfoWindow.js b/jslib/src/trackdirect/models/InfoWindow.js deleted file mode 100755 index 1ba0d47c862216642d7ec54040836bf6f6a8dd25..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/InfoWindow.js +++ /dev/null @@ -1,1757 +0,0 @@ -/** - * Class trackdirect.models.InfoWindow - * @see https://developers.google.com/maps/documentation/javascript/reference#InfoWindow - * @param {trackdirect.models.Marker} marker - * @param {trackdirect.models.Map} map - * @param {boolean} disableAutoPan - */ -trackdirect.models.InfoWindow = function (marker, map, disableAutoPan) { - disableAutoPan = - typeof disableAutoPan !== "undefined" ? disableAutoPan : true; - this._marker = marker; - this._defaultMap = map; - this._polyline = null; - this._tdEventListeners = {}; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.InfoWindow.call(this, { - disableAutoPan: disableAutoPan, - }); - } else if (typeof L === "object") { - var yOffset = 2; - if (!marker.isDotMarker()) { - yOffset = -5; - } - L.Popup.call(this, { - autoPan: !disableAutoPan, - offset: [0, yOffset], - maxWidth: 440, - className: "leaflet-infowindow-content", - }); - } - - // Handle close click - var me = this; - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.event.addListener(this, "closeclick", function () { - me._hideRelatedMarkerTail(); - }); - } else if (typeof L === "object") { - this.on("popupclose", function () { - me._hideRelatedMarkerTail(); - }); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.InfoWindow.prototype = Object.create( - google.maps.InfoWindow.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.InfoWindow.prototype = Object.create(L.Popup.prototype); -} -trackdirect.models.InfoWindow.prototype.constructor = - trackdirect.models.InfoWindow; - -/** - * set new info window marker - * @param {trackdirect.models.Marker} marker - */ -trackdirect.models.InfoWindow.prototype.setMarker = function (marker) { - this._marker = marker; -}; - -/** - * get info window marker - * @return trackdirect.models.Marker - */ -trackdirect.models.InfoWindow.prototype.getMarker = function () { - return this._marker; -}; - -/** - * get info window marker polyline - * @return trackdirect.models.Marker - */ -trackdirect.models.InfoWindow.prototype.getPolyline = function () { - return this._polyline; -}; - -/** - * Is info window open - */ -trackdirect.models.InfoWindow.prototype.isInfoWindowOpen = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - return true; - } - } else if (typeof L === "object" && typeof windyInit === "function") { - return this._defaultMap.hasLayer(this); - } else if (typeof L === "object") { - return this.isOpen(); - } - - return false; -}; - -/** - * show info window - * @param {boolean} compactVersion - * @param {LatLngLiteral} position - */ -trackdirect.models.InfoWindow.prototype.show = function ( - compactVersion, - position -) { - compactVersion = - typeof compactVersion !== "undefined" ? compactVersion : false; - position = typeof position !== "undefined" ? position : null; - this._create(compactVersion); - - if (typeof google === "object" && typeof google.maps === "object") { - if (position !== null) { - this.setPosition(position); - this.open(this._defaultMap); - } else { - this.open(this._defaultMap, this._marker); - } - - this.addListener("domready", function () { - this._addPhgLinkListeners(); - this._addRngLinkListeners(); - }); - } else if (typeof L === "object") { - if (this.isOpen()) { - this._addPhgLinkListeners(); - this._addRngLinkListeners(); - } else { - this.on("add", function () { - this._addPhgLinkListeners(); - this._addRngLinkListeners(); - }); - } - - if (position !== null) { - this.setLatLng(position); - this.openOn(this._defaultMap); - } else { - this.setLatLng(this._marker.packet.getLatLngLiteral()); - this.openOn(this._defaultMap); - } - } - - // Show tail related to station related to this info-window - if (this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkerTail) { - if (this._marker.overwrite) { - this._emitTdEventListeners( - "station-tail-needed", - this._marker.packet.station_id - ); - } - this._marker.showMarkerTail(true); - } -}; - -/** - * hide info window - */ -trackdirect.models.InfoWindow.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - this.close(); - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - this._defaultMap.removeLayer(this); - } - - this._hideRelatedMarkerTail(); - - if ( - this._defaultMap.state.openInfoWindow !== null && - this._defaultMap.state.openInfoWindow === this - ) { - this._defaultMap.state.openInfoWindow = null; - } -}; - -/** - * Add listener to events - * @param {string} event - * @param {string} handler - */ -(trackdirect.models.InfoWindow.prototype.addTdListener = function ( - event, - handler -) { - if (!(event in this._tdEventListeners)) { - this._tdEventListeners[event] = []; - } - this._tdEventListeners[event].push(handler); -}), - /** - * Emit all event listeners for a specified event - * @param {string} event - * @param {object} arg - */ - (trackdirect.models.InfoWindow.prototype._emitTdEventListeners = function ( - event, - arg - ) { - if (event in this._tdEventListeners) { - for (var i = 0; i < this._tdEventListeners[event].length; i++) { - this._tdEventListeners[event][i](arg); - } - } - }); - -/** - * Create marker info window - * @param {boolean} compactVersion - */ -trackdirect.models.InfoWindow.prototype._create = function (compactVersion) { - if (compactVersion) { - var mainDiv = this._getCompactMainDiv(); - var menuwrapper = this._getMenuDiv(false); - - this._polyline = this._defaultMap.markerCollection.getMarkerPolyline( - this._marker.markerIdKey - ); - } else { - var mainDiv = this._getMainDiv(); - if (!trackdirect.isMobile) { - mainDiv.append(this._getIconDiv()); - } - - mainDiv.append(this._getCompletePacketDiv()); - var menuwrapper = this._getMenuDiv(true); - } - - mainDiv.append(menuwrapper); - var wrapperDiv = $(document.createElement("div")); - wrapperDiv.append(mainDiv); - if (typeof google === "object" && typeof google.maps === "object") { - this.setContent(wrapperDiv.html()); - } else if (typeof L === "object") { - this.setContent(wrapperDiv.html()); - } -}; - -/** - * Hide tail for marker related to the current open info-window - */ -trackdirect.models.InfoWindow.prototype._hideRelatedMarkerTail = function () { - if (this._polyline !== null) { - if ( - !this._defaultMap.state.isFilterMode && - this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkerTail - ) { - var markerIdKey = this._polyline.markerIdKey; - if (this._defaultMap.markerCollection.isExistingMarker(markerIdKey)) { - var stationId = - this._defaultMap.markerCollection.getMarker(markerIdKey).packet - .station_id; - var stationLatestMarker = - this._defaultMap.markerCollection.getStationLatestMarker(stationId); - if (stationLatestMarker !== null) { - stationLatestMarker.hideMarkerTail(); - } - } - } - } else if (this._marker !== null) { - if ( - !this._defaultMap.state.isFilterMode && - this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkerTail - ) { - this._marker.hideMarkerTail(); - } - } -}; - -/** - * Get info window main div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMainDiv = function () { - var mainDiv = $(document.createElement("div")); - mainDiv.css("font-family", "Verdana,Arial,sans-serif"); - if (!trackdirect.isMobile) { - mainDiv.css("font-size", "11px"); - } else { - mainDiv.css("font-size", "10px"); - } - mainDiv.css("line-height", "1.42857143"); - mainDiv.css("color", "#333"); - mainDiv.css("text-align", "left"); - return mainDiv; -}; - -/** - * Get info window main div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getIconDiv = function () { - var iconUrl64 = trackdirect.services.symbolPathFinder.getFilePath( - this._marker.packet.symbol_table, - this._marker.packet.symbol, - null, - null, - null, - 64, - 64 - ); - var iconImg = $(document.createElement("img")); - iconImg.css("width", "64px"); - iconImg.css("height", "64px"); - iconImg.attr("src", iconUrl64); - iconImg.attr("alt", ""); // Set the icon description - iconImg.attr("title", ""); // Set the icon description - - var leftIconDiv = $(document.createElement("div")); - leftIconDiv.css("display", "inline-block"); - leftIconDiv.css("vertical-align", "top"); - leftIconDiv.css("padding-right", "15px"); - leftIconDiv.css("padding-bottom", "5px"); - leftIconDiv.append(iconImg); - return leftIconDiv; -}; - -/** - * Get info window packet div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getPacketDiv = function () { - var packetDiv = $(document.createElement("div")); - packetDiv.css("display", "inline-block"); - packetDiv.css("vertical-align", "top"); - packetDiv.css("max-width", "350px"); - return packetDiv; -}; - -/** - * Get info window name div icon - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getNameIconDiv = function () { - var iconUrl24 = trackdirect.services.symbolPathFinder.getFilePath( - this._marker.packet.symbol_table, - this._marker.packet.symbol, - null, - null, - null, - 24, - 24 - ); - var iconImg = $(document.createElement("img")); - iconImg.css("width", "24px"); - iconImg.css("height", "24px"); - iconImg.css("vertical-align", "middle"); - iconImg.attr("src", iconUrl24); - iconImg.attr("alt", "symbol"); - iconImg.attr("title", ""); // Set the icon description? - return iconImg; -}; - -/** - * Get info window name link element - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getNameLink = function () { - var nameLink = $(document.createElement("a")); - nameLink.css("color", "#337ab7"); - if (trackdirect.isMobile) { - nameLink.css("vertical-align", "-2px"); - } - - nameLink.attr("href", ""); - nameLink.attr( - "onclick", - "trackdirect.openStationInformationDialog(" + - this._marker.packet.station_id + - "); return false;" - ); - - nameLink.html(escapeHtml(this._marker.packet.station_name)); - return nameLink; -}; - -/** - * Get info window sender name link element - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getSenderNameLink = function () { - var nameLink = $(document.createElement("span")); - if (trackdirect.isMobile) { - nameLink.css("vertical-align", "-2px"); - } - - nameLink.html(escapeHtml(this._marker.packet.sender_name)); - return nameLink; -}; - -/** - * Get info window name div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getNameDiv = function () { - var nameDiv = $(document.createElement("div")); - nameDiv.css("clear", "both"); - nameDiv.css("font-size", "12px"); - nameDiv.css("font-weight", "bold"); - if (trackdirect.isMobile) { - nameDiv.append(this._getNameIconDiv()); - nameDiv.append(" "); - nameDiv.append(" "); - } - nameDiv.append(this._getNameLink()); - if (this._marker.packet.getOgnRegistration() != null) { - var name = escapeHtml(this._marker.packet.getOgnRegistration()); - if (this._marker.packet.getOgnCN() !== null) { - name += " [" + escapeHtml(this._marker.packet.getOgnCN()) + "]"; - } - nameDiv.append(", "); - nameDiv.append(name); - } - - if (this._marker.packet.sender_name != this._marker.packet.station_name) { - nameDiv.append(" ("); - nameDiv.append(this._getSenderNameLink()); - nameDiv.append(")"); - } - return nameDiv; -}; - -/** - * Get info window packet div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getCompletePacketDiv = function () { - var packetDiv = this._getPacketDiv(); - packetDiv.append(this._getNameDiv()); - packetDiv.append(this._getPacketTimeDiv()); - if (this._marker.packet.timestamp > 0) { - if ($(window).height() >= 300) { - packetDiv.append(this._getPacketPathDiv()); - } - var phgRange = this._marker.packet.getPHGRange(); - var rngRange = this._marker.packet.getRNGRange(); - if (phgRange !== null || rngRange !== null) { - packetDiv.append(this._getSpaceDiv()); - packetDiv.append(this._getPhgDiv(phgRange)); - packetDiv.append(this._getRngDiv(rngRange)); - } - if ($(window).height() >= 300) { - var transmitDistance = this._getTransmitDistance(this._marker.packet); - var tailDistance = this._getTailDistance( - this._defaultMap.markerCollection.getMarkerMasterMarkerKeyId( - this._marker.markerIdKey - ) - ); - if ( - (transmitDistance !== null && - Math.round(transmitDistance / 100) != 0) || - (tailDistance !== null && Math.round(tailDistance) > 0) - ) { - packetDiv.append(this._getSpaceDiv()); - packetDiv.append(this._getTransmitDistanceDiv(transmitDistance)); - packetDiv.append(this._getTailDistanceDiv(tailDistance)); - } - } - if ( - this._marker.packet.speed !== null || - this._marker.packet.course !== null || - this._marker.packet.altitude !== null - ) { - packetDiv.append(this._getSpaceDiv()); - packetDiv.append(this._getPacketSpeedAltitudeCourseDiv()); - } - if ( - typeof this._marker.packet.weather !== "undefined" && - this._marker.packet.weather !== null - ) { - packetDiv.append(this._getSpaceDiv()); - packetDiv.append(this._getWeatherDiv()); - } - if ( - typeof this._marker.packet.latest_telemetry_packet_timestamp !== - "undefined" && - this._marker.packet.latest_telemetry_packet_timestamp !== null - ) { - packetDiv.append(this._getSpaceDiv()); - packetDiv.append(this._getTelemetryDiv()); - } - - var commentDiv = this._getPacketCommentDiv(); - if (commentDiv != null) { - packetDiv.append(this._getSpaceDiv()); - packetDiv.append(commentDiv); - } - } - return packetDiv; -}; - -/** - * Get info window packet time div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getPacketTimeDiv = function () { - if (this._marker.packet.timestamp == 0) { - dateString = - '<span style="color: grey;">No known packet for specified limits.</span>'; - } else { - var date = new Date(this._marker.packet.timestamp * 1000); - var dateString = moment(date).format( - trackdirect.settings.dateFormatNoTimeZone - ); - if ( - this._marker.packet.timestamp > this._marker.packet.position_timestamp && - !trackdirect.isMobile - ) { - var positionDate = new Date( - this._marker.packet.position_timestamp * 1000 - ); - dateString = - moment(positionDate).format(trackdirect.settings.dateFormatNoTimeZone) + - " - " + - moment(date).format(trackdirect.settings.dateFormatNoTimeZone); - } - if ( - this._defaultMap.state.endTimeTravelTimestamp !== null && - this._marker.packet.map_id == 12 - ) { - dateString += - '<br/><span style="color: grey;">(exact time for this is not known)</span>'; - } - } - var timeDiv = $(document.createElement("div")); - timeDiv.css("clear", "both"); - timeDiv.html(dateString); - return timeDiv; -}; - -/** - * Get info window packet path div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getPacketPathDiv = function () { - var rawPath = this._marker.packet.getLinkifiedRawPath(); // Html allready escaped - if (rawPath !== null) { - var rawPathDiv = $(document.createElement("div")); - rawPathDiv.css("clear", "both"); - rawPathDiv.html("[" + rawPath + "]"); - return rawPathDiv; - } - return null; -}; - -/** - * Get info window space div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getSpaceDiv = function () { - var spaceDiv = $(document.createElement("div")); - spaceDiv.css("clear", "both"); - spaceDiv.css("line-height", "4px"); - spaceDiv.html(" "); - return spaceDiv; -}; - -/** - * Get info window phg div - * @param {float} phgRange - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getPhgDiv = function (phgRange) { - if (phgRange !== null) { - if (this._defaultMap.state.useImperialUnit) { - var phgRange = - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - phgRange / 1000 - ) * 10 - ) / 10; // converted to miles - var phgRangeUnit = "miles"; - } else { - var phgRange = Math.round(phgRange / 10) / 100; // converted to km - var phgRangeUnit = "km"; - } - var phgDiv = $(document.createElement("div")); - phgDiv.attr( - "id", - "phglinks-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id - ); - var halfPhgLink = $( - "<a style='color: #337ab7;' id='half-phg-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id + - "' href='#'>Half</a>" - ); - var fullPhgLink = $( - "<a style='color: #337ab7;' id='full-phg-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id + - "' href='#'>Full</a>" - ); - var nonePhgLink = $( - "<a style='color: #337ab7;' id='none-phg-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id + - "' href='#'>None</a>" - ); - phgDiv.css("clear", "both"); - phgDiv.css("display", "none"); - phgDiv.css("color", "#440B2A"); - phgDiv.append("PHG calculated range: " + phgRange + " " + phgRangeUnit); - - if (typeof L === "object" && L.version <= "0.7.7") { - // Skip PHG links for older Leaflet version - return phgDiv; - } - - if (phgRange > 0) { - phgDiv.append("<br/>"); - phgDiv.append("PHG circle: "); - phgDiv.append(fullPhgLink); - phgDiv.append('<span style="color:#000"> - </span>'); - phgDiv.append(halfPhgLink); - phgDiv.append('<span style="color:#000"> - </span>'); - phgDiv.append(nonePhgLink); - } - return phgDiv; - } - return null; -}; - -/** - * Get info window rng div - * @param {float} rngRange - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getRngDiv = function (rngRange) { - if (rngRange !== null) { - if (this._defaultMap.state.useImperialUnit) { - var rngRange = - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - rngRange / 1000 - ) * 10 - ) / 10; // converted to miles - var rngRangeUnit = "miles"; - } else { - var rngRange = Math.round(rngRange * 100) / 100; // converted to km - var rngRangeUnit = "km"; - } - var rngDiv = $(document.createElement("div")); - rngDiv.attr( - "id", - "rnglinks-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id - ); - var halfRngLink = $( - "<a style='color: #337ab7;' id='half-rng-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id + - "' href='#'>Half</a>" - ); - var fullRngLink = $( - "<a style='color: #337ab7;' id='full-rng-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id + - "' href='#'>Full</a>" - ); - var noneRngLink = $( - "<a style='color: #337ab7;' id='none-rng-" + - this._marker.packet.station_id + - "-" + - this._marker.packet.id + - "' href='#'>None</a>" - ); - rngDiv.css("clear", "both"); - rngDiv.css("display", "none"); - rngDiv.css("color", "#440B2A"); - rngDiv.append("RNG precalculated range: " + rngRange + " " + rngRangeUnit); - - if (typeof L === "object" && L.version <= "0.7.7") { - // Skip RNG links for older Leaflet version - return rngDiv; - } - - if (rngRange > 0) { - rngDiv.append("<br/>"); - rngDiv.append("RNG circle: "); - rngDiv.append(fullRngLink); - rngDiv.append('<span style="color:#000"> - </span>'); - rngDiv.append(halfRngLink); - rngDiv.append('<span style="color:#000"> - </span>'); - rngDiv.append(noneRngLink); - } - return rngDiv; - } - return null; -}; - -/** - * Get info window transmit distance div - * @param {float} transmitDistance - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getTransmitDistanceDiv = function ( - transmitDistance -) { - if (transmitDistance !== null && Math.round(transmitDistance / 100) != 0) { - var transmitDistanceDiv = $(document.createElement("div")); - transmitDistanceDiv.css("clear", "both"); - transmitDistanceDiv.css("color", "#273c20"); - if (this._defaultMap.state.useImperialUnit) { - transmitDistance = - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - transmitDistance / 1000 - ) * 10 - ) / 10; - transmitDistanceUnit = "miles"; - } else { - transmitDistance = Math.round(transmitDistance / 100) / 10; - transmitDistanceUnit = "km"; - } - transmitDistanceDiv.append( - '<span title="Transmit distance to receiving digipeater/igate">Transmit distance: ' + - transmitDistance + - " " + - transmitDistanceUnit + - "</span>" - ); - return transmitDistanceDiv; - } - return null; -}; - -/** - * Get info window tail distance div - * @param {float} tailDistance - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getTailDistanceDiv = function ( - tailDistance -) { - if (tailDistance !== null && Math.round(tailDistance) > 0) { - var distanceDiv = $(document.createElement("div")); - distanceDiv.css("clear", "both"); - distanceDiv.css("color", "#273c20"); - if (tailDistance < 1000) { - if (this._defaultMap.state.useImperialUnit) { - tailDistance = Math.round( - trackdirect.services.imperialConverter.convertMeterToYard( - tailDistance - ) - ); - tailDistanceUnit = "yd"; - } else { - tailDistance = Math.round(tailDistance); - tailDistanceUnit = "m"; - } - } else { - if (this._defaultMap.state.useImperialUnit) { - tailDistance = - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - tailDistance / 1000 - ) * 10 - ) / 10; - tailDistanceUnit = "miles"; - } else { - tailDistance = Math.round(tailDistance / 100) / 10; - tailDistanceUnit = "km"; - } - } - distanceDiv.append( - '<span title="Current shown tail distance (depends on the time settings)">Current tail distance: ' + - tailDistance + - " " + - tailDistanceUnit + - "</span>" - ); - return distanceDiv; - } - return null; -}; - -/** - * Get info window packet speed altitude and course div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getPacketSpeedAltitudeCourseDiv = - function () { - if ( - Math.round(this._marker.packet.speed) != 0 || - Math.round(this._marker.packet.course) != 0 || - Math.round(this._marker.packet.altitude) != 0 - ) { - var speedDiv = $(document.createElement("div")); - speedDiv.css("clear", "both"); - speedDiv.css("font-weight", "bold"); - - if (this._marker.packet.speed !== null) { - if (this._defaultMap.state.useImperialUnit) { - speedDiv.append( - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - this._marker.packet.speed - ) - ) + " mph " - ); - } else { - speedDiv.append(Math.round(this._marker.packet.speed) + " km/h "); - } - } - - if (this._marker.packet.course !== null) { - speedDiv.append(Math.round(this._marker.packet.course) + "° "); - } - - if (this._marker.packet.altitude !== null) { - if (this._defaultMap.state.useImperialUnit) { - speedDiv.append( - " alt " + - Math.round( - trackdirect.services.imperialConverter.convertMeterToFeet( - this._marker.packet.altitude - ) - ) + - " ft " - ); - } else { - speedDiv.append( - " alt " + Math.round(this._marker.packet.altitude) + " m " - ); - } - } - - return speedDiv; - } - return null; - }; - -/** - * Get info window weather div rain string - * @return {string} - */ -trackdirect.models.InfoWindow.prototype._getWeatherDivRainString = function () { - if (isNumeric(this._marker.packet.weather.rain_1h)) { - if (this._defaultMap.state.useImperialUnit) { - var rain1h = "-"; - if (isNumeric(this._marker.packet.weather.rain_1h)) { - rain1h = - Math.round( - trackdirect.services.imperialConverter.convertMmToInch( - this._marker.packet.weather.rain_1h - ) - ) + "in"; - } - var rain24h = "-"; - if (isNumeric(this._marker.packet.weather.rain_24h)) { - rain24h = - Math.round( - trackdirect.services.imperialConverter.convertMmToInch( - this._marker.packet.weather.rain_24h - ) - ) + "in"; - } - var rainSinceMidnight = "-"; - if (isNumeric(this._marker.packet.weather.rain_since_midnight)) { - rainSinceMidnight = - Math.round( - trackdirect.services.imperialConverter.convertMmToInch( - this._marker.packet.weather.rain_since_midnight - ) - ) + "in"; - } - } else { - var rain1h = "-"; - if (isNumeric(this._marker.packet.weather.rain_1h)) { - rain1h = Math.round(this._marker.packet.weather.rain_1h) + "mm"; - } - var rain24h = "-"; - if (isNumeric(this._marker.packet.weather.rain_24h)) { - rain24h = Math.round(this._marker.packet.weather.rain_24h) + "mm"; - } - var rainSinceMidnight = "-"; - if (isNumeric(this._marker.packet.weather.rain_since_midnight)) { - rainSinceMidnight = - Math.round(this._marker.packet.weather.rain_since_midnight) + "mm"; - } - } - return ( - "<b>Rain</b> " + - rain1h + - "/" + - rain24h + - "/" + - rainSinceMidnight + - " (1h/24h/midnight)<br/>" - ); - } - return null; -}; - -/** - * Get info window weather div temperature string - * @return {string} - */ -trackdirect.models.InfoWindow.prototype._getWeatherDivTemperatureString = - function () { - if (isNumeric(this._marker.packet.weather.temperature)) { - if (this._defaultMap.state.useImperialUnit) { - return ( - "<b>Temperature</b> " + - Math.round( - trackdirect.services.imperialConverter.convertCelciusToFahrenheit( - this._marker.packet.weather.temperature - ) - ) + - "°F" + - "<br/>" - ); - } else { - return ( - "<b>Temperature</b> " + - Math.round(this._marker.packet.weather.temperature) + - "°C" + - "<br/>" - ); - } - } - return null; - }; - -/** - * Get info window weather div humidity string - * @return {string} - */ -trackdirect.models.InfoWindow.prototype._getWeatherDivHumidityString = - function () { - if (isNumeric(this._marker.packet.weather.humidity)) { - return ( - "<b>Humidity</b> " + - Math.round(this._marker.packet.weather.humidity) + - "%<br/>" - ); - } - return null; - }; - -/** - * Get info window weather div pressure string - * @return {string} - */ -trackdirect.models.InfoWindow.prototype._getWeatherDivPressureString = - function () { - if (isNumeric(this._marker.packet.weather.pressure)) { - if (this._defaultMap.state.useImperialUnit) { - return ( - "<b>Pressure</b> " + - Math.round( - trackdirect.services.imperialConverter.convertMbarToMmhg( - this._marker.packet.weather.pressure - ) - ) + - " mmHg<br/>" - ); - } else { - return ( - "<b>Pressure</b> " + - Math.round(this._marker.packet.weather.pressure) + - " hPa<br/>" - ); - } - } - return null; - }; - -/** - * Get info window weather div wind string - * @return {string} - */ -trackdirect.models.InfoWindow.prototype._getWeatherDivWindString = function () { - if (isNumeric(this._marker.packet.weather.wind_speed)) { - var windDir = ""; - if ( - typeof this._marker.packet.weather.wind_direction !== "undefined" && - isNumeric(this._marker.packet.weather.wind_direction) - ) { - windDir = - this._marker.packet.weather.wind_direction.toString() + "° "; - } - - if (this._defaultMap.state.useImperialUnit) { - if (isNumeric(this._marker.packet.weather.wind_gust)) { - return ( - "<b>Wind</b> " + - windDir + - Math.round( - trackdirect.services.imperialConverter.convertMpsToMph( - this._marker.packet.weather.wind_speed - ) * 10 - ) / - 10 + - " mph" + - " (" + - Math.round( - trackdirect.services.imperialConverter.convertMpsToMph( - this._marker.packet.weather.wind_gust - ) * 10 - ) / - 10 + - " mph)<br/>" - ); - } else { - return ( - "<b>Wind</b> " + - windDir + - Math.round( - trackdirect.services.imperialConverter.convertMpsToMph( - this._marker.packet.weather.wind_speed - ) * 10 - ) / - 10 + - " mph<br/>" - ); - } - } else { - if (isNumeric(this._marker.packet.weather.wind_gust)) { - return ( - "<b>Wind</b> " + - windDir + - Math.round(this._marker.packet.weather.wind_speed * 10) / 10 + - " m/s" + - " (" + - Math.round(this._marker.packet.weather.wind_gust * 10) / 10 + - " m/s)<br/>" - ); - } else { - return ( - "<b>Wind</b> " + - windDir + - Math.round(this._marker.packet.weather.wind_speed * 10) / 10 + - " m/s <br/>" - ); - } - } - } - return null; -}; - -/** - * Get info window weather div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getWeatherDiv = function () { - var weatherDiv = $(document.createElement("div")); - weatherDiv.css("clear", "both"); - weatherDiv.css("color", "#227152"); - - var weatherDate = new Date(this._marker.packet.timestamp * 1000); - if ( - typeof this._marker.packet.weather.timestamp !== "undefined" && - this._marker.packet.weather.timestamp !== null - ) { - weatherDate = new Date(this._marker.packet.weather.timestamp * 1000); - } - weatherDateString = moment(weatherDate).format( - trackdirect.settings.dateFormatNoTimeZone - ); - weatherDiv.append("<b>Latest Weather</b> " + weatherDateString + "<br/>"); - - if (!trackdirect.isMobile && $(window).height() >= 300) { - weatherDiv.append(this._getWeatherDivTemperatureString()); - weatherDiv.append(this._getWeatherDivHumidityString()); - weatherDiv.append(this._getWeatherDivPressureString()); - weatherDiv.append(this._getWeatherDivRainString()); - weatherDiv.append(this._getWeatherDivWindString()); - } - return weatherDiv; -}; - -/** - * Get info window telemetry div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getTelemetryDiv = function () { - var telemetryDiv = $(document.createElement("div")); - telemetryDiv.css("clear", "both"); - telemetryDiv.css("color", "#823030"); - - var telemetryDate = new Date( - this._marker.packet.latest_telemetry_packet_timestamp * 1000 - ); - telemetryDateString = moment(telemetryDate).format( - trackdirect.settings.dateFormatNoTimeZone - ); - telemetryDiv.append("Latest Telemetry " + telemetryDateString + "<br/>"); - - return telemetryDiv; -}; - -/** - * Get info window comment div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getPacketCommentDiv = function () { - var comment = ""; - var ognSummary = escapeHtml(this._marker.packet.getOgnSummary()); - if (ognSummary != "") { - comment = ognSummary; - } else if ( - typeof this._marker.packet.comment !== "undefined" && - this._marker.packet.comment !== null - ) { - comment = Autolinker.link(escapeHtml(this._marker.packet.comment), { - newWindow: true, - }); - } - if (comment == "") { - return null; - } - var commentDiv = $(document.createElement("div")); - commentDiv.css("clear", "both"); - commentDiv.css("font-weight", "bold"); - if (!trackdirect.isMobile) { - commentDiv.css("font-size", "11px"); - } else { - commentDiv.css("font-size", "10px"); - } - commentDiv.html(comment); - return commentDiv; -}; - -/** - * Add info window PHG link listeners - * @return none - */ -trackdirect.models.InfoWindow.prototype._addPhgLinkListeners = function () { - var marker = this._marker; - $("#half-phg-" + marker.packet.station_id + "-" + marker.packet.id).click( - function (e) { - marker.showPHGCircle(true); - return false; - } - ); - - $("#full-phg-" + marker.packet.station_id + "-" + marker.packet.id).click( - function (e) { - marker.showPHGCircle(false); - return false; - } - ); - - $( - "#none-phg-" + this._marker.packet.station_id + "-" + marker.packet.id - ).click(function (e) { - marker.hidePHGCircle(); - return false; - }); - - if ( - $("#phglinks-" + marker.packet.station_id + "-" + marker.packet.id).length - ) { - $("#phglinks-" + marker.packet.station_id + "-" + marker.packet.id).show(); - } -}; - -/** - * Add info window RNG link listeners - * @return none - */ -trackdirect.models.InfoWindow.prototype._addRngLinkListeners = function () { - var marker = this._marker; - $("#half-rng-" + marker.packet.station_id + "-" + marker.packet.id).click( - function (e) { - marker.showRNGCircle(true); - return false; - } - ); - - $("#full-rng-" + marker.packet.station_id + "-" + marker.packet.id).click( - function (e) { - marker.showRNGCircle(false); - return false; - } - ); - - $("#none-rng-" + marker.packet.station_id + "-" + marker.packet.id).click( - function (e) { - marker.hideRNGCircle(); - return false; - } - ); - - if ( - $("#rnglinks-" + marker.packet.station_id + "-" + marker.packet.id).length - ) { - $("#rnglinks-" + marker.packet.station_id + "-" + marker.packet.id).show(); - } -}; - -/** - * Returns html element that contains the info window menu - * @param {boolean} isInfoWindowOpen - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDiv = function ( - isInfoWindowOpen -) { - var menuWrapperDiv = this._getMenuDivWrapperDiv(); - - var menuDiv = this._getMenuDivMainDiv(); - menuWrapperDiv.append(menuDiv); - - var menuUl = this._getMenuDivUlDiv(); - menuDiv.append(menuUl); - - menuUl.append(this._getMenuDivTrackLink()); - menuUl.append(this._getMenuDivFilterLink()); - if (!trackdirect.isMobile) { - menuUl.append(this._getMenuDivCenterLink(isInfoWindowOpen)); - } - menuUl.append(this._getMenuDivZoomLink(isInfoWindowOpen)); - if ( - !trackdirect.isEmbedded && - !inIframe() && - !this._marker.isMovingStation() && - this._marker.packet.source_id != 2 - ) { - menuUl.append(this._getMenuDivCoverageLink()); - } - return menuWrapperDiv; -}; - -/** - * Get the info window menu wrapper div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivWrapperDiv = function () { - var menuWrapperDiv = $(document.createElement("div")); - menuWrapperDiv.addClass("infowindow-menu-wrapper"); - menuWrapperDiv.css("clear", "both"); - menuWrapperDiv.css("width", "100%"); - menuWrapperDiv.css("padding-top", "8px"); - return menuWrapperDiv; -}; - -/** - * Get the info window menu main div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivMainDiv = function () { - var menuDiv = $(document.createElement("div")); - menuDiv.addClass("infowindow-menu"); - menuDiv.css("width", "100%"); - menuDiv.css("border-top", "1px solid #cecece"); - return menuDiv; -}; - -/** - * Get the info window menu ul div - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivUlDiv = function () { - var menuUl = $(document.createElement("ul")); - menuUl.css("list-style-type", "none"); - menuUl.css("list-style", "none"); - menuUl.css("text-align", "center"); - menuUl.css("margin", "0"); - menuUl.css("padding", "0"); - menuUl.css("display", "table"); - return menuUl; -}; - -/** - * Get the info window menu link CSS - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivLinkCss = function () { - var liLinkCss = { - "list-style": "none", - display: "table-cell", - "text-align": "center", - "padding-right": "10px", - width: "auto", - }; - return liLinkCss; -}; - -/** - * Get the info window menu track link - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivTrackLink = function () { - var trackLinkElementClass = - "trackStationLink" + this._marker.packet.station_id; - var menuLi = $(document.createElement("li")); - menuLi.css(this._getMenuDivLinkCss()); - var menuLink = $(document.createElement("a")); - menuLink.css("color", "#337ab7"); - menuLink.attr("href", "#"); - menuLink.addClass(trackLinkElementClass); - menuLink.attr( - "onclick", - "trackdirect.handleTrackStationRequest(" + - this._marker.packet.station_id + - ', "' + - trackLinkElementClass + - '"); return false;' - ); - if ( - this._defaultMap.state.getTrackStationId() !== null && - this._defaultMap.state.getTrackStationId() == this._marker.packet.station_id - ) { - menuLink.html("Untrack"); - } else { - menuLink.html("Track"); - } - menuLi.append(menuLink); - return menuLi; -}; - -/** - * Get the info window menu filter link - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivFilterLink = function () { - var filterLinkElementClass = - "filterStationLink" + this._marker.packet.station_id; - var menuLi = $(document.createElement("li")); - menuLi.css(this._getMenuDivLinkCss()); - var menuLink = $(document.createElement("a")); - menuLink.css("color", "#337ab7"); - menuLink.addClass(filterLinkElementClass); - menuLink.attr( - "onclick", - "trackdirect.handleFilterStationRequest(" + - this._marker.packet.station_id + - ', "' + - filterLinkElementClass + - '"); return false;' - ); - if ( - this._defaultMap.state.filterStationIds.length > 0 && - this._defaultMap.state.filterStationIds.indexOf( - this._marker.packet.station_id - ) > -1 - ) { - menuLink.html("Unfilter"); - var center = this._defaultMap.getCenterLiteral(); - menuLink.attr( - "href", - "/center/" + - Number.parseFloat(center.lat).toFixed(5) + - "," + - Number.parseFloat(center.lng).toFixed(5) + - "/zoom/" + - this._defaultMap.getZoom() - ); - } else { - menuLink.html("Filter"); - menuLink.attr("href", "/sid/" + this._marker.packet.station_id); - } - menuLi.append(menuLink); - return menuLi; -}; - -/** - * Get the info window menu coverage link - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivCoverageLink = function () { - var coverageLinkElementClass = - "stationCoverageLink" + this._marker.packet.station_id; - var menuLi = $(document.createElement("li")); - menuLi.css(this._getMenuDivLinkCss()); - var menuLink = $(document.createElement("a")); - menuLink.css("color", "#337ab7"); - menuLink.css("white-space", "nowrap"); - menuLink.attr("href", "#"); - menuLink.addClass(coverageLinkElementClass); - menuLink.attr( - "onclick", - "trackdirect.toggleStationCoverage(" + - this._marker.packet.station_id + - ', "' + - coverageLinkElementClass + - '"); return false;' - ); - - var coveragePolygon = this._defaultMap.markerCollection.getStationCoverage( - this._marker.packet.station_id - ); - if (coveragePolygon !== null && coveragePolygon.isRequestedToBeVisible()) { - menuLink.html("Hide Coverage"); - } else { - menuLink.html("Coverage"); - } - menuLi.append(menuLink); - return menuLi; -}; - -/** - * Get the info window menu center link - * @param {boolean} isInfoWindowOpen - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivCenterLink = function ( - isInfoWindowOpen -) { - var menuLi = $(document.createElement("li")); - menuLi.css(this._getMenuDivLinkCss()); - var menuLink = $(document.createElement("a")); - menuLink.css("color", "#337ab7"); - if (isInfoWindowOpen) { - menuLink.attr( - "href", - "/center/" + - this._marker.packet.latitude.toFixed(5) + - "," + - this._marker.packet.longitude.toFixed(5) + - "/zoom/" + - this._defaultMap.getZoom() - ); - menuLink.attr( - "onclick", - "trackdirect.setCenter(" + - this._marker.packet.latitude + - "," + - this._marker.packet.longitude + - "); return false;" - ); - menuLink.html("Center"); - } else { - menuLink.attr( - "href", - "/center/" + - this._marker.packet.latitude.toFixed(5) + - "," + - this._marker.packet.longitude.toFixed(5) + - "/zoom/" + - this._defaultMap.getZoom() - ); - menuLink.attr( - "onclick", - "trackdirect.focusOnMarkerId(" + - this._marker.packet.marker_id + - "); return false;" - ); - menuLink.html("Focus"); - } - menuLi.append(menuLink); - return menuLi; -}; - -/** - * Get the info window menu zoom link - * @param {boolean} isInfoWindowOpen - * @return {object} - */ -trackdirect.models.InfoWindow.prototype._getMenuDivZoomLink = function ( - isInfoWindowOpen -) { - var menuLi = $(document.createElement("li")); - menuLi.css(this._getMenuDivLinkCss()); - var menuLink = $(document.createElement("a")); - menuLink.css("color", "#337ab7"); - if (isInfoWindowOpen) { - menuLink.attr( - "href", - "/center/" + - this._marker.packet.latitude.toFixed(5) + - "," + - this._marker.packet.longitude.toFixed(5) + - "/zoom/14" - ); - menuLink.attr( - "onclick", - "trackdirect.setCenter(" + - this._marker.packet.latitude + - "," + - this._marker.packet.longitude + - ", 14); return false;" - ); - menuLink.html("Zoom"); - } else { - menuLink.attr( - "href", - "/center/" + - this._marker.packet.latitude.toFixed(5) + - "," + - this._marker.packet.longitude.toFixed(5) + - "/zoom/14" - ); - menuLink.attr( - "onclick", - "trackdirect.focusOnMarkerId(" + - this._marker.packet.marker_id + - ", 14); return false;" - ); - menuLink.html("Zoom"); - } - menuLi.append(menuLink); - return menuLi; -}; - -/** - * Create infowindow content (compact version)) - * @return string - */ -trackdirect.models.InfoWindow.prototype._getCompactMainDiv = function () { - var packet = this._marker.packet; - - // Init main div - var mainDiv = $(document.createElement("div")); - mainDiv.css("font-family", "Verdana,Arial,sans-serif"); - if (!trackdirect.isMobile) { - mainDiv.css("font-size", "11px"); - } else { - mainDiv.css("font-size", "10px"); - } - mainDiv.css("line-height", "1.42857143"); - mainDiv.css("color", "#333"); - mainDiv.css("text-align", "left"); - - // Init polyline div - var polylineDiv = $(document.createElement("div")); - polylineDiv.css("float", "left"); - - // Name - var nameDiv = $(document.createElement("div")); - nameDiv.css("clear", "both"); - nameDiv.css("font-size", "12px"); - nameDiv.css("font-weight", "bold"); - - // Init img - var iconUrl24 = trackdirect.services.symbolPathFinder.getFilePath( - packet.symbol_table, - packet.symbol, - null, - null, - null, - 24, - 24 - ); - var iconImg = $(document.createElement("img")); - iconImg.css("vertical-align", "middle"); - iconImg.css("width", "24px"); - iconImg.css("height", "24px"); - iconImg.attr("src", iconUrl24); - iconImg.attr("alt", ""); // Set the icon description - iconImg.attr("title", ""); // Set the icon description - nameDiv.append(iconImg); - nameDiv.append(" "); - nameDiv.append(" "); - - var nameLink = $(document.createElement("a")); - nameLink.css("color", "#337ab7"); - if (trackdirect.isMobile) { - nameLink.css("vertical-align", "-2px"); - } - - nameLink.attr("href", ""); - nameLink.attr( - "onclick", - "trackdirect.openStationInformationDialog(" + - packet.station_id + - "); return false;" - ); - - nameLink.html(escapeHtml(packet.station_name)); - nameDiv.append(nameLink); - - if (packet.sender_name != packet.station_name) { - nameDiv.append(" ("); - var nameLink2 = $(document.createElement("span")); - if (trackdirect.isMobile) { - nameLink2.css("vertical-align", "-2px"); - } - - nameLink2.html(escapeHtml(packet.sender_name)); - nameDiv.append(nameLink2); - nameDiv.append(")"); - } - polylineDiv.append(nameDiv); - - var tailDistance = this._getTailDistance( - this._defaultMap.markerCollection.getMarkerMasterMarkerKeyId( - this._marker.markerIdKey - ) - ); - if (tailDistance !== null && Math.round(tailDistance) > 0) { - var distanceDiv = $(document.createElement("div")); - distanceDiv.css("clear", "both"); - distanceDiv.css("padding-top", "4px"); - distanceDiv.append("Tail distance: "); - if (tailDistance < 1000) { - if (this._defaultMap.state.useImperialUnit) { - distanceDiv.append( - Math.round( - trackdirect.services.imperialConverter.convertMeterToYard( - tailDistance - ) - ) + " yd " - ); - } else { - distanceDiv.append(Math.round(tailDistance) + " m "); - } - } else { - if (this._defaultMap.state.useImperialUnit) { - distanceDiv.append( - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - tailDistance / 1000 - ) * 10 - ) / - 10 + - " miles " - ); - } else { - distanceDiv.append(Math.round(tailDistance / 100) / 10 + " km "); - } - } - - polylineDiv.append(distanceDiv); - } - - mainDiv.append(polylineDiv); - return mainDiv; -}; - -/** - * Returns the tail distance in meters for specified marker - * @param {int} markerIdKey - * @return int - */ -trackdirect.models.InfoWindow.prototype._getTailDistance = function ( - markerIdKey -) { - if (this._defaultMap.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this._defaultMap.markerCollection.getMarker(markerIdKey); - if ( - marker.packet.hasConfirmedMapId() && - marker.packet.is_moving == 1 && - marker.overwrite !== true - ) { - var distance = 0; - if (this._defaultMap.markerCollection.hasDotMarkers(markerIdKey)) { - var prevLatLng = null; - var dotMarkers = - this._defaultMap.markerCollection.getDotMarkers(markerIdKey); - for (var i = 0; i < dotMarkers.length; i++) { - var dotMarker = dotMarkers[i]; - var latLng = dotMarker.packet.getLatLngLiteral(); - - if (prevLatLng !== null) { - distance += trackdirect.services.distanceCalculator.getDistance( - prevLatLng, - latLng - ); - } - prevLatLng = latLng; - } - - if (prevLatLng !== null) { - var latLng = marker.packet.getLatLngLiteral(); - if (prevLatLng !== latLng) { - distance += trackdirect.services.distanceCalculator.getDistance( - prevLatLng, - latLng - ); - } - } - } - - var dashedPolyline = - this._defaultMap.markerCollection.getMarkerDashedPolyline(markerIdKey); - if (dashedPolyline !== null) { - // We are connected to a previous marker - if (dashedPolyline.getPathLength() == 2) { - distance += trackdirect.services.distanceCalculator.getDistance( - dashedPolyline.getPathItem(0), - dashedPolyline.getPathItem(1) - ); - - // Add previous markers distance - distance += this._getTailDistance(dashedPolyline.relatedMarkerIdKey); - } - } - return distance; - } - } - return null; -}; - -/** - * Returns the transmit distance in meters for specified packet - * @param {trackdirect.models.Packet} packet - * @return int - */ -trackdirect.models.InfoWindow.prototype._getTransmitDistance = function ( - packet -) { - if ( - typeof packet.station_location_path !== "undefined" && - packet.station_location_path !== null && - packet.station_location_path.length >= 1 - ) { - var relatedStationLatLng = { - lat: parseFloat(packet.station_location_path[0][0]), - lng: parseFloat(packet.station_location_path[0][1]), - }; - var distance = trackdirect.services.distanceCalculator.getDistance( - packet.getLatLngLiteral(), - relatedStationLatLng - ); - if (distance !== null) { - return distance; - } - } - - if ( - typeof packet.station_id_path !== "undefined" && - packet.station_id_path !== null && - packet.station_id_path.length >= 1 - ) { - for (var i = 0; i < packet.station_id_path.length; i++) { - var relatedStationId = packet.station_id_path[i]; - var relatedStationPacket = - this._defaultMap.markerCollection.getStationLatestPacket( - relatedStationId - ); - if (relatedStationPacket !== null) { - // found first station! - break; - } - } - - if (relatedStationPacket !== null) { - var relatedStationLatLng = { - lat: parseFloat(relatedStationPacket.latitude), - lng: parseFloat(relatedStationPacket.longitude), - }; - var distance = trackdirect.services.distanceCalculator.getDistance( - packet.getLatLngLiteral(), - relatedStationLatLng - ); - if (distance !== null) { - return distance; - } - } - } - return null; -}; diff --git a/jslib/src/trackdirect/models/Label.js b/jslib/src/trackdirect/models/Label.js deleted file mode 100755 index 31a6be4726295d4f843780b45f4347072f4f9dce..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/Label.js +++ /dev/null @@ -1,239 +0,0 @@ -if (typeof google === "object" && typeof google.maps === "object") { - /** - * Class trackdirect.models.Label inherit google.maps.OverlayView - * @see https://developers.google.com/maps/documentation/javascript/reference#OverlayView - * @param {array} options - * @param {trackdirect.models.Map} map - */ - trackdirect.models.Label = function (options, map) { - this._defaultMap = map; - options.map = null; - this.setValues(options); - this.div_ = null; - }; - trackdirect.models.Label.prototype = new google.maps.OverlayView(); - - /** - * show if it is not shown - */ - trackdirect.models.Label.prototype.show = function () { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - }; - - /** - * hide if it is visible - */ - trackdirect.models.Label.prototype.hide = function () { - if (this.getMap() !== null) { - this.setMap(null); - } - }; - - /** - * Override onAdd - */ - trackdirect.models.Label.prototype.onAdd = function () { - if (this.div_ === null) { - var jqSpan = $(document.createElement("span")); - jqSpan.css("color", "#101010"); - jqSpan.css( - "text-shadow", - "1px 1px 1px #FFF, -1px -1px 1px #FFF, 1px -1px 1px #FFF, -1px 1px 1px #FFF, 1px 1px 1px #FFF" - ); - jqSpan.css("position", "relative"); - jqSpan.css("top", "10px"); - jqSpan.css("white-space", "nowrap"); - jqSpan.css("font-family", "Helvetica"); - jqSpan.css("font-weight", "bold"); - jqSpan.css("font-size", "10px"); - jqSpan.css("padding", "0px"); - jqSpan.css("z-index", "1000"); - jqSpan.css("margin", "0"); - jqSpan.css("line-height", "10px"); - var span = (this.span_ = jqSpan[0]); - span.innerHTML = this.get("text").toString(); - - var div = (this.div_ = document.createElement("div")); - div.appendChild(span); - div.style.cssText = "position: absolute; display: none"; - } - - var pane = this.getPanes().overlayLayer; - pane.appendChild(this.div_); - - // Ensures the label is redrawn if the text or position is changed. - var me = this; - this.listeners_ = [ - google.maps.event.addListener(this, "position_changed", function () { - me.draw(); - }), - google.maps.event.addListener(this, "text_changed", function () { - me.draw(); - }), - ]; - }; - - /** - * Override onRemove - */ - trackdirect.models.Label.prototype.onRemove = function () { - if (this.div_ !== null && this.div_.parentNode !== null) { - this.div_.parentNode.removeChild(this.div_); - - // Label is removed from the map, stop updating its position/text. - for (var i = 0, I = this.listeners_.length; i < I; ++i) { - google.maps.event.removeListener(this.listeners_[i]); - } - } - }; - - /** - * Draw the label - */ - trackdirect.models.Label.prototype.draw = function () { - var projection = this.getProjection(); - if (typeof this.get("position").lat === "function") { - var latLng = new google.maps.LatLng({ - lat: this.get("position").lat(), - lng: this.get("position").lng(), - }); - } else { - var latLng = new google.maps.LatLng({ - lat: this.get("position").lat, - lng: this.get("position").lng, - }); - } - var position = projection.fromLatLngToDivPixel(latLng); - - var div = this.div_; - var span = this.span_; - span.innerHTML = this.get("text").toString(); - div.style.left = position.x + "px"; - div.style.top = position.y + "px"; - - div.style.display = "block"; - }; -} else if (typeof L === "object" && typeof L.Tooltip !== "undefined") { - /** - * Class trackdirect.models.Label - * @param {array} options - * @param {trackdirect.models.Map} map - */ - trackdirect.models.Label = function (options, map) { - this._defaultMap = map; - - // Call the parent constructor - L.Tooltip.call(this, this._getBasicOptions(options)); - - this.setContent(options.text); - if ( - typeof options.position !== "undefined" && - typeof options.position.lat !== "undefined" && - typeof options.position.lng !== "undefined" - ) { - this.setLatLng(new L.LatLng(options.position.lat, options.position.lng)); - } - }; - trackdirect.models.Label.prototype = new L.Tooltip(); - - /** - * show if it is not shown - */ - trackdirect.models.Label.prototype.show = function () { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - }; - - /** - * hide if it is visible - */ - trackdirect.models.Label.prototype.hide = function () { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - }; - - /** - * Get a suitable leaflet options object - * @return {object} - */ - trackdirect.models.Label.prototype._getBasicOptions = function (options) { - return { - direction: "right", - noWrap: true, - offset: L.point(2, 10), - className: "leaflet-marker-labeltext", - permanent: true, - }; - }; -} else if (typeof L === "object") { - /** - * Class trackdirect.models.Label - * @param {array} options - * @param {trackdirect.models.Map} map - */ - trackdirect.models.Label = function (options, map) { - this._defaultMap = map; - - var position = null; - if ( - typeof options.position !== "undefined" && - typeof options.position.lat !== "undefined" && - typeof options.position.lng !== "undefined" - ) { - position = [options.position.lat, options.position.lng]; - } - - // Call the parent constructor - L.Marker.call(this, position, this._getBasicOptions(options)); - }; - trackdirect.models.Label.prototype = Object.create(L.Marker.prototype); - trackdirect.models.Label.prototype.constructor = trackdirect.models.Label; - - /** - * show if it is not shown - */ - trackdirect.models.Label.prototype.show = function () { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - }; - - /** - * hide if it is visible - */ - trackdirect.models.Label.prototype.hide = function () { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - }; - - /** - * Get a suitable leaflet options object - * @return {object} - */ - trackdirect.models.Label.prototype._getBasicOptions = function (options) { - var strlen = options.text.length; - - var myIcon = L.divIcon({ - iconSize: new L.Point(strlen * 10, 20), - className: "leaflet-marker-labeltext", - html: options.text, - iconAnchor: new L.Point(-2, -10), - }); - - return { - icon: myIcon, - clickable: false, - keyboard: false, - }; - }; -} else { - // If no Label is supported we use a dummy class - trackdirect.models.Label = function (options, map) {}; - trackdirect.models.Label.prototype.show = function () {}; - trackdirect.models.Label.prototype.hide = function () {}; -} diff --git a/jslib/src/trackdirect/models/Map.js b/jslib/src/trackdirect/models/Map.js deleted file mode 100755 index 47d022192584832bf7ead8fb5a715ebf0c7e849f..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/Map.js +++ /dev/null @@ -1,1568 +0,0 @@ -/** - * Class trackdirect.models.Map - * @see https://developers.google.com/maps/documentation/javascript/reference#Map - * @param {string} mapElementId - * @param {object} options - */ -trackdirect.models.Map = function (mapElementId, options) { - this._init(mapElementId, options); - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Map.call( - this, - document.getElementById(mapElementId), - this._getGoolgeMapOptions() - ); - } else if (typeof L === "object") { - L.Map.call( - this, - document.getElementById(mapElementId), - this._getLeafletMapOptions() - ); - this._updateLeafletTileLayer(); - L.control - .zoom({ - position: "bottomright", - }) - .addTo(this); - } - - this._initMap(); -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.Map.prototype = Object.create(google.maps.Map.prototype); -} else if (typeof L === "object") { - trackdirect.models.Map.prototype = Object.create(L.Map.prototype); -} -trackdirect.models.Map.prototype.constructor = trackdirect.models.Map; - -/** - * Init - */ -trackdirect.models.Map.prototype._init = function (mapElementId, options) { - this._mapElementId = mapElementId; - this._tdMapOptions = options; - this._initBasic(); - this._initMapTypes(); -}; - -/** - * Init basic stuff - */ -trackdirect.models.Map.prototype._initBasic = function () { - this._tdEventListeners = {}; - this._tdEventTimeout = null; - this._currentContentZoom = null; - this._visibleMapSectors = []; - this._newMarkersToShow = []; - - this._leafletTileLayer = null; - this._heatMap = null; - - // Init public variables - this.markerCollection = new trackdirect.models.MarkerCollection(); - this.state = new trackdirect.models.MapState(); -}; - -/** - * Init map types - */ -trackdirect.models.Map.prototype._initMapTypes = function () { - this._supportedMapTypes = {}; - if ( - typeof this._tdMapOptions.supportedMapTypes !== "undefined" && - this._tdMapOptions.supportedMapTypes !== null && - Object.keys(this._tdMapOptions.supportedMapTypes).length > 0 - ) { - this._supportedMapTypes = this._tdMapOptions.supportedMapTypes; - } else if (typeof google === "object" && typeof google.maps === "object") { - this._supportedMapTypes["roadmap"] = google.maps.MapTypeId.ROADMAP; - this._supportedMapTypes["terrain"] = google.maps.MapTypeId.TERRAIN; - this._supportedMapTypes["satellite"] = google.maps.MapTypeId.SATELLITE; - this._supportedMapTypes["hybrid"] = google.maps.MapTypeId.HYBRID; - } else if (typeof L === "object") { - this._supportedMapTypes["roadmap"] = "OpenStreetMap.Mapnik"; - this._supportedMapTypes["terrain"] = "OpenTopoMap"; - } - - if ( - typeof this._tdMapOptions.maptype !== "undefined" && - this._tdMapOptions.maptype !== null && - this._tdMapOptions.maptype in this._supportedMapTypes - ) { - this._mapType = this._tdMapOptions.maptype; - } else { - this._mapType = Object.keys(this._supportedMapTypes)[0]; - } -}; - -/** - * Init the map - */ -trackdirect.models.Map.prototype._initMap = function () { - this._heatMap = new trackdirect.models.HeatMap(this); - this._setMapInitialLocation(); - this._initOms(); - this._initInfoWindowEvent(); - this._updateMapContent(); - this._initMapEvents(); - - // create kmlLayer object from URL - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this._tdMapOptions.mid !== "undefined") { - var kmlUrl = - "https://www.google.com/maps/d/u/0/kml?mid=" + this._tdMapOptions.mid; - var kmlLayer = new google.maps.KmlLayer(kmlUrl, { map: this }); - } - } -}; - -/** - * Trigger a resize event - */ -trackdirect.models.Map.prototype.triggerResize = function () { - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.event.trigger(this, "resize"); - } else if (typeof L === "object") { - L.Map.prototype._onResize.call(this); - } -}; - -/** - * Set Map center - * @param {LatLngLiteral} pos - * @param {int} zoom - */ -trackdirect.models.Map.prototype.setCenter = function (pos, zoom) { - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Map.prototype.setCenter.call(this, pos); - if (typeof zoom !== "undefined") { - google.maps.Map.prototype.setZoom.call(this, zoom); - } - } else if (typeof L === "object") { - zoom = typeof zoom !== "undefined" ? zoom : this.getZoom(); - L.Map.prototype.setView.call(this, pos, zoom); - } - this._renderCordinatesContainer(pos); -}; - -/** - * Get Map center literal - * @return LatLngLiteral - */ -trackdirect.models.Map.prototype.getCenterLiteral = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var latLng = google.maps.Map.prototype.getCenter.call(this); - if (typeof latLng !== "undefined" && typeof latLng.lat === "function") { - return { lat: latLng.lat(), lng: latLng.lng() }; - } else { - return latLng; - } - } else if (typeof L === "object") { - var latLng = L.Map.prototype.getCenter.call(this); - if (typeof latLng !== "undefined") { - return { lat: latLng.lat, lng: latLng.lng }; - } else { - return latLng; - } - } - return null; -}; - -/** - * Fit bounds - * @param {Array} bounds - */ -trackdirect.models.Map.prototype.fitBounds = function (bounds) { - if (typeof google === "object" && typeof google.maps === "object") { - var latLngBounds = new google.maps.LatLngBounds(); - for (var i = 0; i < bounds.length; i++) { - latLngBounds.extend(bounds[i]); - } - google.maps.Map.prototype.fitBounds.call(this, latLngBounds); - } else if (typeof L === "object") { - L.Map.prototype.fitBounds.call(this, bounds); - } -}; - -/** - * set Map center by station position - * @param {LatLngLiteral} pos - */ -trackdirect.models.Map.prototype.setCenterByStationId = function (stationId) { - var latestVisibleMarker = - this.markerCollection.getStationLatestVisibleMarker(stationId); - if (latestVisibleMarker !== null) { - this.setCenter(latestVisibleMarker.packet.getLatLngLiteral()); - } -}; - -/** - * Get map DOM element id - * @return {string} - */ -trackdirect.models.Map.prototype.getMapElementId = function () { - return this._mapElementId; -}; - -/** - * Get map options - * @return {object} - */ -trackdirect.models.Map.prototype.getTdMapOptions = function () { - return this._tdMapOptions; -}; - -/** - * Returns true if specified map sector is visible - * If we are filtering we consider all mapsectors visible - * @param {int} mapSector - * @return {boolean} - */ -trackdirect.models.Map.prototype.isMapSectorVisible = function (mapSector) { - if ( - this._visibleMapSectors.indexOf(mapSector) >= 0 || - this.state.isFilterMode - ) { - return true; - } - return false; -}; - -/** - * Returnes the number of new markers in queue - * @return {int} - */ -trackdirect.models.Map.prototype.getNumberOfNewMarkersToShow = function () { - return this._newMarkersToShow; -}; - -/** - * Show all markers that has recently been added - * @param {boolean} track - */ -trackdirect.models.Map.prototype.showNewMarkersInQueue = function (track) { - track = typeof track !== "undefined" ? track : true; - - var oldestAllowedTrackingTimestamp = 0; - if (this.state.onlyTrackRecentPackets) { - oldestAllowedTrackingTimestamp = Math.floor(Date.now() / 1000) - 60; - } - - while ((markerIdKey = this._newMarkersToShow.pop()) != null) { - if (!this.markerCollection.isExistingMarker(markerIdKey)) { - continue; - } - var marker = this.markerCollection.getMarker(markerIdKey); - trackdirect.services.callbackExecutor.addWithPriority( - marker, - marker.showCompleteMarker, - [] - ); - - // Track - if (track && marker.packet.packet_order_id == 1) { - if ( - marker.shouldMarkerBeVisible() && - marker.showAsMarker && - this.state.trackStationId !== null && - this.state.trackStationId == marker.packet.station_id && - this.state.getClientTimestamp(marker.packet.timestamp) > - oldestAllowedTrackingTimestamp - ) { - trackdirect.services.callbackExecutor.addWithPriority( - this, - this.setCenterByStationId, - [marker.packet.station_id] - ); - } - } - - // Open previoulsy open info window - if ( - this.state.openInfoWindowForMarkerIdKey !== null && - this.state.openInfoWindowForMarkerIdKey == markerIdKey && - marker.packet.packet_order_id == 1 && - marker.shouldMarkerBeVisible() && - marker.showAsMarker - ) { - trackdirect.services.callbackExecutor.addWithPriority( - this, - this.openLatestStationInfoWindow, - [marker.packet.station_id] - ); - } - } - this.state.openInfoWindowForMarkerIdKey = null; -}; - -/** - * Activate filtered mode - */ -trackdirect.models.Map.prototype.activateFilteredMode = function () { - this.state.isFilterMode = true; - this._deactivateHeatMap(); - this._updateMapContent(); -}; - -/** - * Deactivate filtered mode - */ -trackdirect.models.Map.prototype.deactivateFilteredMode = function () { - if (this.state.isFilterMode) { - this._activateHeatMap(); - this.state.isFilterMode = false; - this.state.filterStationIds = []; - this._updateMapContent(); - } -}; - -/** - * Get the north east latitude of the current map view - * @return {float} - */ -trackdirect.models.Map.prototype.getNorthEastLat = function () { - if (this.getBounds() != null) { - if (typeof google === "object" && typeof google.maps === "object") { - return this.getBounds().getNorthEast().lat(); - } else if (typeof L === "object") { - return this.getBounds().getNorthEast().lat; - } - } - return 0; -}; - -/** - * Get the north east longtitue of the current map view - * @return {float} - */ -trackdirect.models.Map.prototype.getNorthEastLng = function () { - if (this.getBounds() != null) { - if (typeof google === "object" && typeof google.maps === "object") { - return this.getBounds().getNorthEast().lng(); - } else if (typeof L === "object") { - return this.getBounds().getNorthEast().lng; - } - } - return 0; -}; - -/** - * Get the south west latitude of the current map view - * @return {float} - */ -trackdirect.models.Map.prototype.getSouthWestLat = function () { - if (this.getBounds() != null) { - if (typeof google === "object" && typeof google.maps === "object") { - return this.getBounds().getSouthWest().lat(); - } else if (typeof L === "object") { - return this.getBounds().getSouthWest().lat; - } - } - return 0; -}; - -/** - * Get the south west longitude of the current map view - * @return {float} - */ -trackdirect.models.Map.prototype.getSouthWestLng = function () { - if (this.getBounds() != null) { - if (typeof google === "object" && typeof google.maps === "object") { - return this.getBounds().getSouthWest().lng(); - } else if (typeof L === "object") { - return this.getBounds().getSouthWest().lng; - } - } - return 0; -}; - -/** - * Returns true if map is ready - * @return {boolean} - */ -trackdirect.models.Map.prototype.isMapReady = function () { - if (this.getBounds() != null) { - return true; - } - return false; -}; - -/** - * Set map type - * @param {string} mapType - */ -trackdirect.models.Map.prototype.setMapType = function (mapType) { - if (mapType in this._supportedMapTypes) { - this._mapType = mapType; - if (typeof google === "object" && typeof google.maps === "object") { - this._updateGoogleMapTileLayer(); - } else if (typeof L === "object") { - this._updateLeafletTileLayer(); - } - this._emitTdEventListeners("change"); - } -}; - -/** - * Get map type - * @return {string} - */ -trackdirect.models.Map.prototype.getMapType = function () { - return this._mapType; -}; - -/** - * Get leaflet tile layer - * @return {string} - */ -trackdirect.models.Map.prototype.getLeafletTileLayer = function () { - return this._leafletTileLayer; -}; - -/** - * Returns current mid - * @return {String} - */ -trackdirect.models.Map.prototype.getMid = function () { - if (typeof this._tdMapOptions.mid !== "undefined") { - return this._tdMapOptions.mid; - } - return null; -}; - -/** - * Reset all markers, this will remove everything from map and memory - */ -trackdirect.models.Map.prototype.resetAllMarkers = function () { - while (this.markerCollection.getNumberOfMarkers() > 0) { - var i = this.markerCollection.getNumberOfMarkers(); - while (i--) { - var marker = this.markerCollection.getMarker(i); - if (marker !== null) { - marker.stopToOldTimeout(); - marker.stopDirectionPolyline(); - marker.hide(); - marker.hideMarkerPrevPosition(); - marker.hideMarkerTail(); - - var stationCoverage = this.markerCollection.getStationCoverage(marker.packet.station_id); - if (stationCoverage) { - stationCoverage.hide(); - } - } - this.markerCollection.removeMarker(i); - } - } - if (this.state.openInfoWindow !== null) { - this.state.openInfoWindow.hide(); - } - if (this.oms) { - this.oms.clearMarkers(); - } - this.markerCollection.resetAllMarkers(); -}; - -/** - * Open marker info window - * @param {trackdirect.models.Marker} marker - * @param {boolean} disableAutoPan - */ -trackdirect.models.Map.prototype.openMarkerInfoWindow = function ( - marker, - disableAutoPan -) { - disableAutoPan = - typeof disableAutoPan !== "undefined" ? disableAutoPan : true; - if (marker.getMap() !== null) { - if ( - this.state.openInfoWindow !== null && - this.state.openInfoWindow.getMarker().packet.id != marker.packet.id - ) { - this.state.openInfoWindow.hide(); - } - - if ( - this.state.openInfoWindow !== null && - this.state.openInfoWindow.getMarker().packet.id == marker.packet.id - ) { - // Just update existing infoWindow - this.state.openInfoWindow.setMarker(marker); - } else { - this.state.openInfoWindow = new trackdirect.models.InfoWindow( - marker, - this, - disableAutoPan - ); - } - this._addInfoWindowListeners(this.state.openInfoWindow); - this.state.openInfoWindow.show(); - } -}; - -/** - * Open latest station info window - * @param {int} stationId - */ -trackdirect.models.Map.prototype.openLatestStationInfoWindow = function ( - stationId -) { - var latestVisibleMarker = - this.markerCollection.getStationLatestVisibleMarker(stationId); - if (latestVisibleMarker !== null) { - // open marker info-window since this marker replaced a previous one - this.openMarkerInfoWindow(latestVisibleMarker); - } -}; - -/** - * Open polyline info window - * @param {trackdirect.models.Marker} marker - * @param {LatLng} position - */ -trackdirect.models.Map.prototype.openPolylineInfoWindow = function ( - marker, - position -) { - if (this.state.openInfoWindow !== null) { - this.state.openInfoWindow.hide(); - } - this.state.openInfoWindow = new trackdirect.models.InfoWindow(marker, this); - this._addInfoWindowListeners(this.state.openInfoWindow); - this.state.openInfoWindow.show(true, position); -}; - -/** - * Add some trackdirect.models.InfoWindow listeners - * @param {trackdirect.models.InfoWindow} infoWindow - */ -trackdirect.models.Map.prototype._addInfoWindowListeners = function ( - infoWindow -) { - var me = this; - infoWindow.addTdListener("station-tail-needed", function (stationId) { - me._emitTdEventListeners("station-tail-needed", stationId); - }); -}; - -/** - * Add listener to events - * @param {string} event - * @param {string} handler - */ -(trackdirect.models.Map.prototype.addTdListener = function (event, handler) { - if (!(event in this._tdEventListeners)) { - this._tdEventListeners[event] = []; - } - this._tdEventListeners[event].push(handler); -}), - /** - * Emit all event listeners for a specified event - * @param {string} event - * @param {object} arg - */ - (trackdirect.models.Map.prototype._emitTdEventListeners = function ( - event, - arg - ) { - if (event in this._tdEventListeners) { - for (var i = 0; i < this._tdEventListeners[event].length; i++) { - this._tdEventListeners[event][i](arg); - } - } - }); - -/** - * Make sure all listener that are waiting for a map change event gets called - */ -(trackdirect.models.Map.prototype._triggerMapChangeEvent = function () { - // Execute event "change", but wait some to avoid to many events - if (this._tdEventTimeout != null) { - clearTimeout(this._tdEventTimeout); - } - var me = this; - this._tdEventTimeout = window.setTimeout(function () { - me._emitTdEventListeners("change"); - me._tdEventTimeout = null; - }, 5); -}), - /** - * Deactivate heatmap - */ - (trackdirect.models.Map.prototype._deactivateHeatMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if ( - typeof this.overlayMapTypes !== "undefined" && - this.overlayMapTypes.length > 0 - ) { - this.overlayMapTypes.clear(); - } - } else if (typeof L === "object") { - if (this._heatMap !== null) { - this.removeLayer(this._heatMap); - } - } - }); - -/** - * Activate heatmap - */ -trackdirect.models.Map.prototype._activateHeatMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if ( - typeof this.overlayMapTypes !== "undefined" && - this.overlayMapTypes.length == 0 - ) { - this.overlayMapTypes.setAt(0, this._heatMap); - } - } else if (typeof L === "object") { - if (this._heatMap !== null) { - this._heatMap.addTo(this); - this._heatMap.bringToFront(); - this._heatMap.setZIndex(1000); - } - } -}; - -/** - * Update google map tile layer - */ -trackdirect.models.Map.prototype._updateGoogleMapTileLayer = function () { - this.setMapTypeId(this._supportedMapTypes[this._mapType]); -}; - -/** - * Update Leaflet Map Tile Layer - */ -trackdirect.models.Map.prototype._updateLeafletTileLayer = function () { - // Skip this part if we are running the Windy API or if embedded - if (typeof windyInit !== "function") { - if (this._leafletTileLayer !== null) { - this._leafletTileLayer.remove(); - } - - if (typeof L.mapboxGL === "function") { - var attribution = ""; - var accessToken = "no-token"; - var style = ""; - - if ("mapboxGLStyle" in this._tdMapOptions) { - style = this._tdMapOptions["mapboxGLStyle"]; - } - if ("mapboxGLAccessToken" in this._tdMapOptions) { - accessToken = this._tdMapOptions["mapboxGLAccessToken"]; - } - if ("mapboxGLAttribution" in this._tdMapOptions) { - attribution = this._tdMapOptions["mapboxGLAttribution"]; - } - - this._leafletTileLayer = L.mapboxGL({ - accessToken: accessToken, - style: style, - }); - this.addLayer(this._leafletTileLayer); - this.attributionControl.addAttribution(attribution); - } else { - var options = {}; - if (isHighDensity()) { - options["ppi"] = "320"; - options["size"] = "512"; - } else if (trackdirect.isMobile) { - options["ppi"] = "250"; - } - - this._leafletTileLayer = L.tileLayer.provider( - this._supportedMapTypes[this._mapType], - options - ); - this.addLayer(this._leafletTileLayer); - this._leafletTileLayer.bringToBack(); - } - } -}; - -/** - * Handle map change event, show markers in new map sectors and hide markers in previous map sectors - */ -trackdirect.models.Map.prototype._updateMapContent = function () { - if (this.getBounds() != null) { - var previousVisibleMapSectors = []; - for (var i = 0; i < this._visibleMapSectors.length; i++) { - previousVisibleMapSectors.push(this._visibleMapSectors[i]); - } - - this._visibleMapSectors = - trackdirect.services.MapSectorCalculator.getMapSectors(this.getBounds()); - this._triggerMapChangeEvent(); - if (!this.state.isFilterMode) { - if (this.getZoom() < trackdirect.settings.minZoomForMarkers) { - // When all markers should be hidden we also make sure that markers in current visible map-sectors are removed - this.hideAllMarkers(); - this._activateHeatMap(); - } else { - this._deactivateHeatMap(); - - this._hideMarkersInPreviousVisibleMapSectors(previousVisibleMapSectors); - this._showMarkersInNewVisibleMapSectors(previousVisibleMapSectors); - if (this._isAnyMarkerDetailsVisible()) { - this._showVisibleMarkerDetails(); - } - if (this._isAnyMarkerDetailsHidden()) { - this._hideVisibleMarkerDetails(); - } - } - } - } - this._currentContentZoom = this.getZoom(); -}; - -/** - * Returns true if any marker details should be visible - * @return {boolean} - */ -trackdirect.models.Map.prototype._isAnyMarkerDetailsVisible = function () { - // This is only needed when zooming (when moving the regular show-marker will also show the details) - var showPrevPosition = - this.getZoom() >= trackdirect.settings.minZoomForMarkerPrevPosition && - this._currentContentZoom < - trackdirect.settings.minZoomForMarkerPrevPosition; - var showMarkerTail = - this.getZoom() >= trackdirect.settings.minZoomForMarkerTail && - this._currentContentZoom < trackdirect.settings.minZoomForMarkerTail; - var showMarkerLabel = - this.getZoom() >= trackdirect.settings.minZoomForMarkerLabel && - this._currentContentZoom < trackdirect.settings.minZoomForMarkerLabel; - - if (showPrevPosition || showMarkerTail || showMarkerLabel) { - return true; - } - return false; -}; - -/** - * Returns true if any marker details should be hidden - * @return {boolean} - */ -trackdirect.models.Map.prototype._isAnyMarkerDetailsHidden = function () { - // This is only needed when zooming (when moving the regular show-marker will also show the details) - var hidePrevPosition = - this.getZoom() < trackdirect.settings.minZoomForMarkerPrevPosition && - this._currentContentZoom >= - trackdirect.settings.minZoomForMarkerPrevPosition; - var hideMarkerTail = - this.getZoom() < trackdirect.settings.minZoomForMarkerTail && - this._currentContentZoom >= trackdirect.settings.minZoomForMarkerTail; - var hideMarkerLabel = - this.getZoom() < trackdirect.settings.minZoomForMarkerLabel && - this._currentContentZoom >= trackdirect.settings.minZoomForMarkerLabel; - - if (hidePrevPosition || hideMarkerTail || hideMarkerLabel) { - return true; - } - return false; -}; - -/** - * Show markers details that should be visible in visible map sectors - */ -trackdirect.models.Map.prototype._showVisibleMarkerDetails = function () { - for (var i = 0; i < this._visibleMapSectors.length; i++) { - var mapSector = this._visibleMapSectors[i]; - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - // Array with markers fo this sector exists, we have something to show - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker === null) { - continue; - } - trackdirect.services.callbackExecutor.addWithPriority( - marker, - marker.showMarkerDetails, - [] - ); - } - } -}; - -/** - * Hide markers details that should not be visible in visible map sectors - */ -trackdirect.models.Map.prototype._hideVisibleMarkerDetails = function () { - for (var i = 0; i < this._visibleMapSectors.length; i++) { - var mapSector = this._visibleMapSectors[i]; - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - // Array with markers fo this sector exists, we have something to hide - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker === null) { - continue; - } - trackdirect.services.callbackExecutor.addWithPriority( - marker, - marker.hideMarkerDetails, - [] - ); - } - } -}; - -/** - * Show all markers that should be visible and hide alla markers that should not be visible - * This is used to show or hide markers when user activate/deactivate filters - */ -trackdirect.models.Map.prototype.showHideMarkers = function () { - if (this.oms) { - this.oms.unspiderfy(); - } - if (this.state.isFilterMode) { - for (var markerIdKey in this.markerCollection.getAllMarkers()) { - if (this.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this.markerCollection.getMarker(markerIdKey); - - if (marker) { - if (marker.shouldMarkerBeVisible()) { - marker.showCompleteMarker(); - } else { - marker.hideCompleteMarker(); - } - } - if (marker.packet) { - this.showTopLabelOnPosition( - marker.packet.latitude, - marker.packet.longitude - ); - } - } - } - } else { - for (var i = 0; i < this._visibleMapSectors.length; i++) { - var mapSector = this._visibleMapSectors[i]; - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - - // Array with markers for this sector exists, we have something to show/hide - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - - if (this.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker.shouldMarkerBeVisible()) { - marker.showCompleteMarker(); - } else { - marker.hideCompleteMarker(); - } - this.showTopLabelOnPosition( - marker.packet.latitude, - marker.packet.longitude - ); - } - } - } - } -}; - -/** - * Show or hide ALL PHG Circles - * This is used to show or hide circles when user activate/deactivate PHG circles - */ -trackdirect.models.Map.prototype.showHidePHGCircles = function () { - if (this.getZoom() >= trackdirect.settings.minZoomForMarkers) { - if (this.state.isFilterMode) { - for (var markerIdKey in this.markerCollection.getAllMarkers()) { - if (this.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this.markerCollection.getMarker(markerIdKey); - - if ( - marker.showAsMarker && - marker.packet.phg != null && - marker.getMap() !== null && - marker.shouldMarkerBeVisible() - ) { - if (this.state.showPHGCircles == 0) { - marker.hidePHGCircle(); - } else if (this.state.showPHGCircles == 1) { - marker.showPHGCircle(true); - } else if (this.state.showPHGCircles == 2) { - marker.showPHGCircle(false); - } - } - } - } - } else { - for (var i = 0; i < this._visibleMapSectors.length; i++) { - var mapSector = this._visibleMapSectors[i]; - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - // Array with markers for this sector exists, we have something to show/hide - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - - if (this.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this.markerCollection.getMarker(markerIdKey); - - if ( - marker.showAsMarker && - marker.packet.phg != null && - marker.getMap() !== null && - marker.shouldMarkerBeVisible() - ) { - if (this.state.showPHGCircles == 0) { - marker.hidePHGCircle(); - } else if (this.state.showPHGCircles == 1) { - marker.showPHGCircle(true); - } else if (this.state.showPHGCircles == 2) { - marker.showPHGCircle(false); - } - } - } - } - } - } - } -}; - -/** - * Show or hide ALL RNG Circles - * This is used to show or hide circles when user activate/deactivate PHG circles - */ -trackdirect.models.Map.prototype.showHideRNGCircles = function () { - if (this.getZoom() >= trackdirect.settings.minZoomForMarkers) { - if (this.state.isFilterMode) { - for (var markerIdKey in this.markerCollection.getAllMarkers()) { - if (this.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this.markerCollection.getMarker(markerIdKey); - if ( - marker.showAsMarker && - marker.packet.rng != null && - marker.getMap() !== null && - marker.shouldMarkerBeVisible() - ) { - if (this.state.showRNGCircles == 0) { - marker.hideRNGCircle(); - } else if (this.state.showRNGCircles == 1) { - marker.showRNGCircle(true); - } else if (this.state.showRNGCircles == 2) { - marker.showRNGCircle(false); - } - } - } - } - } else { - for (var i = 0; i < this._visibleMapSectors.length; i++) { - var mapSector = this._visibleMapSectors[i]; - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - // Array with markers for this sector exists, we have something to show/hide - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - - if (this.markerCollection.isExistingMarker(markerIdKey)) { - var marker = this.markerCollection.getMarker(markerIdKey); - if ( - marker.showAsMarker && - marker.packet.rng != null && - marker.getMap() !== null && - marker.shouldMarkerBeVisible() - ) { - if (this.state.showRNGCircles == 0) { - marker.hideRNGCircle(); - } else if (this.state.showRNGCircles == 1) { - marker.showRNGCircle(true); - } else if (this.state.showRNGCircles == 2) { - marker.showRNGCircle(false); - } - } - } - } - } - } - } -}; - -/** - * Make sure that all markers that we know is hidden - */ -trackdirect.models.Map.prototype.hideAllMarkers = function () { - for (var markerIdKey in this.markerCollection.getAllMarkers()) { - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - // hide this marker - marker.hideCompleteMarker(); - } - } -}; - -/** - * Make the label of the latest received marker show on specified position - * @param {number} latitude - * @param {number} longitude - */ -trackdirect.models.Map.prototype.showTopLabelOnPosition = function ( - latitude, - longitude -) { - var topMarkerIdKey = -1; - var topMarkerZindex = 0; - - if ( - Object.keys( - this.markerCollection.getPositionMarkerIdKeys(latitude, longitude) - ).length > 1 - ) { - for (var markerIdKey in this.markerCollection.getPositionMarkerIdKeys( - latitude, - longitude - )) { - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker !== null && marker.shouldMarkerBeVisible()) { - if (marker.getZIndex() > topMarkerZindex) { - topMarkerZindex = marker.getZIndex(); - topMarkerIdKey = markerIdKey; - } - marker.hideLabel(); - marker.hasLabel = false; - } - } - - if (topMarkerIdKey != -1) { - var topMarker = this.markerCollection.getMarker(topMarkerIdKey); - topMarker.hasLabel = true; - var topMarkerMapSector = - trackdirect.services.MapSectorCalculator.getMapSector( - topMarker.getPositionLiteral().lat, - topMarker.getPositionLiteral().lng - ); - if (this.state.isFilterMode) { - topMarker.showLabel(); - } else if ( - this.isMapSectorVisible(topMarkerMapSector) && - this.getZoom() >= trackdirect.settings.minZoomForMarkerLabel - ) { - topMarker.showLabel(); - } - } - } -}; - -/** - * Hide markers in previously visible map sectors - * (This should handle both zooming and moving) - * @param {array} previousVisibleMapSectors - */ -trackdirect.models.Map.prototype._hideMarkersInPreviousVisibleMapSectors = - function (previousVisibleMapSectors) { - // IMPORTANT: Do this before showing marker since marker may exist in both previus shown sectors and visible sectors - // (if we show first we may hide something that should be visible) - - if (this._currentContentZoom >= trackdirect.settings.minZoomForMarkers) { - var markerIdKeyListToMaybeHide = {}; - var markerIdKeyListNotToHide = {}; - for (var i = 0; i < previousVisibleMapSectors.length; i++) { - var mapSector = previousVisibleMapSectors[i]; - if ( - !this.isMapSectorVisible(mapSector) || - this.getZoom() < trackdirect.settings.minZoomForMarkers - ) { - // Seems like this sector is not visible any more (or we have zoomed out), hide markers - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - markerIdKeyListToMaybeHide[markerIdKey] = markerIdKey; - } - } else if (this.getZoom() >= trackdirect.settings.minZoomForMarkers) { - // Seems like this map sector is still visible (and we have not zoomed out) - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - // Marker exists in map sector that is still visible, do not hide it - markerIdKeyListNotToHide[markerIdKey] = markerIdKey; - } - } - } - for (var markerIdKey in markerIdKeyListToMaybeHide) { - if (markerIdKey in markerIdKeyListNotToHide) { - continue; - } - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - // hide this marker - trackdirect.services.callbackExecutor.addWithPriority( - marker, - marker.hideCompleteMarker, - [] - ); - } - } - } - }; - -/** - * Show markers in new visible map sectors - * @param {array} previousVisibleMapSectors - */ -trackdirect.models.Map.prototype._showMarkersInNewVisibleMapSectors = function ( - previousVisibleMapSectors -) { - // Show new markers that is visible in new map sectors - // This should handle both zooming and moving - - if (this.getZoom() >= trackdirect.settings.minZoomForMarkers) { - for (var i = 0; i < this._visibleMapSectors.length; i++) { - var mapSector = this._visibleMapSectors[i]; - if ( - previousVisibleMapSectors.indexOf(mapSector) == -1 || - this._currentContentZoom < trackdirect.settings.minZoomForMarkers - ) { - // Seems like this sector is new (or we have zoomed in now), show markers - var mapSectorMarkerKeys = - this.markerCollection.getMapSectorMarkerKeys(mapSector); - for (var j = 0; j < mapSectorMarkerKeys.length; j++) { - var markerIdKey = mapSectorMarkerKeys[j]; - var marker = this.markerCollection.getMarker(markerIdKey); - if (marker !== null) { - trackdirect.services.callbackExecutor.addWithPriority( - marker, - marker.showCompleteMarker, - [] - ); - } - } - } - } - - // Also make sure all stations with a visible coverage is shown - var stationIdList = - this.markerCollection.getStationIdListWithVisibleCoverage(); - for (var i = 0; i < stationIdList.length; i++) { - var latestMarker = this.markerCollection.getStationLatestMarker( - stationIdList[i] - ); - if (latestMarker !== null) { - if (latestMarker.shouldMarkerBeVisible() && latestMarker.showAsMarker) { - latestMarker.show(); - } - } - } - } -}; - -/** - * Set map initial position - */ -trackdirect.models.Map.prototype._setMapInitialLocation = function () { - var zoom = this._getInitialZoom(); - if ( - typeof this._tdMapOptions.initCenter !== "undefined" && - this._tdMapOptions.initCenter !== null - ) { - var pos = this._tdMapOptions.initCenter; - this.setCenter(pos, zoom); - } else { - this.setMapDefaultLocation(); - this.setZoom(zoom); - } - this._emitTdEventListeners("change"); -}; - -/** - * Set map default location - */ -trackdirect.models.Map.prototype.setMapDefaultLocation = function ( - setDefaultZoom -) { - setDefaultZoom = - typeof setDefaultZoom !== "undefined" ? setDefaultZoom : false; - - var defaultLatitude = - typeof this._tdMapOptions.defaultLatitude !== "undefined" - ? this._tdMapOptions.defaultLatitude - : 59.35; - var defaultLongitude = - typeof this._tdMapOptions.defaultLongitude !== "undefined" - ? this._tdMapOptions.defaultLongitude - : 18.05; - - var pos = { - lat: parseFloat(defaultLatitude), - lng: parseFloat(defaultLongitude), - }; - - if (setDefaultZoom) { - if (trackdirect.isMobile) { - this.setCenter(pos, trackdirect.settings.defaultCurrentZoomMobile); - } else { - this.setCenter(pos, trackdirect.settings.defaultCurrentZoom); - } - } else { - this.setCenter(pos); - } -}; - -/** - * Add marker to multiple Map-Sectors, useful for very long polylines related to a marker - * @param {int} markerIdKey - * @param {LatLngLiteral} startLatLng - * @param {LatLngLiteral} endLatLng - */ -trackdirect.models.Map.prototype.addMarkerToMapSectorInterval = function ( - markerIdKey, - startLatLng, - endLatLng -) { - var minLat = startLatLng.lat; - var maxLat = endLatLng.lat; - var minLng = startLatLng.lng; - var maxLng = endLatLng.lng; - if (endLatLng.lat < minLat) { - minLat = endLatLng.lat; - maxLat = startLatLng.lat; - } - if (endLatLng.lng < minLng) { - minLng = endLatLng.lng; - maxLng = startLatLng.lng; - } - for (var lat = Math.floor(minLat); lat <= Math.ceil(maxLat); lat++) { - for (var lng = Math.floor(minLng); lng <= Math.ceil(maxLng); lng++) { - var markerMapSector = - trackdirect.services.MapSectorCalculator.getMapSector(lat, lng); - - this.markerCollection.addMarkerToMapSector(markerIdKey, markerMapSector); - - if (this.isMapSectorVisible(markerMapSector)) { - if (this._newMarkersToShow.indexOf(markerIdKey) < 0) { - this._newMarkersToShow.push(markerIdKey); - } - } - } - } -}; - -/** - * Add marker the related map sector based in latest packet - * @param {int} markerIdKey - * @param {object} packet - * @param {boolean} tryToShowPacket - */ -trackdirect.models.Map.prototype.addMarkerToMapSectors = function ( - markerIdKey, - packet, - tryToShowPacket -) { - var markerMapSectors = []; - - markerMapSectors.push(packet.map_sector); - if ( - typeof packet.related_map_sectors !== "undefined" && - packet.related_map_sectors !== null - ) { - for (var i = 0; i < packet.related_map_sectors.length; i++) { - markerMapSectors.push(packet.related_map_sectors[i]); - } - } - - for (var i = 0; i < markerMapSectors.length; i++) { - var markerMapSector = markerMapSectors[i]; - this.markerCollection.addMarkerToMapSector(markerIdKey, markerMapSector); - - if (tryToShowPacket) { - if (this.isMapSectorVisible(markerMapSector)) { - if (this._newMarkersToShow.indexOf(markerIdKey) < 0) { - this._newMarkersToShow.push(markerIdKey); - } - } - } - } -}; - -/** - * Initialize map basic events - */ -trackdirect.models.Map.prototype._initMapEvents = function () { - if (typeof google === "object" && typeof google.maps === "object") { - this._initGoogleMapEvents(); - } else if (typeof L === "object") { - this._initLeafletMapEvents(); - } -}; - -/** - * Initialize google map basic events - */ -trackdirect.models.Map.prototype._initGoogleMapEvents = function () { - var me = this; - google.maps.event.addListener(this, "mousemove", function (event) { - me._renderCordinatesContainer(event.latLng); - }); - - google.maps.event.addListener(this, "idle", function () { - me._updateMapContent(); - }); - - google.maps.event.addListener(this, "maptypeid_changed", function () { - me._updateMapContent(); - }); - - google.maps.event.addListener(this, "bounds_changed", function () { - if (me.isMapReady()) { - me._emitTdEventListeners("moving"); - } - }); -}; - -/** - * Initialize leaflet map basic events - */ -trackdirect.models.Map.prototype._initLeafletMapEvents = function () { - var me = this; - this.on("mousemove", function (event) { - me._renderCordinatesContainer(event.latlng); - }); - - this.on("moveend", function () { - me._updateMapContent(); - }); - /* - this.on('maptypeid_changed', function() { - me._updateMapContent(); - }); -*/ - this.on("move", function () { - if (me.isMapReady()) { - me._emitTdEventListeners("moving"); - } - }); -}; - -/** - * Initialize OMS - */ -trackdirect.models.Map.prototype._initOms = function () { - var options = {}; - options["nearbyDistance"] = 12; - if (typeof google === "object" && typeof google.maps === "object") { - var mti = google.maps.MapTypeId; - this.oms = new OverlappingMarkerSpiderfier(this, options); - this.oms.legColors.usual[mti.HYBRID] = this.oms.legColors.usual[ - mti.SATELLITE - ] = "#fff"; - this.oms.legColors.usual[mti.TERRAIN] = this.oms.legColors.usual[ - mti.ROADMAP - ] = "#222"; - this.oms.legColors.highlighted[mti.HYBRID] = this.oms.legColors.highlighted[ - mti.SATELLITE - ] = "#f00"; - this.oms.legColors.highlighted[mti.TERRAIN] = - this.oms.legColors.highlighted[mti.ROADMAP] = "#f00"; - } else if (typeof L === "object") { - this.oms = new OverlappingMarkerSpiderfier(this, options); - } -}; - -/** - * Initialize info window for markers - */ -trackdirect.models.Map.prototype._initInfoWindowEvent = function () { - var me = this; - if (this.oms) { - this.oms.addListener("click", function (marker, event) { - me.openMarkerInfoWindow(marker, false); - }); - } else { - } -}; - -/** - * Get default google "map options", used for initializing google map - * @return {object} - */ -trackdirect.models.Map.prototype._getGoolgeMapOptions = function () { - var zoom = this._getInitialZoom(); - var mapOptions = { - zoom: zoom, - panControl: false, - zoomControl: true, - zoomControlOptions: { - position: google.maps.ControlPosition.RIGHT_BOTTOM, - }, - mapTypeControl: false, - scaleControl: false, - streetViewControl: false, - overviewMapControl: false, - fullscreenControl: false, - mapTypeId: google.maps.MapTypeId.ROADMAP, - gestureHandling: "greedy", - }; - - mapOptions.mapTypeId = this._supportedMapTypes[this._mapType]; - return mapOptions; -}; - -/** - * Get default leaflet "map options", used for initializing google map - * @return {object} - */ -trackdirect.models.Map.prototype._getLeafletMapOptions = function () { - var zoom = this._getInitialZoom(); - var mapOptions = { - zoom: zoom, - zoomControl: true, - attributionControl: true, - zoomControl: false, - minZoom: 3, - maxZoom: 16, - closePopupOnClick: false, - }; - - return mapOptions; -}; - -/** - * Get initial zoom - * @return {int} - */ -trackdirect.models.Map.prototype._getInitialZoom = function () { - var zoom = trackdirect.settings.defaultCurrentZoom; - if ( - typeof this._tdMapOptions.zoom !== "undefined" && - this._tdMapOptions.zoom !== null - ) { - zoom = parseInt(this._tdMapOptions.zoom); - } else if (trackdirect.isMobile) { - zoom = trackdirect.settings.defaultCurrentZoomMobile; - } - - return zoom; -}; - -/** - * Get radius in Km (radius is from center of current map view to the most north east position) - * @return {int} - */ -trackdirect.models.Map.prototype.getCurrentRadiusInKm = function () { - if (this.getBounds() != null) { - if (typeof google === "object" && typeof google.maps === "object") { - var latLng = this.getBounds().getNorthEast(); - var latLngLiteral = { lat: latLng.lat(), lng: latLng.lng() }; - } else if (typeof L === "object") { - var latLng = this.getBounds().getNorthEast(); - var latLngLiteral = { lat: latLng.lat, lng: latLng.lng }; - } - return ( - trackdirect.services.distanceCalculator.getDistance( - this.getCenterLiteral(), - latLngLiteral - ) / 1000 - ); - } - return 0; -}; - -/** - * Print position in the cordinates container - * @return {google.maps.LatLng/L.LatLng/LatLngLiteral} mouseLatLng - */ -trackdirect.models.Map.prototype._renderCordinatesContainer = function ( - mouseLatLng -) { - var options = this.getTdMapOptions(); - if (typeof options.cordinatesContainer === "undefined") { - return; - } - if (options.cordinatesContainer == null) { - return; - } - - var lat = null; - var lng = null; - if (typeof mouseLatLng.lat == "function") { - lat = mouseLatLng.lat(); - lng = mouseLatLng.lng(); - } else { - lat = mouseLatLng.lat; - lng = mouseLatLng.lng; - } - - if (lat <= 90 && lat >= -90 && lng <= 180 && lng >= -180) { - var content = ""; - content += this._getGpsDegreeFromGpsDecimal(lat.toFixed(5), "lat"); - content += " " + this._getGpsDegreeFromGpsDecimal(lng.toFixed(5), "lon"); - content += "<br>" + lat.toFixed(5) + ", " + lng.toFixed(5); - content += "<br>" + this._getMaidenheadLocatorFromGpsDecimal(lat, lng); - - $("#" + options.cordinatesContainer).html(content); - } -}; - -/** - * Convert decimal gps position to degree format - * @param {float} dms - * @param {string} type - * @return {string} - */ -trackdirect.models.Map.prototype._getGpsDegreeFromGpsDecimal = function ( - dms, - type -) { - var sign = 1, - Abs = 0; - var days, minutes, secounds, direction; - - if (dms < 0) { - sign = -1; - } - Abs = Math.abs(Math.round(dms * 1000000)); - //Math.round is used to eliminate the small error caused by rounding in the computer: - //e.g. 0.2 is not the same as 0.20000000000284 - //Error checks - if (type == "lat" && Abs > 90 * 1000000) { - //alert(" Degrees Latitude must be in the range of -90. to 90. "); - return false; - } else if (type == "lon" && Abs > 180 * 1000000) { - //alert(" Degrees Longitude must be in the range of -180 to 180. "); - return false; - } - - days = Math.floor(Abs / 1000000); - minutes = Math.floor((Abs / 1000000 - days) * 60); - secounds = ( - (Math.floor(((Abs / 1000000 - days) * 60 - minutes) * 100000) * 60) / - 100000 - ).toFixed(); - days = days * sign; - if (type == "lat") direction = days < 0 ? "S" : "N"; - if (type == "lon") direction = days < 0 ? "W" : "E"; - //else return value - return days * sign + "º " + minutes + "' " + secounds + "'' " + direction; -}; - -/** - * Convert decimal gps position to maidenhead locator - * @param {float} lat - * @param {float} lng - * @return {string} - */ -trackdirect.models.Map.prototype._getMaidenheadLocatorFromGpsDecimal = function ( - lat, - lng, -) { - const chars = 'ABCDEFGHIJKLMNOPQRSTUVX'; - var result = ''; - lng = lng + 180; - lat = lat + 90; - result = chars.charAt(parseInt(lng / 20)); - result += chars.charAt(parseInt(lat / 10)); - result += parseInt(lng / 2 % 10); - result += parseInt(lat % 10); - lng_r = (lng - parseInt(lng/2)*2) * 60; - lat_r = (lat - parseInt(lat)) * 60; - result += chars.charAt(parseInt(lng_r/5)); - result += chars.charAt(parseInt(lat_r/2.5)); - return result; -}; diff --git a/jslib/src/trackdirect/models/MapState.js b/jslib/src/trackdirect/models/MapState.js deleted file mode 100755 index 418cbd5760d143d1d703556553f062eb7bfb2205..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/MapState.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Class trackdirect.models.MapState - */ -trackdirect.models.MapState = function () { - this._init(); -}; - -/** - * Init object - */ -trackdirect.models.MapState.prototype._init = function () { - // Filtering on stations - this.isFilterMode = false; - this.filterStationIds = []; - - // Booleans that controls what is visible - this.isGhostMarkersVisible = false; - this.isCwopMarkersVisible = true; - this.isStationaryMarkersVisible = true; - this.isInternetMarkersVisible = true; - this.isUnknownMarkersVisible = true; - this.isOgflymMarkersVisible = true; - - // Array of vissible symbols (each value is an array with two values) - this.visibleSymbols = []; - - /// Imperial och Metric - this.useImperialUnit = false; - - // Show PHG and RNG circles? - this.showPHGCircles = 0; - this.showRNGCircles = 0; - - // Tracking - this.trackStationId = null; - this.onlyTrackRecentPackets = false; - - this.timeLengthInSeconds = 3600; - this.endTimeTravelTimestamp = null; - - // Z-index counter - this.currentMarkerZindex = 200; - - // Diff between client and server unix timestamp - this.serverClientTimestampDiff = 0; - - // Currently open trackdirect.models.InfoWindow - this.openInfoWindow = null; - - // markerIdKey to open info window for as soon as possible - this.openInfoWindowForMarkerIdKey = null; -}; - -/** - * Returns the currently oldest allowed packet timestamp - * @return int - */ -trackdirect.models.MapState.prototype.getOldestAllowedPacketTimestamp = - function () { - var oldestAllowedTimestamp = - Math.floor(Date.now() / 1000) - this.timeLengthInSeconds; - if (this.endTimeTravelTimestamp !== null) { - oldestAllowedTimestamp = - this.endTimeTravelTimestamp - this.timeLengthInSeconds; - } - return oldestAllowedTimestamp; - }; - -/** - * Set the time length currently used, how old a packet may be (in seconds) - * @param {int} seconds - */ -trackdirect.models.MapState.prototype.setTimeLength = function (seconds) { - this.timeLengthInSeconds = seconds; -}; - -/** - * Returns the time length currently used, how old a packet may be (in seconds) - * @return {int} - */ -trackdirect.models.MapState.prototype.getTimeLength = function () { - return this.timeLengthInSeconds; -}; - -/** - * Get client timestamp based on server timestamp - * @param {int} serverTimestamp - * @return {int} - */ -trackdirect.models.MapState.prototype.getClientTimestamp = function ( - serverTimestamp -) { - return serverTimestamp - this.serverClientTimestampDiff; -}; - -/** - * Set normal performance by not forcing user to zoom more for details - * @param {int} serverTimestamp - */ -trackdirect.models.MapState.prototype.setServerCurrentTimestamp = function ( - serverTimestamp -) { - this.serverClientTimestampDiff = - serverTimestamp - Math.floor(Date.now() / 1000); -}; - -/** - * Is info window open - */ -trackdirect.models.MapState.prototype.isInfoWindowOpen = function () { - if (this.openInfoWindow === null) { - return false; - } - return this.openInfoWindow.isInfoWindowOpen(); -}; - -/** - * Is info window open for specified marker - * @param {trackdirect.models.Marker} marker - */ -trackdirect.models.MapState.prototype.isMarkerInfoWindowOpen = function ( - marker -) { - if (!this.isInfoWindowOpen()) { - return false; - } - - if (this.openInfoWindow.getPolyline() !== null) { - return false; - } - - if (this.openInfoWindow.getMarker() === marker) { - return true; - } - - return false; -}; - -/** - * Is info window open for specified polyline - * @param {google.maps.Polyline} polyline - */ -trackdirect.models.MapState.prototype.isPolylineInfoWindowOpen = function ( - polyline -) { - if (!this.isInfoWindowOpen()) { - return false; - } - - if (this.openInfoWindow.getPolyline() === null) { - return false; - } - - if (this.openInfoWindow.getPolyline() === polyline) { - return true; - } - - return false; -}; - -/** - * Returns an array of stationIds that we are fitlering on - * @return {array} - */ -trackdirect.models.MapState.prototype.getFilterStationIds = function () { - return this.filterStationIds; -}; - -/** - * get track station - * @return {int} - */ -trackdirect.models.MapState.prototype.getTrackStationId = function () { - return this.trackStationId; -}; diff --git a/jslib/src/trackdirect/models/Marker.js b/jslib/src/trackdirect/models/Marker.js deleted file mode 100755 index 1b2c254d58d224dd166a2d3f2d2d3793bd019844..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/Marker.js +++ /dev/null @@ -1,1471 +0,0 @@ -/** - * Class trackdirect.models.Marker - * @see https://developers.google.com/maps/documentation/javascript/reference#Marker - * @param {trackdirect.models.Packet} packet - * @param {boolean} isDotMarker - * @param {trackdirect.models.Map} map - */ -trackdirect.models.Marker = function (packet, isDotMarker, map) { - this.packet = packet; - this._isDotMarker = isDotMarker; - this._defaultMap = map; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Marker.call(this, this._getGoogleMarkerOptions()); - } else if (typeof L === "object") { - L.Marker.call( - this, - this.packet.getLatLngLiteral(), - this._getLeafletMarkerOptions() - ); - } - - this._init(); - if (typeof google === "object" && typeof google.maps === "object") { - this.setMap(null); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.Marker.prototype = Object.create( - google.maps.Marker.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.Marker.prototype = Object.create(L.Marker.prototype); -} -trackdirect.models.Marker.prototype.constructor = trackdirect.models.Marker; - -/** - * Init object - */ -trackdirect.models.Marker.prototype._init = function () { - // Init variables - this._tdEventListeners = {}; - - this.hasLabel = false; - this.showAsMarker = false; - this.overwrite = false; - - this.markerIdKey = null; - this.label = null; - - this.transmitPolyLine = null; - this.directionPolyLine = null; - - this.phgCircle = null; - this.rngCircle = null; - - this.hideTimerId = null; - this.toOldTimerId = null; - - if (!this._isDotMarker) { - this.showAsMarker = true; - if ( - this.packet.map_id != 1 && - this.packet.map_id != 2 && - this.packet.map_id != 12 - ) { - // Ghost marker! - this.setOpacity(0.5); - } else { - this.hasLabel = true; - } - } - - if (this._defaultMap.state.endTimeTravelTimestamp === null) { - this._addMarkerToOldTimeout(0); - } - this._addMarkerTooltip(); -}; - -/** - * Add listener to events - * @param {string} event - * @param {string} handler - */ -trackdirect.models.Marker.prototype.addTdListener = function (event, handler) { - if (!(event in this._tdEventListeners)) { - this._tdEventListeners[event] = []; - } - this._tdEventListeners[event].push(handler); -}; - -/** - * Returns true if marker is of type "dot-marker" - */ -trackdirect.models.Marker.prototype.isDotMarker = function () { - return this._isDotMarker; -}; - -/** - * Returns true if marker is visible - * @return {boolean} - */ -trackdirect.models.Marker.prototype.isVisible = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() !== "undefined" && this.getMap() !== null) { - return true; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return true; - } - } - return false; -}; - -/** - * Get position literal - * @return {LatLngLiteral} - */ -trackdirect.models.Marker.prototype.getPositionLiteral = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var latLng = this.getPosition(); - if (typeof latLng !== "undefined" && typeof latLng.lat === "function") { - return { lat: latLng.lat(), lng: latLng.lng() }; - } else { - return latLng; - } - } else if (typeof L === "object") { - var latLng = this.getLatLng(); - if (typeof latLng !== "undefined") { - return { lat: latLng.lat, lng: latLng.lng }; - } else { - return latLng; - } - } - return {}; -}; - -/** - * Show marker on default map - */ -trackdirect.models.Marker.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } - - if (this.hideTimerId !== null) { - clearTimeout(this.hideTimerId); - } - - this._emitTdEventListeners("onshow"); -}; - -/** - * Hide marker - * @param {int} delayInMilliSeconds - * @param {boolean} onlyHideIfNeeded - */ -trackdirect.models.Marker.prototype.hide = function ( - delayInMilliSeconds, - onlyHideIfNeeded, - hideOpenInfoWindow -) { - delayInMilliSeconds = - typeof delayInMilliSeconds !== "undefined" ? delayInMilliSeconds : 0; - onlyHideIfNeeded = - typeof onlyHideIfNeeded !== "undefined" ? onlyHideIfNeeded : false; - hideOpenInfoWindow = - typeof hideOpenInfoWindow !== "undefined" ? hideOpenInfoWindow : true; - - if (delayInMilliSeconds > 0) { - this._hideLater(delayInMilliSeconds, onlyHideIfNeeded); - return; - } - - if (onlyHideIfNeeded && this.shouldMarkerBeVisible()) { - return; - } - - if ( - hideOpenInfoWindow && - this._defaultMap.state.isMarkerInfoWindowOpen(this) - ) { - this._defaultMap.state.openInfoWindow.hide(); - } - - if (this.isVisible()) { - if (typeof google === "object" && typeof google.maps === "object") { - this.setMap(null); - } else if (typeof L === "object") { - this._defaultMap.removeLayer(this); - } - } - - if (this.showAsMarker) { - this.hideLabel(); - } - - this.hidePHGCircle(); - this.hideRNGCircle(); - - if (this.hideTimerId !== null) { - clearTimeout(this.hideTimerId); - } - - this._emitTdEventListeners("onhide"); -}; - -/** - * get Marker default Map - * @return {trackdirect.models} - */ -trackdirect.models.Marker.prototype.getDefaultMap = function () { - return this._defaultMap; -}; - -/** - * get Marker currently active Map - * @return {trackdirect.models} - */ -trackdirect.models.Marker.prototype.getMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var map = google.maps.Marker.prototype.getMap.call(this); - if (typeof map !== "undefined") { - return map; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return this._defaultMap; - } - } - return null; -}; - -/** - * get Marker Map State - * @return {trackdirect.models.MapState} - */ -trackdirect.models.Marker.prototype.getState = function () { - return this._defaultMap.state; -}; - -/** - * get Marker zIndex - * @return {int} - */ -trackdirect.models.Marker.prototype.getZIndex = function () { - if (typeof google === "object" && typeof google.maps === "object") { - return this.zIndex; - } else if (typeof L === "object") { - return this.options.zIndexOffset; - } - return 0; -}; - -/** - * Show marker including all realted that should be visible at current zoom level - */ -trackdirect.models.Marker.prototype.showCompleteMarker = function () { - // In filter-mode we only show stations that we filter on - if ( - this._defaultMap.state.isFilterMode && - this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id) == -1 - ) { - return; - } - - // We check that marker is not to old (if we are filtering we show station latest marker even if it is to old) - if (this.shouldMarkerBeVisible()) { - if (this.showAsMarker) { - this.show(); - } - - if (this._defaultMap.state.isFilterMode) { - this.showMarkerPrevPosition(); - this.showMarkerTail(); - this.showLabel(); - } else { - if ( - this._defaultMap.getZoom() >= - trackdirect.settings.minZoomForMarkerPrevPosition - ) { - // If we also should show details, do it - this.showMarkerPrevPosition(); - } - if ( - this._defaultMap.getZoom() >= trackdirect.settings.minZoomForMarkerTail - ) { - // If we also should show tail, do it - this.showMarkerTail(); - } - if ( - this._defaultMap.getZoom() >= trackdirect.settings.minZoomForMarkerLabel - ) { - // If we also should show label, do it - this.showLabel(); - } - } - - if (this._defaultMap.state.showPHGCircles == 1) { - this.showPHGCircle(true); - } else if (this._defaultMap.state.showPHGCircles == 2) { - this.showPHGCircle(false); - } - - if (this._defaultMap.state.showRNGCircles == 1) { - this._showRNGCircle(true); - } else if (this._defaultMap.state.showRNGCircles == 2) { - this._showRNGCircle(false); - } - } -}; - -/** - * Hide marker including all related - */ -trackdirect.models.Marker.prototype.hideCompleteMarker = function () { - this.hide(); - - // If markers is hidden also the details should be - this.hideMarkerPrevPosition(); - this.hideMarkerTail(); -}; - -/** - * Show markers details that should be visible - */ -trackdirect.models.Marker.prototype.showMarkerDetails = function () { - if ( - this._defaultMap.getZoom() >= - trackdirect.settings.minZoomForMarkerPrevPosition - ) { - // If we also should show details, do it - this.showMarkerPrevPosition(); - } - - if (this._defaultMap.getZoom() >= trackdirect.settings.minZoomForMarkerTail) { - // If we also should show details, do it - this.showMarkerTail(); - } - - if ( - this._defaultMap.getZoom() >= trackdirect.settings.minZoomForMarkerLabel - ) { - // If we also should show label, do it - this.showLabel(); - } -}; - -/** - * Hide markers details that should not be visible - */ -trackdirect.models.Marker.prototype.hideMarkerDetails = function () { - if ( - this._defaultMap.getZoom() < - trackdirect.settings.minZoomForMarkerPrevPosition - ) { - this.hideMarkerPrevPosition(); - } - - if (this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkerTail) { - this.hideMarkerTail(); - } - - if (this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkerLabel) { - this.hideLabel(); - } -}; - -/** - * Show marker label - */ -trackdirect.models.Marker.prototype.showLabel = function () { - if ( - !this._defaultMap.state.isFilterMode || - this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id) > -1 - ) { - if ( - this.isVisible() && - this.label !== null && - (this._defaultMap.getZoom() >= - trackdirect.settings.minZoomForMarkerLabel || - this._defaultMap.state.filterStationIds.indexOf( - this.packet.station_id - ) > -1) && - this.hasLabel && - this.packet.hasConfirmedMapId() - ) { - this.label.show(); - } - } -}; - -/** - * Hide marker label - */ -trackdirect.models.Marker.prototype.hideLabel = function () { - if (this.label !== null && this.hasLabel) { - this.label.hide(); - } -}; - -/** - * Show marker previous positions (the dot markers) - */ -trackdirect.models.Marker.prototype.showMarkerPrevPosition = function () { - if (this.shouldMarkerBeVisible() && this.packet.hasConfirmedMapId()) { - // Handle the history dots - - var oldestAllowedPacketTimestamp = - this._defaultMap.state.getOldestAllowedPacketTimestamp(); - var dotMarkers = this._defaultMap.markerCollection.getDotMarkers( - this.markerIdKey - ); - for (var i = 0; i < dotMarkers.length; i++) { - var dotMarker = dotMarkers[i]; - - // Only show prev positions that is not to old (not even prev positions for filtered stations) - if ( - this._defaultMap.state.getClientTimestamp(dotMarker.packet.timestamp) > - oldestAllowedPacketTimestamp - ) { - dotMarker.show(); - } - } - - // Handle markers that still is marker but shown as dotmarker (this happens when a newer marker exists) - if (!this.showAsMarker) { - this.show(); - } - } -}; - -/** - * Hide marker previous positions (the dot markers) - */ -trackdirect.models.Marker.prototype.hideMarkerPrevPosition = function () { - if (this.packet.hasConfirmedMapId()) { - // Handle the history dots - var dotMarkers = this._defaultMap.markerCollection.getDotMarkers( - this.markerIdKey - ); - for (var i = 0; i < dotMarkers.length; i++) { - var dotMarker = dotMarkers[i]; - dotMarker.hide(); - } - - if (!this.showAsMarker) { - // Handle markers that still is marker but shown as dotmarker (this happens when a newer packet with another markerId exists) - this.hide(); - } - } -}; - -/** - * Show marker tail (the polyline) - */ -trackdirect.models.Marker.prototype.showMarkerTail = function () { - if (this.shouldMarkerBeVisible()) { - if ( - this.packet.hasConfirmedMapId() === false && - this._defaultMap.state.showGhostPosition - ) { - // Ghost markers is calculated as tail - this.show(); - } - - // Handle polylines - if ( - this._defaultMap.markerCollection.hasPolyline(this.markerIdKey) && - this.packet.hasConfirmedMapId() - ) { - var polyline = this._defaultMap.markerCollection.getMarkerPolyline( - this.markerIdKey - ); - // Before we show polyline we remove all points that is to old - while ( - this._defaultMap.state.getClientTimestamp( - polyline.getPathItem(0).marker.packet.timestamp - ) < this._defaultMap.state.getOldestAllowedPacketTimestamp() - ) { - var relatedMarker = polyline.getPathItem(0).marker; - if (relatedMarker.getMap() === null) { - // related marker is to old and is not visible, it will never be shown. - // We let the regular remove-functionality remove the marker - polyline.removePathItem(0); - } else { - break; - } - } - polyline.show(); - } - - // Handle dashed polylines - var dashedPolyline = - this._defaultMap.markerCollection.getMarkerDashedPolyline( - this.markerIdKey - ); - if (dashedPolyline !== null && this.packet.hasConfirmedMapId()) { - // The related marker is the marker where the dashed polyline STARTS - var dashedPolyLineRelatedMarker = - this._defaultMap.markerCollection.getMarker( - dashedPolyline.relatedMarkerIdKey - ); - - // Validate that the related marker is shown or will be shown before showing dashed polyline - // Since related marker is older than current we never need to show it if it is to old (not even when we are filtering) - if ( - this._defaultMap.state.getClientTimestamp( - dashedPolyLineRelatedMarker.packet.timestamp - ) > this._defaultMap.state.getOldestAllowedPacketTimestamp() - ) { - dashedPolyline.show(); - - if (typeof dashedPolyline.relatedMarkerIdKey !== "undefined") { - var relatedMarker = this._defaultMap.markerCollection.getMarker( - dashedPolyline.relatedMarkerIdKey - ); - if ( - relatedMarker !== null && - relatedMarker.markerIdKey !== this.markerIdKey - ) { - relatedMarker.showMarkerTail(); - } - } - } - } - - // Handle direction polyline - if (this.directionPolyLine !== null) { - this.directionPolyLine.show(); - } - } -}; - -/** - * Hide marker tail (the polyline) - * @param {int} markerIdKey - */ -trackdirect.models.Marker.prototype.hideMarkerTail = function (markerIdKey) { - var latestMarker = this._defaultMap.markerCollection.getStationLatestMarker( - this.packet.station_id - ); - if ( - this._defaultMap.state.isMarkerInfoWindowOpen(this) || - this._defaultMap.state.isMarkerInfoWindowOpen(latestMarker) - ) { - // do not hide if info window is open - return; - } - - if ( - this.packet.map_id != 1 && - this.packet.map_id != 2 && - this.packet.map_id != 12 - ) { - // Ghost markers is calculated as tail - this.hide(); - if (this.showAsMarker) { - this.hideLabel(); - } - } - - // Handle polylines - var polyline = this._defaultMap.markerCollection.getMarkerPolyline( - this.markerIdKey - ); - if (polyline !== null) { - if (this._defaultMap.state.isPolylineInfoWindowOpen(polyline)) { - this._defaultMap.state.openInfoWindow.hide(); - } - - polyline.hide(); - } - - // TODO: NEEDED? - // Handle dashed polylines that STARTS at this marker - /* - if (this._defaultMap.markerCollection.hasRelatedDashedPolyline(this)) { - if (this._defaultMap.state.isPolylineInfoWindowOpen(this._relatedMarkerOriginDashedPolyLine)) { - this._defaultMap.state.openInfoWindow.hide(); - } - this._relatedMarkerOriginDashedPolyLine.hide(); - } - */ - - // Handle dashed polylines that ENDS at this marker - // Since tail for this marker is hidden also the dashed tail should be hidden - var dashedPolyline = - this._defaultMap.markerCollection.getMarkerDashedPolyline(this.markerIdKey); - if (dashedPolyline !== null) { - dashedPolyline.hide(); - - if (typeof dashedPolyline.relatedMarkerIdKey !== "undefined") { - var relatedMarker = this._defaultMap.markerCollection.getMarker( - dashedPolyline.relatedMarkerIdKey - ); - if ( - relatedMarker !== null && - relatedMarker.markerIdKey !== this.markerIdKey - ) { - relatedMarker.hideMarkerTail(); - } - } - } - - // Handle direction polyline - if (this.directionPolyLine !== null) { - this.directionPolyLine.hide(); - } -}; - -/** - * Hide RNG Cirlce - */ -trackdirect.models.Marker.prototype.hideRNGCircle = function () { - if (this.rngCircle !== null) { - this.rngCircle.hide(); - } -}; - -/** - * Show marker RNG Cirlce - * @param {boolean} isHalf - */ -trackdirect.models.Marker.prototype.showRNGCircle = function (isHalf) { - this.hideRNGCircle(); - this.rngCircle = new trackdirect.models.RngCircle( - this.packet, - this._defaultMap, - isHalf - ); - this.rngCircle.show(); -}; - -/** - * Hide RNG Cirlce - */ -trackdirect.models.Marker.prototype.hidePHGCircle = function () { - if (this.phgCircle !== null) { - this.phgCircle.hide(); - } -}; - -/** - * Show marker RNG Cirlce - * @param {boolean} isHalf - */ -trackdirect.models.Marker.prototype.showPHGCircle = function (isHalf) { - this.hidePHGCircle(); - this.phgCircle = new trackdirect.models.PhgCircle( - this.packet, - this._defaultMap, - isHalf - ); - this.phgCircle.show(); -}; - -/** - * Set this marker to be overwritten by next packet from this station - */ -trackdirect.models.Marker.prototype.markToBeOverWritten = function () { - this.overwrite = true; -}; - -/** - * Returns true if marker is moving and is based on only one single packet - * @return boolean - */ -trackdirect.models.Marker.prototype.isSingleMovingMarker = function () { - var markerCounter = 0; - if ( - typeof this.packet.marker_counter !== "undefined" && - this.packet.marker_counter !== null - ) { - markerCounter = this.packet.marker_counter; - } - - if ( - this.packet.position_timestamp == this.packet.timestamp && - this.packet.is_moving == 1 && - [1, 2, 7, 12].indexOf(this.packet.map_id) >= 0 && - markerCounter <= 1 && - !this._defaultMap.markerCollection.hasDotMarkers(this.markerIdKey) - ) { - return true; - } - return false; -}; - -/** - * Returns true if marker should be visible, otherwise false - * @return {boolean} - */ -trackdirect.models.Marker.prototype.shouldMarkerBeVisible = function () { - if (this.packet.map_id == 14) { - // A kill-packet should never be visible - return false; - } - - if ( - this.packet.source_id == 2 && - !this._defaultMap.state.isCwopMarkersVisible - ) { - // CWOP weather stations should not be visible - return false; - } - - if (!this._defaultMap.state.isStationaryMarkersVisible) { - if (!this.isMovingStation()) { - return false; - } - } - - if (!this._defaultMap.state.isUnknownMarkersVisible) { - if (this.packet.station_name.substring(0, 7) == "UNKNOWN") { - return false; - } - } - - if (!this._defaultMap.state.isOgflymMarkersVisible) { - if (this.packet.raw_path.indexOf("OGFLYM") >= 0) { - return false; - } - } - - if (!this._defaultMap.state.isInternetMarkersVisible) { - if ( - this.packet.raw_path.indexOf("TCPIP") >= 0 || - this.packet.raw_path.indexOf("qAC") >= 0 || - this.packet.raw_path.indexOf("qAX") >= 0 || - this.packet.raw_path.indexOf("qAU") >= 0 || - this.packet.raw_path.indexOf("qAS") >= 0 - ) { - if (this.packet.station_id_path.length == 0) { - // Internet stations should not be visible - return false; - } - } - } - - if (this._defaultMap.state.visibleSymbols.length > 0) { - var symbolFound = false; - for (var key in this._defaultMap.state.visibleSymbols) { - var visibleSymbol = this._defaultMap.state.visibleSymbols[key]; - if ( - this.packet.symbol.charCodeAt(0) == visibleSymbol[0] && - this.packet.symbol_table.charCodeAt(0) == visibleSymbol[1] - ) { - symbolFound = true; - } - } - if (!symbolFound) { - return false; - } - } - - if ( - this.packet.map_id != 1 && - this.packet.map_id != 2 && - this.packet.map_id != 12 && - !this._defaultMap.state.isGhostMarkersVisible - ) { - // Ghost positions should not be visible - return false; - } - - if ( - this._defaultMap.state.isFilterMode && - this._defaultMap.state.filterStationIds.indexOf(this.packet.station_id) > -1 - ) { - // We are filtering and we are filtering on this station - var latestStationMarker = - this._defaultMap.markerCollection.getStationLatestMarker( - this.packet.station_id - ); - if ( - this._defaultMap.state.getClientTimestamp(this.packet.timestamp) <= - this._defaultMap.state.getOldestAllowedPacketTimestamp() && - typeof latestStationMarker !== "undefined" && - latestStationMarker !== null && - !this._isMarkersEqual(latestStationMarker) - ) { - // Is to old (and later confirmed markers exists) - return false; - } - - return true; - } else { - if ( - this._defaultMap.state.isFilterMode && - this._defaultMap.state.filterStationIds.indexOf( - this.packet.station_id - ) === -1 - ) { - // We are filtering and we are not filtering on this station - return false; - } - - if ( - this.packet.map_id != 1 && - this.packet.map_id != 2 && - this.packet.map_id != 12 && - this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkerTail - ) { - // Ghost markers is only visible when tail is visible (when we are not in filtering mode) - return false; - } - - if ( - this._defaultMap.state.getClientTimestamp(this.packet.timestamp) <= - this._defaultMap.state.getOldestAllowedPacketTimestamp() - ) { - // Is to old - return false; - } - - if ( - this._defaultMap.getZoom() < trackdirect.settings.minZoomForMarkers - ) { - // We are to much zoomed out - return false; - } - - return true; - } -}; - -/** - * Returnes true if it looks like it is a moving marker - * @return {boolean} - */ -trackdirect.models.Marker.prototype.isMovingStation = function () { - if (this.packet.is_moving == 0) { - return false; - } - - if ( - this._defaultMap.state.getClientTimestamp(this.packet.position_timestamp) < - this._defaultMap.state.getOldestAllowedPacketTimestamp() - ) { - // This marker is supposed to be moving but has not moved for a long time - // Check that we have no later marker for this station that is considered moving - var stationLatestMovingMarkerIdKey = - this._defaultMap.markerCollection.getStationLatestMovingMarkerIdKey( - this.packet.station_id - ); - if (stationLatestMovingMarkerIdKey == this.markerIdKey) { - // Stationary stations should not be visible - return false; - } - } - - return true; -}; - -/** - * Stop existing direction polyline is exists and is active - */ -trackdirect.models.Marker.prototype.stopDirectionPolyline = function () { - if (this.directionPolyLine !== null) { - this.directionPolyLine.stop(); - } -}; - -/** - * Stop the marker to old timeout that removes marker - */ -trackdirect.models.Marker.prototype.stopToOldTimeout = function () { - clearTimeout(this.toOldTimerId); - var dotMarkers = this._defaultMap.markerCollection.getDotMarkers( - this.markerIdKey - ); - for (var j = 0; j < dotMarkers.length; j++) { - clearTimeout(dotMarkers[j].toOldTimerId); - } -}; - -/** - * Get tooltip content for this marker - * @return {string} - */ -trackdirect.models.Marker.prototype.getToolTipContent = function () { - var iconUrl = trackdirect.services.symbolPathFinder.getFilePath( - this.packet.symbol_table, - this.packet.symbol, - null, - null, - null, - 20, - 20 - ); - var date = new Date(this.packet.timestamp * 1000); - var positionDate = new Date(this.packet.position_timestamp * 1000); - - var dateString = moment(date).format( - trackdirect.settings.dateFormatNoTimeZone - ); - if (this.packet.timestamp > this.packet.position_timestamp) { - dateString = - moment(positionDate).format(trackdirect.settings.dateFormatNoTimeZone) + - " - " + - moment(date).format(trackdirect.settings.dateFormatNoTimeZone); - } - - if (this.packet.getOgnRegistration() != null) { - var name = escapeHtml(this.packet.station_name); - name += ", "; - name += escapeHtml(this.packet.getOgnRegistration()); - if (this.packet.getOgnCN() !== null) { - name += " [" + escapeHtml(this.packet.getOgnCN()) + "]"; - } - return ( - '<div><img style="float: left; width:20px; height:20px;" src="' + - iconUrl + - '" />' + - '<span style="font-weight: bold; font-family: Helvetica; font-size: 10px; line-height: 22px; margin-left: 5px; margin-right: 25px">' + - name + - "</span></div>" + - '<div style="clear:both; font-family: Helvetica; font-size: 9px;">' + - dateString + - "</div>" - ); - } else if (this.packet.station_name == this.packet.sender_name) { - return ( - '<div><img style="float: left; width:20px; height:20px;" src="' + - iconUrl + - '" />' + - '<span style="font-weight: bold; font-family: Helvetica; font-size: 10px; line-height: 22px; margin-left: 5px; margin-right: 25px">' + - escapeHtml(this.packet.station_name) + - "</span></div>" + - '<div style="clear:both; font-family: Helvetica; font-size: 9px;">' + - dateString + - "</div>" - ); - } else { - return ( - '<div><img style="float: left; width:20px; height:20px;" src="' + - iconUrl + - '" />' + - '<span style="font-weight: bold; font-family: Helvetica; font-size: 10px; line-height: 22px; margin-left: 5px; margin-right: 25px">' + - escapeHtml(this.packet.station_name) + - "</span></div>" + - '<div style="clear:both; font-family: Helvetica; font-size: 9px;">Sent by ' + - escapeHtml(this.packet.sender_name) + - "</div>" + - '<div style="clear:both; font-family: Helvetica; font-size: 9px;">' + - dateString + - "</div>" - ); - } -}; - -/** - * Get a suitable google marker options object - * @return {object} - */ -trackdirect.models.Marker.prototype._getGoogleMarkerOptions = function () { - var anchorPoint = null; - if (this._isDotMarker) { - var colorId = trackdirect.services.stationColorCalculator.getColorId( - this.packet - ); - var iconUrl = - trackdirect.settings.baseUrl + - trackdirect.settings.imagesBaseDir + - "dotColor" + - colorId + - ".png"; - var scaledImageSize = new google.maps.Size(12, 12); - var imageSize = new google.maps.Size(12, 12); - var imageAnchor = new google.maps.Point(6, 6); - var opacity = 1.0; - } else { - var scalePx = 24; - var sizePx = 24; - if (this._shouldMarkerSymbolBeScaled()) { - scalePx = 48; - } - if (this.packet.course !== null) { - sizePx = sizePx + 7; - if (scalePx < sizePx) { - scalePx = sizePx; - } - } - - var imageSize = new google.maps.Size(scalePx, scalePx); - var imageAnchor = new google.maps.Point( - Math.floor(scalePx / 2), - Math.floor(scalePx / 2) - ); - var scaledImageSize = new google.maps.Size(scalePx, scalePx); - var iconUrl = trackdirect.services.symbolPathFinder.getFilePath( - this.packet.symbol_table, - this.packet.symbol, - this.packet.course, - sizePx, - sizePx, - scalePx, - scalePx - ); - if (isHighDensity()) { - imageSize = new google.maps.Size(scalePx * 2, scalePx * 2); - anchorPoint = new google.maps.Point(0, -Math.floor(scalePx / 2)); - iconUrl = trackdirect.services.symbolPathFinder.getFilePath( - this.packet.symbol_table, - this.packet.symbol, - this.packet.course, - sizePx, - sizePx, - scalePx * 2, - scalePx * 2 - ); - } - - var opacity = 1.0; - } - - return { - position: this.packet.getLatLngLiteral(), - zIndex: this._defaultMap.state.currentMarkerZindex, - icon: { - url: iconUrl, - size: imageSize, - scaledSize: scaledImageSize, - origin: new google.maps.Point(0, 0), - anchor: imageAnchor, - }, - opacity: opacity, - anchorPoint: anchorPoint, - }; -}; - -/** - * Get a suitable leaflet marker options object - * @return {object} - */ -trackdirect.models.Marker.prototype._getLeafletMarkerOptions = function () { - if (this._isDotMarker) { - var colorId = trackdirect.services.stationColorCalculator.getColorId( - this.packet - ); - var iconUrl = - trackdirect.settings.baseUrl + - trackdirect.settings.imagesBaseDir + - "dotColor" + - colorId + - ".png"; - var icon = L.icon({ - iconUrl: iconUrl, - iconSize: [12, 12], - iconAnchor: [6, 6], - }); - var opacity = 0.8; - } else { - var scalePx = 24; - var sizePx = 24; - if (this._shouldMarkerSymbolBeScaled()) { - scalePx = 48; - } - if (this.packet.course !== null) { - sizePx = sizePx + 7; - if (scalePx < sizePx) { - scalePx = sizePx; - } - } - - var iconUrl = trackdirect.services.symbolPathFinder.getFilePath( - this.packet.symbol_table, - this.packet.symbol, - this.packet.course, - sizePx, - sizePx, - scalePx, - scalePx - ); - var iconRetinaUrl = trackdirect.services.symbolPathFinder.getFilePath( - this.packet.symbol_table, - this.packet.symbol, - this.packet.course, - sizePx, - sizePx, - scalePx * 2, - scalePx * 2 - ); - var icon = L.icon({ - iconUrl: iconUrl, - iconRetinaUrl: iconRetinaUrl, - iconSize: [scalePx, scalePx], - iconAnchor: [Math.floor(scalePx / 2), Math.floor(scalePx / 2)], - }); - - var opacity = 1.0; - } - - var tooltipTitle = ""; - if (typeof L.tooltip == "undefined") { - tooltipTitle = this.packet.station_name; - } - - return { - zIndexOffset: this._defaultMap.state.currentMarkerZindex, - icon: icon, - opacity: opacity, - title: tooltipTitle, - }; -}; - -/** - * Returnes ture for symbols that that look better if they are scaled to twice the size - * @param {boolean} - */ -trackdirect.models.Marker.prototype._shouldMarkerSymbolBeScaled = function () { - if (typeof trackdirect.settings.symbolsToScale === "undefined") { - return false; - } - - for (var i = 0; i < trackdirect.settings.symbolsToScale.length; i++) { - var symbol = trackdirect.settings.symbolsToScale[i][0]; - var symbolTable = trackdirect.settings.symbolsToScale[i][1]; - - if (symbolTable == null && this.packet.symbol.charCodeAt() == symbol) { - return true; - } else if ( - this.packet.symbol.charCodeAt() == symbol && - this.packet.symbol_table.charCodeAt() == symbolTable - ) { - return true; - } - } - - return false; -}; - -/** - * Hide marker - * @param {int} delayInMilliSeconds - * @param {boolean} hideIfNeeded - */ -trackdirect.models.Marker.prototype._hideLater = function ( - delayInMilliSeconds, - onlyHideIfNeeded -) { - var me = this; - this.hideTimerId = window.setTimeout(function () { - if (me._defaultMap.state.isMarkerInfoWindowOpen(me)) { - // User is looking at this marker, try to hide it later - me.hide(500); - } else { - // Only hide it if we are not filtering or if station has newer markers - if (!me.shouldMarkerBeVisible()) { - me.hide(0, onlyHideIfNeeded); - } - } - }, delayInMilliSeconds); -}; - -/** - * Create marker tooltip - */ -trackdirect.models.Marker.prototype._addMarkerTooltip = function () { - if (typeof google === "object" && typeof google.maps === "object") { - this._addMarkerGoogleMapTooltip(); - } else if (typeof L === "object") { - this._addMarkerLeafletMapTooltip(); - } -}; - -/** - * Create Leaflet map tooltip on marker - */ -trackdirect.models.Marker.prototype._addMarkerLeafletMapTooltip = function () { - if (!trackdirect.isMobile) { - if (typeof L.tooltip != "undefined") { - var tooltip = L.tooltip({ - direction: "right", - noWrap: true, - offset: [6, 30], - className: "leaflet-marker-tooltiptext", - }); - } - - var me = this; - var isMyTooltipVisible = false; - this.on("mouseover", function (e) { - if (typeof tooltip !== "undefined") { - tooltip.setContent(me.getToolTipContent()); - tooltip.setLatLng( - new L.LatLng(me.packet.latitude, me.packet.longitude) - ); - tooltip.addTo(me._defaultMap); - isMyTooltipVisible = true; - } - - if (me.transmitPolyLine == null) { - me.transmitPolyLine = new trackdirect.models.TransmitPolyline( - me.packet, - me._defaultMap - ); - } - me.transmitPolyLine.show(); - }); - - this.on("mouseout", function (e) { - if (me.transmitPolyLine != null && me.transmitPolyLine.isVisible()) { - me.transmitPolyLine.hide(2000); - } - - if ( - typeof tooltip !== "undefined" && - isMyTooltipVisible && - me._defaultMap.hasLayer(tooltip) - ) { - tooltip.remove(); - isMyTooltipVisible = false; - } - }); - - this.on("remove", function (e) { - if (me.transmitPolyLine != null && me.transmitPolyLine.isVisible()) { - me.transmitPolyLine.hide(0); - } - - if ( - typeof tooltip !== "undefined" && - isMyTooltipVisible && - me._defaultMap.hasLayer(tooltip) - ) { - tooltip.remove(); - isMyTooltipVisible = false; - } - }); - } -}; - -/** - * Create Google map tooltip on marker - */ -trackdirect.models.Marker.prototype._addMarkerGoogleMapTooltip = function () { - if (!trackdirect.isMobile) { - if (!$("#marker-tooltip").length) { - // Does not exists, create it - var tooltip = $(document.createElement("div")); - tooltip.attr("id", "marker-tooltip"); - tooltip.css("display", "none"); - tooltip.css("position", "absolute"); - - tooltip.css("margin", "15px"); - tooltip.css("z-index", "90"); - tooltip.css("padding", "3px"); - - // opacity - tooltip.css("opacity", "0.95"); - tooltip.css("filter", "alpha(opacity=95)"); // For IE8 and earlier - - // Radius - tooltip.css("-webkit-border-radius", "1px"); - tooltip.css("-moz-border-radius", "1px"); - tooltip.css("border-radius", "1px"); - - // Shadow - tooltip.css("-webkit-box-shadow", "0px 0px 3px 0px rgba(0,0,0,0.3)"); - tooltip.css("-moz-box-shadow", "0px 0px 3px 0px rgba(0,0,0,0.3)"); - tooltip.css("box-shadow", "0px 0px 3px 0px rgba(0,0,0,0.3)"); - - tooltip.css("background-color", "#fff"); - tooltip.css("background", "#ffffff"); - - $("body").append(tooltip); - } - - var me = this; - var isMyTooltipVisible = false; - google.maps.event.addListener(this, "mouseover", function () { - var point = this._fromGoogleLatLngToPoint(me.getPosition()); - var mapElementId = this._defaultMap.getMapElementId(); - $("#marker-tooltip") - .html(me.getToolTipContent()) - .css({ - left: point.x + $("#" + mapElementId).offset().left, - top: point.y + $("#" + mapElementId).offset().top, - }) - .show(); - isMyTooltipVisible = true; - - if (me.transmitPolyLine == null) { - me.transmitPolyLine = new trackdirect.models.TransmitPolyline( - me.packet, - me._defaultMap - ); - } - me.transmitPolyLine.show(); - }); - - google.maps.event.addListener(this, "mouseout", function () { - if (me.transmitPolyLine != null && me.transmitPolyLine.isVisible()) { - me.transmitPolyLine.hide(2000); - } - - if (isMyTooltipVisible) { - $("#marker-tooltip").hide(); - isMyTooltipVisible = false; - } - }); - - this.addTdListener("onhide", function () { - if (me.transmitPolyLine != null && me.transmitPolyLine.isVisible()) { - me.transmitPolyLine.hide(0); - } - - if (isMyTooltipVisible) { - $("#marker-tooltip").hide(); - isMyTooltipVisible = false; - } - }); - } -}; - -/** - * Convert Google latlng to Point - * @param {object} LatLng - * @return {object} Point - */ -trackdirect.models.Marker.prototype._fromGoogleLatLngToPoint = function ( - latLng -) { - var topRight = this._defaultMap - .getProjection() - .fromLatLngToPoint(this._defaultMap.getBounds().getNorthEast()); - var bottomLeft = this._defaultMap - .getProjection() - .fromLatLngToPoint(this._defaultMap.getBounds().getSouthWest()); - var scale = Math.pow(2, this._defaultMap.getZoom()); - var worldPoint = this._defaultMap.getProjection().fromLatLngToPoint(latLng); - return new google.maps.Point( - (worldPoint.x - bottomLeft.x) * scale, - (worldPoint.y - topRight.y) * scale - ); -}; - -/** - * Returns true if markers are equal - * @param {object} marker2 - * @return {boolean} - */ -trackdirect.models.Marker.prototype._isMarkersEqual = function (marker2) { - var marker1 = this; - if ( - typeof marker2 !== "undefined" && - marker2 !== null && - typeof marker1.packet !== "undefined" && - typeof marker2.packet !== "undefined" && - marker1.packet.station_id === marker2.packet.station_id && - marker1.packet.timestamp === marker2.packet.timestamp && - Math.round(marker1.packet.latitude * 100000) === - Math.round(marker2.packet.latitude * 100000) && - Math.round(marker1.packet.longitude * 100000) === - Math.round(marker2.packet.longitude * 100000) && - marker1.packet.map_id === marker2.packet.map_id - ) { - return true; - } else { - return false; - } -}; - -/** - * Create timeout that removes marker when it it to old - * @param {int} altDelayMilliSeconds - */ -(trackdirect.models.Marker.prototype._addMarkerToOldTimeout = function ( - altDelayMilliSeconds -) { - var markerCollection = this._defaultMap.markerCollection; - var state = this._defaultMap.state; - var delay = - (this._defaultMap.state.getClientTimestamp(this.packet.timestamp) - - state.getOldestAllowedPacketTimestamp()) * - 1000; - if (altDelayMilliSeconds !== 0) { - delay = altDelayMilliSeconds; - } - - if (delay < 0) { - // Looks like this marker should be hidden allready, make sure it is soon - delay = 10; - } - - if (typeof this.toOldTimerId !== "undefined" && this.toOldTimerId !== null) { - clearTimeout(this.toOldTimerId); - } - - var me = this; - this.toOldTimerId = window.setTimeout(function () { - if (me._defaultMap.state.isMarkerInfoWindowOpen(me)) { - // User is looking at this marker, try again later... - me._addMarkerToOldTimeout(500); - } else { - var latestStationMarker = markerCollection.getStationLatestMarker( - me.packet.station_id - ); - var latestMarker = markerCollection.getMarker(me.markerIdKey); - - // Only hide it if we are not filtering or if station has newer markers - if ( - !me._isMarkersEqual(latestStationMarker) || - state.filterStationIds.indexOf(me.packet.station_id) == -1 - ) { - if (latestMarker === me) { - // This is the latest marker for this markerId, hide all of it! - var callback = function () { - me.hideCompleteMarker(); - markerCollection.resetMarkerPolyline(me.markerIdKey); - markerCollection.resetDotMarkers(me.markerIdKey); - }; - trackdirect.services.callbackExecutor.add(me, callback, []); - } else if (markerCollection.hasDotMarkers(me.markerIdKey)) { - // We should hide a dotmarker that we know exists - var index = markerCollection.getDotMarkerIndex(me.markerIdKey, me); - if (index == 0) { - var callback = function () { - if (markerCollection.hasDotMarkers(me.markerIdKey)) { - var success = markerCollection.removeOldestDotMarker( - me.markerIdKey - ); - if (!success) { - // Failed (should not happen), we try again later - me._addMarkerToOldTimeout(500); - } - } - }; - - trackdirect.services.callbackExecutor.add(me, callback, []); - } else if (index > 0) { - // Reschedule first marker removal (just to be sure) - var dotMarkers = markerCollection.getDotMarkers(me.markerIdKey); - dotMarkers[0]._addMarkerToOldTimeout(0); - - // Try again later - me._addMarkerToOldTimeout(100); - } - } - } else { - // Check again in a while if station has got a new marker - me._addMarkerToOldTimeout(1000); - } - } - }, delay); -}), - /** - * Emit all event listeners for a specified event - * @param {string} event - * @param {object} arg - */ - (trackdirect.models.Marker.prototype._emitTdEventListeners = function ( - event, - arg - ) { - if (event in this._tdEventListeners) { - for (var i = 0; i < this._tdEventListeners[event].length; i++) { - this._tdEventListeners[event][i](arg); - } - } - }); diff --git a/jslib/src/trackdirect/models/MarkerCollection.js b/jslib/src/trackdirect/models/MarkerCollection.js deleted file mode 100755 index 2f8b5b5b0943a8d88688e23ead87eafbaec8d535..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/MarkerCollection.js +++ /dev/null @@ -1,960 +0,0 @@ -/** - * Class trackdirect.models.MarkerCollection - */ -trackdirect.models.MarkerCollection = function () { - // Contains markerKeys and is indexed by markerId - this._markerKeys = {}; - - // Array of all markers - this._markers = []; - - // Contains markerKeys indexed by stationId - this._stationMarkers = {}; - - // Contains markerIdKey indexed by stationId - this._stationLastMovingMarkerIdKey = {}; - - // Contains markerIdKey indexed by stationId - this._stationLastMarker = {}; - - // Contains markerIdKey indexed by senderId - this._senderLastMarker = {}; - - // Contains markerKeys indexed by latitude:longitude - this._positionMarkersIdKeys = {}; - - // Array of all marker dot markers, using the same index as in the array _markers - this._dotMarkers = []; - - // Array of all marker polylines, using the same index as in the array _markers - this._markerPolyLines = []; - - //Array of all marker dashed polylines, using the same index as in the array _markers - this._markerOriginDashedPolyLines = []; - - // Contains arrays of markerKeys and is indexed by mapSectorId - this._mapSectorMarkerIdKeys = {}; - - // Contains coverage values indexed by stationId - this._stationCoverage = {}; - - this.resetAllMarkers(); -}; - -/** - * Returns markerIdKey based on specified markerId - * @param {int} markerId - * @return {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.getMarkerIdKey = function ( - markerId -) { - if (!(markerId in this._markerKeys)) { - this._markers.push(null); - this._markerPolyLines.push(null); - this._dotMarkers.push(null); - this._markerOriginDashedPolyLines.push(null); - - var markerIdKey = this._markers.length - 1; - this._markerKeys[markerId] = markerIdKey; - - return markerIdKey; - } else { - return this._markerKeys[markerId]; - } -}; - -/** - * Returns true if marker exists - * @param {int} markerIdKey - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.isExistingMarker = function ( - markerIdKey -) { - if (markerIdKey in this._markers && this._markers[markerIdKey] !== null) { - return true; - } - return false; -}; - -/** - * Set marker for specified markerIdKey - * @param {int} markerIdKey - * @param {trackdirect.models.Marker} marker - */ -trackdirect.models.MarkerCollection.prototype.setMarker = function ( - markerIdKey, - marker -) { - if (marker !== null && typeof marker.packet !== "undefined") { - var packet = marker.packet; - - this._markers[markerIdKey] = marker; - this._addStationMarkerId(markerIdKey, packet); - this._addStationLastMarker(packet, marker); - this.addPostionMarkerId(markerIdKey, packet); - } -}; - -/** - * Returns the marker that has the specified markerIdKey - * @param {int} markerIdKey - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getMarker = function ( - markerIdKey -) { - if (markerIdKey !== null && markerIdKey in this._markers) { - return this._markers[markerIdKey]; - } - return null; -}; - -/** - * Returns all markers - * @return {array} - */ -trackdirect.models.MarkerCollection.prototype.getAllMarkers = function () { - return this._markers; -}; - -/** - * Remove marker with specified markerIdKey - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.removeMarker = function ( - markerIdKey -) { - if (markerIdKey !== null && markerIdKey in this._markers) { - this._markers.splice(markerIdKey, 1); - } -}; - -/** - * Returns the number of markers - * @return {int} - */ -trackdirect.models.MarkerCollection.prototype.getNumberOfMarkers = function () { - return this._markers.length; -}; - -/* - * Set marker label for specified markerIdKey - * @param {int} markerIdKey - * @param {object} label - */ -trackdirect.models.MarkerCollection.prototype.setMarkerLabel = function ( - markerIdKey, - label -) { - if (markerIdKey in this._markers && this._markers[markerIdKey] !== null) { - this._markers[markerIdKey].label = label; - } -}; - -/** - * Returns the marker label that has the specified markerIdKey - * @param {int} markerIdKey - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getMarkerLabel = function ( - markerIdKey -) { - if (markerIdKey in this._markers && this._markers[markerIdKey] !== null) { - return this._markers[markerIdKey].label; - } - return null; -}; - -/** - * Returns true if specified marker has a label - * @param {int} markerIdKey - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasMarkerLabel = function ( - markerIdKey -) { - if ( - markerIdKey in this._markers && - this._markers[markerIdKey] !== null && - this._markers[markerIdKey].label !== null - ) { - return true; - } - return false; -}; - -/** - * Set a new position for the marker label - * @param {int} markerIdKey - * @param {object} position - */ -trackdirect.models.MarkerCollection.prototype.setMarkerLabelPosition = - function (markerIdKey, position) { - if ( - markerIdKey in this._markers && - this._markers[markerIdKey] !== null && - this._markers[markerIdKey].label !== null - ) { - this._markers[markerIdKey].label.position = position; - } - }; - -/** - * Returns true if packet is a duplicate, - * this method should be used on realtime-packet since they will not be checked on server - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.isDuplicate = function (packet) { - if (packet.is_moving == 0) { - // We don't care for duplicates for stationary stations - return false; - } - - for (var markerIdKey in this.getPositionMarkerIdKeys( - packet.latitude, - packet.longitude - )) { - var marker = this.getMarker(markerIdKey); - if ( - marker !== null && - marker.packet.station_id == packet.station_id && - marker.packet.symbol == packet.symbol && - marker.packet.symbol_table == packet.symbol_table && - marker.packet.course == packet.course - ) { - // My guess is that this is a duplicate - return true; - } - } - return false; -}; - -/* - * Add dot marker for specified markerIdKey - * @param {int} markerIdKey - * @param {object} dotMarker - */ -trackdirect.models.MarkerCollection.prototype.addDotMarker = function ( - markerIdKey, - dotMarker -) { - if (markerIdKey in this._dotMarkers) { - if (this._dotMarkers[markerIdKey] === null) { - this._dotMarkers[markerIdKey] = []; - } - this._dotMarkers[markerIdKey].push(dotMarker); - } -}; - -/** - * Returns the marker dot markers - * @param {int} markerIdKey - * @return {array} - */ -trackdirect.models.MarkerCollection.prototype.getDotMarkers = function ( - markerIdKey -) { - if ( - markerIdKey in this._dotMarkers && - this._dotMarkers[markerIdKey] !== null - ) { - return this._dotMarkers[markerIdKey]; - } - return []; -}; - -/** - * Returns true if specified marker has dot markers - * @param {int} markerIdKey - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasDotMarkers = function ( - markerIdKey -) { - if ( - markerIdKey in this._dotMarkers && - this._dotMarkers[markerIdKey] !== null && - this._dotMarkers[markerIdKey].length > 0 - ) { - return true; - } - return false; -}; - -/* - * Add dot marker for specified markerIdKey - * @param {int} markerIdKey - * @param {object} dotMarker - */ -trackdirect.models.MarkerCollection.prototype.addStationCoverage = function ( - stationId, - stationCoveragePolygon -) { - this._stationCoverage[stationId] = stationCoveragePolygon; -}; - -/** - * Returns the station coverage - * @param {int} stationId - * @return {StationCoveragePolygon} - */ -trackdirect.models.MarkerCollection.prototype.getStationCoverage = function ( - stationId -) { - if ( - stationId in this._stationCoverage && - this._stationCoverage[stationId] !== null - ) { - return this._stationCoverage[stationId]; - } - return null; -}; - -/** - * Returns an array of stations the has a visible coverage - * @return {array} - */ -trackdirect.models.MarkerCollection.prototype.getStationIdListWithVisibleCoverage = - function () { - var result = []; - for (var stationId in this._stationCoverage) { - if (this._stationCoverage[stationId].isRequestedToBeVisible()) { - result.push(stationId); - } - } - return result; - }; - -/** - * Returns true if specified station has a coverage polygon - * @param {int} stationId - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasCoveragePolygon = function ( - stationId -) { - if ( - stationId in this._stationCoverage && - this._stationCoverage[stationId] !== null - ) { - return true; - } - return false; -}; - -/** - * Reset the dot markers for a specified marker - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.resetDotMarkers = function ( - markerIdKey -) { - if ( - markerIdKey in this._dotMarkers && - this._dotMarkers[markerIdKey] !== null - ) { - this._dotMarkers[markerIdKey] = []; - } -}; - -/** - * Remove the oldest dot markers for a specified marker - * @param {int} markerIdKey - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.removeOldestDotMarker = function ( - markerIdKey -) { - if (this.hasDotMarkers(markerIdKey)) { - latestMarker = this.getMarker(markerIdKey); - var latestMarkerIndex = this.getDotMarkerIndex(markerIdKey, latestMarker); - var dotMarkers = this.getDotMarkers(markerIdKey); - var maxNumberOfPolyLinePoints = dotMarkers.length; - if (latestMarkerIndex > -1) { - // Seems like the latest marker also is a dotmarker, this may happen if it is a moving object - maxNumberOfPolyLinePoints = maxNumberOfPolyLinePoints - 1; - } - - var removedItems = this._dotMarkers[markerIdKey].splice(0, 1); - if (removedItems.length == 1) { - var removedMarker = removedItems[0]; - removedMarker.hide(); - if (this.hasPolyline(removedMarker.markerIdKey)) { - var polyline = this.getMarkerPolyline(removedMarker.markerIdKey); - while (polyline.getPathLength() > maxNumberOfPolyLinePoints) { - polyline.removePathItem(0); - } - } - removedMarker = null; - - return true; - } - } - return false; -}; - -/** - * Get dot marker index - * @param {int} markerIdKey - * @param {trackdirect.models.Marker} marker - * @return int - */ -trackdirect.models.MarkerCollection.prototype.getDotMarkerIndex = function ( - markerIdKey, - marker -) { - if (!this.hasDotMarkers(markerIdKey)) { - return -1; - } - for (var i = 0, len = this._dotMarkers[markerIdKey].length; i < len; i++) { - var foundMarker = this._dotMarkers[markerIdKey][i]; - if (foundMarker === null) { - continue; - } - - if ( - typeof marker.packet.id !== "undefined" && - marker.packet.id !== null && - foundMarker.packet.id === marker.packet.id && - foundMarker.packet.map_id === marker.packet.map_id - ) { - return i; - } - - if ( - foundMarker.packet.station_id === marker.packet.station_id && - foundMarker.packet.timestamp === marker.packet.timestamp && - Math.round(foundMarker.packet.latitude * 100000) === - Math.round(marker.packet.latitude * 100000) && - Math.round(foundMarker.packet.longitude * 100000) === - Math.round(marker.packet.longitude * 100000) && - foundMarker.packet.map_id === marker.packet.map_id - ) { - return i; - } - } - return -1; -}; - -/* - * Add marker polyline for specified markerIdKey - * @param {int} markerIdKey - * @param {object} polyline - */ -trackdirect.models.MarkerCollection.prototype.setMarkerPolyline = function ( - markerIdKey, - polyline -) { - if (markerIdKey in this._markerPolyLines) { - this._markerPolyLines[markerIdKey] = polyline; - } -}; - -/** - * Returns the marker polyline - * @param {int} markerIdKey - * @return {array} - */ -trackdirect.models.MarkerCollection.prototype.getMarkerPolyline = function ( - markerIdKey -) { - if (this.hasPolyline(markerIdKey)) { - return this._markerPolyLines[markerIdKey]; - } - return null; -}; - -/** - * Returns true if specified marker has a polyline - * @param {int} markerIdKey - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasPolyline = function ( - markerIdKey -) { - if ( - markerIdKey in this._markerPolyLines && - this._markerPolyLines[markerIdKey] !== null - ) { - if (this._markerPolyLines[markerIdKey].getPathLength() > 1) { - return true; - } else { - // We only consider polyline to exists if it has a path length of 2 or more - this._markerPolyLines[markerIdKey].hide(); - this._markerPolyLines[markerIdKey] = null; - return false; - } - } - return false; -}; - -/** - * Reset the marker polyline - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.resetMarkerPolyline = function ( - markerIdKey -) { - if (markerIdKey in this._markerPolyLines) { - this._markerPolyLines[markerIdKey] = null; - } -}; - -/* - * Add marker dashed polyline for specified markerIdKey - * @param {int} markerIdKey - * @param {object} polyline - */ -trackdirect.models.MarkerCollection.prototype.setMarkerDashedPolyline = - function (markerIdKey, polyline) { - if (markerIdKey in this._markerOriginDashedPolyLines) { - this._markerOriginDashedPolyLines[markerIdKey] = polyline; - } - }; - -/** - * Returns the marker dashed polyline - * @param {int} markerIdKey - * @return {array} - */ -trackdirect.models.MarkerCollection.prototype.getMarkerDashedPolyline = - function (markerIdKey) { - if (this.hasDashedPolyline(markerIdKey)) { - return this._markerOriginDashedPolyLines[markerIdKey]; - } - return null; - }; - -/** - * Returns true if specified marker has a dashed polyline - * @param {int} markerIdKey - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasDashedPolyline = function ( - markerIdKey -) { - if ( - markerIdKey in this._markerOriginDashedPolyLines && - this._markerOriginDashedPolyLines[markerIdKey] !== null - ) { - if (this._markerOriginDashedPolyLines[markerIdKey].getPathLength() > 1) { - return true; - } else { - // We only consider polyline to exists if it has a path length of 2 or more - this._markerOriginDashedPolyLines[markerIdKey].hide(); - this._markerOriginDashedPolyLines[markerIdKey] = null; - return false; - } - } - return false; -}; - -/** - * Reset the marker dashed polyline - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.resetMarkerDashedPolyline = - function (markerIdKey) { - if (markerIdKey in this._markerOriginDashedPolyLines) { - this._markerOriginDashedPolyLines[markerIdKey] = null; - } - }; - -/** - * returnes the latest packet of the specified station - * @param {int} stationId - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getStationLatestPacket = - function (stationId) { - if ( - typeof this._stationLastMarker[stationId] !== "undefined" && - this._stationLastMarker[stationId] !== null && - typeof this._stationLastMarker[stationId].packet !== "undefined" - ) { - return this._stationLastMarker[stationId].packet; - } else { - return null; - } - }; - -/** - * returnes the latest marker of the specified station - * @param {int} stationId - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getStationLatestMarker = - function (stationId) { - if ( - typeof this._stationLastMarker[stationId] !== "undefined" && - this._stationLastMarker[stationId] !== null - ) { - return this._stationLastMarker[stationId]; - } else { - return null; - } - }; - -/** - * returnes the latest packet of the specified sender - * @param {int} senderId - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getSenderLatestPacket = function ( - senderId -) { - if ( - typeof this._senderLastMarker[senderId] !== "undefined" && - this._senderLastMarker[senderId] !== null && - typeof this._senderLastMarker[senderId].packet !== "undefined" - ) { - return this._senderLastMarker[senderId].packet; - } else { - return null; - } -}; - -/** - * Returns the latest moving marker for station with specified id - * @param {int} stationId - * @return {int} - */ -trackdirect.models.MarkerCollection.prototype.getStationLatestMovingMarkerIdKey = - function (stationId) { - if ( - this._stationLastMovingMarkerIdKey !== null && - typeof this._stationLastMovingMarkerIdKey[stationId] !== "undefined" && - this._stationLastMovingMarkerIdKey[stationId] !== null && - this.isExistingMarker(this._stationLastMovingMarkerIdKey[stationId]) - ) { - return this._stationLastMovingMarkerIdKey[stationId]; - } - return null; - }; - -/** - * Get the latest markerIdKey connected to specified markerIdKey - * @param {int} markerIdKey - * @return int - */ -trackdirect.models.MarkerCollection.prototype.getMarkerMasterMarkerKeyId = - function (markerIdKey) { - if (this.isExistingMarker(markerIdKey)) { - var marker = this._markers[markerIdKey]; - if (this.hasRelatedDashedPolyline(marker)) { - return this.getMarkerMasterMarkerKeyId( - marker._relatedMarkerOriginDashedPolyLine.ownerMarkerIdKey - ); - } - } - return markerIdKey; - }; - -/** - * Get latest visible marker for a stationId - * @param {int} stationId - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getStationLatestVisibleMarker = - function (stationId) { - var latestVisibleMarker = null; - var latestVisibleMarkerTimestamp = null; - for (var markerIdKey in this._stationMarkers[stationId]) { - var marker = this._markers[markerIdKey]; - if ( - typeof marker !== "undefined" && - marker !== null && - typeof marker.getMap() !== "undefined" && - marker.getMap() !== null - ) { - if ( - latestVisibleMarkerTimestamp === null || - marker.packet.timestamp > latestVisibleMarkerTimestamp - ) { - latestVisibleMarker = marker; - latestVisibleMarkerTimestamp = marker.packet.timestamp; - } - } - } - return latestVisibleMarker; - }; - -/** - * Get an object with all station markerKeyIds as keys - * @param {int} stationId - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getStationMarkerIdKeys = - function (stationId) { - if (stationId in this._stationMarkers) { - return this._stationMarkers[stationId]; - } - return {}; - }; - -/** - * Get an object with all markerKeyIds at a specified position as keys - * @param {number} latitude - * @param {number} longitude - * @return {object} - */ -trackdirect.models.MarkerCollection.prototype.getPositionMarkerIdKeys = - function (latitude, longitude) { - var key = this._getCompareablePosition(latitude, longitude); - if (key in this._positionMarkersIdKeys) { - return this._positionMarkersIdKeys[key]; - } - return {}; - }; - -/** - * Add marker to postition - * @param {int} markerIdKey - * @param {trackdirect.models.Packet} packet - */ -trackdirect.models.MarkerCollection.prototype.addPostionMarkerId = function ( - markerIdKey, - packet -) { - var key = this._getCompareablePosition(packet.latitude, packet.longitude); - if (!(key in this._positionMarkersIdKeys)) { - this._positionMarkersIdKeys[key] = {}; - } - this._positionMarkersIdKeys[key][markerIdKey] = true; -}; - -/** - * Remove marker from postition - * @param {number} latitude - * @param {number} longitude - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.removePostionMarkerId = function ( - latitude, - longitude, - markerIdKey -) { - var key = this._getCompareablePosition(latitude, longitude); - if (key in this._positionMarkersIdKeys) { - if (markerIdKey in this._positionMarkersIdKeys[key]) { - this._positionMarkersIdKeys[key][markerIdKey] = false; - } - } -}; - -/** - * Add marker specified map sector - * @param {int} markerIdKey - * @param {int} markerMapSector - */ -trackdirect.models.MarkerCollection.prototype.addMarkerToMapSector = function ( - markerIdKey, - markerMapSector -) { - if (!(markerMapSector in this._mapSectorMarkerIdKeys)) { - this._mapSectorMarkerIdKeys[markerMapSector] = []; - } - - if (this._mapSectorMarkerIdKeys[markerMapSector].indexOf(markerIdKey) < 0) { - // only add markerIdKey to map-sector if it is not allready there - this._mapSectorMarkerIdKeys[markerMapSector].push(markerIdKey); - } -}; - -/** - * Add marker specified map sector - * @param {int} markerIdKey - * @param {int} markerMapSector - */ -trackdirect.models.MarkerCollection.prototype.getMapSectorMarkerKeys = - function (mapSector) { - if (mapSector in this._mapSectorMarkerIdKeys) { - return this._mapSectorMarkerIdKeys[mapSector]; - } - return []; - }; - -/** - * Reset all markers, this will remove everything from memory - */ -trackdirect.models.MarkerCollection.prototype.resetAllMarkers = function () { - this._markerKeys = {}; - this._markers = []; - this._markerPolyLines = []; - this._dotMarkers = []; - this._markerOriginDashedPolyLines = []; - this._stationMarkers = {}; - this._stationLastMovingMarkerIdKey = {}; - this._stationLastMarker = {}; - this._senderLastMarker = {}; - this._positionMarkersIdKeys = {}; - this._mapSectorMarkerIdKeys = {}; - this._stationCoverage = {}; -}; - -/** - * Remove marker from memory - * @param {int} markerIdKey - */ -trackdirect.models.MarkerCollection.prototype.resetMarker = function ( - markerIdKey -) { - if (this.isExistingMarker(markerIdKey)) { - var marker = this._markers[markerIdKey]; - - this._markers[markerIdKey] = null; - this._markerPolyLines[markerIdKey] = null; - this._dotMarkers[markerIdKey] = null; - this._markerOriginDashedPolyLines[markerIdKey] = null; - - if ( - typeof marker.packet.latitude != "undefined" && - typeof marker.packet.longitude != "undefined" - ) { - this.removePostionMarkerId( - marker.packet.latitude, - marker.packet.longitude, - markerIdKey - ); - } - } -}; - -/** - * Returns true if marker has a related marker origin dashed polyline. - * A related dashed poly line is a dashed polyline ending at this marker. - * @param {trackdirect.models.Marker} marker - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasRelatedDashedPolyline = - function (marker) { - if ( - typeof marker._relatedMarkerOriginDashedPolyLine !== "undefined" && - marker._relatedMarkerOriginDashedPolyLine !== null - ) { - return true; - } - return false; - }; - -/** - * Returns true if this station has a marker id not equal to this that is moving - * @param {trackdirect.models.Packet} packet - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.hasNonRelatedMovingMarkerId = - function (packet) { - // If latest marker is related we will have no non related that is visible, - // since we only allow one moving marker per station. - // So we only need to compare latest moving marker... - var latestStationMovingMarkerIdKey = this.getStationLatestMovingMarkerIdKey( - packet.station_id - ); - var newMarkerIdKey = this.getMarkerIdKey(packet.marker_id); - if ( - latestStationMovingMarkerIdKey !== null && - latestStationMovingMarkerIdKey !== newMarkerIdKey - ) { - var latestStationMovingMarker = this.getMarker( - latestStationMovingMarkerIdKey - ); - if (latestStationMovingMarker.packet.hasConfirmedMapId()) { - return true; - } - } - return false; - }; - -/** - * Returns true if new packet should replace current marker - * @param {trackdirect.models.Packet} packet - * @return {boolean} - */ -trackdirect.models.MarkerCollection.prototype.isPacketReplacingMarker = - function (packet) { - var markerIdKey = this.getMarkerIdKey(packet.marker_id); - if (this.isExistingMarker(markerIdKey)) { - var marker = this.getMarker(markerIdKey); - if (marker !== null) { - if (packet.map_id == 14) { - // Packets that kill other packets should allways replace previous packet - return true; - } - - if (packet.is_moving == 0) { - // Stationary allways replace previous marker if they have the same marker_id - return true; - } - - if ([1, 2, 7, 12].indexOf(packet.map_id) < 0) { - // For ghost packets we allways replace markers with the same marker_id - return true; - } - } - } - return false; - }; - -/** - * Add markerId to station - * @param {int} markerIdKey - * @param {trackdirect.models.Packet} packet - */ -trackdirect.models.MarkerCollection.prototype._addStationMarkerId = function ( - markerIdKey, - packet -) { - if (!(packet.station_id in this._stationMarkers)) { - this._stationMarkers[packet.station_id] = {}; - } - this._stationMarkers[packet.station_id][markerIdKey] = true; - - if (packet.is_moving == 1 && packet.hasConfirmedMapId()) { - this._stationLastMovingMarkerIdKey[packet.station_id] = markerIdKey; - } -}; - -/** - * Add station latest marker - * @param {trackdirect.models.Packet} packet - * @param {trackdirect.models.Marker} marker - */ -trackdirect.models.MarkerCollection.prototype._addStationLastMarker = function ( - packet, - marker -) { - if (packet.hasConfirmedMapId()) { - if ( - typeof this._stationLastMarker[packet.station_id] === "undefined" || - this._stationLastMarker[packet.station_id] === null - ) { - this._stationLastMarker[packet.station_id] = marker; - if (packet.station_name == packet.sender_name) { - this._senderLastMarker[packet.sender_id] = marker; - } - } else if ( - this._stationLastMarker[packet.station_id].packet.timestamp <= - packet.timestamp - ) { - this._stationLastMarker[packet.station_id] = marker; - if (packet.station_name == packet.sender_name) { - this._senderLastMarker[packet.sender_id] = marker; - } - } - } -}; - -/** - * Get string representation of a position that may be used for comparison - * @param {number} latitude - * @param {number} longitude - * @return {string} - */ -trackdirect.models.MarkerCollection.prototype._getCompareablePosition = - function (latitude, longitude) { - var latCmp = Math.round(latitude * 100000); - var lngCmp = Math.round(longitude * 100000); - return String(latCmp) + ":" + String(lngCmp); - }; diff --git a/jslib/src/trackdirect/models/Packet.js b/jslib/src/trackdirect/models/Packet.js deleted file mode 100755 index c1227c067edc066d96b1f3ada497d7282e19a7b7..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/Packet.js +++ /dev/null @@ -1,628 +0,0 @@ -/** - * Class trackdirect.models.Packet - * @param {object} data - */ -trackdirect.models.Packet = function (data) { - this.init(); - for (var key in data) { - this[key] = data[key]; - } -}; - -trackdirect.models.Packet.prototype.init = function () { - this["altitude"] = null; - this["comment"] = ""; - this["course"] = null; - this["db"] = null; - this["id"] = null; - this["latest_phg_timestamp"] = null; - this["latest_rng_timestamp"] = null; - this["latitude"] = null; - this["longitude"] = null; - this["map_id"] = null; - this["map_sector"] = null; - this["marker_counter"] = null; - this["marker_id"] = null; - this["ogn"] = null; - this["overwrite"] = null; // 1 if it should be overwritten by next packet from station - this["is_moving"] = 1; - this["packet_order_id"] = null; - this["packet_tail_timestamp"] = null; - this["packet_type_id"] = null; - this["phg"] = null; - this["posambiguity"] = 0; - this["position_timestamp"] = null; - this["raw"] = ""; - this["raw_path"] = ""; - this["realtime"] = 0; // 1 if not fetched from database - this["related_map_sectors"] = []; - this["reported_timestamp"] = null; - this["rng"] = null; - this["sender_id"] = null; - this["sender_name"] = null; - this["source_id"] = null; - this["speed"] = null; - this["station_id"] = null; - this["station_id_path"] = []; - this["station_location_path"] = []; - this["station_name"] = null; - this["station_name_path"] = []; - this["symbol"] = null; - this["symbol_table"] = null; - this["telemetry"] = null; - this["timestamp"] = null; - this["weather"] = null; -}; - -/** - * Returns the packet station name (including sender if needed) - * @return {string} - */ -trackdirect.models.Packet.prototype.getStationName = function () { - if (this.station_name == this.sender_name) { - return escapeHtml(this.station_name); - } else { - return escapeHtml(this.station_name + " (" + this.sender_name + ")"); - } -}; - -/** - * Returns the packet position - * @return {LatLngLiteral} - */ -trackdirect.models.Packet.prototype.getLatLngLiteral = function () { - return { lat: parseFloat(this.latitude), lng: parseFloat(this.longitude) }; -}; - -/** - * Returns true if packet map ID is considered to be visible - * @return boolean - */ -trackdirect.models.Packet.prototype.hasConfirmedMapId = function () { - if ([1, 2, 12].indexOf(this.map_id) >= 0) { - return true; - } - return false; -}; - -/** - * Returns OGN aircraft type name - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnAircraftType = function () { - if (typeof this.ogn !== "undefined" && this.ogn !== null) { - if ( - typeof this.ogn.ogn_aircraft_type_id !== "undefined" && - this.ogn.ogn_aircraft_type_id != "" - ) { - if (this.ogn.ogn_aircraft_type_id == 1) { - return "Glider"; - } else if (this.ogn.ogn_aircraft_type_id == 2) { - return "Tow Plane"; - } else if (this.ogn.ogn_aircraft_type_id == 3) { - return "Helicopter"; - } else if (this.ogn.ogn_aircraft_type_id == 4) { - return "Parachute"; - } else if (this.ogn.ogn_aircraft_type_id == 5) { - return "Drop Plane"; - } else if (this.ogn.ogn_aircraft_type_id == 6) { - return "Hang Glider"; - } else if (this.ogn.ogn_aircraft_type_id == 7) { - return "Para Glider"; - } else if (this.ogn.ogn_aircraft_type_id == 8) { - return "Powered Aircraft"; - } else if (this.ogn.ogn_aircraft_type_id == 9) { - return "Jet Aircraft"; - } else if (this.ogn.ogn_aircraft_type_id == 10) { - return "UFO"; - } else if (this.ogn.ogn_aircraft_type_id == 11) { - return "Balloon"; - } else if (this.ogn.ogn_aircraft_type_id == 12) { - return "Airship"; - } else if (this.ogn.ogn_aircraft_type_id == 13) { - return "UAV"; - } else if (this.ogn.ogn_aircraft_type_id == 14) { - return ""; - } else if (this.ogn.ogn_aircraft_type_id == 15) { - return "Static Object"; - } - } - } - return null; -}; - -/** - * Returns OGN device DB aircraft type name - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnDdbAircraftType = function () { - if (typeof this.ogn_device !== "undefined" && this.ogn_device !== null) { - if ( - typeof this.ogn_device.ddb_aircraft_type !== "undefined" && - this.ogn_device.ddb_aircraft_type != "" - ) { - if (this.ogn_device.ddb_aircraft_type == 1) { - return "Glider/Motoglider"; - } else if (this.ogn_device.ddb_aircraft_type == 2) { - return "Plane"; - } else if (this.ogn_device.ddb_aircraft_type == 3) { - return "Ultralight"; - } else if (this.ogn_device.ddb_aircraft_type == 4) { - return "Helicopter"; - } else if (this.ogn_device.ddb_aircraft_type == 5) { - return "Drone/UAV"; - } else if (this.ogn_device.ddb_aircraft_type == 6) { - return "Other"; - } - } - } - return null; -}; - -/** - * Returns OGN address type name - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnAddressType = function () { - if (typeof this.ogn !== "undefined" && this.ogn !== null) { - if ( - typeof this.ogn.ogn_address_type_id !== "undefined" && - this.ogn.ogn_address_type_id != "" - ) { - if (this.ogn.ogn_address_type_id == 1) { - return "ICAO"; - } else if (this.ogn.ogn_address_type_id == 2) { - return "FLARM"; - } else if (this.ogn.ogn_address_type_id == 3) { - return "OGN"; - } - } - } - return null; -}; - -/** - * Returns OGN sender address - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnSenderAddress = function () { - if (typeof this.ogn !== "undefined" && this.ogn !== null) { - if ( - typeof this.ogn.ogn_sender_address !== "undefined" && - this.ogn.ogn_sender_address != "" - ) { - return this.ogn.ogn_sender_address; - } - } - return null; -}; - -/** - * Returns OGN registration - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnRegistration = function () { - if (typeof this.ogn_device !== "undefined" && this.ogn_device !== null) { - if ( - typeof this.ogn_device.registration !== "undefined" && - this.ogn_device.registration != "" - ) { - return this.ogn_device.registration; - } - } - return null; -}; - -/** - * Returns OGN CN - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnCN = function () { - if (typeof this.ogn_device !== "undefined" && this.ogn_device !== null) { - if (typeof this.ogn_device.cn !== "undefined" && this.ogn_device.cn != "") { - return this.ogn_device.cn; - } - } - return null; -}; - -/** - * Returns OGN summary - * @return {string} - */ -trackdirect.models.Packet.prototype.getOgnSummary = function () { - var senderAddress = this.getOgnSenderAddress(); - var aircraftType = this.getOgnAircraftType(); - var ddbAircraftType = this.getOgnDdbAircraftType(); - var addressType = this.getOgnAddressType(); - - var summary = ""; - if (ddbAircraftType !== null) { - summary += ddbAircraftType; - } else if (aircraftType !== null) { - summary += aircraftType; - } - if (senderAddress !== null) { - if (summary != "") { - summary += " "; - } - summary += senderAddress; - - if (addressType !== null) { - summary += " (" + addressType + ")"; - } - } - return summary; -}; - -/** - * Returns true if packet has direction support - * @return boolean - */ -trackdirect.models.Packet.prototype.hasDirectionSupport = function () { - if ( - this.course !== null && - this.speed !== null && - this.speed > 0 && - this.source_id == 1 && - this.packet_order_id == 1 && - this.is_moving == 1 && - this.hasConfirmedMapId() - ) { - var symbolCategory = 1; - if (this.symbol_table.charCodeAt(0) == "92") { - symbolCategory = 2; - } - - if ( - symbolCategory == 1 && - trackdirect.settings.primarySymbolWithNoDirectionPolyline.indexOf( - parseInt(this.symbol.charCodeAt(0)) - ) > -1 - ) { - // This icon does not support direction polyline, avoid drawing anything since speed could be windspeed - return false; - } - - if ( - symbolCategory == 2 && - trackdirect.settings.alternativeSymbolWithNoDirectionPolyline.indexOf( - parseInt(this.symbol.charCodeAt(0)) - ) > -1 - ) { - // This icon does not support direction polyline, avoid drawing anything since speed could be windspeed - return false; - } - return true; - } - return false; -}; - -/** - * Get PGH string - * @return string - */ -trackdirect.models.Packet.prototype.getPhg = function () { - if (this.phg !== null) { - if (this.phg == 0) { - return null; // 0000 is considered not to be used (power == 0!) - } else if (this.phg < 10) { - return "000" + String(this.phg); - } else if (this.phg < 100) { - return "00" + String(this.phg); - } else if (this.phg < 1000) { - return "0" + String(this.phg); - } else { - return String(this.phg); - } - } - return null; -}; - -/** - * Get RNG range in meters - * @return float - */ -trackdirect.models.Packet.prototype.getRNGRange = function () { - if (this.rng !== null) { - return this.rng; - } - return null; -}; - -/** - * Get PGH range in meters - * @return float - */ -trackdirect.models.Packet.prototype.getPHGRange = function () { - if (this.getPhg() !== null) { - var p = this.getPhgPower(); - var h = this.getPhgHaat(false); - var g = this.getPhgGain(); - - var gain = Math.pow(10, g / 10); //converts from DB to decimal - var range = Math.sqrt(2 * h * Math.sqrt((p / 10) * (gain / 2))); - return range / 0.000621371192; // convert to m and return - } - return null; -}; - -/** - * Get PGH description - * @return String - */ -trackdirect.models.Packet.prototype.getPHGDescription = function () { - if (this.getPhg() !== null) { - var power = this.getPhgPower(); - var haat = this.getPhgHaat(); - var gain = this.getPhgGain(); - var direction = this.getPhgDirection(); - - var description = ""; - if (power !== null) { - description += "Power " + power + "W"; - } - - if (haat !== null) { - if (description.length > 0) { - description += ", "; - } - description += "Height " + haat + "m"; - } - - if (gain !== null && direction !== null) { - if (description.length > 0) { - description += ", "; - } - description += "Gain " + gain + "dB " + direction; - } - return description; - } - return null; -}; - -/** - * Get PGH power - * @return int - */ -trackdirect.models.Packet.prototype.getPhgPower = function () { - if (this.getPhg() !== null) { - return Math.pow(parseInt(this.getPhg().substring(0, 1)), 2); - } - return null; -}; - -/** - * Get PGH hight (above averange terrain) - * @param {boolean} inMeters - * @return int - */ -trackdirect.models.Packet.prototype.getPhgHaat = function (inMeters) { - inMeters = typeof inMeters !== "undefined" ? inMeters : true; - if (this.getPhg() != null) { - value = parseInt(this.getPhg().substring(1, 2)); - - var haat = 10; - if (value == 1) { - haat = 20; - } else if (value > 1) { - haat = 10 * Math.pow(value, 2); - } - - if (inMeters) { - return Math.round(haat * 0.3048, 0); - } else { - return haat; - } - } - return null; -}; - -/** - * Get PGH Gain - * @return int - */ -trackdirect.models.Packet.prototype.getPhgGain = function () { - if (this.getPhg() != null) { - return parseInt(this.getPhg().substring(2, 3)); - } - return null; -}; - -/** - * Get PGH Direction - * @return String - */ -trackdirect.models.Packet.prototype.getPhgDirection = function () { - if (this.getPhg() != null) { - switch (parseInt(this.getPhg().substring(3, 4))) { - case 0: - return "omni"; - break; - case 1: - return "North East"; - break; - case 2: - return "East"; - break; - case 3: - return "South East"; - break; - case 4: - return "South"; - break; - case 5: - return "South West"; - break; - case 6: - return "West"; - break; - case 7: - return "North West"; - break; - case 8: - return "North"; - break; - } - } - return null; -}; - -/** - * Get PGH Direction Degree - * @return int - */ -trackdirect.models.Packet.prototype.getPhgDirectionDegree = function () { - if (this.getPhg() != null) { - switch (parseInt(this.getPhg().substring(3, 4))) { - case 0: - return null; - break; - case 1: - return 45; - break; - case 2: - return 90; - break; - case 3: - return 135; - break; - case 4: - return 180; - break; - case 5: - return 225; - break; - case 6: - return 270; - break; - case 7: - return 315; - break; - case 8: - return 360; - break; - } - } - return null; -}; - -/** - * Get distance between packet latest position for specified marker - * @param {trackdirect.models.Marker} marker - * @return {float} - */ -trackdirect.models.Packet.prototype.getMarkerDistance = function (marker) { - var packetLatLng = { - lat: parseFloat(this.latitude), - lng: parseFloat(this.longitude), - }; - var markerPacketLatLng = { - lat: parseFloat(marker.packet.latitude), - lng: parseFloat(marker.packet.longitude), - }; - return trackdirect.services.distanceCalculator.getDistance( - packetLatLng, - markerPacketLatLng - ); -}; - -/** - * Returns true if both packet has same symbol as marker latest packet - * @param {trackdirect.models.Marker} marker - * @return {boolean} - */ -trackdirect.models.Packet.prototype.hasSameSymbol = function (marker) { - if ( - marker.packet.symbol == this.symbol && - marker.packet.symbol_table == this.symbol_table - ) { - return true; - } - return false; -}; - -/** - * Returns linkified packet.raw_path - * @return {string} - */ -trackdirect.models.Packet.prototype.getLinkifiedRawPath = function () { - if ( - typeof this.raw_path !== "undefined" && - this.raw_path !== null && - this.raw_path !== "" - ) { - var rawPath = escapeHtml(this.raw_path); - rawPath = "#" + rawPath + "#"; - for (var i = 0; i < this.station_id_path.length; i++) { - var relatedStationId = this.station_id_path[i]; - if ( - typeof this.station_name_path !== "undefined" && - this.station_name_path !== null - ) { - var relatedStationName = escapeHtml(this.station_name_path[i]); - var relatedStationNameReplacement = - '<a href="#" onclick="' + - " var relatedStationLatestPacket = trackdirect._map.markerCollection.getStationLatestPacket(" + - relatedStationId + - ");" + - " if (relatedStationLatestPacket !== null) {" + - " trackdirect.focusOnStation(" + - relatedStationId + - ", true);" + - " } else {" + - " alert('Can not go to " + - relatedStationName + - ", station has not been heard for a long time.');" + - " }" + - ' return false;">' + - relatedStationName + - "</a>"; - - rawPath = rawPath.replaceAll( - "#" + relatedStationName + ",", - "#" + relatedStationNameReplacement + "," - ); - rawPath = rawPath.replaceAll( - "#" + relatedStationName + "*", - "#" + relatedStationNameReplacement + "*" - ); - rawPath = rawPath.replaceAll( - "#" + relatedStationName + ":", - "#" + relatedStationNameReplacement + ":" - ); - rawPath = rawPath.replaceAll( - "#" + relatedStationName + "#", - "#" + relatedStationNameReplacement + "#" - ); - rawPath = rawPath.replaceAll( - "," + relatedStationName + ",", - "," + relatedStationNameReplacement + "," - ); - rawPath = rawPath.replaceAll( - "," + relatedStationName + "*", - "," + relatedStationNameReplacement + "*" - ); - rawPath = rawPath.replaceAll( - "," + relatedStationName + ":", - "," + relatedStationNameReplacement + ":" - ); - rawPath = rawPath.replaceAll( - "," + relatedStationName + "#", - "," + relatedStationNameReplacement + "#" - ); - } - } - rawPath = rawPath.replace(/#+$/, ""); - rawPath = rawPath.replace(/^#+/, ""); - var rawPathArray = rawPath.split(","); - if (rawPathArray.length > 0) { - var rawPath = - rawPathArray[0] + - " via " + - rawPathArray.join(",").replace(rawPathArray[0] + ",", ""); - } - return rawPath; - } - return null; -}; diff --git a/jslib/src/trackdirect/models/PhgCircle.js b/jslib/src/trackdirect/models/PhgCircle.js deleted file mode 100755 index 702923fa50d389e03208eda3a038ee8b0648d5c2..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/PhgCircle.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Class trackdirect.models.PhgCircle - * @see https://developers.google.com/maps/documentation/javascript/reference#Circle - * @param {trackdirect.models.Packet} packet - * @param {trackdirect.models.Map} map - * @param {boolean} isHalf - */ -trackdirect.models.PhgCircle = function (packet, map, isHalf) { - this._defaultMap = map; - - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Circle.call(this, this._getGoogleCircleOptions(packet, isHalf)); - } else if (typeof L === "object") { - if (L.version <= "0.7.7") { - var range = this._getCircleRadius(packet, isHalf); - var center = this._getCircleCenter(packet, isHalf); - L.Circle.call( - this, - [center.lat, center.lng], - range, - this._getLeafletCircleOptions(packet, isHalf) - ); - } else { - L.Circle.call( - this, - this._getCircleCenter(packet, isHalf), - this._getLeafletCircleOptions(packet, isHalf) - ); - } - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.PhgCircle.prototype = Object.create( - google.maps.Circle.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.PhgCircle.prototype = Object.create(L.Circle.prototype); -} -trackdirect.models.PhgCircle.prototype.constructor = - trackdirect.models.PhgCircle; - -/** - * show the circle if it is not shown - */ -trackdirect.models.PhgCircle.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } -}; - -/** - * hide circle if it is visible - */ -trackdirect.models.PhgCircle.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - } -}; - -/** - * Get default options used for initializing circle - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {object} - */ -trackdirect.models.PhgCircle.prototype._getGoogleCircleOptions = function ( - packet, - isHalf -) { - var color = trackdirect.services.stationColorCalculator.getColor(packet); - var range = this._getCircleRadius(packet, isHalf); - var center = this._getCircleCenter(packet, isHalf); - - var options = { - strokeColor: color, - strokeOpacity: 0.6, - strokeWeight: 1, - fillColor: color, - fillOpacity: 0.3, - map: null, - center: center, - radius: range, - }; - - return options; -}; - -/** - * Get default options used for initializing circle - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {object} - */ -trackdirect.models.PhgCircle.prototype._getLeafletCircleOptions = function ( - packet, - isHalf -) { - var color = trackdirect.services.stationColorCalculator.getColor(packet); - var range = this._getCircleRadius(packet, isHalf); - var options = { - color: color, - opacity: 0.6, - weight: 1, - fillColor: color, - fillOpacity: 0.3, - radius: range, - }; - - return options; -}; - -/** - * Get circle radius based on packet - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {float} - */ -trackdirect.models.PhgCircle.prototype._getCircleRadius = function ( - packet, - isHalf -) { - var range = packet.getPHGRange(); - if (range === null) { - range = 0; - } - if (isHalf) { - range = range / 2; - } - return range; -}; - -/** - * Get circle center based on packet - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {object} - */ -trackdirect.models.PhgCircle.prototype._getCircleCenter = function ( - packet, - isHalf -) { - var direction = packet.getPhgDirectionDegree(); - var center = packet.getLatLngLiteral(); - if (direction != null) { - var range = packet.getPHGRange(); - if (range === null) { - range = 0; - } - - if (isHalf) { - range = range / 2; - } - - var distance = (range * 2) / 3 / 2; - center = trackdirect.services.distanceCalculator.getPositionByDistance( - center, - direction, - distance - ); - } - - return center; -}; diff --git a/jslib/src/trackdirect/models/RngCircle.js b/jslib/src/trackdirect/models/RngCircle.js deleted file mode 100755 index c236d3391d6b18828cb8c756d12d7e7929d0b7f1..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/RngCircle.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Class trackdirect.models.RngCircle inherits google.maps.Circle - * @see https://developers.google.com/maps/documentation/javascript/reference#Circle - * @param {trackdirect.models.Packet} packet - * @param {trackdirect.models.Map} map - * @param {boolean} isHalf - */ -trackdirect.models.RngCircle = function (packet, map, isHalf) { - this._defaultMap = map; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Circle.call(this, this._getGoogleCircleOptions(packet, isHalf)); - } else if (typeof L === "object") { - var center = packet.getLatLngLiteral(); - if (L.version <= "0.7.7") { - var range = this._getCircleRadius(packet, isHalf); - L.Circle.call( - this, - [center.lat, center.lng], - range, - this._getLeafletCircleOptions(packet, isHalf) - ); - } else { - L.Circle.call( - this, - center, - this._getLeafletCircleOptions(packet, isHalf) - ); - } - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.RngCircle.prototype = Object.create( - google.maps.Circle.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.RngCircle.prototype = Object.create(L.Circle.prototype); -} -trackdirect.models.RngCircle.prototype.constructor = - trackdirect.models.RngCircle; - -/** - * show the circle if it is not shown - */ -trackdirect.models.RngCircle.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } -}; - -/** - * hide circle if it is visible - */ -trackdirect.models.RngCircle.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - } -}; - -/** - * Get default options used for initializing circle - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {object} - */ -trackdirect.models.RngCircle.prototype._getGoogleCircleOptions = function ( - packet, - isHalf -) { - var color = trackdirect.services.stationColorCalculator.getColor(packet); - var range = this._getCircleRadius(packet, isHalf); - - var options = { - strokeColor: color, - strokeOpacity: 0.6, - strokeWeight: 1, - fillColor: color, - fillOpacity: 0.3, - map: null, - center: packet.getLatLngLiteral(), - radius: range * 1000, - }; - - return options; -}; - -/** - * Get default options used for initializing circle - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {object} - */ -trackdirect.models.RngCircle.prototype._getLeafletCircleOptions = function ( - packet, - isHalf -) { - var color = trackdirect.services.stationColorCalculator.getColor(packet); - var range = this._getCircleRadius(packet, isHalf); - - var options = { - color: color, - opacity: 0.6, - weight: 1, - fillColor: color, - fillOpacity: 0.3, - radius: range * 1000, - }; - - return options; -}; - -/** - * Get circle radius based on packet - * @param {trackdirect.models.Packet} packet - * @param {boolean} isHalf - * @return {float} - */ -trackdirect.models.RngCircle.prototype._getCircleRadius = function ( - packet, - isHalf -) { - var range = packet.getRNGRange(); - if (range === null) { - range = 0; - } - if (isHalf) { - range = range / 2; - } - - return range; -}; diff --git a/jslib/src/trackdirect/models/Ruler.js b/jslib/src/trackdirect/models/Ruler.js deleted file mode 100755 index 85b47a001fc086952f1d610159a36351406bc553..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/Ruler.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Class trackdirect.models.Ruler - * @param {int} defaultLength - * @param {trackdirect.models.Map} map - */ -trackdirect.models.Ruler = function (defaultLength, map) { - this._map = map; - - if (typeof google === "object" && typeof google.maps === "object") { - this._googleMapsInit(defaultLength); - this._addGoolgeMapsListeners(); - } else if (typeof L === "object") { - this.leafletInit(defaultLength); - this._addLeafletListeners(); - } -}; - -/** - * Init ruler for Gogle Maps - * @param {int} defaultLength - */ -trackdirect.models.Ruler.prototype._googleMapsInit = function (defaultLength) { - this.marker1 = new google.maps.Marker({ - position: trackdirect.services.distanceCalculator.getPositionByDistance( - this._map.getCenterLiteral(), - 270, - defaultLength / 2 - ), - draggable: true, - map: this._map, - }); - - this.marker2 = new google.maps.Marker({ - position: trackdirect.services.distanceCalculator.getPositionByDistance( - this._map.getCenterLiteral(), - 90, - defaultLength / 2 - ), - draggable: true, - map: this._map, - }); - - this.marker1.markerLabel = new trackdirect.models.Label( - { - position: this.marker1.getPosition(), - text: this._getDistance(this.marker1, this.marker2), - }, - this._map - ); - this.marker1.markerLabel.show(); - - this.marker2.markerLabel = new trackdirect.models.Label( - { - position: this.marker2.getPosition(), - text: this._getDistance(this.marker2, this.marker1), - }, - this._map - ); - this.marker2.markerLabel.show(); - - this.line = new google.maps.Polyline({ - path: [this.marker1.getPosition(), this.marker2.getPosition()], - strokeColor: "#ffff00", - strokeOpacity: 0.7, - strokeWeight: 6, - }); - this.line.setMap(this._map); -}; - -/** - * Init ruler for Leaflet - * @param {int} defaultLength - */ -trackdirect.models.Ruler.prototype.leafletInit = function (defaultLength) { - this.marker1 = new L.Marker( - trackdirect.services.distanceCalculator.getPositionByDistance( - this._map.getCenterLiteral(), - 270, - defaultLength / 2 - ), - { draggable: true } - ); - this.marker1.addTo(this._map); - - this.marker2 = new L.Marker( - trackdirect.services.distanceCalculator.getPositionByDistance( - this._map.getCenterLiteral(), - 90, - defaultLength / 2 - ), - { draggable: true } - ); - this.marker2.addTo(this._map); - - this.marker1.markerLabel = new trackdirect.models.Label( - { - position: this.marker1.getLatLng(), - text: this._getDistance(this.marker1, this.marker2), - }, - this._map - ); - this.marker1.markerLabel.show(); - - this.marker2.markerLabel = new trackdirect.models.Label( - { - position: this.marker2.getLatLng(), - text: this._getDistance(this.marker2, this.marker1), - }, - this._map - ); - this.marker2.markerLabel.show(); - - this.line = new L.Polyline( - [this.marker1.getLatLng(), this.marker2.getLatLng()], - { - color: "#ffff00", - opacity: 0.8, - weight: 6, - } - ); - this.line.addTo(this._map); -}; - -/** - * Show ruler - */ -trackdirect.models.Ruler.prototype.show = function () { - this.marker1.markerLabel.show(); - this.marker2.markerLabel.show(); - - if (typeof google === "object" && typeof google.maps === "object") { - this.marker1.setMap(this._map); - this.marker2.setMap(this._map); - this.line.setMap(this._map); - } else if (typeof L === "object") { - this.marker1.addTo(this._map); - this.marker2.addTo(this._map); - this.line.addTo(this._map); - } -}; - -/** - * Hide ruler - */ -trackdirect.models.Ruler.prototype.hide = function () { - this.marker1.markerLabel.hide(); - this.marker2.markerLabel.hide(); - - if (typeof google === "object" && typeof google.maps === "object") { - this.marker1.setMap(null); - this.marker2.setMap(null); - this.line.setMap(null); - } else if (typeof L === "object") { - this._map.removeLayer(this.marker1); - this._map.removeLayer(this.marker2); - this._map.removeLayer(this.line); - } -}; - -/** - * Add listerners - */ -trackdirect.models.Ruler.prototype._addGoolgeMapsListeners = function () { - var me = this; - google.maps.event.addListener(this.marker1, "drag", function () { - me.line.setPath([me.marker1.getPosition(), me.marker2.getPosition()]); - me._updateLabels(); - }); - google.maps.event.addListener(this.marker2, "drag", function () { - me.line.setPath([me.marker1.getPosition(), me.marker2.getPosition()]); - me._updateLabels(); - }); -}; - -/** - * Add listerners - */ -trackdirect.models.Ruler.prototype._addLeafletListeners = function () { - var me = this; - this.marker1.on("drag", function (e) { - me.line.setLatLngs([me.marker1.getLatLng(), me.marker2.getLatLng()]); - me._updateLabels(); - }); - this.marker2.on("drag", function (e) { - me.line.setLatLngs([me.marker1.getLatLng(), me.marker2.getLatLng()]); - me._updateLabels(); - }); -}; - -/** - * Update labels with new text and new position - */ -trackdirect.models.Ruler.prototype._updateLabels = function () { - this.marker1.markerLabel.hide(); - this.marker2.markerLabel.hide(); - - if (typeof google === "object" && typeof google.maps === "object") { - this.marker1.markerLabel = new trackdirect.models.Label( - { - position: this.marker1.getPosition(), - text: this._getDistance(this.marker1, this.marker2), - }, - this._map - ); - this.marker2.markerLabel = new trackdirect.models.Label( - { - position: this.marker2.getPosition(), - text: this._getDistance(this.marker2, this.marker1), - }, - this._map - ); - } else if (typeof L === "object") { - this.marker1.markerLabel = new trackdirect.models.Label( - { - position: this.marker1.getLatLng(), - text: this._getDistance(this.marker1, this.marker2), - }, - this._map - ); - this.marker2.markerLabel = new trackdirect.models.Label( - { - position: this.marker2.getLatLng(), - text: this._getDistance(this.marker2, this.marker1), - }, - this._map - ); - } - - this.marker1.markerLabel.show(); - this.marker2.markerLabel.show(); -}; - -/** - * Get distance string for ruler - * @param {Marker} marker1 - * @param {Marker} marker2 - * @return {string} - */ -trackdirect.models.Ruler.prototype._getDistance = function (marker1, marker2) { - var p1 = this._getPositionLiteral(marker1); - var p2 = this._getPositionLiteral(marker2); - var distance = Math.round( - trackdirect.services.distanceCalculator.getDistance(p1, p2), - 0 - ); - if (distance > 99999) { - if (this._map.state.useImperialUnit) { - distance = - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - distance / 1000 - ) - ).toString() + " miles"; - } else { - distance = Math.round(distance / 1000).toString() + " km"; - } - } else if (distance > 999) { - if (this._map.state.useImperialUnit) { - distance = - ( - Math.round( - trackdirect.services.imperialConverter.convertKilometerToMile( - distance / 1000 - ) * 10 - ) / 10 - ).toString() + " miles"; - } else { - distance = (Math.round(distance / 100) / 10).toString() + " km"; - } - } else { - distance = distance.toString() + " m"; - } - var bearing = Math.round( - trackdirect.services.distanceCalculator.getBearing(p2, p1), - 0 - ).toString(); - return bearing + "º " + distance; -}; - -/** - * Get position literal - * @param {Marker} marker - * @return LatLngLiteral - */ -trackdirect.models.Ruler.prototype._getPositionLiteral = function (marker) { - if (typeof google === "object" && typeof google.maps === "object") { - var latLng = marker.getPosition(); - if (typeof latLng !== "undefined" && typeof latLng.lat === "function") { - return { lat: latLng.lat(), lng: latLng.lng() }; - } else { - return latLng; - } - } else if (typeof L === "object") { - var latLng = marker.getLatLng(); - if (typeof latLng !== "undefined") { - return { lat: latLng.lat, lng: latLng.lng }; - } else { - return latLng; - } - } - return null; -}; diff --git a/jslib/src/trackdirect/models/StationCoveragePolygon.js b/jslib/src/trackdirect/models/StationCoveragePolygon.js deleted file mode 100755 index 14e5c833240d3382686372394e068016bbc5b2fd..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/StationCoveragePolygon.js +++ /dev/null @@ -1,505 +0,0 @@ -/** - * Class trackdirect.models.StationCoveragePolygon - * @param {LatLngLiteral} center - * @param {trackdirect.models.Map} map - * @param {boolean} tryToShowCoveragePolygon - */ -trackdirect.models.StationCoveragePolygon = function ( - center, - map, - tryToShowCoveragePolygon -) { - tryToShowCoveragePolygon = - typeof tryToShowCoveragePolygon !== "undefined" - ? tryToShowCoveragePolygon - : true; - this._showPolygon = tryToShowCoveragePolygon; - - this._map = map; - this._center = center; - this._isRequestedToBeVisible = false; - - this._polygon = null; - this._polygonCoordinates = null; - - this._heatmapCoordinates = null; - this._heatmap = null; - - this._tdEventListeners = {}; - this._tdEventListenersOnce = {}; - - // I recommend ignoring positions with a very long distance. - // Ignoring everything with a distance longer than 1000km is reasonable. - this._upperMaxRangeInMeters = 1000 * 1000; - - // To get a smooth ploygon we add som padding to the convex hull positions. - this._paddingInPercentOfMaxRange = 10; - this._paddingMinInMeters = 1000; -}; - -/** - * Set coverage data - * @param {array} data - * @param {int} percentile - */ -trackdirect.models.StationCoveragePolygon.prototype.setData = function (data, percentile) { - this._addParametersToData(data); - this._heatmapCoordinates = this._getCoordinates(data); - - if (this._showPolygon) { - var maxRange = this._getCoveragePolygonMaxRange(data, percentile); - if (maxRange <= 0) { - this._showPolygon = false; - } else { - this._polygonCoordinates = this._getConvexHullCoordinates(data, maxRange); - } - } - - if (typeof google === "object" && typeof google.maps === "object") { - this._googleMapsInit(); - } else if (typeof L === "object") { - this._leafletInit(); - } -}; - -/** - * Add listener to events - * @param {string} event - * @param {string} handler - */ -trackdirect.models.StationCoveragePolygon.prototype.addTdListener = function ( - event, - handler, - execOnce -) { - execOnce = typeof execOnce !== "undefined" ? execOnce : false; - - if (execOnce) { - if (!(event in this._tdEventListenersOnce)) { - this._tdEventListenersOnce[event] = []; - } - this._tdEventListenersOnce[event].push(handler); - } else { - if (!(event in this._tdEventListeners)) { - this._tdEventListeners[event] = []; - } - this._tdEventListeners[event].push(handler); - } -}; - -/** - * Returns true if polygon has an area - * @return {boolean} - */ -trackdirect.models.StationCoveragePolygon.prototype.hasContent = function () { - if ( - this._heatmapCoordinates !== null && - this._heatmapCoordinates.length > 0 - ) { - return true; - } - return false; -}; - -/** - * Returns true if polygon is visible - * @return {boolean} - */ -trackdirect.models.StationCoveragePolygon.prototype.isRequestedToBeVisible = - function () { - return this._isRequestedToBeVisible; - }; - -/** - * Request polygon to be shown when complete - */ -trackdirect.models.StationCoveragePolygon.prototype.showWhenDone = function () { - this._isRequestedToBeVisible = true; -}; - -/** - * Show coverage - */ -trackdirect.models.StationCoveragePolygon.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this._polygon !== null) { - this._polygon.setMap(this._map); - } - if (this._heatmap !== null) { - this._heatmap.setMap(this._map); - } - } else if (typeof L === "object") { - if (this._polygon !== null) { - this._polygon.addTo(this._map); - } - if (this._heatmap !== null) { - this._heatmap.addTo(this._map); - } - } - this._isRequestedToBeVisible = true; - - // show will be called again when data has been updated - if (this._showPolygon && this._polygonCoordinates !== null) { - this._emitTdEventListeners("visible"); - } else if (this._heatmapCoordinates !== null) { - this._emitTdEventListeners("visible"); - } -}; - -/** - * Hide coverage - * @param {boolean} stillMarkAsVisible - */ -trackdirect.models.StationCoveragePolygon.prototype.hide = function ( - stillMarkAsVisible -) { - stillMarkAsVisible = - typeof stillMarkAsVisible !== "undefined" ? stillMarkAsVisible : false; - - if (typeof google === "object" && typeof google.maps === "object") { - if (this._polygon !== null) { - this._polygon.setMap(null); - } - if (this._heatmap !== null) { - this._heatmap.setMap(null); - } - } else if (typeof L === "object") { - if (this._polygon !== null) { - this._map.removeLayer(this._polygon); - } - if (this._heatmap !== null) { - this._map.removeLayer(this._heatmap); - } - } - if (!stillMarkAsVisible) { - this._isRequestedToBeVisible = false; - } - this._emitTdEventListeners("hidden"); -}; - -/** - * Init function for Gogle Maps - */ -trackdirect.models.StationCoveragePolygon.prototype._googleMapsInit = - function () { - if ( - this._polygonCoordinates !== null && - this._polygonCoordinates.length > 0 - ) { - this._polygon = new google.maps.Polygon({ - paths: this._polygonCoordinates, - strokeColor: "#0000FF", - strokeOpacity: 0, - strokeWeight: 0, - fillColor: "#0000FF", - fillOpacity: 0.2, - }); - } - - if ( - this._heatmapCoordinates !== null && - this._heatmapCoordinates.length > 0 - ) { - var data = []; - for (var i = 0; i < this._heatmapCoordinates.length; i++) { - data.push({ location: this._heatmapCoordinates[i], weight: 1 }); - } - - this._heatmap = new google.maps.visualization.HeatmapLayer({ - data: data, - radius: 8, - maxIntensity: 5, - gradient: [ - "rgba(0, 255, 255, 0)", - "rgba(0, 255, 255, 1)", - "rgba(0, 191, 255, 1)", - "rgba(0, 127, 255, 1)", - "rgba(0, 63, 255, 1)", - "rgba(0, 0, 255, 1)", - "rgba(0, 0, 223, 1)", - "rgba(0, 0, 191, 1)", - "rgba(0, 0, 159, 1)", - "rgba(0, 0, 127, 1)", - "rgba(63, 0, 91, 1)", - "rgba(127, 0, 63, 1)", - "rgba(191, 0, 31, 1)", - "rgba(255, 0, 0, 1)", - ], - map: null, - }); - } - }; - -/** - * Init function for Leaflet - */ -trackdirect.models.StationCoveragePolygon.prototype._leafletInit = function () { - if ( - this._polygonCoordinates !== null && - this._polygonCoordinates.length > 0 - ) { - this._polygon = new L.polygon(this._polygonCoordinates, { - color: "#0000FF", - opacity: 0, - weight: 0, - fillColor: "#0000FF", - fillOpacity: 0.2, - }); - } - - if ( - this._heatmapCoordinates !== null && - this._heatmapCoordinates.length > 0 - ) { - var data = []; - for (var i = 0; i < this._heatmapCoordinates.length; i++) { - data.push([ - this._heatmapCoordinates[i].lat, - this._heatmapCoordinates[i].lng, - 10, - ]); - } - this._heatmap = L.heatLayer(this._heatmapCoordinates, { - minOpacity: 0.35, - radius: 6, - blur: 4, - }); - } -}; - -/** - * Get convex hull coordinates - * @param {array} data - * @param {int} maxRange - * @return {array} - */ -trackdirect.models.StationCoveragePolygon.prototype._getConvexHullCoordinates = - function (data, maxRange) { - var positions = this._getFilteredPositions(data, maxRange); - positions.push(this._center); - - var xyPositions = this._convertToXYPos(positions); - var convexHullXYPositions = convexhull.makeHull(xyPositions); - - // Calc padding - var latLngPadding = - this._paddingInPercentOfMaxRange * 0.01 * maxRange * 0.000009; - var latLngPaddingMin = this._paddingMinInMeters * 0.000009; - if (isNaN(latLngPadding) || latLngPadding < latLngPaddingMin) { - latLngPadding = latLngPaddingMin; - } - - // Add padding - var xyPositionsWithPadding = []; - for (var i = 0; i < convexHullXYPositions.length; i++) { - xyPositionsWithPadding.push(convexHullXYPositions[i]); - - for (var angle = 0; angle < 360; angle += 10) { - var x = - convexHullXYPositions[i]["x"] + - latLngPadding * Math.cos((angle * Math.PI) / 180); - var y = - convexHullXYPositions[i]["y"] + - latLngPadding * Math.sin((angle * Math.PI) / 180) * 2; - if (!isNaN(x) && !isNaN(y)) { - xyPositionsWithPadding.push({ x: x, y: y }); - } - } - } - var convexHullXYPositionsWithPadding = convexhull.makeHull( - xyPositionsWithPadding - ); - - // Convert to LatLng and return - return this._convertToLatLngPos(convexHullXYPositionsWithPadding); - }; - -/** - * Get an array with valid positions - * @param {array} data - * @param {int} maxRange - * @return {array} - */ -trackdirect.models.StationCoveragePolygon.prototype._getFilteredPositions = - function (data, maxRange) { - var result = []; - - for (var i = 0; i < data.length; i++) { - if (typeof maxRange !== "undefined" && data[i].distance > maxRange) { - continue; - } - - result.push(data[i].latLngLiteral); - } - - return result; - }; - -/** - * Calculate coverage polygon max range - * @param {array} data - * @param {int} percentile - * @return {int} - */ -trackdirect.models.StationCoveragePolygon.prototype._getCoveragePolygonMaxRange = - function (data, percentile) { - var maxRange = this._getDistancePercentile( - data, - percentile, - this._upperMaxRangeInMeters - ); - if (isNaN(maxRange)) { - maxRange = 0; - } - - return maxRange; - }; - -/** - * Calculate the specified percentile - * @param {array} data - * @param {int} percentile - * @param {int} upperMaxRange - * @return {int} - */ -trackdirect.models.StationCoveragePolygon.prototype._getDistancePercentile = - function (data, percentile, upperMaxRange) { - var values = []; - for (var i = 0; i < data.length; i++) { - if (data[i].distance + 0 < upperMaxRange) { - values.push(data[i].distance); - } - } - - values.sort(function (a, b) { - return a - b; - }); - - var index = (percentile / 100) * values.length; - var result; - if (Math.floor(index) == index) { - result = (values[index - 1] + values[index]) / 2; - } else { - result = values[Math.floor(index)]; - } - - return result; - }; - -/** - * Calculate number of values - * @param {array} data - * @param {int} maxRange - * @return {int} - */ -trackdirect.models.StationCoveragePolygon.prototype._getNumberOfValues = - function (data, maxRange) { - var counter = 0; - for (var i = 0; i < data.length; i++) { - if (data[i].distance > maxRange) { - continue; - } - - counter++; - } - - return counter; - }; - -/** - * Convert to xy positions - * @param {array} data - * @return {array} - */ -trackdirect.models.StationCoveragePolygon.prototype._convertToXYPos = function ( - positions -) { - var result = []; - for (var i = 0; i < positions.length; i++) { - result.push({ x: positions[i].lat, y: positions[i].lng }); - } - return result; -}; - -/** - * Convert to lat/lng positions - * @param {array} data - * @return {array} - */ -trackdirect.models.StationCoveragePolygon.prototype._convertToLatLngPos = - function (positions) { - var result = []; - for (var i = 0; i < positions.length; i++) { - result.push({ lat: positions[i].x, lng: positions[i].y }); - } - return result; - }; - -/** - * Get an array of all coordinates for the specified move type - * @param {array} data - * @return {array} - */ -trackdirect.models.StationCoveragePolygon.prototype._getCoordinates = function ( - data -) { - var result = []; - - for (var j = 0; j < data.length; j++) { - if (typeof google === "object" && typeof google.maps === "object") { - var position = new google.maps.LatLng( - parseFloat(data[j]["latitude"]), - parseFloat(data[j]["longitude"]) - ); - } else { - var position = { - lat: parseFloat(data[j]["latitude"]), - lng: parseFloat(data[j]["longitude"]), - }; - } - result.push(position); - } - - return result; -}; - -/** - * Add the angle paramter for each coverage position - * @param {array} data - */ -trackdirect.models.StationCoveragePolygon.prototype._addParametersToData = - function (data) { - for (var j = 0; j < data.length; j++) { - var latLngLiteral = { - lat: parseFloat(data[j].latitude), - lng: parseFloat(data[j].longitude), - }; - data[j].latLngLiteral = latLngLiteral; - data[j].angle = trackdirect.services.distanceCalculator.getBearing( - this._center, - latLngLiteral - ); - } - }; - -/** - * Emit all event listeners for a specified event - * @param {string} event - * @param {object} arg - */ -trackdirect.models.StationCoveragePolygon.prototype._emitTdEventListeners = - function (event, arg) { - if (event in this._tdEventListeners) { - for (var i = 0; i < this._tdEventListeners[event].length; i++) { - this._tdEventListeners[event][i](arg); - } - } - - if (event in this._tdEventListenersOnce) { - var eventListenersOnce = this._tdEventListenersOnce[event].splice(0); - this._tdEventListenersOnce[event] = []; - for (var i = 0; i < eventListenersOnce.length; i++) { - eventListenersOnce[i](arg); - } - } - }; diff --git a/jslib/src/trackdirect/models/TailPolyline.js b/jslib/src/trackdirect/models/TailPolyline.js deleted file mode 100755 index 4b85238bada136bd1bfbeec38dea9d9edfcf6be7..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/TailPolyline.js +++ /dev/null @@ -1,247 +0,0 @@ -/** - * Class trackdirect.models.TailPolyline - * @see https://developers.google.com/maps/documentation/javascript/reference#Polyline - * @param {string} color - * @param {trackdirect.models.Map} map - */ -trackdirect.models.TailPolyline = function (color, map) { - this._defaultMap = map; - this.markerIdKey = null; - this.ownerMarkerIdKey = null; - this.relatedMarkerIdKey = null; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Polyline.call(this, this._getGooglePolylineOptions(color)); - } else if (typeof L === "object") { - L.Polyline.call(this, {}, this._getLeafletPolylineOptions(color)); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.TailPolyline.prototype = Object.create( - google.maps.Polyline.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.TailPolyline.prototype = Object.create( - L.Polyline.prototype - ); -} -trackdirect.models.TailPolyline.prototype.constructor = - trackdirect.models.TailPolyline; - -/** - * Get latLng object by index - */ -trackdirect.models.TailPolyline.prototype.getPathItem = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - return path.getAt(index); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - if (typeof list[index] !== "undefined") { - return list[index]; - } else { - return null; - } - } - return null; -}; - -/** - * Push latLng object to path - */ -trackdirect.models.TailPolyline.prototype.pushPathItem = function (latLng) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - path.push(latLng); - } else if (typeof L === "object") { - this.addLatLng(latLng); - } -}; - -/** - * Remove latLng object by index - */ -trackdirect.models.TailPolyline.prototype.removePathItem = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - path.removeAt(index); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - if (typeof list[index] !== "undefined") { - list.splice(index, 1); - this.setLatLngs(list); - } - } -}; - -/** - * Get Path length - */ -trackdirect.models.TailPolyline.prototype.getPathLength = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - return path.getLength(); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - return list.length; - } -}; - -/** - * Get latLng array - */ -trackdirect.models.TailPolyline.prototype.getPath = function () { - if (typeof google === "object" && typeof google.maps === "object") { - return google.maps.Polyline.prototype.getPath.call(this); - } else if (typeof L === "object") { - return this.getLatLngs(); - } - return []; -}; - -/** - * get polyline currently active Map - * @return {google.maps.Map} - */ -trackdirect.models.TailPolyline.prototype.getMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var map = google.maps.Polyline.prototype.getMap.call(this); - if (typeof map !== "undefined") { - return map; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return this._defaultMap; - } - } - return null; -}; - -/** - * Set markerIdKey - * @param {int} markerIdKey - */ -trackdirect.models.TailPolyline.prototype.setMarkerIdKey = function ( - markerIdKey -) { - // Two names for the same thing... - this.markerIdKey = markerIdKey; - this.ownerMarkerIdKey = markerIdKey; - this._addInfoWindowListener(markerIdKey); -}; - -/** - * Set related markerIdKey - * @param {int} markerIdKey - */ -trackdirect.models.TailPolyline.prototype.setRelatedMarkerIdKey = function ( - markerIdKey -) { - this.relatedMarkerIdKey = markerIdKey; -}; - -/** - * Show polylne on default map - */ -trackdirect.models.TailPolyline.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } -}; - -/** - * Hide polylne transmit polyline - */ -trackdirect.models.TailPolyline.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - } -}; - -/** - * Add marker to polyline - * @param {trackdirect.models.Marker} marker - */ -trackdirect.models.TailPolyline.prototype.addMarker = function (marker) { - if (typeof google === "object" && typeof google.maps === "object") { - var latLng = new google.maps.LatLng( - parseFloat(marker.packet.latitude), - parseFloat(marker.packet.longitude) - ); - latLng.marker = marker; - this.pushPathItem(latLng); - } else if (typeof L === "object") { - var latLng = new L.latLng( - parseFloat(marker.packet.latitude), - parseFloat(marker.packet.longitude) - ); - latLng.marker = marker; - this.addLatLng(latLng); - } -}; - -/** - * Add infowindow listener - * @param {int} markerIdKey - */ -trackdirect.models.TailPolyline.prototype._addInfoWindowListener = function ( - markerIdKey -) { - var me = this; - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.event.addListener(this, "click", function (event) { - var marker = me._defaultMap.markerCollection.getMarker(markerIdKey); - me._defaultMap.openPolylineInfoWindow(marker, event.latLng); - }); - } else if (typeof L === "object") { - this.on("click", function (event) { - var marker = me._defaultMap.markerCollection.getMarker(markerIdKey); - me._defaultMap.openPolylineInfoWindow(marker, event.latlng); - }); - } -}; - -/** - * Get a suitable google polyline options object - * @param {string} color - * @return {object} - */ -trackdirect.models.TailPolyline.prototype._getGooglePolylineOptions = function ( - color -) { - return { - geodesic: false, - strokeOpacity: 0.6, - strokeWeight: 4, - strokeColor: color, - map: null, - zIndex: 100, - }; -}; - -/** - * Get a suitable leaflet polyline options object - * @param {string} color - * @return {object} - */ -trackdirect.models.TailPolyline.prototype._getLeafletPolylineOptions = - function (color) { - return { - opacity: 0.7, - weight: 4, - color: color, - }; - }; diff --git a/jslib/src/trackdirect/models/TransmitAnimation.js b/jslib/src/trackdirect/models/TransmitAnimation.js deleted file mode 100755 index a37e6bae8df8fc03b4b12ba8fc13fad9d4e418da..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/TransmitAnimation.js +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Class trackdirect.models.TransmitAnimation inherits google.maps.Marker - * @see https://developers.google.com/maps/documentation/javascript/reference#Marker - * @param {trackdirect.models.Marker} marker - * @param {trackdirect.models.Map} map - */ -trackdirect.models.TransmitAnimation = function (marker, map) { - this._map = map; - this._marker = marker; - this.init(); -}; - -/** - * Show transmit animation - */ -trackdirect.models.TransmitAnimation.prototype.show = function () { - this._startAnimation(); -}; - -/** - * Hide transmit animation - */ -trackdirect.models.TransmitAnimation.prototype.hide = function () { - if (typeof google === "object" && typeof google.maps === "object") { - this.iconMarkers[1].setMap(null); - this.iconMarkers[2].setMap(null); - this.iconMarkers[3].setMap(null); - } else if (typeof L === "object") { - this._map.removeLayer(this.iconMarkers[1]); - this._map.removeLayer(this.iconMarkers[2]); - this._map.removeLayer(this.iconMarkers[3]); - } - this.marker.transmitPolyLine.hide(); -}; - -/** - * Show packet send animation - */ -trackdirect.models.TransmitAnimation.prototype.init = function () { - var newLatLng = this._marker.packet.getLatLngLiteral(); - this._marker.transmitPolyLine = new trackdirect.models.TransmitPolyline( - this._marker.packet, - this._map - ); - this.iconMarkers = []; - for (var i = 1; i <= 3; i++) { - var icon = this._getIcon(i); - if (typeof google === "object" && typeof google.maps === "object") { - var iconMarker = new google.maps.Marker({ - position: newLatLng, - zIndex: this._map.state.currentMarkerZindex, - icon: icon, - opacity: 0.6, - }); - } else if (typeof L === "object") { - var iconMarker = new L.Marker(newLatLng, { - zIndexOffset: this._map.state.currentMarkerZindex, - icon: icon, - opacity: 0.6, - }); - } - this.iconMarkers[i] = iconMarker; - } -}; - -/** - * Get transmit icon - * @param {int} index - * @return {object} - */ -trackdirect.models.TransmitAnimation.prototype._getIcon = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var icon = { - url: - trackdirect.settings.baseUrl + - trackdirect.settings.imagesBaseDir + - "transmit" + - index + - ".png", - size: new google.maps.Size(60, 60), - origin: new google.maps.Point(0, 0), - anchor: new google.maps.Point(30, 30), - }; - } else if (typeof L === "object") { - var icon = L.icon({ - iconUrl: - trackdirect.settings.baseUrl + - trackdirect.settings.imagesBaseDir + - "transmit" + - index + - ".png", - iconSize: [60, 60], - iconAnchor: [30, 30], - }); - } - return icon; -}; - -/** - * Start the previously created activity animation - * @param {object} marker - * @param {array} iconMarkers - */ -trackdirect.models.TransmitAnimation.prototype._startAnimation = function () { - var me = this; - me._showIconMarker(1); - - window.setTimeout(function () { - me._showIconMarker(2); - }, 150); - - window.setTimeout(function () { - me._showIconMarker(3); - - if (me._marker.transmitPolyLine !== null) { - me._marker.transmitPolyLine.show(); - } - }, 300); - - window.setTimeout(function () { - me._hideIconMarker(1); - }, 800); - - window.setTimeout(function () { - me._hideIconMarker(2); - }, 900); - - window.setTimeout(function () { - me._hideIconMarker(3); - - if (me._marker.transmitPolyLine != null) { - me._marker.transmitPolyLine.hide(4000); - } - }, 1000); -}; - -/** - * Show icon marker with specified index - * @param {int} index - */ -trackdirect.models.TransmitAnimation.prototype._showIconMarker = function ( - index -) { - if (typeof google === "object" && typeof google.maps === "object") { - this.iconMarkers[index].setMap(this._map); - } else if (typeof L === "object") { - this.iconMarkers[index].addTo(this._map); - } -}; - -/** - * Hide icon marker with specified index - * @param {int} index - */ -trackdirect.models.TransmitAnimation.prototype._hideIconMarker = function ( - index -) { - if (typeof google === "object" && typeof google.maps === "object") { - this.iconMarkers[index].setMap(null); - } else if (typeof L === "object") { - this._map.removeLayer(this.iconMarkers[index]); - } -}; diff --git a/jslib/src/trackdirect/models/TransmitPolyline.js b/jslib/src/trackdirect/models/TransmitPolyline.js deleted file mode 100755 index 31abeacd6d075f810e1acb45c66e77189e649d01..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/models/TransmitPolyline.js +++ /dev/null @@ -1,334 +0,0 @@ -/** - * Class trackdirect.models.TransmitPolyline inherits google.maps.Polyline - * @see https://developers.google.com/maps/documentation/javascript/reference#Polyline - * @param {trackdirect.models.Marker} marker - * @param {trackdirect.models.Map} map - */ -trackdirect.models.TransmitPolyline = function (packet, map) { - this._packet = packet; - this._defaultMap = map; - this._relatedMarkerIdKeys = []; - - // Call the parent constructor - if (typeof google === "object" && typeof google.maps === "object") { - google.maps.Polyline.call(this, this._getGoolgePolylineOptions()); - } else if (typeof L === "object") { - L.Polyline.call(this, {}, this._getLeafletPolylineOptions()); - this.setLatLngs(this.getCoordinates()); - } -}; -if (typeof google === "object" && typeof google.maps === "object") { - trackdirect.models.TransmitPolyline.prototype = Object.create( - google.maps.Polyline.prototype - ); -} else if (typeof L === "object") { - trackdirect.models.TransmitPolyline.prototype = Object.create( - L.Polyline.prototype - ); -} -trackdirect.models.TransmitPolyline.prototype.constructor = - trackdirect.models.TransmitPolyline; - -/** - * Get latLng object by index - */ -trackdirect.models.TransmitPolyline.prototype.getPathItem = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - return path.getAt(index); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - if (typeof list[index] !== "undefined") { - return list[index]; - } else { - return null; - } - } - return null; -}; - -/** - * Push latLng object to path - */ -trackdirect.models.TransmitPolyline.prototype.pushPathItem = function (latLng) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - path.push(latLng); - } else if (typeof L === "object") { - this.addLatLng(latLng); - } -}; - -/** - * Remove latLng object by index - */ -trackdirect.models.TransmitPolyline.prototype.removePathItem = function ( - index -) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - path.removeAt(index); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - if (typeof list[index] !== "undefined") { - list.splice(index, 1); - this.setLatLngs(list); - } - } -}; - -/** - * Get Path length - */ -trackdirect.models.TransmitPolyline.prototype.getPathLength = function (index) { - if (typeof google === "object" && typeof google.maps === "object") { - var path = google.maps.Polyline.prototype.getPath.call(this); - return path.getLength(); - } else if (typeof L === "object") { - var list = this.getLatLngs(); - return list.length; - } -}; - -/** - * Get latLng array - */ -trackdirect.models.TransmitPolyline.prototype.getPath = function () { - if (typeof google === "object" && typeof google.maps === "object") { - return google.maps.Polyline.prototype.getPath.call(this); - } else if (typeof L === "object") { - return this.getLatLngs(); - } - return []; -}; - -/** - * Get Polyline currently active Map - * @return {google.maps.Map} - */ -trackdirect.models.TransmitPolyline.prototype.getMap = function () { - if (typeof google === "object" && typeof google.maps === "object") { - var map = google.maps.Polyline.prototype.getMap.call(this); - if (typeof map !== "undefined") { - return map; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return this._defaultMap; - } - } - return null; -}; - -/** - * Show Polyline on default map - */ -trackdirect.models.TransmitPolyline.prototype.show = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() === "undefined" || this.getMap() === null) { - this.setMap(this._defaultMap); - } - } else if (typeof L === "object") { - if (!this._defaultMap.hasLayer(this)) { - this.addTo(this._defaultMap); - } - } - - for (var i = 0; i < this._relatedMarkerIdKeys.length; i++) { - var relatedMarkerIdKey = this._relatedMarkerIdKeys[i]; - if ( - this._defaultMap.markerCollection.isExistingMarker(relatedMarkerIdKey) - ) { - var relatedMarker = - this._defaultMap.markerCollection.getMarker(relatedMarkerIdKey); - relatedMarker.show(); - relatedMarker.showLabel(); - } - } -}; - -/** - * Hide transmit polyline - * @param {int} delayInMilliSeconds - */ -trackdirect.models.TransmitPolyline.prototype.hide = function ( - delayInMilliSeconds -) { - if (typeof google === "object" && typeof google.maps === "object") { - if (this.getMap() !== null) { - this.setMap(null); - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - this._defaultMap.removeLayer(this); - } - } - - for (var i = 0; i < this._relatedMarkerIdKeys.length; i++) { - var relatedMarkerIdKey = this._relatedMarkerIdKeys[i]; - - if ( - this._defaultMap.markerCollection.isExistingMarker(relatedMarkerIdKey) - ) { - var relatedMarker = - this._defaultMap.markerCollection.getMarker(relatedMarkerIdKey); - if (relatedMarker !== null && relatedMarker.getMap() !== null) { - relatedMarker.hide(delayInMilliSeconds, true); - } - } - } -}; - -/** - * Returns true if marker is visible - * @return {boolean} - */ -trackdirect.models.TransmitPolyline.prototype.isVisible = function () { - if (typeof google === "object" && typeof google.maps === "object") { - if (typeof this.getMap() !== "undefined" && this.getMap() !== null) { - return true; - } - } else if (typeof L === "object") { - if (this._defaultMap.hasLayer(this)) { - return true; - } - } - return false; -}; - -/** - * Get a suitable google polyline options object - * @return {object} - */ -trackdirect.models.TransmitPolyline.prototype._getGoolgePolylineOptions = - function () { - var lineCoordinates = this.getCoordinates(); - if (lineCoordinates.length <= 1) { - lineCoordinates = []; - } - - var lineSymbol = { - path: "M 0,-0.1 0,0", - strokeOpacity: 0.7, - scale: 3, - }; - - return { - path: lineCoordinates, - strokeOpacity: 0, - strokeColor: "#0000ff", - icons: [ - { - icon: lineSymbol, - offset: "0px", - repeat: "5px", - }, - ], - map: null, - zIndex: 100, - }; - }; - -/** - * Get a suitable leaflet polyline options object - * @return {object} - */ -trackdirect.models.TransmitPolyline.prototype._getLeafletPolylineOptions = - function () { - return { - opacity: 0.6, - weight: 3, - color: "#0000ff", - dashArray: "1,5", - lineCap: "round", - lineJoin: "round", - }; - }; - -/** - * Returns coordinates for the transmit polyline - * @return {array} - */ -(trackdirect.models.TransmitPolyline.prototype.getCoordinates = function () { - // First we try to find other position by looking at station markers on map - // This is better if the receiving stations has moved - var lineCoordinates = this.getCoordinatesByStationMarkers(); - if (lineCoordinates.length < this._packet.station_location_path.length + 1) { - lineCoordinates = this.getCoordinatesByPositions(); - } - return lineCoordinates; -}), - /** - * Returns coordinates for the transmit polyline by looking at station markers - * @return {array} - */ - (trackdirect.models.TransmitPolyline.prototype.getCoordinatesByStationMarkers = - function () { - var lineCoordinates = []; - var startLatLng = this._packet.getLatLngLiteral(); - lineCoordinates.push(startLatLng); - - for (var i = 0; i < this._packet.station_id_path.length; i++) { - var stationId = this._packet.station_id_path[i]; - var stationMarkerIdKey = null; - var stationMarker = null; - var stationDistance = null; - var stationLatLng = null; - - for (var pointMarkerIdKey in this._defaultMap.markerCollection.getStationMarkerIdKeys( - stationId - )) { - var pointMarker = - this._defaultMap.markerCollection.getMarker(pointMarkerIdKey); - if (pointMarker !== null) { - var pointLatLng = pointMarker.packet.getLatLngLiteral(); - var distance = trackdirect.services.distanceCalculator.getDistance( - startLatLng, - pointLatLng - ); - - if (stationMarker === null || distance < stationDistance) { - stationMarkerIdKey = pointMarkerIdKey; - stationMarker = pointMarker; - stationDistance = distance; - stationLatLng = pointLatLng; - } - } - } - - if (stationLatLng !== null) { - lineCoordinates.push(stationLatLng); - this._relatedMarkerIdKeys.push(stationMarkerIdKey); - } - } - return lineCoordinates; - }), - /** - * Returns coordinates for the transmit polyline by looking at received positions - * @return {array} - */ - (trackdirect.models.TransmitPolyline.prototype.getCoordinatesByPositions = - function () { - var lineCoordinates = []; - var startLatLng = this._packet.getLatLngLiteral(); - lineCoordinates.push(startLatLng); - - if ( - lineCoordinates.length < - this._packet.station_location_path.length + 1 - ) { - // If we do not have stations on map we use the lat/lng positions - for (var i = 0; i < this._packet.station_location_path.length; i++) { - if ( - this._packet.station_location_path[i][0] !== null && - this._packet.station_location_path[i][1] !== null - ) { - lineCoordinates.push({ - lat: parseFloat(this._packet.station_location_path[i][0]), - lng: parseFloat(this._packet.station_location_path[i][1]), - }); - } - } - } - return lineCoordinates; - }); diff --git a/jslib/src/trackdirect/services/callbackExecutor.js b/jslib/src/trackdirect/services/callbackExecutor.js deleted file mode 100755 index 70ec3679015828419460ad775875f623fdebb4ad..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/callbackExecutor.js +++ /dev/null @@ -1,154 +0,0 @@ -trackdirect.services.callbackExecutor = { - /** @type {object} */ - settings: { - minTimeBeforeSleep: 30, // in ms - }, - - /** @type {boolean} */ - _running: false, - - /** @type {int} */ - _lastSleepTimestamp: 0, - - /** @type {object} */ - _lastAddedUniqueCallback: null, - - /** @type {array} */ - _lowPriorityQueue: [], - _normalPriorityQueue: [], - _highPriorityQueue: [], - - /** - * Add a call to the execution queue - * @param {object} thisObj - * @param {function} callback - * @param {array} argsArray - * @return {trackdirect.services.callbackExecutor} - */ - add: function (thisObj, callback, argsArray) { - var callBackString = callback.toString() + ":" + argsArray.toString(); - this._lastAddedUniqueCallback = callBackString; - - this._normalPriorityQueue.push(function () { - callback.apply(thisObj, argsArray); - trackdirect.services.callbackExecutor._next(); - }); - - this.start(); - return this; - }, - - /** - * Add a call to the execution queue if it is unique - * @param {object} thisObj - * @param {function} callback - * @param {array} argsArray - * @return {trackdirect.services.callbackExecutor} - */ - addIfUnique: function (thisObj, callback, argsArray) { - var callBackString = callback.toString() + ":" + argsArray.toString(); - if (this._lastAddedUniqueCallback == callBackString) { - return this; - } - this._lastAddedUniqueCallback = callBackString; - - this._normalPriorityQueue.push(function () { - callback.apply(thisObj, argsArray); - trackdirect.services.callbackExecutor._next(); - }); - - this.start(); - return this; - }, - - /** - * Add a call to the execution queue, and give it priority over regular calls - * @param {object} thisObj - * @param {function} callback - * @param {array} argsArray - * @return {trackdirect.services.callbackExecutor} - */ - addWithPriority: function (thisObj, callback, argsArray) { - this._highPriorityQueue.push(function () { - callback.apply(thisObj, argsArray); - trackdirect.services.callbackExecutor._next(); - }); - - this.start(); - return this; - }, - - /** - * Add a call to the execution queue, and give it lower priority than regular calls - * @param {object} thisObj - * @param {function} callback - * @param {array} argsArray - * @return {trackdirect.services.callbackExecutor} - */ - addWithLowPriority: function (thisObj, callback, argsArray) { - this._lowPriorityQueue.push(function () { - callback.apply(thisObj, argsArray); - trackdirect.services.callbackExecutor._next(); - }); - - this.start(); - return this; - }, - - /** - * Start the execution - * @return {trackdirect.services.callbackExecutor} - */ - start: function () { - if (!this._running) { - this._next(); - } - return this; - }, - - /** - * Execute the first call in queue when ready - */ - _next: function () { - var secondsSinceLastSleep = Date.now() - this._lastSleepTimestamp; - if (secondsSinceLastSleep > this.settings.minTimeBeforeSleep) { - // Sleep 1ms after some ms, to avoid browser freeze - // We also count recursive calls since last sleep to avoid the error: Maximum call stack size exceeded - this._lastSleepTimestamp = Date.now(); - var me = this; - setTimeout(function () { - me._dequeue(); - }, 1); - } else { - this._dequeue(); - } - }, - - /** - * Execute the first call in queue - */ - _dequeue: function () { - var shift = this._highPriorityQueue.shift(); - if (shift) { - this._running = true; - shift(); - return; - } - - shift = this._normalPriorityQueue.shift(); - if (shift) { - this._running = true; - shift(); - return; - } - - shift = this._lowPriorityQueue.shift(); - if (shift) { - this._running = true; - shift(); - return; - } - - this._running = false; - }, -}; diff --git a/jslib/src/trackdirect/services/dateFormatter.js b/jslib/src/trackdirect/services/dateFormatter.js deleted file mode 100755 index c8b7f14e6bfad1fe181bbc9c719692cfa0aa32d1..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/dateFormatter.js +++ /dev/null @@ -1,100 +0,0 @@ -trackdirect.services.dateFormatter = { - /** - * Returns the timestamp in a humen readable form (based on browser locale settings) - * @param {int} timestamp - * @param {boolean} includeTimeZone - * @param {boolean} includeTime - * @param {boolean} useLocalTimeZone - * @return {string} - */ - getDateString: function ( - timestamp, - includeTimeZone, - includeTime, - useLocalTimeZone - ) { - includeTimeZone = - typeof includeTimeZone !== "undefined" ? includeTimeZone : true; - includeTime = typeof includeTime !== "undefined" ? includeTime : true; - useLocalTimeZone = - typeof useLocalTimeZone !== "undefined" ? useLocalTimeZone : true; - var date = new Date(timestamp * 1000); - - if (useLocalTimeZone) { - var theMoment = moment(date); - } else { - var theMoment = moment.utc(date); - } - - if (!theMoment.isValid()) { - return timestamp; - } - - if (includeTime) { - if (includeTimeZone) { - return theMoment.format("L LTSZ"); - } else { - return theMoment.format("L LTS"); - } - } else { - return theMoment.format("L"); - } - }, - - /** - * Get timestamp age as human readable string - * @param {int} timestamp - * @return {string} - */ - getAgeString: function (timestamp) { - // get total seconds between the times - var delta = Math.abs(Math.floor(Date.now() / 1000) - timestamp); - - // calculate (and subtract) whole days - var days = Math.floor(delta / 86400); - delta -= days * 86400; - - // calculate (and subtract) whole hours - var hours = Math.floor(delta / 3600) % 24; - delta -= hours * 3600; - - // calculate (and subtract) whole minutes - var minutes = Math.floor(delta / 60) % 60; - delta -= minutes * 60; - - // what's left is seconds - var seconds = Math.floor(delta % 60); - - var timeAgoList = []; - if (days > 1) { - timeAgoList.push(days + " days"); - } else if (days > 0) { - timeAgoList.push(days + " day"); - } - if (hours > 1) { - timeAgoList.push(hours + " hours"); - } else if (hours > 0) { - timeAgoList.push(hours + " hour"); - } - if (minutes > 1) { - timeAgoList.push(minutes + " minutes"); - } else if (minutes > 0) { - timeAgoList.push(minutes + " minute"); - } - if (seconds == 1) { - timeAgoList.push(seconds + " second"); - } else { - timeAgoList.push(seconds + " seconds"); - } - - if (timeAgoList.length > 1) { - return ( - timeAgoList.slice(0, timeAgoList.length - 1).join(", ") + - " and " + - timeAgoList[timeAgoList.length - 1] - ); - } else { - return timeAgoList[timeAgoList.length - 1]; - } - }, -}; diff --git a/jslib/src/trackdirect/services/distanceCalculator.js b/jslib/src/trackdirect/services/distanceCalculator.js deleted file mode 100755 index 93f32364401c4eaa782e81c3cf2fd3fd861517f3..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/distanceCalculator.js +++ /dev/null @@ -1,133 +0,0 @@ -trackdirect.services.distanceCalculator = { - /** - * Get distance in meters between to positions - * @param {LatLngLiteral} p1 - * @param {LatLngLiteral} p2 - * @return {float} - */ - getDistance: function (p1, p2) { - var R = 6378137; // Earth’s mean radius in meter - var dLat = this._radians(p2.lat - p1.lat); - var dLong = this._radians(p2.lng - p1.lng); - var a = - Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(this._radians(p1.lat)) * - Math.cos(this._radians(p2.lat)) * - Math.sin(dLong / 2) * - Math.sin(dLong / 2); - var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - var d = R * c; - if (isNaN(d)) { - return null; - } else { - return d; // returns the distance in meter - } - }, - - /** - * Get center of specified coordinates - * @param {array} coords - * @return {LatLngLiteral} - */ - getCenter: function (coords) { - var x = coords.map(function (a) { - return a.lat; - }); - var y = coords.map(function (a) { - return a.lng; - }); - var minX = Math.min.apply(null, x); - var maxX = Math.max.apply(null, x); - var minY = Math.min.apply(null, y); - var maxY = Math.max.apply(null, y); - return { lat: (minX + maxX) / 2, lng: (minY + maxY) / 2 }; - }, - - /** - * Get position by course and distance - * @param {LatLngLiteral} latLng - * @param {int} course - * @param {int} distanceInMeters - * @return {LatLngLiteral} - */ - getPositionByDistance: function (latLng, course, distanceInMeters) { - var dist = distanceInMeters / 1000; // Convert to km - dist = dist / 6371; // Divide by Earth radius - var brng = (course * Math.PI) / 180; // Convert to Rad - - var lat1 = (latLng.lat * Math.PI) / 180, - lon1 = (latLng.lng * Math.PI) / 180; - - var lat2 = Math.asin( - Math.sin(lat1) * Math.cos(dist) + - Math.cos(lat1) * Math.sin(dist) * Math.cos(brng) - ); - - var lon2 = - lon1 + - Math.atan2( - Math.sin(brng) * Math.sin(dist) * Math.cos(lat1), - Math.cos(dist) - Math.sin(lat1) * Math.sin(lat2) - ); - - if (isNaN(lat2) || isNaN(lon2)) return null; - - // Convert to deg and return - var latitude = (lat2 * 180) / Math.PI; - var longitude = (lon2 * 180) / Math.PI; - return { - lat: Math.round(latitude * 100000) / 100000, - lng: Math.round(longitude * 100000) / 100000, - }; - }, - - /** - * Get bearing between two points - * @param {object} p1 - * @param {object} p2 - * @return {float} - */ - getBearing: function (p1, p2) { - startLat = this._radians(p1.lat); - startLong = this._radians(p1.lng); - endLat = this._radians(p2.lat); - endLong = this._radians(p2.lng); - - var dLong = endLong - startLong; - var dPhi = Math.log( - Math.tan(endLat / 2.0 + Math.PI / 4.0) / - Math.tan(startLat / 2.0 + Math.PI / 4.0) - ); - - //var dLong = Math.sin(endLong - startLong) * Math.cos(endLat); - //var dPhi = Math.cos(startLat)*Math.sin(endLat) - Math.sin(startLat)*Math.cos(endLat)*Math.cos(endLong-startLong); - - if (Math.abs(dLong) > Math.PI) { - if (dLong > 0.0) { - dLong = -(2.0 * Math.PI - dLong); - } else { - dLong = 2.0 * Math.PI + dLong; - } - } - - return (this._degrees(Math.atan2(dLong, dPhi)) + 360.0) % 360.0; - }, - - /** - * Convert degrees to radians - * @param {float} n - * @return {float} - */ - _radians: function (n) { - return n * (Math.PI / 180); - }, - - /** - * Convert radians to degrees - * @param {float} n - * @return {float} - */ - _degrees: function (n) { - return n * (180 / Math.PI); - }, -}; diff --git a/jslib/src/trackdirect/services/imperialConverter.js b/jslib/src/trackdirect/services/imperialConverter.js deleted file mode 100755 index c4622ad9561bf6e9f58262894b9cb76c409a1aef..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/imperialConverter.js +++ /dev/null @@ -1,64 +0,0 @@ -trackdirect.services.imperialConverter = { - /** - * Convert km to miles (or km/h to mph) - * @param {float} value - * @return float - */ - convertKilometerToMile: function (value) { - return value * 0.621371192; - }, - - /** - * Convert meter per second to miles per second - * @param {float} value - * @return float - */ - convertMpsToMph: function (value) { - return value * 2.23693629; - }, - - /** - * Convert meter to feet - * @param {float} value - * @return float - */ - convertMeterToFeet: function (value) { - return value * 3.2808399; - }, - - /** - * Convert meter to yard - * @param {float} value - * @return float - */ - convertMeterToYard: function (value) { - return value * 1.0936133; - }, - - /** - * Convert mm to inches - * @param {float} value - * @return float - */ - convertMmToInch: function (value) { - return value * 0.0393700787; - }, - - /** - * Convert celcius to fahrenheit - * @param {float} value - * @return float - */ - convertCelciusToFahrenheit: function (value) { - return value * (9 / 5) + 32; - }, - - /** - * Convert hPa/mbar to mmhg - * @param {float} value - * @return float - */ - convertMbarToMmhg: function (value) { - return value * 0.75006375541921; - }, -}; diff --git a/jslib/src/trackdirect/services/mapAttributionModifier.js b/jslib/src/trackdirect/services/mapAttributionModifier.js deleted file mode 100755 index a4a1d8fa6a4328542efe7c12c59875cc8a8a2643..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/mapAttributionModifier.js +++ /dev/null @@ -1,297 +0,0 @@ -trackdirect.services.mapAttributionModifier = { - _hereBaseAttributionData: null, - _hereAerialAttributionData: null, - _latestAttribution: null, - _isHereInitialized: false, - _eventListeners: {}, - _eventListenersOnce: {}, - - /** - * Update the map attribution - * @param {trackdirect.models.Map} map - */ - update: function (map) { - if (this._isHereTileProvider(map)) { - this.updateHereAttribution(map); - } else if (this._latestAttribution != null) { - // Just reset attribution to default - this.setMapAttribution(map, ""); - } - }, - - /** - * Update the HERE map attribution - * @param {trackdirect.models.Map} map - */ - updateHereAttribution: function (map) { - this._loadHereAttributionData(map); - var me = this; - var base = this._getMapTileBase(map); - if (base == "base") { - this.addListener( - "init-here-base", - function () { - var attribution = me._getHereAttributionString(map); - me.setMapAttribution(map, attribution); - }, - true - ); - } else if (base == "aerial") { - this.addListener( - "init-here-aerial", - function () { - var attribution = me._getHereAttributionString(map); - me.setMapAttribution(map, attribution); - }, - true - ); - } - }, - - /** - * Set map attribution to specified string - * @param {trackdirect.models.Map} map - * @param {string} attribution - */ - setMapAttribution: function (map, attribution) { - if (this._latestAttribution != attribution) { - map.attributionControl.removeAttribution(this._latestAttribution); - if (attribution != "") { - map.attributionControl.addAttribution(attribution); - } - } - - this._latestAttribution = attribution; - }, - - /** - * Add new event listener - * @param {string} event - * @param {string} handler - * @param {boolean} execOnce - */ - addListener: function (event, handler, execOnce) { - execOnce = typeof execOnce !== "undefined" ? execOnce : false; - - if (execOnce) { - if (!(event in this._eventListenersOnce)) { - this._eventListenersOnce[event] = []; - } - this._eventListenersOnce[event].push(handler); - } else { - if (!(event in this._eventListeners)) { - this._eventListeners[event] = []; - } - this._eventListeners[event].push(handler); - } - - if (event == "init-here-base" && this._isHereBaseInitialized) { - this._emitEventListeners("init-here-base"); - } - - if (event == "init-here-aerial" && this._isHereAerialInitialized) { - this._emitEventListeners("init-here-aerial"); - } - }, - - /** - * Returnes true if the map tile provider is here.com - * @param {trackdirect.models.Map} map - * @return {Boolean} - */ - _isHereTileProvider: function (map) { - var tileLayer = map.getLeafletTileLayer(); - if ( - tileLayer !== null && - typeof tileLayer._url !== "undefined" && - tileLayer._url.indexOf("here.com") >= 0 - ) { - return true; - } - - return false; - }, - - /** - * Get map tile variant - * @param {trackdirect.models.Map} map - */ - _getMapTileOptions: function (map) { - var tileLayer = map.getLeafletTileLayer(); - if (tileLayer !== null && typeof tileLayer.options !== "undefined") { - return tileLayer.options; - } - - return null; - }, - - /** - * Get map tile variant - * @param {trackdirect.models.Map} map - */ - _getMapTileVariant: function (map) { - var options = this._getMapTileOptions(map); - if (options.variant !== "undefined") { - return options.variant; - } - - return null; - }, - - /** - * Get map tile initial variant - * @param {trackdirect.models.Map} map - */ - _getMapTileInitialVariant: function (map) { - var mapVariant = this._getMapTileVariant(map); - var dotIndex = mapVariant.indexOf("."); - if (dotIndex >= 0) { - return mapVariant.substring(0, dotIndex); - } - return mapVariant; - }, - - /** - * Get map tile base variant - * @param {trackdirect.models.Map} map - */ - _getMapTileBase: function (map) { - var options = this._getMapTileOptions(map); - if (options.base !== "undefined") { - return options.base; - } - - return null; - }, - - /** - * Get HERE copyright string for the currnet map bounds - * @param {trackdirect.models.Map} map - */ - _getHereAttributionString: function (map) { - var result = []; - var mapBaseVariant = this._getMapTileInitialVariant(map); - - if (this._getMapTileBase(map) == "base") { - var data = this._hereBaseAttributionData; - } else if (this._getMapTileBase(map) == "aerial") { - var data = this._hereAerialAttributionData; - } - - if (data !== null && typeof data[mapBaseVariant] !== "undefined") { - for (var i = 0, len = data[mapBaseVariant].length; i < len; i++) { - var attributionArea = data[mapBaseVariant][i]; - - if ( - parseInt(map.getZoom()) >= parseInt(attributionArea.minLevel) && - parseInt(map.getZoom()) <= parseInt(attributionArea.maxLevel) - ) { - if ( - typeof attributionArea.boxes === "undefined" || - this._isAnyBoxVisible(attributionArea.boxes, map) - ) { - var attributionText = - '<span title="' + - attributionArea.alt + - '">' + - attributionArea.label + - "</span>"; - if (result.indexOf(attributionText) < 0) { - result.push(attributionText); - } - } - } - } - } - return result.join(", "); - }, - - /** - * Returnes true if any lat/lng box intersects with current map bounds - * @param {Array} boxes - * @param {trackdirect.models.Map} map - */ - _isAnyBoxVisible: function (boxes, map) { - if (typeof boxes !== "undefined" && Array.isArray(boxes)) { - for (var i = 0, len = boxes.length; i < len; i++) { - var box = boxes[i]; - if (Array.isArray(box) && box.length >= 4) { - var boxBounds = L.latLngBounds( - L.latLng(parseFloat(box[0]), parseFloat(box[1])), - L.latLng(parseFloat(box[2]), parseFloat(box[3])) - ); - if (boxBounds.isValid() && boxBounds.intersects(map.getBounds())) { - return true; - } - } - } - } - return false; - }, - - /** - * Download HERE copyright data - * @param {trackdirect.models.Map} map - */ - _loadHereAttributionData: function (map) { - var options = this._getMapTileOptions(map); - var base = this._getMapTileBase(map); - - if ( - (this._hereBaseAttributionData === null && base == "base") || - (this._hereAerialAttributionData === null && base == "aerial") - ) { - var me = this; - - jQuery.ajax({ - url: - "https://1." + - base + - ".maps.api.here.com/maptile/2.1/copyright/" + - options.mapID + - "?app_id=" + - options.app_id + - "&app_code=" + - options.app_code, - type: "GET", - dataType: "json", - timeout: 5000, // sets timeout to 5 seconds - success: function (result) { - if (base == "base") { - me._hereBaseAttributionData = result; - me._isHereBaseInitialized = true; - me._emitEventListeners("init-here-base"); - } else if (base == "aerial") { - me._hereAerialAttributionData = result; - me._isHereAerialInitialized = true; - me._emitEventListeners("init-here-aerial"); - } - }, - error: function (xhr) { - console.log("Failed to load map copyright data"); - }, - }); - } - }, - - /** - * Call all listeners that are listening on specified event - * @param {string} event - * @param {string} arg - */ - _emitEventListeners: function (event, arg) { - if (event in this._eventListeners) { - for (var i = 0; i < this._eventListeners[event].length; i++) { - this._eventListeners[event][i](arg); - } - } - - if (event in this._eventListenersOnce) { - var eventListenersOnce = this._eventListenersOnce[event].splice(0); - this._eventListenersOnce[event] = []; - for (var i = 0; i < eventListenersOnce.length; i++) { - eventListenersOnce[i](arg); - } - } - }, -}; diff --git a/jslib/src/trackdirect/services/mapSectorCalculator.js b/jslib/src/trackdirect/services/mapSectorCalculator.js deleted file mode 100755 index 153b667b297cb726c634ec088296327e912e959b..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/mapSectorCalculator.js +++ /dev/null @@ -1,148 +0,0 @@ -trackdirect.services.MapSectorCalculator = { - /** - * Get all visible map sectors - * @param {LatLngBounds} bounds - * @return {array} - */ - getMapSectors: function (bounds) { - var result = []; - // We include some border map sectors so that markers appear before user enter those map-sectors (if they are loaded from server) - if (typeof google === "object" && typeof google.maps === "object") { - var maxLat = Math.ceil(bounds.getNorthEast().lat()) + 1; - var minLat = Math.floor(bounds.getSouthWest().lat()) - 1; - var maxLng = Math.ceil(bounds.getNorthEast().lng()) + 1; - var minLng = Math.floor(bounds.getSouthWest().lng()) - 1; - } else if (typeof L === "object") { - var maxLat = Math.ceil(bounds.getNorthEast().lat) + 1; - var minLat = Math.floor(bounds.getSouthWest().lat) - 1; - var maxLng = Math.ceil(bounds.getNorthEast().lng) + 1; - var minLng = Math.floor(bounds.getSouthWest().lng) - 1; - } - - if (maxLng < minLng) { - result = result.concat( - trackdirect.services.MapSectorCalculator.getMapSectorsByInterval( - minLat, - maxLat, - minLng, - 180.0 - ) - ); - minLng = -180.0; - } - - result = result.concat( - trackdirect.services.MapSectorCalculator.getMapSectorsByInterval( - minLat, - maxLat, - minLng, - maxLng - ) - ); - - // Add the world wide area code - // This seems to result in very bad performance... so we skip it - //result.push(99999999); - return result; - }, - - /** - * Get all visible map sectors - * @param {float} minLat - * @param {float} maxLat - * @param {float} minLng - * @param {float} maxLng - * @return {array} - */ - getMapSectorsByInterval: function (minLat, maxLat, minLng, maxLng) { - var result = []; - - var minAreaCode = this.getMapSector(minLat, minLng); - var maxAreaCode = this.getMapSector(maxLat, maxLng); - - lngDiff = parseInt(Math.ceil(maxLng)) - parseInt(Math.ceil(minLng)); - - var areaCode = minAreaCode; - while (areaCode <= maxAreaCode) { - if (areaCode % 10 == 5) { - result.push(areaCode); - } else { - result.push(areaCode); - result.push(areaCode + 5); - } - - for (var i = 1; i <= lngDiff; i++) { - if (areaCode % 10 == 5) { - result.push(areaCode + 10 * i - 5); - result.push(areaCode + 10 * i); - } else { - result.push(areaCode + 10 * i); - result.push(areaCode + 10 * i + 5); - } - } - - // Lat takes 0.2 jumps - areaCode = areaCode + 20000; - } - return result; - }, - - /** - * Get map sector based on latitude and longitude - * @param {float} latitude - * @param {float} longitude - */ - getMapSector: function (latitude, longitude) { - var lat = this._getMapSectorLatRepresentation(latitude); - var lng = this._getMapSectorLngRepresentation(longitude); - - // lat interval: 0 - 18000000 - // lng interval: 0 - 00003600 - return lat + lng; - }, - - /** - * Get map sector latitude part - * @param {float} latitude - * @return int - */ - _getMapSectorLatRepresentation: function (latitude) { - var lat = parseInt(Math.floor(latitude)) + 90; // Positive representation of lat; - var latDecimalPart = latitude - Math.floor(latitude); - - if (latDecimalPart < 0.2) { - lat = lat * 10 + 0; - } else if (latDecimalPart < 0.4) { - lat = lat * 10 + 2; - } else if (latDecimalPart < 0.6) { - lat = lat * 10 + 4; - } else if (latDecimalPart < 0.8) { - lat = lat * 10 + 6; - } else { - lat = lat * 10 + 8; - } - lat = lat * 10000; - - // lat interval: 0 - 18000000 - return lat; - }, - - /** - * Get map sector longitude part - * @param {float} longitude - * @return int - */ - _getMapSectorLngRepresentation: function (longitude) { - lng = parseInt(Math.floor(longitude)) + 180; // Positive representation of lng; - lngDecimalPart = longitude - Math.floor(longitude); - - if (lngDecimalPart < 0.5) { - lng = lng * 10 + 0; - } else { - lng = lng * 10 + 5; - } - - // lng interval: 0 - 00003600 - return lng; - }, -}; diff --git a/jslib/src/trackdirect/services/stationColorCalculator.js b/jslib/src/trackdirect/services/stationColorCalculator.js deleted file mode 100755 index 547ed097b184e7beb474897096dfc2f425d03b77..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/stationColorCalculator.js +++ /dev/null @@ -1,67 +0,0 @@ -trackdirect.services.stationColorCalculator = { - _colors: [ - "#3333ff", // blue (#2A2AFF) - "#9900cc", // purple (#7002A7) - "#006600", // green (#005500) - "#cc0000", // red (#A70202) - ], - _stationColorId: {}, - - /** - * Get html (hex) color for specified packet - * @param {object} packet - * @return {string} - */ - getColor: function (packet) { - var colorId = this.getColorId(packet); - return this._colors[colorId]; - }, - - /** - * Get kml color for specified packet - * @param {object} packet - * @return {string} - */ - getKmlColor(packet) { - var hex = this.getColor(packet); - var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - if (result) { - return "FF" + result[3] + result[2] + result[1]; - } - return null; - }, - - /** - * Get color ID for specified packet - * Color will be selected by station/object name (this make sures that object with different senders still get the same color) - * @param {object} packet - * @return {int} - */ - getColorId: function (packet) { - if (packet.station_name in this._stationColorId) { - // This station has allready got a color, use it - colorId = this._stationColorId[packet.station_name]; - return colorId; - } else { - var hash = this._simplehashStr(packet.station_name); - var colorId = hash % this._colors.length; - this._stationColorId[packet.station_name] = colorId; - } - - return colorId; - }, - - /** - * Get simple hash from string (bad hash, but good for our usage) - * @param {string} str - * @return int - */ - _simplehashStr: function (str) { - var hash = 0; - for (var i = 0; i < str.length; i++) { - var charCode = str.charCodeAt(i); - hash += charCode; - } - return hash; - }, -}; diff --git a/jslib/src/trackdirect/services/symbolPathFinder.js b/jslib/src/trackdirect/services/symbolPathFinder.js deleted file mode 100755 index 017fba808d9b08b7c26a71674d4a8745b1e2f29a..0000000000000000000000000000000000000000 --- a/jslib/src/trackdirect/services/symbolPathFinder.js +++ /dev/null @@ -1,102 +0,0 @@ -trackdirect.services.symbolPathFinder = { - /** - * Returns icon http path - * - * - The default width and height is 24x24, if anything bigger is specified more space round the symbol will be added - * - The deafult scale is 24x24, if anything else is specified the image will be scaled to that size - * - * @param {string} symbolTable - * @param {string} symbol - * @param {int} course - * @param {int} width - * @param {int} height - * @param {int} scaleWidth - * @param {int} scaleHeight - * @return {string} - */ - getFilePath: function ( - symbolTable, - symbol, - course, - width, - height, - scaleWidth, - scaleHeight - ) { - if ( - typeof symbol !== "undefined" && - typeof symbolTable !== "undefined" && - symbol !== null && - symbolTable !== null && - symbol.length >= 1 && - symbolTable.length >= 1 - ) { - var symbolAsciiValue = symbol.charCodeAt(0); - var symbolTableAsciiValue = symbolTable.charCodeAt(0); - } else { - var symbolAsciiValue = 125; - var symbolTableAsciiValue = 47; - } - - var sizeStrValue = ""; - if (width !== null && height !== null) { - sizeStrValue = "-" + width + "x" + height; - } - - var scaleStrValue = this._getIconFilePathScalePart(scaleWidth, scaleHeight); - var courseStrValue = this._getIconFilePathCoursePart(course); - var url = - trackdirect.settings.markerSymbolBaseDir + - "symbol-" + - symbolAsciiValue + - "-" + - symbolTableAsciiValue + - courseStrValue + - sizeStrValue + - scaleStrValue + - ".png"; - - return trackdirect.settings.baseUrl + url; - }, - - /** - * Returns the course part of the icon http path - * - * @param {int} course - * @return {string} - */ - _getIconFilePathCoursePart: function (course) { - var courseStrValue = ""; - if (course !== null) { - var courseValue = Math.round(parseInt(course) / 10) * 10; - while (courseValue > 360) { - courseValue = courseValue - 360; - } - while (courseValue < 0) { - courseValue = courseValue + 360; - } - courseStrValue = "-" + courseValue; - } - return courseStrValue; - }, - - /** - * Returns the scale part of the icon http path - * - The default scale is 24x24, if anything else is specified the image will be scaled to that size - * - * @param {int} scaleWidth - * @param {int} scaleHeight - * @return {string} - */ - _getIconFilePathScalePart: function (scaleWidth, scaleHeight) { - var scaleStrValue = ""; - if (scaleWidth !== null && scaleHeight !== null) { - if (isHighDensity()) { - scaleStrValue = "-scale" + scaleWidth * 2 + "x" + scaleHeight * 2; - } else { - scaleStrValue = "-scale" + scaleWidth + "x" + scaleHeight; - } - } - return scaleStrValue; - }, -}; diff --git a/misc/database/tables/01_map.sql b/misc/database/tables/01_map.sql deleted file mode 100644 index 840056becd91d912189e88be33d88ccae29651ca..0000000000000000000000000000000000000000 --- a/misc/database/tables/01_map.sql +++ /dev/null @@ -1,22 +0,0 @@ -create table map ( - "id" smallint not null, - "name" text not null, - primary key (id) -); - -insert into map(id, name) values(1, 'Show on map'); -insert into map(id, name) values(2, 'Hide, same position as newer packet'); -insert into map(id, name) values(3, 'Hide, duplicate packet'); -insert into map(id, name) values(4, 'Hide, failed to find marker id'); -insert into map(id, name) values(5, 'Hide, faulty gps position'); -insert into map(id, name) values(6, 'Hide, packet received to late'); -insert into map(id, name) values(7, 'Hide, moves to fast'); -insert into map(id, name) values(8, 'Hide, packet is less than 5 seconds after previous'); -insert into map(id, name) values(9, 'Hide, abnormal position'); -insert into map(id, name) values(10, 'Hide, has no position'); -insert into map(id, name) values(11, 'Hide, unsupported format'); -insert into map(id, name) values (12, 'Hide, same position as newer packet (but later date)'); -insert into map(id, name) values (13, 'Hide, same position as newer packet (and faulty gps position)'); -insert into map(id, name) values (14, 'Hide, killed object/item'); -insert into map(id, name) values (15, 'Stealth/No tracking'); -insert into map(id, name) values (16, 'Faulty network, APRS packet digipeated by a CWOP-station'); diff --git a/misc/database/tables/02_marker.sql b/misc/database/tables/02_marker.sql deleted file mode 100644 index 42b103adb1ff06d425b390c525933d1155c32957..0000000000000000000000000000000000000000 --- a/misc/database/tables/02_marker.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE SEQUENCE marker_seq INCREMENT BY 1 MINVALUE 2; diff --git a/misc/database/tables/03_ogn_address_type.sql b/misc/database/tables/03_ogn_address_type.sql deleted file mode 100644 index 48f0364649ed3ff8f1eadb605b1f342d3edbb60e..0000000000000000000000000000000000000000 --- a/misc/database/tables/03_ogn_address_type.sql +++ /dev/null @@ -1,9 +0,0 @@ -create table ogn_address_type ( - "id" smallint not null, - "name" text not null, - primary key (id) -); - -insert into ogn_address_type(id, name) values(1, 'ICAO'); -insert into ogn_address_type(id, name) values(2, 'FLARM'); -insert into ogn_address_type(id, name) values(3, 'OGN'); diff --git a/misc/database/tables/04_ogn_aircraft_type.sql b/misc/database/tables/04_ogn_aircraft_type.sql deleted file mode 100644 index f5089435359834777044d6593632c9f50394d0ad..0000000000000000000000000000000000000000 --- a/misc/database/tables/04_ogn_aircraft_type.sql +++ /dev/null @@ -1,22 +0,0 @@ -create table ogn_aircraft_type ( - "id" smallint not null, - "name" text not null, - primary key (id) -); - -insert into ogn_aircraft_type(id, name) values(1, 'Glider'); -insert into ogn_aircraft_type(id, name) values(2, 'Tow Plane'); -insert into ogn_aircraft_type(id, name) values(3, 'Helicopter'); -insert into ogn_aircraft_type(id, name) values(4, 'Parachute'); -insert into ogn_aircraft_type(id, name) values(5, 'Drop Plane'); -insert into ogn_aircraft_type(id, name) values(6, 'Hang Glider'); -insert into ogn_aircraft_type(id, name) values(7, 'Para Glider'); -insert into ogn_aircraft_type(id, name) values(8, 'Powered Aircraft'); -insert into ogn_aircraft_type(id, name) values(9, 'Jet Aircraft'); -insert into ogn_aircraft_type(id, name) values(10, 'UFO'); -insert into ogn_aircraft_type(id, name) values(11, 'Balloon'); -insert into ogn_aircraft_type(id, name) values(12, 'Airship'); -insert into ogn_aircraft_type(id, name) values(13, 'UAV'); -insert into ogn_aircraft_type(id, name) values(14, ''); -insert into ogn_aircraft_type(id, name) values(15, 'Static Object'); - diff --git a/misc/database/tables/05_ogn_device.sql b/misc/database/tables/05_ogn_device.sql deleted file mode 100644 index 22e01e03a04829941f8b454975c6a44440ecaa4a..0000000000000000000000000000000000000000 --- a/misc/database/tables/05_ogn_device.sql +++ /dev/null @@ -1,10 +0,0 @@ -create table if not exists ogn_device ( - "device_type" text not null, - "device_id" text not null, - "aircraft_model" text not null, - "registration" text not null, - "cn" text not null, - "tracked" text not null, - "identified" text not null, - "ddb_aircraft_type" text not null -); diff --git a/misc/database/tables/06_ogn_hidden_station.sql b/misc/database/tables/06_ogn_hidden_station.sql deleted file mode 100644 index 0b311556fab2ba46eb7b4697bf85c043f7a1aaf4..0000000000000000000000000000000000000000 --- a/misc/database/tables/06_ogn_hidden_station.sql +++ /dev/null @@ -1,7 +0,0 @@ -create table ogn_hidden_station ( - "id" bigserial not null, - "hashed_name" text not null, - primary key (id) -); - -create index ogn_hidden_station_hashed_name_idx on ogn_hidden_station(hashed_name); diff --git a/misc/database/tables/07_packet_type.sql b/misc/database/tables/07_packet_type.sql deleted file mode 100644 index c72b01c4769193e2cd02cc83fa72cf68ff1dfbcf..0000000000000000000000000000000000000000 --- a/misc/database/tables/07_packet_type.sql +++ /dev/null @@ -1,18 +0,0 @@ -create table packet_type ( - "id" smallint not null, - "name" text not null, - primary key (id) -); - - -insert into packet_type(id, name) values(1, 'position'); -insert into packet_type(id, name) values(2, 'direction'); -insert into packet_type(id, name) values(3, 'weather'); -insert into packet_type(id, name) values(4, 'object'); -insert into packet_type(id, name) values(5, 'item'); -insert into packet_type(id, name) values(6, 'telemetry'); -insert into packet_type(id, name) values(7, 'message'); -insert into packet_type(id, name) values(8, 'query'); -insert into packet_type(id, name) values(9, 'response'); -insert into packet_type(id, name) values(10, 'status'); -insert into packet_type(id, name) values(11, 'other'); diff --git a/misc/database/tables/08_sender.sql b/misc/database/tables/08_sender.sql deleted file mode 100644 index d042c3172fbd0a7013b243b531fb9c1d484dec32..0000000000000000000000000000000000000000 --- a/misc/database/tables/08_sender.sql +++ /dev/null @@ -1,7 +0,0 @@ -create table sender ( - "id" bigserial not null, - "name" text not null, - primary key (id) -); - -create index sender_name_idx on sender(name); diff --git a/misc/database/tables/09_source.sql b/misc/database/tables/09_source.sql deleted file mode 100644 index 42bac07a5a4dc94366c99db00876cb890c43e543..0000000000000000000000000000000000000000 --- a/misc/database/tables/09_source.sql +++ /dev/null @@ -1,12 +0,0 @@ -create table source ( - "id" smallint not null, - "name" text not null, - primary key (id) -); - - -insert into source(id, name) values(1, 'APRS'); -insert into source(id, name) values(2, 'CWOP'); -insert into source(id, name) values(3, 'CBAPRS'); -insert into source(id, name) values(4, 'HUBHAB'); -insert into source(id, name) values(5, 'OGN'); diff --git a/misc/database/tables/10_station_type.sql b/misc/database/tables/10_station_type.sql deleted file mode 100644 index 8ca498462120633440c4ed893698f247a96f3af5..0000000000000000000000000000000000000000 --- a/misc/database/tables/10_station_type.sql +++ /dev/null @@ -1,9 +0,0 @@ -create table station_type ( - "id" smallint not null, - "name" text not null, - primary key (id) -); - - -insert into station_type(id, name) values(1, 'Station'); -insert into station_type(id, name) values(2, 'Object'); diff --git a/misc/database/tables/11_station.sql b/misc/database/tables/11_station.sql deleted file mode 100644 index 6b0a5e57c99f86a4723ab34e71b35a817156f40b..0000000000000000000000000000000000000000 --- a/misc/database/tables/11_station.sql +++ /dev/null @@ -1,51 +0,0 @@ -create table station ( - "id" bigserial not null, - "name" text null, - "latest_sender_id" bigint null, - "station_type_id" smallint not null, - "source_id" smallint not null, - - "latest_location_packet_id" bigint null, - "latest_location_packet_timestamp" bigint null, - "latest_location_marker_id" bigint null, - "latest_location_symbol" text null, - "latest_location_symbol_table" text null, - "latest_location_latitude" double precision null, - "latest_location_longitude" double precision null, - - "latest_confirmed_packet_id" bigint null, - "latest_confirmed_packet_timestamp" bigint null, - "latest_confirmed_marker_id" bigint null, - "latest_confirmed_symbol" text null, - "latest_confirmed_symbol_table" text null, - "latest_confirmed_latitude" double precision null, - "latest_confirmed_longitude" double precision null, - - "latest_packet_id" bigint null, - "latest_packet_timestamp" bigint null, - - "latest_weather_packet_id" bigint null, - "latest_weather_packet_timestamp" bigint null, - "latest_weather_packet_comment" text null, - - "latest_telemetry_packet_id" bigint null, - "latest_telemetry_packet_timestamp" bigint null, - - "latest_ogn_packet_id" bigint null, - "latest_ogn_packet_timestamp" bigint null, - "latest_ogn_sender_address" text null, - "latest_ogn_aircraft_type_id" smallint null, - "latest_ogn_address_type_id" smallint null, - - primary key (id), - foreign key(latest_sender_id) references sender(id), - foreign key(station_type_id) references station_type(id), - foreign key(source_id) references source(id), - foreign key(latest_ogn_aircraft_type_id) references ogn_aircraft_type(id), - foreign key(latest_ogn_address_type_id) references ogn_address_type(id) -); - -create index station_name_idx on station(name); -create index station_latest_sender_id_idx on station(latest_sender_id); -create index station_pos_timestamp_idx on station(latest_confirmed_latitude, latest_confirmed_longitude, latest_confirmed_packet_timestamp); -create index station_ogn_sender_address_idx on station(latest_ogn_sender_address); diff --git a/misc/database/tables/12_station_telemetry_bits.sql b/misc/database/tables/12_station_telemetry_bits.sql deleted file mode 100644 index e6d181f30016ffabf5ac327ae97d5603af5fc2e6..0000000000000000000000000000000000000000 --- a/misc/database/tables/12_station_telemetry_bits.sql +++ /dev/null @@ -1,13 +0,0 @@ -create table station_telemetry_bits ( - "id" bigserial not null, - "station_id" bigint null, - "created_ts" bigint default extract(epoch from now()), - "latest_ts" bigint default extract(epoch from now()), - "valid_to_ts" bigint null, - "bits" text null, - "title" text null, - primary key (id), - foreign key(station_id) references station(id) -); - -create index station_telemetry_bits_station_id_idx on station_telemetry_bits(station_id, valid_to_ts, latest_ts); diff --git a/misc/database/tables/13_station_telemetry_eqns.sql b/misc/database/tables/13_station_telemetry_eqns.sql deleted file mode 100644 index 40d2c89fc71c826ed668aff9ab2d17aba56375bf..0000000000000000000000000000000000000000 --- a/misc/database/tables/13_station_telemetry_eqns.sql +++ /dev/null @@ -1,32 +0,0 @@ -create table station_telemetry_eqns ( - "id" bigserial not null, - "station_id" bigint null, - "created_ts" bigint default extract(epoch from now()), - "latest_ts" bigint default extract(epoch from now()), - "valid_to_ts" bigint null, - - "a1" real null, - "b1" real null, - "c1" real null, - - "a2" real null, - "b2" real null, - "c2" real null, - - "a3" real null, - "b3" real null, - "c3" real null, - - "a4" real null, - "b4" real null, - "c4" real null, - - "a5" real null, - "b5" real null, - "c5" real null, - - primary key (id), - foreign key(station_id) references station(id) -); - -create index station_telemetry_eqns_station_id_idx on station_telemetry_eqns(station_id, valid_to_ts, latest_ts); diff --git a/misc/database/tables/14_station_telemetry_param.sql b/misc/database/tables/14_station_telemetry_param.sql deleted file mode 100644 index 97bd4336e4bd3f7eafa7a606ac1d7065da4161c2..0000000000000000000000000000000000000000 --- a/misc/database/tables/14_station_telemetry_param.sql +++ /dev/null @@ -1,24 +0,0 @@ -create table station_telemetry_param ( - "id" bigserial not null, - "station_id" bigint null, - "created_ts" bigint default extract(epoch from now()), - "latest_ts" bigint default extract(epoch from now()), - "valid_to_ts" bigint null, - "p1" text null, - "p2" text null, - "p3" text null, - "p4" text null, - "p5" text null, - "b1" text null, - "b2" text null, - "b3" text null, - "b4" text null, - "b5" text null, - "b6" text null, - "b7" text null, - "b8" text null, - primary key (id), - foreign key(station_id) references station(id) -); - -create index station_telemetry_param_station_id_idx on station_telemetry_param(station_id, valid_to_ts, latest_ts); diff --git a/misc/database/tables/15_station_telemetry_unit.sql b/misc/database/tables/15_station_telemetry_unit.sql deleted file mode 100644 index 167a174bbe23cb727ed4037f1d90f2bea8d5cb96..0000000000000000000000000000000000000000 --- a/misc/database/tables/15_station_telemetry_unit.sql +++ /dev/null @@ -1,24 +0,0 @@ -create table station_telemetry_unit ( - "id" bigserial not null, - "station_id" bigint null, - "created_ts" bigint default extract(epoch from now()), - "latest_ts" bigint default extract(epoch from now()), - "valid_to_ts" bigint null, - "u1" text null, - "u2" text null, - "u3" text null, - "u4" text null, - "u5" text null, - "l1" text null, - "l2" text null, - "l3" text null, - "l4" text null, - "l5" text null, - "l6" text null, - "l7" text null, - "l8" text null, - primary key (id), - foreign key(station_id) references station(id) -); - -create index station_telemetry_unit_station_id_idx on station_telemetry_unit(station_id, valid_to_ts, latest_ts); diff --git a/misc/database/tables/16_packet.sql b/misc/database/tables/16_packet.sql deleted file mode 100644 index c14e79daf76f6a7cd5693461fab4601d8b08bc8d..0000000000000000000000000000000000000000 --- a/misc/database/tables/16_packet.sql +++ /dev/null @@ -1,42 +0,0 @@ -create table packet ( - "id" bigserial not null, - "station_id" bigint not null, - "sender_id" bigint not null, - "marker_id" bigint null, - "marker_counter" int null, - "packet_type_id" smallint not null, - "timestamp" bigint not null, - "reported_timestamp" bigint null, - "position_timestamp" bigint null, - "latitude" double precision null, - "longitude" double precision null, - "posambiguity" smallint null, - "symbol" text null, - "symbol_table" text null, - "map_sector" int null, - "related_map_sectors" int array null, - "map_id" smallint default 1, - "source_id" smallint default 1, - "speed" real null, - "course" real null, - "altitude" real null, - "rng" real null, - "latest_rng_timestamp" bigint null, - "phg" int null, - "latest_phg_timestamp" bigint null, - "packet_tail_timestamp" bigint null, - "is_moving" smallint null, - "comment" text null, - "raw_path" text null, - "raw" text null, - primary key (id), - foreign key(packet_type_id) references packet_type(id), - foreign key(station_id) references station(id), - foreign key(sender_id) references sender(id), - foreign key(map_id) references map(id), - foreign key(source_id) references source(id) -); - - - - diff --git a/misc/database/tables/17_packet_weather.sql b/misc/database/tables/17_packet_weather.sql deleted file mode 100644 index 8d2857012a088d9bd2d0f3f986ed0dbe28e52910..0000000000000000000000000000000000000000 --- a/misc/database/tables/17_packet_weather.sql +++ /dev/null @@ -1,20 +0,0 @@ -create table packet_weather ( - "id" bigserial not null, - "packet_id" bigint not null, - "station_id" bigint not null, - "timestamp" bigint not null, - "humidity" int null, - "pressure" real null, - "rain_1h" real null, - "rain_24h" real null, - "rain_since_midnight" real null, - "temperature" real null, - "wind_direction" int null, - "wind_gust" real null, - "wind_speed" real null, - "luminosity" real null, - "snow" real null, - "wx_raw_timestamp" bigint null, - primary key (id), - foreign key(station_id) references station(id) -); diff --git a/misc/database/tables/18_packet_telemetry.sql b/misc/database/tables/18_packet_telemetry.sql deleted file mode 100644 index 20547386bb93acbfc90ec78ac623d22183a579c7..0000000000000000000000000000000000000000 --- a/misc/database/tables/18_packet_telemetry.sql +++ /dev/null @@ -1,23 +0,0 @@ -create table packet_telemetry ( - "id" bigserial not null, - "packet_id" bigint not null, - "station_id" bigint not null, - "timestamp" bigint not null, - "val1" real null, - "val2" real null, - "val3" real null, - "val4" real null, - "val5" real null, - "bits" text null, - "seq" int null, - "station_telemetry_param_id" bigint null, - "station_telemetry_unit_id" bigint null, - "station_telemetry_eqns_id" bigint null, - "station_telemetry_bits_id" bigint null, - primary key (id), - foreign key(station_id) references station(id), - foreign key(station_telemetry_param_id) references station_telemetry_param(id), - foreign key(station_telemetry_unit_id) references station_telemetry_unit(id), - foreign key(station_telemetry_eqns_id) references station_telemetry_eqns(id), - foreign key(station_telemetry_bits_id) references station_telemetry_bits(id) -); diff --git a/misc/database/tables/19_packet_path.sql b/misc/database/tables/19_packet_path.sql deleted file mode 100644 index 824d728a91ef342ecb8ba1c13275e66745c5fb6d..0000000000000000000000000000000000000000 --- a/misc/database/tables/19_packet_path.sql +++ /dev/null @@ -1,16 +0,0 @@ -create table packet_path ( - "id" bigserial not null, - "packet_id" bigint not null, - "station_id" bigint not null, - "latitude" double precision null, - "longitude" double precision null, - "timestamp" bigint null, - "distance" int null, - "number" smallint, - "sending_station_id" bigint not null, - "sending_latitude" double precision null, - "sending_longitude" double precision null, - primary key (id), - foreign key(station_id) references station(id), - foreign key(sending_station_id) references station(id) -); diff --git a/misc/database/tables/20_packet_ogn.sql b/misc/database/tables/20_packet_ogn.sql deleted file mode 100644 index 83208eb5d28ae041b1f97be61c94dcd9fb876bf6..0000000000000000000000000000000000000000 --- a/misc/database/tables/20_packet_ogn.sql +++ /dev/null @@ -1,16 +0,0 @@ -create table packet_ogn ( - "id" bigserial not null, - "packet_id" bigint not null, - "station_id" bigint not null, - "timestamp" bigint not null, - "ogn_sender_address" text null, - "ogn_address_type_id" smallint null, - "ogn_aircraft_type_id" smallint null, - "ogn_climb_rate" int null, - "ogn_turn_rate" float null, - "ogn_signal_to_noise_ratio" float null, - "ogn_bit_errors_corrected" int null, - "ogn_frequency_offset" float null, - primary key (id), - foreign key(station_id) references station(id) -); diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 2a592dacdb7807b368d831d8e8995116459fb4a6..0000000000000000000000000000000000000000 --- a/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -psycopg2-binary -wheel -setuptools -autobahn[twisted] -twisted -pympler -image_slicer -jsmin -psutil -git+https://github.com/rossengeorgiev/aprs-python \ No newline at end of file diff --git a/server/bin/collector.py b/server/bin/collector.py deleted file mode 100644 index 7025864c22d54e015219745602e6cb0e5cb73f1a..0000000000000000000000000000000000000000 --- a/server/bin/collector.py +++ /dev/null @@ -1,64 +0,0 @@ -import sys -import os.path -import logging -import logging.handlers -import trackdirect - -if __name__ == '__main__': - - if (len(sys.argv) < 2): - print("\n" + sys.argv[0] + ' [config.ini] [collector number]') - sys.exit() - elif (sys.argv[1].startswith("/")): - if (not os.path.isfile(sys.argv[1])): - print(f"\n File {sys.argv[1]} does not exists") - print("\n" + sys.argv[0] + ' [config.ini] [collector number]') - sys.exit() - elif (not os.path.isfile(os.path.expanduser('~/trackdirect/config/' + sys.argv[1]))): - print(f"\n File ~/trackdirect/config/{sys.argv[1]} does not exists") - print("\n" + sys.argv[0] + ' [config.ini] [collector number]') - sys.exit() - - config = trackdirect.TrackDirectConfig() - config.populate(sys.argv[1]) - - if (len(sys.argv) < 3): - collectorNumber = 0 - else: - collectorNumber = int(sys.argv[2]) - collectorOptions = config.collector[collectorNumber] - - saveOgnStationsWithMissingIdentity = False - if (config.saveOgnStationsWithMissingIdentity): - saveOgnStationsWithMissingIdentity = True - - fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser( - collectorOptions['error_log']), mode='a', maxBytes=1000000, backupCount=10) - - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - fh.setFormatter(formatter) - - consoleHandler = logging.StreamHandler() - consoleHandler.setFormatter(formatter) - - trackDirectLogger = logging.getLogger('trackdirect') - trackDirectLogger.addHandler(fh) - trackDirectLogger.addHandler(consoleHandler) - trackDirectLogger.setLevel(logging.INFO) - - aprslibLogger = logging.getLogger('aprslib.IS') - aprslibLogger.addHandler(fh) - aprslibLogger.addHandler(consoleHandler) - aprslibLogger.setLevel(logging.INFO) - - trackDirectLogger.warning("Starting (Collecting from " + collectorOptions['host'] + ":" + str( - collectorOptions['port_full']) + " using " + collectorOptions['callsign'] + " and " + str(collectorOptions['passcode']) + ")") - - try: - trackDirectDataCollector = trackdirect.TrackDirectDataCollector( - collectorOptions, - saveOgnStationsWithMissingIdentity) - trackDirectDataCollector.run() - except Exception as e: - trackDirectLogger.error(e, exc_info=1) diff --git a/server/bin/remover.py b/server/bin/remover.py deleted file mode 100644 index 0d80f5b8791a6a554822333f75e427308f45b5c0..0000000000000000000000000000000000000000 --- a/server/bin/remover.py +++ /dev/null @@ -1,248 +0,0 @@ -import sys -import os.path -import logging -import logging.handlers -import datetime -import time -import trackdirect - -from trackdirect.database.DatabaseConnection import DatabaseConnection -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.repositories.PacketRepository import PacketRepository - -if __name__ == '__main__': - - if (len(sys.argv) < 2): - print("\n" + sys.argv[0] + ' [config.ini]') - sys.exit() - elif (sys.argv[1].startswith("/")): - if (not os.path.isfile(sys.argv[1])): - print(f"\n File {sys.argv[1]} does not exists") - print("\n" + sys.argv[0] + ' [config.ini]') - sys.exit() - elif (not os.path.isfile(os.path.expanduser('~/trackdirect/config/' + sys.argv[1]))): - print(f"\n File ~/trackdirect/config/{sys.argv[1]} does not exists") - print("\n" + sys.argv[0] + ' [config.ini]') - sys.exit() - - config = trackdirect.TrackDirectConfig() - config.populate(sys.argv[1]) - - maxDaysToSavePositionData = int(config.daysToSavePositionData) - maxDaysToSaveStationData = int(config.daysToSaveStationData) - maxDaysToSaveWeatherData = int(config.daysToSaveWeatherData) - maxDaysToSaveTelemetryData = int(config.daysToSaveTelemetryData) - - try: - fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser( - '~/trackdirect/server/log/remover_' + config.dbName + '.log'), mode='a', maxBytes=1000000, backupCount=10) - - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - fh.setFormatter(formatter) - - consoleHandler = logging.StreamHandler() - consoleHandler.setFormatter(formatter) - - trackDirectLogger = logging.getLogger('trackdirect') - trackDirectLogger.addHandler(fh) - trackDirectLogger.addHandler(consoleHandler) - trackDirectLogger.setLevel(logging.INFO) - - trackDirectLogger.info("Starting") - trackDirectLogger.info( - "Saving position data for %s days" % (maxDaysToSavePositionData)) - trackDirectLogger.info( - "Saving station data for %s days" % (maxDaysToSaveStationData)) - trackDirectLogger.info( - "Saving weather data for %s days" % (maxDaysToSaveWeatherData)) - trackDirectLogger.info( - "Saving telemetry data for %s days" % (maxDaysToSaveTelemetryData)) - - trackDirectDb = DatabaseConnection() - dbNoAutoCommit = trackDirectDb.getConnection(False) - db = trackDirectDb.getConnection(True) - db.set_isolation_level(0) - cursor = db.cursor() - cursor.execute("SET statement_timeout = '240s'") - - trackDirectDbObjectFinder = DatabaseObjectFinder(db) - - packetRepository = PacketRepository(db) - - # - # Loop over the latest days and delete packets that is not needed any more - # - for x in range(2, 16): - prevDay = datetime.date.today() - datetime.timedelta(x) # today minus x days - prevDayTimestamp = prevDay.strftime("%s") - prevDayFormat = datetime.datetime.utcfromtimestamp( - int(prevDayTimestamp)).strftime('%Y%m%d') - packetTable = "packet" + prevDayFormat - - if (trackDirectDbObjectFinder.checkTableExists(packetTable)): - deletedRows = None - doFullVacuum = False - while (deletedRows is None or deletedRows >= 5000): - sql = """delete from """ + packetTable + \ - """ where id in (select id from """ + packetTable + \ - """ where map_id not in (1,12) limit 5000)""" - cursor.execute(sql) - deletedRows = cursor.rowcount - trackDirectLogger.info( - "Deleted %s %s" % (deletedRows, packetTable)) - if (deletedRows > 0): - doFullVacuum = True - time.sleep(0.5) - if (doFullVacuum): - cursor.execute("""VACUUM FULL """ + - packetTable + """_path""") - cursor.execute("""REINDEX TABLE """ + - packetTable + """_path""") - cursor.execute("""VACUUM FULL """ + packetTable) - cursor.execute("""REINDEX TABLE """ + packetTable) - - # - # Drop packet_weather - # - for x in range(maxDaysToSaveWeatherData, maxDaysToSaveWeatherData+100): - prevDay = datetime.date.today() - datetime.timedelta(x) # today minus x days - prevDayTimestamp = prevDay.strftime("%s") - prevDayFormat = datetime.datetime.utcfromtimestamp( - int(prevDayTimestamp)).strftime('%Y%m%d') - packetTable = "packet" + prevDayFormat - - if (trackDirectDbObjectFinder.checkTableExists(packetTable + "_weather")): - cursor.execute("""drop table """ + - packetTable + """_weather""") - trackDirectLogger.info( - "Dropped table %s_weather" % (packetTable)) - - # - # Drop packet_telemetry - # - for x in range(maxDaysToSaveTelemetryData, maxDaysToSaveTelemetryData+100): - prevDay = datetime.date.today() - datetime.timedelta(x) # today minus x days - prevDayTimestamp = prevDay.strftime("%s") - prevDayFormat = datetime.datetime.utcfromtimestamp( - int(prevDayTimestamp)).strftime('%Y%m%d') - packetTable = "packet" + prevDayFormat - - if (trackDirectDbObjectFinder.checkTableExists(packetTable + "_telemetry")): - cursor.execute("""drop table """ + - packetTable + """_telemetry""") - trackDirectLogger.info( - "Dropped table %s_telemetry" % (packetTable)) - - # - # Drop packets - # - for x in range(maxDaysToSavePositionData, maxDaysToSavePositionData+100): - prevDay = datetime.date.today() - datetime.timedelta(x) # today minus x days - prevDayTimestamp = prevDay.strftime("%s") - prevDayFormat = datetime.datetime.utcfromtimestamp( - int(prevDayTimestamp)).strftime('%Y%m%d') - packetTable = "packet" + prevDayFormat - - # Drop packet_ogn table - if (trackDirectDbObjectFinder.checkTableExists(packetTable + "_ogn")): - cursor.execute("""drop table """ + packetTable + """_ogn""") - trackDirectLogger.info("Dropped table %s_ogn" % (packetTable)) - - # - # Drop packet_path table - # - if (trackDirectDbObjectFinder.checkTableExists(packetTable + "_path")): - cursor.execute("""drop table """ + packetTable + """_path""") - trackDirectLogger.info("Dropped table %s_path" % (packetTable)) - - # - # Drop packet table - # - if (trackDirectDbObjectFinder.checkTableExists(packetTable)): - cursor.execute("""drop table """ + packetTable) - trackDirectLogger.info("Dropped table %s" % (packetTable)) - - # - # Delete old stations - # - timestampLimit = int(time.time()) - (60*60*24*maxDaysToSaveStationData) - deletedRows = 0 - sql = """select station.id, station.latest_sender_id, station.name - from station - where latest_packet_timestamp < %s - and ( - exists ( - select 1 - from sender - where sender.id = station.latest_sender_id - and sender.name != station.name - ) - or - not exists ( - select 1 - from station station2, sender - where sender.id = station.latest_sender_id - and station2.latest_sender_id = sender.id - and station2.name != sender.name - ) - ) - order by latest_packet_timestamp""" - - selectStationCursor = db.cursor() - selectStationCursor.execute(sql, (timestampLimit,)) - for record in selectStationCursor: - trackDirectLogger.info("Trying to delete station %s (%s)" % ( - record["name"], record["id"])) - try: - deleteCursor = dbNoAutoCommit.cursor() - - sql = """delete from station_telemetry_bits where station_id = %s""" - deleteCursor.execute(sql, (record["id"],)) - - sql = """delete from station_telemetry_eqns where station_id = %s""" - deleteCursor.execute(sql, (record["id"],)) - - sql = """delete from station_telemetry_param where station_id = %s""" - deleteCursor.execute(sql, (record["id"],)) - - sql = """delete from station_telemetry_unit where station_id = %s""" - deleteCursor.execute(sql, (record["id"],)) - - sql = """delete from station_city where station_id = %s""" - deleteCursor.execute(sql, (record["id"],)) - - sql = """delete from station where id = %s""" - deleteCursor.execute(sql, (record["id"],)) - - sql = """delete from sender where id = %s and not exists (select 1 from station where latest_sender_id = sender.id)""" - deleteCursor.execute(sql, (record["latest_sender_id"],)) - - dbNoAutoCommit.commit() - deleteCursor.close() - deletedRows += 1 - time.sleep(0.5) - except Exception as e: - # Something went wrong - #trackDirectLogger.error(e, exc_info=1) - dbNoAutoCommit.rollback() - deleteCursor.close() - - selectStationCursor.close() - if (deletedRows > 0): - trackDirectLogger.info("Deleted %s stations" % (deletedRows)) - - cursor.execute("""VACUUM ANALYZE station""") - cursor.execute("""REINDEX TABLE station""") - cursor.execute("""VACUUM ANALYZE sender""") - cursor.execute("""REINDEX TABLE sender""") - - # - # Close DB connection - # - cursor.close() - db.close() - trackDirectLogger.info("Done!") - - except Exception as e: - trackDirectLogger.error(e, exc_info=1) diff --git a/server/bin/stationremover.py b/server/bin/stationremover.py deleted file mode 100644 index 6e13a2eb0a1336393edf6be4dfd74ce2dc7f190b..0000000000000000000000000000000000000000 --- a/server/bin/stationremover.py +++ /dev/null @@ -1,124 +0,0 @@ -import sys -import os.path -import logging -import logging.handlers -import datetime -import time -import trackdirect - -from trackdirect.database.DatabaseConnection import DatabaseConnection -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder - -if __name__ == '__main__': - - if (len(sys.argv) < 3): - print("\n" + sys.argv[0] + ' [config.ini] [staion id]') - sys.exit() - elif (sys.argv[1].startswith("/")): - if (not os.path.isfile(sys.argv[1])): - print(f"\n File {sys.argv[1]} does not exists") - print("\n" + sys.argv[0] + ' [config.ini] [staion id]') - sys.exit() - elif (not os.path.isfile(os.path.expanduser('~/trackdirect/config/' + sys.argv[1]))): - print(f"\n File ~/trackdirect/config/{sys.argv[1]} does not exists") - print("\n" + sys.argv[0] + ' [config.ini] [staion id]') - sys.exit() - - stationId = sys.argv[2] - - config = trackdirect.TrackDirectConfig() - config.populate(sys.argv[1]) - - try: - fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser( - '~/trackdirect/server/log/stationremover.log'), mode='a', maxBytes=1000000, backupCount=10) - - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - fh.setFormatter(formatter) - - consoleHandler = logging.StreamHandler() - consoleHandler.setFormatter(formatter) - - trackDirectLogger = logging.getLogger('trackdirect') - trackDirectLogger.addHandler(fh) - trackDirectLogger.addHandler(consoleHandler) - trackDirectLogger.setLevel(logging.INFO) - - trackDirectLogger.info("Starting") - - trackDirectDb = DatabaseConnection() - db = trackDirectDb.getConnection(True) - db.set_isolation_level(0) - cursor = db.cursor() - cursor.execute("SET statement_timeout = '120s'") - - trackDirectDbObjectFinder = DatabaseObjectFinder(db) - - # If saving longer than 365 days, modify range - for x in range(0, 365): - prevDay = datetime.date.today() - datetime.timedelta(x) # today minus x days - prevDayTimestamp = prevDay.strftime("%s") - prevDayFormat = datetime.datetime.utcfromtimestamp( - int(prevDayTimestamp)).strftime('%Y%m%d') - - packetTable = "packet" + prevDayFormat - packetPathTable = "packet" + prevDayFormat + "_path" - packetWeatherTable = "packet" + prevDayFormat + "_weather" - packetTelemetryTable = "packet" + prevDayFormat + "_telemetry" - - if (trackDirectDbObjectFinder.checkTableExists(packetPathTable)): - - # Delete paths for this station - sql = """delete from """ + packetPathTable + \ - """ where packet_id in (select id from """ + \ - packetTable + """ where station_id = %s)""" - cursor.execute(sql, (stationId,)) - trackDirectLogger.info("Deleted %s rows in %s" % ( - cursor.rowcount or 0, packetPathTable)) - time.sleep(0.5) - - # Delete paths related to this station - sql = """delete from """ + packetPathTable + """ where station_id = %s""" - cursor.execute(sql, (stationId,)) - trackDirectLogger.info("Deleted %s related rows in %s" % ( - cursor.rowcount or 0, packetPathTable)) - time.sleep(0.5) - - if (trackDirectDbObjectFinder.checkTableExists(packetTelemetryTable)): - # Delete telemetry for this station - sql = """delete from """ + packetTelemetryTable + """ where station_id = %s""" - cursor.execute(sql, (stationId,)) - trackDirectLogger.info("Deleted %s rows in %s" % ( - cursor.rowcount or 0, packetTelemetryTable)) - time.sleep(0.5) - - if (trackDirectDbObjectFinder.checkTableExists(packetWeatherTable)): - # Delete weather for this station - sql = """delete from """ + packetWeatherTable + """ where station_id = %s""" - cursor.execute(sql, (stationId,)) - trackDirectLogger.info("Deleted %s rows in %s" % ( - cursor.rowcount or 0, packetWeatherTable)) - time.sleep(0.5) - - if (trackDirectDbObjectFinder.checkTableExists(packetTable)): - # Delete packets for this station - sql = """delete from """ + packetTable + """ where station_id = %s""" - cursor.execute(sql, (stationId,)) - trackDirectLogger.info("Deleted %s rows in %s" % ( - cursor.rowcount or 0, packetTable)) - time.sleep(0.5) - - # Delete station - sql = "delete from station where id = %s" - cursor.execute(sql, (stationId,)) - trackDirectLogger.info( - "Deleted %s rows from station" % (cursor.rowcount or 0)) - time.sleep(0.5) - - cursor.close() - db.close() - trackDirectLogger.info("Done!") - - except Exception as e: - trackDirectLogger.error(e, exc_info=1) diff --git a/server/bin/wsserver.py b/server/bin/wsserver.py deleted file mode 100644 index 890ce097ee02f6ff0859db4b64bf5cc09c220e6a..0000000000000000000000000000000000000000 --- a/server/bin/wsserver.py +++ /dev/null @@ -1,151 +0,0 @@ -from autobahn.twisted.websocket import WebSocketServerFactory -from autobahn.twisted.resource import WebSocketResource -from autobahn.websocket.compress import PerMessageDeflateOffer, PerMessageDeflateOfferAccept -import trackdirect -import argparse -import psutil -import sys -import os.path -import logging -import logging.handlers -from twisted.internet import reactor -from twisted.web.server import Site -from twisted.web.static import File -from socket import AF_INET - - -def master(options, trackDirectLogger): - """ - Start of the master process. - """ - config = trackdirect.TrackDirectConfig() - config.populate(options.config) - - workerPid = os.getpid() - p = psutil.Process(workerPid) - p.cpu_affinity([0]) - trackDirectLogger.warning("Starting master with PID " + str(workerPid) + " (on CPU id(s): " + ','.join(map(str, p.cpu_affinity())) + ")") - - try: - factory = WebSocketServerFactory() - factory.protocol = trackdirect.TrackDirectWebsocketServer - - resource = WebSocketResource(factory) - root = File(".") - root.putChild(b"ws", resource) - site = Site(root) - - port = reactor.listenTCP(config.websocketPort, site) - - for i in range(1, options.workers): - args = [sys.executable, "-u", __file__] - args.extend(sys.argv[1:]) - args.extend(["--fd", str(port.fileno()), "--cpuid", str(i)]) - - reactor.spawnProcess( - None, sys.executable, args, - childFDs={0: 0, 1: 1, 2: 2, port.fileno(): port.fileno()}, - env=os.environ) - - options.fd = port.fileno() - listen(options, trackDirectLogger) - - except Exception as e: - trackDirectLogger.error(e, exc_info=1) - - -def worker(options, trackDirectLogger): - """ - Start background worker process. - """ - config = trackdirect.TrackDirectConfig() - config.populate(options.config) - - try: - workerPid = os.getpid() - p = psutil.Process(workerPid) - p.cpu_affinity([options.cpuid]) - - trackDirectLogger.warning("Starting worker with PID " + str(workerPid) + " (on CPU id(s): " + ','.join(map(str, p.cpu_affinity())) + ")") - - listen(options, trackDirectLogger) - - except Exception as e: - trackDirectLogger.error(e, exc_info=1) - - -def listen(options, trackDirectLogger) : - """ - Start to listen on websocket requests. - """ - config = trackdirect.TrackDirectConfig() - config.populate(options.config) - - factory = WebSocketServerFactory( - "ws://" + config.websocketHostname + ":" + str(config.websocketPort), - externalPort = config.websocketExternalPort) - factory.protocol = trackdirect.TrackDirectWebsocketServer - - # Enable WebSocket extension "permessage-deflate". - # Function to accept offers from the client .. - def accept(offers): - for offer in offers: - if isinstance(offer, PerMessageDeflateOffer): - return PerMessageDeflateOfferAccept(offer) - factory.setProtocolOptions(perMessageCompressionAccept=accept) - - reactor.suggestThreadPoolSize(25) - - # Socket already created, just start listening and accepting - reactor.adoptStreamPort(options.fd, AF_INET, factory) - - reactor.run() - - -if __name__ == '__main__': - DEFAULT_WORKERS = psutil.cpu_count() - - parser = argparse.ArgumentParser( - description='Track Direct WebSocket Server') - parser.add_argument('--config', dest='config', type=str, default=None, - help='The Track Direct config file, e.g. trackdirect.ini') - parser.add_argument('--workers', dest='workers', type=int, default=DEFAULT_WORKERS, - help='Number of workers to spawn - should fit the number of (physical) CPU cores.') - parser.add_argument('--fd', dest='fd', type=int, default=None, - help='If given, this is a worker which will use provided FD and all other options are ignored.') - parser.add_argument('--cpuid', dest='cpuid', type=int, default=None, - help='If given, this is a worker which will use provided CPU core to set its affinity.') - - options = parser.parse_args() - config = trackdirect.TrackDirectConfig() - config.populate(options.config) - - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser( - config.errorLog), mode='a', maxBytes=1000000, backupCount=10) - fh.setFormatter(formatter) - - consoleHandler = logging.StreamHandler() - consoleHandler.setFormatter(formatter) - - trackDirectLogger = logging.getLogger('trackdirect') - trackDirectLogger.addHandler(fh) - trackDirectLogger.addHandler(consoleHandler) - trackDirectLogger.setLevel(logging.INFO) - - fh2 = logging.handlers.RotatingFileHandler(filename=os.path.expanduser( - config.errorLog), mode='a', maxBytes=1000000, backupCount=10) - # aprslib is logging non important "socket error on ..." using ERROR-level - fh2.setFormatter(formatter) - - aprslibLogger = logging.getLogger('aprslib.IS') - aprslibLogger.addHandler(fh2) - aprslibLogger.addHandler(consoleHandler) - aprslibLogger.setLevel(logging.INFO) - - if options.fd is not None: - worker(options, trackDirectLogger) - else: - master(options, trackDirectLogger) diff --git a/server/log/.gitignore b/server/log/.gitignore deleted file mode 100644 index 5e7d2734cfc60289debf74293817c0a8f572ff32..0000000000000000000000000000000000000000 --- a/server/log/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/server/scripts/collector.sh b/server/scripts/collector.sh deleted file mode 100755 index 50bd14ddfd9d66e06cfe2a1a74e8bbf0450318cd..0000000000000000000000000000000000000000 --- a/server/scripts/collector.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -if [ $# -eq 0 ] - then - echo "No arguments supplied" - echo "$0 [config file] [collector number]" - exit -fi - -CONFIGFILE=$1 -COLLECTORNUMBER=$2 - -if ps -ef | grep -v grep | grep "bin/collector.py $CONFIGFILE $COLLECTORNUMBER" ; then - exit 0 -else - CURRENTDIR=$(dirname $0) - - export PYTHONPATH=$PYTHONPATH:$CURRENTDIR/../trackdirect - cd $CURRENTDIR/.. - python $CURRENTDIR/../bin/collector.py $CONFIGFILE $COLLECTORNUMBER - exit 0 -fi diff --git a/server/scripts/db_setup.sh b/server/scripts/db_setup.sh deleted file mode 100755 index acea6638e202648a49c5a878f7b0b4179014eaa7..0000000000000000000000000000000000000000 --- a/server/scripts/db_setup.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh -if [ $# -eq 0 ] - then - echo "No arguments supplied" - echo "$0 [dbname] [dbport] [sqlpath]" - exit -fi - -DATABASE=$1 -PORT=$2 -SQLPATH=$3 - -# Assumes .pgpass is correctly set -psql -p $PORT $DATABASE << EOF - -begin transaction; - -\i $SQLPATH/01_map.sql -\i $SQLPATH/02_marker.sql -\i $SQLPATH/03_ogn_address_type.sql -\i $SQLPATH/04_ogn_aircraft_type.sql -\i $SQLPATH/05_ogn_device.sql -\i $SQLPATH/06_ogn_hidden_station.sql -\i $SQLPATH/07_packet_type.sql -\i $SQLPATH/08_sender.sql -\i $SQLPATH/09_source.sql -\i $SQLPATH/10_station_type.sql -\i $SQLPATH/11_station.sql -\i $SQLPATH/12_station_telemetry_bits.sql -\i $SQLPATH/13_station_telemetry_eqns.sql -\i $SQLPATH/14_station_telemetry_param.sql -\i $SQLPATH/15_station_telemetry_unit.sql -\i $SQLPATH/16_packet.sql -\i $SQLPATH/17_packet_weather.sql -\i $SQLPATH/18_packet_telemetry.sql -\i $SQLPATH/19_packet_path.sql -\i $SQLPATH/20_packet_ogn.sql - -commit; - -EOF - - -exit 0 diff --git a/server/scripts/ogn_devices_install.sh b/server/scripts/ogn_devices_install.sh deleted file mode 100755 index 5859bc1a39ff4ccf1dbf7c14886483aba128d415..0000000000000000000000000000000000000000 --- a/server/scripts/ogn_devices_install.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -if [ $# -eq 0 ] - then - echo "No arguments supplied" - echo "$0 [dbname] [dbport]" - exit -fi - -DATABASE=$1 -PORT=$2 - -pushd `dirname $0` > /dev/null -SCRIPTPATH=`pwd -P` -popd > /dev/null - -# Create dir and remove old stuff (keep zip-file since it may be equal to latest) -mkdir -p $SCRIPTPATH/ogndevices -mkdir -p $SCRIPTPATH/ogndevices/${DATABASE} -rm $SCRIPTPATH/ogndevices/${DATABASE}/*.csv -rm $SCRIPTPATH/ogndevices/${DATABASE}/*.txt -cd $SCRIPTPATH/ogndevices/${DATABASE} - -# Download latest csv file (but only if newer) -wget -N http://ddb.glidernet.org/download/?t=1 -O ogndevices.csv - -if test `find "ogndevices.csv" -cmin +30` -then - echo "File is not updated, skip reload of database." -else - - -# Remove comments in file -sed '/^#/ d' < ogndevices.csv > ogndevices2.csv - -# Load file into database (assumes .pgpass is correctly set) -psql -p $PORT $DATABASE << EOF - -create table if not exists ogn_device ( - "device_type" text not null, - "device_id" text not null, - "aircraft_model" text not null, - "registration" text not null, - "cn" text not null, - "tracked" text not null, - "identified" text not null, - "ddb_aircraft_type" text not null -); - -begin transaction; - -drop index if exists ogn_device_device_id_idx; -truncate ogn_device; -\copy ogn_device from '$SCRIPTPATH/ogndevices/$DATABASE/ogndevices2.csv' DELIMITERS ',' CSV QUOTE ''''; -create index ogn_device_device_id_idx on ogn_device(device_id); - -insert into ogn_device(device_type, device_id, aircraft_model, registration, cn, tracked, identified, ddb_aircraft_type) values ('F', '3FEF6F', '', '', '', 'N', 'N', 1); -commit; - -EOF - -fi - -exit 0 diff --git a/server/scripts/remover.sh b/server/scripts/remover.sh deleted file mode 100755 index ccb0cae108ffce298477e29787a43cc9b82ba732..0000000000000000000000000000000000000000 --- a/server/scripts/remover.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -if [ $# -eq 0 ] - then - echo "No arguments supplied" - echo "$0 [config file path]" - exit -fi - -CONFIGFILE=$1 - -if ps -ef | grep -v grep | grep "bin/remover.py $CONFIGFILE" ; then - exit 0 -else - CURRENTDIR=$(dirname $0) - - export PYTHONPATH=$PYTHONPATH:$CURRENTDIR/../trackdirect - cd $CURRENTDIR/.. - python $CURRENTDIR/../bin/remover.py $CONFIGFILE - exit 0 -fi diff --git a/server/scripts/stationremover.sh b/server/scripts/stationremover.sh deleted file mode 100755 index 72be13e363e1517dbb68fc5663bdb9b7b14f1b17..0000000000000000000000000000000000000000 --- a/server/scripts/stationremover.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -if [ $# -eq 0 ] - then - echo "No arguments supplied" - echo "$0 [config file path] [station id]" - exit -fi - -CONFIGFILE=$1 -STATIONID=$2 - -if ps -ef | grep -v grep | grep "bin/stationremover.py $CONFIGFILE $STATIONID" ; then - exit 0 -else - CURRENTDIR=$(dirname $0) - - export PYTHONPATH=$PYTHONPATH:$CURRENTDIR/../trackdirect - cd $CURRENTDIR/.. - python $CURRENTDIR/../bin/stationremover.py $CONFIGFILE $STATIONID - exit 0 -fi diff --git a/server/scripts/wsserver.sh b/server/scripts/wsserver.sh deleted file mode 100755 index 999d3e7936b254ea8e55f9544715d55f63d20bd7..0000000000000000000000000000000000000000 --- a/server/scripts/wsserver.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -if [ $# -eq 0 ] - then - echo "No arguments supplied" - echo "$0 [config file]" - exit -fi - -CONFIGFILE=$1 - -if ps -eo pid,pgid,cmd | grep -v grep | grep "bin/wsserver.py --config $CONFIGFILE" ; then - exit 0 -else - CURRENTDIR=$(dirname $0) - - export PYTHONPATH=$PYTHONPATH:$CURRENTDIR/../trackdirect - cd $CURRENTDIR/.. - python $CURRENTDIR/../bin/wsserver.py --config $CONFIGFILE - exit 0 -fi diff --git a/server/trackdirect/TrackDirectConfig.py b/server/trackdirect/TrackDirectConfig.py deleted file mode 100644 index 422d26afcbf2400e5bf48b2b0e50b6c6bf38b574..0000000000000000000000000000000000000000 --- a/server/trackdirect/TrackDirectConfig.py +++ /dev/null @@ -1,190 +0,0 @@ -import os -import os.path -import configparser - -from trackdirect.common.Singleton import Singleton - - -class TrackDirectConfig(Singleton): - """Track Direct Config class - """ - - def __init__(self): - """The __init__ method. - """ - self.collector = {} - - def populate(self, configFile): - """The __init__ method. - - Args: - configFile (string): Config file name - """ - configParser = configparser.SafeConfigParser() - if (configFile.startswith('/')): - configParser.read(os.path.expanduser(configFile)) - else: - configParser.read(os.path.expanduser( - '~/trackdirect/config/' + configFile)) - - # Database - self.dbHostname = configParser.get('database', 'host').strip('"') - self.dbName = configParser.get('database', 'database').strip('"') - try: - self.dbUsername = configParser.get( - 'database', 'username').strip('"') - except (configparser.NoSectionError, configparser.NoOptionError): - self.dbUsername = os.getlogin() - self.dbPassword = configParser.get('database', 'password').strip('"') - self.dbPort = int(configParser.get('database', 'port').strip('"')) - self.daysToSavePositionData = int(configParser.get( - 'database', 'days_to_save_position_data').strip('"')) - self.daysToSaveStationData = int(configParser.get( - 'database', 'days_to_save_station_data').strip('"')) - self.daysToSaveWeatherData = int(configParser.get( - 'database', 'days_to_save_weather_data').strip('"')) - self.daysToSaveTelemetryData = int(configParser.get( - 'database', 'days_to_save_telemetry_data').strip('"')) - - self.saveOgnStationsWithMissingIdentity = False - try: - saveOgnStationsWithMissingIdentity = configParser.get( - 'database', 'save_ogn_stations_with_missing_identity').strip('"') - if (saveOgnStationsWithMissingIdentity == "1"): - self.saveOgnStationsWithMissingIdentity = True - except (configparser.NoSectionError, configparser.NoOptionError): - pass - - # Websocket server - self.websocketHostname = configParser.get( - 'websocket_server', 'host').strip('"') - self.websocketPort = int(configParser.get( - 'websocket_server', 'port').strip('"')) - - self.websocketExternalPort = self.websocketPort - try : - self.websocketExternalPort = int(configParser.get( - 'websocket_server', 'external_port').strip('"')) - except (configparser.NoSectionError, configparser.NoOptionError): - pass - - self.errorLog = configParser.get( - 'websocket_server', 'error_log').strip('"') - self.websocketFrequencyLimit = configParser.get( - 'websocket_server', 'frequency_limit').strip('"') - - self.maxDefaultTime = int(configParser.get( - 'websocket_server', 'max_default_time').strip('"')) - self.maxFilterTime = int(configParser.get( - 'websocket_server', 'max_filter_time').strip('"')) - self.maxClientIdleTime = int(configParser.get( - 'websocket_server', 'max_client_idle_time').strip('"')) - self.maxQueuedRealtimePackets = int(configParser.get( - 'websocket_server', 'max_queued_realtime_packets').strip('"')) - - allowTimeTravel = configParser.get( - 'websocket_server', 'allow_time_travel').strip('"') - self.allowTimeTravel = False - if (allowTimeTravel == "1"): - self.allowTimeTravel = True - - # Websocket server APRS connection (we support 2 different sources, more can be added...) - try: - self.websocketAprsHost1 = configParser.get( - 'websocket_server', 'aprs_host1').strip('"') - self.websocketAprsPort1 = configParser.get( - 'websocket_server', 'aprs_port1').strip('"') - self.websocketAprsSourceId1 = int(configParser.get( - 'websocket_server', 'aprs_source_id1').strip('"')) - except (configparser.NoSectionError, configparser.NoOptionError): - self.websocketAprsSourceId1 = None - self.websocketAprsHost1 = None - self.websocketAprsPort1 = None - - try: - self.websocketAprsHost2 = configParser.get( - 'websocket_server', 'aprs_host2').strip('"') - self.websocketAprsPort2 = configParser.get( - 'websocket_server', 'aprs_port2').strip('"') - self.websocketAprsSourceId2 = int(configParser.get( - 'websocket_server', 'aprs_source_id2').strip('"')) - except (configparser.NoSectionError, configparser.NoOptionError): - self.websocketAprsSourceId2 = None - self.websocketAprsHost2 = None - self.websocketAprsPort2 = None - - if (self.websocketAprsSourceId1 == 5 or self.websocketAprsSourceId2 == 5) : - # At least one source is of type OGN, disable display of older data - self.allowTimeTravel = False - if (self.maxDefaultTime > 1440) : - self.maxDefaultTime = 1440 - if (self.maxFilterTime > 1440) : - self.maxDefaultTime = 1440 - - # Collectors - for collectorNumber in range(0, 5): - self.collector[collectorNumber] = {} - try: - self.collector[collectorNumber]['source_id'] = int(configParser.get( - 'collector' + str(collectorNumber), 'source_id').strip('"')) - self.collector[collectorNumber]['host'] = configParser.get( - 'collector' + str(collectorNumber), 'host').strip('"') - self.collector[collectorNumber]['port_full'] = int(configParser.get( - 'collector' + str(collectorNumber), 'port_full').strip('"')) - self.collector[collectorNumber]['port_filtered'] = int(configParser.get( - 'collector' + str(collectorNumber), 'port_filtered').strip('"')) - - self.collector[collectorNumber]['callsign'] = configParser.get( - 'collector' + str(collectorNumber), 'callsign').strip('"') - self.collector[collectorNumber]['passcode'] = configParser.get( - 'collector' + str(collectorNumber), 'passcode').strip('"') - - self.collector[collectorNumber]['numbers_in_batch'] = configParser.get( - 'collector' + str(collectorNumber), 'numbers_in_batch').strip('"') - try: - self.collector[collectorNumber]['frequency_limit'] = int(configParser.get( - 'collector' + str(collectorNumber), 'frequency_limit').strip('"')) - except (configparser.NoSectionError, configparser.NoOptionError): - self.collector[collectorNumber]['frequency_limit'] = 0 - - try: - saveFastPackets = configParser.get( - 'collector' + str(collectorNumber), 'save_fast_packets').strip('"') - self.collector[collectorNumber]['save_fast_packets'] = bool( - int(saveFastPackets)) - except (configparser.NoSectionError, configparser.NoOptionError): - self.collector[collectorNumber]['save_fast_packets'] = False - - try: - detectDuplicates = configParser.get( - 'collector' + str(collectorNumber), 'detect_duplicates').strip('"') - self.collector[collectorNumber]['detect_duplicates'] = bool( - int(detectDuplicates)) - except (configparser.NoSectionError, configparser.NoOptionError): - self.collector[collectorNumber]['detect_duplicates'] = False - - self.collector[collectorNumber]['error_log'] = configParser.get( - 'collector' + str(collectorNumber), 'error_log').strip('"') - - if (self.websocketAprsSourceId1 == 5 or self.websocketAprsSourceId2 == 5) : - # source is of type OGN, make sure we do not save to many packets (will cause to high load on db) - if (self.collector[collectorNumber]['frequency_limit'] < 10) : - self.collector[collectorNumber]['frequency_limit'] = 10 - self.collector[collectorNumber]['save_fast_packets'] = False - - - except (configparser.NoSectionError, configparser.NoOptionError): - self.collector[collectorNumber]['source_id'] = None - self.collector[collectorNumber]['host'] = None - self.collector[collectorNumber]['port_full'] = None - self.collector[collectorNumber]['port_filtered'] = None - - self.collector[collectorNumber]['callsign'] = None - self.collector[collectorNumber]['passcode'] = None - - self.collector[collectorNumber]['numbers_in_batch'] = "20" - self.collector[collectorNumber]['frequency_limit'] = "0" - self.collector[collectorNumber]['save_fast_packets'] = True - self.collector[collectorNumber]['detect_duplicates'] = False - - self.collector[collectorNumber]['error_log'] = None diff --git a/server/trackdirect/TrackDirectDataCollector.py b/server/trackdirect/TrackDirectDataCollector.py deleted file mode 100644 index 63959b197bf4dfc6724add2bfb144516423d34be..0000000000000000000000000000000000000000 --- a/server/trackdirect/TrackDirectDataCollector.py +++ /dev/null @@ -1,524 +0,0 @@ -import logging -import psycopg2 -import psycopg2.extras -import re -import aprslib -import datetime -import time -from twisted.internet import reactor, threads - -from trackdirect.parser.AprsPacketParser import AprsPacketParser -from trackdirect.parser.AprsISConnection import AprsISConnection -from trackdirect.parser.policies.PacketDuplicatePolicy import PacketDuplicatePolicy -from trackdirect.collector.PacketBatchInserter import PacketBatchInserter -from trackdirect.exceptions.TrackDirectParseError import TrackDirectParseError -from trackdirect.database.DatabaseConnection import DatabaseConnection -from trackdirect.repositories.StationRepository import StationRepository - -#from pympler.tracker import SummaryTracker - -class TrackDirectDataCollector(): - """An TrackDirectDataCollector instance connects to the data source and saves all received packets to the database - - Note: - The collector class is built to handle ONE connection to a data source server (may be a APRS-IS server), if two is wanted run two processes. - This is useful if you want one connection to the regular APRS-IS network and one connection to the CWOP network. - """ - - def __init__(self, collectorOptions, saveOgnStationsWithMissingIdentity): - """The __init__ method. - - Args: - collectorOptions (dict): Contains data like host, port, callsign, passcode, source id - saveOgnStationsWithMissingIdentity (boolean): True if we should not ignore stationss with a missing identity - """ - self.saveOgnStationsWithMissingIdentity = saveOgnStationsWithMissingIdentity - self.sourceHostname = collectorOptions['host'] - self.sourcePort = collectorOptions['port_full'] - self.numbersInBatch = collectorOptions['numbers_in_batch'] - self.saveFastPackets = collectorOptions['save_fast_packets'] - self.frequencyLimit = collectorOptions['frequency_limit'] - self.detectDuplicates = collectorOptions['detect_duplicates'] - self.hardFrequencyLimit = None - if (not self.saveFastPackets and self.frequencyLimit is not None and int(self.frequencyLimit) > 0): - # Only respect hard frequency limit if we are not saving "fast packets" - self.hardFrequencyLimit = self.frequencyLimit - self.sourceId = collectorOptions['source_id'] - self.callsign = collectorOptions['callsign'] - self.passcode = collectorOptions['passcode'] - - dbConnection = DatabaseConnection() - self.db = dbConnection.getConnection(True) - self.dbNoAutoCommit = dbConnection.getConnection(False) - - self.stationRepository = StationRepository(self.db) - self.logger = logging.getLogger(__name__) - - self.latestPacketTimestamp = None - self.firstPacketTimestamp = None - self.latestBatchInsertTimestamp = int(time.time()) - - self.packets = [] - self.stationIdsWithVisiblePacket = [] - self.movingStationIdsWithVisiblePacket = [] - self.movingMarkerIdsWithVisiblePacket = [] - self.delay = 0 - - def run(self): - """Start the collector - """ - threads.deferToThread(self.consume) - # reactor.suggestThreadPoolSize(20) - reactor.run() - - def consume(self): - """Start consuming packets - """ - - #tracker = SummaryTracker() - - connection = AprsISConnection( - self.callsign, self.passcode, self.sourceHostname, self.sourcePort) - connection.setFrequencyLimit(self.hardFrequencyLimit) - connection.setSourceId(self.sourceId) - - def onPacketRead(line): - if (not reactor.running): - raise StopIteration('Stopped') - - timestamp = int(time.time()) - deferred = threads.deferToThread(self._parse, line, timestamp) - deferred.addCallback(onParseComplete) - deferred.addErrback(onParseError) - - def onParseComplete(packet): - reactor.callFromThread(self._addPacket, packet) - - def onParseError(error): - # Parse will more or less only cast exception if db connection is lost - - # Force restart of collector (we assume that server will be autostarted if stopped) - if reactor.running: - reactor.stop() - raise error - - try: - connection.connect() - connection.filteredConsumer(onPacketRead, True, True) - - #tracker.print_diff() - - except (aprslib.ConnectionDrop) as exp: - # Just reconnect... - self.logger.warning('Lost connection') - self.logger.warning(exp) - self.consume() - - except Exception as e: - self.logger.error(e) - - # Force restart of collector - if reactor.running: - reactor.stop() - - def _parse(self, line, timestamp): - """Parse raw packet - - Args: - line (string): APRS raw packet string - timestamp (int): Receive time of packet - - Returns: - Returns a Packet - """ - try: - self.delay = int(time.time())-timestamp - if (self.delay > 60): - self.logger.error( - 'Collector has a delay on %s seconds, ignoring packets until solved', self.delay) - return None - elif (self.delay > 15): - self.logger.warning( - 'Collector has a delay on %s seconds', self.delay) - - packetDict = aprslib.parse(line) - parser = AprsPacketParser(self.db, self.saveOgnStationsWithMissingIdentity) - parser.setSourceId(self.sourceId) - packet = parser.getPacket(packetDict, timestamp) - - if (packet.mapId == 15 or packet.mapId == 16): - return None - - if (self.detectDuplicates): - self._checkIfDuplicate(packet) - - return self._cleanPacket(packet) - - except (aprslib.ParseError, aprslib.UnknownFormat, TrackDirectParseError) as exp: - return self._parseUnsupportedPacket(line, timestamp) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except (UnicodeDecodeError) as exp: - # just forget about this packet - pass - except Exception as e: - self.logger.error(e, exc_info=1) - return None - - def _parseUnsupportedPacket(self, line, timestamp): - """Try to parse raw packet that aprs-lib could not handle - - Args: - line (string): APRS raw packet string - timestamp (int): Receive time of packet - - Returns: - Returns a Packet - """ - try: - line = line.decode('utf-8', 'ignore') - packetDict = self.basicParse(line) - parser = AprsPacketParser(self.db, self.saveOgnStationsWithMissingIdentity) - parser.setSourceId(self.sourceId) - packet = parser.getPacket(packetDict, timestamp, True) - packet.markerId = 1 - - if (packet.packetTypeId == 6): # Telemetry packet - packet.packetTypeId = 10 # Has no position - else: - packet.mapId = 11 # Unsupported packet - - return packet - except Exception as e: - self.logger.debug(e) - self.logger.debug(line) - return None - - def _addPacket(self, packet): - """Adds packet to database - - Args: - packet (Packet): The packet - """ - if (packet is None): - return - - # Soft frequency limit check - if (self._isStationSendingToFast(packet)): - if (not self.saveFastPackets): - return - - packet.markerId = 1 - packet.mapId = 8 - - # Reset all mapId related values - packet.replacePacketId = None - packet.abnormalPacketId = None - packet.confirmPacketId = None - packet.replacePacketTimestamp = None - packet.abnormalPacketTimestamp = None - packet.confirmPacketTimestamp = None - - if (packet.mapId == 6): - # Packet received in wrong order - if (not self.saveFastPackets): - return - - if (not self._isPacketValidInCurrentBatch(packet)): - self._insertBatch() - - if (self._shouldPacketBeAdded(packet)): - self._addPacketToBatch(packet) - - if (self._isBatchFull()): - self._insertBatch() - - if (self._isBatchOld()): - self._insertBatch() - - def _isStationSendingToFast(self, packet): - """Returns true if this packet has been sent to close to previous packet from the same station (we need to save previous packet first) - - Args: - packet (Packet) : The packet that may have been sent to fast - - Returns: - Boolean - """ - if (packet.mapId in [1, 5, 7, 9] and packet.isMoving == 1 and self.frequencyLimit is not None): - frequencyLimitToApply = int(self.frequencyLimit) - - if (frequencyLimitToApply == 0): - return False - - if (packet.ogn is not None and packet.ogn.ognTurnRate is not None): - turnRate = abs(float(packet.ogn.ognTurnRate)) - if (turnRate > 0) : - frequencyLimitToApply = int(frequencyLimitToApply / (1+turnRate)) - - if packet.markerPrevPacketTimestamp: - if ((packet.timestamp - frequencyLimitToApply) < packet.markerPrevPacketTimestamp): - # This station is sending faster than config limit - return True - - if (packet.stationId in self.movingStationIdsWithVisiblePacket): - # This station is sending way to fast (we havn't even added the previous packet to database yet) - return True - - if (packet.markerId in self.movingMarkerIdsWithVisiblePacket): - # The senders of this object is sending way to fast (we havn't even added the previous packet to database yet) - return True - return False - - def _isPacketValidInCurrentBatch(self, packet): - """Returns true if this packet can be added to current batch - - Args: - packet (Packet) : The packet that e want to add to current batch - - Returns: - Boolean - """ - if (self.latestPacketTimestamp is not None): - # If previous packet belongs to another date we can not add packet to current batch - currentPacketDate = datetime.datetime.utcfromtimestamp( - int(packet.timestamp)).strftime('%Y%m%d') - latestPacketDate = datetime.datetime.utcfromtimestamp( - self.latestPacketTimestamp).strftime('%Y%m%d') - - if (currentPacketDate != latestPacketDate and len(self.packets) > 0): - return False - - if (packet.stationId in self.stationIdsWithVisiblePacket): - # We only want to handle one packet per station per batch - return False - - return True - - def _shouldPacketBeAdded(self, packet): - """Returns true if this packet should be added to database - - Args: - packet (Packet) : The packet that we want to add to batch - - Returns: - Boolean - """ - if (packet.sourceId != 3 or packet.stationIdPath): - # We only add pure duplicates to batch if they have a path, otherwise we are not interested - return True - return False - - def _isBatchFull(self): - """Returns true if batch is considered full - - Returns: - Boolean - """ - # If we do insert when we have specified amount of packets (or if more than 5s has passed) - if (int(len(self.packets)) > int(self.numbersInBatch)): - return True - elif (len(self.packets) > 0 and self.latestBatchInsertTimestamp < int(time.time()) - 5): - return True - return False - - def _isBatchOld(self): - """Returns true if batch is considered old - - Returns: - Boolean - """ - if (self.latestPacketTimestamp is not None - and self.firstPacketTimestamp is not None - and self.latestPacketTimestamp - self.firstPacketTimestamp > 1): - return True - return False - - def _addPacketToBatch(self, packet): - """Add instance of ParsedPacket to batch - - Args: - packet (Packet): Packet that we want to add to batch - """ - self.latestPacketTimestamp = int(packet.timestamp) - if (self.firstPacketTimestamp is None): - self.firstPacketTimestamp = int(packet.timestamp) - self.packets.append(packet) - if (packet.mapId in [1, 5, 7, 9]): - self.stationIdsWithVisiblePacket.append(packet.stationId) - if (packet.isMoving == 1): - self.movingStationIdsWithVisiblePacket.append(packet.stationId) - self.movingMarkerIdsWithVisiblePacket.append(packet.markerId) - - def _insertBatch(self): - """Perform insert on the current batch - """ - if (len(self.packets) > 0): - self.latestBatchInsertTimestamp = int(time.time()) - - # Make sure packets is inserted in the order that they where received - self.packets.reverse() - - # Do batch insert - packetBatchInserter = PacketBatchInserter( - self.db, self.dbNoAutoCommit) - packetBatchInserter.insert(self.packets[:], self.sourceId) - - self._reset() - - def _reset(self): - """Reset all collector variables - """ - self.packets = [] - self.stationIdsWithVisiblePacket = [] - self.movingStationIdsWithVisiblePacket = [] - self.movingMarkerIdsWithVisiblePacket = [] - self.latestPacketTimestamp = None - self.firstPacketTimestamp = None - - def _cleanPacket(self, packet): - """Method used to clean a Packet from unused columns - - Args: - packet (Packet): Object of class Packet - - Returns: - Returns a packet (cleaned) - """ - if (packet.mapId not in [1, 5, 7, 9]): - # This packet will never be shown on map, remove information that won't be used (just to save some space in database) - packet.markerId = None - packet.markerCounter = None - packet.packetTailTimestamp = None - packet.positionTimestamp = None - packet.posambiguity = None - packet.symbol = None - packet.symbolTable = None - packet.mapSector = None - packet.relatedMapSectors = None - packet.speed = None - packet.course = None - packet.altitude = None - packet.isMoving = 1 - return packet - - def _checkIfDuplicate(self, packet): - """Method used to check if this packet is a duplicate - - Note: - If packet is a duplicate the object attribute mapId will be updated, and some related attributes. - - Args: - packet (Packet): Object of class Packet - """ - packetDuplicatePolicy = PacketDuplicatePolicy(self.stationRepository) - if (packetDuplicatePolicy.isDuplicate(packet)): - # It is a duplicate (or at least we treat it as one just to be safe) - packet.mapId = 3 - packet.markerId = 1 - packet.replacePacketId = None # No older packet should be replaced!!! - packet.replacePacketTimestamp = None - packet.abnormalPacketId = None # Do not mark previous as abnormal yet - packet.abnormalPacketTimestamp = None - packet.confirmPacketId = None # Do not confirm previous position - packet.confirmPacketTimestamp = None - - def basicParse(self, line): - """Performes a basic packet parse and returnes result as a dict - - Args: - line (string): Packet raw string - - Returns: - Returns packet dict - """ - # Divide into body and head - try: - (head, body) = line.split(':', 1) - except: - raise TrackDirectParseError("no body", {}) - - if len(body) == 0: - raise TrackDirectParseError("body is empty", {}) - - packetType = body[0] - body = body[1:] - - # Find sender, destination and path in header - try: - (fromcall, path) = head.split('>', 1) - except: - raise TrackDirectParseError("no header", {}) - - if (not 1 <= len(fromcall) <= 9): - raise TrackDirectParseError("fromcallsign has invalid length", {}) - - path = path.split(',') - tocall = path[0] - - if len(tocall) == 0: - tocall = None - - path = path[1:] - - for station in path: - if not re.findall(r"^[A-Z0-9\-]{1,9}\*?$", station, re.I): - path = None - break - - objectName = '' - if packetType == ';': - match = re.findall(r"^([ -~]{9})(\*|_)", body) - if match: - name, flag = match[0] - objectName = name - body = body[10:] - - if packetType == ')': - match = re.findall(r"^([ -~!]{3,9})(\!|_)", body) - if match: - name, flag = match[0] - objectName = name - body = body[len(name)+1:] - - comment = None - telemetry = None - if packetType == 'T': - telemetry = {} - lst = body.split(',') - if len(lst) >= 7 : - seq = body.split(',')[0] - vals = body.split(',')[1:6] - bits = body.split(',')[6][:8] - comment = body.split(',')[6][8:] - - if seq.startswith('T'): - seq = seq[1:] - if seq.startswith('#'): - seq = seq[1:] - - for i in range(5): - try: - vals[i] = float(vals[i]) if vals[i] != '' else None - except ValueError: - vals[i] = None - - telemetry = { - 'seq': seq, - 'vals': vals, - 'bits': bits - } - - # Create result - packet = { - 'from': fromcall, - 'to': tocall, - 'path': path, - 'raw': line, - 'object_name': objectName, - 'packet_type': packetType, - 'telemetry': telemetry, - 'comment': comment - } - return packet diff --git a/server/trackdirect/TrackDirectWebsocketServer.py b/server/trackdirect/TrackDirectWebsocketServer.py deleted file mode 100644 index fe9a0706c957f011ea84cdbd05a2e63dfc0aa1b0..0000000000000000000000000000000000000000 --- a/server/trackdirect/TrackDirectWebsocketServer.py +++ /dev/null @@ -1,434 +0,0 @@ -import logging - -from twisted.internet import threads, reactor, task -from twisted.internet.error import AlreadyCancelled, AlreadyCalled - -from autobahn.twisted.websocket import WebSocketServerProtocol - -import json -import time -import psycopg2 -import psycopg2.extras -import os -import trackdirect -from trackdirect.database.DatabaseConnection import DatabaseConnection - -from trackdirect.websocket.WebsocketResponseCreator import WebsocketResponseCreator -from trackdirect.websocket.WebsocketConnectionState import WebsocketConnectionState - -from trackdirect.websocket.aprsis.AprsISReader import AprsISReader -from trackdirect.websocket.aprsis.AprsISPayloadCreator import AprsISPayloadCreator - - -class TrackDirectWebsocketServer(WebSocketServerProtocol): - """The TrackDirectWebsocketServer class handles the incoming requests - """ - - def __init__(self): - """The __init__ method. - """ - WebSocketServerProtocol.__init__(self) - self.logger = logging.getLogger('trackdirect') - - self.config = trackdirect.TrackDirectConfig() - self.maxClientIdleTime = int(self.config.maxClientIdleTime) * 60 - self.maxQueuedRealtimePackets = int( - self.config.maxQueuedRealtimePackets) - - dbConnection = DatabaseConnection() - db = dbConnection.getConnection(True) - - self.connectionState = WebsocketConnectionState() - self.responseCreator = WebsocketResponseCreator( - self.connectionState, db) - self.aprsISReader = AprsISReader(self.connectionState, db) - self.aprsISPayloadCreator = AprsISPayloadCreator( - self.connectionState, db) - - self.numberOfRealTimePacketThreads = 0 - self.timestampSenderCall = None - self.realTimeListenerCall = None - self.onInactiveCall = None - self.isUnknownClient = False - - def onConnect(self, request): - """Method that is executed on connect - - Args: - request (object): The connection request - """ - try: - if ('x-forwarded-for' in request.headers): - self.logger.warning("Client connecting from origin: {0}, x-forwarded-for: {1} (server pid {2})".format( - request.origin, request.headers['x-forwarded-for'], str(os.getpid()))) - else: - self.logger.warning( - "Client connecting from origin: {0} (server pid {1})".format(request.origin, str(os.getpid()))) - - except Exception as e: - self.logger.error(e, exc_info=1) - raise e - - def onOpen(self): - """Method that is executed on open - """ - try: - self.logger.info("WebSocket connection open.") - - self._sendResponseByType(42) # Inform client that we are active - self._startTimestampSender() - self._reScheduleInactiveEvent() - except Exception as e: - self.logger.error(e, exc_info=1) - - def onMessage(self, payload, isBinary): - """Method that is executed on incoming message - - Args: - request (object): The connection request - isBinary (boolean): True if binary otherwise false - """ - try: - request = json.loads(payload) - if (self.isUnknownClient): - self.logger.warning( - "Incoming message from unknown client: {0}".format(str(request))) - - if ("payload_request_type" not in request): - self.logger.warning( - "Incoming request has no type (%s)" % (exp)) - self.logger.warning(payload) - return - self._onRequest(request) - except (ValueError) as exp: - self.logger.warning( - "Incoming request could not be parsed (%s)" % (exp)) - self.logger.warning(payload) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - self.logger.error(e, exc_info=1) - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def onClose(self, wasClean, code, reason): - """Method that is executed on close - - Args: - wasClean (boolean): True if clean close otherwise false - code (int): Close code - reason (object): Reason for close - """ - try: - self.logger.info("WebSocket connection closed: {0}".format(reason)) - self.connectionState.disconnected = True - self._stopTimestampSender() - self._stopRealTimeListener(True) - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def _onRequest(self, request, requestId=None): - """Method that is executed on incoming request - - Args: - request (object): The connection request - requestId (int): Id of the request - """ - if (request["payload_request_type"] != 11): - self._reScheduleInactiveEvent() - - if (request["payload_request_type"] in [5, 7, 9]): - # Request that not affects the current map status (to much) - deferred = threads.deferToThread( - self._processRequest, request, None) - deferred.addErrback(self._onError) - - else: - # Request that affects map and current state - if (requestId is None): - requestId = self.connectionState.latestRequestId + 1 - self.connectionState.latestRequestType = request["payload_request_type"] - self.connectionState.latestRequestId = requestId - self.connectionState.latestRequestTimestamp = int(time.time()) - self._stopRealTimeListener(False) - - if (self.connectionState.latestHandledRequestId < requestId - 1): - reactor.callLater(0.1, self._onRequest, request, requestId) - else: - self._updateState(request) - - deferred = threads.deferToThread( - self._processRequest, request, requestId) - deferred.addErrback(self._onError) - deferred.addCallback(self._onRequestDone) - - def _processRequest(self, request, requestId): - """Method that sends a response to websocket client based on request - - Args: - request (Dict): Request from websocket client - requestId (int): Request id of processed request - """ - try: - for response in self.responseCreator.getResponses(request, requestId): - if self.connectionState.disconnected: - break - reactor.callFromThread(self._sendDictResponse, response) - return requestId - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - self.logger.error(e, exc_info=1) - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def _onRequestDone(self, requestId): - """Method that is executed when request is processed - - Args: - requestId (int): Request id of processed request - """ - try: - if (self.connectionState.latestHandledRequestId < requestId): - self.connectionState.latestHandledRequestId = requestId - if (self.connectionState.latestRequestId == requestId): - # We have no newer requests - # Tell client response is complete - self._sendResponseByType(35) - - if (self.connectionState.latestTimeTravelRequest is None - and self.connectionState.noRealTime is False - and self.connectionState.isValidLatestPosition()): - self._startRealTimeListener(requestId) - - elif ((int(time.time()) - self.connectionState.latestRequestTimestamp) <= self.maxClientIdleTime): - self._sendResponseByType(33) # Tell client we are idle - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def _onError(self, error): - """Method that is executed when a deferToThread failed - - Args: - error (Exception): The Exception - """ - # Exception should only end up here if db connection is lost - # Force restart of wsserver - if reactor.running: - reactor.stop() - raise error - - def _startRealTimeListener(self, relatedRequestId): - """Start real time APRS-IS listener, onRealTimePacketFound will be executed when a packet is received - - Args: - relatedRequestId (int): Request id of related request - """ - def readRealTimePacket(): - if (self.connectionState.latestRequestId == relatedRequestId and not self.connectionState.disconnected): - self.aprsISReader.read(onRealTimePacketFound) - - def onRealTimePacketComplete(): - self.numberOfRealTimePacketThreads -= 1 - if (self.numberOfRealTimePacketThreads <= 0): - # If we have no packets on the way we should see if we have another waiting - readRealTimePacket() - - def onRealTimePacketFound(raw, sourceId): - if (raw is None and sourceId is None): - # Something went wrong, stop everything - self._onInactive() - else: - if (self.numberOfRealTimePacketThreads > self.maxQueuedRealtimePackets): - # To many packets, several previous LoopingCall's is not done yet. - # We need to discard some packets, otherwise server will be overloaded and we will only send old packets. - # Client is required to request total update now and then, so the discarded packets should be send to client later. - - counter = self.aprsISReader.clear(5) - #self.logger.warning('Discarding ' + str(counter) + ' packets') - else: - self.numberOfRealTimePacketThreads += 1 - deferred = threads.deferToThread( - self._processRealTimePacket, raw, sourceId) - deferred.addCallback(lambda _: onRealTimePacketComplete()) - deferred.addErrback(self._onError) - - # Tell client we are connecting to real time feed - self._sendResponseByType(34) - self.aprsISReader.start() # Will start if needed and change filter if needed - # Tell client we are listening on real time feed - self._sendResponseByType(31) - - self.realTimeListenerCall = task.LoopingCall(readRealTimePacket) - self.realTimeListenerCall.start(0.2) - - def _stopRealTimeListener(self, disconnect=False): - """Stop real time APRS-IS listener, onRealTimePacketFound will be executed when a packet is received - - Args: - disconnect (Boolean): Set to true to also disconnect from APRS-IS servers - """ - if (self.realTimeListenerCall is not None): - try: - self.realTimeListenerCall.stop() - except (AlreadyCalled, AssertionError) as e: - pass - - if (disconnect): - self.aprsISReader.stop() - else: - self.aprsISReader.pause() - - def _processRealTimePacket(self, raw, sourceId): - """Method that is executed when we have a new real time packet to send - - Args: - raw (string): Raw packet from APRS-IS - sourceId (int): The id of the source (1 for APRS and 2 for CWOP ...) - """ - try: - for response in self.aprsISPayloadCreator.getPayloads(raw, sourceId): - reactor.callFromThread(self._sendDictResponse, response) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - self.logger.error(e, exc_info=1) - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def _startTimestampSender(self): - """Method schedules call to _sendTimestampResponse to keep connection up - """ - self.timestampSenderCall = task.LoopingCall( - self._sendTimestampResponse) - self.timestampSenderCall.start(1.0) - - def _stopTimestampSender(self): - """Stop looping call to _sendTimestampResponse - """ - if (self.timestampSenderCall is not None): - try: - self.timestampSenderCall.stop() - except AssertionError as e: - pass - - def _reScheduleInactiveEvent(self): - """Method schedules call to _onInactive when client has been idle too long - - Note: - When _reScheduleInactiveEvent is called any previous schedules will be cancelled and countdown will be reset - """ - if (self.onInactiveCall is not None): - try: - self.onInactiveCall.cancel() - except (AlreadyCalled, AlreadyCancelled) as e: - pass - self.onInactiveCall = reactor.callLater( - self.maxClientIdleTime, self._onInactive) - - def _onInactive(self): - """Method that is executed when client has been inactive too long - """ - try: - # Client is inactive, pause (to save bandwidth, cpu and memory) - self._sendResponseByType(36) - self._stopTimestampSender() - self._stopRealTimeListener(True) - self.connectionState.totalReset() - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - self.logger.error(e, exc_info=1) - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def _sendTimestampResponse(self): - """Send server timestamp to syncronize server and client - - Notes: - This is also used to tell the client that we are still here - Most browser will disconnect if they do not hear anything in 300sec - """ - try: - if (self.connectionState.latestHandledRequestId < self.connectionState.latestRequestId): - # server is busy with request, no point in doing this now - return - data = {} - data["timestamp"] = int(time.time()) - self._sendResponseByType(41, data) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - self.logger.error(e, exc_info=1) - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.error(e, exc_info=1) - - def _sendResponseByType(self, payloadResponseType, data=None): - """Send specified response to client - - Args: - payloadResponseType (int): A number that specifies what type of response we are sending - data (dict): The response data as a dict - """ - if (data is not None): - payload = { - 'payload_response_type': payloadResponseType, 'data': data} - else: - payload = {'payload_response_type': payloadResponseType} - self._sendDictResponse(payload) - - def _sendDictResponse(self, payload): - """Send message dict payload to client - - Args: - payload (Dict): Response payload - """ - try: - jsonPayload = json.dumps(payload, ensure_ascii=True).encode('utf8') - if (jsonPayload is not None): - self.sendMessage(jsonPayload) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just terminate connection to make user reconnect with new db connection - self.logger.error(e, exc_info=1) - raise e - except Exception as e: - # Log error to make us aware of unknow problem - self.logger.warning(e, exc_info=1) - - def _updateState(self, request): - """Update the connection state based on request - - Args: - request (Dict): Request form client - """ - if ("neLat" in request - and "neLng" in request - and "swLat" in request - and "swLng" in request - and "minutes" in request): - self.connectionState.setLatestMapBounds( - request["neLat"], request["neLng"], request["swLat"], request["swLng"]) - - if ("onlyLatestPacket" in request): - self.connectionState.setOnlyLatestPacketRequested( - (request["onlyLatestPacket"] == 1)) - - if ("minutes" in request): - if ("time" in request): - self.connectionState.setLatestMinutes( - request["minutes"], request["time"]) - else: - self.connectionState.setLatestMinutes(request["minutes"], None) - - if ("noRealTime" in request): - self.connectionState.disableRealTime() diff --git a/server/trackdirect/__init__.py b/server/trackdirect/__init__.py deleted file mode 100644 index 27c9b557ec18ba62184bcaf63c90ac1d8b8606d3..0000000000000000000000000000000000000000 --- a/server/trackdirect/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" - -from TrackDirectDataCollector import * -from TrackDirectWebsocketServer import * -from TrackDirectConfig import * diff --git a/server/trackdirect/collector/PacketBatchInserter.py b/server/trackdirect/collector/PacketBatchInserter.py deleted file mode 100644 index a0899d440a0d3e113ce343b5e5abb7b7d28b14c9..0000000000000000000000000000000000000000 --- a/server/trackdirect/collector/PacketBatchInserter.py +++ /dev/null @@ -1,425 +0,0 @@ -import logging -import psycopg2 -import psycopg2.extras - -from trackdirect.collector.StationLatestPacketModifier import StationLatestPacketModifier -from trackdirect.collector.PacketMapIdModifier import PacketMapIdModifier - -from trackdirect.database.PacketTableCreator import PacketTableCreator -from trackdirect.database.PacketPathTableCreator import PacketPathTableCreator -from trackdirect.database.PacketWeatherTableCreator import PacketWeatherTableCreator -from trackdirect.database.PacketTelemetryTableCreator import PacketTelemetryTableCreator -from trackdirect.database.PacketOgnTableCreator import PacketOgnTableCreator - - -class PacketBatchInserter(): - """PacketBatchInserter is used to add a list of packets to the database - """ - - def __init__(self, db, dbNoAutoCommit): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection (with autocommit) - dbNoAutoCommit (psycopg2.Connection): Database connection (without autocommit) - """ - self.db = db - self.dbNoAutoCommit = dbNoAutoCommit - self.logger = logging.getLogger(__name__) - - self.packetIdList = [] - self.weatherPacketIdList = [] - self.ognPacketIdList = [] - self.telemetryPacketIdList = [] - self.pathPacketIdList = [] - self.positionPacketIdList = [] - self.confirmedPositionPacketIdList = [] - - def insert(self, packets, sourceId): - """Insert this packets into database - - Args: - packets (array): Packets to insert - sourceId (int): Id that corresponds to id in source-table - """ - cur = self.dbNoAutoCommit.cursor() - try: - # Make sure needed tables exists before starting the main database transaction - self._makeSureTablesExists(packets) - - # insert telemetry data - self._insertTelemetryDefinitions(packets) - - # Update mapId on previous packets - packetTableCreator = PacketTableCreator(self.db) - packetMapIdModifier = PacketMapIdModifier(cur, packetTableCreator) - packetMapIdModifier.execute(packets) - - # insert into packet (and packet_path ...) - self._insertIntoPacketTables(packets, cur) - - self.dbNoAutoCommit.commit() - cur.close() - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - self.dbNoAutoCommit.rollback() - cur.close() - raise e - except Exception as e: - # Something went wrong - self.logger.error(e, exc_info=1) - self.dbNoAutoCommit.rollback() - cur.close() - return - self._performPostInsertActions(packets) - - def _makeSureTablesExists(self, packets): - """Make sures all tables needed to insert specified packets exists - - Args: - packets (array): Packets to insert - """ - timestamp = packets[0].timestamp # All packets is known to be on the same date - - packetTableCreator = PacketTableCreator(self.db) - packetTable = packetTableCreator.getPacketTable(timestamp) - - packetPathTableCreator = PacketPathTableCreator(self.db) - packetPathTable = packetPathTableCreator.getPacketPathTable(timestamp) - - packetWeatherTableCreator = PacketWeatherTableCreator(self.db) - packetWeatherTable = packetWeatherTableCreator.getPacketWeatherTable( - timestamp) - - packetTelemetryTableCreator = PacketTelemetryTableCreator(self.db) - packetTelemetryTable = packetTelemetryTableCreator.getPacketTelemetryTable( - timestamp) - - packetOgnTableCreator = PacketOgnTableCreator(self.db) - packetOgnTable = packetOgnTableCreator.getPacketOgnTable(timestamp) - - def _performPostInsertActions(self, packets): - """Perform post insert updates like updating station latest packet and related - - Args: - packets (array): Packets to insert - """ - timestamp = packets[0].timestamp - latestPacketModifier = StationLatestPacketModifier(self.db) - latestPacketModifier.updateStationLatestPacket( - self.packetIdList, timestamp) - latestPacketModifier.updateStationLatestTelemetryPacket( - self.telemetryPacketIdList, timestamp) - latestPacketModifier.updateStationLatestWeatherPacket( - self.weatherPacketIdList, timestamp) - latestPacketModifier.updateStationLatestOgnPacket( - self.ognPacketIdList, timestamp) - latestPacketModifier.updateStationLatestLocationPacket( - self.positionPacketIdList, timestamp) - latestPacketModifier.updateStationLatestConfirmedPacket( - self.confirmedPositionPacketIdList, timestamp) - - def _insertIntoPacketTables(self, packets, cur): - """Insert packets into the correct packet tables - - Args: - packets (array): Packets to insert - cur (cursor): Database curser to use - """ - self._insertIntoPacketTable(packets, cur) - self._insertIntoPacketPathTable(packets, cur) - self._insertIntoPacketWeatherTable(packets, cur) - self._insertIntoPacketOgnTable(packets, cur) - self._insertIntoPacketTelemetryTable(packets, cur) - - def _insertIntoPacketTable(self, packets, cur): - """Insert packets into the correct packet table - - Args: - packets (array): Packets to insert - cur (cursor): Database curser to use - """ - timestamp = packets[0].timestamp - packetTableCreator = PacketTableCreator(self.db) - packetTable = packetTableCreator.getPacketTable(timestamp) - - datePacketTuples = [] - for packet in packets: - - datePacketTuples.append((packet.stationId, - packet.senderId, - packet.mapId, - packet.sourceId, - packet.packetTypeId, - packet.latitude, - packet.longitude, - packet.posambiguity, - packet.symbol, - packet.symbolTable, - packet.mapSector, - packet.relatedMapSectors, - packet.markerId, - packet.markerCounter, - packet.speed, - packet.course, - packet.altitude, - packet.rng, - packet.phg, - packet.latestPhgTimestamp, - packet.latestRngTimestamp, - packet.timestamp, - packet.packetTailTimestamp, - packet.isMoving, - packet.reportedTimestamp, - packet.positionTimestamp, - packet.comment, - packet.rawPath, - packet.raw)) - - try: - # insert into packetYYYYMMDD - argString = b','.join(cur.mogrify( - "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", x) for x in datePacketTuples) - sql = "insert into " + packetTable + "(station_id, sender_id, map_id, source_id, packet_type_id, latitude, longitude, posambiguity, symbol, symbol_table, map_sector, related_map_sectors, marker_id, marker_counter, speed, course, altitude, rng, phg, latest_phg_timestamp, latest_rng_timestamp, timestamp, packet_tail_timestamp, is_moving, reported_timestamp, position_timestamp, comment, raw_path, raw) values " + argString.decode() + " RETURNING id" - cur.execute(sql) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - # Something went wrong, log error so we can fix problem - self.logger.error(e, exc_info=1) - self.logger.error(sql) - return - - i = 0 - for record in cur: - if packets[i]: - packets[i].id = record["id"] - - if packets[i].mapId in [1]: - self.confirmedPositionPacketIdList.append(record["id"]) - elif packets[i].mapId in [1, 5, 7, 9]: - self.positionPacketIdList.append(record["id"]) - else: - # We only need to add the packet to the packetIdList if not in the positionPacketIdList or confirmedPositionPacketIdList array's - self.packetIdList.append(record["id"]) - i += 1 - - def _insertIntoPacketPathTable(self, packets, cur): - """Insert packets into the correct packet path table - - Args: - packets (array): Packets to insert - cur (cursor): Database curser to use - """ - timestamp = packets[0].timestamp - packetPathTableCreator = PacketPathTableCreator(self.db) - packetPathTable = packetPathTableCreator.getPacketPathTable(timestamp) - - i = 0 - pathTuples = [] - for packet in packets: - if (packet.stationIdPath): - self.pathPacketIdList.append(packet.id) - number = 0 - for stationId in packet.stationIdPath: - if (packet.stationLocationPath - and packet.stationLocationPath[number]): - latitude = packet.stationLocationPath[number][0] - longitude = packet.stationLocationPath[number][1] - distance = packet.getTransmitDistance() - - pathTuples.append( - (packet.id, stationId, latitude, longitude, packet.timestamp, distance, number, packet.stationId, packet.latitude, packet.longitude)) - number += 1 - i += 1 - - # insert into packetYYYYMMDD_path - if pathTuples: - try: - argString = b','.join(cur.mogrify( - "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", x) for x in pathTuples) - cur.execute("insert into " + packetPathTable + - "(packet_id, station_id, latitude, longitude, timestamp, distance, number, sending_station_id, sending_latitude, sending_longitude) values " + argString.decode()) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - # Something went wrong, log error so we can fix problem - self.logger.error(e, exc_info=1) - self.logger.error(argString) - - def _insertIntoPacketWeatherTable(self, packets, cur): - """Insert packets into the correct packet weather table - - Args: - packets (array): Packets to insert - cur (cursor): Database curser to use - """ - timestamp = packets[0].timestamp - packetWeatherTableCreator = PacketWeatherTableCreator(self.db) - packetWeatherTable = packetWeatherTableCreator.getPacketWeatherTable( - timestamp) - - i = 0 - weatherTuples = [] - for packet in packets: - if (packet.weather): - self.weatherPacketIdList.append(packet.id) - weatherTuples.append((packet.id, - packet.stationId, - packet.timestamp, - packet.weather.humidity, - packet.weather.pressure, - packet.weather.rain1h, - packet.weather.rain24h, - packet.weather.rainSinceMidnight, - packet.weather.temperature, - packet.weather.windDirection, - packet.weather.windGust, - packet.weather.windSpeed, - packet.weather.luminosity, - packet.weather.snow, - packet.weather.wxRawTimestamp)) - i += 1 - - # insert into packetYYYYMMDD_weather - if weatherTuples: - try: - argString = b','.join(cur.mogrify( - "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", x) for x in weatherTuples) - cur.execute("insert into " + packetWeatherTable + - "(packet_id, station_id, timestamp, humidity, pressure, rain_1h, rain_24h, rain_since_midnight, temperature, wind_direction, wind_gust, wind_speed, luminosity, snow, wx_raw_timestamp) values " + argString.decode()) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - # Something went wrong, log error so we can fix problem - self.logger.error(e, exc_info=1) - self.logger.error(argString) - - def _insertIntoPacketOgnTable(self, packets, cur): - """Insert packets into the correct packet OGN table - - Args: - packets (array): Packets to insert - cur (cursor): Database curser to use - """ - timestamp = packets[0].timestamp - packetOgnTableCreator = PacketOgnTableCreator(self.db) - packetOgnTable = packetOgnTableCreator.getPacketOgnTable(timestamp) - - i = 0 - ognTuples = [] - for packet in packets: - if (packet.ogn): - self.ognPacketIdList.append(packet.id) - ognTuples.append((packet.id, - packet.stationId, - packet.timestamp, - packet.ogn.ognSenderAddress, - packet.ogn.ognAddressTypeId, - packet.ogn.ognAircraftTypeId, - packet.ogn.ognClimbRate, - packet.ogn.ognTurnRate, - packet.ogn.ognSignalToNoiseRatio, - packet.ogn.ognBitErrorsCorrected, - packet.ogn.ognFrequencyOffset)) - - i += 1 - # insert into packetYYYYMMDD_ogn - if ognTuples: - try: - argString = b','.join(cur.mogrify( - "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", x) for x in ognTuples) - cur.execute("insert into " + packetOgnTable + "(packet_id, station_id, timestamp, ogn_sender_address, ogn_address_type_id, ogn_aircraft_type_id, ogn_climb_rate, ogn_turn_rate, ogn_signal_to_noise_ratio, ogn_bit_errors_corrected, ogn_frequency_offset) values " + argString.decode()) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - # Something went wrong, log error so we can fix problem - self.logger.error(e, exc_info=1) - self.logger.error(argString) - - def _insertIntoPacketTelemetryTable(self, packets, cur): - """Insert packets into the correct packet telemetry table - - Args: - packets (array): Packets to insert - cur (cursor): Database curser to use - """ - timestamp = packets[0].timestamp - packetTelemetryTableCreator = PacketTelemetryTableCreator(self.db) - packetTelemetryTable = packetTelemetryTableCreator.getPacketTelemetryTable( - timestamp) - - i = 0 - telemetryTuples = [] - for packet in packets: - if (packet.telemetry): - self.telemetryPacketIdList.append(packet.id) - if (not packet.telemetry.isDuplicate()): - telemetryTuples.append((packet.id, - packet.stationId, - packet.timestamp, - packet.telemetry.val1, - packet.telemetry.val2, - packet.telemetry.val3, - packet.telemetry.val4, - packet.telemetry.val5, - packet.telemetry.bits, - packet.telemetry.seq)) - i += 1 - - # insert into packetYYYYMMDD_telemetry - if telemetryTuples: - try: - argString = b','.join(cur.mogrify( - "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", x) for x in telemetryTuples) - cur.execute("insert into " + packetTelemetryTable + - "(packet_id, station_id, timestamp, val1, val2, val3, val4, val5, bits, seq) values " + argString.decode() + " returning id") - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - # Something went wrong, log error so we can fix problem - self.logger.error(e, exc_info=1) - - packetTelemetryIds = [] - record = cur.fetchone() - while record: - packetTelemetryIds.append(record['id']) - record = cur.fetchone() - - try: - cur.execute("""update """ + packetTelemetryTable + """ packet_telemetry set - station_telemetry_param_id = (select id from station_telemetry_param where station_id = packet_telemetry.station_id and valid_to_ts is null), - station_telemetry_unit_id = (select id from station_telemetry_unit where station_id = packet_telemetry.station_id and valid_to_ts is null), - station_telemetry_eqns_id = (select id from station_telemetry_eqns where station_id = packet_telemetry.station_id and valid_to_ts is null), - station_telemetry_bits_id = (select id from station_telemetry_bits where station_id = packet_telemetry.station_id and valid_to_ts is null) - where id in %s""", (tuple(packetTelemetryIds), )) - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - # Something went wrong, log error so we can fix problem - self.logger.error(e, exc_info=1) - - def _insertTelemetryDefinitions(self, packets): - """Insert telemetry definitions (PARAM, UNIT, EQNS, BITS) if any exists in current packets - - Args: - packets (array): Packets to insert - """ - for packet in packets: - if (packet.stationTelemetryBits): - packet.stationTelemetryBits.save() - - if (packet.stationTelemetryEqns): - packet.stationTelemetryEqns.save() - - if (packet.stationTelemetryParam): - packet.stationTelemetryParam.save() - - if (packet.stationTelemetryUnit): - packet.stationTelemetryUnit.save() diff --git a/server/trackdirect/collector/PacketMapIdModifier.py b/server/trackdirect/collector/PacketMapIdModifier.py deleted file mode 100644 index 2893c45f605dda00b101287368c3ab80859a2df4..0000000000000000000000000000000000000000 --- a/server/trackdirect/collector/PacketMapIdModifier.py +++ /dev/null @@ -1,164 +0,0 @@ -import logging -from twisted.python import log -import psycopg2 -import psycopg2.extras - -from trackdirect.database.PacketTableCreator import PacketTableCreator -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketMapIdModifier(): - """PacketMapIdModifier is used to modify mapId on existing packets in database based on new packets - """ - - def __init__(self, cur, packetTableCreator): - """The __init__ method. - - Args: - cur (psycopg2.Cursor): Database cursor - packetTableCreator (PacketTableCreator): PacketTableCreator instance - """ - self.cur = cur - self.packetTableCreator = packetTableCreator - - def execute(self, packets): - """Perform mapId mofifications based on information in specified packets - - Args: - packets (array): Packets that may affect exisintg packets mapId - cur (cursor): Database curser to use - """ - self._markPreviousPacketsAsReplaced(packets) - self._markPreviousPacketsAsAbnormal(packets) - self._markPreviousPacketsAsConfirmed(packets) - - def _markPreviousPacketsAsReplaced(self, packets): - """Find packets that has been replaced by packets in this batch and mark them as replaced (mapId 2, 12 or 13) - - Args: - packets (array): Packets that may affect exisintg packets mapId - """ - packetsToUpdateToMapId2 = {} - packetsToUpdateToMapId12 = {} - packetsToUpdateToMapId13 = {} - for packet in packets: - if (packet.replacePacketId is not None): - try: - self.packetTableCreator.enableCreateIfMissing() - newPacketTable = self.packetTableCreator.getPacketTable( - packet.timestamp) - self.packetTableCreator.disableCreateIfMissing() - oldPacketTable = self.packetTableCreator.getPacketTable( - packet.replacePacketTimestamp) - - if (packet.mapId == 5): - if (oldPacketTable not in packetsToUpdateToMapId13): - packetsToUpdateToMapId13[oldPacketTable] = [] - - packetsToUpdateToMapId13[oldPacketTable].append( - packet.replacePacketId) - - elif (newPacketTable == oldPacketTable): - if (oldPacketTable not in packetsToUpdateToMapId2): - packetsToUpdateToMapId2[oldPacketTable] = [] - - packetsToUpdateToMapId2[oldPacketTable].append( - packet.replacePacketId) - - else: - if (oldPacketTable not in packetsToUpdateToMapId12): - packetsToUpdateToMapId12[oldPacketTable] = [] - - packetsToUpdateToMapId12[oldPacketTable].append( - packet.replacePacketId) - except TrackDirectMissingTableError as e: - pass - - if (packetsToUpdateToMapId2): - for packetTable in packetsToUpdateToMapId2: - # Set map_id = 2 - self._updatePacketMapId( - packetTable, packetsToUpdateToMapId2[packetTable], 2) - - if (packetsToUpdateToMapId12): - for packetTable in packetsToUpdateToMapId12: - # Set map_id = 12 - self._updatePacketMapId( - packetTable, packetsToUpdateToMapId12[packetTable], 12) - - if (packetsToUpdateToMapId13): - for packetTable in packetsToUpdateToMapId13: - # Set map_id = 13 - self._updatePacketMapId( - packetTable, packetsToUpdateToMapId13[packetTable], 13) - - def _markPreviousPacketsAsAbnormal(self, packets): - """Find packets that has been confirmed to by abnormal becuse of packets in this batch and mark them as abnormal (mapId 9) - - Args: - packets (array): Packets that may affect exisintg packets mapId - """ - packetsToUpdate = {} - for packet in packets: - if (packet.abnormalPacketId is not None): - try: - self.packetTableCreator.disableCreateIfMissing() - packetTable = self.packetTableCreator.getPacketTable( - packet.abnormalPacketTimestamp) - - if (packetTable not in packetsToUpdate): - packetsToUpdate[packetTable] = [] - - packetsToUpdate[packetTable].append( - packet.abnormalPacketId) - except TrackDirectMissingTableError as e: - pass - - if (packetsToUpdate): - for packetTable in packetsToUpdate: - # Set map_id = 9 - self._updatePacketMapId( - packetTable, packetsToUpdate[packetTable], 9) - - def _markPreviousPacketsAsConfirmed(self, packets): - """Find packets that has been found to be correct becuase of packets in this batch and mark them as confirmed (mapId 1) - - Args: - packets (array): Packets that may affect exisintg packets mapId - cur (cursor): Database curser to use - """ - packetsToUpdate = {} - for packet in packets: - if (packet.confirmPacketId is not None): - try: - self.packetTableCreator.disableCreateIfMissing() - packetTable = self.packetTableCreator.getPacketTable( - packet.confirmPacketTimestamp) - - if (packetTable not in packetsToUpdate): - packetsToUpdate[packetTable] = [] - - packetsToUpdate[packetTable].append(packet.confirmPacketId) - except TrackDirectMissingTableError as e: - pass - - if (packetsToUpdate): - for packetTable in packetsToUpdate: - # Set map_id = 1 - self._updatePacketMapId( - packetTable, packetsToUpdate[packetTable], 1) - - def _updatePacketMapId(self, packetTable, packetIdList, mapId): - """Update map id on all specified packets - - Args: - cur (cursor): Database cursor to use - packetTable (str): Packet database table to perform update on - packetIdList (array): Array of all packet id's to update - mapId (int): The requested new map id - """ - if (packetIdList): - sql = self.cur.mogrify("""update """ + packetTable + """ - set map_id = %s - where id in %s""", (mapId, tuple(packetIdList),)) - self.cur.execute(sql) diff --git a/server/trackdirect/collector/StationLatestPacketModifier.py b/server/trackdirect/collector/StationLatestPacketModifier.py deleted file mode 100644 index ecc06231ec38bd306884c60c93d4e3b6e7298ec5..0000000000000000000000000000000000000000 --- a/server/trackdirect/collector/StationLatestPacketModifier.py +++ /dev/null @@ -1,187 +0,0 @@ -from trackdirect.database.PacketTableCreator import PacketTableCreator - - -class StationLatestPacketModifier(): - """The StationLatestPacketModifier class contains functionality to modify the station latest packet - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.packetTableCreator = PacketTableCreator(db) - - def updateStationLatestConfirmedPacket(self, packetIdList, timestamp): - """Updates several stations latest confirmed packet based on the specified list of packet id's - - Args: - packetIdList (array): Array of packet id's that should be used to set the latest confirmed packets on related stations - timestamp (int): Unix timestamp which is in the same date as the receive date of all packets (UTC) - - Returns: - number of updated stations - """ - if (packetIdList): - packetTable = self.packetTableCreator.getPacketTable(timestamp) - cur = self.db.cursor() - sql = cur.mogrify(""" - update station set latest_sender_id = packet.sender_id, - latest_confirmed_packet_id = packet.id, - latest_confirmed_marker_id = packet.marker_id, - latest_confirmed_packet_timestamp = packet.timestamp, - latest_confirmed_symbol = packet.symbol, - latest_confirmed_symbol_table = packet.symbol_table, - latest_confirmed_latitude = packet.latitude, - latest_confirmed_longitude = packet.longitude, - latest_location_packet_id = packet.id, - latest_location_packet_timestamp = packet.timestamp, - latest_packet_id = packet.id, - latest_packet_timestamp = packet.timestamp - from """ + packetTable + """ packet - where packet.station_id = station.id - and packet.id in %s""", (tuple(packetIdList),)) - cur.execute(sql) - rowCount = cur.rowcount - - cur.close() - return rowCount - return 0 - - def updateStationLatestLocationPacket(self, packetIdList, timestamp): - """Updates several stations latest location packet based on the specified list of packet id's - - Args: - packetIdList (array): Array of packet id's that should be used to set the latest location packets on related stations - timestamp (int): Unix timestamp which is in the same date as the receive date of all packets (UTC) - - Returns: - number of updated stations - """ - if (packetIdList): - packetTable = self.packetTableCreator.getPacketTable(timestamp) - cur = self.db.cursor() - sql = cur.mogrify(""" - update station set latest_location_packet_id = packet.id, - latest_location_packet_timestamp = packet.timestamp, - latest_packet_id = packet.id, - latest_packet_timestamp = packet.timestamp - from """ + packetTable + """ packet - where packet.station_id = station.id - and packet.id in %s""", (tuple(packetIdList),)) - cur.execute(sql) - rowCount = cur.rowcount - - cur.close() - return rowCount - return 0 - - def updateStationLatestPacket(self, packetIdList, timestamp): - """Updates several stations latest packet based on the specified list of packet id's - - Args: - packetIdList (array): Array of packet id's that should be used to set the latest packets on related stations - timestamp (int): Unix timestamp which is in the same date as the receive date of all packets (UTC) - - Returns: - number of updated stations - """ - if (packetIdList): - packetTable = self.packetTableCreator.getPacketTable(timestamp) - cur = self.db.cursor() - sql = cur.mogrify(""" - update station set latest_packet_id = packet.id, - latest_packet_timestamp = packet.timestamp - from """ + packetTable + """ packet - where packet.station_id = station.id - and packet.id in %s""", (tuple(packetIdList),)) - cur.execute(sql) - rowCount = cur.rowcount - - cur.close() - return rowCount - return 0 - - - def updateStationLatestTelemetryPacket(self, packetIdList, timestamp): - """Updates several stations latest telemetry packet based on the specified list of packet id's - - Args: - packetIdList (array): Array of packet id's that should be used to set the latest packets on related stations - timestamp (int): Unix timestamp which is in the same date as the receive date of all packets (UTC) - - Returns: - number of updated stations - """ - if (packetIdList): - packetTable = self.packetTableCreator.getPacketTable(timestamp) - cur = self.db.cursor() - sql = cur.mogrify(""" - update station set latest_telemetry_packet_id = packet.id, - latest_telemetry_packet_timestamp = packet.timestamp - from """ + packetTable + """ packet - where packet.station_id = station.id - and packet.id in %s""", (tuple(packetIdList),)) - cur.execute(sql) - rowCount = cur.rowcount - - cur.close() - return rowCount - return 0 - - def updateStationLatestOgnPacket(self, packetIdList, timestamp): - """Updates several stations latest OGN packet based on the specified list of packet id's - - Args: - packetIdList (array): Array of packet id's that should be used to set the latest packets on related stations - timestamp (int): Unix timestamp which is in the same date as the receive date of all packets (UTC) - - Returns: - number of updated stations - """ - if (packetIdList): - packetTable = self.packetTableCreator.getPacketTable(timestamp) - cur = self.db.cursor() - sql = cur.mogrify(""" - update station set latest_ogn_packet_id = packet_ogn.packet_id, - latest_ogn_packet_timestamp = packet_ogn.timestamp, - latest_ogn_sender_address = packet_ogn.ogn_sender_address, - latest_ogn_aircraft_type_id = packet_ogn.ogn_aircraft_type_id, - latest_ogn_address_type_id = packet_ogn.ogn_address_type_id - from """ + packetTable + """_ogn packet_ogn - where packet_ogn.station_id = station.id - and packet_ogn.packet_id in %s""", (tuple(packetIdList),)) - cur.execute(sql) - rowCount = cur.rowcount - cur.close() - return rowCount - return 0 - - def updateStationLatestWeatherPacket(self, packetIdList, timestamp): - """Updates several stations latest weather packet based on the specified list of packet id's - - Args: - packetIdList (array): Array of packet id's that should be used to set the latest packets on related stations - timestamp (int): Unix timestamp which is in the same date as the receive date of all packets (UTC) - - Returns: - number of updated stations - """ - if (packetIdList): - packetTable = self.packetTableCreator.getPacketTable(timestamp) - cur = self.db.cursor() - sql = cur.mogrify(""" - update station set latest_weather_packet_id = packet.id, - latest_weather_packet_timestamp = packet.timestamp, - latest_weather_packet_comment = packet.comment - from """ + packetTable + """ packet - where packet.station_id = station.id - and packet.id in %s""", (tuple(packetIdList),)) - cur.execute(sql) - rowCount = cur.rowcount - - cur.close() - return rowCount - return 0 \ No newline at end of file diff --git a/server/trackdirect/collector/__init__.py b/server/trackdirect/collector/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/collector/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/common/Model.py b/server/trackdirect/common/Model.py deleted file mode 100644 index 5661308d479137c40ee20ded7a55c0dd9605c936..0000000000000000000000000000000000000000 --- a/server/trackdirect/common/Model.py +++ /dev/null @@ -1,66 +0,0 @@ -import abc - - -class Model(): - """The Model class is the parent of all my models - """ - - def __init__(self, db): - """The __init__ method. - - Args: - id (int): Database row id - """ - self.id = None - self.db = db - - def isExistingObject(self): - """Returns true if the object exists in database - - Returns: - true if the object exists in database otherwise false - """ - if ((type(self.id) == int) and self.id is not None and self.id > 0): - return True - else: - return False - - @abc.abstractmethod - def insert(self): - """Insert this object into database - - Returns: - true on success otherwise false - """ - return False - - @abc.abstractmethod - def update(self): - """Update columns in database based on this object - - Returns: - true on success otherwise false - """ - return False - - @abc.abstractmethod - def validate(self): - """Return true if object attribute values are valid - - Returns: - true if object attribute values are valid otherwise false - """ - return - - def save(self): - """Save object data to database if attribute data is valid - - Returns: - true on success otherwise false - """ - if (self.validate()): - if (self.isExistingObject()): - return self.update() - else: - return self.insert() - return False diff --git a/server/trackdirect/common/Repository.py b/server/trackdirect/common/Repository.py deleted file mode 100644 index 7888c399483d89dbb66504631dada22bdef12c2e..0000000000000000000000000000000000000000 --- a/server/trackdirect/common/Repository.py +++ /dev/null @@ -1,27 +0,0 @@ - -import abc - - -class Repository(): - """The Repository class is the parent of all my repository classes - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (object): Database connection (with autocommit) - """ - self.db = db - - @abc.abstractmethod - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - object - """ - return diff --git a/server/trackdirect/common/Singleton.py b/server/trackdirect/common/Singleton.py deleted file mode 100644 index b767e94323824d87992769e9399afb315861e3e4..0000000000000000000000000000000000000000 --- a/server/trackdirect/common/Singleton.py +++ /dev/null @@ -1,7 +0,0 @@ -class Singleton(object): - _instance = None - - def __new__(class_, *args, **kwargs): - if not isinstance(class_._instance, class_): - class_._instance = object.__new__(class_, *args, **kwargs) - return class_._instance diff --git a/server/trackdirect/common/__init__.py b/server/trackdirect/common/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/common/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/database/DatabaseConnection.py b/server/trackdirect/database/DatabaseConnection.py deleted file mode 100644 index 42c2ec95b760b626454fc520d58951f53790328b..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/DatabaseConnection.py +++ /dev/null @@ -1,64 +0,0 @@ -import psycopg2 -import psycopg2.extras - -import trackdirect - - -class DatabaseConnection(): - """The DatabaseConnection class handles the most basic communication with the database - """ - - db = None - dbNoAutoCommit = None - - def __init__(self): - """The __init__ method. - """ - config = trackdirect.TrackDirectConfig() - self.host = config.dbHostname - self.database = config.dbName - self.username = config.dbUsername - self.password = config.dbPassword - self.port = config.dbPort - - def getConnection(self, autocommit=True, createNewConnection=False): - """Returns a connection to the database - - Args: - autocommit (boolean): set to true if you want the connection to autocommit otherwise false - createNewConnection (boolean): set to true to force a new connection - Returns: - psycopg2.Connection - """ - if (createNewConnection): - db = self._createNewConnection() - if (autocommit): - # Active autocommit to avoid open transactions laying around - DatabaseConnection.db.autocommit = True - return db - - elif (autocommit): - if (DatabaseConnection.db is None): - DatabaseConnection.db = self._createNewConnection() - # Active autocommit to avoid open transactions laying around - DatabaseConnection.db.autocommit = True - return DatabaseConnection.db - - else: - if (DatabaseConnection.dbNoAutoCommit is None): - DatabaseConnection.dbNoAutoCommit = self._createNewConnection() - return DatabaseConnection.dbNoAutoCommit - - def _createNewConnection(self): - """Returns a connection to the database - - Returns: - psycopg2.Connection - """ - return psycopg2.connect(host=self.host, - database=self.database, - user=self.username, - password=self.password, - port=self.port, - sslmode='disable', - cursor_factory=psycopg2.extras.DictCursor) diff --git a/server/trackdirect/database/DatabaseObjectFinder.py b/server/trackdirect/database/DatabaseObjectFinder.py deleted file mode 100644 index 680f99254d15d452bb4d6238336033d1fdb468b6..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/DatabaseObjectFinder.py +++ /dev/null @@ -1,81 +0,0 @@ -import logging -from twisted.python import log -import datetime -import time - - -class DatabaseObjectFinder(): - """The DatabaseObjectFinder class can be used to check if a database table exists or not - """ - - existingTables = {} - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def setTableExists(self, tablename): - """Mark a table as existing - - Args: - tablename (str): table to be marked as existing - """ - DatabaseObjectFinder.existingTables[tablename] = True - - def checkTableExists(self, tablename): - """Returns true if specified table exists in database - - Args: - tablename (str): Table that we want's to know if it exists or not - - Returns: - Returns true if specified table exists in database otherwise false - """ - todayDateStr = datetime.datetime.utcfromtimestamp( - int(time.time())).strftime('%Y%m%d') - yesterdayDateStr = datetime.datetime.utcfromtimestamp( - int(time.time()) - 86400).strftime('%Y%m%d') - - if (todayDateStr in tablename or yesterdayDateStr in tablename): - # We only trust cache for the latest two days - if (tablename in DatabaseObjectFinder.existingTables): - # we know table exists - return True - - cur = self.db.cursor() - cur.execute(""" - SELECT COUNT(*) - FROM information_schema.tables - WHERE table_name = '{0}' - """.format(tablename.replace('\'', '\'\''))) - if cur.fetchone()[0] == 1: - DatabaseObjectFinder.existingTables[tablename] = True - cur.close() - return True - else: - cur.close() - return False - - def checkIndexExists(self, index): - """Returns true if specified index exists in database - - Args: - index (str): index that we want's to know if it exists or not - - Returns: - Returns true if specified index exists in database otherwise false - """ - cur = self.db.cursor() - cur.execute("""select to_regclass('{0}') \"name\"""".format( - index.replace('\'', '\'\''))) - record = cur.fetchone() - if record and record['name'] == index.replace('\'', '\'\''): - cur.close() - return True - else: - cur.close() - return False diff --git a/server/trackdirect/database/PacketOgnTableCreator.py b/server/trackdirect/database/PacketOgnTableCreator.py deleted file mode 100644 index 46364051025bb18f255ab423b41ad8205d735a15..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/PacketOgnTableCreator.py +++ /dev/null @@ -1,108 +0,0 @@ -import logging -from twisted.python import log -import psycopg2 -import psycopg2.extras -import datetime -import time -import calendar - -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketOgnTableCreator(): - """The PacketOgnTableCreator class handles packet OGN table name logic - - Note: - Packets are stored in different tables depending on what day they are received, - new packet tables are created by this class. - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.dbObjectFinder = DatabaseObjectFinder(db) - self.logger = logging.getLogger('trackdirect') - self.createIfMissing = True - - def disableCreateIfMissing(self): - """Disable feature that creates new tables if missing - """ - self.createIfMissing = False - - def getPacketOgnTable(self, packetTimestamp): - """Returns the name of the OGN packet table - - Args: - packetTimestamp (int): Unix timestamp that we need the table for - - Returns: - the name of the OGN packet table as a string - """ - date = datetime.datetime.utcfromtimestamp( - packetTimestamp).strftime('%Y%m%d') - packetOgnTable = 'packet' + date + '_ogn' - if (not self.dbObjectFinder.checkTableExists(packetOgnTable)): - if(self.createIfMissing): - minTimestamp = packetTimestamp // (24*60*60) * (24*60*60) - maxTimestamp = minTimestamp + (24*60*60) - self._createPacketOgnTable( - packetOgnTable, minTimestamp, maxTimestamp) - self.dbObjectFinder.setTableExists(packetOgnTable) - else: - raise TrackDirectMissingTableError( - 'Database table does not exists') - return packetOgnTable - - def _createPacketOgnTable(self, tablename, minTimestamp, maxTimestamp): - """Create a packet OGN table with the specified name - - Args: - tablename (str): Name of the packet OGN table to create - packetTablename (str): Name of the related packet table - minTimestamp (int): Min Unix timestamp for this table - maxTimestamp (int): Max Unix timestamp for this table - """ - try: - # Note that we have no reference constraint to the packet table (we will keep rows in this table longer than rows in packet table) - cur = self.db.cursor() - sql = """ - create table %s () inherits (packet_ogn)""" % (tablename) - cur.execute(sql) - - sql = """alter table %s add constraint timestamp_range_check check(timestamp >= %d and timestamp < %d)""" % (tablename, minTimestamp, maxTimestamp) - cur.execute(sql) - - sql = """create index %s_pkey on %s using btree (id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_packet_id_idx on %s(packet_id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_station_id_idx on %s(station_id, timestamp)""" % ( - tablename, tablename) - cur.execute(sql) - - cur.close() - - except (psycopg2.IntegrityError, psycopg2.ProgrammingError) as e: - # Probably the other collector created the table at the same time (might happen when you run multiple collectors), just go on... - if ('already exists' not in str(e)): - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return - - except Exception as e: - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return diff --git a/server/trackdirect/database/PacketPathTableCreator.py b/server/trackdirect/database/PacketPathTableCreator.py deleted file mode 100644 index 8eda761db01a205fc9df18dc1a4aeee3683eb19a..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/PacketPathTableCreator.py +++ /dev/null @@ -1,111 +0,0 @@ -import logging -from twisted.python import log -import psycopg2 -import psycopg2.extras -import datetime -import time -import calendar - -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketPathTableCreator(): - """The PacketPathTableCreator class handles packet table name logic - - Note: - Packets are stored in different tables depending on what day they are received, - new packet tables are created by this class. - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.dbObjectFinder = DatabaseObjectFinder(db) - self.logger = logging.getLogger('trackdirect') - self.createIfMissing = True - - def disableCreateIfMissing(self): - """Disable feature that creates new tables if missing - """ - self.createIfMissing = False - - def getPacketPathTable(self, packetTimestamp): - """Returns the name of the path packet table - - Args: - packetTimestamp (int): Unix timestamp that we need the table for - - Returns: - Returns the name of the path packet table as a string - """ - date = datetime.datetime.utcfromtimestamp( - packetTimestamp).strftime('%Y%m%d') - packetTable = 'packet' + date - packetPathTable = 'packet' + date + '_path' - if (not self.dbObjectFinder.checkTableExists(packetPathTable)): - if(self.createIfMissing): - minTimestamp = packetTimestamp // (24*60*60) * (24*60*60) - maxTimestamp = minTimestamp + (24*60*60) - self._createPacketPathTable( - packetPathTable, minTimestamp, maxTimestamp) - self.dbObjectFinder.setTableExists(packetPathTable) - else: - raise TrackDirectMissingTableError( - 'Database table does not exists') - return packetPathTable - - def _createPacketPathTable(self, tablename, minTimestamp, maxTimestamp): - """Create a packet path table with the specified name - - Args: - tablename (str): Name of the packet path table to create - minTimestamp (int): Min Unix timestamp for this table - maxTimestamp (int): Max Unix timestamp for this table - """ - try: - cur = self.db.cursor() - sql = """ - create table %s () inherits (packet_path)""" % (tablename) - cur.execute(sql) - - sql = """alter table %s add constraint timestamp_range_check check(timestamp >= %d and timestamp < %d)""" % (tablename, minTimestamp, maxTimestamp) - cur.execute(sql) - - sql = """create index %s_pkey on %s using btree (id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_packet_id_idx on %s(packet_id, number)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_station_id_idx on %s(station_id, timestamp)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_sending_station_id_idx on %s(sending_station_id, timestamp)""" % ( - tablename, tablename) - cur.execute(sql) - - cur.close() - - except (psycopg2.IntegrityError, psycopg2.ProgrammingError) as e: - # Probably the other collector created the table at the same time (might happen when you run multiple collectors), just go on... - if ('already exists' not in str(e)): - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return - - except Exception as e: - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return diff --git a/server/trackdirect/database/PacketTableCreator.py b/server/trackdirect/database/PacketTableCreator.py deleted file mode 100644 index 26077c370e092afd981f8b86bf14643b2e114e77..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/PacketTableCreator.py +++ /dev/null @@ -1,157 +0,0 @@ -import logging -from twisted.python import log -import psycopg2 -import psycopg2.extras -import datetime -import time -import calendar - -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketTableCreator(): - """The PacketTableCreator class handles packet table name logic - - Note: - Packets are stored in different tables depending on what day they are received, - new packet tables are created by this class. - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.dbObjectFinder = DatabaseObjectFinder(db) - self.logger = logging.getLogger('trackdirect') - self.createIfMissing = True - - def disableCreateIfMissing(self): - """Disable feature that creates new tables if missing - """ - self.createIfMissing = False - - def enableCreateIfMissing(self): - """Enable feature that creates new tables if missing - """ - self.createIfMissing = True - - def getPacketTable(self, packetTimestamp): - """Returns the name of the packet table - - Args: - packetTimestamp (int): Unix timestamp that we need the table for - - Returns: - Returns the name of the packet table as a string - """ - date = datetime.datetime.utcfromtimestamp( - packetTimestamp).strftime('%Y%m%d') - packetTable = 'packet' + date - if (not self.dbObjectFinder.checkTableExists(packetTable)): - if(self.createIfMissing): - minTimestamp = packetTimestamp // (24*60*60) * (24*60*60) - maxTimestamp = minTimestamp + (24*60*60) - self._createPacketTable( - packetTable, minTimestamp, maxTimestamp) - self.dbObjectFinder.setTableExists(packetTable) - else: - raise TrackDirectMissingTableError( - 'Database table ' + packetTable + ' does not exists') - return packetTable - - def getPacketTables(self, startTimestamp, endTimestamp=None): - """Returns an array of packet table names based on the specified timestamp range - - Note: - If table does not exist we will not include the packet table name in array - - Args: - startTimestamp (int): Start unix timestamp for requested packet tables - endTimestamp (int): End unix timestamp for requested packet tables - - Returns: - Array of packet table names - """ - if (endTimestamp is None): - endTimestamp = int(time.time()) - - # We allways want to include - endDateTime = datetime.datetime.utcfromtimestamp(int(endTimestamp)) - endDateTime = endDateTime.replace( - hour=0, minute=0, second=0, microsecond=0) + datetime.timedelta(days=1) - endTimestamp = calendar.timegm(endDateTime.timetuple()) - - result = [] - if (startTimestamp == 0): - # Go back 1 year - ts = int(time.time()) - (60*60*24*366) - else: - ts = startTimestamp - while (ts < endTimestamp): - date = datetime.datetime.utcfromtimestamp( - int(ts)).strftime('%Y%m%d') - datePacketTable = 'packet' + date - if (self.dbObjectFinder.checkTableExists(datePacketTable)): - result.append(datePacketTable) - - ts = ts + 86400 # 1 day in seconds - return result - - def _createPacketTable(self, tablename, minTimestamp, maxTimestamp): - """Create a packet table with the specified name - - Args: - tablename (str): Name of the packet table to create - minTimestamp (int): Min Unix timestamp for this table - maxTimestamp (int): Max Unix timestamp for this table - """ - try: - cur = self.db.cursor() - sql = """ - create table %s () inherits (packet)""" % (tablename) - cur.execute(sql) - - sql = """alter table %s add constraint timestamp_range_check check(timestamp >= %d and timestamp < %d)""" % (tablename, minTimestamp, maxTimestamp) - cur.execute(sql) - - # The regular primary key index - sql = """create index %s_pkey on %s using btree (id)""" % ( - tablename, tablename) - cur.execute(sql) - - # This index is magic for multiple methods in PacketRepository - sql = """create index %s_station_id_idx on %s(station_id, map_id, marker_id, timestamp)""" % ( - tablename, tablename) - cur.execute(sql) - - # This should be good when using the time-travel functionality - sql = """create index %s_map_sector_idx on %s(map_sector, timestamp, map_id)""" % ( - tablename, tablename) - cur.execute(sql) - - # Used by remover - sql = """create index %s_sender_id_idx on %s(sender_id)""" % ( - tablename, tablename) - cur.execute(sql) - - cur.close() - - except (psycopg2.IntegrityError, psycopg2.ProgrammingError) as e: - # Probably the other collector created the table at the same time (might happen when you run multiple collectors), just go on... - if ('already exists' not in str(e)): - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return - - except Exception as e: - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return diff --git a/server/trackdirect/database/PacketTelemetryTableCreator.py b/server/trackdirect/database/PacketTelemetryTableCreator.py deleted file mode 100644 index 54967a016e4859b5f93116eb3e7b8d1233ff9be8..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/PacketTelemetryTableCreator.py +++ /dev/null @@ -1,124 +0,0 @@ -import logging -from twisted.python import log -import psycopg2 -import psycopg2.extras -import datetime -import time -import calendar - -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketTelemetryTableCreator(): - """The PacketTelemetryTableCreator class handles packet telemetry table name logic - - Note: - Packets are stored in different tables depending on what day they are received, - new packet tables are created by this class. - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.dbObjectFinder = DatabaseObjectFinder(db) - self.logger = logging.getLogger('trackdirect') - self.createIfMissing = True - - def disableCreateIfMissing(self): - """Disable feature that creates new tables if missing - """ - self.createIfMissing = False - - def getPacketTelemetryTable(self, packetTimestamp): - """Returns the name of the telemetry packet table - - Args: - packetTimestamp (int): Unix timestamp that we need the table for - - Returns: - Returns the name of the telemetry packet table as a string - """ - date = datetime.datetime.utcfromtimestamp( - packetTimestamp).strftime('%Y%m%d') - packetTelemetryTable = 'packet' + date + '_telemetry' - if (not self.dbObjectFinder.checkTableExists(packetTelemetryTable)): - if(self.createIfMissing): - minTimestamp = packetTimestamp // (24*60*60) * (24*60*60) - maxTimestamp = minTimestamp + (24*60*60) - self._createPacketTelemetryTable( - packetTelemetryTable, minTimestamp, maxTimestamp) - self.dbObjectFinder.setTableExists(packetTelemetryTable) - else: - raise TrackDirectMissingTableError( - 'Database table does not exists') - return packetTelemetryTable - - def _createPacketTelemetryTable(self, tablename, minTimestamp, maxTimestamp): - """Create a packet telemetry table with the specified name - - Args: - tablename (str): Name of the packet telemetry table to create - packetTablename (str): Name of the related packet table - minTimestamp (int): Min Unix timestamp for this table - maxTimestamp (int): Max Unix timestamp for this table - """ - try: - # Note that we have no reference constraint to the packet table (we might keep rows in this table longer than rows in packet table) - cur = self.db.cursor() - sql = """ - create table %s () inherits (packet_telemetry)""" % (tablename) - cur.execute(sql) - - sql = """alter table %s add constraint timestamp_range_check check(timestamp >= %d and timestamp < %d)""" % (tablename, minTimestamp, maxTimestamp) - cur.execute(sql) - - sql = """create index %s_pkey on %s using btree (id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_packet_id_idx on %s(packet_id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_station_id_idx on %s(station_id, timestamp, seq)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_telemetry_param_id on %s(station_telemetry_param_id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_telemetry_unit_id on %s(station_telemetry_unit_id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_telemetry_eqns_id on %s(station_telemetry_eqns_id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_telemetry_bits_id on %s(station_telemetry_bits_id)""" % ( - tablename, tablename) - cur.execute(sql) - - cur.close() - - except (psycopg2.IntegrityError, psycopg2.ProgrammingError) as e: - # Probably the other collector created the table at the same time (might happen when you run multiple collectors), just go on... - if ('already exists' not in str(e)): - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return - - except Exception as e: - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return diff --git a/server/trackdirect/database/PacketWeatherTableCreator.py b/server/trackdirect/database/PacketWeatherTableCreator.py deleted file mode 100644 index f2ced64e7c5ac3d5993831d73718c205cbff0f76..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/PacketWeatherTableCreator.py +++ /dev/null @@ -1,107 +0,0 @@ -import logging -from twisted.python import log -import psycopg2 -import psycopg2.extras -import datetime -import time -import calendar - -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketWeatherTableCreator(): - """The PacketWeatherTableCreator class handles packet weather table name logic - - Note: - Packets are stored in different tables depending on what day they are received, - new packet tables are created by this class. - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.dbObjectFinder = DatabaseObjectFinder(db) - self.logger = logging.getLogger('trackdirect') - self.createIfMissing = True - - def disableCreateIfMissing(self): - """Disable feature that creates new tables if missing - """ - self.createIfMissing = False - - def getPacketWeatherTable(self, packetTimestamp): - """Returns the name of the weather packet table - - Args: - packetTimestamp (int): Unix timestamp that we need the table for - - Returns: - the name of the weather packet table as a string - """ - date = datetime.datetime.utcfromtimestamp( - packetTimestamp).strftime('%Y%m%d') - packetWeatherTable = 'packet' + date + '_weather' - if (not self.dbObjectFinder.checkTableExists(packetWeatherTable)): - if(self.createIfMissing): - minTimestamp = packetTimestamp // (24*60*60) * (24*60*60) - maxTimestamp = minTimestamp + (24*60*60) - self._createPacketWeatherTable( - packetWeatherTable, minTimestamp, maxTimestamp) - self.dbObjectFinder.setTableExists(packetWeatherTable) - else: - raise TrackDirectMissingTableError( - 'Database table does not exists') - return packetWeatherTable - - def _createPacketWeatherTable(self, tablename, minTimestamp, maxTimestamp): - """Create a packet weather table with the specified name - - Args: - tablename (str): Name of the packet weather table to create - minTimestamp (int): Min Unix timestamp for this table - maxTimestamp (int): Max Unix timestamp for this table - """ - try: - # Note that we have no reference constraint to the packet table (we might keep rows in this table longer than rows in packet table) - cur = self.db.cursor() - sql = """ - create table %s () inherits (packet_weather)""" % (tablename) - cur.execute(sql) - - sql = """alter table %s add constraint timestamp_range_check check(timestamp >= %d and timestamp < %d)""" % (tablename, minTimestamp, maxTimestamp) - cur.execute(sql) - - sql = """create index %s_pkey on %s using btree (id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_packet_id_idx on %s(packet_id)""" % ( - tablename, tablename) - cur.execute(sql) - - sql = """create index %s_station_id_idx on %s(station_id, timestamp)""" % ( - tablename, tablename) - cur.execute(sql) - - cur.close() - - except (psycopg2.IntegrityError, psycopg2.ProgrammingError) as e: - # Probably the other collector created the table at the same time (might happen when you run multiple collectors), just go on... - if ('already exists' not in str(e)): - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return - - except Exception as e: - self.logger.error(e, exc_info=1) - - # Do some sleep and let the other process create all related tables (if other table failes we will do it after sleep) - time.sleep(10) - return diff --git a/server/trackdirect/database/__init__.py b/server/trackdirect/database/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/database/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/exceptions/TrackDirectGenericError.py b/server/trackdirect/exceptions/TrackDirectGenericError.py deleted file mode 100644 index 1ea03e41d393a484fb4657504548703632bb2b62..0000000000000000000000000000000000000000 --- a/server/trackdirect/exceptions/TrackDirectGenericError.py +++ /dev/null @@ -1,12 +0,0 @@ -class TrackDirectGenericError(Exception): - """ Base exception class for the library. Logs information via logging module - """ - - def __init__(self, message): - """The __init__ method. - - Args: - message (str): Exception message - """ - super(TrackDirectGenericError, self).__init__(message) - self.message = message diff --git a/server/trackdirect/exceptions/TrackDirectMissingSenderError.py b/server/trackdirect/exceptions/TrackDirectMissingSenderError.py deleted file mode 100644 index 1f70550ebe8ec7dfdb303e8701e6360e8143ae6e..0000000000000000000000000000000000000000 --- a/server/trackdirect/exceptions/TrackDirectMissingSenderError.py +++ /dev/null @@ -1,16 +0,0 @@ -from trackdirect.exceptions.TrackDirectGenericError import TrackDirectGenericError - - -class TrackDirectMissingSenderError(TrackDirectGenericError): - """Raised when unexpected format of a supported packet format is encountered - """ - - def __init__(self, message, data={}): - """The __init__ method. - - Args: - message (str): Exception message - data (dict): Packet data that caused parse error - """ - super(TrackDirectMissingSenderError, self).__init__(message) - self.packet = data diff --git a/server/trackdirect/exceptions/TrackDirectMissingStationError.py b/server/trackdirect/exceptions/TrackDirectMissingStationError.py deleted file mode 100644 index 425593176149f095f3352da128930027684f3e08..0000000000000000000000000000000000000000 --- a/server/trackdirect/exceptions/TrackDirectMissingStationError.py +++ /dev/null @@ -1,16 +0,0 @@ -from trackdirect.exceptions.TrackDirectGenericError import TrackDirectGenericError - - -class TrackDirectMissingStationError(TrackDirectGenericError): - """Raised when unexpected format of a supported packet format is encountered - """ - - def __init__(self, message, data={}): - """The __init__ method. - - Args: - message (str): Exception message - data (dict): Packet data that caused parse error - """ - super(TrackDirectMissingStationError, self).__init__(message) - self.packet = data diff --git a/server/trackdirect/exceptions/TrackDirectMissingTableError.py b/server/trackdirect/exceptions/TrackDirectMissingTableError.py deleted file mode 100644 index 454d90ad36a87a05423ab3e2de036f2cb27ea155..0000000000000000000000000000000000000000 --- a/server/trackdirect/exceptions/TrackDirectMissingTableError.py +++ /dev/null @@ -1,16 +0,0 @@ -from trackdirect.exceptions.TrackDirectGenericError import TrackDirectGenericError - - -class TrackDirectMissingTableError(TrackDirectGenericError): - """Raised when unexpected format of a supported packet format is encountered - """ - - def __init__(self, message, data={}): - """The __init__ method. - - Args: - message (str): Exception message - data (dict): Packet data that caused parse error - """ - super(TrackDirectMissingTableError, self).__init__(message) - self.packet = data diff --git a/server/trackdirect/exceptions/TrackDirectParseError.py b/server/trackdirect/exceptions/TrackDirectParseError.py deleted file mode 100644 index 74587d7228952fc4c1f6b4b83801ebded7911580..0000000000000000000000000000000000000000 --- a/server/trackdirect/exceptions/TrackDirectParseError.py +++ /dev/null @@ -1,16 +0,0 @@ -from trackdirect.exceptions.TrackDirectGenericError import TrackDirectGenericError - - -class TrackDirectParseError(TrackDirectGenericError): - """Raised when unexpected format of a supported packet format is encountered - """ - - def __init__(self, message, data={}): - """The __init__ method. - - Args: - message (str): Exception message - data (dict): Packet data that caused parse error - """ - super(TrackDirectParseError, self).__init__(message) - self.packet = data diff --git a/server/trackdirect/exceptions/__init__.py b/server/trackdirect/exceptions/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/exceptions/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/objects/Marker.py b/server/trackdirect/objects/Marker.py deleted file mode 100644 index 2db8363e610ef9df0d111c7bbf14652218212913..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/Marker.py +++ /dev/null @@ -1,50 +0,0 @@ -from trackdirect.common.Model import Model - - -class Marker(Model): - """Marker represents the marker that each visible packet has, two packet with the same marker id will be connected on map - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - cursor = self.db.cursor() - cursor.execute("""select nextval('marker_seq')""") - self.id = cursor.fetchone()[0] - cursor.close() - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Since packet will be updated in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/OgnDevice.py b/server/trackdirect/objects/OgnDevice.py deleted file mode 100644 index 9b813e20c5589fa8f5170d0e2ce1b43fcc73d9ab..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/OgnDevice.py +++ /dev/null @@ -1,66 +0,0 @@ -from trackdirect.common.Model import Model - - -class OgnDevice(Model): - """OgnDevice represents a pre registered device in the ogn ddb - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - - self.deviceType = None - self.deviceId = None - self.aircraftModel = None - self.registration = None - self.cn = None - self.tracked = None - self.identified = None - self.ddbAircraftType = None # Do not confuse with the aircraft type in aprs message - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Returns: - True on success otherwise False - """ - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - return False - - def getDict(self): - """Returns a dict representation of the object - - Returns: - Dict representation of the object - """ - data = {} - - data['device_type'] = self.deviceType - data['device_id'] = self.deviceId - data['aircraft_model'] = self.aircraftModel - data['registration'] = self.registration - data['cn'] = self.cn - data['tracked'] = self.tracked - data['identified'] = self.identified - data['ddb_aircraft_type'] = self.ddbAircraftType - - return data diff --git a/server/trackdirect/objects/OgnHiddenStation.py b/server/trackdirect/objects/OgnHiddenStation.py deleted file mode 100644 index aedaf18960d6a4aaff7944d4472a5df2211a0eed..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/OgnHiddenStation.py +++ /dev/null @@ -1,65 +0,0 @@ - -from trackdirect.common.Model import Model - - -class OgnHiddenStation(Model): - """OgnDevice represents a pre registered device in the ogn ddb - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - - self.id = None - self.hashedName = None - - def getStationName(self): - """Returns the unidentifiable station name used for the current hashed name - - Returns: - string - """ - if (self.isExistingObject()): - return 'UNKNOWN' + str(self.id) - else: - return None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute( - """insert into ogn_hidden_station(hashed_name) values(%s) RETURNING id""", (str( - self.hashedName).strip(),) - ) - self.id = insertCursor.fetchone()[0] - insertCursor.close() - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/Packet.py b/server/trackdirect/objects/Packet.py deleted file mode 100644 index ccacf5b5a97b2c5b2d4b41be52032f006091a05a..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/Packet.py +++ /dev/null @@ -1,359 +0,0 @@ -import logging -import re -from twisted.python import log -import json -import datetime -import time -from math import sin, cos, sqrt, atan2, radians, floor, ceil - -from trackdirect.common.Model import Model -from trackdirect.repositories.StationRepository import StationRepository -from trackdirect.repositories.SenderRepository import SenderRepository -from trackdirect.objects.Station import Station - -from trackdirect.exceptions.TrackDirectMissingSenderError import TrackDirectMissingSenderError -from trackdirect.exceptions.TrackDirectMissingStationError import TrackDirectMissingStationError - - -class Packet(Model): - """Packet represents a APRS packet, AIS packet or any other supported packet - - Note: - Packet corresponds to a row in the packetYYYYMMDD table - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.logger = logging.getLogger('trackdirect') - - self.id = None - self.stationId = None - self.senderId = None - self.packetTypeId = None - self.timestamp = None - self.reportedTimestamp = None - self.positionTimestamp = None # Inherited from prev packet if position was equal - self.latitude = None - self.longitude = None - self.symbol = None - self.symbolTable = None - self.markerId = None - self.markerCounter = None - self.markerPrevPacketTimestamp = None - self.mapId = None - self.sourceId = None - self.mapSector = None - self.relatedMapSectors = [] - self.speed = None - self.course = None - self.altitude = None - self.rng = None - self.phg = None - self.latestRngTimestamp = None - self.latestPhgTimestamp = None - self.comment = None - self.rawPath = None - self.raw = None - - # packet tail timestamp indicates how long time ago we had a tail - self.packetTailTimestamp = None - - # If packet reports a new position for a moving symbol is_moving will be 1 otherwise 0 - # Some times is_moving will be 0 for a moving symbol, but as fast we realize it is moving related packets will have is_moving set to 1 - self.isMoving = 1 - - self.posambiguity = None - - # Following attributes will not allways be loaded from database (comes from related tables) - self.stationIdPath = [] - self.stationNamePath = [] - self.stationLocationPath = [] - - # Will only be used when packet is not inserted to database yet - self.replacePacketId = None - self.replacePacketTimestamp = None - self.abnormalPacketId = None - self.abnormalPacketTimestamp = None - self.confirmPacketId = None - self.confirmPacketTimestamp = None - - # Will only be used when packet is not inserted to database yet - self.ogn = None - self.weather = None - self.telemetry = None - self.stationTelemetryBits = None - self.stationTelemetryEqns = None - self.stationTelemetryParam = None - self.stationTelemetryUnit = None - self.senderName = None - self.stationName = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def update(self): - """Method to call when we want to save changes to database - - Since packet will be updated in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def getDistance(self, p2Lat, p2Lng): - """Get distance in meters between current position and specified position - - Args: - p2Lat (float): Position 2 latitude - p2Lng (float): Position 2 longitude - - Returns: - Distance in meters between the two specified positions (as float) - """ - if (self.latitude is not None - and self.longitude is not None): - p1Lat = self.latitude - p1Lng = self.longitude - R = 6378137 # Earths mean radius in meter - dLat = radians(p2Lat - p1Lat) - dLong = radians(p2Lng - p1Lng) - a = sin(dLat / 2) * sin(dLat / 2) + cos(radians(p1Lat)) * \ - cos(radians(p2Lat)) * sin(dLong / 2) * sin(dLong / 2) - c = 2 * atan2(sqrt(a), sqrt(1 - a)) - d = R * c - return d # returns the distance in meter - else: - return None - - def getCalculatedSpeed(self, prevPacket): - """Get speed compared to previous packet position and timestamp - - Args: - prevPacket (Packet): Previous related packet for the same station - - Returns: - Speed in kmh compared to previous packet position and timestamp (as float) - """ - if (self.latitude is not None - and self.longitude is not None): - distance = self.getDistance( - prevPacket.latitude, prevPacket.longitude) - time = abs(prevPacket.timestamp - self.timestamp) - if (self.reportedTimestamp is not None - and prevPacket.reportedTimestamp is not None - and self.reportedTimestamp != 0 - and prevPacket.reportedTimestamp != 0 - and (self.reportedTimestamp % 60 != 0 or prevPacket.reportedTimestamp % 60 != 0) - and prevPacket.reportedTimestamp != self.reportedTimestamp): - time = abs(prevPacket.reportedTimestamp - - self.reportedTimestamp) - - if (time == 0): - return 0 - return distance / time # meters per second - else: - return None - - def isSymbolEqual(self, comparePacket): - """Returns true if current symbol is equal to symbol in specified packet - - Args: - comparePacket (Packet): Packet to compare current symbol with - - Returns: - True if current symbol is equal to symbol in specified packet - """ - if (self.symbol is not None - and self.symbolTable is not None - and comparePacket.symbol is not None - and comparePacket.symbolTable is not None - and self.symbol == comparePacket.symbol - and self.symbolTable == comparePacket.symbolTable): - return True - else: - return False - - def isPostitionEqual(self, comparePacket): - """Returns true if current position is equal to position in specified packet - - Args: - comparePacket (Packet): Packet to compare current position with - - Returns: - True if current position is equal to position in specified packet - """ - if (comparePacket.latitude is not None - and comparePacket.longitude is not None - and self.longitude is not None - and self.latitude is not None - and round(self.latitude, 5) == round(comparePacket.latitude, 5) - and round(self.longitude, 5) == round(comparePacket.longitude, 5)): - return True - else: - return False - - def getTransmitDistance(self): - """Calculate the transmit distance - - Notes: - require that stationLocationPath is set - - Args: - None - - Returns: - Distance in meters for this transmission - """ - if (self.stationLocationPath is None - or len(self.stationLocationPath) < 1): - return None - - location = self.stationLocationPath[0] - if (location[0] is None - or location[1] is None): - return None - - if (self.latitude is not None - and self.longitude is not None): - - # Current packet contains position, use that - return self.getDistance(location[0], location[1]) - else: - - # Current packet is missing position, use latest station position - stationRepository = StationRepository(self.db) - station = stationRepository.getObjectById(self.stationId) - if (not station.isExistingObject()): - return None - - if (station.latestConfirmedLatitude is not None and station.latestConfirmedLongitude is not None): - curStationLatestLocationPacket = Packet(self.db) - curStationLatestLocationPacket.latitude = station.latestConfirmedLatitude - curStationLatestLocationPacket.longitude = station.latestConfirmedLongitude - return curStationLatestLocationPacket.getDistance(location[0], location[1]) - else: - return None - - def getDict(self, includeStationName=False): - """Returns a dict representation of the object - - Args: - includeStationName (Boolean): Include station name and sender name in dict - - Returns: - Dict representation of the object - """ - data = {} - data['id'] = self.id - - if (self.stationId is not None): - data['station_id'] = int(self.stationId) - else: - data['station_id'] = None - - if (self.senderId is not None): - data['sender_id'] = int(self.senderId) - else: - data['sender_id'] = None - - data['packet_type_id'] = self.packetTypeId - data['timestamp'] = self.timestamp - data['reported_timestamp'] = self.reportedTimestamp - data['position_timestamp'] = self.positionTimestamp - - if (self.latitude is not None and self.longitude is not None): - data['latitude'] = float(self.latitude) - data['longitude'] = float(self.longitude) - else: - data['latitude'] = None - data['longitude'] = None - - data['symbol'] = self.symbol - data['symbol_table'] = self.symbolTable - data['marker_id'] = self.markerId - data['marker_counter'] = self.markerCounter - data['map_id'] = self.mapId - data['source_id'] = self.sourceId - data['map_sector'] = self.mapSector - data['related_map_sectors'] = self.relatedMapSectors - data['speed'] = self.speed - data['course'] = self.course - data['altitude'] = self.altitude - data['rng'] = self.rng - data['phg'] = self.phg - data['latest_phg_timestamp'] = self.latestPhgTimestamp - data['latest_rng_timestamp'] = self.latestRngTimestamp - data['comment'] = self.comment - data['raw_path'] = self.rawPath - data['raw'] = self.raw - data['packet_tail_timestamp'] = self.packetTailTimestamp - data['is_moving'] = self.isMoving - data['posambiguity'] = self.posambiguity - data['db'] = 1 - - if (includeStationName): - try: - stationRepository = StationRepository(self.db) - station = stationRepository.getCachedObjectById( - data['station_id']) - data['station_name'] = station.name - except TrackDirectMissingStationError as e: - data['station_name'] = '' - - try: - senderRepository = SenderRepository(self.db) - sender = senderRepository.getCachedObjectById( - data['sender_id']) - data['sender_name'] = sender.name - except TrackDirectMissingSenderError as e: - data['sender_name'] = '' - - data['station_id_path'] = self.stationIdPath - data['station_name_path'] = self.stationNamePath - data['station_location_path'] = self.stationLocationPath - data['telemetry'] = None - if (self.telemetry is not None): - data['telemetry'] = self.telemetry.getDict() - data['weather'] = None - if (self.weather is not None): - data['weather'] = self.weather.getDict() - data['ogn'] = None - if (self.ogn is not None): - data['ogn'] = self.ogn.getDict() - return data - - def getJson(self): - """Returns a json representation of the object - - Returns: - Json representation of the object (returnes None on failure) - """ - data = self.getDict() - - try: - return json.dumps(data, ensure_ascii=False).encode('utf8') - except (ValueError) as exp: - self.logger.error(e, exc_info=1) - - return None diff --git a/server/trackdirect/objects/PacketOgn.py b/server/trackdirect/objects/PacketOgn.py deleted file mode 100644 index 74adb4aa932fbe243de8b0276f4ee72182ac6902..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/PacketOgn.py +++ /dev/null @@ -1,84 +0,0 @@ -from trackdirect.common.Model import Model - - -class PacketOgn(Model): - """PacketOgn represents the OGN data in a APRS packet - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.packetId = None - self.stationId = None - self.timestamp = None - self.ognSenderAddress = None - self.ognAddressTypeId = None - self.ognAircraftTypeId = None - self.ognClimbRate = None - self.ognTurnRate = None - self.ognSignalToNoiseRatio = None - self.ognBitErrorsCorrected = None - self.ognFrequencyOffset = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (self.stationId <= 0): - return False - - if (self.packetId <= 0): - return False - - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def update(self): - """Method to call when we want to save changes to database - - Since packet will be updated in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def getDict(self): - """Returns the packet OGN as a dict - - Args: - None - - Returns: - A packet OGN dict - """ - data = {} - data['id'] = self.id - data['packet_id'] = self.packetId - data['station_id'] = self.stationId - data['timestamp'] = self.timestamp - data['ogn_sender_address'] = self.ognSenderAddress - data['ogn_address_type_id'] = self.ognAddressTypeId - data['ogn_aircraft_type_id'] = self.ognAircraftTypeId - data['ogn_climb_rate'] = self.ognClimbRate - data['ogn_turn_rate'] = self.ognTurnRate - data['ogn_signal_to_noise_ratio'] = self.ognSignalToNoiseRatio - data['ogn_bit_errors_corrected'] = self.ognBitErrorsCorrected - data['ogn_frequency_offset'] = self.ognFrequencyOffset - return data diff --git a/server/trackdirect/objects/PacketTelemetry.py b/server/trackdirect/objects/PacketTelemetry.py deleted file mode 100644 index ad2d20439e39546d7af3d76e19a00022142607cb..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/PacketTelemetry.py +++ /dev/null @@ -1,105 +0,0 @@ -from trackdirect.common.Model import Model -from trackdirect.database.PacketTelemetryTableCreator import PacketTelemetryTableCreator - - -class PacketTelemetry(Model): - """PacketTelemetry represents the telemetry data in a APRS packet - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.packetId = None - self.stationId = None - self.timestamp = None - self.val1 = None - self.val2 = None - self.val3 = None - self.val4 = None - self.val5 = None - self.bits = None - self.seq = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (self.stationId <= 0): - return False - - if (self.packetId <= 0): - return False - - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def update(self): - """Method to call when we want to save changes to database - - Since packet will be updated in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def isDuplicate(self): - """Method returnes true if a duplicate exists in database - - Returns: - True if a duplicate exists in database otherwise False - """ - packetTelemetryTableCreator = PacketTelemetryTableCreator(self.db) - packetTelemetryTableCreator.disableCreateIfMissing() - packetTelemetryTable = packetTelemetryTableCreator.getPacketTelemetryTable( - self.timestamp) - if (packetTelemetryTable is not None): - - selectCursor = self.db.cursor() - selectCursor.execute("""select * from """ + packetTelemetryTable + - """ where station_id = %s order by timestamp desc limit 1""", (self.stationId,)) - - record = selectCursor.fetchone() - selectCursor.close() - if record is not None and record['seq'] == self.seq: - return True - return False - - def getDict(self): - """Returns a packet telemetry dict - - Args: - None - - Returns: - A packet telemetry dict - """ - data = {} - data['id'] = self.id - data['packet_id'] = self.packetId - data['station_id'] = self.stationId - data['timestamp'] = self.timestamp - data['val1'] = self.val1 - data['val2'] = self.val2 - data['val3'] = self.val3 - data['val4'] = self.val4 - data['val5'] = self.val5 - data['bits'] = self.bits - data['seq'] = self.seq - return data diff --git a/server/trackdirect/objects/PacketWeather.py b/server/trackdirect/objects/PacketWeather.py deleted file mode 100644 index aaef5eb5f0a1ec9287de96719f796ae297db3ad5..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/PacketWeather.py +++ /dev/null @@ -1,92 +0,0 @@ -from trackdirect.common.Model import Model - - -class PacketWeather(Model): - """PacketWeather represents the weather data in a APRS packet - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.packetId = None - self.stationId = None - self.timestamp = None - self.humidity = None - self.pressure = None - self.rain1h = None - self.rain24h = None - self.rainSinceMidnight = None - self.temperature = None - self.windDirection = None - self.windGust = None - self.windSpeed = None - self.luminosity = None - self.snow = None - self.wxRawTimestamp = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (self.stationId <= 0): - return False - - if (self.packetId <= 0): - return False - - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def update(self): - """Method to call when we want to save changes to database - - Since packet will be updated in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False - - def getDict(self): - """Returns the packet weather as a dict - - Args: - None - - Returns: - A packet weather dict - """ - data = {} - data['id'] = self.id - data['packet_id'] = self.packetId - data['station_id'] = self.stationId - data['timestamp'] = self.timestamp - data['humidity'] = self.humidity - data['pressure'] = self.pressure - data['rain_1h'] = self.rain1h - data['rain_24h'] = self.rain24h - data['rain_since_midnight'] = self.rainSinceMidnight - data['temperature'] = self.temperature - data['wind_direction'] = self.windDirection - data['wind_gust'] = self.windGust - data['wind_speed'] = self.windSpeed - data['luminosity'] = self.luminosity - data['snow'] = self.snow - data['wx_raw_timestamp'] = self.wxRawTimestamp - return data diff --git a/server/trackdirect/objects/Sender.py b/server/trackdirect/objects/Sender.py deleted file mode 100644 index 6c926be3a9ced33efa19455778b511bf03eb7add..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/Sender.py +++ /dev/null @@ -1,58 +0,0 @@ -from trackdirect.common.Model import Model - - -class Sender(Model): - """Sender represents the sender of a packet (often same name as station name) - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - - self.id = None - self.name = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (self.name == ''): - return False - - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute( - """insert into sender(name) values(%s) RETURNING id""", (self.name.strip( - ),) - ) - self.id = insertCursor.fetchone()[0] - insertCursor.close() - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Since packet will be updated in batch we never use this method. - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/Station.py b/server/trackdirect/objects/Station.py deleted file mode 100644 index da4e9d8426e544e4d5461163958a9c97727d1b97..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/Station.py +++ /dev/null @@ -1,149 +0,0 @@ -import logging -from trackdirect.common.Model import Model - - -class Station(Model): - """Station represents the object/station that the packet is about - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.logger = logging.getLogger('trackdirect') - - self.id = None - self.name = None - self.latestSenderId = None - self.stationTypeId = 1 # default to 1 - self.sourceId = None - - self.latestPacketId = None - self.latestPacketTimestamp = None - - self.latestLocationPacketId = None - self.latestLocationPacketTimestamp = None - - self.latestWeatherPacketId = None - self.latestWeatherPacketTimestamp = None - - self.latestTelemetryPacketId = None - self.latestTelemetryPacketTimestamp = None - - # Latest packet with a location that is confirmed to be correct - self.latestConfirmedPacketId = None - self.latestConfirmedPacketTimestamp = None - self.latestConfirmedSymbol = None - self.latestConfirmedSymbolTable = None - self.latestConfirmedLatitude = None - self.latestConfirmedLongitude = None - self.latestConfirmedMarkerId = None - - self.latestOgnPacketId = None - self.latestOgnPacketTimestamp = None - self.latestOgnSenderAddress = None - self.latestOgnAircraftTypeId = None - self.latestOgnAddressTypeId = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (self.name == ''): - return False - - return True - - def insert(self): - """Method to call when we want to save a new object to database - - Since packet will be inserted in batch we never use this method. - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute( - """insert into station(name, station_type_id, source_id) values(%s, %s, %s) RETURNING id""", ( - self.name.strip(), self.stationTypeId, self.sourceId) - ) - self.id = insertCursor.fetchone()[0] - insertCursor.close() - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - if (self.isExistingObject()): - cursor = self.db.cursor() - cursor.execute( - """update station set source_id = %s, name = %s, station_type_id = %s where id = %s and source_id is null""", ( - self.sourceId, self.name, self.stationTypeId, self.id) - ) - cursor.close() - return True - else: - return False - - def getShortDict(self): - """Returns a dict representation of the object - - Returns: - Dict representation of the object - """ - data = {} - data['id'] = self.id - - data['name'] = self.name - data['latest_sender_id'] = self.latestSenderId - data['station_type_id'] = self.stationTypeId - data['source_id'] = self.sourceId - - if (self.latestConfirmedPacketId is not None): - data['latest_confirmed_packet_id'] = int( - self.latestConfirmedPacketId) - else: - data['latest_confirmed_packet_id'] = None - - data['latest_confirmed_packet_timestamp'] = self.latestConfirmedPacketTimestamp - data['latest_confirmed_symbol'] = self.latestConfirmedSymbol - data['latest_confirmed_symbol_table'] = self.latestConfirmedSymbolTable - - if (self.latestConfirmedLatitude is not None): - data['latest_confirmed_latitude'] = float( - self.latestConfirmedLatitude) - else: - data['latest_confirmed_latitude'] = None - - if (self.latestConfirmedLongitude is not None): - data['latest_confirmed_longitude'] = float( - self.latestConfirmedLongitude) - else: - data['latest_confirmed_longitude'] = None - - if (self.latestLocationPacketId is not None): - data['latest_location_packet_id'] = self.latestLocationPacketId - else: - data['latest_location_packet_id'] = None - - data['latest_location_packet_timestamp'] = self.latestLocationPacketTimestamp - - if (self.latestPacketId is not None): - data['latest_packet_id'] = int(self.latestPacketId) - else: - data['latest_packet_id'] = None - - data['latest_packet_timestamp'] = self.latestPacketTimestamp - - return data diff --git a/server/trackdirect/objects/StationTelemetryBits.py b/server/trackdirect/objects/StationTelemetryBits.py deleted file mode 100644 index e8e90b0332e3fe5f28c86db261e2644a571d9c1a..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/StationTelemetryBits.py +++ /dev/null @@ -1,100 +0,0 @@ -from trackdirect.common.Model import Model - - -class StationTelemetryBits(Model): - """StationTelemetryBits represents the telemetry bits sent by the related station - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.stationId = None - self.createdTs = None - self.latestTs = None - self.validToTs = None - self.bits = None - self.title = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (type(self.stationId) != int or self.stationId <= 0): - return False - - return True - - def save(self): - """Save object data to database if attribute data is valid - - Returns: - Returns true on success otherwise false - """ - if (self.validate()): - if (self.isExistingObject()): - return self.update() - else: - cursor = self.db.cursor() - cursor.execute("""update station_telemetry_bits - set latest_ts = %s - where station_id = %s - and valid_to_ts is null - and bits = %s - and title = %s""", - (self.createdTs, - self.stationId, - self.bits, - self.title)) - - if (cursor.rowcount == 0): - return self.insert() - else: - # We do not insert it since it was equal to the existsing row - return True - return False - - def insert(self): - """Method to call when we want to save a new object to database - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute("""update station_telemetry_bits - set valid_to_ts = %s - where station_id = %s - and valid_to_ts is null""", - (self.createdTs, - self.stationId)) - - insertCursor.execute("""insert into station_telemetry_bits( - station_id, - created_ts, - latest_ts, - bits, - title) - values (%s, %s, %s, %s, %s)""", - (self.stationId, - self.createdTs, - self.createdTs, - self.bits, - self.title)) - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/StationTelemetryEqns.py b/server/trackdirect/objects/StationTelemetryEqns.py deleted file mode 100644 index 85b07b8b10c1449cea7e89d830375c69c9decfa9..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/StationTelemetryEqns.py +++ /dev/null @@ -1,161 +0,0 @@ -from trackdirect.common.Model import Model - - -class StationTelemetryEqns(Model): - """StationTelemetryEqns represents the telemetry equations sent by the related station - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.stationId = None - self.createdTs = None - self.latestTs = None - self.validToTs = None - self.a1 = None - self.b1 = None - self.c1 = None - self.a2 = None - self.b2 = None - self.c2 = None - self.a3 = None - self.b3 = None - self.c3 = None - self.a4 = None - self.b4 = None - self.c4 = None - self.a5 = None - self.b5 = None - self.c5 = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (type(self.stationId) != int or self.stationId <= 0): - return False - - return True - - def save(self): - """Save object data to database if attribute data is valid - - Returns: - Returns true on success otherwise false - """ - if (self.validate()): - if (self.isExistingObject()): - return self.update() - else: - cursor = self.db.cursor() - cursor.execute("""update station_telemetry_eqns - set latest_ts = %s - where station_id = %s - and valid_to_ts is null - and a1::numeric = %s - and b1::numeric = %s - and c1::numeric = %s - - and a2::numeric = %s - and b2::numeric = %s - and c2::numeric = %s - - and a3::numeric = %s - and b3::numeric = %s - and c3::numeric = %s - - and a4::numeric = %s - and b4::numeric = %s - and c4::numeric = %s - - and a5::numeric = %s - and b5::numeric = %s - and c5::numeric = %s""", - - (self.createdTs, - self.stationId, - self.a1, - self.b1, - self.c1, - - self.a2, - self.b2, - self.c2, - - self.a3, - self.b3, - self.c3, - - self.a4, - self.b4, - self.c4, - - self.a5, - self.b5, - self.c5)) - - if (cursor.rowcount == 0): - return self.insert() - else: - # We do not insert it since it was equal to the existsing row - return True - return False - - def insert(self): - """Method to call when we want to save a new object to database - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute("""update station_telemetry_eqns - set valid_to_ts = %s - where station_id = %s - and valid_to_ts is null""", ( - self.createdTs, - self.stationId)) - - insertCursor.execute("""insert into station_telemetry_eqns(station_id, created_ts, latest_ts, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5) - values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", - (self.stationId, - self.createdTs, - self.timestamp, - - self.a1, - self.b1, - self.c1, - - self.a2, - self.b2, - self.c2, - - self.a3, - self.b3, - self.c3, - - self.a4, - self.b4, - self.c4, - - self.a5, - self.b5, - self.c5)) - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/StationTelemetryParam.py b/server/trackdirect/objects/StationTelemetryParam.py deleted file mode 100644 index 11657f0cc346986de9764949b32b2527b950cc80..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/StationTelemetryParam.py +++ /dev/null @@ -1,139 +0,0 @@ -from trackdirect.common.Model import Model - - -class StationTelemetryParam(Model): - """StationTelemetryParam represents the telemetry parameters sent by the related station - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.stationId = None - self.createdTs = None - self.latestTs = None - self.validToTs = None - self.p1 = None - self.p2 = None - self.p3 = None - self.p4 = None - self.p5 = None - self.b1 = None - self.b2 = None - self.b3 = None - self.b4 = None - self.b5 = None - self.b6 = None - self.b7 = None - self.b8 = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (type(self.stationId) != int or self.stationId <= 0): - return False - - return True - - def save(self): - """Save object data to database if attribute data is valid - - Returns: - Returns true on success otherwise false - """ - if (self.validate()): - if (self.isExistingObject()): - return self.update() - else: - cursor = self.db.cursor() - cursor.execute("""update station_telemetry_param - set latest_ts = %s - where station_id = %s - and valid_to_ts is null - and p1 = %s - and p2 = %s - and p3 = %s - and p4 = %s - and p5 = %s - and b1 = %s - and b2 = %s - and b3 = %s - and b4 = %s - and b5 = %s - and b6 = %s - and b7 = %s - and b8 = %s""", - (self.createdTs, - self.stationId, - self.p1, - self.p2, - self.p3, - self.p4, - self.p5, - self.b1, - self.b2, - self.b3, - self.b4, - self.b5, - self.b6, - self.b7, - self.b8)) - - if (cursor.rowcount == 0): - return self.insert() - else: - # We do not insert it since it was equal to the existsing row - return True - return False - - def insert(self): - """Method to call when we want to save a new object to database - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute("""update station_telemetry_param - set valid_to_ts = %s - where station_id = %s - and valid_to_ts is null""", - (self.createdTs, - self.stationId)) - - insertCursor.execute("""insert into station_telemetry_param(station_id, created_ts, latest_ts, p1, p2, p3, p4, p5, b1, b2, b3, b4, b5, b6, b7, b8) - values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", - (self.stationId, - self.createdTs, - self.createdTs, - self.p1, - self.p2, - self.p3, - self.p4, - self.p5, - self.b1, - self.b2, - self.b3, - self.b4, - self.b5, - self.b6, - self.b7, - self.b8)) - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/StationTelemetryUnit.py b/server/trackdirect/objects/StationTelemetryUnit.py deleted file mode 100644 index 1e9b244b0fcb0301663eddfe53c0050c6f09fd90..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/StationTelemetryUnit.py +++ /dev/null @@ -1,140 +0,0 @@ -from trackdirect.common.Model import Model - - -class StationTelemetryUnit(Model): - """StationTelemetryUnit represents the telemetry UNIT sent by the related station - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - Model.__init__(self, db) - self.id = None - self.stationId = None - self.createdTs = None - self.latestTs = None - self.validToTs = None - self.u1 = None - self.u2 = None - self.u3 = None - self.u4 = None - self.u5 = None - self.l1 = None - self.l2 = None - self.l3 = None - self.l4 = None - self.l5 = None - self.l6 = None - self.l7 = None - self.l8 = None - - def validate(self): - """Returns true on success (when object content is valid), otherwise false - - Returns: - True on success otherwise False - """ - if (type(self.stationId) != int or self.stationId <= 0): - return False - - return True - - def save(self): - """Save object data to database if attribute data is valid - - Returns: - Returns true on success otherwise false - """ - if (self.validate()): - if (self.isExistingObject()): - return self.update() - else: - cursor = self.db.cursor() - cursor.execute("""update station_telemetry_unit - set latest_ts = %s - where station_id = %s - and valid_to_ts is null - and u1 = %s - and u2 = %s - and u3 = %s - and u4 = %s - and u5 = %s - and l1 = %s - and l2 = %s - and l3 = %s - and l4 = %s - and l5 = %s - and l6 = %s - and l7 = %s - and l8 = %s""", - (self.createdTs, - self.stationId, - self.u1, - self.u2, - self.u3, - self.u4, - self.u5, - self.l1, - self.l2, - self.l3, - self.l4, - self.l5, - self.l6, - self.l7, - self.l8)) - - if (cursor.rowcount == 0): - return self.insert() - else: - # We do not insert it since it was equal to the existsing row - return True - return False - - def insert(self): - """Method to call when we want to save a new object to database - - Returns: - True on success otherwise False - """ - if (not self.isExistingObject()): - insertCursor = self.db.cursor() - insertCursor.execute("""update station_telemetry_unit - set valid_to_ts = %s - where station_id = %s - and valid_to_ts is null""", - (self.createdTs, - self.stationId)) - - insertCursor.execute("""insert into station_telemetry_unit(station_id, created_ts, latest_ts, u1, u2, u3, u4, u5, l1, l2, l3, l4, l5, l6, l7, l8) - values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", - (self.stationId, - self.createdTs, - self.createdTs, - self.u1, - self.u2, - self.u3, - self.u4, - self.u5, - self.l1, - self.l2, - self.l3, - self.l4, - self.l5, - self.l6, - self.l7, - self.l8)) - - return True - else: - return False - - def update(self): - """Method to call when we want to save changes to database - - Returns: - True on success otherwise False - """ - return False diff --git a/server/trackdirect/objects/__init__.py b/server/trackdirect/objects/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/objects/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/parser/AprsISConnection.py b/server/trackdirect/parser/AprsISConnection.py deleted file mode 100644 index 3cfad1cd076a1e3380b68c839801422390c02e77..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/AprsISConnection.py +++ /dev/null @@ -1,140 +0,0 @@ -import logging -import aprslib -import collections -import time -import re - - -class AprsISConnection(aprslib.IS): - """Handles communication with the APRS-IS server - """ - - def __init__(self, callsign, passwd="-1", host="rotate.aprs.net", port=10152): - """The __init__ method. - - Args: - callsign (string): APRS-IS callsign - passwd (string): APRS-IS password - host (string): APRS-IS Server hostname - port (int): APRS-IS Server port - """ - aprslib.IS.__init__(self, callsign, passwd, host, port) - - self.logger = logging.getLogger("aprslib.IS") - self.frequencyLimit = None - self.stationHashTimestamps = collections.OrderedDict() - self.sourceId = 1 - - def setFrequencyLimit(self, frequencyLimit): - """Set frequency limit - - Args: - frequencyLimit (int): Hard frequency limit (in seconds) - """ - self.frequencyLimit = frequencyLimit - - def getFrequencyLimit(self): - """Get frequency limit - - Return: - int - """ - return self.frequencyLimit - - def setSourceId(self, sourceId): - """Set what source packet is from (APRS, CWOP ...) - - Args: - sourceId (int): Id that corresponds to id in source-table - """ - self.sourceId = sourceId - - def filteredConsumer(self, callback, blocking=True, raw=False): - """The filtered consume method - - Args: - callback (boolean): Method to call with result - blocking (boolean): Set to true if consume should be blocking - raw (boolean): Set to true if result should be raw - """ - def filterCallback(line): - try: - # decode first then replace - line = line.decode() - line = line.replace('\x00', '') - except UnicodeError as e: - # string is not UTF-8 - return - - if line.startswith('dup'): - line = line[4:].strip() - - if (self._isSendingToFast(line)): - return - - if raw: - callback(line) - else: - callback(self._parse(line)) - - self.consumer(filterCallback, blocking, False, True) - - def _isSendingToFast(self, line): - """Simple check that returns True if sending frequency limit is to fast - - Args: - line (string): Packet string - - Returns: - True if sending frequency limit is to fast - """ - if (self.frequencyLimit is not None): - try: - (name, other) = line.split('>', 1) - except: - return False - - # Divide into body and head - try: - (head, body) = other.split(':', 1) - except: - return False - - if len(body) == 0: - return False - - packetType = body[0] - body = body[1:] - - # Try to find turn rate and reduce frequency limit if high turn rate - frequencyLimitToApply = int(self.frequencyLimit) - if (self.sourceId == 5) : - match = re.search("(\+|\-)(\d\.\d)rot ", line) - try: - turnRate = abs(float(match.group(2))) - if (turnRate > 0) : - frequencyLimitToApply = int(frequencyLimitToApply / (1+turnRate)) - except: - pass - - latestTimestampOnMap = 0 - if (name + packetType in self.stationHashTimestamps): - latestTimestampOnMap = self.stationHashTimestamps[name + packetType] - - if (((int(time.time()) - 1) - frequencyLimitToApply) < latestTimestampOnMap): - # This sender is sending faster than config limit - return True - self.stationHashTimestamps[name + packetType] = int(time.time()) - 1 - self._cacheMaintenance() - return False - - def _cacheMaintenance(self): - """Make sure cache does not contain to many packets - """ - frequencyLimitToApply = int(self.frequencyLimit) - maxNumberOfPackets = frequencyLimitToApply * 1000 # We assume that we never have more than 1000 packets per second - if (len(self.stationHashTimestamps) > maxNumberOfPackets): - try: - self.stationHashTimestamps.popitem(last=False) - except (KeyError, StopIteration) as e: - pass diff --git a/server/trackdirect/parser/AprsPacketParser.py b/server/trackdirect/parser/AprsPacketParser.py deleted file mode 100644 index d8eabb82082cbfbca6f30f84f1d15417d476d5ed..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/AprsPacketParser.py +++ /dev/null @@ -1,629 +0,0 @@ -import logging -from twisted.python import log -import json -import datetime -import time -import calendar -import hashlib - -from trackdirect.exceptions.TrackDirectParseError import TrackDirectParseError -from trackdirect.exceptions.TrackDirectMissingSenderError import TrackDirectMissingSenderError -from trackdirect.exceptions.TrackDirectMissingStationError import TrackDirectMissingStationError - -from trackdirect.repositories.OgnHiddenStationRepository import OgnHiddenStationRepository -from trackdirect.repositories.OgnDeviceRepository import OgnDeviceRepository -from trackdirect.repositories.StationRepository import StationRepository -from trackdirect.repositories.SenderRepository import SenderRepository -from trackdirect.repositories.PacketRepository import PacketRepository -from trackdirect.repositories.PacketTelemetryRepository import PacketTelemetryRepository -from trackdirect.repositories.PacketWeatherRepository import PacketWeatherRepository -from trackdirect.repositories.PacketOgnRepository import PacketOgnRepository -from trackdirect.repositories.MarkerRepository import MarkerRepository -from trackdirect.repositories.StationTelemetryBitsRepository import StationTelemetryBitsRepository -from trackdirect.repositories.StationTelemetryEqnsRepository import StationTelemetryEqnsRepository -from trackdirect.repositories.StationTelemetryParamRepository import StationTelemetryParamRepository -from trackdirect.repositories.StationTelemetryUnitRepository import StationTelemetryUnitRepository - -from trackdirect.objects.Packet import Packet -from trackdirect.objects.Station import Station -from trackdirect.objects.PacketWeather import PacketWeather -from trackdirect.objects.PacketTelemetry import PacketTelemetry -from trackdirect.objects.Marker import Marker -from trackdirect.objects.OgnHiddenStation import OgnHiddenStation -from trackdirect.objects.OgnDevice import OgnDevice - -from trackdirect.parser.policies.AprsPacketTypePolicy import AprsPacketTypePolicy -from trackdirect.parser.policies.PacketAssumedMoveTypePolicy import PacketAssumedMoveTypePolicy -from trackdirect.parser.policies.PacketSpeedComputablePolicy import PacketSpeedComputablePolicy -from trackdirect.parser.policies.PreviousPacketPolicy import PreviousPacketPolicy -from trackdirect.parser.policies.PacketTailPolicy import PacketTailPolicy -from trackdirect.parser.policies.PacketRelatedMapSectorsPolicy import PacketRelatedMapSectorsPolicy -from trackdirect.parser.policies.PacketMapIdPolicy import PacketMapIdPolicy -from trackdirect.parser.policies.PacketPathPolicy import PacketPathPolicy -from trackdirect.parser.policies.MapSectorPolicy import MapSectorPolicy -from trackdirect.parser.policies.PacketCommentPolicy import PacketCommentPolicy -from trackdirect.parser.policies.PacketKillCharPolicy import PacketKillCharPolicy -from trackdirect.parser.policies.StationNameFormatPolicy import StationNameFormatPolicy -from trackdirect.parser.policies.PacketOgnDataPolicy import PacketOgnDataPolicy - - -class AprsPacketParser(): - """AprsPacketParser tackes a aprslib output and converts it to a Trackdirect Packet - """ - - def __init__(self, db, saveOgnStationsWithMissingIdentity): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - saveOgnStationsWithMissingIdentity (boolean): True if we should not ignore stationss with a missing identity - """ - self.db = db - self.saveOgnStationsWithMissingIdentity = saveOgnStationsWithMissingIdentity - self.logger = logging.getLogger('trackdirect') - - self.databaseWriteAccess = True - self.sourceId = 1 - - self.ognDeviceRepository = OgnDeviceRepository(db) - self.ognHiddenStationRepository = OgnHiddenStationRepository(db) - self.stationRepository = StationRepository(db) - self.senderRepository = SenderRepository(db) - self.packetRepository = PacketRepository(db) - self.packetTelemetryRepository = PacketTelemetryRepository(db) - self.packetWeatherRepository = PacketWeatherRepository(db) - self.packetOgnRepository = PacketOgnRepository(db) - self.markerRepository = MarkerRepository(db) - self.stationTelemetryBitsRepository = StationTelemetryBitsRepository(db) - self.stationTelemetryEqnsRepository = StationTelemetryEqnsRepository(db) - self.stationTelemetryParamRepository = StationTelemetryParamRepository(db) - self.stationTelemetryUnitRepository = StationTelemetryUnitRepository(db) - - def setDatabaseWriteAccess(self, databaseWriteAccess): - """Enable or disable database updates - - Args: - databaseWriteAccess (boolean): True if we have database access otherwise false - """ - self.databaseWriteAccess = databaseWriteAccess - - def setSourceId(self, sourceId): - """Set what source packet is from (APRS, CWOP ...) - - Args: - sourceId (int): Id that corresponds to id in source-table - """ - self.sourceId = sourceId - - def getPacket(self, data, timestamp=None, minimal=False): - """Returns the resulting packet - - Args: - data (dict): Raw packet data - timestamp (int): Packet timestamp - minimal (boolean): Set to true to only perform minimal parsing - - Returns: - Packet - """ - self.isHiddenStation = False - self.data = data - self.packet = Packet(self.db) - self.packet.sourceId = self.sourceId - self._parsePacketInitialValues(timestamp) - self._parsePacketReportedTimestamp() - - # Parse OGN stuff before station-id, may result in no station to create - self._parsePacketOgn() - if (self.packet.mapId != 15): - self._parsePacketType() - self._parsePacketSender() - self._parsePacketStationName() - self._parsePacketStationId() - - self._parsePacketRng() - self._parsePacketPhg() - - if (self.packet.stationId is None): - self.packet.mapId = 4 - else: - self._parsePacketComment() - self._parsePacketWeather() - self._parsePacketTelemetryDefinition() - self._parsePacketTelemetry() - self._parsePacketPosition() - self._parsePacketPath() - - if (not minimal): - previousPacketPolicy = PreviousPacketPolicy( - self.packet, self.db) - previousPacket = previousPacketPolicy.getPreviousPacket() - self._parseAssumedMoveTypeId(previousPacket) - self._parsePacketTail(previousPacket) - self._parsePacketMapId(previousPacket) - self._parsePacketPreviousTimestamps(previousPacket) - self._parsePacketPhgRngTimestamps(previousPacket) - self._parsePacketRelatedMapSectors(previousPacket) - - if (self.isHiddenStation): - if (self.packet.ogn is not None): - self.packet.ogn.ognAddressTypeId = None - self.packet.ogn.ognSenderAddress = None - self.packet.comment = None - self.packet.raw = None - return self.packet - - def _parsePacketInitialValues(self, timestamp): - """Set packet initial values - - Args: - timestamp (int): Packet timestamp - """ - self.packet.raw = self.data['raw'].replace('\x00', '') - self.packet.symbol = self.data['symbol'] if ( - 'symbol' in self.data) else None - self.packet.symbolTable = self.data['symbol_table'] if ( - 'symbol_table' in self.data) else None - self.packet.reportedTimestamp = self.data['timestamp'] if ( - 'timestamp' in self.data) else None - self.packet.rawPath = self.data['to'] + ',' + ','.join(self.data['path']) if ( - 'path' in self.data and 'to' in self.data) else None - if (timestamp is not None): - self.packet.timestamp = timestamp - else: - self.packet.timestamp = int(time.time()) - self.packet.positionTimestamp = self.packet.timestamp - self.packet.packetTailTimestamp = 0 - self.packet.posambiguity = self.data['posambiguity'] if ( - 'posambiguity' in self.data) else None - self.packet.speed = self.data['speed'] if ( - 'speed' in self.data) else None - self.packet.course = self.data['course'] if ( - 'course' in self.data) else None - self.packet.altitude = self.data['altitude'] if ( - 'altitude' in self.data) else None - self.packet.mapId = 10 # Default map for a packet without a position - self.packet.markerId = 1 - self.packet.markerCounter = 1 # We allways start at 1 - - def _parsePacketReportedTimestamp(self): - """Set packet reported timestamp - """ - if ('timestamp' in self.data): - reportedTimestampDay = int(datetime.datetime.utcfromtimestamp( - int(self.data['timestamp'])).strftime('%d')) - currentTimestampDay = int(datetime.datetime.utcfromtimestamp( - self.packet.timestamp).strftime('%d')) - if (reportedTimestampDay > currentTimestampDay and self.data['timestamp'] > self.packet.timestamp): - # Day is in the future, the reported timestamp was probably in previous month - - prevMonth = int(datetime.datetime.utcfromtimestamp( - int(self.data['timestamp']) - (reportedTimestampDay+1)*24*60*60).strftime('%m')) - prevMonthYear = int(datetime.datetime.utcfromtimestamp( - int(self.data['timestamp']) - (reportedTimestampDay+1)*24*60*60).strftime('%Y')) - numberOfDaysInMonth = int( - calendar.monthrange(prevMonthYear, prevMonth)[1]) - - self.packet.reportedTimestamp = int( - self.data['timestamp']) - (numberOfDaysInMonth*24*60*60) - else: - self.packet.reportedTimestamp = None - - def _parsePacketRng(self): - """Set packet RNG data - """ - if ('rng' in self.data): - try: - self.packet.rng = float(self.data['rng']) - self.packet.latestRngTimestamp = self.packet.timestamp - if (self.packet.rng <= 0): - self.packet.rng = None - except ValueError: - # Not a float - self.packet.rng = None - - def _parsePacketPhg(self): - """Set packet PHG data - """ - if ('phg' in self.data): - phg = str(self.data['phg'])[0:4] - if (len(phg) == 4 and phg.isdigit()): - self.packet.phg = phg - self.packet.latestPhgTimestamp = self.packet.timestamp - - def _parsePacketSender(self): - """Set sender id and name - """ - stationNameFormatPolicy = StationNameFormatPolicy() - self.packet.senderName = stationNameFormatPolicy.getCorrectFormat( - self.data["from"]) - try: - sender = self.senderRepository.getCachedObjectByName( - self.packet.senderName) - self.packet.senderId = sender.id - except (TrackDirectMissingSenderError) as exp: - if (self.databaseWriteAccess): - sender = self.senderRepository.getObjectByName( - self.packet.senderName, True, self.packet.sourceId) - self.packet.senderId = sender.id - - def _parsePacketStationName(self): - """Set station name - """ - if ("object_name" in self.data - and self.data["object_name"] is not None - and self.data["object_name"] != ''): - self.packet.stationTypeId = 2 - stationNameFormatPolicy = StationNameFormatPolicy() - self.packet.stationName = stationNameFormatPolicy.getCorrectFormat( - self.data["object_name"]) - if (self.packet.stationName is None or self.packet.stationName == ''): - self.packet.stationName = self.packet.senderName - if (self.packet.stationName == self.packet.senderName): - self.packet.stationTypeId = 1 - else: - self.packet.stationTypeId = 1 - self.packet.stationName = self.packet.senderName - - def _parsePacketStationId(self): - """Set station id - """ - if (self.packet.stationName is None): - return - try: - station = self.stationRepository.getCachedObjectByName( - self.packet.stationName, - self.packet.sourceId - ) - self.packet.stationId = station.id - - if (self.packet.stationName != station.name): - # Station lower/upper case is modified - station.name = self.packet.stationName - station.save() - - if (station.stationTypeId != self.packet.stationTypeId and int(self.packet.stationTypeId) == 1): - # Switch to station type 1 - station.stationTypeId = self.packet.stationTypeId - station.save() - - except (TrackDirectMissingStationError) as exp: - if (self.databaseWriteAccess): - station = self.stationRepository.getObjectByName( - self.packet.stationName, - self.packet.sourceId, - self.packet.stationTypeId, - True - ) - self.packet.stationId = station.id - - def _parsePacketComment(self): - """Set packet comment - """ - commentPolicy = PacketCommentPolicy() - self.packet.comment = commentPolicy.getComment( - self.data, self.packet.packetTypeId) - - def _parsePacketOgn(self): - """Set th OGN sender address - """ - ognDataPolicy = PacketOgnDataPolicy( - self.data, self.ognDeviceRepository, self.packet.sourceId) - if (ognDataPolicy.isOgnPositionPacket): - originalRaw = self.packet.raw - - if (not ognDataPolicy.isAllowedToTrack): - self.packet.mapId = 15 - return - - elif (not ognDataPolicy.isAllowedToIdentify): - if (not self.saveOgnStationsWithMissingIdentity) : - self.packet.mapId = 15 - return - self.isHiddenStation = True - self.data["from"] = self._getHiddenStationName() - self.data["object_name"] = None - - self.data['ogn'] = ognDataPolicy.getOgnData() - if (self.data['ogn'] is not None): - self.packet.ogn = self.packetOgnRepository.getObjectFromPacketData( - self.data) - self.packet.ogn.stationId = self.packet.stationId - self.packet.ogn.timestamp = self.packet.timestamp - self.data["comment"] = None - self._modifyOgnSymbol(originalRaw) - - def _modifyOgnSymbol(self, originalRaw): - """Sets a better symbol for an OGN station - - Args: - originalRaw (string): Non modified raw - """ - if ((self.packet.symbol == '\'' and self.packet.symbolTable == '/') or (self.packet.symbol == '^' and self.packet.symbolTable in ['/', '\\']) or (self.packet.symbol == 'g' and self.packet.symbolTable in ['/'])): - ognDevice = None - if (self.packet.ogn is not None and self.packet.ogn.ognSenderAddress is not None): - ognDevice = self.ognDeviceRepository.getObjectByDeviceId( - self.packet.ogn.ognSenderAddress) - - if (ognDevice is not None and ognDevice.isExistingObject() and ognDevice.ddbAircraftType > 0 and ognDevice.ddbAircraftType < 6): - # If another aircraft type exist in device db, use that instead - if (ognDevice.ddbAircraftType == 1): # Gliders/motoGliders - # Glider -> Glider - self.packet.symbol = '^' - self.packet.symbolTable = 'G' - - elif (ognDevice.ddbAircraftType == 2): # Planes - # Powered aircraft -> Propeller aircraft - self.packet.symbol = '^' - self.packet.symbolTable = 'P' - - elif (ognDevice.ddbAircraftType == 3): # Ultralights - # Small plane - self.packet.symbol = '\'' - self.packet.symbolTable = '/' - - elif (ognDevice.ddbAircraftType == 4): # Helicopters - # Helicopter - self.packet.symbol = 'X' - self.packet.symbolTable = '/' - - elif (ognDevice.ddbAircraftType == 5): # Drones/UAV - # UAV -> Drone - self.packet.symbol = '^' - self.packet.symbolTable = 'D' - - elif (self.packet.ogn is not None and self.packet.ogn.ognAircraftTypeId is not None): - if (self.packet.ogn.ognAircraftTypeId == 1): - # Glider -> Glider - self.packet.symbol = '^' - self.packet.symbolTable = 'G' - elif (self.packet.ogn.ognAircraftTypeId == 9): - # Jet aircraft -> Jet - self.packet.symbol = '^' - self.packet.symbolTable = 'J' - elif (self.packet.ogn.ognAircraftTypeId == 8): - # Powered aircraft -> Propeller aircraft - self.packet.symbol = '^' - self.packet.symbolTable = 'P' - elif (self.packet.ogn.ognAircraftTypeId == 13): - # UAV -> Drone - self.packet.symbol = '^' - self.packet.symbolTable = 'D' - elif (self.packet.ogn.ognAircraftTypeId == 7): #paraglider - # map to own symbol 94-76.svg (do not show hangglider symbol 103-1.svg, 'g' = 103) - self.packet.symbol = '^' #94 - self.packet.symbolTable = 'L' #76 - - if ((self.packet.symbol == '\'' and self.packet.symbolTable == '/') or (self.packet.symbol == '^' and self.packet.symbolTable in ['/', '\\'])): - # Current symbol is still "small aircraft" or "large aircraft" - if (originalRaw.startswith('FMT')): - # FMT, Remotely Piloted - self.packet.symbol = '^' - self.packet.symbolTable = 'R' - - def _getHiddenStationName(self): - """Returnes a unidentifiable station name - - Returns: - string - """ - date = datetime.datetime.utcfromtimestamp( - self.packet.timestamp).strftime('%Y%m%d') - dailyStationNameHash = hashlib.sha256( - self.data["from"] + date).hexdigest() - - ognHiddenStation = self.ognHiddenStationRepository.getObjectByHashedName( - dailyStationNameHash, True) - return ognHiddenStation.getStationName() - - def _parsePacketWeather(self): - """Parse weather data - """ - if ("weather" in self.data): - self.packet.weather = self.packetWeatherRepository.getObjectFromPacketData( - self.data) - self.packet.weather.stationId = self.packet.stationId - self.packet.weather.timestamp = self.packet.timestamp - - def _parsePacketTelemetry(self): - """Parse telemetry data - """ - if ("telemetry" in self.data): - self.packet.telemetry = self.packetTelemetryRepository.getObjectFromPacketData( - self.data) - self.packet.telemetry.stationId = self.packet.stationId - self.packet.telemetry.timestamp = self.packet.timestamp - - def _parsePacketTelemetryDefinition(self): - """Parse telemetry definition - """ - if ("tBITS" in self.data): - self.packet.stationTelemetryBits = self.stationTelemetryBitsRepository.getObjectFromPacketData( - self.data) - self.packet.stationTelemetryBits.stationId = self.packet.stationId - self.packet.stationTelemetryBits.timestamp = self.packet.timestamp - - if ("tEQNS" in self.data): - self.packet.stationTelemetryEqns = self.stationTelemetryEqnsRepository.getObjectFromPacketData( - self.data) - self.packet.stationTelemetryEqns.stationId = self.packet.stationId - self.packet.stationTelemetryEqns.timestamp = self.packet.timestamp - - if ("tPARM" in self.data): - self.packet.stationTelemetryParam = self.stationTelemetryParamRepository.getObjectFromPacketData( - self.data) - self.packet.stationTelemetryParam.stationId = self.packet.stationId - self.packet.stationTelemetryParam.timestamp = self.packet.timestamp - - if ("tUNIT" in self.data): - self.packet.stationTelemetryUnit = self.stationTelemetryUnitRepository.getObjectFromPacketData( - self.data) - self.packet.stationTelemetryUnit.stationId = self.packet.stationId - self.packet.stationTelemetryUnit.timestamp = self.packet.timestamp - - def _parsePacketType(self): - """Set packet type - """ - aprsPacketTypePolicy = AprsPacketTypePolicy() - self.packet.packetTypeId = aprsPacketTypePolicy.getPacketType( - self.packet) - - def _parsePacketPosition(self): - """Parse the packet position and related attributes - """ - if ("latitude" in self.data - and "longitude" in self.data - and self.data["latitude"] is not None - and self.data["longitude"] is not None): - - self.packet.latitude = self.data['latitude'] - self.packet.longitude = self.data['longitude'] - - mapSectorPolicy = MapSectorPolicy() - self.packet.mapSector = mapSectorPolicy.getMapSector( - self.data["latitude"], self.data["longitude"]) - self.packet.mapId = 1 # Default map for a packet with a position - self.packet.isMoving = 1 # Moving/Stationary, default value is moving - - def _parsePacketPath(self): - """Parse packet path - """ - if ("path" in self.data and isinstance(self.data["path"], list)): - packetPathPolicy = PacketPathPolicy( - self.data['path'], self.packet.sourceId, self.stationRepository, self.senderRepository) - self.packet.stationIdPath = packetPathPolicy.getStationIdPath() - self.packet.stationNamePath = packetPathPolicy.getStationNamePath() - self.packet.stationLocationPath = packetPathPolicy.getStationLocationPath() - - def _getPacketRawBody(self): - """Returns packet raw body as string - - Returns: - Packet raw body as string - """ - try: - (rawHeader, rawBody) = self.data["raw"].split(':', 1) - except: - raise TrackDirectParseError( - 'Could not split packet into header and body', self.data) - - if len(rawBody) == 0: - raise TrackDirectParseError('Packet body is empty', self.data) - return rawBody - - def _parsePacketPhgRngTimestamps(self, previousPacket): - """Set current packet timestamp when latest rng / phg was received - - Args: - previousPacket (Packet): Packet object that represents the packet before the current packet - """ - if (previousPacket.isExistingObject() - and self.packet.isPostitionEqual(previousPacket)): - if (self.packet.phg is None - and previousPacket.latestPhgTimestamp is not None - and previousPacket.latestPhgTimestamp > (self.packet.timestamp - (60*60*24))): - self.latestPhgTimestamp = previousPacket.latestPhgTimestamp - - if (self.packet.rng is None - and previousPacket.latestRngTimestamp is not None - and previousPacket.latestRngTimestamp > (self.packet.timestamp - (60*60*24))): - self.latestRngTimestamp = previousPacket.latestRngTimestamp - - def _parsePacketMapId(self, previousPacket): - """Set current packet map id and related - - Args: - previousPacket (Packet): Packet object that represents the packet before the current packet - """ - mapIdPolicy = PacketMapIdPolicy(self.packet, previousPacket) - killCharPolicy = PacketKillCharPolicy() - if (killCharPolicy.hasKillCharacter(self.data)): - mapIdPolicy.enableHavingKillCharacter() - - if (mapIdPolicy.isReplacingPreviousPacket()): - self.packet.replacePacketId = previousPacket.id - self.packet.replacePacketTimestamp = previousPacket.timestamp - - if (mapIdPolicy.isConfirmingPreviousPacket()): - self.packet.confirmPacketId = previousPacket.id - self.packet.confirmPacketTimestamp = previousPacket.timestamp - - if (mapIdPolicy.isKillingPreviousPacket()): - self.packet.abnormalPacketId = previousPacket.id - self.packet.abnormalPacketTimestamp = previousPacket.timestamp - - self.packet.mapId = mapIdPolicy.getMapId() - self.packet.markerId = mapIdPolicy.getMarkerId() - if (self.packet.markerId is None): - # Policy could not find a marker id to use, create a new - self.packet.markerId = self._getNewMarkerId() - if (self.packet.markerId == 1): - self.packet.mapId = 4 - - def _parsePacketPreviousTimestamps(self, previousPacket): - """Set packet previous timestamps and related - - Args: - previousPacket (Packet): Packet object that represents the packet before the current packet - """ - if (previousPacket.isExistingObject() - and self.packet.markerId == previousPacket.markerId): - isPostitionEqual = self.packet.isPostitionEqual(previousPacket) - if (not self.databaseWriteAccess - and isPostitionEqual - and self.packet.isMoving == 1 - and previousPacket.positionTimestamp == previousPacket.timestamp): - # This is probably the exact same packet - self.packet.markerPrevPacketTimestamp = previousPacket.markerPrevPacketTimestamp - self.packet.markerCounter = previousPacket.markerCounter - self.packet.positionTimestamp = self.packet.timestamp - else: - self.packet.markerPrevPacketTimestamp = previousPacket.timestamp - self.packet.markerCounter = previousPacket.markerCounter + 1 - if (isPostitionEqual): - self.packet.positionTimestamp = previousPacket.positionTimestamp - else: - self.packet.positionTimestamp = self.packet.timestamp - - def _parseAssumedMoveTypeId(self, previousPacket): - """Set current packet move type id - - Args: - previousPacket (Packet): Packet object that represents the packet before the current packet - """ - packetAssumedMoveTypePolicy = PacketAssumedMoveTypePolicy(self.db) - self.packet.isMoving = packetAssumedMoveTypePolicy.getAssumedMoveType(self.packet, previousPacket) - - def _parsePacketTail(self, previousPacket): - """Set current packet tail timestamp - - Args: - previousPacket (Packet): Packet object that represents the packet before the current packet - """ - packetTailPolicy = PacketTailPolicy(self.packet, previousPacket) - self.packet.packetTailTimestamp = packetTailPolicy.getPacketTailTimestamp() - - def _parsePacketRelatedMapSectors(self, previousPacket): - """Set current packet related map sectors - - Args: - previousPacket (Packet): Packet object that represents the packet before the current packet - """ - packetRelatedMapSectorsPolicy = PacketRelatedMapSectorsPolicy( - self.packetRepository) - self.packet.relatedMapSectors = packetRelatedMapSectorsPolicy.getAllRelatedMapSectors( - self.packet, previousPacket) - - def _getNewMarkerId(self): - """Creates a new marker id - - Returns: - int - """ - if (not self.databaseWriteAccess): - return 1 - else: - # No suitable marker id found, let's create a new! - marker = self.markerRepository.create() - marker.save() - return marker.id diff --git a/server/trackdirect/parser/__init__.py b/server/trackdirect/parser/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/parser/policies/AprsPacketSymbolPolicy.py b/server/trackdirect/parser/policies/AprsPacketSymbolPolicy.py deleted file mode 100644 index 20e39008c884c0980276040c4787e152fe8968ce..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/AprsPacketSymbolPolicy.py +++ /dev/null @@ -1,410 +0,0 @@ -class AprsPacketSymbolPolicy(): - """The AprsPacketSymbolPolicy class can answer APRS symbol related questions for a specified packet symbol characters. - """ - - def __init__(self): - """The __init__ method. - """ - self.primarySymbolMoving = [] - self.primarySymbolStationary = [] - self.primarySymbolMaybeMoving = [] - - self.alternativeSymbolMoving = [] - self.alternativeSymbolStationary = [] - self.alternativeSymbolMaybeMoving = [] - - self.primarySymbolWeather = [] - self.alternativeSymbolWeather = [] - - self._initSymbolArrays() - - def isMovingSymbol(self, symbol, symbolTable): - """Returns true is symbol indicates that station is of moving type - - Args: - symbol (string): The symbol character - symbolTable (string): The symbol table character - - Returns: - Boolean - """ - if (symbolTable == "/"): - # Primary symbol - if (symbol in self.primarySymbolMoving): - return True - else: - # Alternative Symbol - if (symbol in self.alternativeSymbolMoving): - return True - return False - - def isMaybeMovingSymbol(self, symbol, symbolTable): - """Returns true is symbol indicates that station maybe is moving - - Note: - "maybe moving" means that station should be treated as it's stationary, but you should allways be ready to change your mind and treat it as moving. - - Args: - symbol (string): The symbol character - symbolTable (string): The symbol table character - - Returns: - Boolean - """ - if (symbolTable == "/"): - # Primary symbol - if (symbol in self.primarySymbolMaybeMoving): - return True - else: - # Alternative Symbol - if (symbol in self.alternativeSymbolMaybeMoving): - return True - return False - - def isStationarySymbol(self, symbol, symbolTable): - """Returns true is symbol indicates that station seems to be stationary - - Args: - symbol (string): The symbol character - symbolTable (string): The symbol table character - - Returns: - Boolean - """ - if (symbolTable == "/"): - # Primary symbol - if (symbol in self.primarySymbolStationary): - return True - else: - # Alternative Symbol - if (symbol in self.alternativeSymbolStationary): - return True - return False - - def isWeatherSymbol(self, symbol, symbolTable): - """Returns true is symbol seems to be a weather station symbol - - Args: - symbol (string): The symbol character - symbolTable (string): The symbol table character - - Returns: - Boolean - """ - if (symbolTable == "/"): - # Primary symbol - if (symbol in self.primarySymbolWeather): - return True - else: - # Alternative Symbol - if (symbol in self.alternativeSymbolWeather): - return True - return False - - def _initSymbolArrays(self): - """Init the symbol arrays - """ - # If we are not sure if it is moving or not we should set it to maybe moving - # A station marked as stationary will not get a tail on map (it will get a new marker Id for each new position), until a certain limit - self.primarySymbolStationary.append('!') # BB Police, Sheriff - self.primarySymbolStationary.append('"') # BC reserved (was rain) - self.primarySymbolStationary.append('#') # BD DIGI (white center) - self.primarySymbolMaybeMoving.append('$') # BE PHONE - self.primarySymbolStationary.append('%') # BF DX CLUSTER - self.primarySymbolStationary.append('&') # BG HF GATEway - self.primarySymbolMaybeMoving.append( - '\'') # BH Small AIRCRAFT (SSID-11) - self.primarySymbolMoving.append('(') # BI Mobile Satellite Station - self.primarySymbolMaybeMoving.append( - ')') # BJ Wheelchair (handicapped) - self.primarySymbolMoving.append('*') # BK SnowMobile - self.primarySymbolStationary.append('+') # BL Red Cross - self.primarySymbolStationary.append(',') # BM Boy Scouts - self.primarySymbolStationary.append('-') # BN House QTH (VHF) - self.primarySymbolStationary.append('.') # BO X - self.primarySymbolMaybeMoving.append('/') # BP Red Dot - self.primarySymbolMaybeMoving.append('0') # P0 # circle (obsolete) - self.primarySymbolMaybeMoving.append( - '1') # P1 TBD (these were numbered) - self.primarySymbolMaybeMoving.append( - '2') # P2 TBD (circles like pool) - self.primarySymbolMaybeMoving.append('3') # P3 TBD (balls. But with) - self.primarySymbolMaybeMoving.append('4') # P4 TBD (overlays, we can) - self.primarySymbolMaybeMoving.append( - '5') # P5 TBD (put all #'s on one) - self.primarySymbolMaybeMoving.append( - '6') # P6 TBD (So 1-9 are available) - self.primarySymbolMaybeMoving.append('7') # P7 TBD (for new uses?) - self.primarySymbolMaybeMoving.append( - '8') # P8 TBD (They are often used) - self.primarySymbolMaybeMoving.append( - '9') # P9 TBD (as mobiles at events) - self.primarySymbolStationary.append(':') # MR FIRE - self.primarySymbolMaybeMoving.append( - ';') # MS Campground (Portable ops) - self.primarySymbolMoving.append('<') # MT Motorcycle (SSID-10) - self.primarySymbolMaybeMoving.append('=') # MU RAILROAD ENGINE - self.primarySymbolMoving.append('>') # MV CAR (SSID-9) - self.primarySymbolStationary.append('?') # MW SERVER for Files - self.primarySymbolStationary.append('@') # MX HC FUTURE predict (dot) - self.primarySymbolStationary.append('A') # PA Aid Station - self.primarySymbolStationary.append('B') # PB BBS or PBBS - self.primarySymbolMoving.append('C') # PC Canoe - self.primarySymbolStationary.append('D') # PD - self.primarySymbolStationary.append('E') # PE EYEBALL (Events, etc!) - self.primarySymbolMoving.append('F') # PF Farm Vehicle (tractor) - self.primarySymbolStationary.append('G') # PG Grid Square (6 digit) - self.primarySymbolStationary.append('H') # PH HOTEL (blue bed symbol) - self.primarySymbolStationary.append( - 'I') # PI TcpIp on air network stn - self.primarySymbolStationary.append('J') # PJ - self.primarySymbolStationary.append('K') # PK School - self.primarySymbolMaybeMoving.append('L') # PL PC user (Jan 03) - self.primarySymbolMaybeMoving.append('M') # PM MacAPRS - self.primarySymbolStationary.append('N') # PN NTS Station - self.primarySymbolMoving.append('O') # PO BALLOON (SSID-11) - self.primarySymbolMaybeMoving.append('P') # PP Police - self.primarySymbolStationary.append('Q') # PQ TBD - self.primarySymbolMaybeMoving.append( - 'R') # PR REC. VEHICLE (SSID-13) - self.primarySymbolMaybeMoving.append('S') # PS SHUTTLE - self.primarySymbolStationary.append('T') # PT SSTV - self.primarySymbolMoving.append('U') # PU BUS (SSID-2) - self.primarySymbolStationary.append('V') # PV ATV - self.primarySymbolStationary.append( - 'W') # PW National WX Service Site - self.primarySymbolMaybeMoving.append( - 'X') # PX HELO (SSID-6) - self.primarySymbolMoving.append('Y') # PY YACHT (sail) (SSID-5) - self.primarySymbolMaybeMoving.append('Z') # PZ WinAPRS - self.primarySymbolMoving.append('[') # HS Human/Person (SSID-7) - self.primarySymbolStationary.append('\\') # HT TRIANGLE(DF station) - self.primarySymbolStationary.append( - ']') # HU MAIL/PostOffice(was PBBS) - self.primarySymbolMaybeMoving.append('^') # HV LARGE AIRCRAFT - self.primarySymbolStationary.append('_') # HW WEATHER Station (blue) - self.primarySymbolStationary.append('`') # HX Dish Antenna - self.primarySymbolMaybeMoving.append('a') # LA AMBULANCE (SSID-1) - self.primarySymbolMoving.append('b') # LB BIKE (SSID-4) - self.primarySymbolStationary.append('c') # LC Incident Command Post - self.primarySymbolStationary.append('d') # LD Fire dept - self.primarySymbolMoving.append('e') # LE HORSE (equestrian) - self.primarySymbolMaybeMoving.append('f') # LF FIRE TRUCK (SSID-3) - self.primarySymbolMoving.append('g') # LG Glider - self.primarySymbolStationary.append('h') # LH HOSPITAL - self.primarySymbolStationary.append( - 'i') # LI IOTA (islands on the air) - self.primarySymbolMoving.append('j') # LJ JEEP (SSID-12) - self.primarySymbolMoving.append('k') # LK TRUCK (SSID-14) - self.primarySymbolMaybeMoving.append( - 'l') # LL Laptop (Jan 03) (Feb 07) - self.primarySymbolStationary.append('m') # LM Mic-E Repeater - self.primarySymbolStationary.append('n') # LN Node (black bulls-eye) - self.primarySymbolStationary.append('o') # LO EOC - self.primarySymbolMoving.append('p') # LP ROVER (puppy, or dog) - self.primarySymbolStationary.append( - 'q') # LQ GRID SQ shown above 128 m - self.primarySymbolStationary.append( - 'r') # LR Repeater (Feb 07) - self.primarySymbolMoving.append('s') # LS SHIP (pwr boat) (SSID-8) - self.primarySymbolStationary.append('t') # LT TRUCK STOP - self.primarySymbolMoving.append('u') # LU TRUCK (18 wheeler) - self.primarySymbolMoving.append('v') # LV VAN (SSID-15) - self.primarySymbolStationary.append('w') # LW WATER station - self.primarySymbolStationary.append('x') # LX xAPRS (Unix) - self.primarySymbolStationary.append('y') # LY YAGI @ QTH - self.primarySymbolStationary.append('z') # LZ TBD - self.primarySymbolStationary.append('{') # J1 - self.primarySymbolStationary.append('|') # J2 TNC Stream Switch - self.primarySymbolStationary.append('}') # J3 - self.primarySymbolStationary.append('~') # J4 TNC Stream Switch - - self.alternativeSymbolStationary.append( - '!') # OBO EMERGENCY (and overlays) - self.alternativeSymbolStationary.append('"') # OC reserved - self.alternativeSymbolStationary.append( - '#') # OD# OVERLAY DIGI (green star) - self.alternativeSymbolStationary.append( - '$') # OEO Bank or ATM (green box) - self.alternativeSymbolStationary.append( - '%') # OFO Power Plant with overlay - self.alternativeSymbolStationary.append( - '&') # OG# I=Igte R=RX T=1hopTX 2=2hopTX - self.alternativeSymbolStationary.append( - '\'') # OHO Crash (& now Incident sites) - self.alternativeSymbolStationary.append( - '(') # OIO CLOUDY (other clouds w ovrly) - # OJO Firenet MEO, MODIS Earth Obs. - self.alternativeSymbolStationary.append(')') - self.alternativeSymbolStationary.append( - '*') # OK AVAIL (SNOW moved to ` ovly S) - self.alternativeSymbolStationary.append('+') # OL Church - self.alternativeSymbolStationary.append(',') # OM Girl Scouts - self.alternativeSymbolStationary.append( - '-') # ONO House (H=HF) (O = Op Present) - self.alternativeSymbolStationary.append( - '.') # OO Ambiguous (Big Question mark) - self.alternativeSymbolStationary.append( - '/') # OP Waypoint Destination - self.alternativeSymbolStationary.append( - '0') # A0# CIRCLE (IRLP/Echolink/WIRES) - self.alternativeSymbolStationary.append('1') # A1 AVAIL - self.alternativeSymbolStationary.append('2') # A2 AVAIL - self.alternativeSymbolStationary.append('3') # A3 AVAIL - self.alternativeSymbolStationary.append('4') # A4 AVAIL - self.alternativeSymbolStationary.append('5') # A5 AVAIL - self.alternativeSymbolStationary.append('6') # A6 AVAIL - self.alternativeSymbolStationary.append('7') # A7 AVAIL - self.alternativeSymbolMaybeMoving.append( - '8') # A8O 802.11 or other network node - self.alternativeSymbolStationary.append( - '9') # A9 Gas Station (blue pump) - self.alternativeSymbolStationary.append( - ':') # NR AVAIL (Hail ==> ` ovly H) - self.alternativeSymbolStationary.append( - ';') # NSO Park/Picnic + overlay events - self.alternativeSymbolStationary.append( - '<') # NTO ADVISORY (one WX flag) - self.alternativeSymbolMaybeMoving.append( - '=') # NUO APRStt Touchtone (DTMF users) - self.alternativeSymbolMoving.append( - '>') # NV# OVERLAYED CARs & Vehicles - self.alternativeSymbolStationary.append( - '?') # NW INFO Kiosk (Blue box with ?) - self.alternativeSymbolStationary.append('@') # NX HURICANE/Trop-Storm - self.alternativeSymbolStationary.append( - 'A') # AA# overlayBOX DTMF & RFID & XO - self.alternativeSymbolStationary.append( - 'B') # AB AVAIL (BlwngSnow ==> E ovly B - self.alternativeSymbolStationary.append('C') # AC Coast Guard - self.alternativeSymbolStationary.append( - 'D') # ADO DEPOTS (Drizzle ==> ' ovly D) - self.alternativeSymbolStationary.append( - 'E') # AE Smoke (& other vis codes) - self.alternativeSymbolStationary.append( - 'F') # AF AVAIL (FrzngRain ==> `F) - self.alternativeSymbolStationary.append( - 'G') # AG AVAIL (Snow Shwr ==> I ovly S) - self.alternativeSymbolStationary.append( - 'H') # AHO \Haze (& Overlay Hazards) - self.alternativeSymbolStationary.append('I') # AI Rain Shower - # AJ AVAIL (Lightening ==> I ovly L) - self.alternativeSymbolStationary.append('J') - self.alternativeSymbolMaybeMoving.append('K') # AK Kenwood HT (W) - self.alternativeSymbolStationary.append('L') # AL Lighthouse - self.alternativeSymbolStationary.append( - 'M') # AMO MARS (A=Army,N=Navy,F=AF) - self.alternativeSymbolStationary.append('N') # AN Navigation Buoy - self.alternativeSymbolMaybeMoving.append( - 'O') # AO Overlay Balloon (Rocket = \O) - # AP Parking [Some cars use this when they stop] - self.alternativeSymbolMaybeMoving.append('P') - self.alternativeSymbolStationary.append('Q') # AQ QUAKE - self.alternativeSymbolStationary.append('R') # ARO Restaurant - self.alternativeSymbolMoving.append('S') # AS Satellite/Pacsat - self.alternativeSymbolStationary.append('T') # AT Thunderstorm - self.alternativeSymbolStationary.append('U') # AU SUNNY - self.alternativeSymbolStationary.append('V') # AV VORTAC Nav Aid - self.alternativeSymbolStationary.append( - 'W') # AW# # NWS site (NWS options) - self.alternativeSymbolStationary.append( - 'X') # AX Pharmacy Rx (Apothicary) - self.alternativeSymbolMaybeMoving.append('Y') # AYO Radios and devices - self.alternativeSymbolStationary.append('Z') # AZ AVAIL - self.alternativeSymbolMaybeMoving.append( - '[') # DSO W.Cloud (& humans w Ovrly) - self.alternativeSymbolMaybeMoving.append( - '\\') # DTO New overlayable GPS symbol - self.alternativeSymbolStationary.append(']') # DU AVAIL - self.alternativeSymbolMaybeMoving.append( - '^') # DV# other Aircraft ovrlys (2014) - self.alternativeSymbolStationary.append( - '_') # DW# # WX site (green digi) - self.alternativeSymbolStationary.append( - '`') # DX Rain (all types w ovrly) - self.alternativeSymbolStationary.append( - 'a') # SA#O ARRL,ARES,WinLINK,Dstar, etc - self.alternativeSymbolStationary.append( - 'b') # SB AVAIL(Blwng Dst/Snd => E ovly) - self.alternativeSymbolStationary.append( - 'c') # SC#O CD triangle RACES/SATERN/etc - self.alternativeSymbolStationary.append('d') # SD DX spot by callsign - self.alternativeSymbolStationary.append( - 'e') # SE Sleet (& future ovrly codes) - self.alternativeSymbolStationary.append('f') # SF Funnel Cloud - self.alternativeSymbolStationary.append('g') # SG Gale Flags - self.alternativeSymbolStationary.append( - 'h') # SHO Store. or HAMFST Hh=HAM store - self.alternativeSymbolStationary.append( - 'i') # SI# BOX or points of Interest - self.alternativeSymbolMaybeMoving.append( - 'j') # SJ WorkZone (Steam Shovel) - # SKO Special Vehicle SUV,ATV,4x4 - self.alternativeSymbolMoving.append('k') - self.alternativeSymbolStationary.append( - 'l') # SL Areas(box,circles,etc) - self.alternativeSymbolStationary.append( - 'm') # SM Value Sign (3 digit display) - self.alternativeSymbolStationary.append('n') # SN# OVERLAY TRIANGLE - self.alternativeSymbolStationary.append('o') # SO small circle - self.alternativeSymbolStationary.append( - 'p') # SP AVAIL (PrtlyCldy => ( ovly P - self.alternativeSymbolStationary.append('q') # SQ AVAIL - self.alternativeSymbolStationary.append('r') # SR Restrooms - self.alternativeSymbolMoving.append('s') # SS# OVERLAY SHIP/boats - self.alternativeSymbolStationary.append('t') # ST Tornado - self.alternativeSymbolMoving.append('u') # SU# OVERLAYED TRUCK - self.alternativeSymbolMoving.append('v') # SV# OVERLAYED Van - self.alternativeSymbolStationary.append( - 'w') # SWO Flooding (Avalanches/Slides) - self.alternativeSymbolStationary.append( - 'x') # SX Wreck or Obstruction ->X<- - self.alternativeSymbolStationary.append('y') # SY Skywarn - self.alternativeSymbolStationary.append('z') # SZ# OVERLAYED Shelter - self.alternativeSymbolStationary.append( - '{') # Q1 AVAIL? (Fog ==> E ovly F) - self.alternativeSymbolStationary.append('|') # Q2 TNC Stream Switch - self.alternativeSymbolStationary.append('}') # Q3 AVAIL? (maybe) - self.alternativeSymbolStationary.append('~') # Q4 TNC Stream Switch - - self.primarySymbolWeather.append('W') # PW National WX Service Site - self.primarySymbolWeather.append('_') # HW WEATHER Station (blue) - - self.alternativeSymbolWeather.append( - '(') # OIO CLOUDY (other clouds w ovrly) - # OK AVAIL (SNOW moved to ` ovly S) - self.alternativeSymbolWeather.append('*') - self.alternativeSymbolWeather.append( - ':') # NR AVAIL (Hail ==> ` ovly H) - self.alternativeSymbolWeather.append('@') # NX HURICANE/Trop-Storm - self.alternativeSymbolWeather.append( - 'B') # AB AVAIL (BlwngSnow ==> E ovly B - # ADO DEPOTS (Drizzle ==> ' ovly D) - self.alternativeSymbolWeather.append('D') - self.alternativeSymbolWeather.append( - 'F') # AF AVAIL (FrzngRain ==> `F) - # AG AVAIL (Snow Shwr ==> I ovly S) - self.alternativeSymbolWeather.append('G') - self.alternativeSymbolWeather.append( - 'H') # AHO \Haze (& Overlay Hazards) - self.alternativeSymbolWeather.append('I') # AI Rain Shower - # AJ AVAIL (Lightening ==> I ovly L) - self.alternativeSymbolWeather.append('J') - self.alternativeSymbolWeather.append('T') # AT Thunderstorm - self.alternativeSymbolWeather.append('U') # AU SUNNY - self.alternativeSymbolWeather.append( - '[') # DSO W.Cloud (& humans w Ovrly) - self.alternativeSymbolWeather.append('_') # DW# # WX site (green digi) - self.alternativeSymbolWeather.append( - '`') # DX Rain (all types w ovrly) - # SB AVAIL(Blwng Dst/Snd => E ovly) - self.alternativeSymbolWeather.append('b') - # SE Sleet (& future ovrly codes) - self.alternativeSymbolWeather.append('e') - self.alternativeSymbolWeather.append('f') # SF Funnel Cloud - # SP AVAIL (PrtlyCldy => ( ovly P - self.alternativeSymbolWeather.append('p') - self.alternativeSymbolWeather.append('t') # ST Tornado - self.alternativeSymbolWeather.append('y') # SY Skywarn - self.alternativeSymbolWeather.append( - '{') # Q1 AVAIL? (Fog ==> E ovly F) diff --git a/server/trackdirect/parser/policies/AprsPacketTypePolicy.py b/server/trackdirect/parser/policies/AprsPacketTypePolicy.py deleted file mode 100644 index 651cae2e5a4397a823df33d76f7da07b278a8695..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/AprsPacketTypePolicy.py +++ /dev/null @@ -1,275 +0,0 @@ -from trackdirect.exceptions.TrackDirectParseError import TrackDirectParseError - - -class AprsPacketTypePolicy(): - """The AprsPacketTypePolicy class can answer questions related to what packet type - """ - - def __init__(self): - """The __init__ method. - """ - self.onlyPositionCharList = [] - self.generalPositionCharList = [] - self.objectCharList = [] - self.itemCharList = [] - self.weatherCharList = [] - self.telemetryCharList = [] - self.messageCharList = [] - self.queryCharList = [] - self.statusCharList = [] - self.otherCharList = [] - self._initPacketTypeArrays() - - def getPacketType(self, packet): - """Returns the packet type id - - Args: - packet (Packet): Packet that we want analyze - - Returns: - Packet type id as integer - """ - if (packet is None): - return 11 - elif (packet.sourceId == 4): - return 12 - else: - packetTypeChar = self._getPacketTypeChar(packet) - - if (self._isPositionPacketType(packetTypeChar)): - return 1 - elif (self._isGeneralPositionPacketType(packetTypeChar)): - if (packet.symbol == "\\" and packet.symbolTable == "/"): - return 2 - elif (packet.symbol == "_"): - return 3 - else: - return 1 - elif (self._isObjectPacketType(packetTypeChar)): - return 4 - elif (self._isItemPacketType(packetTypeChar)): - return 5 - elif (self._isWeatherPacketType(packetTypeChar)): - return 3 - elif (self._isTelemetryPacketType(packetTypeChar)): - return 6 - elif (self._isMessagePacketType(packetTypeChar)): - return 7 - elif (self._isQueryPacketType(packetTypeChar)): - return 8 - elif (self._isStatusPacketType(packetTypeChar)): - return 10 - elif (self._isOtherPacketType(packetTypeChar)): - return 11 - else: - return 11 - - def _isPositionPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type position - - Args: - None - - Returns: - True if the specified packet type character is of type position - """ - if (packetTypeChar in self.onlyPositionCharList): - return True - else: - return False - - def _isGeneralPositionPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type general position - - Args: - None - - Returns: - True if the specified packet type character is of type general position - """ - if (packetTypeChar in self.generalPositionCharList): - return True - else: - return False - - def _isObjectPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type object - - Args: - None - - Returns: - True if the specified packet type character is of type object - """ - if (packetTypeChar in self.objectCharList): - return True - else: - return False - - def _isItemPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type item - - Args: - None - - Returns: - True if the specified packet type character is of type item - """ - if (packetTypeChar in self.itemCharList): - return True - else: - return False - - def _isWeatherPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type weather - - Args: - None - - Returns: - True if the specified packet type character is of type weather - """ - if (packetTypeChar in self.weatherCharList): - return True - else: - return False - - def _isTelemetryPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type telemetry - - Args: - None - - Returns: - True if the specified packet type character is of type telemetry - """ - if (packetTypeChar in self.telemetryCharList): - return True - else: - return False - - def _isMessagePacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type message - - Args: - None - - Returns: - True if the specified packet type character is of type message - """ - if (packetTypeChar in self.messageCharList): - return True - else: - return False - - def _isQueryPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type query - - Args: - None - - Returns: - True if the specified packet type character is of type query - """ - if (packetTypeChar in self.queryCharList): - return True - else: - return False - - def _isStatusPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type status - - Args: - None - - Returns: - True if the specified packet type character is of type status - """ - if (packetTypeChar in self.statusCharList): - return True - else: - return False - - def _isOtherPacketType(self, packetTypeChar): - """Returns true if the specified packet type character is of type other - - Args: - None - - Returns: - True if the specified packet type character is of type other - """ - if (packetTypeChar in self.otherCharList): - return True - else: - return False - - def _initPacketTypeArrays(self): - """Init the packet type arrays - - Args: - None - """ - self.onlyPositionCharList.append("`") # New Mic-E data - self.onlyPositionCharList.append("'") # Old Mic-E data - self.onlyPositionCharList.append("[") # maidenhead locator beacon - self.onlyPositionCharList.append("$") # raw gps - - # Position without timestamp (no APRS messaging), or Ultimeter 2000 WX Station - self.generalPositionCharList.append("!") - # Position without timestamp (with APRS messaging) - self.generalPositionCharList.append("=") - # Position with timestamp (no APRS messaging) - self.generalPositionCharList.append("/") - # Position with timestamp (with APRS messaging) - self.generalPositionCharList.append("@") - - self.objectCharList.append(";") # Object - - self.itemCharList.append(")") # item report - - self.weatherCharList.append("#") # raw weather report - self.weatherCharList.append("*") # complete weather report - self.weatherCharList.append("_") # positionless weather report - - self.telemetryCharList.append("T") # telemetry report" - - self.messageCharList.append(":") # Message - - self.queryCharList.append("?") # general query format - - self.statusCharList.append(">") # Status - - self.otherCharList.append("%") # agrelo - self.otherCharList.append("&") # reserved - self.otherCharList.append("(") # unused - self.otherCharList.append("+") # reserved - self.otherCharList.append(",") # invalid/test format - self.otherCharList.append("-") # unused - self.otherCharList.append(".") # reserved - self.otherCharList.append("<") # station capabilities - self.otherCharList.append("\\") # unused - self.otherCharList.append("]") # unused - self.otherCharList.append("^") # unused - self.otherCharList.append("{") # user defined - self.otherCharList.append("}") # 3rd party traffic - - def _getPacketTypeChar(self, packet): - """Returns the packet type char - - Args: - packet (Packet): Packet object to find type char for - - Returns: - Packet type char - """ - try: - (rawHeader, rawBody) = packet.raw.split(':', 1) - except: - raise TrackDirectParseError( - 'Could not split packet into header and body', packet) - - if len(rawBody) == 0: - raise TrackDirectParseError('Packet body is empty', packet) - - return rawBody[0] diff --git a/server/trackdirect/parser/policies/MapSectorPolicy.py b/server/trackdirect/parser/policies/MapSectorPolicy.py deleted file mode 100644 index 07ef365a7ebcdee9cb4861fdc87dac40489f46b6..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/MapSectorPolicy.py +++ /dev/null @@ -1,78 +0,0 @@ -from math import floor, ceil - - -class MapSectorPolicy(): - """The MapSectorPolicy class hanles logic related to map sectors - """ - - def __init__(self): - """The __init__ method. - """ - - def getMapSector(self, latitude, longitude): - """Returns a map sector integer specified by latitude and longitude - - Args: - latitude (float): Numeric latitude - longitude (float): Numeric longitude - - Returns: - A map sector integer - """ - if (type(latitude) is float and type(longitude) is float): - lat = self.getMapSectorLatRepresentation(latitude) - lng = self.getMapSectorLngRepresentation(longitude) - - # lat interval: 0 - 18000000 - # lng interval: 0 - 00003600 - return lat+lng - else: - return None - - def getMapSectorLatRepresentation(self, latitude): - """Returns the latitude part of a map sector integer - - Args: - latitude (float): Numeric latitude - - Returns: - The latitude part of a map sector integer - """ - lat = int(floor(latitude)) + 90 # Positive representation of lat - latDecimalPart = latitude - floor(latitude) - - if (latDecimalPart < 0.2): - lat = lat * 10 + 0 - elif (latDecimalPart < 0.4): - lat = lat * 10 + 2 - elif (latDecimalPart < 0.6): - lat = lat * 10 + 4 - elif (latDecimalPart < 0.8): - lat = lat * 10 + 6 - else: - lat = lat * 10 + 8 - - lat = lat * 10000 - - # lat interval: 0 - 18000000 - return lat - - def getMapSectorLngRepresentation(self, longitude): - """Returns the longitude part of a map sector integer - - Args: - longitude (float): Numeric latitude - - Returns: - The longitude part of a map sector integer - """ - lng = int(floor(longitude)) + 180 # Positive representation of lng - lngDecimalPart = longitude - floor(longitude) - - if (lngDecimalPart < 0.5): - lng = lng * 10 + 0 - else: - lng = lng * 10 + 5 - - # lng interval: 0 - 00003600 - return lng diff --git a/server/trackdirect/parser/policies/PacketAssumedMoveTypePolicy.py b/server/trackdirect/parser/policies/PacketAssumedMoveTypePolicy.py deleted file mode 100644 index 4ea33a5877772def5f300d6070b9db3556390a53..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketAssumedMoveTypePolicy.py +++ /dev/null @@ -1,174 +0,0 @@ -from trackdirect.parser.policies.AprsPacketSymbolPolicy import AprsPacketSymbolPolicy -from trackdirect.database.PacketTableCreator import PacketTableCreator - - -class PacketAssumedMoveTypePolicy(): - """PacketAssumedMoveTypeIdPolicy calculates a packets default move type - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getAssumedMoveType(self, packet, prevPacket): - """Returns the current packet move type based on if it seems to be moving or not - - Args: - packet (Packet): Packet that we want to know move typ for - prevPacket (Packet): Previous related packet for the same station - - Returns: - Returns the current packet move type id as integer - """ - isMoving = self._getDefaultAssumedMoveType(packet) - if (prevPacket.isExistingObject() - and isMoving == 0 - and not self._isBalloonPredictedTouchdown(packet)): - aprsPacketSymbolPolicy = AprsPacketSymbolPolicy() - - # If assumed stationary we validate this by comparing to previous packet - if (packet.isSymbolEqual(prevPacket) - and (prevPacket.timestamp - prevPacket.positionTimestamp) < 36000 - and prevPacket.isMoving == 1): - # Previous packet has same symbol and is moving - # (If previous was moving so should this) - isMoving = 1 - - elif (aprsPacketSymbolPolicy.isMaybeMovingSymbol(packet.symbol, packet.symbolTable) - and prevPacket.isMoving == 1): - # symbol that maybe is moving is considered moving if prev packet is moving - isMoving = 1 - - elif (packet.isSymbolEqual(prevPacket) - and not packet.isPostitionEqual(prevPacket)): - # Previous packet has same symbol and another position - isMoving = 1 - - elif (not packet.isPostitionEqual(prevPacket)): - # Previous packet has another symbol and another position - # In this case we do a deper investigation... (this is to heavy to do for all packets) - numberOfPackets = self._getNumberOfPacketWithSameSymbolAndOtherPos( - packet, packet.timestamp - 86400 - ) - - if (numberOfPackets > 0): - # We have more then 1 positions for this symbol from this station, assume it is moving - isMoving = 1 - return isMoving - - def _isBalloonPredictedTouchdown(self, packet): - """Returns true if packet probably is a balloon touchdown - - Args: - packet (Packet): Packet that we want to know move typ for - - Returns: - true if packet probably is a balloon touchdown otherwise false - """ - if (packet.symbolTable != "/" and packet.symbol == "o"): - # Symbol is a small circle often used as predicted touchdown - if (packet.comment is not None and "touchdown" in packet.comment): - return True - return False - - def _getDefaultAssumedMoveType(self, packet): - """Returns the default packet move type id - - Args: - packet (Packet): Packet that we want to know move typ for - - Returns: - Returns the default packet move type id as integer - """ - # Default is moving and if we are not sure we should choose moving - isMoving = 1 - if (packet is not None - and packet.symbol is not None - and packet.symbolTable is not None): - # First we set a initial value based on symbol - aprsPacketSymbolPolicy = AprsPacketSymbolPolicy() - if (aprsPacketSymbolPolicy.isStationarySymbol(packet.symbol, packet.symbolTable) - or aprsPacketSymbolPolicy.isMaybeMovingSymbol(packet.symbol, packet.symbolTable)): - isMoving = 0 - if (isMoving == 0 and self._isSsidIndicateMoving(packet.stationName) - and aprsPacketSymbolPolicy.isMaybeMovingSymbol(packet.symbol, packet.symbolTable)): - isMoving = 1 - if (isMoving == 0 - and (packet.course is not None or packet.speed is not None) - and packet.packetTypeId != 3): - # Packet has a speed and a course and is not a weather packet! - # If it looks like a weather station we validate that speed is higher than 0 - if (aprsPacketSymbolPolicy.isMaybeMovingSymbol(packet.symbol, packet.symbolTable)): - isMoving = 1 - elif (self._isSsidIndicateMoving(packet.stationName)): - isMoving = 1 - elif (packet.speed is not None and packet.speed > 0): - # A moving stationary station?! - isMoving = 1 - elif (packet.course is not None and packet.course > 0): - # A moving stationary station?! - isMoving = 1 - return isMoving - - def _isSsidIndicateMoving(self, stationName): - """Returns true if station SSID indicates moving - - Args: - stationName (string): Packet station name - - Returns: - Returns true if station SSID indicates moving otherwise false - """ - if (stationName.endswith('-7')): - # walkie talkies, HT's or other human portable - return True - elif (stationName.endswith('-8')): - # boats, sailboats, RV's or second main mobile - return True - elif (stationName.endswith('-9')): - # Primary Mobile (usually message capable) - return True - elif (stationName.endswith('-11')): - # balloons, aircraft, spacecraft, etc - return True - elif (stationName.endswith('-14')): - # Truckers or generally full time drivers - return True - else: - return False - - def _getNumberOfPacketWithSameSymbolAndOtherPos(self, packet, minTimestamp): - """Returns the number of packets that has the same symbol but another position (for the same station) - - Args: - stationId (int): Id of the station - packet (Packet): Packet instance that we base the search on - - Returns: - The number of packets that has the same symbol but another position - """ - selectCursor = self.db.cursor() - packetTableCreator = PacketTableCreator(self.db) - packetTables = packetTableCreator.getPacketTables(minTimestamp) - result = 0 - for packetTable in packetTables: - sql = selectCursor.mogrify("""select count(*) number_of_packets from """ + packetTable + """ where station_id = %s and map_id = 1 and symbol = %s and symbol_table = %s and latitude != %s and longitude != %s""", ( - packet.stationId, - packet.symbol, - packet.symbolTable, - packet.latitude, - packet.longitude,)) - - selectCursor = self.db.cursor() - selectCursor.execute(sql) - record = selectCursor.fetchone() - - if (record is not None): - result = result + record["number_of_packets"] - - selectCursor.close() - return result diff --git a/server/trackdirect/parser/policies/PacketCommentPolicy.py b/server/trackdirect/parser/policies/PacketCommentPolicy.py deleted file mode 100644 index e2fde323f9ecdcfd9a69a0de5f004582ff6bf543..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketCommentPolicy.py +++ /dev/null @@ -1,135 +0,0 @@ -import re - - -class PacketCommentPolicy(): - """The PacketCommentPolicy class handles logic to format comments - """ - - def __init__(self): - """The __init__ method. - """ - - def getComment(self, data, packetTypeId): - """Returns the packet comment - - Args: - data (dict): Raw packet data - packetTypeId (int): Packet type id - - Returns: - String - """ - comment = None - if (packetTypeId == 7 and "message_text" in data): - # We save messages as a comment (a message packet does not have a comment so this column is free) - comment = data["message_text"] - elif (packetTypeId == 10 and "status" in data): - # We save status as comment (a status message does not have a comment so this column is free) - comment = data["status"] - elif ("comment" in data): - comment = data["comment"] - - if isinstance(comment, bytes): - comment = comment.encode('ascii', 'ignore') - comment = comment.replace('\x00', '') - - return self._formatComment(comment) - - def _formatComment(self, comment): - """Remove junk from comment - - Args: - comment (string): Comment from packet - - Returns: - String - """ - comment = self._lchop(comment, "!=") - comment = self._rchop(comment, "!=") - comment = self._lchop(comment, "]=") - comment = self._rchop(comment, "]=") - comment = self._lchop(comment, ">=") - comment = self._rchop(comment, ">=") - comment = self._lchop(comment, "_%") - comment = self._rchop(comment, "_%") - comment = self._lchop(comment, "_#") - comment = self._rchop(comment, "_#") - comment = self._lchop(comment, "_\"") - comment = self._rchop(comment, "_\"") - comment = self._lchop(comment, "_$") - comment = self._rchop(comment, "_$") - comment = self._lchop(comment, "_)") - comment = self._rchop(comment, "_)") - comment = self._lchop(comment, "_(") - comment = self._rchop(comment, "_(") - comment = self._lchop(comment, "()") - comment = self._rchop(comment, "()") - comment = self._lchop(comment, "^") - comment = self._rchop(comment, "^") - comment = self._lchop(comment, "\\x") - comment = self._rchop(comment, "\\x") - comment = self._lchop(comment, "/") - comment = self._rchop(comment, "/") - comment = self._lchop(comment, "\\!") - comment = self._rchop(comment, "\\!") - comment = self._lchop(comment, "1}") - comment = self._rchop(comment, "1}") - comment = self._lchop(comment, "_1") - comment = self._rchop(comment, "_1") - comment = self._lchop(comment, "\"(}") - comment = self._rchop(comment, "\"(}") - comment = self._rchop(comment, "=") - comment = self._lchop(comment, "]") - comment = self._lchopRegex(comment, "\.\.\.\/\d\d\d") - comment = self._lchopRegex(comment, "\d\d\d\/\d\d\d") - comment = self._lchop(comment, ".../...") - - if (comment is not None and len(comment) <= 1): - # Comments with one letter is probably wrong - comment = None - return comment - - def _rchop(self, string, substr): - """Chops substr from right of string - - Args: - string (str): String to do modification on - substr (str): Substr to look for in string - - Returns: - Updated version of string - """ - if (string is not None and string.endswith(substr)): - return string[:-len(substr)] - return string - - def _lchop(self, string, substr): - """Chops substr from left of string - - Args: - string (str): String to do modification on - substr (str): Substr to look for in string - - Returns: - Updated version of string - """ - if (string is not None and string.startswith(substr)): - return string[len(substr):] - return string - - def _lchopRegex(self, string, substrRegex): - """Chops substr from left of string - - Args: - string (str): String to do modification on - substrRegex (str): Substr to look for in string - - Returns: - Updated version of string - """ - regex = re.compile(substrRegex) - if (string is not None): - m = re.match(regex, string) - if (m): - return string[len(m.group(0)):] - return string diff --git a/server/trackdirect/parser/policies/PacketDuplicatePolicy.py b/server/trackdirect/parser/policies/PacketDuplicatePolicy.py deleted file mode 100644 index 4e3c084e845840423a68130d8712a46f96f3ccdd..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketDuplicatePolicy.py +++ /dev/null @@ -1,139 +0,0 @@ -import logging -from twisted.python import log - -import collections -from trackdirect.exceptions.TrackDirectParseError import TrackDirectParseError - - -class PacketDuplicatePolicy(): - """Handles duplicate checks - """ - - # static class variables - latestPacketsHashOrderedDict = collections.OrderedDict() - - def __init__(self, stationRepository): - """The __init__ method. - """ - self.minutesBackToLookForDuplicates = 30 - self.stationRepository = stationRepository - - self.logger = logging.getLogger('trackdirect') - - def isDuplicate(self, packet): - """Method used to check if this packet is a duplicate - - Args: - packet (Packet): Packet that may be a duplicate - - Returns: - Boolean - """ - if (packet.mapId in [1, 5, 7, 8, 9] - and (packet.isMoving == 1 or packet.mapId == 8) - and packet.latitude is not None - and packet.longitude is not None): - if (self._isPacketBodyInCache(packet)): - # It looks like a duplicate, treat it as one if needed - # (if position is equal to the latest confirmed position it doesn't matter if we treat it as a duplicate or not) - if (self._isToBeTreateAsDuplicate(packet)): - return True - self._addToCache(packet) - - elif (packet.sourceId == 3): - # It is a duplicate (everything from this source is) - return True - - return False - - def _isPacketBodyInCache(self, packet): - """Returns true if packet body is in cache - - Args: - packet (Packet): Packet look for in cashe - - Returns: - Boolean - """ - packetHash = self._getPacketHash(packet) - if (packetHash is None): - return False - - if (packetHash in PacketDuplicatePolicy.latestPacketsHashOrderedDict): - prevPacketValues = PacketDuplicatePolicy.latestPacketsHashOrderedDict[packetHash] - if (packet.rawPath != prevPacketValues['path'] - and prevPacketValues['timestamp'] > packet.timestamp - (60*self.minutesBackToLookForDuplicates)): - return True - return False - - def _isToBeTreateAsDuplicate(self, packet): - """Returns true if packet should be treated as duplicate - - Args: - packet (Packet): Packet to check - - Returns: - Boolean - """ - station = self.stationRepository.getObjectById(packet.stationId) - if (station.latestConfirmedLatitude is not None and station.latestConfirmedLongitude is not None): - stationLatCmp = int(round(station.latestConfirmedLatitude*100000)) - stationLngCmp = int(round(station.latestConfirmedLongitude*100000)) - else: - stationLatCmp = 0 - stationLngCmp = 0 - - packetlatCmp = int(round(packet.latitude*100000)) - packetlngCmp = int(round(packet.longitude*100000)) - - if (station.isExistingObject() - and stationLatCmp != 0 - and stationLngCmp != 0 - and (packet.mapId == 8 or stationLatCmp != packetlatCmp or stationLngCmp != packetlngCmp)): - - # We treat this packet as a duplicate - return True - else: - return False - - def _getPacketHash(self, packet): - """Returns a hash value of the Packet object - - Args: - packet (Packet): Packet to get hash for - - Returns: - A string that contains the hash value - """ - if (packet.raw is None or packet.raw == ''): - return None - - packetString = packet.raw.split(':', 1)[1] - if (packetString == ''): - return None - else: - return hash(packetString.strip()) - - def _addToCache(self, packet): - """Add packet to cache - - Args: - packet (Packet): Packet to add to cache - """ - packetHash = self._getPacketHash(packet) - PacketDuplicatePolicy.latestPacketsHashOrderedDict[packetHash] = { - 'path': packet.rawPath, - 'timestamp': packet.timestamp - } - self._cacheMaintenance() - - def _cacheMaintenance(self): - """Make sure cache does not contain to many packets - """ - maxNumberOfPackets = self.minutesBackToLookForDuplicates * 60 * 100 # We assume that we have an average of 100 packets per second - if (len(PacketDuplicatePolicy.latestPacketsHashOrderedDict) > maxNumberOfPackets): - try: - PacketDuplicatePolicy.latestPacketsHashOrderedDict.popitem( - last=False) - except (KeyError, StopIteration) as e: - pass diff --git a/server/trackdirect/parser/policies/PacketKillCharPolicy.py b/server/trackdirect/parser/policies/PacketKillCharPolicy.py deleted file mode 100644 index 3b03ccfaf601165d69b880c686ea6711c787d911..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketKillCharPolicy.py +++ /dev/null @@ -1,23 +0,0 @@ -class PacketKillCharPolicy(): - """The PacketKillCharPolicy class handles logic related to packet kill character - """ - - def __init__(self): - """The __init__ method. - """ - - def hasKillCharacter(self, data): - """A packet may contain a kill char, if exists the object/item should be hidden on map - - Args: - data (dict): Raw packet data - - Returns: - Boolean - """ - if ("object_name" in data - and data["object_name"] is not None - and data["object_name"] != '' - and data["object_name"].endswith('_')): - return True - return False diff --git a/server/trackdirect/parser/policies/PacketMapIdPolicy.py b/server/trackdirect/parser/policies/PacketMapIdPolicy.py deleted file mode 100644 index 3f87d38aae5b2a03c5604d73243312d70504e421..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketMapIdPolicy.py +++ /dev/null @@ -1,278 +0,0 @@ -from trackdirect.parser.policies.PacketOrderPolicy import PacketOrderPolicy -from trackdirect.parser.policies.PacketMaxSpeedPolicy import PacketMaxSpeedPolicy - - -class PacketMapIdPolicy(): - """PacketMapIdPolicy tries to find the best mapId for the current packet - """ - - def __init__(self, packet, prevPacket): - """The __init__ method. - - Args: - packet (Packet): Packet that we want analyze - """ - self.packet = packet - self.prevPacket = prevPacket - self.hasKillCharacter = False - # Marker will be confirmed when we receive the third packet - self.markerCounterConfirmLimit = 3 - - # Results - self.mapId = None - self.markerId = None - self.isReplacingPrevPacket = False - self.isConfirmingPrevPacket = False - self.isKillingPrevPacket = False - - def enableHavingKillCharacter(self): - """Treat this packet as having a kill character - """ - self.hasKillCharacter = True - - def getMapId(self): - """Returns the map id that corresponds to the found marker id - - Returns: - int - """ - self._findMapId() - return self.mapId - - def getMarkerId(self): - """Returns the found marker id - - Returns: - int - """ - self._findMapId() - return self.markerId - - def isReplacingPreviousPacket(self): - """Returns true if packet replaces previous packet - - Returns: - boolean - """ - self._findMapId() - return self.isReplacingPrevPacket - - def isConfirmingPreviousPacket(self): - """Returns true if packet confirmes previous packet - - Returns: - boolean - """ - self._findMapId() - return self.isConfirmingPrevPacket - - def isKillingPreviousPacket(self): - """Returns true if packet kills previous packet - - Returns: - boolean - """ - self._findMapId() - return self.isKillingPrevPacket - - def _findMapId(self): - """Find a suitable marker id for the current packet and set correponding attribute (and related attributes) - """ - if (self.mapId is None): - packetOrderPolicy = PacketOrderPolicy() - if (self.packet.sourceId == 2 and len(self.packet.stationIdPath) > 0): - # A CWOP-station is allways sending directly - self.mapId = 16 - self.markerId = 1 - elif (not self._isPacketOnMap()): - self.mapId = 10 - self.markerId = 1 - elif (packetOrderPolicy.isPacketInWrongOrder(self.packet, self.prevPacket)): - self.mapId = 6 - self.markerId = 1 - elif (self._isFaultyGpsPosition()): - self._findMapIdForFaultyGpsPosition() - elif (self.packet.isMoving == 1): - self._findMapIdForMovingStation() - else: - self._findMapIdForStationaryStation() - - def _isPacketOnMap(self): - """Returns true if current packet will be on map - - Returns: - boolean - """ - if (self.packet.latitude is not None - and self.packet.longitude is not None - and type(self.packet.latitude) == float - and type(self.packet.longitude) == float - and self.packet.sourceId != 3 - and self.packet.mapId in [1, 5, 7, 9]): - return True - else: - return False - - def _findMapIdForStationaryStation(self): - """Find a suitable marker id for the current packet (assumes it is a stationary station) and set correponding attribute (and related attributes) - """ - if (self.prevPacket.isExistingObject() - and self.packet.isPostitionEqual(self.prevPacket) - and self.packet.isSymbolEqual(self.prevPacket) - and self.packet.isMoving == self.prevPacket.isMoving - and self.prevPacket.mapId in [1, 7]): - # Same position and same symbol - self.mapId = 1 - self.markerId = self.prevPacket.markerId - if (self.hasKillCharacter): - # This station we can actually kill (it's stationary), let the markerId be - self.mapId = 14 - - # Also mark this to replace previous packet - self.isReplacingPrevPacket = True - elif (self.hasKillCharacter): - # We found nothing to kill - self.markerId = 1 - self.mapId = 4 - else: - # Seems to be a new stationary station (or at least a new symbol for an existing station) - self.mapId = 1 - self.markerId = None - - def _findMapIdForMovingStation(self): - """Find a suitable marker id for the current packet (assumes it is a moving station) and set correponding attribute (and related attributes) - """ - if (self.hasKillCharacter): - # Makes no sense in handling kill characters for moving - self.mapId = 4 - self.markerId = 1 - - elif (self.prevPacket.isExistingObject() - and self.prevPacket.isMoving == 1 - and self.prevPacket.mapId in [1, 7]): - calculatedDistance = self.packet.getDistance( - self.prevPacket.latitude, self.prevPacket.longitude) - calculatedSpeed = self.packet.getCalculatedSpeed(self.prevPacket) - packetMaxSpeedPolicy = PacketMaxSpeedPolicy() - maxSpeed = packetMaxSpeedPolicy.getMaxLikelySpeed( - self.packet, self.prevPacket) - # distance is likely if distance is shorter than 50km (map performance is bad with to long polylines) - absoluteMaxDistance = 50000 - # speed may be likely but if it is faster than absoluteMaxSpeed we create a new marker any way - absoluteMaxSpeed = 2000 - - if (self.packet.isPostitionEqual(self.prevPacket)): - # Same position - self._findMapIdForMovingStationWithSamePosition() - - elif (calculatedDistance < 5000 and calculatedSpeed <= absoluteMaxSpeed): - # Distance is very short (shorter than 5km) - self._findMapIdForMovingStationWithLikelySpeed() - - elif (calculatedSpeed <= maxSpeed and calculatedSpeed <= absoluteMaxSpeed and calculatedDistance <= absoluteMaxDistance): - # Speed and distance is likely - self._findMapIdForMovingStationWithLikelySpeed() - - elif (calculatedSpeed <= maxSpeed and calculatedDistance > absoluteMaxDistance): - # Speed is likly but distance is to long or speed is very fast - self._findMapIdForMovingStationWithToLongDistance() - - else: - # No suitable marker id - self.mapId = 7 - self.markerId = None - else: - if (self.prevPacket.isExistingObject() - and self.prevPacket.isMoving == 0 - and self.packet.isSymbolEqual(self.prevPacket)): - # We previously made a mistake, previous packet should have been marked as moving, just mark previous as abnormal (ghost marker) - self.isKillingPrevPacket = True - - # Seems to be a new station - self.mapId = 1 - self.markerId = None - - def _findMapIdForMovingStationWithToLongDistance(self): - """Sets a suitable marker id for the current packet based on prevPacket and assumes that distance is to long between them - """ - if (self.prevPacket.markerCounter == 1): - # Previous packet is not related to any previous and it is not related to this, mark it as abnormal - self.isKillingPrevPacket = True - - # This is kind of a special case, we have no requirements on the previous packet - # Station is either sending few packets or is moving very fast, we accept everything as long as speed is likely - # Create new marker - self.mapId = 1 - self.markerId = None - - def _findMapIdForMovingStationWithLikelySpeed(self): - """Sets a suitable marker id for the current packet based on prevPacket and assumes that speed is likly - """ - self.markerId = self.prevPacket.markerId - if (self.prevPacket.mapId == 1 - or (self.prevPacket.markerCounter + 1) >= self.markerCounterConfirmLimit): - self.mapId = 1 - else: - self.mapId = self.prevPacket.mapId - - if (self.mapId == 1 - and self.prevPacket.mapId == 7): - # To mark a previous packet as confirmed is not important since client should handle it anyway when a connected packet that is confirmed is recived - # But we do it when possible to make things easier for the client (currently we are not doiong it if several previous packets is unconfirmed) - self.isConfirmingPrevPacket = True - - def _findMapIdForMovingStationWithSamePosition(self): - """Sets a suitable marker id for the current packet based on prevPacket and assumes that position is equal - """ - # Also mark this to replace previous packet - # If this packet is converted to a 12 it will be treated as confirmed in history - # (we kind of assumes that markerCounterConfirmLimit == 2, maybe a TODO?) - self.markerId = self.prevPacket.markerId - self.isReplacingPrevPacket = True - if (self.prevPacket.mapId == 1 - or (self.prevPacket.markerCounter + 1) >= self.markerCounterConfirmLimit): - self.mapId = 1 - else: - self.mapId = self.prevPacket.mapId - - def _findMapIdForFaultyGpsPosition(self): - """Sets a suitable marker id for the current packet based on prevPacket and assumes that gps position is faulty (mapId 5) - """ - if (self.hasKillCharacter): - # No point in killing a ghost-marker - self.mapId = 4 - self.markerId = 1 - elif (self.prevPacket.mapId == self.mapId - and self.packet.isPostitionEqual(self.prevPacket) - and self.packet.isSymbolEqual(self.prevPacket)): - # Same mapId and position and same symbol - # Also mark this to replace previous packet - self.isReplacingPrevPacket = True - self.mapId = 5 # it is still 5 - self.markerId = self.prevPacket.markerId - else: - # Seems to be a new stationary station (or at least a new symbol for an existing station) - self.mapId = 5 - self.markerId = None - - def _isFaultyGpsPosition(self): - """Parse the packet and modify the mapId attribute if position is faulty - """ - packetlatCmp = int(round(self.packet.latitude*100000)) - packetlngCmp = int(round(self.packet.longitude*100000)) - - if (packetlatCmp == int(0) and packetlngCmp == int(0)): - return True - - if (packetlatCmp == int(1*100000) and packetlngCmp == int(1*100000)): - return True - - if (packetlatCmp == int(36*100000) and packetlngCmp == int(136*100000)): - # Some gps units seems to use this position as default until they find the real position - # Maybe it is the position of a gps manufacturer? - return True - - if (packetlatCmp == int(-48*100000) and packetlngCmp == int(0)): - # Some gps units seems to use this position as default until they find the real position - return True - return False diff --git a/server/trackdirect/parser/policies/PacketMaxSpeedPolicy.py b/server/trackdirect/parser/policies/PacketMaxSpeedPolicy.py deleted file mode 100644 index 991c2f61d52592c013e27bc1592901623638c554..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketMaxSpeedPolicy.py +++ /dev/null @@ -1,79 +0,0 @@ -from trackdirect.parser.policies.PacketSpeedComputablePolicy import PacketSpeedComputablePolicy - - -class PacketMaxSpeedPolicy(): - """PacketMaxSpeedPolicy handles logic related to max possible speed (used to filter out faulty packets) - """ - - def __init__(self): - """The __init__ method. - """ - - def getMaxLikelySpeed(self, packet, prevPacket): - """Returns the max likely speed - - Args: - packet (Packet): Packet that we want analyze - prevPacket (Packet): Previous related packet for the same station - - Returns: - Max likly speed as float - """ - maxSpeed = self._getDefaultStationMaxSpeed(packet) - - if (packet.speed is not None and packet.speed > maxSpeed): - # We allow 100% faster speed than the reported speed - maxSpeed = packet.speed * 2 - - if (prevPacket.isExistingObject() - and prevPacket.speed is not None - and prevPacket.speed > maxSpeed): - # We allow 100% faster speed than the previous reported speed - maxSpeed = prevPacket.speed * 2 - - calculatedSpeed = 0 - if (prevPacket.isExistingObject()): - calculatedSpeed = packet.getCalculatedSpeed(prevPacket) - packetSpeedComputablePolicy = PacketSpeedComputablePolicy() - if (packetSpeedComputablePolicy.isSpeedComputable(packet, prevPacket) - and prevPacket.mapId == 7 - and calculatedSpeed > maxSpeed): - # If last position is unconfirmed but still is closer to the last confirmed and calculated speed is trusted we accept that speed - # This part is IMPORTANT to avoid that all packets get map_id == 7 - maxSpeed = calculatedSpeed - - maxSpeed = (maxSpeed * (1 + len(packet.stationIdPath))) - return maxSpeed - - def _getDefaultStationMaxSpeed(self, packet): - """Returns the station default max speed (not affected by or adaptive speed limit) - - Args: - packet (Packet): Packet that we want analyze - - Returns: - Returns the station default max speed as int - """ - # Bugatti Veyron Super Sport Record Edition 2010, the fastest production car can do 431 kmh (but a regular car usually drives a bit slower...) - maxSpeed = 200 - if (packet.altitude is not None): - highestLandAltitude = 5767 # Uturuncu, Bolivia, highest road altitude - airPlaneMaxAltitude = 15240 # Very rare that airplanes go higher than 50.000 feet - # Objects below approximately 160 kilometers (99 mi) will experience very rapid orbital decay and altitude loss. - satelliteMinAltitude = 160000 - - if (packet.altitude > satelliteMinAltitude): - # Seems like this is an satellite - # Until we know more we dont change anything - maxSpeed = maxSpeed - - elif (packet.altitude > airPlaneMaxAltitude): - # Higher than a normal airplane but not a satellite, could be a high altitude ballon - maxSpeed = 50 - - elif (packet.altitude > highestLandAltitude): - # Seems like this is a airplane or a ballon - # 394 kmh is the ground speed record for a hot air ballon - # 950 kmh is a common upper crouse speed for regular airplanes - maxSpeed = 950 - return maxSpeed diff --git a/server/trackdirect/parser/policies/PacketOgnDataPolicy.py b/server/trackdirect/parser/policies/PacketOgnDataPolicy.py deleted file mode 100644 index 7029bbec98d76b03fa37c617a3f5714bc6b73ca4..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketOgnDataPolicy.py +++ /dev/null @@ -1,242 +0,0 @@ -import logging -from twisted.python import log - -from trackdirect.parser.policies.AprsPacketSymbolPolicy import AprsPacketSymbolPolicy -from trackdirect.parser.policies.PacketPathTcpPolicy import PacketPathTcpPolicy - - -class PacketOgnDataPolicy(): - """PacketOgnDataPolicy can answer questions about OGN data in the packet - """ - - def __init__(self, data, ognDeviceRepository, sourceId): - """The __init__ method. - - Args: - data (dict): Raw packet data - ognDeviceRepository (OgnDeviceRepository): OgnDeviceRepository instance - sourceId (int): Source Id - """ - self.data = data - self.ognDeviceRepository = ognDeviceRepository - - self.logger = logging.getLogger('trackdirect') - - self.isOgnPositionPacket = self.isOgnPositionPacket(sourceId) - self.isAllowedToTrack = True - self.isAllowedToIdentify = True - - self.result = {} - self._parse() - - def getOgnData(self): - """Returnes raw OGN data - - Returns: - Dict of OGN data - """ - return self.result - - def isOgnPositionPacket(self, sourceId): - """Returnes true if packet is a OGN Position packet - - Args: - sourceId (int): Source Id - - Returns: - Boolean - """ - if (sourceId == 5): - if ("comment" in self.data - and self.data["comment"] is not None - and len(self.data["comment"].strip()) > 10 - and self.data["comment"].strip().startswith("id")): - return True - - symbol = self.data['symbol'] if ('symbol' in self.data) else None - symbolTable = self.data['symbol_table'] if ( - 'symbol_table' in self.data) else None - aprsPacketSymbolPolicy = AprsPacketSymbolPolicy() - if (aprsPacketSymbolPolicy.isMaybeMovingSymbol(symbol, symbolTable)): - return True - else: - if ("comment" in self.data - and self.data["comment"] is not None - and len(self.data["comment"].strip()) > 10 - and self.data["comment"].strip().startswith("id") - and "fpm " in self.data["comment"] + " " - and "rot " in self.data["comment"] + " " - and "dB " in self.data["comment"] + " "): - return True - return False - - def _parse(self): - """Parse the OGN data in packet - """ - if (not self.isOgnPositionPacket): - self.result = None - else: - packetPathTcpPolicy = PacketPathTcpPolicy(self.data['path']) - if (not packetPathTcpPolicy.isSentByTCP()): - self.isAllowedToIdentify = False - - if ("comment" in self.data and self.data["comment"] is not None): - ognParts = self.data["comment"].split() - for part in ognParts: - if (part.startswith('id')): - part = part.replace("-", "") - self._parseSenderAddress(part) - self._parseSenderDetails(part) - - elif (part.endswith('fpm')): - self._parseClimbRate(part) - - elif (part.endswith('rot')): - self._parseTurnRate(part) - - elif (part.endswith('dB')): - if (self.isAllowedToIdentify and self.isAllowedToTrack): - self._parseSignalToNoiseRatio(part) - - elif (part.endswith('e')): - if (self.isAllowedToIdentify and self.isAllowedToTrack): - self._parseBitErrorsCorrected(part) - - elif (part.endswith('kHz')): - if (self.isAllowedToIdentify and self.isAllowedToTrack): - self._parseFrequencyOffset(part) - if (not self.isAllowedToTrack): - return - - if (not self.isAllowedToIdentify): - if ('ogn_sender_address' in self.result): - self.result['ogn_sender_address'] = None - - def _parseSenderAddress(self, content): - """Parse th OGN sender address - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_sender_address' not in self.result): - self.isAllowedToIdentify = True - self.result['ogn_sender_address'] = content[4:10].strip() - - ognDevice = self.ognDeviceRepository.getObjectByDeviceId( - self.result['ogn_sender_address']) - if (ognDevice.isExistingObject() and not ognDevice.tracked): - # Pilot do not want to be tracked, so we skip saving the packet - self.isAllowedToIdentify = False - self.isAllowedToTrack = False - - elif (self.result['ogn_sender_address'] == 'ICAFFFFFF'): - # The Device ID ICAFFFFFF is used by several aircrafts, we can not know what to do with them... - self.isAllowedToIdentify = False - self.isAllowedToTrack = False - - elif (not ognDevice.isExistingObject() or not ognDevice.identified): - # Pilot has not approved to show identifiable data, so we make up a random station name and clear all identifiable data - self.isAllowedToIdentify = False - else: - self.isAllowedToIdentify = False - - def _parseSenderDetails(self, content): - """Parse OGN aircraft type and OGN address type - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_aircraft_type_id' not in self.result): - try: - ognSenderDetailsHex = content[2:4] - ognSenderDetailsBinary = bin( - int(ognSenderDetailsHex, 16))[2:].zfill(8) - - stealth = ognSenderDetailsBinary[0:1] - noTracking = ognSenderDetailsBinary[1:2] - ognAircraftTypeIdBinary = ognSenderDetailsBinary[2:6] - ognAddressTypeIdBinary = ognSenderDetailsBinary[6:8] - - self.result['ogn_aircraft_type_id'] = int( - ognAircraftTypeIdBinary, 2) - if (self.result['ogn_aircraft_type_id'] == 0 or self.result['ogn_aircraft_type_id'] > 15): - self.result['ogn_aircraft_type_id'] = None - - self.result['ogn_address_type_id'] = int( - ognAddressTypeIdBinary, 2) - if (self.result['ogn_address_type_id'] == 0 or self.result['ogn_address_type_id'] > 4): - self.result['ogn_address_type_id'] = None - - except ValueError: - # Assume that we should track this aircraft (we should not receive packets that has the noTracking or stealth flag set) - noTracking = '0' - stealth = '0' - - if (stealth == '1' or noTracking == '1'): - self.isAllowedToIdentify = False - self.isAllowedToTrack = False - - def _parseClimbRate(self, content): - """Parse OGN climb rate - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_climb_rate' not in self.result and content.endswith('fpm')): - content = content.replace("fpm", "") - try: - self.result['ogn_climb_rate'] = int(content) - except ValueError: - pass - - def _parseTurnRate(self, content): - """Parse OGN turn rate - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_turn_rate' not in self.result and content.endswith('rot')): - content = content.replace("rot", "") - try: - self.result['ogn_turn_rate'] = float(content) - except ValueError: - pass - - def _parseSignalToNoiseRatio(self, content): - """Parse OGN SNR - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_signal_to_noise_ratio' not in self.result and content.endswith('dB')): - content = content.replace("dB", "") - try: - self.result['ogn_signal_to_noise_ratio'] = float(content) - except ValueError: - pass - - def _parseBitErrorsCorrected(self, content): - """Parse OGN number of bit errors corrected in the packet upon reception - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_bit_errors_corrected' not in self.result and content.endswith('e')): - content = content.replace("e", "") - try: - self.result['ogn_bit_errors_corrected'] = int(content) - except ValueError: - pass - - def _parseFrequencyOffset(self, content): - """Parse OGN frequency offset measured upon reception - - Arguments: - content (string) : String that contains information to parse - """ - if ('ogn_frequency_offset' not in self.result and content.endswith('kHz')): - content = content.replace("kHz", "") - try: - self.result['ogn_frequency_offset'] = float(content) - except ValueError: - pass diff --git a/server/trackdirect/parser/policies/PacketOrderPolicy.py b/server/trackdirect/parser/policies/PacketOrderPolicy.py deleted file mode 100644 index 0ab847dbc69e900c3be68287feb5d9478ee1c6f7..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketOrderPolicy.py +++ /dev/null @@ -1,34 +0,0 @@ -class PacketOrderPolicy(): - """PacketOrderPolicy handles logic related to packet receive order - """ - - def __init__(self): - """The __init__ method. - """ - - def isPacketInWrongOrder(self, packet, previousPacket): - """Checks if current packet is received in the wrong order compared to the previous specified packet - - Note: - We only care for packets in wrong order if station is moving - - Args: - packet (Packet): Packet that we want analyze - previousPacket (Packet): Packet objekt that represents the previous packet for this station - - Returns: - True if this packet is received in the wrong order otherwise false - """ - if (previousPacket is not None - and previousPacket.isExistingObject()): - if (previousPacket.reportedTimestamp is not None - and packet.reportedTimestamp is not None - and previousPacket.reportedTimestamp != 0 - and previousPacket.senderId == packet.senderId - and packet.reportedTimestamp != 0 - and previousPacket.isMoving == 1 - and previousPacket.reportedTimestamp < (packet.timestamp + 60*60*24) - and packet.reportedTimestamp < (packet.timestamp + 60*60*24) - and previousPacket.reportedTimestamp > packet.reportedTimestamp): - return True - return False diff --git a/server/trackdirect/parser/policies/PacketPathPolicy.py b/server/trackdirect/parser/policies/PacketPathPolicy.py deleted file mode 100644 index f1195cf3bda6fa73d32c987c779ad0a9262a7b62..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketPathPolicy.py +++ /dev/null @@ -1,263 +0,0 @@ -import collections -import re - -from trackdirect.exceptions.TrackDirectMissingStationError import TrackDirectMissingStationError -from trackdirect.parser.policies.PacketPathTcpPolicy import PacketPathTcpPolicy - - -class PacketPathPolicy(): - """PacketPathPolicy handles logic to generate the path for a specified packet - """ - - def __init__(self, path, sourceId, stationRepository, senderRepository): - """The __init__ method. - - Args: - path (list): Raw packet path list - sourceId (int): Packet source id - stationRepository (StationRepository): StationRepository instance - senderRepository (SenderRepository): SenderRepository instance - """ - self.path = path - self.sourceId = sourceId - self.stationRepository = stationRepository - self.senderRepository = senderRepository - - self.stationIdPath = [] - self.stationNamePath = [] - self.stationLocationPath = [] - self._parsePath() - - def getStationIdPath(self): - """Returns station id path - - Returns: - list - """ - return self.stationIdPath - - def getStationNamePath(self): - """Returns station name path - - Returns: - list - """ - return self.stationNamePath - - def getStationLocationPath(self): - """Returns station location path, a list of longitude and latitude values - - Returns: - list - """ - return self.stationLocationPath - - def _parsePath(self): - """Parse Station path - - Note: - Include station in path if - - Station name is after q-code (this is the I-gate) - - Station name is before unused path command and a used command exists after (this is a digipeater that has inserted itself into the path) - - As a precaution we also include stations where name has a * after it (no matter the position in path) - """ - isQCodeFound = False - isNonUsedPathCommandFound = False - packetPathTcpPolicy = PacketPathTcpPolicy(self.path) - if (packetPathTcpPolicy.isSentByTCP()): - return - - i = 0 - while i < len(self.path): - index = i - i += 1 - name = self.path[index] - - if (isinstance(name, int)): - name = str(name) - - if (self._isQCode(name)): - isQCodeFound = True - continue - - if (self._isPathCommand(name)): - if (not self._isUsedPathCommand(name)): - isNonUsedPathCommandFound = True - continue - - pathStationName = name.replace('*', '') - if (not self._isStationNameValid(pathStationName)): - continue - - if (isQCodeFound - or name.find('*') >= 0 - or not isNonUsedPathCommandFound): - self._addStationToPath(pathStationName) - - def _addStationToPath(self, name): - """Returns true if specified string is a Q code - - Args: - name (string): station - """ - try: - station = self.stationRepository.getCachedObjectByName( - name, self.sourceId) - stationId = station.id - - if (stationId not in self.stationIdPath): - location = self._getStationLatestLocation(stationId) - if (location is not None): - self.stationNamePath.append(name) - self.stationIdPath.append(stationId) - self.stationLocationPath.append(location) - except (TrackDirectMissingStationError) as exp: - pass - - def _isQCode(self, value): - """Returns true if specified string is a Q code - - Args: - value (string): value - - Returns: - Returns true if specified string is a Q code otherwise false - """ - if (value.upper().find('QA') == 0 and len(value) == 3): - return True - else: - return False - - def _isStationNameValid(self, name): - """Returns true if specified station name is valid. This method is used to filter out common station names that is not valid. - - Args: - name (string): Station name - - Returns: - Returns true if specified station name is valid otherwise false - """ - if (name.find('NONE') == 0): - return False - elif (name.find('0') == 0 and len(name) == 1): - return False - elif (name.find('1') == 0 and len(name) == 1): - return False - elif (name.find('2') == 0 and len(name) == 1): - return False - elif (name.find('3') == 0 and len(name) == 1): - return False - elif (name.find('4') == 0 and len(name) == 1): - return False - elif (name.find('5') == 0 and len(name) == 1): - return False - elif (name.find('6') == 0 and len(name) == 1): - return False - elif (name.find('7') == 0 and len(name) == 1): - return False - elif (name.find('8') == 0 and len(name) == 1): - return False - elif (name.find('9') == 0 and len(name) == 1): - return False - elif (name.find('APRS') == 0 and len(name) == 4): - return False - elif (name.find('1-1') == 0 and len(name) == 3): - return False - elif (name.find('2-1') == 0 and len(name) == 3): - return False - elif (name.find('2-2') == 0 and len(name) == 3): - return False - elif (name.find('3-1') == 0 and len(name) == 3): - return False - elif (name.find('3-2') == 0 and len(name) == 3): - return False - elif (name.find('3-3') == 0 and len(name) == 3): - return False - elif (name.find('4-1') == 0 and len(name) == 3): - return False - elif (name.find('4-2') == 0 and len(name) == 3): - return False - elif (name.find('4-3') == 0 and len(name) == 3): - return False - elif (name.find('4-4') == 0 and len(name) == 3): - return False - elif (name.find('DSTAR') == 0): - return False - elif (name.find('TCP') == 0): - return False - elif (name.find('NULL') == 0): - return False - elif (name.find('LOCAL') == 0): - return False - elif (name.find('GATE') == 0): - return False - elif (name.find('DIRECT') == 0 and len(name) == 6): - return False - elif (name.find('CWOP') == 0 and len(name) == 6): - return False - elif (name.find('DMR') == 0 and len(name) == 3): - return False - elif (name.find('ECHO') == 0 and len(name) == 4): - return False - elif (name.find('OR1-') == 0): - return False - elif (name.find('OR2-') == 0): - return False - - else: - return True - - def _isPathCommand(self, value): - """Returns true if specified value is a path command - - Args: - value (string): value - - Returns: - Returns true if specified value is a path command otherwise false - """ - if (value.find('WIDE') == 0): - return True - elif (value.find('RELAY') == 0): - return True - elif (value.find('TRACE') == 0): - return True - elif (value.find('RPN') == 0): - return True - else: - return False - - def _isUsedPathCommand(self, value): - """Returns true if specified value is a path command and it is completly used - - Args: - value (string): value - - Returns: - Returns true if specified value is a path command (and it is completly used) otherwise false - """ - if (value.find('*') >= 0): - # If a star is added it means that the path command is completly used - return True - - if (value.find('WIDE') == 0 or value.find('TRACE') == 0 or value.find('RPN') == 0): - if (value.find('-') < 0): - # if the wide/trace command still has a hyphen it means that it is not used up - # Example: WIDE2-1 (can be used one more time), WIDE2 (can not be used any more) - return True - return False - - def _getStationLatestLocation(self, stationId): - """Get latest location for at specified station - - Args: - None - - Returns: - Returns the location of the specified station as an array, first value is latitude, second is longitude - """ - station = self.stationRepository.getObjectById(stationId) - if (station.isExistingObject()): - if (station.latestConfirmedLatitude is not None and station.latestConfirmedLongitude is not None): - return [station.latestConfirmedLatitude, station.latestConfirmedLongitude] - return None diff --git a/server/trackdirect/parser/policies/PacketPathTcpPolicy.py b/server/trackdirect/parser/policies/PacketPathTcpPolicy.py deleted file mode 100644 index 03b4f987da1d3caf0bc5c137e71c7f7ad23ab501..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketPathTcpPolicy.py +++ /dev/null @@ -1,35 +0,0 @@ -import re - - -class PacketPathTcpPolicy(): - """PacketPathTcpPolicy is used to figure out if packet is sent using radio or TCP - """ - - def __init__(self, path): - """The __init__ method. - - Args: - path (list): Raw packet path list - """ - self.path = path - - def isSentByTCP(self): - """Returns True if packet is sent through TCPIP - - Returns: - True if packet is sent through TCPIP otherwise False - """ - if (isinstance(self.path, list)): - if len(self.path) >= 2 and (re.match(r"^TCPIP\*.*$", self.path[0]) or re.match(r"^TCPXX\*.*$", self.path[0])): - # first station is TCP (this usually means it is sent over TCP...) - return True - if ('qAC' in self.path): - # Packet was received from the client directly via a verified connection - return True - if ('qAX' in self.path): - # Packet was received from the client directly via a unverified connection - return True - if ('qAU' in self.path): - # Packet was received from the client directly via a UDP connection. - return True - return False diff --git a/server/trackdirect/parser/policies/PacketRelatedMapSectorsPolicy.py b/server/trackdirect/parser/policies/PacketRelatedMapSectorsPolicy.py deleted file mode 100644 index a0595ef225fc96df404aa4c14e2b93bfa3051007..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketRelatedMapSectorsPolicy.py +++ /dev/null @@ -1,133 +0,0 @@ -import time - -from trackdirect.parser.policies.MapSectorPolicy import MapSectorPolicy - - -class PacketRelatedMapSectorsPolicy(): - """PacketRelatedMapSectorsPolicy handles logic related to map sectors for a packet - """ - - def __init__(self, packetRepository): - """The __init__ method. - - Args: - packetRepository (PacketRepository): PacketRepository instance - """ - self.packetRepository = packetRepository - - def getAllRelatedMapSectors(self, packet, previousPacket): - """Returns all related map sectors to current packet - - Note: - A related map sector is a map-sector that is not the map sector of the current packet nor the previous packet, - it is all the map-sectors in between the current packet and the previous packet. - - Args: - packet (Packet): Packet that we want analyze - previousPacket (Packet): Packet object that represents the previous packet for this station - - Returns: - Returns any related map sectors (as an array) - """ - if (not self._mayPacketHaveRelatedMapSectors(packet, previousPacket)): - return [] - - relatedMapSectors = [] - if (previousPacket.mapId == 7): - # When previous packet is unconfirmed we need to add path between prev-prev-packet and prev-packet also - minTimestamp = int(time.time()) - 86400 # 24 hours - prevpreviousPacket = self.packetRepository.getLatestConfirmedMovingObjectByStationId( - previousPacket.stationId, minTimestamp) - if (prevpreviousPacket.isExistingObject() and prevpreviousPacket.markerCounter > 1): - # We found a confirmed prev prev packet - relatedMapSectors.extend(self._getRelatedMapSectors( - previousPacket, prevpreviousPacket)) - - relatedMapSectors.extend( - self._getRelatedMapSectors(packet, previousPacket)) - return relatedMapSectors - - def _mayPacketHaveRelatedMapSectors(self, packet, previousPacket): - """Returns true if packet may be related to other map sectors then the map sector it's in - - Args: - packet (Packet): Packet that we want analyze - previousPacket (Packet): Packet objekt that represents the previous packet for this station - - Returns: - Returns true if packet may be related to other map sectors otherwise false - """ - if (packet.isMoving == 1 - and previousPacket.isMoving == 1 - and packet.markerId != 1): - # We only add related map-sectors to moving stations (that has a marker) - if (packet.mapId == 1): - # If new packet is not confirmed (mapId 7) we connect it with related map-sectors later - if (previousPacket.markerCounter is not None and previousPacket.markerCounter > 1 - or packet.markerId == previousPacket.markerId): - # We only add related map-sectors if previous packet has a marker with several connected packet - # A packet with a marker that is not shared with anyone will be converted to a ghost-marker in client - if (previousPacket.mapId == 1 - or packet.markerId == previousPacket.markerId): - # If a previous packet has mapId = 7 (unconfirmed position), - # and new packet has another marker, - # then the previous marker is doomed to be a ghost-marker forever - return True - return False - - def _getRelatedMapSectors(self, packet1, packet2): - """Get any related map sectors between specified packets - - Note: - A related map sector is a map-sector that is not the map sector of the current packet nor the previous packet, - it is all the map-sectors in between the current packet and the previous packet. - - Args: - packet1 (Packet): Primary packet object - packet2 (Packet): Prvious packet object - - Returns: - Returns any related map sectors (as an array) - """ - relatedMapSectors = [] - distance = calculatedDistance = packet1.getDistance( - packet2.latitude, packet2.longitude) - if (distance > 500000): - # if distance is longer than 500km, we consider this station to be world wide... - # but currently we do not use this information since it would affect performance to much - # but it is extremly few stations that actually is affected by this (about 0-2 stations) - relatedMapSectors.append(99999999) - else: - minLat = packet2.latitude - maxLat = packet1.latitude - minLng = packet2.longitude - maxLng = packet1.longitude - - if (maxLat < minLat): - minLat = packet1.latitude - maxLat = packet2.latitude - if (maxLng < minLng): - minLng = packet1.longitude - maxLng = packet2.longitude - - mapSectorPolicy = MapSectorPolicy() - minLng = mapSectorPolicy.getMapSectorLngRepresentation(minLng) - minLat = mapSectorPolicy.getMapSectorLatRepresentation(minLat) - maxLng = mapSectorPolicy.getMapSectorLngRepresentation( - maxLng + 0.5) - maxLat = mapSectorPolicy.getMapSectorLatRepresentation( - maxLat + 0.2) - prevPacketAreaCode = mapSectorPolicy.getMapSector( - packet2.latitude, packet2.longitude) - newPacketAreaCode = mapSectorPolicy.getMapSector( - packet1.latitude, packet1.longitude) - - # lat interval: 0 - 18000000 - # lng interval: 0 - 00003600 - # Maybe we can do this smarter? Currently we are adding many map-sectors that is not relevant - for lat in range(minLat, maxLat, 20000): - for lng in range(minLng, maxLng, 5): - mapSectorAreaCode = lat+lng - if (mapSectorAreaCode != prevPacketAreaCode and mapSectorAreaCode != newPacketAreaCode): - relatedMapSectors.append(mapSectorAreaCode) - return relatedMapSectors diff --git a/server/trackdirect/parser/policies/PacketSpeedComputablePolicy.py b/server/trackdirect/parser/policies/PacketSpeedComputablePolicy.py deleted file mode 100644 index e1409b480b27900fc12925972fd74b68adf3fc76..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketSpeedComputablePolicy.py +++ /dev/null @@ -1,47 +0,0 @@ -class PacketSpeedComputablePolicy(): - """PacketSpeedComputablePolicy handles logic related to parameters that may cause errors in speed calculations - """ - - def __init__(self): - """The __init__ method. - """ - - def isSpeedComputable(self, packet, prevPacket): - """Returns true if speed is possible to calculate in a way that we can trust it - - Args: - packet (Packet): Packet that we want to know move typ for - prevPacket (Packet): Previous related packet for the same station - - Returns: - Returns true if speed is possible to calculate - """ - if (packet is None - or prevPacket is None - or prevPacket.isMoving != 1 - or prevPacket.mapId not in [1, 7] - or packet.markerId == 1 - or packet.isMoving != 1): - return False - - if (packet.reportedTimestamp is not None - and prevPacket.reportedTimestamp is not None - and packet.reportedTimestamp != 0 - and prevPacket.reportedTimestamp != 0 - and (packet.reportedTimestamp % 60 != 0 or prevPacket.reportedTimestamp % 60 != 0) - and prevPacket.reportedTimestamp != packet.reportedTimestamp): - return True - else: - calculatedDistance = packet.getDistance( - prevPacket.latitude, prevPacket.longitude) - if (len(packet.stationIdPath) < 1): - # Packet was sent through internet, delay should be small - return True - elif (len(packet.stationIdPath) <= 1 and calculatedDistance > 5000): - # Packet has not been digipeated (delay should not be extreme) - # and distance is longer than 5km - return True - else: - # Packet was digipeated (delay can be very long) - # or distance was short, calculated speed can not be trusted - return False diff --git a/server/trackdirect/parser/policies/PacketTailPolicy.py b/server/trackdirect/parser/policies/PacketTailPolicy.py deleted file mode 100644 index b422f2274bf73c29d19bed3b16e30bc99ba542c2..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PacketTailPolicy.py +++ /dev/null @@ -1,46 +0,0 @@ -class PacketTailPolicy(): - """PacketTailPolicy handles logic related to packet tail id - """ - - def __init__(self, packet, prevPacket): - """The __init__ method. - - Args: - packet (Packet): Packet that we want analyze - prevPacket (Packet): Previous related packet for the same station - """ - self.packet = packet - self.prevPacket = prevPacket - self.packetTailTimestamp = None - - def getPacketTailTimestamp(self): - """Returns the current packet tail timestamp - """ - if (self.packetTailTimestamp is None): - self._findPacketTail() - return self.packetTailTimestamp - - def _findPacketTail(self): - """Finds the current packet tail - """ - self.packetTailTimestamp = self.packet.timestamp - - if (self.prevPacket.isExistingObject()): - # The packet_tail_id is used to get a faster map, no need to fetch older packets if a station has no tail. - # It's not a big problem if packet_tail_id is "Has tail" but no tail exists (the opposite is worse) - if (not self.packet.isPostitionEqual(self.prevPacket)): - # Both moving and stationary has tail if packet with other position exists - self.packetTailTimestamp = self.packet.timestamp - - if (self.packet.isMoving == 0 and not self.packet.isSymbolEqual(self.prevPacket)): - # Stationary packet also has a tail if another symbol exists on same position - self.packetTailTimestamp = self.packet.timestamp - - if (self.packetTailTimestamp == self.packet.timestamp): - # We have not found any tail yet - if (self.prevPacket.packetTailTimestamp < self.prevPacket.timestamp): - # prevous packet has a tail - dbMaxAge = 86400 # 1 day - if (self.prevPacket.packetTailTimestamp > (self.packet.timestamp - dbMaxAge)): - # Previous packet indicates that we have a tail and tail is not to old - self.packetTailTimestamp = self.prevPacket.timestamp diff --git a/server/trackdirect/parser/policies/PreviousPacketPolicy.py b/server/trackdirect/parser/policies/PreviousPacketPolicy.py deleted file mode 100644 index feea95b14e100b56079f94ccd513904596035f1e..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/PreviousPacketPolicy.py +++ /dev/null @@ -1,180 +0,0 @@ -import logging -from twisted.python import log -import datetime -import time - -from trackdirect.parser.policies.PacketAssumedMoveTypePolicy import PacketAssumedMoveTypePolicy -from trackdirect.parser.policies.PacketOrderPolicy import PacketOrderPolicy - -from trackdirect.repositories.PacketRepository import PacketRepository -from trackdirect.repositories.StationRepository import StationRepository - - -class PreviousPacketPolicy(): - """The PreviousPacketPolicy class tries to find the most related previous packet for the same station - """ - - def __init__(self, packet, db): - """The __init__ method. - - Args: - packet (Packet): Packet for that we want to find previous most related packet - db (psycopg2.Connection): Database connection - """ - self.db = db - self.packet = packet - self.packetRepository = PacketRepository(db) - self.stationRepository = StationRepository(db) - - def getPreviousPacket(self): - """Tries to find the previous packet for the specified packet - - Returns: - Packet - """ - if (not self._mayPacketHavePreviousPacket()): - return self.packetRepository.create() - - minTimestamp = int(time.time()) - 86400 # 24 hours - latestPreviousPacket = self.packetRepository.getLatestObjectByStationId(self.packet.stationId, minTimestamp) - - if (not latestPreviousPacket.isExistingObject()): - return latestPreviousPacket - - if (self.packet.mapId == 5): - return self._getBestPreviousPacketForFaultyGpsPacket(latestPreviousPacket) - else: - packetAssumedMoveTypePolicy = PacketAssumedMoveTypePolicy(self.db) - isMoving = packetAssumedMoveTypePolicy.getAssumedMoveType(self.packet, latestPreviousPacket) - if (isMoving == 1): - return self._getBestPreviousPacketForMovingStation(latestPreviousPacket, minTimestamp) - else: - return self._getBestPreviousPacketForStationaryStation(latestPreviousPacket) - - def _mayPacketHavePreviousPacket(self): - """Returns true if current packet is ready for previous packet calculation - - Returns: - boolean - """ - if (self.packet.latitude is not None - and self.packet.longitude is not None - and type(self.packet.latitude) == float - and type(self.packet.longitude) == float - and self.packet.sourceId != 3 - and self.packet.mapId in [1, 5, 7, 9]): - return True - else: - return False - - def _getBestPreviousPacketForFaultyGpsPacket(self, latestPreviousPacket): - """Find the previous packet that is best related to the current packet - - Args: - latestPreviousPacket (Packet): Packet object that represents the latest previous packet for this station - - Returns: - Packet - """ - if (latestPreviousPacket.mapId != self.packet.mapId - or not self.packet.isPostitionEqual(latestPreviousPacket) - or not self.packet.isSymbolEqual(latestPreviousPacket)): - # Try to find prev packet - prevPacketSamePos = self.packetRepository.getLatestObjectByStationIdAndPosition( - self.packet.stationId, - self.packet.latitude, - self.packet.longitude, - [self.packet.mapId], - self.packet.symbol, - self.packet.symbolTable, - self.packet.timestamp - 86400 - ) - if (prevPacketSamePos.isExistingObject()): - return prevPacketSamePos - return latestPreviousPacket - - def _getBestPreviousPacketForStationaryStation(self, latestPreviousPacket): - """Find the previous packet that is best related to the current packet - - Args: - latestPreviousPacket (Packet): Packet object that represents the latest previous packet for this station - - Returns: - Packet - """ - if (not self.packet.isPostitionEqual(latestPreviousPacket) - or not self.packet.isSymbolEqual(latestPreviousPacket) - or self.packet.isMoving != latestPreviousPacket.isMoving - or latestPreviousPacket.mapId not in [1, 7]): - # Try to find stationary marker for packet position - previousPacketSamePos = self.packetRepository.getLatestObjectByStationIdAndPosition( - self.packet.stationId, - self.packet.latitude, - self.packet.longitude, - [1, 7], - self.packet.symbol, - self.packet.symbolTable, - self.packet.timestamp - 86400 - ) - if (previousPacketSamePos.isExistingObject()): - return previousPacketSamePos - return latestPreviousPacket - - def _getBestPreviousPacketForMovingStation(self, latestPreviousPacket, minTimestamp): - """Find the previous packet that is best related to the current packet - - Args: - latestPreviousPacket (Packet): Packet object that represents the latest previous packet for this station - minTimestamp (int): Oldest accepted timestamp (Unix timestamp) - - Returns: - Packet - """ - previousPacket = latestPreviousPacket - if (previousPacket.isExistingObject() - and (previousPacket.isMoving != 1 - or previousPacket.mapId not in [1, 7])): - # Current packet is assumed moving but previous is stationary, try to find last moving instead - prevMovingPacket = self.packetRepository.getLatestMovingObjectByStationId( - self.packet.stationId, minTimestamp) - if (prevMovingPacket.isExistingObject()): - previousPacket = prevMovingPacket - - packetOrderPolicy = PacketOrderPolicy() - if (previousPacket.isExistingObject() - and previousPacket.isMoving == 1 - and previousPacket.mapId == 7 - and not packetOrderPolicy.isPacketInWrongOrder(self.packet, previousPacket)): - # previousPacket is not confirmed (see if we have a better alternative) - prevConfirmedPacket = self.packetRepository.getLatestConfirmedMovingObjectByStationId( - self.packet.stationId, minTimestamp) - previousPacket = self._getClosestPacketObject( - previousPacket, prevConfirmedPacket) - - return previousPacket - - def _getClosestPacketObject(self, previousPacket1, previousPacket2): - """Returns the packet closest to the current position - - Args: - previousPacket1 (Packet): Packet object that represents one previous packet for current station - previousPacket2 (Packet): Packet object that represents one previous packet for current station - - Returns: - Packet - """ - if (not previousPacket1.isExistingObject()): - return previousPacket2 - - if (not previousPacket2.isExistingObject()): - return previousPacket1 - - prevPacket1CalculatedDistance = self.packet.getDistance( - previousPacket1.latitude, previousPacket1.longitude) - prevPacket2CalculatedDistance = self.packet.getDistance( - previousPacket2.latitude, previousPacket2.longitude) - - if (prevPacket2CalculatedDistance < prevPacket1CalculatedDistance): - return previousPacket2 - else: - return previousPacket1 diff --git a/server/trackdirect/parser/policies/StationNameFormatPolicy.py b/server/trackdirect/parser/policies/StationNameFormatPolicy.py deleted file mode 100644 index ca07c6163d74fd26ffee62f8b03d24354f3685f8..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/StationNameFormatPolicy.py +++ /dev/null @@ -1,26 +0,0 @@ -class StationNameFormatPolicy(): - """The StationNameFormatPolicy class handles logic related to station name format - """ - - def __init__(self): - """The __init__ method. - """ - - def getCorrectFormat(self, name): - """ Returns the specified name in correct format - (without any status characters) - - Notes: - _ == kill character - ! == live character for item - * == live character for object - single quote and double quote is just to annoying - (of course we can handle it in database but why use it in a name...) - - Args: - name (string): name of station - - Returns: - string - """ - return name.replace('*', '').replace('!', '').replace('_', '').replace('\'', '').replace('"', '').replace('`', '').strip() diff --git a/server/trackdirect/parser/policies/__init__.py b/server/trackdirect/parser/policies/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/parser/policies/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/repositories/MarkerRepository.py b/server/trackdirect/repositories/MarkerRepository.py deleted file mode 100644 index 10b98f1eb254ca90f1e957a08b144c8a49c885f0..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/MarkerRepository.py +++ /dev/null @@ -1,45 +0,0 @@ - -from trackdirect.common.Repository import Repository -from trackdirect.objects.Marker import Marker - - -class MarkerRepository(Repository): - """A Repository class for the Marker class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - Marker - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select %s from marker_seq where last_value > %s""", (id, id, )) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - - selectCursor.close() - return dbObject - - def create(self): - """Creates an empty Marker object - - Returns: - Marker - """ - return Marker(self.db) diff --git a/server/trackdirect/repositories/OgnDeviceRepository.py b/server/trackdirect/repositories/OgnDeviceRepository.py deleted file mode 100644 index b5d678531a52f4764239228bd4779bd0be5cb8b9..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/OgnDeviceRepository.py +++ /dev/null @@ -1,107 +0,0 @@ -from random import randint - -from trackdirect.common.Repository import Repository -from trackdirect.objects.OgnDevice import OgnDevice - - -class OgnDeviceRepository(Repository): - """A Repository class for the OgnDevice class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - OgnDevice - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from ogn_device where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject = self.getObjectFromRecord(record) - else: - # ogn_device do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectByDeviceId(self, deviceId): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - deviceId (string): Device Id (corresponds to ogn_sender_address) - - Returns: - OgnDevice instance - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from ogn_device where device_id like %s""", (deviceId,)) - record = selectCursor.fetchone() - - if (record is not None): - dbObject = self.getObjectFromRecord(record) - else: - # ogn_device do not exists, return empty object - dbObject = OgnDevice(self.db) - - selectCursor.close() - return dbObject - - def getObjectFromRecord(self, record): - """Returns a OgnDevice object based on the specified database record dict - - Args: - record (dict): A database record dict from the ogn_device database table - - Returns: - A OgnDevice object - """ - dbObject = self.create() - if (record is not None): - dbObject.id = randint(1, 9999999) - dbObject.deviceType = record["device_type"] - dbObject.deviceId = record["device_id"] - dbObject.aircraftModel = record["aircraft_model"] - dbObject.registration = record["registration"] - dbObject.cn = record["cn"] - - if (record["tracked"] == 'N'): - dbObject.tracked = False - else: - dbObject.tracked = True - - if (record["identified"] == 'N'): - dbObject.identified = False - else: - dbObject.identified = True - - try: - dbObject.ddbAircraftType = int(record["ddb_aircraft_type"]) - except ValueError: - pass - - return dbObject - - def create(self): - """Creates an empty OgnDevice object - - Returns: - OgnDevice instance - """ - return OgnDevice(self.db) diff --git a/server/trackdirect/repositories/OgnHiddenStationRepository.py b/server/trackdirect/repositories/OgnHiddenStationRepository.py deleted file mode 100644 index 2e805e1f4bec85c0a2146a704063bef69b4c93b4..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/OgnHiddenStationRepository.py +++ /dev/null @@ -1,92 +0,0 @@ -from trackdirect.common.Repository import Repository -from trackdirect.objects.OgnHiddenStation import OgnHiddenStation - - -class OgnHiddenStationRepository(Repository): - """A Repository class for the OgnHiddenStation class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - OgnHiddenStation - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from ogn_hidden_station where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject = self.getObjectFromRecord(record) - else: - # station do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectByHashedName(self, hashedName, createNewIfMissing): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - hashedName (string): Uniqe hash for station - createNewIfMissing (boolean): Set to true if a new should be created if no one is found - - Returns: - OgnHiddenStation instance - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from ogn_hidden_station where hashed_name = %s""", (str(hashedName),)) - record = selectCursor.fetchone() - - if (record is not None): - dbObject = self.getObjectFromRecord(record) - elif (createNewIfMissing): - # not exist, create it - dbObject = self.create() - dbObject.hashedName = hashedName - dbObject.save() - else: - # ogn_device do not exists, return empty object - dbObject = self.create() - - selectCursor.close() - return dbObject - - def getObjectFromRecord(self, record): - """Returns a OgnHiddenStation object based on the specified database record dict - - Args: - record (dict): A database record dict from the ogn_device database table - - Returns: - A OgnHiddenStation object - """ - dbObject = self.create() - if (record is not None): - dbObject.id = int(record["id"]) - dbObject.name = record["hashed_name"] - - return dbObject - - def create(self): - """Creates an empty OgnHiddenStation object - - Returns: - OgnHiddenStation instance - """ - return OgnHiddenStation(self.db) diff --git a/server/trackdirect/repositories/PacketOgnRepository.py b/server/trackdirect/repositories/PacketOgnRepository.py deleted file mode 100644 index 46fff16170bd0ff2a102beb88f43b4c0aa9ccfaa..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/PacketOgnRepository.py +++ /dev/null @@ -1,126 +0,0 @@ -import datetime -import time - -from trackdirect.common.Repository import Repository -from trackdirect.objects.PacketOgn import PacketOgn - - -class PacketOgnRepository(Repository): - """A Repository class for the PacketOgn class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - PacketOgn - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from packet_ogn where id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - - def getObjectByPacketIdAndTimestamp(self, id, timestamp): - """Returns an object based on the specified packet id in database - - Args: - id (int): Database row id - timestamp (int): Unix timestamp for requested packet (must be samt date as packet was received) - - Returns: - PacketOgn - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from packet_ogn where packet_id = %s and timestamp = %s""", (id, timestamp,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - - def getObjectFromRecord(self, record): - """Returns a packet OGN object from a record - - Args: - record (dict): Database record dict to convert to a packet OGN object - - Returns: - A packet OGN object - """ - dbObject = PacketOgn(self.db) - if (record is not None): - dbObject.id = record["id"] - dbObject.packetId = int(record["packet_id"]) - dbObject.stationId = int(record["station_id"]) - dbObject.timestamp = int(record["timestamp"]) - - dbObject.ognSenderAddress = record['ogn_sender_address'] - dbObject.ognAddressTypeId = record['ogn_address_type_id'] - dbObject.ognAircraftTypeId = record['ogn_aircraft_type_id'] - dbObject.ognClimbRate = record['ogn_climb_rate'] - dbObject.ognTurnRate = record['ogn_turn_rate'] - dbObject.ognSignalToNoiseRatio = record['ogn_signal_to_noise_ratio'] - dbObject.ognBitErrorsCorrected = record['ogn_bit_errors_corrected'] - dbObject.ognFrequencyOffset = record['ogn_frequency_offset'] - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - PacketOgn - """ - newObject = self.create() - if ("ogn" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.timestamp = int(time.time()) - 1 - - if ("ogn_sender_address" in data["ogn"]): - newObject.ognSenderAddress = data["ogn"]["ogn_sender_address"] - - if ("ogn_address_type_id" in data["ogn"]): - newObject.ognAddressTypeId = data["ogn"]["ogn_address_type_id"] - - if ("ogn_aircraft_type_id" in data["ogn"]): - newObject.ognAircraftTypeId = data["ogn"]["ogn_aircraft_type_id"] - - if ("ogn_climb_rate" in data["ogn"]): - newObject.ognClimbRate = data["ogn"]["ogn_climb_rate"] - - if ("ogn_turn_rate" in data["ogn"]): - newObject.ognTurnRate = data["ogn"]["ogn_turn_rate"] - - if ("ogn_signal_to_noise_ratio" in data["ogn"]): - newObject.ognSignalToNoiseRatio = data["ogn"]["ogn_signal_to_noise_ratio"] - - if ("ogn_bit_errors_corrected" in data["ogn"]): - newObject.ognBitErrorsCorrected = data["ogn"]["ogn_bit_errors_corrected"] - - if ("ogn_frequency_offset" in data["ogn"]): - newObject.ognFrequencyOffset = data["ogn"]["ogn_frequency_offset"] - - return newObject - - def create(self): - """Creates an empty PacketOgn object - - Returns: - PacketOgn - """ - return PacketOgn(self.db) diff --git a/server/trackdirect/repositories/PacketRepository.py b/server/trackdirect/repositories/PacketRepository.py deleted file mode 100644 index 39380f34f3894e155b3ff6ac63b7fd47ac4d0051..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/PacketRepository.py +++ /dev/null @@ -1,764 +0,0 @@ - -from trackdirect.common.Repository import Repository -from trackdirect.objects.Packet import Packet -from trackdirect.database.PacketTableCreator import PacketTableCreator -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder - - -class PacketRepository(Repository): - """The PacketRepository class contains different method that creates Packet instances - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.db = db - - # After testing I have realized that several queries are faster if you query one packet child at the time - # That is why we are using packetTableCreator to fetch childtables instead of using the parent packet table - self.packetTableCreator = PacketTableCreator(self.db) - self.packetTableCreator.disableCreateIfMissing() - self.dbObjectFinder = DatabaseObjectFinder(db) - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - Packet - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from packet where id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - - def getObjectByIdAndTimestamp(self, id, timestamp): - """Returns an object based on the specified id in database - - Args: - id (int): Database row id - timestamp (int): Unix timestamp for requested packet - - Returns: - Packet - """ - try: - packetTable = self.packetTableCreator.getPacketTable(timestamp) - except TrackDirectMissingTableError as e: - return Packet(self.db) - - selectCursor = self.db.cursor() - selectCursor.execute("""select * from """ + - packetTable + """ where id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - - def getObjectByStationIdAndTimestamp(self, stationId, timestamp): - """Returns an object based on the specified stationId in database - - Args: - stationId (int): Station id - timestamp (int): Unix timestamp for requested packet - - Returns: - Packet - """ - try: - packetTable = self.packetTableCreator.getPacketTable(timestamp) - selectCursor = self.db.cursor() - selectCursor.execute("""select * from """ + packetTable + - """ where station_id = %s and timestamp = %s order by id limit 1""", (stationId, timestamp, )) - record = selectCursor.fetchone() - - selectCursor.close() - return self.getObjectFromRecord(record) - except TrackDirectMissingTableError as e: - return self.create() - - def getLatestObjectListByStationIdListAndTimeInterval(self, stationIdList, minPacketTimestamp, maxPacketTimestamp, onlyConfirmed=True): - """Returns an array of Packet's specified by station id's - Args: - stationIdList (array): Station id's to look for - minPacketTimestamp (int): Min requested unix timestamp - maxPacketTimestamp (int): Max requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - - selectCursor = self.db.cursor() - result = [] - foundStationIdList = [] - packetTables = self.packetTableCreator.getPacketTables( - minPacketTimestamp, maxPacketTimestamp) - mapIdList = [1, 2, 12] - if (not onlyConfirmed): - mapIdList = [1, 2, 5, 7, 9, 12] - - for packetTable in reversed(packetTables): - stationIdListToFind = tuple( - list(set(stationIdList) - set(foundStationIdList))) - - if (len(stationIdListToFind) > 0): - sql1 = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where id in ( - select max(id) - from """ + packetTable + """ packet - where map_id in %s - and station_id in %s - and timestamp > %s - and timestamp <= %s - group by station_id - ) - order by packet.marker_id desc, packet.id desc""", (tuple(mapIdList), tuple(stationIdListToFind), int(minPacketTimestamp), int(maxPacketTimestamp))) - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql1) - for record in selectCursor: - if (record is not None): - if (record['station_id'] not in foundStationIdList): - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - foundStationIdList.append(record['station_id']) - if (len(foundStationIdList) >= len(stationIdList)): - break - - if (len(foundStationIdList) < len(stationIdList)): - for packetTable in reversed(packetTables): - stationIdListToFind = tuple( - list(set(stationIdList) - set(foundStationIdList))) - - if (len(stationIdListToFind) > 0): - sql2 = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where map_id = 12 - and station_id in %s - and position_timestamp <= %s - and timestamp > %s - order by packet.marker_id desc, packet.id desc""", (tuple(stationIdListToFind), int(maxPacketTimestamp), int(minPacketTimestamp))) - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql2) - for record in selectCursor: - if (record is not None): - if (record['station_id'] not in foundStationIdList): - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - foundStationIdList.append(record['station_id']) - - if (len(foundStationIdList) >= len(stationIdList)): - break - - selectCursor.close() - return result - - def getObjectListByStationIdListAndTimeInterval(self, stationIdList, minPacketTimestamp, maxPacketTimestamp): - """Returns an array of Packet's specified by station id's - Args: - stationIdList (array): Station id's to look for - minPacketTimestamp (int): Min requested unix timestamp - maxPacketTimestamp (int): Max requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - - selectCursor = self.db.cursor() - - result = [] - packetTables = self.packetTableCreator.getPacketTables( - minPacketTimestamp, maxPacketTimestamp) - - for packetTable in packetTables: - sql1 = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where map_id in (1,2,5,7,9,12) - and station_id in %s - and timestamp > %s - and timestamp <= %s - order by packet.marker_id, packet.id""", (tuple(stationIdList), int(minPacketTimestamp), int(maxPacketTimestamp))) - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql1) - for record in selectCursor: - if (record is not None): - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - - # Also add packets that has been replace but where position_timestamp was in or before period - sql2 = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where map_id = 12 - and station_id in %s - and position_timestamp <= %s - and timestamp > %s - order by packet.marker_id, packet.id""", (tuple(stationIdList), int(maxPacketTimestamp), int(maxPacketTimestamp))) - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql2) - for record in selectCursor: - if (record is not None): - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - - selectCursor.close() - return result - - def getObjectListByStationIdList(self, stationIdList, minPacketTimestamp): - """Returns an array of Packet's specified by station id's - Args: - stationIdList (array): Station id's to look for - minPacketTimestamp (int): Min requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - selectCursor = self.db.cursor() - result = [] - - packetTables = self.packetTableCreator.getPacketTables( - minPacketTimestamp) - for packetTable in packetTables: - sql = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where map_id in (1,5,7,9) - and station_id in %s""", (tuple(stationIdList),)) - - if (minPacketTimestamp != 0): - sql = sql + \ - selectCursor.mogrify( - """ and timestamp > %s""", (int(minPacketTimestamp),)) - - sql = sql + \ - selectCursor.mogrify( - """ order by packet.marker_id, packet.id""") - # Sort by marker_id first and packet as second, otherwise client might render it wrong - selectCursor.execute(sql) - - for record in selectCursor: - if (record is not None): - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - selectCursor.close() - return result - - def getLatestObjectByStationIdAndPosition(self, stationId, latitude, longitude, mapIdList, symbol=None, symbolTable=None, minTimestamp=0): - """Returns a packet object specified by station id and position (and map id, symbol and symbol table) - Args: - stationId (int): Station id to look for - latitude (double): Latitude - longitude (double): Longitude - mapIdList (int): Array of map id's to look for - symbol (str): Symbol char - symbolTable (str): Symbol table char - minTimestamp (int): Min requested unix timestamp - - Returns: - Packet - """ - selectCursor = self.db.cursor() - packetTables = self.packetTableCreator.getPacketTables(minTimestamp) - for packetTable in reversed(packetTables): - sql = selectCursor.mogrify("""select * - from """ + packetTable + """ - where station_id = %s - and latitude = %s - and longitude = %s - and map_id in %s""", (stationId, latitude, longitude, tuple(mapIdList),)) - - if (minTimestamp != 0): - sql = sql + \ - selectCursor.mogrify( - """ and timestamp > %s""", (int(minTimestamp),)) - - if (symbol is not None): - sql = sql + \ - selectCursor.mogrify(""" and symbol = %s""", (symbol,)) - - if (symbolTable is not None): - sql = sql + \ - selectCursor.mogrify( - """ and symbol_table = %s""", (symbolTable,)) - - sql = sql + \ - selectCursor.mogrify( - """ order by marker_id desc, id desc limit 1""") - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql) - record = selectCursor.fetchone() - - if (record is not None): - selectCursor.close() - return self.getObjectFromRecord(record) - selectCursor.close() - return self.create() - - def getLatestConfirmedMovingObjectByStationId(self, stationId, minTimestamp=0): - """Returns the latest confirmed moving Packet specified by station id - Args: - stationId (int): Station id to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Packet - """ - selectCursor = self.db.cursor() - packetTables = self.packetTableCreator.getPacketTables(minTimestamp) - for packetTable in reversed(packetTables): - sql = selectCursor.mogrify("""select * - from """ + packetTable + """ - where station_id = %s - and is_moving = 1 - and map_id = 1""", (stationId,)) - - if (minTimestamp != 0): - sql = sql + \ - selectCursor.mogrify( - """ and timestamp > %s""", (int(minTimestamp),)) - - sql = sql + \ - selectCursor.mogrify( - """ order by marker_id desc, id desc limit 1""") - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql) - record = selectCursor.fetchone() - - if (record is not None): - selectCursor.close() - return self.getObjectFromRecord(record) - selectCursor.close() - return self.create() - - def getLatestMovingObjectByStationId(self, stationId, minTimestamp=0): - """Returns the latest moving Packet specified by station id - Args: - stationId (int): Station id to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Packet - """ - selectCursor = self.db.cursor() - packetTables = self.packetTableCreator.getPacketTables(minTimestamp) - for packetTable in reversed(packetTables): - # We only look for map id 1 and 7 since we use this method to extend a moving marker - sql = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where station_id = %s - and is_moving = 1 - and map_id in (1,7)""", (stationId,)) - - if (minTimestamp != 0): - sql = sql + \ - selectCursor.mogrify( - """ and timestamp > %s""", (int(minTimestamp),)) - - sql = sql + \ - selectCursor.mogrify( - """ order by marker_id desc, id desc limit 1""") - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql) - - record = selectCursor.fetchone() - if (record is not None): - selectCursor.close() - return self.getObjectFromRecord(record) - selectCursor.close() - return self.create() - - def getLatestConfirmedObjectByStationId(self, stationId, minTimestamp=0): - """Returns the latest confirmed packet object specified by station id - Args: - stationId (int): Station id to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Packet - """ - selectCursor = self.db.cursor() - - sql = selectCursor.mogrify("""select * - from station - where station.id = %s""", (stationId,)) - - selectCursor.execute(sql) - record = selectCursor.fetchone() - selectCursor.close() - - if (record is not None and record["latest_confirmed_packet_timestamp"] is not None and record["latest_confirmed_packet_timestamp"] >= minTimestamp): - return self.getObjectByIdAndTimestamp(record["latest_confirmed_packet_id"], record["latest_confirmed_packet_timestamp"]) - else: - return self.create() - - def getLatestObjectByStationId(self, stationId, minTimestamp=0): - """Returns the latest Packet specified by station id (that has a location) - Args: - stationId (int): Station id to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Packet - """ - selectCursor = self.db.cursor() - - sql = selectCursor.mogrify("""select * - from station - where station.id = %s""", (stationId,)) - - selectCursor.execute(sql) - record = selectCursor.fetchone() - selectCursor.close() - - if (record is not None and record["latest_location_packet_timestamp"] is not None and record["latest_location_packet_timestamp"] >= minTimestamp): - return self.getObjectByIdAndTimestamp(record["latest_location_packet_id"], record["latest_location_packet_timestamp"]) - else: - return self.create() - - def getMostRecentConfirmedObjectListByStationIdList(self, stationIdList, minTimestamp): - """Returns an array of the most recent confirmed Packet's specified by station id's - - Note: - This method returnes the latest packet for moving stations and the latest packet for every uniqe position for stationary stations. - - Args: - stationIdList (array): Station id's to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - selectCursor = self.db.cursor() - result = [] - - # Stationary objects - packetTables = self.packetTableCreator.getPacketTables(minTimestamp) - for packetTable in packetTables: - sql = selectCursor.mogrify("""select * - from """ + packetTable + """ - where station_id in %s - and timestamp > %s - and is_moving = 0 - and map_id = 1""", (tuple(stationIdList), int(minTimestamp),)) - # Since we only should get one moving and all other should be stationary an "order by" should not be nessecery - selectCursor.execute(sql) - - for record in selectCursor: - if (record is not None): - packet = self.getObjectFromRecord(record) - result.append(packet) - - # Moving objects - for stationId in stationIdList: - packet = self.getLatestConfirmedMovingObjectByStationId( - stationId, minTimestamp) - if (packet.isExistingObject()): - result.append(packet) - - selectCursor.close() - return result - - def getMostRecentConfirmedObjectListByStationIdListAndTimeInterval(self, stationIdList, minTimestamp, maxTimestamp): - """Returns an array of the most recent confirmed Packet's specified by station id's - - Note: - This method returnes the latest packet for moving stations and the latest packet for every uniqe position for stationary stations. - - Args: - stationIdList (array): Station id's to look for - minTimestamp (int): Min requested unix timestamp - maxTimestamp (int): Max requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - - minTimestampRoundedQuarter = int( - minTimestamp) - (int(minTimestamp) % 900) - minTimestampRoundedDay = int( - minTimestamp) - (int(minTimestamp) % 86400) - - selectCursor = self.db.cursor() - result = [] - foundStationaryMarkerHashList = [] - foundMovingMarkerStationIdList = [] - - packetTables = self.packetTableCreator.getPacketTables( - minTimestamp, maxTimestamp) - for packetTable in reversed(packetTables): - # Stationary objects - sql = selectCursor.mogrify("""select * - from """ + packetTable + """ packet - where id in ( - select max(id) - from """ + packetTable + """ packet - where station_id in %s - and timestamp > %s - and timestamp <= %s - and is_moving = 0 - and map_id in (1,2,12) - group by station_id, latitude, longitude, symbol, symbol_table - )""", (tuple(stationIdList), int(minTimestamp), int(maxTimestamp))) - # Since we only should get one moving and all other should be stationary an "order by" should not be nessecery - selectCursor.execute(sql) - for record in selectCursor: - if (record is not None): - markerHash = hash(str(record['station_id']) + ';' + str(record['station_id']) + ';' + str( - record['latitude']) + ';' + str(record['longitude']) + ';' + record['symbol'] + ';' + record['symbol_table']) - if (markerHash not in foundStationaryMarkerHashList): - foundStationaryMarkerHashList.append(markerHash) - packet = self.getObjectFromRecord(record) - result.append(packet) - - # Moving objects - sql = selectCursor.mogrify("""select packet.* - from """ + packetTable + """ packet - where id in ( - select max(id) - from """ + packetTable + """ packet - where station_id in %s - and map_id in (1,2,12) - and packet.timestamp > %s - and packet.timestamp <= %s - and packet.is_moving = 1 - group by station_id - )""", (tuple(stationIdList), int(minTimestamp), int(maxTimestamp))) - # Since we only should get one moving and all other should be stationary an "order by" should not be nessecery - - selectCursor.execute(sql) - for record in selectCursor: - if (record is not None): - if (record['station_id'] not in foundMovingMarkerStationIdList): - foundMovingMarkerStationIdList.append( - record['station_id']) - - packet = self.getObjectFromRecord(record) - result.append(packet) - selectCursor.close() - return result - - def getLatestConfirmedObjectListByStationIdList(self, stationIdList, minTimestamp=0): - """Returns an array of the latest confirmed packet objects with specified station id's - - Args: - stationIdList (array): station id's to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - - result = [] - if (minTimestamp == 0): - # Apperantly we are looking for the latest no matter the age - for stationId in stationIdList: - packet = self.getLatestConfirmedObjectByStationId(stationId) - if (packet.isExistingObject()): - result.append(packet) - else: - selectCursor = self.db.cursor() - packetTables = self.packetTableCreator.getPacketTables( - minTimestamp) - - for packetTable in reversed(packetTables): - sql = selectCursor.mogrify("""select packet.* - from """ + packetTable + """ packet, station - where station.id in %s - and station.latest_confirmed_packet_id = packet.id - and station.latest_confirmed_packet_timestamp = packet.timestamp """, (tuple(stationIdList),)) - - if (minTimestamp != 0): - sql = sql + selectCursor.mogrify( - """ and station.latest_confirmed_packet_timestamp > %s""" % (int(minTimestamp),)) - - sql = sql + \ - selectCursor.mogrify( - """ order by packet.marker_id, packet.id""") - # Sort by marker_id first and packet as second, otherwise client might render it wrong - - selectCursor.execute(sql) - - for record in selectCursor: - if (record is not None): - result.append(self.getObjectFromRecord(record)) - - if (len(result) >= len(stationIdList)): - break - - selectCursor.close() - return result - - def getLatestObjectListByStationIdList(self, stationIdList, minTimestamp=0): - """Returns an array of the latest Packet's (that has a location) with specified station id's - - Args: - stationIdList (array): station id's to look for - minTimestamp (int): Min requested unix timestamp - - Returns: - Array - """ - if (len(stationIdList) == 0): - return [] - - result = [] - if (minTimestamp == 0): - # Apperantly we are looking for the latest no matter the age - for stationId in stationIdList: - packet = self.getLatestObjectByStationId(stationId) - if (packet.isExistingObject()): - result.append(packet) - - else: - selectCursor = self.db.cursor() - packetTables = self.packetTableCreator.getPacketTables( - minTimestamp) - for packetTable in reversed(packetTables): - sql = selectCursor.mogrify("""select packet.* - from """ + packetTable + """ packet, station - where station.id in %s - and station.latest_location_packet_id = packet.id - and station.latest_confirmed_packet_timestamp = packet.timestamp """, (tuple(stationIdList),)) - - if (minTimestamp != 0): - sql = sql + selectCursor.mogrify( - """ and station.latest_location_packet_timestamp > %s""" % (int(minTimestamp),)) - - selectCursor.execute(sql) - - for record in selectCursor: - if (record is not None): - result.append(self.getObjectFromRecord(record)) - - if (len(result) >= len(stationIdList)): - break - - selectCursor.close() - return result - - def getObjectFromRecord(self, record): - """Returns a packet object from a record - - Args: - record (dict): Database record dict to convert to a packet object - - Returns: - Packet - """ - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.stationId = int(record["station_id"]) - dbObject.senderId = int(record["sender_id"]) - dbObject.packetTypeId = record["packet_type_id"] - dbObject.timestamp = int(record["timestamp"]) - - if (record["latitude"] is not None): - dbObject.latitude = float(record["latitude"]) - else: - dbObject.latitude = None - - if (record["longitude"] is not None): - dbObject.longitude = float(record["longitude"]) - else: - dbObject.longitude = None - - dbObject.posambiguity = record['posambiguity'] - dbObject.symbol = record["symbol"] - dbObject.symbolTable = record["symbol_table"] - dbObject.mapSector = record["map_sector"] - dbObject.relatedMapSectors = record["related_map_sectors"] - dbObject.mapId = record["map_id"] - dbObject.sourceId = record["source_id"] - dbObject.markerId = record["marker_id"] - dbObject.speed = record["speed"] - dbObject.course = record["course"] - dbObject.altitude = record["altitude"] - dbObject.isMoving = record['is_moving'] - - if (record["reported_timestamp"] is not None): - dbObject.reportedTimestamp = int(record["reported_timestamp"]) - else: - dbObject.reportedTimestamp = record["reported_timestamp"] - - if (record["position_timestamp"] is not None): - dbObject.positionTimestamp = int(record["position_timestamp"]) - else: - dbObject.positionTimestamp = record["position_timestamp"] - - if ("packet_tail_timestamp" in record): - dbObject.packetTailTimestamp = record['packet_tail_timestamp'] - else: - dbObject.packetTailTimestamp = dbObject.timestamp - - if ("marker_counter" in record): - dbObject.markerCounter = record['marker_counter'] - else: - dbObject.markerCounter = 1 - - if ("comment" in record): - dbObject.comment = record['comment'] - else: - dbObject.comment = None - - if ("raw_path" in record): - dbObject.rawPath = record['raw_path'] - else: - dbObject.rawPath = None - - if ("raw" in record): - dbObject.raw = record['raw'] - else: - dbObject.raw = None - - if ("phg" in record): - dbObject.phg = record['phg'] - else: - dbObject.phg = None - - if ("rng" in record): - dbObject.rng = record['rng'] - else: - dbObject.rng = None - - if ("latest_phg_timestamp" in record): - dbObject.latestPhgTimestamp = record['latest_phg_timestamp'] - else: - dbObject.latestPhgTimestamp = None - - if ("latest_rng_timestamp" in record): - dbObject.latestRngTimestamp = record['latest_rng_timestamp'] - else: - dbObject.latestRngTimestamp = None - return dbObject - - def create(self): - """Creates an empty Packet - - Returns: - Packet - """ - return Packet(self.db) diff --git a/server/trackdirect/repositories/PacketTelemetryRepository.py b/server/trackdirect/repositories/PacketTelemetryRepository.py deleted file mode 100644 index c816f6a87d86ca1bad6097359a66b95720429616..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/PacketTelemetryRepository.py +++ /dev/null @@ -1,127 +0,0 @@ -import time - -from trackdirect.common.Repository import Repository -from trackdirect.objects.PacketTelemetry import PacketTelemetry -from trackdirect.database.PacketTelemetryTableCreator import PacketTelemetryTableCreator -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketTelemetryRepository(Repository): - """A Repository class for the PacketTelemetry class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.packetTelemetryTableCreator = PacketTelemetryTableCreator(self.db) - self.packetTelemetryTableCreator.disableCreateIfMissing() - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - PacketTelemetry - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from packet_telemetry where id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - - def getObjectByPacketIdAndTimestamp(self, id, timestamp): - """Returns an object based on the specified packet id in database - - Args: - id (int): Database row id - timestamp (int): Unix timestamp for requested packet - - Returns: - PacketTelemetry - """ - try: - table = self.packetTelemetryTableCreator.getPacketTelemetryTable( - timestamp) - selectCursor = self.db.cursor() - selectCursor.execute("""select * from """ + - table + """ where packet_id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - except TrackDirectMissingTableError as e: - return self.create() - - def getObjectFromRecord(self, record): - """Returns a packet telemetry object from a record - - Args: - record (dict): Database record dict to convert to a packet telemetry object - - Returns: - A packet telemetry object - """ - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.packetId = int(record["packet_id"]) - dbObject.stationId = int(record["station_id"]) - dbObject.timestamp = int(record["timestamp"]) - dbObject.val1 = int(record["val1"]) - dbObject.val2 = int(record["val2"]) - dbObject.val3 = int(record["val3"]) - dbObject.val4 = int(record["val4"]) - dbObject.val5 = int(record["val5"]) - dbObject.bits = int(record["bits"]) - dbObject.seq = int(record["seq"]) - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - PacketTelemetry - """ - newObject = self.create() - if ("telemetry" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.timestamp = int(time.time()) - 1 - - if ("vals" in data["telemetry"]): - newObject.val1 = data["telemetry"]["vals"][0] - newObject.val2 = data["telemetry"]["vals"][1] - newObject.val3 = data["telemetry"]["vals"][2] - newObject.val4 = data["telemetry"]["vals"][3] - newObject.val5 = data["telemetry"]["vals"][4] - - if ("bits" in data["telemetry"]): - newObject.bits = data["telemetry"]["bits"] - - if ("seq" in data["telemetry"]): - if isinstance(data["telemetry"]["seq"], str): - try: - newObject.seq = int(data["telemetry"]["seq"], 10) - except ValueError: - newObject.seq = None - elif isinstance(data["telemetry"]["seq"], int): - newObject.seq = data["telemetry"]["seq"] - return newObject - - def create(self): - """Creates an empty PacketTelemetry object - - Returns: - PacketTelemetry - """ - return PacketTelemetry(self.db) diff --git a/server/trackdirect/repositories/PacketWeatherRepository.py b/server/trackdirect/repositories/PacketWeatherRepository.py deleted file mode 100644 index df2f5058f6d5ff5467d1684227d566bc7013820f..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/PacketWeatherRepository.py +++ /dev/null @@ -1,139 +0,0 @@ -import datetime -import time - -from trackdirect.common.Repository import Repository -from trackdirect.objects.PacketWeather import PacketWeather -from trackdirect.database.PacketWeatherTableCreator import PacketWeatherTableCreator -from trackdirect.exceptions.TrackDirectMissingTableError import TrackDirectMissingTableError - - -class PacketWeatherRepository(Repository): - """A Repository class for the PacketWeather class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.packetWeatherTableCreator = PacketWeatherTableCreator(self.db) - self.packetWeatherTableCreator.disableCreateIfMissing() - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - PacketWeather - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from packet_weather where id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - - def getObjectByPacketIdAndTimestamp(self, id, timestamp): - """Returns an object based on the specified packet id in database - - Args: - id (int): Database row id - timestamp (int): Unix timestamp for requested packet (must be samt date as packet was received) - - Returns: - PacketWeather - """ - try: - table = self.packetWeatherTableCreator.getPacketWeatherTable( - timestamp) - selectCursor = self.db.cursor() - selectCursor.execute("""select * from """ + - table + """ where packet_id = %s""", (id,)) - record = selectCursor.fetchone() - selectCursor.close() - return self.getObjectFromRecord(record) - except TrackDirectMissingTableError as e: - return self.create() - - def getObjectFromRecord(self, record): - """Returns a packet weather object from a record - - Args: - record (dict): Database record dict to convert to a packet weather object - - Returns: - A packet weather object - """ - dbObject = PacketWeather(self.db) - if (record is not None): - dbObject.id = record["id"] - dbObject.packetId = int(record["packet_id"]) - dbObject.stationId = int(record["station_id"]) - dbObject.timestamp = int(record["timestamp"]) - dbObject.humidity = record["humidity"] - dbObject.pressure = record["pressure"] - dbObject.rain1h = record["rain_1h"] - dbObject.rain24h = record["rain_24h"] - dbObject.rainSinceMidnight = record["rain_since_midnight"] - dbObject.temperature = record["temperature"] - dbObject.windDirection = record["wind_direction"] - dbObject.windGust = record["wind_gust"] - dbObject.windSpeed = record["wind_speed"] - dbObject.luminosity = record["luminosity"] - dbObject.snow = record["snow"] - dbObject.wxRawTimestamp = record["wx_raw_timestamp"] - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - PacketWeather - """ - newObject = self.create() - if ("weather" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.timestamp = int(time.time()) - 1 - - if ("humidity" in data["weather"]): - newObject.humidity = data["weather"]["humidity"] - if ("pressure" in data["weather"]): - newObject.pressure = data["weather"]["pressure"] - if ("rain_1h" in data["weather"]): - newObject.rain1h = data["weather"]["rain_1h"] - if ("rain_24h" in data["weather"]): - newObject.rain24h = data["weather"]["rain_24h"] - if ("rain_since_midnight" in data["weather"]): - newObject.rainSinceMidnight = data["weather"]["rain_since_midnight"] - if ("temperature" in data["weather"]): - newObject.temperature = data["weather"]["temperature"] - if ("wind_direction" in data["weather"]): - newObject.windDirection = data["weather"]["wind_direction"] - if ("wind_gust" in data["weather"]): - newObject.windGust = data["weather"]["wind_gust"] - if ("wind_speed" in data["weather"]): - newObject.windSpeed = data["weather"]["wind_speed"] - if ("luminosity" in data["weather"]): - newObject.luminosity = data["weather"]["luminosity"] - if ("snow" in data["weather"]): - newObject.snow = data["weather"]["snow"] - if ("wx_raw_timestamp" in data["weather"]): - newObject.wxRawTimestamp = data["weather"]["wx_raw_timestamp"] - return newObject - - def create(self): - """Creates an empty PacketWeather object - - Returns: - PacketWeather - """ - return PacketWeather(self.db) diff --git a/server/trackdirect/repositories/SenderRepository.py b/server/trackdirect/repositories/SenderRepository.py deleted file mode 100644 index 44edc83e03020d7f16f44155288a09529d76fad9..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/SenderRepository.py +++ /dev/null @@ -1,167 +0,0 @@ -import logging -import collections -from trackdirect.common.Repository import Repository -from trackdirect.objects.Sender import Sender -from trackdirect.objects.Station import Station -from trackdirect.exceptions.TrackDirectMissingSenderError import TrackDirectMissingSenderError - - -class SenderRepository(Repository): - """A Repository class for the Sender class - """ - - # static class variables - senderIdCache = {} - senderNameCache = {} - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.logger = logging.getLogger('trackdirect') - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - Sender instance - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from sender where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = Sender(self.db) - if (record is not None): - dbObject.id = record["id"] - dbObject.name = record["name"] - else: - # sender do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectByName(self, name, createNewIfMissing=True, sourceId=None): - """Returns an object based on the specified name - - Args: - name (str): Name of the requested sender - createNewIfMissing (boolean): Set to true if sender should be created if it can not be found - - Returns: - Sender instance - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from sender where name = %s""", (name.strip(),)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.name = record["name"] - elif (createNewIfMissing): - # sender do not exists, create it - dbObject.name = name - dbObject.save() - - # Also create a related station - stationObject = Station(self.db) - stationObject.name = name - stationObject.sourceId = sourceId - stationObject.save() - - selectCursor.close() - return dbObject - - def getObjectByStationId(self, stationId): - """Returns an object based on the specified station id - - Args: - stationId (int): Id of the station - - Returns: - Sender instance - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from sender where id in (select latest_sender_id from station where id = %s)""", (stationId,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.name = record["name"] - - selectCursor.close() - return dbObject - - def getCachedObjectById(self, senderId): - """Get Sender based on sender id - - Args: - senderId (int): Id of the sender - - Returns: - Sender - """ - if (senderId not in SenderRepository.senderIdCache): - sender = self.getObjectById(senderId) - if (sender.isExistingObject()): - maxNumberOfSenders = 100 - if (len(SenderRepository.senderIdCache) > maxNumberOfSenders): - # reset cache - SenderRepository.senderIdCache = {} - SenderRepository.senderIdCache[senderId] = sender - return sender - else: - try: - return SenderRepository.senderIdCache[senderId] - except KeyError as e: - sender = self.getObjectById(senderId) - if (sender.isExistingObject()): - return sender - raise TrackDirectMissingSenderError( - 'No sender with specified id found') - - def getCachedObjectByName(self, senderName): - """Get Sender based on sender name - - Args: - senderName (string): Sender name - - Returns: - Sender - """ - if (senderName not in SenderRepository.senderNameCache): - sender = self.getObjectByName(senderName, False) - if (sender.isExistingObject()): - maxNumberOfSenders = 100 - if (len(SenderRepository.senderNameCache) > maxNumberOfSenders): - # reset cache - SenderRepository.senderNameCache = {} - SenderRepository.senderNameCache[senderName] = sender - return sender - else: - try: - return SenderRepository.senderNameCache[senderName] - except KeyError as e: - sender = self.getObjectByName(senderName, False) - if (sender.isExistingObject()): - return sender - raise TrackDirectMissingSenderError( - 'No sender with specified sender name found') - - def create(self): - """Creates an empty Sender object - - Returns: - Sender instance - """ - return Sender(self.db) diff --git a/server/trackdirect/repositories/StationRepository.py b/server/trackdirect/repositories/StationRepository.py deleted file mode 100644 index 24adde4840be456067ad9ad031ff9910cc2ed623..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/StationRepository.py +++ /dev/null @@ -1,375 +0,0 @@ -import collections -import datetime -import time -import calendar -from math import sin, cos, sqrt, atan2, radians, floor, ceil - -import logging -from twisted.python import log - -from trackdirect.common.Repository import Repository -from trackdirect.objects.Station import Station -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.database.PacketTableCreator import PacketTableCreator -from trackdirect.exceptions.TrackDirectMissingStationError import TrackDirectMissingStationError - - -class StationRepository(Repository): - """A Repository class for the Station class - """ - - # static class variables - stationIdCache = {} - stationNameCache = {} - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.logger = logging.getLogger('trackdirect') - self.dbObjectFinder = DatabaseObjectFinder(db) - self.packetTableCreator = PacketTableCreator(db) - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - Station - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from station where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject = self.getObjectFromRecord(record) - else: - # station do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectListByStationIdList(self, stationIdList): - """Returns a list of station objects - - Args: - stationIdList (int): Array of station ids - - Returns: - array - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from station where id in %s""", (tuple(stationIdList), )) - - result = [] - for record in selectCursor: - if (record is not None): - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - - selectCursor.close() - return result - - def getTinyObjectList(self): - """Returns a list of all station id's - - Args: - None - - Returns: - array - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select id, latest_packet_timestamp from station order by id""") - - result = [] - for record in selectCursor: - if (record is not None): - dbObject = self.create() - dbObject.id = int(record["id"]) - dbObject.latestPacketTimestamp = record["latest_packet_timestamp"] - result.append(dbObject) - selectCursor.close() - return result - - def getObjectList(self): - """Returns a list of all station object's - - Args: - None - - Returns: - array - """ - selectCursor = self.db.cursor() - selectCursor.execute("""select * from station order by id""") - - result = [] - for record in selectCursor: - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - selectCursor.close() - return result - - def getObjectListByName(self, name, stationTypeId=None, sourceId=None, minTimestamp=None): - """Returns a list of stations based on the specified name - - Args: - name (string): Name of station - stationTypeId (int): Station type id - sourceId (int): Station source id - - Returns: - array - """ - if (sourceId is not None and sourceId == 3): - # If source is "APRS DUPLICATE" we use "APRS" - sourceId = 1 - - if (minTimestamp is None): - minTimestamp = 0 - - selectCursor = self.db.cursor() - if (sourceId is not None and sourceId is not None): - selectCursor.execute("""select * - from station - where station_type_id = %s - and name = %s - and (source_id = %s or source_id is null) - and latest_confirmed_packet_timestamp > %s""", (stationTypeId, name, sourceId, minTimestamp,)) - elif (sourceId is not None): - selectCursor.execute("""select * - from station - where station_type_id = %s - and name = %s - and latest_confirmed_packet_timestamp > %s""", (stationTypeId, name, minTimestamp,)) - else: - selectCursor.execute("""select * - from station - where name = %s - and latest_confirmed_packet_timestamp > %s""", (name, minTimestamp,)) - - result = [] - for record in selectCursor: - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - selectCursor.close() - return result - - def getObjectByName(self, name, sourceId, stationTypeId=1, createNewIfMissing=True): - """Returns an object based on the specified name of the station - - Args: - name (str): Name of the station - sourceId (int): Station source id - createNewIfMissing (boolean): Set to true if a new station should be created if no one is found - - Returns: - Station - """ - if (sourceId == 3): - # If source is "APRS DUPLICATE" we use "APRS" - sourceId = 1 - - selectCursor = self.db.cursor() - if (sourceId is not None): - selectCursor.execute( - """select * from station where name = %s and (source_id is null or source_id = %s) order by id desc""", (name.strip(), sourceId)) - else: - selectCursor.execute( - """select * from station where name = %s order by id desc""", (name.strip())) - record = selectCursor.fetchone() - - # Make sure we at least have an empty object... - dbObject = self.create() - if (record is not None): - dbObject = self.getObjectFromRecord(record) - if (dbObject.sourceId is None and dbObject.sourceId != sourceId): - dbObject.sourceId = sourceId - dbObject.save() - if (dbObject.stationTypeId != stationTypeId and stationTypeId == 1): - dbObject.stationTypeId = stationTypeId - dbObject.save() - - elif (createNewIfMissing): - # station do not exists, create it - dbObject.name = name - dbObject.sourceId = sourceId - dbObject.stationTypeId = stationTypeId - dbObject.save() - - selectCursor.close() - return dbObject - - def getObjectListBySearchParameter(self, searchParameter, minTimestamp, limit): - """Returns an array of the latest packet objects specified by searchParameter - - Args: - searchParameter (str): String to use when searching for packets (will be compared to station name) - minTimestamp (int): Min unix timestamp - limit (int): Max number of hits - - Returns: - Array - """ - searchParameter = searchParameter.strip().replace('%', '\%').replace('*', '%') - selectCursor = self.db.cursor() - result = [] - - # Search for ogn registration - if (self.dbObjectFinder.checkTableExists('ogn_device')): - selectCursor.execute("""select * from ogn_device limit 1""") - record = selectCursor.fetchone() - if (record is not None): - selectCursor.execute("""select * from station where latest_confirmed_packet_timestamp is not null and latest_confirmed_packet_timestamp > %s and latest_ogn_sender_address is not null and exists (select 1 from ogn_device where registration ilike %s and device_id = station.latest_ogn_sender_address) limit %s""", (minTimestamp, searchParameter, (limit - len(result)), )) - for record in selectCursor: - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - - # Search for ogn sender address - if (len(result) < limit): - selectCursor.execute("""select * from station where latest_confirmed_packet_timestamp is not null and latest_confirmed_packet_timestamp > %s and latest_ogn_sender_address ilike %s limit %s""", - (minTimestamp, searchParameter, (limit - len(result)), )) - for record in selectCursor: - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - - # Search for station name - if (len(result) < limit): - selectCursor.execute("""select * from station where latest_confirmed_packet_timestamp is not null and latest_confirmed_packet_timestamp > %s and name ilike %s limit %s""", - (minTimestamp, searchParameter, (limit - len(result)), )) - for record in selectCursor: - dbObject = self.getObjectFromRecord(record) - result.append(dbObject) - - return result - - def getCachedObjectById(self, stationId): - """Get Station based on station id - - Args: - stationId (int): Id of the station - - Returns: - Station - """ - if (stationId not in StationRepository.stationIdCache): - station = self.getObjectById(stationId) - if (station.isExistingObject()): - maxNumberOfStations = 100 - if (len(StationRepository.stationIdCache) > maxNumberOfStations): - # reset cache - StationRepository.stationIdCache = {} - StationRepository.stationIdCache[stationId] = station - return station - else: - try: - return StationRepository.stationIdCache[stationId] - except KeyError as e: - station = self.getObjectById(stationId) - if (station.isExistingObject()): - return station - raise TrackDirectMissingStationError( - 'No station with specified id found') - - def getCachedObjectByName(self, stationName, sourceId): - """Get Station based on station name - - Args: - stationName (string): Station name - sourceId (int): Station source id - - Returns: - Station - """ - if (sourceId == 3): - # If source is "APRS DUPLICATE" we use "APRS" - sourceId = 1 - - if (sourceId is not None): - key = hash(stationName + ';' + str(sourceId)) - else: - key = hash(stationName) - if (key not in StationRepository.stationNameCache): - station = self.getObjectByName(stationName, sourceId, None, False) - if (station.isExistingObject()): - maxNumberOfStations = 100 - if (len(StationRepository.stationNameCache) > maxNumberOfStations): - # reset cache - StationRepository.stationNameCache = {} - StationRepository.stationNameCache[key] = station - return station - else: - try: - return StationRepository.stationNameCache[key] - except KeyError as e: - station = self.getObjectByName( - stationName, sourceId, None, False) - if (station.isExistingObject()): - return station - raise TrackDirectMissingStationError( - 'No station with specified station name found') - - def getObjectFromRecord(self, record): - """Returns a station object based on the specified database record dict - - Args: - record (dict): A database record dict from the station database table - - Returns: - Station - """ - dbObject = self.create() - if (record is not None): - dbObject.id = int(record["id"]) - dbObject.name = record["name"] - if (record["latest_sender_id"] is not None): - dbObject.latestSenderId = int(record["latest_sender_id"]) - dbObject.stationTypeId = int(record["station_type_id"]) - if (record["source_id"] is not None): - dbObject.sourceId = int(record["source_id"]) - - dbObject.latestLocationPacketId = record["latest_location_packet_id"] - dbObject.latestLocationPacketTimestamp = record["latest_location_packet_timestamp"] - - dbObject.latestConfirmedPacketId = record["latest_confirmed_packet_id"] - dbObject.latestConfirmedPacketTimestamp = record["latest_confirmed_packet_timestamp"] - dbObject.latestConfirmedSymbol = record["latest_confirmed_symbol"] - dbObject.latestConfirmedSymbolTable = record["latest_confirmed_symbol_table"] - dbObject.latestConfirmedLatitude = record["latest_confirmed_latitude"] - dbObject.latestConfirmedLongitude = record["latest_confirmed_longitude"] - dbObject.latestConfirmedMarkerId = record["latest_confirmed_marker_id"] - - dbObject.latestPacketId = record["latest_packet_id"] - dbObject.latestPacketTimestamp = record["latest_packet_timestamp"] - - dbObject.latestWeatherPacketId = record["latest_weather_packet_id"] - dbObject.latestWeatherPacketTimestamp = record["latest_weather_packet_timestamp"] - - dbObject.latestTelemetryPacketId = record["latest_telemetry_packet_id"] - dbObject.latestTelemetryPacketTimestamp = record["latest_telemetry_packet_timestamp"] - - dbObject.latestOgnPacketId = record["latest_ogn_packet_id"] - dbObject.latestOgnPacketTimestamp = record["latest_ogn_packet_timestamp"] - dbObject.latestOgnSenderAddress = record["latest_ogn_sender_address"] - dbObject.latestOgnAircraftTypeId = record["latest_ogn_aircraft_type_id"] - dbObject.latestOgnAddressTypeId = record["latest_ogn_address_type_id"] - - return dbObject - - def create(self): - """Creates an empty Station object - - Returns: - Station - """ - return Station(self.db) diff --git a/server/trackdirect/repositories/StationTelemetryBitsRepository.py b/server/trackdirect/repositories/StationTelemetryBitsRepository.py deleted file mode 100644 index 50dd87ec7f491935d1bc638a2e6e39932b603ea2..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/StationTelemetryBitsRepository.py +++ /dev/null @@ -1,75 +0,0 @@ -import datetime -import time -from trackdirect.common.Repository import Repository -from trackdirect.objects.StationTelemetryBits import StationTelemetryBits - - -class StationTelemetryBitsRepository(Repository): - """A Repository class for the StationTelemetryBits class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - StationTelemetryBits - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from station_telemetry_bits where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.stationId = record["station_id"] - dbObject.createdTs = record["created_ts"] - dbObject.latestTs = record["latest_ts"] - dbObject.validToTs = record["valid_to_ts"] - dbObject.bits = record["bits"] - dbObject.title = record["title"] - else: - # do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - StationTelemetryBits - """ - newObject = self.create() - if ("tBITS" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.createdTs = int(time.time()) - 1 - newObject.bits = data["tBITS"].replace('\x00', '') - newObject.title = data["title"].replace('\x00', '') - return newObject - - def create(self): - """Creates an empty StationTelemetryBits object - - Returns: - StationTelemetryBits - """ - return StationTelemetryBits(self.db) diff --git a/server/trackdirect/repositories/StationTelemetryEqnsRepository.py b/server/trackdirect/repositories/StationTelemetryEqnsRepository.py deleted file mode 100644 index 40df56f53234b865ae70b00f8f213834bcedc8bc..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/StationTelemetryEqnsRepository.py +++ /dev/null @@ -1,106 +0,0 @@ -import datetime -import time -from trackdirect.common.Repository import Repository -from trackdirect.objects.StationTelemetryEqns import StationTelemetryEqns - - -class StationTelemetryEqnsRepository(Repository): - """A Repository class for the StationTelemetryEqns class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - StationTelemetryEqns - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from station_telemetry_eqns where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.stationId = record["station_id"] - dbObject.createdTs = record["created_ts"] - dbObject.latestTs = record["latest_ts"] - dbObject.validToTs = record["valid_to_ts"] - dbObject.a1 = record["a1"] - dbObject.b1 = record["b1"] - dbObject.c1 = record["c1"] - dbObject.a2 = record["a2"] - dbObject.b2 = record["b2"] - dbObject.c2 = record["c2"] - dbObject.a3 = record["a3"] - dbObject.b3 = record["b3"] - dbObject.c3 = record["c3"] - dbObject.a4 = record["a4"] - dbObject.b4 = record["b4"] - dbObject.c4 = record["c4"] - dbObject.a5 = record["a5"] - dbObject.b5 = record["b5"] - dbObject.c5 = record["c5"] - else: - # do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - StationTelemetryEqns - """ - newObject = self.create() - if ("tEQNS" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.createdTs = int(time.time()) - 1 - - newObject.a1 = data["tEQNS"][0][0] - newObject.b1 = data["tEQNS"][0][1] - newObject.c1 = data["tEQNS"][0][2] - - newObject.a2 = data["tEQNS"][1][0] - newObject.b2 = data["tEQNS"][1][1] - newObject.c2 = data["tEQNS"][1][2] - - newObject.a3 = data["tEQNS"][2][0] - newObject.b3 = data["tEQNS"][2][1] - newObject.c3 = data["tEQNS"][2][2] - - newObject.a4 = data["tEQNS"][3][0] - newObject.b4 = data["tEQNS"][3][1] - newObject.c4 = data["tEQNS"][3][2] - - newObject.a5 = data["tEQNS"][4][0] - newObject.b5 = data["tEQNS"][4][1] - newObject.c5 = data["tEQNS"][4][2] - return newObject - - def create(self): - """Creates an empty StationTelemetryEqns object - - Returns: - StationTelemetryEqns - """ - return StationTelemetryEqns(self.db) diff --git a/server/trackdirect/repositories/StationTelemetryParamRepository.py b/server/trackdirect/repositories/StationTelemetryParamRepository.py deleted file mode 100644 index 39679954b6ff1b2ef6aac9c5d18e9e71f4ea13c9..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/StationTelemetryParamRepository.py +++ /dev/null @@ -1,97 +0,0 @@ -import datetime -import time -from trackdirect.common.Repository import Repository -from trackdirect.objects.StationTelemetryParam import StationTelemetryParam - - -class StationTelemetryParamRepository(Repository): - """A Repository class for the StationTelemetryParam class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - StationTelemetryParam - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from station_telemetry_param where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.stationId = record["station_id"] - dbObject.createdTs = record["created_ts"] - dbObject.latestTs = record["latest_ts"] - dbObject.validToTs = record["valid_to_ts"] - dbObject.p1 = record["p1"] - dbObject.p2 = record["p2"] - dbObject.p3 = record["p3"] - dbObject.p4 = record["p4"] - dbObject.p5 = record["p5"] - dbObject.b1 = record["b1"] - dbObject.b2 = record["b2"] - dbObject.b3 = record["b3"] - dbObject.b4 = record["b4"] - dbObject.b5 = record["b5"] - dbObject.b6 = record["b6"] - dbObject.b7 = record["b7"] - dbObject.b8 = record["b8"] - else: - # do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - StationTelemetryParam - """ - newObject = self.create() - if ("tPARM" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.createdTs = int(time.time()) - 1 - newObject.p1 = data["tPARM"][0].replace('\x00', '') - newObject.p2 = data["tPARM"][1].replace('\x00', '') - newObject.p3 = data["tPARM"][2].replace('\x00', '') - newObject.p4 = data["tPARM"][3].replace('\x00', '') - newObject.p5 = data["tPARM"][4].replace('\x00', '') - newObject.b1 = data["tPARM"][5].replace('\x00', '') - newObject.b2 = data["tPARM"][6].replace('\x00', '') - newObject.b3 = data["tPARM"][7].replace('\x00', '') - newObject.b4 = data["tPARM"][8].replace('\x00', '') - newObject.b5 = data["tPARM"][9].replace('\x00', '') - newObject.b6 = data["tPARM"][10].replace('\x00', '') - newObject.b7 = data["tPARM"][11].replace('\x00', '') - newObject.b8 = data["tPARM"][12].replace('\x00', '') - return newObject - - def create(self): - """Creates an empty StationTelemetryParam object - - Returns: - StationTelemetryParam - """ - return StationTelemetryParam(self.db) diff --git a/server/trackdirect/repositories/StationTelemetryUnitRepository.py b/server/trackdirect/repositories/StationTelemetryUnitRepository.py deleted file mode 100644 index 5ae6a4c8bb57f2f5a3decb83c49d5568921383a2..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/StationTelemetryUnitRepository.py +++ /dev/null @@ -1,99 +0,0 @@ -import datetime -import time -from trackdirect.common.Repository import Repository -from trackdirect.objects.StationTelemetryUnit import StationTelemetryUnit - - -class StationTelemetryUnitRepository(Repository): - """A Repository class for the StationTelemetryUnit class - """ - - def __init__(self, db): - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - - def getObjectById(self, id): - """The getObjectById method is supposed to return an object based on the specified id in database - - Args: - id (int): Database row id - - Returns: - StationTelemetryUnit - """ - selectCursor = self.db.cursor() - selectCursor.execute( - """select * from station_telemetry_unit where id = %s""", (id,)) - record = selectCursor.fetchone() - - dbObject = self.create() - if (record is not None): - dbObject.id = record["id"] - dbObject.stationId = record["station_id"] - dbObject.createdTs = record["created_ts"] - dbObject.latestTs = record["latest_ts"] - dbObject.validToTs = record["valid_to_ts"] - dbObject.u1 = record["u1"] - dbObject.u2 = record["u2"] - dbObject.u3 = record["u3"] - dbObject.u4 = record["u4"] - dbObject.u5 = record["u5"] - dbObject.l1 = record["l1"] - dbObject.l2 = record["l2"] - dbObject.l3 = record["l3"] - dbObject.l4 = record["l4"] - dbObject.l5 = record["l5"] - dbObject.l6 = record["l6"] - dbObject.l7 = record["l7"] - dbObject.l8 = record["l8"] - else: - # do not exists, return empty object - pass - - selectCursor.close() - return dbObject - - def getObjectFromPacketData(self, data): - """Create object from raw packet data - - Note: - stationId will not be set - - Args: - data (dict): Raw packet data - - Returns: - StationTelemetryUnit - """ - newObject = self.create() - if ("tUNIT" in data): - # Remove one second since that will give us a more accurate timestamp - newObject.createdTs = int(time.time()) - 1 - - newObject.u1 = data["tUNIT"][0].replace('\x00', '') - newObject.u2 = data["tUNIT"][1].replace('\x00', '') - newObject.u3 = data["tUNIT"][2].replace('\x00', '') - newObject.u4 = data["tUNIT"][3].replace('\x00', '') - newObject.u5 = data["tUNIT"][4].replace('\x00', '') - newObject.l1 = data["tUNIT"][5].replace('\x00', '') - newObject.l2 = data["tUNIT"][6].replace('\x00', '') - newObject.l3 = data["tUNIT"][7].replace('\x00', '') - newObject.l4 = data["tUNIT"][8].replace('\x00', '') - newObject.l5 = data["tUNIT"][9].replace('\x00', '') - newObject.l6 = data["tUNIT"][10].replace('\x00', '') - newObject.l7 = data["tUNIT"][11].replace('\x00', '') - newObject.l8 = data["tUNIT"][12].replace('\x00', '') - - return newObject - - def create(self): - """Creates an empty StationTelemetryUnit object - - Returns: - StationTelemetryUnit - """ - return StationTelemetryUnit(self.db) diff --git a/server/trackdirect/repositories/__init__.py b/server/trackdirect/repositories/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/repositories/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/websocket/WebsocketConnectionState.py b/server/trackdirect/websocket/WebsocketConnectionState.py deleted file mode 100644 index 2b7837208b0336d405b2b5ba1c26a77d0055a484..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/WebsocketConnectionState.py +++ /dev/null @@ -1,369 +0,0 @@ -import time -import trackdirect -from math import ceil -from trackdirect.parser.policies.MapSectorPolicy import MapSectorPolicy - -class WebsocketConnectionState(): - """An WebsocketConnectionState instance contains information about the current state of a websocket connection - """ - - def __init__(self) : - """The __init__ method. - """ - self.totalReset() - self.latestRequestType = None - self.latestRequestTimestamp = 0 - self.latestRequestId = 0 - self.latestHandledRequestId = 0 - self.config = trackdirect.TrackDirectConfig() - self.noRealTime = False - self.disconnected = False - - - def isReset(self) : - """Returns true if state just has been reset - - Returns: - Boolean - """ - return (not self.stationsOnMapDict - and not self.maxCompleteStationTimestampDict - and not self.maxAllStationTimestampDict - and not self.maxMapSectorPacketTimestampDict - and not self.maxMapSectorOverwritePacketTimestampDict) - - - def reset(self) : - """This function will reset information related to what stations that has been added to map - (this is for example used when the number of minutes is changed by the client) - """ - self.stationsOnMapDict = {} - self.maxCompleteStationTimestampDict = {} - self.maxAllStationTimestampDict = {} - self.maxMapSectorPacketTimestampDict = {} - self.maxMapSectorOverwritePacketTimestampDict = {} - - - def totalReset(self) : - """This function will reset everything - (this is for example used when client seems to be inactive and we just want to stop everything) - """ - self.reset() - self.latestMinutesRequest = 60 - self.latestTimeTravelRequest = None - self.onlyLatestPacketRequested = None - self.latestNeLat = 0 - self.latestNeLng = 0 - self.latestSwLat = 0 - self.latestSwLng = 0 - self.filterStationIdDict = {} - - - def isMapEmpty(self) : - """Returns true if map is empty - - Returns: - Boolean - """ - if (not self.maxMapSectorPacketTimestampDict - and not self.maxMapSectorOverwritePacketTimestampDict - and not self.maxCompleteStationTimestampDict - and not self.maxAllStationTimestampDict) : - return True - else : - return False - - - def isStationsOnMap(self, stationIds) : - """Returns true if all specified stations allready exists on map - - Args: - stationIds (int): The station id's that we are interested in - - Returns: - boolean - """ - for stationId in stationIds : - if (stationId not in self.stationsOnMapDict) : - return False - return True - - - def isStationHistoryOnMap(self, stationId) : - """Returns true if specified station allready has it's history on map - - Args: - stationId (int): The station id that we are interested in - - Returns: - boolean - """ - if (stationId not in self.maxCompleteStationTimestampDict) : - return False - else : - return True - - - def getStationLatestTimestampOnMap(self, stationId, onlyIncludeComplete = True) : - """Returns the timestamp of the latest sent packet to client - - Args: - stationId (int): The station id that we are interested in - onlyIncludeComplete (bool): When true we only return timestamp data for complete stations - - Returns: - boolean - """ - if (not onlyIncludeComplete and stationId in self.maxAllStationTimestampDict) : - return self.maxAllStationTimestampDict[stationId] - elif (stationId in self.maxCompleteStationTimestampDict) : - return self.maxCompleteStationTimestampDict[stationId] - else : - return None - - - def isValidLatestPosition(self) : - """Returns true if latest requested map bounds is valid - - Note: - If we received 0,0,0,0 as map bounds we should not send anything, - not even in filtering mode (filtering mode should send 90,180,-90,-180 when it wants data) - - Returns: - Boolean - """ - if (self.latestNeLat == 0 - and self.latestNeLng == 0 - and self.latestSwLat == 0 - and self.latestSwLng == 0) : - return False - else : - return True - - - def isMapSectorKnown(self, mapSector): - """Returns True if we have added any stations with complete history to this map sector - - Args: - mapSector (int): The map sector that we are interested in - - Returns: - Boolean - """ - if (mapSector in self.maxMapSectorPacketTimestampDict) : - return True - else : - return False - - - def getMapSectorTimestamp(self, mapSector) : - """Returns the latest handled timestamp in specified map sector (as a Unix timestamp as an integer) - - Args: - mapSector (int): The map sector that we are interested in - - Returns: - int - """ - if (mapSector in self.maxMapSectorPacketTimestampDict) : - return self.maxMapSectorPacketTimestampDict[mapSector]; - elif (self.onlyLatestPacketRequested and mapSector in self.maxMapSectorOverwritePacketTimestampDict) : - return self.maxMapSectorOverwritePacketTimestampDict[mapSector] - elif (self.latestTimeTravelRequest is not None) : - return int(self.latestTimeTravelRequest) - (int(self.latestMinutesRequest)*60) - else : - return int(time.time()) - (int(self.latestMinutesRequest)*60) - - - def getVisibleMapSectors(self) : - """Get the map sectors currently visible - - Returns: - Array of map sectors (array of integers) - """ - maxLat = self.latestNeLat - maxLng = self.latestNeLng - minLat = self.latestSwLat - minLng = self.latestSwLng - - result = [] - if (maxLng < minLng) : - result.extend(self.getMapSectorsByInterval(minLat, maxLat, minLng, 180.0)); - minLng = -180.0; - - result.extend(self.getMapSectorsByInterval(minLat, maxLat, minLng, maxLng)) - - # Add the world wide area code - # This seems to result in very bad performance.... - #result.append(99999999) - - return result[::-1] - - - def getMapSectorsByInterval(self, minLat, maxLat, minLng, maxLng) : - """Get the map sectors for specified interval - - Returns: - Array of map sectors (array of integers) - """ - result = [] - mapSectorPolicy = MapSectorPolicy() - minAreaCode = mapSectorPolicy.getMapSector(minLat,minLng) - maxAreaCode = mapSectorPolicy.getMapSector(maxLat,maxLng) - if (minAreaCode is not None and maxAreaCode is not None) : - lngDiff = int(ceil(maxLng)) - int(ceil(minLng)) - areaCode = minAreaCode - while (areaCode <= maxAreaCode) : - if (areaCode % 10 == 5) : - result.append(areaCode) - else : - result.append(areaCode) - result.append(areaCode + 5) - - for i in range(1, lngDiff+1) : - if (areaCode % 10 == 5) : - result.append(areaCode + (10*i) - 5) - result.append(areaCode + (10*i)) - else : - result.append(areaCode + (10*i)) - result.append(areaCode + (10*i) + 5) - - # Lat takes 0.2 jumps - areaCode = areaCode + 20000 - - return result - - - def setLatestMinutes(self, minutes, referenceTime) : - """Set the latest requested number of minutes, returnes true if something has changed - - Args: - minutes (int): latest requested number of minutes - referenceTime (int): latest requested reference time - - Returns: - Boolean - """ - if (minutes is None) : - minutes = 60 - elif (len(self.filterStationIdDict) == 0 - and int(minutes) > int(self.config.maxDefaultTime)) : - # max 24h - minutes = int(self.config.maxDefaultTime) - elif (len(self.filterStationIdDict) > 0 - and int(minutes) > int(self.config.maxFilterTime)) : - # max 10 days - minutes = int(self.config.maxFilterTime) - - if (not self.config.allowTimeTravel - and int(minutes) > int(1440)) : - # max 24h - minutes = 1440 - - if referenceTime is not None and referenceTime < 0 : - referenceTime = 0 - - changed = False - if (self.config.allowTimeTravel) : - if ((self.latestTimeTravelRequest is not None - and referenceTime is not None - and self.latestTimeTravelRequest != referenceTime) - or (self.latestTimeTravelRequest is not None - and referenceTime is None) - or (self.latestTimeTravelRequest is None - and referenceTime is not None)) : - self.latestTimeTravelRequest = referenceTime - self.reset() - changed = True - - if (self.latestMinutesRequest is None - or self.latestMinutesRequest != minutes) : - self.latestMinutesRequest = minutes - self.reset() - changed = True - return changed - - - def setOnlyLatestPacketRequested(self, onlyLatestPacketRequested) : - """Set if only latest packets is requested or not - - Args: - onlyLatestPacketRequested (Boolean): Boolean that sys if - - """ - self.onlyLatestPacketRequested = onlyLatestPacketRequested - - - def setLatestMapBounds(self, neLat, neLng, swLat, swLng) : - """Set map bounds requested by client - - Args: - neLat (float): Requested north east latitude - neLng (float): Requested north east longitude - swLat (float): Requested south west latitude - swLng (float): Requested south west longitude - """ - if (neLat is None or neLng is None or swLat is None or swLng is None) : - self.latestNeLat = 0 - self.latestNeLng = 0 - self.latestSwLat = 0 - self.latestSwLng = 0 - else : - self.latestNeLat = neLat - self.latestNeLng = neLng - self.latestSwLat = swLat - self.latestSwLng = swLng - - - def setMapSectorLatestOverwriteTimeStamp(self, mapSector, timestamp) : - """Set a new latest handled timestamp for a map sector (in this case the overwritable type of packets) - - Args: - mapSector (int): The map sector that we should add a new timestamp to - timestamp (int): The unix timestamp that should be added - """ - if (mapSector not in self.maxMapSectorOverwritePacketTimestampDict or self.maxMapSectorOverwritePacketTimestampDict[mapSector] < timestamp) : - self.maxMapSectorOverwritePacketTimestampDict[mapSector] = timestamp - - - def setMapSectorLatestTimeStamp(self, mapSector, timestamp) : - """Set a new latest handled timestamp for a map sector - - Args: - mapSector (int): The map sector that we should add a new timestamp to - timestamp (int): The unix timestamp that should be added - """ - if (mapSector not in self.maxMapSectorPacketTimestampDict or self.maxMapSectorPacketTimestampDict[mapSector] < timestamp) : - # To avoid that we miss packet that was recived later during the same second we mark map-sector to be complete for the previous second. - # This may result in that we sent the same apcket twice but client will handle that. - self.maxMapSectorPacketTimestampDict[mapSector] = timestamp - 1 - - - def setCompleteStationLatestTimestamp(self, stationId, timestamp) : - """Set a new latest handled timestamp for a complete station (a station with all packets added to map) - - Args: - stationId (int): The station that we add want to add a new timestamp for - timestamp (int): The unix timestamp that should be added - """ - if (stationId not in self.maxCompleteStationTimestampDict or self.maxCompleteStationTimestampDict[stationId] < timestamp) : - # For stations we do not need to set the previous second since a station is rarly sending several packets the same second - self.maxCompleteStationTimestampDict[stationId] = timestamp - - - def setStationLatestTimestamp(self, stationId, timestamp) : - """Set a new latest handled timestamp for station - - Args: - stationId (int): The station that we add want to add a new timestamp for - timestamp (int): The unix timestamp that should be added - """ - if (stationId not in self.maxAllStationTimestampDict or self.maxAllStationTimestampDict[stationId] < timestamp) : - # For stations we do not need to set the previous second since a station is rarly sending several packets the same second - self.maxAllStationTimestampDict[stationId] = timestamp - - - def disableRealTime(self) : - """Disable real time functionality - """ - self.noRealTime = True \ No newline at end of file diff --git a/server/trackdirect/websocket/WebsocketResponseCreator.py b/server/trackdirect/websocket/WebsocketResponseCreator.py deleted file mode 100644 index a572edc809adfa7715632c000afee97c2313eff7..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/WebsocketResponseCreator.py +++ /dev/null @@ -1,91 +0,0 @@ -import logging -from twisted.python import log - -from math import floor, ceil -import datetime, time - -import psycopg2, psycopg2.extras - -from trackdirect.websocket.responses.FilterResponseCreator import FilterResponseCreator -from trackdirect.websocket.responses.HistoryResponseCreator import HistoryResponseCreator -from trackdirect.websocket.responses.FilterHistoryResponseCreator import FilterHistoryResponseCreator - -class WebsocketResponseCreator(): - """The WebsocketResponseCreator will make sure that we create a response for every valid received request - """ - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (WebsocketConnectionState): WebsocketConnectionState instance that contains current state - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.state = state - - self.logger = logging.getLogger('trackdirect') - - self.filterResponseCreator = FilterResponseCreator(state, db) - self.historyResponseCreator = HistoryResponseCreator(state, db) - self.filterHistoryResponseCreator = FilterHistoryResponseCreator(state, db) - - def getResponses(self, request, requestId) : - """Process a received request - - Args: - request (dict): The request to process - requestId (int): Request id of processed request - - Returns: - generator - """ - try: - if (self.state.isReset()) : - yield self._getResetResponse() - - if (request["payload_request_type"] == 1 or request["payload_request_type"] == 11) : - yield self._getLoadingResponse() - if (len(self.state.filterStationIdDict) > 0) : - response = self.filterHistoryResponseCreator.getResponse() - if (response is not None) : - yield response - else : - for response in self.historyResponseCreator.getResponses(request, requestId) : - yield response - - elif (request["payload_request_type"] == 7) : - # Update request for single station - for response in self.historyResponseCreator.getResponses(request, requestId) : - yield response - - elif (request["payload_request_type"] in [4, 6, 8]) : - yield self._getLoadingResponse() - for response in self.filterResponseCreator.getResponses(request) : - yield response - - else : - self.logger.error('Request is not supported') - self.logger.error(request) - - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - self.logger.error(e, exc_info=1) - - def _getLoadingResponse(self) : - """This method creates a loading response - - Returns: - Dict - """ - return {'payload_response_type': 32} - - def _getResetResponse(self) : - """This method creates a reset response - - Returns: - Dict - """ - payload = {'payload_response_type': 40} - return payload diff --git a/server/trackdirect/websocket/__init__.py b/server/trackdirect/websocket/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/websocket/aprsis/AprsISPayloadCreator.py b/server/trackdirect/websocket/aprsis/AprsISPayloadCreator.py deleted file mode 100644 index 6f1158eb0d9ce4ef5b00bd8cacbb3c30cf17218f..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/aprsis/AprsISPayloadCreator.py +++ /dev/null @@ -1,175 +0,0 @@ -import logging - -import time - -import aprslib - -from trackdirect.parser.AprsPacketParser import AprsPacketParser - - -import trackdirect - -from trackdirect.exceptions.TrackDirectParseError import TrackDirectParseError - -from trackdirect.websocket.responses.ResponseDataConverter import ResponseDataConverter -from trackdirect.websocket.responses.HistoryResponseCreator import HistoryResponseCreator - - -class AprsISPayloadCreator(): - """The AprsISPayloadCreator creates a payload to send to client based on data received form the APRS-IS server - """ - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (ConnectionState): Instance of ConnectionState which contains the current state of the connection - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.logger = logging.getLogger('trackdirect') - self.state = state - self.db = db - self.responseDataConverter = ResponseDataConverter(state, db) - self.historyResponseCreator = HistoryResponseCreator(state, db) - self.config = trackdirect.TrackDirectConfig() - self.stationHashTimestamps = {} - - self.saveOgnStationsWithMissingIdentity = False - if (self.config.saveOgnStationsWithMissingIdentity) : - self.saveOgnStationsWithMissingIdentity = True - - - def getPayloads(self, line, sourceId): - """Takes a raw packet and returnes a dict with the parsed result - - Args: - line (string): The raw packet as a string - sourceId (int): The id of the source - - Returns: - generator - """ - try : - packet = self._parse(line, sourceId) - if (not self._isPacketValid(packet)) : - return - - if (packet.stationId not in self.state.stationsOnMapDict) : - self.state.stationsOnMapDict[packet.stationId] = True - - if (len(self.state.filterStationIdDict) > 0 and packet.stationId in self.state.filterStationIdDict) : - for response in self._getPreviousPacketsPayload(packet): - yield response - - yield self._getRealTimePacketPayload(packet) - except (aprslib.ParseError, aprslib.UnknownFormat, TrackDirectParseError) as exp: - # We could send the raw part even if we failed to parse it... - pass - except (UnicodeDecodeError) as exp: - # just forget about this packet - pass - - - def _parse(self, line, sourceId) : - """Parse packet raw - - Args: - line (string): The raw packet as a string - sourceId (int): The id of the source - - Returns: - Packet - """ - basicPacketDict = aprslib.parse(line) - parser = AprsPacketParser(self.db, self.saveOgnStationsWithMissingIdentity) - parser.setDatabaseWriteAccess(False) - parser.setSourceId(sourceId) - try : - packet = parser.getPacket(basicPacketDict) - if (packet.mapId == 15) : - return None - - if (packet.mapId == 4) : - # Looks like we don't have enough info in db to get a markerId, wait some and try again - time.sleep(1) - return parser.getPacket(basicPacketDict) - - return packet - except (aprslib.ParseError, aprslib.UnknownFormat, TrackDirectParseError) as exp: - return None - - - def _isPacketValid(self, packet) : - """Returns True if specified packet is valid to send to client - - Args: - packet (Packet): Found packet that we may want to send to client - - Returns: - True if specified packet is valid to send to client - """ - if (packet is None) : - return False - - if (packet.mapId == 4) : - return False - - if (packet.stationId is None) : - return False - - if (packet.markerId is None or packet.markerId == 1) : - return False - - if (packet.latitude is None or packet.longitude is None) : - return False - - if (len(self.state.filterStationIdDict) > 0) : - if (packet.stationId not in self.state.filterStationIdDict) : - # This packet does not belong to the station Id that the user is filtering on - return False - return True - - - def _getRealTimePacketPayload(self, packet) : - """Takes a packet received directly from APRS-IS and a creates a payload response - - Args: - packet (Packet): The packet direclty received from APRS-IS - - Returns: - Dict - """ - options = ["realtime"] - data = self.responseDataConverter.getResponseData([packet], None, options) - payload = {'payload_response_type': 2, 'data': data} - return payload - - - def _getPreviousPacketsPayload(self, packet) : - """Creates payload that contains previous packets for the station that has sent the specified packet - - Args: - packet (Packet): The packet direclty received from APRS-IS - - Returns: - generator - """ - latestTimestampOnMap = self.state.getStationLatestTimestampOnMap(packet.stationId) - if (latestTimestampOnMap is None) : - latestTimestampOnMap = 0 - latestTimestampOnMap = latestTimestampOnMap + 5 - if (self.state.isStationHistoryOnMap(packet.stationId) - and packet.markerPrevPacketTimestamp is not None - and packet.timestamp > latestTimestampOnMap - and packet.markerPrevPacketTimestamp > latestTimestampOnMap) : - # Ups! We got a problem, the previous packet for this station has not been sent to client - # If no packets at all had been sent we would have marked the realtime-packet to be overwritten, - # but now we have a missing packet from current station that may never be sent! - # Send it now! This may result in that we send the same packet twice (but client should handle that) - request = {} - request["station_id"] = packet.stationId - request["payload_request_type"] = 7 - - # This request will send all packets that is missing (maybe also this real-time packet, but we can live with that...) - for response in self.historyResponseCreator.getResponses(request, None) : - yield response diff --git a/server/trackdirect/websocket/aprsis/AprsISReader.py b/server/trackdirect/websocket/aprsis/AprsISReader.py deleted file mode 100644 index a5be779c2b23bd221f376f3d6808b5401747c912..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/aprsis/AprsISReader.py +++ /dev/null @@ -1,174 +0,0 @@ -import logging -import trackdirect - -from trackdirect.parser.AprsISConnection import AprsISConnection -from trackdirect.repositories.SenderRepository import SenderRepository - -class AprsISReader(): - """The AprsISReader class will connect to a APRS-IS server and listen for APRS-packets - """ - - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (ConnectionState): Instance of ConnectionState which contains the current state of the connection - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.state = state - self.latestRealTimeFilter = None - - self.senderRepository = SenderRepository(db) - - self.aprsISConnection1 = None - self.aprsISConnection2 = None - - self.logger = logging.getLogger('trackdirect') - self.config = trackdirect.TrackDirectConfig() - - - def start(self): - """Connect to APRS-IS servers based on current state - """ - self._connect() - self._modifyFilter() - - - def read(self, callback) : - """Read data from the APRS-IS servers, specified callback will be called once for every waiting packet - - Args: - callback (method): Method to call when we read a packet from the APRS IS connection - - Note: - Callback function is expecting to take 2 arguments, the "packet raw" as a string and a "source id" as an integer - """ - try : - if (self.aprsISConnection1 is not None or self.aprsISConnection2 is not None) : - def aprsISCallback1(line) : - callback(line, self.config.websocketAprsSourceId1) - - def aprsISCallback2(line) : - callback(line, self.config.websocketAprsSourceId2) - - if (self.aprsISConnection2 is not None) : - self.aprsISConnection2.filteredConsumer(aprsISCallback2, False, True) - - if (self.aprsISConnection1 is not None) : - self.aprsISConnection1.filteredConsumer(aprsISCallback1, False, True) - except IOError as e: - callback(None, None) - except Exception as e: - self.logger.error(e, exc_info=1) - callback(None, None) - - - def pause(self) : - """Pause without closing the aprsISConnection, we just set filter to nothing, that will result in no received packets - """ - if (self.aprsISConnection1 is not None) : - self.latestRealTimeFilter = None - self.aprsISConnection1.set_filter('') - - if (self.aprsISConnection2 is not None) : - self.latestRealTimeFilter = None - self.aprsISConnection2.set_filter('') - - - def stop(self): - """Kill the connections to the APRS-IS servers - """ - if (self.aprsISConnection2 is not None) : - self.aprsISConnection2.close() - self.aprsISConnection2 = None - - if (self.aprsISConnection1 is not None) : - self.aprsISConnection1.close() - self.aprsISConnection1 = None - - - def clear(self, limit = None): - """Clear the socket from all waiting lines - - Args: - limit (int): Max number of packets to clear (per connection) - """ - counter1 = 0 - counter2 = 0 - if (self.aprsISConnection2 is not None) : - for line in self.aprsISConnection1._socket_readlines(False): - counter1 += 1 - if (limit is not None and counter1 >= limit) : - break - if (self.aprsISConnection1 is not None) : - for line in self.aprsISConnection1._socket_readlines(False): - counter2 += 1 - if (limit is not None and counter2 >= limit) : - break - return counter1 + counter2 - - - def _connect(self): - """Connect to APRS-IS servers (if not allready connected) - """ - if (self.aprsISConnection1 is None) : - self.latestRealTimeFilter = None - # Avoid using a verified user since server will not accept two verfied users with same name - if (self.config.websocketAprsHost1 is not None) : - try: - self.aprsISConnection1 = AprsISConnection("NOCALL", "-1", self.config.websocketAprsHost1, self.config.websocketAprsPort1) - if (self.config.websocketFrequencyLimit != 0) : - self.aprsISConnection1.setFrequencyLimit(self.config.websocketFrequencyLimit) - self.aprsISConnection1.connect() - except Exception as e: - self.logger.error(e, exc_info=1) - - if (self.aprsISConnection2 is None) : - self.latestRealTimeFilter = None - # Avoid using a verified user since server will not accept two verfied users with same name - if (self.config.websocketAprsHost2 is not None) : - try: - self.aprsISConnection2 = AprsISConnection("NOCALL", "-1", self.config.websocketAprsHost2, self.config.websocketAprsPort2) - if (self.config.websocketFrequencyLimit != 0) : - self.aprsISConnection2.setFrequencyLimit(self.config.websocketFrequencyLimit) - self.aprsISConnection2.connect() - except Exception as e: - self.logger.error(e, exc_info=1) - - - def _modifyFilter(self) : - """Set a new filter for the APRS-IS connections according to the latest requested map bounds - """ - newFilter = self._getNewFilter() - if (self.latestRealTimeFilter is not None and newFilter == self.latestRealTimeFilter) : - # If new filter is equal to latest, do not do anything - return - - # Just empty any waiting data on socket - self.clear() - - self.latestRealTimeFilter = newFilter - if (self.aprsISConnection1 is not None) : - self.aprsISConnection1.set_filter(newFilter) - - if (self.aprsISConnection2 is not None) : - self.aprsISConnection2.set_filter(newFilter) - - - def _getNewFilter(self) : - """Create new APRS-IS filter based latest requested map bounds - """ - if (len(self.state.filterStationIdDict) > 0) : - filter = "b" - for stationId in self.state.filterStationIdDict: - sender = self.senderRepository.getObjectByStationId(stationId) - if (sender.name is not None) : - call, sep, ssid = sender.name.partition('-') - filter = filter + "/" + sender.name - else : - # We add some area arround current view - #filter = "a/" + str(self.state.latestNeLat+1) + "/" + str(self.state.latestSwLng-2) + "/" + str(self.state.latestSwLat-1) + "/" + str(self.state.latestNeLng+2) - filter = "a/" + str(self.state.latestNeLat+0.1) + "/" + str(self.state.latestSwLng-0.1) + "/" + str(self.state.latestSwLat-0.1) + "/" + str(self.state.latestNeLng+0.1) - - return filter diff --git a/server/trackdirect/websocket/aprsis/__init__.py b/server/trackdirect/websocket/aprsis/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/aprsis/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/websocket/queries/MissingPacketsQuery.py b/server/trackdirect/websocket/queries/MissingPacketsQuery.py deleted file mode 100644 index 9a836c924b831ad5f3280144439765ebdf906802..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/queries/MissingPacketsQuery.py +++ /dev/null @@ -1,169 +0,0 @@ -import datetime, time, calendar -from trackdirect.repositories.PacketRepository import PacketRepository -from trackdirect.repositories.StationRepository import StationRepository -from trackdirect.parser.policies.MapSectorPolicy import MapSectorPolicy - -class MissingPacketsQuery() : - """This query class is used to find a packet for all stations that we are missing a packet for (when we rely need a packet for them) - - Note: - If no packet are found we will simulate them - """ - - def __init__(self, state, db) : - """The __init__ method. - - Args: - state (WebsocketConnectionState): The current state for a websocket connection - db (psycopg2.Connection): Database connection - """ - self.state = state - self.db = db - self.packetRepository = PacketRepository(db) - self.stationRepository = StationRepository(db) - self.simulateEmptyStation = False - - - def enableSimulateEmptyStation(self) : - """Enable simulation even if we have no packet from station at all - """ - self.simulateEmptyStation = True - - - def getMissingPackets(self, stationIds, foundPackets) : - """Fetch latest packets for stations that has no packet in foundPackets - - Args: - stationIds (array): An array of all stations we should filter on - foundPackets (array): Packets that we have found - - Returns: - array - """ - foundMissingPackets = [] - for stationId in stationIds : - foundStationPacket = False - for packet in foundPackets : - if packet.stationId == stationId : - foundStationPacket = True - break # will go to next stationId - - # Get latest packet for this station - if (not foundStationPacket) : - missingPacket = self._getLatestPacket(stationId) - if (missingPacket is not None) : - foundMissingPackets.append(missingPacket) - - def getSortKey(item) : - return item.timestamp - return sorted(foundMissingPackets, key = getSortKey) - - - def _getLatestPacket(self, stationId) : - """This method tries to find a packet for the specified station, in worst case a packet will be simulated based on old data - - Args: - stationId (int): Stations id that we need a packet for - - Returns: - Packet - """ - if (self.state.latestTimeTravelRequest is not None) : - ts = int(self.state.latestTimeTravelRequest) - (30*24*60*60) # For time travelers we need a limit - olderPackets = self.packetRepository.getLatestObjectListByStationIdListAndTimeInterval([stationId], ts, self.state.latestTimeTravelRequest) - else : - olderPackets = self.packetRepository.getLatestConfirmedObjectListByStationIdList([stationId], 0) - - if (len(olderPackets) > 0) : - return olderPackets[0] # The lastet is the first in array - else : - # Lets try not confirmed packets - if (self.state.latestTimeTravelRequest is not None) : - ts = int(self.state.latestTimeTravelRequest) - (30*24*60*60) # For time travelers we need a limit - olderNonConfirmedPackets = self.packetRepository.getLatestObjectListByStationIdListAndTimeInterval([stationId], ts, self.state.latestTimeTravelRequest, False) - else : - olderNonConfirmedPackets = self.packetRepository.getLatestObjectListByStationIdList([stationId], 0) - - if (len(olderNonConfirmedPackets) > 0) : - # Make this ghost-packet visible... - packet = olderNonConfirmedPackets[0] - packet.mapId = 1 - packet.sourceId = 0 #simulated - return packet - else : - # We still do not have packets for this station, just get what we have from the station-table - return self._getSimulatedPacket(stationId) - return None - - - def _getSimulatedPacket(self, stationId) : - """Creates a simulated packet based on data saved in the station table - - Args: - stationId (int): The station that we want a packet from - - Returns: - Packet - """ - station = self.stationRepository.getObjectById(stationId) - if (station.isExistingObject() - and (station.latestConfirmedPacketId is not None - or self.simulateEmptyStation)) : - packet = self.packetRepository.create() - packet.stationId = station.id - packet.senderId = station.latestSenderId - packet.sourceId = station.sourceId - packet.ogn_sender_address = station.latestOgnSenderAddress - - if (station.latestConfirmedPacketId is not None) : - packet.id = station.latestConfirmedPacketId - else : - packet.id = -station.id # simulate a packet id that is uniqe - - if (station.latestConfirmedMarkerId is not None) : - packet.markerId = station.latestConfirmedMarkerId - else : - packet.markerId = -station.id # simulate a marker id - - packet.isMoving = 0 - packet.packetTypeId = 1 # Assume it was a position packet... - - if (station.latestConfirmedLatitude is not None and station.latestConfirmedLongitude is not None) : - packet.latitude = station.latestConfirmedLatitude - packet.longitude = station.latestConfirmedLongitude - else : - packet.latitude = float(0.0) - packet.longitude = float(0.0) - - if (self.state.latestTimeTravelRequest is not None) : - packet.timestamp = 0 # don't know anything better to set here... - elif (station.latestConfirmedPacketTimestamp is not None) : - packet.timestamp = station.latestConfirmedPacketTimestamp - else : - packet.timestamp = 0 - - packet.reportedTimestamp = None - packet.positionTimestamp = packet.timestamp - packet.posambiguity = 0 - - if (station.latestConfirmedSymbol is not None and station.latestConfirmedSymbolTable is not None) : - packet.symbol = station.latestConfirmedSymbol - packet.symbolTable = station.latestConfirmedSymbolTable - else : - packet.symbol = None - packet.symbolTable = None - - mapSectorPolicy = MapSectorPolicy() - packet.mapSector = mapSectorPolicy.getMapSector(packet.latitude, packet.longitude) - packet.relatedMapSectors = [] - packet.mapId = 1 - packet.speed = None - packet.course = None - packet.altitude = None - packet.packetTailTimestamp = packet.timestamp - packet.comment = None - packet.rawPath = None - packet.raw = None - - return packet - return None diff --git a/server/trackdirect/websocket/queries/MostRecentPacketsQuery.py b/server/trackdirect/websocket/queries/MostRecentPacketsQuery.py deleted file mode 100644 index ca2a4f63136e882798552cf2030c734ebd05b024..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/queries/MostRecentPacketsQuery.py +++ /dev/null @@ -1,59 +0,0 @@ -import datetime, time, calendar -from trackdirect.repositories.PacketRepository import PacketRepository -from trackdirect.websocket.queries.MissingPacketsQuery import MissingPacketsQuery - - -class MostRecentPacketsQuery() : - """This query class returnes the latest packet for moving stations and the latest packet for every uniqe position for stationary stations. - - Note: - If no packet are found we will simulate them - """ - - def __init__(self, state, db) : - """The __init__ method. - - Args: - state (WebsocketConnectionState): The current state for a websocket connection - db (psycopg2.Connection): Database connection - """ - self.state = state - self.db = db - self.packetRepository = PacketRepository(db) - self.simulateEmptyStation = False - - - def enableSimulateEmptyStation(self) : - """Enable simulation even if we have no packet from station at all - """ - self.simulateEmptyStation = True - - - def getPackets(self, stationIds) : - """Fetch the most recent packets for the specified stations. - Returns the latest packet for moving stations and the latest packet for every uniqe position for stationary stations. - - Args: - stationIds (array): An array of all stations we want packets for - - Returns: - array - """ - if (self.state.latestTimeTravelRequest is not None) : - timestamp = int(self.state.latestTimeTravelRequest) - (int(self.state.latestMinutesRequest)*60) - packets = self.packetRepository.getMostRecentConfirmedObjectListByStationIdListAndTimeInterval(stationIds, timestamp, self.state.latestTimeTravelRequest) - else : - timestamp = int(time.time()) - (int(self.state.latestMinutesRequest)*60) - packets = self.packetRepository.getMostRecentConfirmedObjectListByStationIdList(stationIds, timestamp) - - if (len(packets) < len(stationIds)) : - # If we have no recent markers we just send the latest that we have - query = MissingPacketsQuery(self.state, self.db) - if (self.simulateEmptyStation) : - query.enableSimulateEmptyStation() - - foundMissingPackets = query.getMissingPackets(stationIds, packets) - if (foundMissingPackets) : - foundMissingPackets.extend(packets) - packets = foundMissingPackets - return packets diff --git a/server/trackdirect/websocket/queries/StationIdByMapSectorQuery.py b/server/trackdirect/websocket/queries/StationIdByMapSectorQuery.py deleted file mode 100644 index 2a44a0fef9a34dbd537518c4636d5c6f2a179dc1..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/queries/StationIdByMapSectorQuery.py +++ /dev/null @@ -1,77 +0,0 @@ -import datetime, time, calendar -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder - - -class StationIdByMapSectorQuery() : - """A query class used to find station ids in a map sector - """ - - def __init__(self, db) : - """The __init__ method. - - Args: - db (psycopg2.Connection): Database connection - """ - self.db = db - self.dbObjectFinder = DatabaseObjectFinder(db) - - def getStationIdListByMapSector(self, mapSector, startPacketTimestamp, endPacketTimestamp) : - """Returns a list station ids based on the specified map sector and time interval - - Args: - mapSector (int): Map sector integer - startPacketTimestamp (int): Min unix timestamp - endPacketTimestamp (int): Max unix timestamp - - Returns: - array - """ - result = {} - selectCursor = self.db.cursor() - - # Create list of packet tables to look in - # After testing I have realized that this query is faster if you query one child table at the time - - if (endPacketTimestamp is None): - endPacketTimestamp = int(time.time()) - endDateTime = datetime.datetime.utcfromtimestamp(int(endPacketTimestamp)) - endDateTime = endDateTime.replace(hour=0, minute=0, second=0, microsecond=0) + datetime.timedelta(days=1) - endTimestamp = calendar.timegm(endDateTime.timetuple()) - - packetTables = [] - ts = startPacketTimestamp - while (ts < endTimestamp) : - date = datetime.datetime.utcfromtimestamp(int(ts)).strftime('%Y%m%d') - datePacketTable = 'packet' + date - if (self.dbObjectFinder.checkTableExists(datePacketTable)) : - packetTables.append(datePacketTable) - ts = ts + 86400 # 1 day in seconds - - # Go through packet tables and search for stations - for packetTable in reversed(packetTables) : - sql1 = selectCursor.mogrify("""select distinct station_id id - from """ + packetTable + """ - where map_sector = %s - and timestamp > %s - and timestamp <= %s - and map_id in (1,5,7,9)""", (mapSector, startPacketTimestamp, endPacketTimestamp)) - - selectCursor.execute(sql1) - for record in selectCursor : - if (record is not None) : - result[int(record["id"])] = True - - sql2 = selectCursor.mogrify("""select distinct station_id id - from """ + packetTable + """ - where map_sector = %s - and position_timestamp <= %s - and timestamp > %s - and map_id in (12)""", (mapSector, endPacketTimestamp, startPacketTimestamp)) - - selectCursor.execute(sql2) - for record in selectCursor : - if (record is not None) : - result[int(record["id"])] = True - - selectCursor.close() - return list(result.keys()) \ No newline at end of file diff --git a/server/trackdirect/websocket/queries/__init__.py b/server/trackdirect/websocket/queries/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/queries/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/server/trackdirect/websocket/responses/FilterHistoryResponseCreator.py b/server/trackdirect/websocket/responses/FilterHistoryResponseCreator.py deleted file mode 100644 index 122e7c5b6c35b24bcaa777a69c218ff72438dbfd..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/responses/FilterHistoryResponseCreator.py +++ /dev/null @@ -1,84 +0,0 @@ -import logging -from twisted.python import log - -from math import floor, ceil -import datetime, time -import psycopg2, psycopg2.extras - -from trackdirect.repositories.PacketRepository import PacketRepository - -from trackdirect.websocket.queries.MissingPacketsQuery import MissingPacketsQuery -from trackdirect.websocket.responses.ResponseDataConverter import ResponseDataConverter - -class FilterHistoryResponseCreator(): - """The FilterHistoryResponseCreator class creates history responses for stations that we are filtering on - """ - - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (WebsocketConnectionState): WebsocketConnectionState instance that contains current state - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.state = state - self.logger = logging.getLogger('trackdirect') - - self.db = db - self.responseDataConverter = ResponseDataConverter(state, db) - self.packetRepository = PacketRepository(db) - - - def getResponse(self) : - """Returns a filter history response - - Returns: - Dict - """ - filterStationIds = self.state.filterStationIdDict.keys() - - # When filtering we send everything in the same packet - # We need to do this since we do not send related objects, - # if user is filtering on two related OBJECTS they need to be sent together - packets = self._getPackets(filterStationIds) - - # If map is empty we need to make sure that all specified stations is included - if (self.state.isMapEmpty()) : - query = MissingPacketsQuery(self.state, self.db) - query.enableSimulateEmptyStation() - sortedFoundMissingPackets = query.getMissingPackets(filterStationIds, packets) - sortedFoundMissingPackets.extend(packets) - packets = sortedFoundMissingPackets - - if (packets) : - data = self.responseDataConverter.getResponseData(packets, []) - payload = {'payload_response_type': 2, 'data': data} - return payload - - - def _getPackets(self, stationIds) : - """Returns packets to be used in a filter history response - - Args: - stationIds (array): The station id's that we want history data for - - Returns: - array - """ - minTimestamp = None - if (len(stationIds) > 0) : - minTimestamp = self.state.getStationLatestTimestampOnMap(list(stationIds)[0]) - if (minTimestamp is None) : - minTimestamp = self.state.getMapSectorTimestamp(None) # None as argument is useful even when not dealing with map-sectors - if (len(stationIds) > 1) : - for stationId in stationIds : - timestamp = self.state.getStationLatestTimestampOnMap(stationId) - if (timestamp is not None and timestamp > minTimestamp) : - minTimestamp = timestamp - - if (self.state.latestTimeTravelRequest is not None) : - if (not self.state.isStationsOnMap(stationIds)) : - return self.packetRepository.getObjectListByStationIdListAndTimeInterval(stationIds, minTimestamp, self.state.latestTimeTravelRequest) - else : - return self.packetRepository.getObjectListByStationIdList(stationIds, minTimestamp) diff --git a/server/trackdirect/websocket/responses/FilterResponseCreator.py b/server/trackdirect/websocket/responses/FilterResponseCreator.py deleted file mode 100644 index e4a5508dd55f1e33f7aaba5d410b91d5e5c086a4..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/responses/FilterResponseCreator.py +++ /dev/null @@ -1,144 +0,0 @@ -import logging - -import time - - -import trackdirect - -from trackdirect.repositories.PacketRepository import PacketRepository -from trackdirect.repositories.StationRepository import StationRepository - -from trackdirect.websocket.queries.MostRecentPacketsQuery import MostRecentPacketsQuery -from trackdirect.websocket.responses.ResponseDataConverter import ResponseDataConverter - - -class FilterResponseCreator(): - """The FilterResponseCreator is used to create filter responses, a response sent to client when client wants to filter on a station - """ - - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (WebsocketConnectionState): WebsocketConnectionState instance that contains current state - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.state = state - self.db = db - self.logger = logging.getLogger('trackdirect') - self.responseDataConverter = ResponseDataConverter(state, db) - self.packetRepository = PacketRepository(db) - self.stationRepository = StationRepository(db) - self.config = trackdirect.TrackDirectConfig() - - - def getResponses(self, request) : - """Creates responses related to a filter request - - Args: - request (dict): The request to process - - Returns: - generator - """ - self._updateState(request) - if (self.state.isReset()) : - yield self._getResetResponse() - yield self._getFilterResponse() - - - def _updateState(self, request) : - """Update connection state based on filter request - - Args: - request (dict): The request to process - """ - if (request["payload_request_type"] == 4 and "list" in request) : - if (len(request["list"]) > 0) : - for stationId in request["list"]: - # Only send data about specified objects - self.state.filterStationIdDict[int(stationId)] = True - else : - # User wants to see everything again - self.state.filterStationIdDict = {} - self.state.setLatestMapBounds(0, 0, 0, 0) - self.state.setLatestMinutes(60, None) - self.state.reset() - - elif (request["payload_request_type"] == 6 and "station_id" in request) : - self.state.filterStationIdDict.pop(int(request["station_id"]), None) - self.state.reset() - - elif (request["payload_request_type"] == 8 and "namelist" in request) : - if (len(request["namelist"]) > 0) : - minTimestamp = int(time.time()) - (10*365*24*60*60) - if (not self.config.allowTimeTravel) : - minTimestamp = int(time.time()) - (24*60*60) - - for stationName in request["namelist"]: - # Only send data about specified objects - stations = self.stationRepository.getObjectListByName(stationName, None, None, minTimestamp) - for station in stations: - self.state.filterStationIdDict[int(station.id)] = True - else : - # User wants to see everything again - self.state.filterStationIdDict = {} - self.state.setLatestMapBounds(0, 0, 0, 0) - self.state.setLatestMinutes(60, None) - self.state.reset() - - def _getResetResponse(self) : - """This method creates a reset response - - Returns: - Dict - """ - payload = {'payload_response_type': 40} - return payload - - - def _getFilterResponse(self) : - """This method creates a filter response - - Returns: - Dict - """ - data = [] - if (self.state.filterStationIdDict) : - filterStationIds = list(self.state.filterStationIdDict.keys()) - data = self._getFilterResponseData(filterStationIds) - - payload = {'payload_response_type': 5, 'data': data} - return payload - - - def _getFilterResponseData(self, filterStationIds) : - """Creates data to be included in a filter response - - Args: - filterStationIds (array): An array of all stations we should filter on - """ - if (self.state.latestTimeTravelRequest is not None) : - timestamp = int(self.state.latestTimeTravelRequest) - (int(self.state.latestMinutesRequest)*60) - else : - timestamp = int(time.time()) - (int(self.state.latestMinutesRequest)*60) - - query = MostRecentPacketsQuery(self.state, self.db) - query.enableSimulateEmptyStation() - packets = query.getPackets(filterStationIds) - data = self.responseDataConverter.getResponseData(packets, []) - self.state.reset() # Reset to make sure client will get the same packet on history request - result = [] - for packetData in data : - if (self.config.allowTimeTravel or packetData['timestamp'] > int(time.time()) - (24*60*60)) : - packetData['overwrite'] = 1 - packetData['realtime'] = 0 - packetData['packet_order_id'] = 1 # Last packet for this station in this response - packetData['requested_timestamp'] = timestamp - if packetData['station_id'] in filterStationIds: - packetData['related'] = 0 - else : - packetData['related'] = 1 - result.append(packetData) - return result diff --git a/server/trackdirect/websocket/responses/HistoryResponseCreator.py b/server/trackdirect/websocket/responses/HistoryResponseCreator.py deleted file mode 100644 index 71c521ba6008c4dc371ca3dbb533fed6f5fd75c0..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/responses/HistoryResponseCreator.py +++ /dev/null @@ -1,235 +0,0 @@ -import logging -from twisted.python import log - -from math import floor, ceil -import datetime, time -import psycopg2, psycopg2.extras - -from trackdirect.repositories.PacketRepository import PacketRepository - -from trackdirect.websocket.queries.StationIdByMapSectorQuery import StationIdByMapSectorQuery -from trackdirect.websocket.responses.ResponseDataConverter import ResponseDataConverter - - -class HistoryResponseCreator(): - """The HistoryResponseCreator class creates websocket history responses for the latest websocket request - """ - - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (WebsocketConnectionState): WebsocketConnectionState instance that contains current state - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.state = state - self.logger = logging.getLogger('trackdirect') - - self.db = db - self.packetRepository = PacketRepository(db) - self.responseDataConverter = ResponseDataConverter(state, db) - - - def getResponses(self, request, requestId) : - """Create all history responses for the current request - - Args: - request (dict): The request to process - requestId (int): Request id of processed request - - Returns: - generator - """ - if (request["payload_request_type"] == 1 or request["payload_request_type"] == 11) : - if (not self.state.isValidLatestPosition()) : - return - - if (self.state.latestNeLat >= 90 - and self.state.latestNeLng >= 180 - and self.state.latestSwLat <= -90 - and self.state.latestSwLng <= -180) : - # request is requesting to much - return - - for response in self._getMapSectorHistoryResponses(requestId) : - yield response - - elif (request["payload_request_type"] == 7 and "station_id" in request) : - for response in self._getStationHistoryResponses([request["station_id"]], None, True) : - yield response - - else : - self.logger.error('Request is not supported') - self.logger.error(request) - - - def _getMapSectorHistoryResponses(self, requestId) : - """Creates all needed history responses for the currently visible map sectors - - Args: - requestId (int): Request id of processed request - - Returns: - generator - """ - mapSectorArray = self.state.getVisibleMapSectors() - if (len(mapSectorArray) > 20000) : - # Our client will never send a request like this - self.logger.error("To many map sectors requested!") - return - - handledStationIdDict = {} - for mapSector in mapSectorArray : - try: - # Handle one map sector at the time - if (requestId is not None and self.state.latestRequestId > requestId) : - # If new request is recived we want to skip this one (this request is not that important) - # As long as we handle a complete map sector everything is ok - return - - foundStationIds = self._getStationIdsByMapSector(mapSector) - stationIds = [] - for stationId in foundStationIds : - if (stationId not in handledStationIdDict) : - stationIds.append(stationId) - handledStationIdDict[stationId] = True - - if (stationIds) : - for response in self._getStationHistoryResponses(stationIds, mapSector, False) : - yield response - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - self.logger.error(e, exc_info=1) - - - def _getStationHistoryResponses(self, stationIds, mapSector, includeCompleteHistory = False) : - """Creates one history response per station - - Args: - stationIds (array): An array of the stations that we want history data for - mapSector (int): The map sector that we want history data for - includeCompleteHistory (boolean): Include all previous packets (even if we currently only request the latest packets) - - Returns: - generator - """ - # Important to fetch map sector timestamp before loop (may be updated in loop) - minTimestamp = self.state.getMapSectorTimestamp(mapSector) - for stationId in stationIds: - try: - if (self.state.latestTimeTravelRequest is not None) : - response = self._getPastHistoryResponse(stationId, mapSector, minTimestamp, includeCompleteHistory) - else : - response = self._getRecentHistoryResponse(stationId, mapSector, minTimestamp, includeCompleteHistory) - if (response is not None) : - yield response - except psycopg2.InterfaceError as e: - # Connection to database is lost, better just exit - raise e - except Exception as e: - self.logger.error(e, exc_info=1) - - - def _getRecentHistoryResponse(self, stationId, mapSector, minTimestamp, includeCompleteHistory = False) : - """Creates a history response for the specified station, includes all packets from minTimestamp until now - - Args: - stationId (int): The station id that we want history data for - mapSector (int): The map sector that we want history data for - minTimestamp (int): The map sector min timestamp to use in query - includeCompleteHistory (boolean): Include all previous packets (even if we currently only request the latest packets) - - Returns: - Dict - """ - packets = [] - onlyLatestPacketFetched = False - currentStationIds = [stationId] - - currentMinTimestamp = self.state.getStationLatestTimestampOnMap(stationId) - if (currentMinTimestamp is None) : - currentMinTimestamp = minTimestamp - else : - # Since station already exists on map we should continue adding all packets - includeCompleteHistory = True - - if (not self.state.onlyLatestPacketRequested or includeCompleteHistory) : - packets = self.packetRepository.getObjectListByStationIdList(currentStationIds, currentMinTimestamp) - else : - # We could call getMostRecentConfirmedObjectListByStationIdList, would take longer time but would show all positions for a station - packets = self.packetRepository.getLatestConfirmedObjectListByStationIdList(currentStationIds, currentMinTimestamp) - if (packets) : - packets = [packets[-1]] # we only need the latest - onlyLatestPacketFetched = True - - if (packets) : - flags = [] - if (onlyLatestPacketFetched) : - flags = ["latest"] - data = self.responseDataConverter.getResponseData(packets, [mapSector], flags) - payload = {'payload_response_type': 2, 'data': data} - return payload - - - def _getPastHistoryResponse(self, stationId, mapSector, minTimestamp, includeCompleteHistory = False) : - """Creates a history response for the specified station, includes all packets between minTimestamp and the current latestTimeTravelRequest timestamp - - Args: - stationId (int): The station id that we want history data for - mapSector (int): The map sector that we want history data for - minTimestamp (int): The map sector min timestamp to use in query - includeCompleteHistory (boolean): Include all previous packets (even if we currently only request the latest packets) - - Returns: - Dict - """ - packets = [] - onlyLatestPacketFetched = False - currentStationIds = [stationId] - - currentMinTimestamp = self.state.getStationLatestTimestampOnMap(stationId) - if (currentMinTimestamp is None) : - currentMinTimestamp = minTimestamp - - if (self.state.onlyLatestPacketRequested and not includeCompleteHistory) : - if (stationId not in self.state.stationsOnMapDict) : - # we only need to fetch latest packet for a time-travel request if station is not on map - onlyLatestPacketFetched = True - packets = self.packetRepository.getLatestObjectListByStationIdListAndTimeInterval(currentStationIds, currentMinTimestamp, self.state.latestTimeTravelRequest) - else : - if (not self.state.isStationHistoryOnMap(stationId)) : - packets = self.packetRepository.getObjectListByStationIdListAndTimeInterval(currentStationIds, currentMinTimestamp, self.state.latestTimeTravelRequest) - - if (packets) : - flags = [] - if (onlyLatestPacketFetched) : - flags = ["latest"] - data = self.responseDataConverter.getResponseData(packets, [mapSector], flags) - payload = {'payload_response_type': 2, 'data': data} - return payload - - - def _getStationIdsByMapSector(self, mapSector) : - """Returns the station Id's in specified map sector - - Args: - mapSector (int): The map sector that we are interested in - - Returns: - array of ints - """ - query = StationIdByMapSectorQuery(self.db) - if (self.state.latestTimeTravelRequest is not None) : - if (self.state.isMapSectorKnown(mapSector)) : - # This map sector is under control - return [] - else : - startTimestamp = self.state.latestTimeTravelRequest - (int(self.state.latestMinutesRequest)*60) - endTimestamp = self.state.latestTimeTravelRequest; - return query.getStationIdListByMapSector(mapSector, startTimestamp, endTimestamp) - else : - timestamp = self.state.getMapSectorTimestamp(mapSector) - return query.getStationIdListByMapSector(mapSector, timestamp, None) diff --git a/server/trackdirect/websocket/responses/ResponseDataConverter.py b/server/trackdirect/websocket/responses/ResponseDataConverter.py deleted file mode 100644 index 9ad3c1a8862ce5fb6dd19e25d41e3b5bfa9b412d..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/responses/ResponseDataConverter.py +++ /dev/null @@ -1,377 +0,0 @@ -import logging -from twisted.python import log - -from math import floor, ceil -import datetime, time - -import psycopg2, psycopg2.extras - -from trackdirect.repositories.PacketRepository import PacketRepository -from trackdirect.repositories.StationRepository import StationRepository -from trackdirect.repositories.PacketWeatherRepository import PacketWeatherRepository -from trackdirect.repositories.PacketOgnRepository import PacketOgnRepository -from trackdirect.repositories.OgnDeviceRepository import OgnDeviceRepository - -from trackdirect.database.DatabaseObjectFinder import DatabaseObjectFinder -from trackdirect.database.DatabaseConnection import DatabaseConnection - -from trackdirect.websocket.queries.MostRecentPacketsQuery import MostRecentPacketsQuery -from trackdirect.websocket.queries.MissingPacketsQuery import MissingPacketsQuery - - -class ResponseDataConverter(): - """An ResponseDataConverter instance is used to create response content data based on packet objects - """ - - - def __init__(self, state, db): - """The __init__ method. - - Args: - state (WebsocketConnectionState): - db (psycopg2.Connection): Database connection (with autocommit) - """ - self.state = state - self.logger = logging.getLogger('trackdirect') - - self.db = db - self.packetRepository = PacketRepository(db) - self.stationRepository = StationRepository(db) - self.packetWeatherRepository = PacketWeatherRepository(db) - self.dbObjectFinder = DatabaseObjectFinder(db) - self.packetOgnRepository = PacketOgnRepository(db) - self.ognDeviceRepository = OgnDeviceRepository(db) - - - def getResponseData(self, packets, mapSectorList = None, flags = [], iterationCounter = 0) : - """Create response data based on specified packets - - Args: - packets (array): An array of the Packet's that should be converted to packet dict responses - mapSectorList (array): An array of the current handled map sectors - flags (array): An array with additional flags (like "realtime", "latest") - iterationCounter (int) This functionality will call itself to find related packets, this argument is used to remember the number of iterations - - Returns: - An array of packet dicts - """ - responseData = [] - for index, packet in enumerate(packets) : - packetDict = packet.getDict(True) - packetDict['packet_order_id'] = self._getPacketOrderId(packets, index, flags) - - self._updateState(packet, mapSectorList, flags) - self._addOverwriteStatus(packetDict) - if (("latest" not in flags and "realtime" not in flags) or self.state.isStationHistoryOnMap(packet.stationId)) : - if (packetDict['packet_order_id'] == 1) : - self._addStationWeatherData(packetDict) - self._addStationTelemetryData(packetDict) - if (packet.sourceId == 5) : - self._addStationOgnData(packetDict) - if (packet.sourceId == 5) : - self._addStationOgnDeviceData(packetDict) - self._addPacketPhgRng(packetDict) - - if ("realtime" not in flags) : - self._addStationIdPath(packetDict) - - self._setFlags(packetDict, flags) - responseData.append(packetDict) - return self._extendResponseWithMorePackets(responseData, flags, iterationCounter) - - - def _getPacketOrderId(self, packets, index, flags) : - """Returns the order id of the packet at specified index - - Args: - packets (array): An array of the Packet's that should be converted to packet dict responses - index (int): Index of the packet that we want an order id for - flags (array): An array with additional flags (like "realtime", "latest") - - Returns: - int - """ - if ("realtime" in flags) : - return 1 - elif (len(packets) -1 == index): - # This is the last packet of all - return 1 # Last packet in response for this marker - elif (packets[index].markerId != packets[index + 1].markerId) : - # This is the last packet for this marker - return 1 # Last packet in response for this marker - elif (index == 0 or packets[index].markerId != packets[index - 1].markerId) : - # This is the first packet for this marker - return 3 # First packet in response for this marker - else : - return 2 # Middle packet in response for this marker - - - def _updateState(self, packet, mapSectorList, flags) : - """Update connection state based on packet on the way to client - - Args: - packet (Packet): The packet that is on the way to client - mapSectorList (array): An array of the current handled map sectors - flags (array): An array with additional flags (like "realtime", "latest") - """ - self.state.setStationLatestTimestamp(packet.stationId, packet.timestamp) - - if (packet.stationId not in self.state.stationsOnMapDict) : - # Station should be added to stationsOnMapDict even if only latest packet is added - self.state.stationsOnMapDict[packet.stationId] = True - - # self.state.setCompleteStationLatestTimestamp - # Note that we depend on that the real-time aprs-is sender make sure to send previous missing packets when a new is sent - if (self.state.isStationHistoryOnMap(packet.stationId)) : - self.state.setCompleteStationLatestTimestamp(packet.stationId, packet.timestamp) - elif ("latest" not in flags and "realtime" not in flags and "related" not in flags) : - self.state.setCompleteStationLatestTimestamp(packet.stationId, packet.timestamp) - elif ("related" in flags and packet.packetTailTimestamp == packet.timestamp) : - self.state.setCompleteStationLatestTimestamp(packet.stationId, packet.timestamp) - - if (mapSectorList and packet.mapSector is not None and packet.mapSector in mapSectorList) : - if "latest" not in flags: - self.state.setMapSectorLatestTimeStamp(packet.mapSector, packet.timestamp) - else : - self.state.setMapSectorLatestOverwriteTimeStamp(packet.mapSector, packet.timestamp) - - - def _setFlags(self, packetDict, flags) : - """Set additional flags that will tell client a bit more about the packet - - Args: - packetDict (dict): The packet to which we should modify - flags (array): An array with additional flags (like "realtime", "latest") - """ - if ("realtime" in flags) : - packetDict["db"] = 0 - packetDict["realtime"] = 1 - else : - packetDict["db"] = 1 - packetDict["realtime"] = 0 - - def _addOverwriteStatus(self, packetDict) : - """Set packet overwrite status - - Args: - packetDict (dict): The packet to which we should modify - """ - packetDict['overwrite'] = 0 - - # We assume that this method is called after the "complete station on map"-state has been updated - if (not self.state.isStationHistoryOnMap(packetDict["station_id"])) : - packetDict['overwrite'] = 1 - - - def _addPacketPhgRng(self, packetDict) : - """Add previous reported phg and rng to the specified packet - - Args: - packetDict (dict): The packet to which we should modify - """ - if ('phg' in packetDict and 'rng' in packetDict) : - if (packetDict['phg'] is None and packetDict['latest_phg_timestamp'] is not None and packetDict['latest_phg_timestamp'] < packetDict['timestamp']) : - relatedPacket = self.packetRepository.getObjectByStationIdAndTimestamp(packetDict['station_id'], packetDict['latest_phg_timestamp']) - if (relatedPacket.phg is not None and relatedPacket.markerId == packetDict['marker_id']) : - packetDict['phg'] = relatedPacket.phg - - if (packetDict['rng'] is None and packetDict['latest_rng_timestamp'] is not None and packetDict['latest_rng_timestamp'] < packetDict['timestamp']) : - relatedPacket = self.packetRepository.getObjectByStationIdAndTimestamp(packetDict['station_id'], packetDict['latest_rng_timestamp']) - if (relatedPacket.rng is not None and relatedPacket.markerId == packetDict['marker_id']) : - packetDict['rng'] = relatedPacket.rng - - - def _addStationOgnData(self, packetDict) : - """Add OGN data to packet - - Args: - packetDict (dict): The packet to which we should add the related data - """ - if ('ogn' not in packetDict or packetDict['ogn'] is None) : - station = self.stationRepository.getObjectById(packetDict['station_id']) - ts = int(packetDict['timestamp']) - (24*60*60) - if (station.latestOgnPacketTimestamp is not None - and station.latestOgnPacketTimestamp > ts) : - packetDict['latest_ogn_packet_timestamp'] = station.latestOgnPacketTimestamp - - relatedPacketDict = None - if (station.latestOgnPacketId == packetDict['id']) : - relatedPacketDict = packetDict - else : - relatedPacket = self.packetRepository.getObjectByIdAndTimestamp(station.latestOgnPacketId, station.latestOgnPacketTimestamp) - if (relatedPacket.isExistingObject()) : - relatedPacketDict = relatedPacket.getDict() - - if (relatedPacketDict is not None) : - if (relatedPacketDict['marker_id'] is not None and relatedPacketDict['marker_id'] == packetDict['marker_id']) : - packetOgn = self.packetOgnRepository.getObjectByPacketIdAndTimestamp(station.latestOgnPacketId, station.latestOgnPacketTimestamp) - if (packetOgn.isExistingObject()) : - packetDict['ogn'] = packetOgn.getDict() - - - def _addStationOgnDeviceData(self, packetDict) : - """Add OGN device data to packet - - Args: - packetDict (dict): The packet to which we should add the related data - """ - station = self.stationRepository.getObjectById(packetDict['station_id']) - if (station.latestOgnSenderAddress is not None) : - ognDevice = self.ognDeviceRepository.getObjectByDeviceId(station.latestOgnSenderAddress) - if (ognDevice.isExistingObject()) : - packetDict['ogn_device'] = ognDevice.getDict() - - - def _addStationWeatherData(self, packetDict) : - """Add weather data to packet - - Args: - packetDict (dict): The packet to which we should add the related data - """ - if ('weather' not in packetDict or packetDict['weather'] is None) : - station = self.stationRepository.getObjectById(packetDict['station_id']) - ts = int(packetDict['timestamp']) - (24*60*60) - if (station.latestWeatherPacketTimestamp is not None - and station.latestWeatherPacketTimestamp > ts) : - packetDict['latest_weather_packet_timestamp'] = station.latestWeatherPacketTimestamp - - relatedPacketDict = None - if (station.latestWeatherPacketId == packetDict['id']) : - relatedPacketDict = packetDict - else : - relatedPacket = self.packetRepository.getObjectByIdAndTimestamp(station.latestWeatherPacketId, station.latestWeatherPacketTimestamp) - if (relatedPacket.isExistingObject()) : - relatedPacketDict = relatedPacket.getDict() - - if (relatedPacketDict is not None) : - if (relatedPacketDict['marker_id'] is not None and relatedPacketDict['marker_id'] == packetDict['marker_id']) : - packetWeather = self.packetWeatherRepository.getObjectByPacketIdAndTimestamp(station.latestWeatherPacketId, station.latestWeatherPacketTimestamp) - if (packetWeather.isExistingObject()) : - packetDict['weather'] = packetWeather.getDict() - - - def _addStationTelemetryData(self, packetDict) : - """Add telemetry data to packet - - Args: - packetDict (dict): The packet to which we should add the related data - """ - if ('telemetry' not in packetDict or packetDict['telemetry'] is None) : - station = self.stationRepository.getObjectById(packetDict['station_id']) - ts = int(packetDict['timestamp']) - (24*60*60) - if (station.latestTelemetryPacketTimestamp is not None - and station.latestTelemetryPacketTimestamp > ts) : - packetDict['latest_telemetry_packet_timestamp'] = station.latestTelemetryPacketTimestamp - - - def _addStationIdPath(self, packetDict) : - """Add the station id path to the specified packet - - Args: - packetDict (dict): The packet to which we should add the related station id path - """ - stationIdPath = [] - stationNamePath = [] - stationLocationPath = [] - - if (packetDict['raw_path'] is not None and "TCPIP*" not in packetDict['raw_path'] and "TCPXX*" not in packetDict['raw_path']) : - packetDate = datetime.datetime.utcfromtimestamp(int(packetDict['timestamp'])).strftime('%Y%m%d') - datePacketTable = 'packet' + packetDate - datePacketPathTable = datePacketTable + '_path' - - if (self.dbObjectFinder.checkTableExists(datePacketPathTable)) : - selectCursor = self.db.cursor() - sql = """select station_id, station.name station_name, latitude, longitude from """ + datePacketPathTable + """, station where station.id = station_id and packet_id = %s order by number""" % (packetDict['id']) - selectCursor.execute(sql) - - for record in selectCursor : - stationIdPath.append(record[0]) - stationNamePath.append(record[1]) - stationLocationPath.append([record[2], record[3]]) - selectCursor.close() - packetDict['station_id_path'] = stationIdPath - packetDict['station_name_path'] = stationNamePath - packetDict['station_location_path'] = stationLocationPath - - - def getDictListFromPacketList(self, packets) : - """Returns a packet dict list from a packet list - - Args: - packets (array): Array of Packet instances - - Returns: - A array och packet dicts - """ - packetDicts = [] - for packet in packets : - packetDicts.append(packet.getDict()) - return packetDicts - - - def _extendResponseWithMorePackets(self, packetDicts, flags, iterationCounter) : - """Extend the specified array with related packets - - Args: - packetDicts (array): An array of the packet response dicts - flags (array): An array with additional flags (like "realtime", "latest") - iterationCounter (int): This functionality will call itself to find related packets, this argument is used to remember the number of iterations - - Returns: - The modified packet array - """ - allPacketDicts = [] - hasSeveralSendersForOneStation = False - - # Add related packets (stations that the original packets depend on) - if (packetDicts) : - relatedStationIds = {} - for index, packetDict in enumerate(packetDicts) : - if (packetDict['is_moving'] == 1 or packetDict['packet_order_id'] == 1) : - # Only fetch related stations for the last stationary packet (in some cases query will return older packets) - if (packetDict['station_id_path']) : - # Also add latest packets from stations that has been involved in sending any packets in array "packets" - for stationId in packetDict['station_id_path'] : - if (stationId not in self.state.stationsOnMapDict) : - relatedStationIds[stationId] = True - - for index, packetDict in enumerate(packetDicts) : - if (packetDict['station_id'] in relatedStationIds) : - del relatedStationIds[packetDict['station_id']] - - if (relatedStationIds) : - relatedStationPackets = self._getRelatedStationPacketsByStationIds(list(relatedStationIds.keys())) - - # To avoid infinit loop we mark all related stations as added to map even we we failed doing it - for relatedStationId in list(relatedStationIds.keys()): - if (relatedStationId not in self.state.stationsOnMapDict) : - self.state.stationsOnMapDict[relatedStationId] = True - - if (relatedStationPackets) : - if ("latest" in flags) : - relatedStationPacketDicts = self.getResponseData(relatedStationPackets, None, ["latest", "related"], iterationCounter + 1) - else : - relatedStationPacketDicts = self.getResponseData(relatedStationPackets, None, ["related"], iterationCounter + 1) - allPacketDicts.extend(relatedStationPacketDicts) - - # Add original packets - allPacketDicts.extend(packetDicts) - - #return allPacketDicts.sort(key=lambda x: x['id'], reverse=False) - return allPacketDicts - - def _getRelatedStationPacketsByStationIds(self, relatedStationIdList) : - """Returns a list of the latest packet for the specified stations, this method should be used to find packets for a packet's related stations - - Args: - relatedStationIdList (array): Array of related station id's - - Returns: - An array of the latest packet for the specified stations - """ - if (relatedStationIdList) : - query = MostRecentPacketsQuery(self.state, self.db) - query.enableSimulateEmptyStation() - return query.getPackets(relatedStationIdList) - return [] - diff --git a/server/trackdirect/websocket/responses/__init__.py b/server/trackdirect/websocket/responses/__init__.py deleted file mode 100644 index 984c177fb076a4043052fbf54a72dea7dbc0a8ba..0000000000000000000000000000000000000000 --- a/server/trackdirect/websocket/responses/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "1.0" -__author__ = "Per Qvarforth" diff --git a/trackdirect-apache.dockerfile b/trackdirect-apache.dockerfile deleted file mode 100644 index 44d045222378bbc71dca97e56354d60d5ee8f5c9..0000000000000000000000000000000000000000 --- a/trackdirect-apache.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM php:7.2-apache - -RUN apt-get update && apt-get install -y \ - git \ - libpq-dev \ - postgresql-client-common \ - postgresql-client \ - libevent-dev \ - libmagickwand-dev \ - imagemagick \ - inkscape \ - && rm -rf /var/lib/apt/lists/* - -RUN pecl install imagick && docker-php-ext-enable imagick && docker-php-ext-install pdo pdo_pgsql && docker-php-ext-install gd && docker-php-ext-enable gd - -COPY . /root/trackdirect -COPY config/000-default.conf /etc/apache2/sites-enabled/ - -RUN a2enmod rewrite -RUN chmod a+rx / && chmod a+rx -R /root -RUN chmod 777 /root/trackdirect/htdocs/public/symbols -RUN chmod 777 /root/trackdirect/htdocs/public/heatmaps -