fix: commiting from linux

This commit is contained in:
lucas.oskorep
2023-05-02 01:18:10 -04:00
parent 30ff9b20a2
commit 367e646be2
36 changed files with 15045 additions and 15047 deletions

248
.gitignore vendored
View File

@@ -1,125 +1,125 @@
# Editors # Editors
.vscode/ .vscode/
.idea/ .idea/
# Vagrant # Vagrant
.vagrant/ .vagrant/
# Mac/OSX # Mac/OSX
.DS_Store .DS_Store
# Windows # Windows
Thumbs.db Thumbs.db
# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore # Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
# C extensions # C extensions
*.so *.so
# Distribution / packaging # Distribution / packaging
.Python .Python
build/ build/
develop-eggs/ develop-eggs/
dist/ dist/
downloads/ downloads/
eggs/ eggs/
.eggs/ .eggs/
lib/ lib/
lib64/ lib64/
parts/ parts/
sdist/ sdist/
var/ var/
wheels/ wheels/
*.egg-info/ *.egg-info/
.installed.cfg .installed.cfg
*.egg *.egg
MANIFEST MANIFEST
# PyInstaller # PyInstaller
# Usually these files are written by a python script from a template # Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it. # before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest *.manifest
*.spec *.spec
# Installer logs # Installer logs
pip-log.txt pip-log.txt
pip-delete-this-directory.txt pip-delete-this-directory.txt
# Unit test / coverage reports # Unit test / coverage reports
htmlcov/ htmlcov/
.tox/ .tox/
.nox/ .nox/
.coverage .coverage
.coverage.* .coverage.*
.cache .cache
nosetests.xml nosetests.xml
coverage.xml coverage.xml
*.cover *.cover
.hypothesis/ .hypothesis/
.pytest_cache/ .pytest_cache/
# Translations # Translations
*.mo *.mo
*.pot *.pot
# Django stuff: # Django stuff:
*.log *.log
local_settings.py local_settings.py
db.sqlite3 db.sqlite3
# Flask stuff: # Flask stuff:
instance/ instance/
.webassets-cache .webassets-cache
# Scrapy stuff: # Scrapy stuff:
.scrapy .scrapy
# Sphinx documentation # Sphinx documentation
docs/_build/ docs/_build/
# PyBuilder # PyBuilder
target/ target/
# Jupyter Notebook # Jupyter Notebook
.ipynb_checkpoints .ipynb_checkpoints
# IPython # IPython
profile_default/ profile_default/
ipython_config.py ipython_config.py
# pyenv # pyenv
.python-version .python-version
# celery beat schedule file # celery beat schedule file
celerybeat-schedule celerybeat-schedule
# SageMath parsed files # SageMath parsed files
*.sage.py *.sage.py
# Environments # Environments
.env .env
.venv .venv
env/ env/
venv/ venv/
ENV/ ENV/
env.bak/ env.bak/
venv.bak/ venv.bak/
# Spyder project settings # Spyder project settings
.spyderproject .spyderproject
.spyproject .spyproject
# Rope project settings # Rope project settings
.ropeproject .ropeproject
# mkdocs documentation # mkdocs documentation
/site /site
# mypy # mypy
.mypy_cache/ .mypy_cache/
.dmypy.json .dmypy.json
dmypy.jsons dmypy.jsons

42
LICENSE
View File

@@ -1,21 +1,21 @@
MIT License MIT License
Copyright (c) 2021 Lucas Oskorep Copyright (c) 2021 Lucas Oskorep
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 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 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@@ -1,3 +1,3 @@
# pi-mta-sign # pi-mta-sign
Code and documentation for project for turning a raspberry pi into your very own MTA subway sign. Code and documentation for project for turning a raspberry pi into your very own MTA subway sign.

View File

@@ -1,10 +1,10 @@
{ {
"ACE": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-ace", "ACE": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-ace",
"BDFM": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-bdfm", "BDFM": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-bdfm",
"G": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-g", "G": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-g",
"JZ": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-jz", "JZ": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-jz",
"NQRW": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-nqrw", "NQRW": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-nqrw",
"L": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-l", "L": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-l",
"SIR": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-si", "SIR": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-si",
"1234567": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs" "1234567": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs"
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
from .mta import * from .mta import *
from .train import * from .train import *
from .stop import * from .stop import *

View File

@@ -1,117 +1,117 @@
import asyncio import asyncio
import requests import requests
import json import json
from google.transit import gtfs_realtime_pb2 from google.transit import gtfs_realtime_pb2
from protobuf_to_dict import protobuf_to_dict from protobuf_to_dict import protobuf_to_dict
from time import time from time import time
from .train import Train from .train import Train
class MTA(object): class MTA(object):
# Create a data filter object. # Create a data filter object.
# Then be able to update that object on the fly. # Then be able to update that object on the fly.
# This filter should return all possible trains and stations by default. # This filter should return all possible trains and stations by default.
# If anything is added it gets filtered out. # If anything is added it gets filtered out.
def __init__(self, api_key: str, routes, station_ids, timing_callbacks=None, alert_callbacks=None, def __init__(self, api_key: str, routes, station_ids, timing_callbacks=None, alert_callbacks=None,
endpoints_file="./endpoints.json", callback_frequency=10, max_arrival_time=30): endpoints_file="./endpoints.json", callback_frequency=10, max_arrival_time=30):
self.header = { self.header = {
"x-api-key": api_key "x-api-key": api_key
} }
self.routes = routes self.routes = routes
self.station_ids = station_ids self.station_ids = station_ids
self.timing_callbacks = timing_callbacks if timing_callbacks else [] self.timing_callbacks = timing_callbacks if timing_callbacks else []
self.is_running = False self.is_running = False
self.callback_frequency = callback_frequency self.callback_frequency = callback_frequency
self.max_arrival_time = max_arrival_time self.max_arrival_time = max_arrival_time
with open(endpoints_file, "r") as f: with open(endpoints_file, "r") as f:
self.endpoints = json.load(f) self.endpoints = json.load(f)
self.set_valid_endpoints() self.set_valid_endpoints()
def set_valid_endpoints(self): def set_valid_endpoints(self):
self.valid_endpoints = {} self.valid_endpoints = {}
for key, value in self.endpoints.items(): for key, value in self.endpoints.items():
valid_routes = [x for x in self.routes if x in key] valid_routes = [x for x in self.routes if x in key]
if valid_routes: if valid_routes:
self.valid_endpoints[value] = valid_routes self.valid_endpoints[value] = valid_routes
print(self.valid_endpoints) print(self.valid_endpoints)
def start_updates(self): def start_updates(self):
print("starting updates") print("starting updates")
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
loop.run_until_complete(self._get_updates()) loop.run_until_complete(self._get_updates())
def stop_updates(self): def stop_updates(self):
self.is_running = False self.is_running = False
async def get_data(self): async def get_data(self):
trains = [] trains = []
for endpoint, valid_lines in self.valid_endpoints.items(): for endpoint, valid_lines in self.valid_endpoints.items():
r = requests.get(endpoint, headers=self.header) r = requests.get(endpoint, headers=self.header)
feed = gtfs_realtime_pb2.FeedMessage() feed = gtfs_realtime_pb2.FeedMessage()
feed.ParseFromString(r.content) feed.ParseFromString(r.content)
subway_feed = protobuf_to_dict(feed)['entity'] subway_feed = protobuf_to_dict(feed)['entity']
trains.extend([train for train in [Train.get_train_from_dict(train_dict) for train_dict in subway_feed] if train is not None]) trains.extend([train for train in [Train.get_train_from_dict(train_dict) for train_dict in subway_feed] if train is not None])
return trains return trains
@staticmethod @staticmethod
def get_trains_for_routes(routes, trains): def get_trains_for_routes(routes, trains):
return [train for train in trains if train.route in routes] return [train for train in trains if train.route in routes]
@staticmethod @staticmethod
def get_trains_for_route(route, trains): def get_trains_for_route(route, trains):
return MTA.get_trains_for_routes([route], trains) return MTA.get_trains_for_routes([route], trains)
async def get_train_information(self): async def get_train_information(self):
# Might need to not filter these trains. # Might need to not filter these trains.
valid_trains = [train for train in await self.get_data() if True] valid_trains = [train for train in await self.get_data() if True]
# MTA.trains_arriving_at_stations(self.train_lines, self.station_ids, train, self.max_arrival_time)] # MTA.trains_arriving_at_stations(self.train_lines, self.station_ids, train, self.max_arrival_time)]
return valid_trains return valid_trains
async def _get_updates(self): async def _get_updates(self):
self.is_running = True self.is_running = True
while (self.is_running): while (self.is_running):
t = time() t = time()
data = self.get_train_information() data = self.get_train_information()
data = await data data = await data
await self.process_callbacks(data) await self.process_callbacks(data)
await asyncio.sleep(self.callback_frequency - (time() - t)) await asyncio.sleep(self.callback_frequency - (time() - t))
async def process_callbacks(self, data): async def process_callbacks(self, data):
for callback in self.timing_callbacks: for callback in self.timing_callbacks:
await callback(data) await callback(data)
def add_train_line(self, train_line: str): def add_train_line(self, train_line: str):
self.routes.append(train_line) self.routes.append(train_line)
self.set_valid_endpoints() self.set_valid_endpoints()
def remove_train_line(self, train_line: str): def remove_train_line(self, train_line: str):
self.routes.remove(train_line) self.routes.remove(train_line)
self.set_valid_endpoints() self.set_valid_endpoints()
def add_station_id(self, station_id: str): def add_station_id(self, station_id: str):
self.station_ids.append(station_id) self.station_ids.append(station_id)
def remove_station_id(self, station_id: str): def remove_station_id(self, station_id: str):
self.station_ids.remove(station_id) self.station_ids.remove(station_id)
def add_callback(self, callback_func): def add_callback(self, callback_func):
self.timing_callbacks.append(callback_func) self.timing_callbacks.append(callback_func)
def remove_callback(self, callback_func): def remove_callback(self, callback_func):
self.timing_callbacks.remove(callback_func) self.timing_callbacks.remove(callback_func)
def get_time_arriving_at_stations(self, trains): def get_time_arriving_at_stations(self, trains):
station_first = {} station_first = {}
for station_id in self.station_ids: for station_id in self.station_ids:
line_first = {} line_first = {}
for route in self.routes: for route in self.routes:
valid_trains = [train.get_arrival_at(station_id) for train in MTA.get_trains_for_route(route, trains) if train.arriving_at_station_in_time(station_id, self.max_arrival_time)] valid_trains = [train.get_arrival_at(station_id) for train in MTA.get_trains_for_route(route, trains) if train.arriving_at_station_in_time(station_id, self.max_arrival_time)]
if valid_trains: if valid_trains:
line_first[route] = valid_trains line_first[route] = valid_trains
if line_first: if line_first:
station_first[station_id] = line_first station_first[station_id] = line_first
return station_first return station_first

View File

@@ -1,27 +1,27 @@
from datetime import datetime from datetime import datetime
from math import trunc from math import trunc
class Stop(object): class Stop(object):
def __init__(self, id, arrival_time, departure_time, ): def __init__(self, id, arrival_time, departure_time, ):
self.id = id self.id = id
self.arrival_time = arrival_time self.arrival_time = arrival_time
self.departure_time = departure_time self.departure_time = departure_time
def arrival_minutes(self): def arrival_minutes(self):
return trunc(((datetime.fromtimestamp(self.arrival_time) - datetime.now()).total_seconds()) / 60) return trunc(((datetime.fromtimestamp(self.arrival_time) - datetime.now()).total_seconds()) / 60)
def __str__(self): def __str__(self):
now = datetime.now() now = datetime.now()
time = datetime.fromtimestamp(self.arrival_time) time = datetime.fromtimestamp(self.arrival_time)
time_minutes = trunc(((time - now).total_seconds()) / 60) time_minutes = trunc(((time - now).total_seconds()) / 60)
return f"stop_id:{self.id}| arr:{time_minutes}| dep:{self.departure_time}" return f"stop_id:{self.id}| arr:{time_minutes}| dep:{self.departure_time}"
@staticmethod @staticmethod
def get_stop_from_dict(obj): def get_stop_from_dict(obj):
if "arrival" in obj and "departure" in obj and "stop_id" in obj: if "arrival" in obj and "departure" in obj and "stop_id" in obj:
return Stop(obj["stop_id"], obj["arrival"]["time"], obj["departure"]["time"]) return Stop(obj["stop_id"], obj["arrival"]["time"], obj["departure"]["time"])
return None return None

View File

@@ -1,42 +1,42 @@
from .stop import Stop from .stop import Stop
class Train(object): class Train(object):
def __init__(self, id, route, stops): def __init__(self, id, route, stops):
self.id = id self.id = id
self.route = route self.route = route
self.stops = stops self.stops = stops
def get_arrival_at(self, stop_id): def get_arrival_at(self, stop_id):
""" """
returns the routes stop time at a given stop ID in minutes returns the routes stop time at a given stop ID in minutes
if not found, returns None if not found, returns None
:param stop_id: stop ID of arrival station :param stop_id: stop ID of arrival station
:return: arrival time in minutes :return: arrival time in minutes
""" """
for stop in self.stops: for stop in self.stops:
if stop.id == stop_id: if stop.id == stop_id:
return stop.arrival_minutes() return stop.arrival_minutes()
return None return None
def arriving_at_station_in_time(self, station_id, max_time): def arriving_at_station_in_time(self, station_id, max_time):
for stop in self.stops: for stop in self.stops:
minutes_to_arrival = stop.arrival_minutes() minutes_to_arrival = stop.arrival_minutes()
if stop.id == station_id: if stop.id == station_id:
if minutes_to_arrival > 0 and minutes_to_arrival < max_time: if minutes_to_arrival > 0 and minutes_to_arrival < max_time:
return True return True
def __str__(self): def __str__(self):
formatted_stops = '\n'.join([str(stop) for stop in self.stops]) formatted_stops = '\n'.join([str(stop) for stop in self.stops])
return f"train_id:{self.id} | line_name:{self.route}| stops:\n {formatted_stops}" return f"train_id:{self.id} | line_name:{self.route}| stops:\n {formatted_stops}"
@staticmethod @staticmethod
def get_train_from_dict(obj): def get_train_from_dict(obj):
if "trip_update" in obj and "stop_time_update" in obj["trip_update"]: if "trip_update" in obj and "stop_time_update" in obj["trip_update"]:
# data we need is here create object # data we need is here create object
id = obj["id"] id = obj["id"]
route = obj["trip_update"]["trip"]["route_id"] route = obj["trip_update"]["trip"]["route_id"]
all_stops = [Stop.get_stop_from_dict(x) for x in obj["trip_update"]["stop_time_update"]] all_stops = [Stop.get_stop_from_dict(x) for x in obj["trip_update"]["stop_time_update"]]
valid_stops = [valid_stop for valid_stop in all_stops if valid_stop is not None] valid_stops = [valid_stop for valid_stop in all_stops if valid_stop is not None]
return Train(id, route, valid_stops) return Train(id, route, valid_stops)
else: else:
return None return None

View File

@@ -1,60 +1,58 @@
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
from mta_manager import MTA from mta_manager import MTA
import threading import threading
import time import time
from time import sleep from time import sleep
from pprint import pprint from pprint import pprint
load_dotenv() load_dotenv()
api_key = os.getenv('MTA_API_KEY', '') api_key = os.getenv('MTA_API_KEY', '')
mtaController = MTA( mtaController = MTA(
api_key, api_key,
["A", "C", "E", "1", "2", "3"], ["A", "C", "E", "1", "2", "3"],
["127S", "127N", "A27N", "A27S"] ["127S", "127N", "A27N", "A27S"]
) )
async def mta_callback(trains):
print("We are inside of the call back now")
async def mta_callback(trains): print(len(trains))
print("We are inside of the call back now") pprint([str(route) for route in trains])
print(len(trains)) pprint(mtaController.get_time_arriving_at_stations(trains))
pprint([str(route) for route in trains])
pprint(mtaController.get_time_arriving_at_stations(trains)) class threadWrapper(threading.Thread):
def __init__(self, run):
class threadWrapper(threading.Thread): threading.Thread.__init__(self)
def __init__(self, run): self.run = run
threading.Thread.__init__(self)
self.run = run def run(self):
self.run()
def run(self):
self.run() def start_mta():
mtaController.add_callback(mta_callback)
def start_mta(): mtaController.start_updates()
mtaController.add_callback(mta_callback)
mtaController.start_updates() def stop_mta():
sleep(10)
def stop_mta(): mtaController.stop_updates()
sleep(10)
mtaController.stop_updates() threadLock = threading.Lock()
threads = []
threadLock = threading.Lock()
threads = [] # Create new threads
thread1 = threadWrapper(start_mta)
# Create new threads thread2 = threadWrapper(stop_mta)
thread1 = threadWrapper(start_mta)
thread2 = threadWrapper(stop_mta)
thread1.start()
thread2.start()
thread1.start()
thread2.start() # Add threads to thread list
threads.append(thread1)
# Add threads to thread list threads.append(thread2)
threads.append(thread1)
threads.append(thread2) # Wait for all threads to complete
for t in threads:
# Wait for all threads to complete t.join()
for t in threads: print ("Exiting Main Thread")
t.join()
print ("Exiting Main Thread")

Binary file not shown.

272
server.py
View File

@@ -1,136 +1,136 @@
import os import os
import threading import threading
import pandas as pd import pandas as pd
from deepdiff import DeepDiff from deepdiff import DeepDiff
from datetime import datetime from datetime import datetime
from dotenv import load_dotenv from dotenv import load_dotenv
from flask import Flask, jsonify, render_template, request, abort from flask import Flask, jsonify, render_template, request, abort
from mta_manager import MTA from mta_manager import MTA
load_dotenv() load_dotenv()
app = Flask(__name__) app = Flask(__name__)
app.secret_key = "SuperSecretDontEvenTryToGuessMeGGEZNoRe" app.secret_key = "SuperSecretDontEvenTryToGuessMeGGEZNoRe"
app._static_folder = os.path.abspath("templates/static/") app._static_folder = os.path.abspath("templates/static/")
stops = pd.read_csv("stops.txt") stops = pd.read_csv("stops.txt")
stop_ids = ["127S", "127N", "A27N", "A27S"] stop_ids = ["127S", "127N", "A27N", "A27S"]
start_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S") start_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
def link_to_station(data) -> {}: def link_to_station(data) -> {}:
linked_data = {} linked_data = {}
for key, value in data.items(): for key, value in data.items():
stop_name = stops.loc[stops["stop_id"] == key] stop_name = stops.loc[stops["stop_id"] == key]
stop_name = stop_name["stop_name"].values[0] stop_name = stop_name["stop_name"].values[0]
if stop_name not in linked_data: if stop_name not in linked_data:
linked_data[stop_name] = {} linked_data[stop_name] = {}
if "N" in key: if "N" in key:
linked_data[stop_name]["North"] = value linked_data[stop_name]["North"] = value
elif "S" in key: elif "S" in key:
linked_data[stop_name]["South"] = value linked_data[stop_name]["South"] = value
return linked_data return linked_data
@app.route("/", methods=["GET"]) @app.route("/", methods=["GET"])
def index(): def index():
# TODO: Shove this into a sqlite database # TODO: Shove this into a sqlite database
station_names = sorted(list(set(stops["stop_name"].to_list()))) station_names = sorted(list(set(stops["stop_name"].to_list())))
return render_template( return render_template(
"layouts/index.html", "layouts/index.html",
station_names=station_names, station_names=station_names,
station_1="42 St-Port Authority Bus Terminal", station_1="42 St-Port Authority Bus Terminal",
station_2="Times Sq-42 St" station_2="Times Sq-42 St"
) )
@app.route("/start_time", methods=["GET"]) @app.route("/start_time", methods=["GET"])
def get_start_time(): def get_start_time():
return start_time return start_time
@app.route("/mta_data", methods=["POST"]) @app.route("/mta_data", methods=["POST"])
def get_mta_data(): def get_mta_data():
global subway_data global subway_data
station = request.json["station"] station = request.json["station"]
if station in subway_data: if station in subway_data:
mta_data = subway_data[station] mta_data = subway_data[station]
mta_data["LastUpdated"] = subway_data["LastUpdated"] mta_data["LastUpdated"] = subway_data["LastUpdated"]
return jsonify( return jsonify(
mta_data mta_data
) )
else: else:
abort(404) abort(404)
@app.route("/stops", methods=["GET"]) @app.route("/stops", methods=["GET"])
def get_routes(): def get_routes():
return jsonify() return jsonify()
@app.route("/get_stop_id", methods=["POST"]) @app.route("/get_stop_id", methods=["POST"])
def get_stop_id(): def get_stop_id():
stop_name = request.json["stop_name"] stop_name = request.json["stop_name"]
rows = stops.loc[stops["stop_name"] == stop_name] rows = stops.loc[stops["stop_name"] == stop_name]
return jsonify({"station_changed": True}) return jsonify({"station_changed": True})
if __name__ == "__main__": if __name__ == "__main__":
api_key = os.getenv('MTA_API_KEY', '') api_key = os.getenv('MTA_API_KEY', '')
old_data = None old_data = None
last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S") last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
async def mta_callback(trains): async def mta_callback(trains):
global subway_data, old_data, last_updated global subway_data, old_data, last_updated
subway_data = link_to_station(mtaController.get_time_arriving_at_stations(trains)) subway_data = link_to_station(mtaController.get_time_arriving_at_stations(trains))
subway_data["LastUpdated"] = last_updated subway_data["LastUpdated"] = last_updated
if old_data is None: if old_data is None:
old_data = subway_data old_data = subway_data
data_diff = DeepDiff(old_data, subway_data, ignore_order=True) data_diff = DeepDiff(old_data, subway_data, ignore_order=True)
if data_diff != {}: if data_diff != {}:
old_data = subway_data old_data = subway_data
last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S") last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
app.logger.info(f"Updated Subway Data - {subway_data}") app.logger.info(f"Updated Subway Data - {subway_data}")
class threadWrapper(threading.Thread): class threadWrapper(threading.Thread):
def __init__(self, run): def __init__(self, run):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.run = run self.run = run
def run(self): def run(self):
self.run() self.run()
mtaController = MTA( mtaController = MTA(
api_key, api_key,
["A", "C", "E", "1", "2", "3"], ["A", "C", "E", "1", "2", "3"],
["127S", "127N", "A27N", "A27S"] ["127S", "127N", "A27N", "A27S"]
) )
mtaController.add_callback(mta_callback) mtaController.add_callback(mta_callback)
def start_mta(): def start_mta():
while True: while True:
try: try:
mtaController.start_updates() mtaController.start_updates()
except Exception as e: except Exception as e:
app.logger.info(f"Exception found in update function - {e}") app.logger.info(f"Exception found in update function - {e}")
threadLock = threading.Lock() threadLock = threading.Lock()
threads = [threadWrapper(start_mta)] threads = [threadWrapper(start_mta)]
for t in threads: for t in threads:
t.start() t.start()
debug = os.getenv("DEBUG", 'False').lower() in ('true', '1', 't') debug = os.getenv("DEBUG", 'False').lower() in ('true', '1', 't')
app.run(host="localhost", debug=True, port=5000) app.run(host="localhost", debug=True, port=5000)
for t in threads: for t in threads:
t.join() t.join()
print("Exiting Main Thread") print("Exiting Main Thread")

2996
stops.txt

File diff suppressed because it is too large Load Diff

View File

@@ -1,220 +1,220 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- Required meta tags --> <!-- Required meta tags -->
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="/static/css/style.css"> <link rel="stylesheet" href="/static/css/style.css">
<!-- Bootstrap CSS --> <!-- Bootstrap CSS -->
<script src="https://cdn.socket.io/3.1.3/socket.io.min.js" <script src="https://cdn.socket.io/3.1.3/socket.io.min.js"
integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh" integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh"
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap-dark-5@1.0.2/dist/css/bootstrap-night.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap-dark-5@1.0.2/dist/css/bootstrap-night.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<script <script
src="https://code.jquery.com/jquery-3.6.0.min.js" src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<script src="/static/js/MtaData.js"></script> <script src="/static/js/MtaData.js"></script>
<title>Pi MTA Display!</title> <title>Pi MTA Display!</title>
</head> </head>
<body class="dark"> <body class="dark">
<nav class="navbar navbar-dark bg-dark py-2"> <nav class="navbar navbar-dark bg-dark py-2">
<div class="container-fluid"> <div class="container-fluid">
<a class="site-title navbar-brand" href="#"> <a class="site-title navbar-brand" href="#">
<h1 class="display-1"> <h1 class="display-1">
<img src="/static/images/RPI-LOGO.png" alt="" width="43" height="50" <img src="/static/images/RPI-LOGO.png" alt="" width="43" height="50"
class="d-inline-block align-baseline"> class="d-inline-block align-baseline">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</a> </a>
<div> <div>
<div> <div>
<h3> <h3>
Last Updated:&nbsp;&nbsp;<span id="last_updated"></span> Last Updated:&nbsp;&nbsp;<span id="last_updated"></span>
</h3> </h3>
</div> </div>
<div> <div>
<h3 style="float:right"> <h3 style="float:right">
Started:&nbsp;&nbsp;<span style="float:right" id="start_time"></span> Started:&nbsp;&nbsp;<span style="float:right" id="start_time"></span>
</h3> </h3>
</div> </div>
</div> </div>
</nav> </nav>
<div id="station_1"> <div id="station_1">
<nav class="navbar navbar-dark bg-dark"> <nav class="navbar navbar-dark bg-dark">
<div class="container-fluid"> <div class="container-fluid">
<span class="navbar-brand mb-0 h1 station-name">{{station_1}}</span> <span class="navbar-brand mb-0 h1 station-name">{{station_1}}</span>
<div class="dropdown"> <div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton2" <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton2"
data-bs-toggle="dropdown" aria-expanded="false"> data-bs-toggle="dropdown" aria-expanded="false">
Select a Station Select a Station
</button> </button>
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton2"> <ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton2">
{% for item in station_names %} {% for item in station_names %}
<li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li> <li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<div class="container-fluid content-row g-0"> <div class="container-fluid content-row g-0">
<div class="row h-50 g-0"> <div class="row h-50 g-0">
<div class="col-sm-6 "> <div class="col-sm-6 ">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h1 class="display-4"> <h1 class="display-4">
North North
</h1> </h1>
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/A.svg" alt="" width="60" height="60" <img src="/static/images/lines/A.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4 align-middle"> <h1 class="display-4 align-middle">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/C.svg" alt="" width="60" height="60" <img src="/static/images/lines/C.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/E.svg" alt="" width="60" height="60" <img src="/static/images/lines/E.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="col-sm-6 "> <div class="col-sm-6 ">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h1 class="display-4"> <h1 class="display-4">
South South
</h1> </h1>
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/A.svg" alt="" width="60" height="60" <img src="/static/images/lines/A.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4 align-middle"> <h1 class="display-4 align-middle">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/C.svg" alt="" width="60" height="60" <img src="/static/images/lines/C.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/E.svg" alt="" width="60" height="60" <img src="/static/images/lines/E.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div id="station_2"> <div id="station_2">
<nav class="navbar navbar-dark bg-dark"> <nav class="navbar navbar-dark bg-dark">
<div class="container-fluid"> <div class="container-fluid">
<span class="navbar-brand mb-0 h1 station-name">{{station_2}}</span> <span class="navbar-brand mb-0 h1 station-name">{{station_2}}</span>
<div class="dropdown"> <div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton3" <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton3"
data-bs-toggle="dropdown" aria-expanded="false"> data-bs-toggle="dropdown" aria-expanded="false">
Select a Station Select a Station
</button> </button>
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton3"> <ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton3">
{% for item in station_names %} {% for item in station_names %}
<li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li> <li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<div class="container-fluid content-row g-0"> <div class="container-fluid content-row g-0">
<div class="row h-50 g-0"> <div class="row h-50 g-0">
<div class="col-sm-6 "> <div class="col-sm-6 ">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h1 class="display-4"> <h1 class="display-4">
North North
</h1> </h1>
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/A.svg" alt="" width="60" height="60" <img src="/static/images/lines/A.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4 align-middle"> <h1 class="display-4 align-middle">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/C.svg" alt="" width="60" height="60" <img src="/static/images/lines/C.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/E.svg" alt="" width="60" height="60" <img src="/static/images/lines/E.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="col-sm-6 "> <div class="col-sm-6 ">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h1 class="display-4"> <h1 class="display-4">
South South
</h1> </h1>
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/A.svg" alt="" width="60" height="60" <img src="/static/images/lines/A.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4 align-middle"> <h1 class="display-4 align-middle">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/C.svg" alt="" width="60" height="60" <img src="/static/images/lines/C.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
<li class="list-group-item station-info"> <li class="list-group-item station-info">
<img src="/static/images/lines/E.svg" alt="" width="60" height="60" <img src="/static/images/lines/E.svg" alt="" width="60" height="60"
class="align-middle"> class="align-middle">
<h1 class="display-4"> <h1 class="display-4">
Pi MTA Display! Pi MTA Display!
</h1> </h1>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -1,43 +1,43 @@
.site-title { .site-title {
font-size: 4rem; font-size: 4rem;
} }
.card-header { .card-header {
font-size: 3rem !important; font-size: 3rem !important;
} }
.station-name { .station-name {
font-size: 3.5rem !important; font-size: 3.5rem !important;
} }
.station-info { .station-info {
font-size: 2.5rem !important; font-size: 2.5rem !important;
} }
.station-info h1 { .station-info h1 {
float: right; float: right;
} }
.dropdown-menu { .dropdown-menu {
max-height: 280px; max-height: 280px;
overflow-y: auto; overflow-y: auto;
} }
@media screen and (max-width: 1000px) { @media screen and (max-width: 1000px) {
.site-title { .site-title {
font-size: 2rem !important; font-size: 2rem !important;
} }
.card-header { .card-header {
font-size: 1.5rem !important; font-size: 1.5rem !important;
} }
.station-name { .station-name {
font-size: 1.75rem !important; font-size: 1.75rem !important;
} }
.station-info { .station-info {
font-size: 1.25rem !important; font-size: 1.25rem !important;
} }
} }

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="_6-Diamond" serif:id="6 Diamond"> <g id="_6-Diamond" serif:id="6 Diamond">
<g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)"> <g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)">
<rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(0,147,59);"/> <rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(0,147,59);"/>
</g> </g>
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)"> <g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
<path d="M18.141,20.305C19.219,21.571 20.588,22.204 22.248,22.204C23.874,22.204 25.153,21.593 26.086,20.369C27.019,19.145 27.485,17.558 27.485,15.607C27.485,13.433 26.954,11.769 25.893,10.614C24.832,9.458 23.532,8.881 21.991,8.881C20.742,8.881 19.638,9.257 18.68,10.01C17.242,11.123 16.523,12.92 16.523,15.401C16.523,17.404 17.062,19.038 18.141,20.305ZM26.818,-0.669C26.818,-1.268 26.587,-1.927 26.124,-2.646C25.337,-3.809 24.148,-4.391 22.556,-4.391C20.177,-4.391 18.483,-3.056 17.473,-0.387C16.925,1.085 16.549,3.259 16.344,6.134C17.251,5.056 18.303,4.269 19.501,3.772C20.699,3.276 22.068,3.028 23.609,3.028C26.912,3.028 29.62,4.149 31.734,6.391C33.847,8.633 34.904,11.499 34.904,14.991C34.904,18.465 33.869,21.528 31.798,24.181C29.727,26.834 26.51,28.16 22.145,28.16C17.456,28.16 13.999,26.201 11.774,22.281C10.045,19.218 9.181,15.265 9.181,10.421C9.181,7.58 9.301,5.27 9.541,3.49C9.968,0.324 10.799,-2.312 12.031,-4.417C13.092,-6.214 14.482,-7.66 16.202,-8.756C17.922,-9.851 19.98,-10.398 22.376,-10.398C25.834,-10.398 28.589,-9.513 30.643,-7.741C32.696,-5.97 33.852,-3.613 34.108,-0.669L26.818,-0.669Z" style="fill:white;fill-rule:nonzero;"/> <path d="M18.141,20.305C19.219,21.571 20.588,22.204 22.248,22.204C23.874,22.204 25.153,21.593 26.086,20.369C27.019,19.145 27.485,17.558 27.485,15.607C27.485,13.433 26.954,11.769 25.893,10.614C24.832,9.458 23.532,8.881 21.991,8.881C20.742,8.881 19.638,9.257 18.68,10.01C17.242,11.123 16.523,12.92 16.523,15.401C16.523,17.404 17.062,19.038 18.141,20.305ZM26.818,-0.669C26.818,-1.268 26.587,-1.927 26.124,-2.646C25.337,-3.809 24.148,-4.391 22.556,-4.391C20.177,-4.391 18.483,-3.056 17.473,-0.387C16.925,1.085 16.549,3.259 16.344,6.134C17.251,5.056 18.303,4.269 19.501,3.772C20.699,3.276 22.068,3.028 23.609,3.028C26.912,3.028 29.62,4.149 31.734,6.391C33.847,8.633 34.904,11.499 34.904,14.991C34.904,18.465 33.869,21.528 31.798,24.181C29.727,26.834 26.51,28.16 22.145,28.16C17.456,28.16 13.999,26.201 11.774,22.281C10.045,19.218 9.181,15.265 9.181,10.421C9.181,7.58 9.301,5.27 9.541,3.49C9.968,0.324 10.799,-2.312 12.031,-4.417C13.092,-6.214 14.482,-7.66 16.202,-8.756C17.922,-9.851 19.98,-10.398 22.376,-10.398C25.834,-10.398 28.589,-9.513 30.643,-7.741C32.696,-5.97 33.852,-3.613 34.108,-0.669L26.818,-0.669Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="_7-Diamond" serif:id="7 Diamond"> <g id="_7-Diamond" serif:id="7 Diamond">
<g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)"> <g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)">
<rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(185,51,174);"/> <rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(185,51,174);"/>
</g> </g>
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)"> <g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
<path d="M35.264,-3.827C34.168,-2.748 32.645,-0.827 30.694,1.937C28.743,4.701 27.109,7.554 25.791,10.498C24.747,12.809 23.805,15.632 22.967,18.97C22.128,22.307 21.709,25.045 21.709,27.185L14.11,27.185C14.333,20.51 16.523,13.57 20.682,6.365C23.369,1.898 25.62,-1.217 27.434,-2.979L8.873,-2.979L8.976,-9.551L35.264,-9.551L35.264,-3.827Z" style="fill:white;fill-rule:nonzero;"/> <path d="M35.264,-3.827C34.168,-2.748 32.645,-0.827 30.694,1.937C28.743,4.701 27.109,7.554 25.791,10.498C24.747,12.809 23.805,15.632 22.967,18.97C22.128,22.307 21.709,25.045 21.709,27.185L14.11,27.185C14.333,20.51 16.523,13.57 20.682,6.365C23.369,1.898 25.62,-1.217 27.434,-2.979L8.873,-2.979L8.976,-9.551L35.264,-9.551L35.264,-3.827Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="A"> <g id="A">
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
<path d="M39.1243,50.8594L51.2988,50.8594L45.3092,31.9792L39.1243,50.8594ZM39.7428,21.0091L51.071,21.0091L68.0632,68.9909L57.1908,68.9909L54.0983,59.1276L36.4225,59.1276L33.1022,68.9909L22.6204,68.9909L39.7428,21.0091Z" style="fill:white;fill-rule:nonzero;"/> <path d="M39.1243,50.8594L51.2988,50.8594L45.3092,31.9792L39.1243,50.8594ZM39.7428,21.0091L51.071,21.0091L68.0632,68.9909L57.1908,68.9909L54.0983,59.1276L36.4225,59.1276L33.1022,68.9909L22.6204,68.9909L39.7428,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 765 B

After

Width:  |  Height:  |  Size: 773 B

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="B"> <g id="B">
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
<path d="M35.7389,29.3424L35.7389,39.9219L47.5228,39.9219C49.6278,39.9219 51.3368,39.5258 52.6497,38.7337C53.9627,37.9416 54.6191,36.5365 54.6191,34.5182C54.6191,32.283 53.7511,30.8073 52.015,30.0911C50.5176,29.592 48.6079,29.3424 46.2858,29.3424L35.7389,29.3424ZM35.7389,47.8646L35.7389,60.6576L47.5228,60.6576C49.6278,60.6576 51.2663,60.3754 52.4382,59.8112C54.5649,58.7695 55.6283,56.773 55.6283,53.8216C55.6283,51.326 54.5974,49.6115 52.5358,48.6784C51.3856,48.1576 49.7689,47.8863 47.6855,47.8646L35.7389,47.8646ZM61.9759,26.1198C63.4516,28.1597 64.1895,30.6011 64.1895,33.444C64.1895,36.3737 63.4516,38.7283 61.9759,40.5078C61.1513,41.5061 59.936,42.4175 58.3301,43.2422C60.7823,44.1319 62.6324,45.5425 63.8802,47.474C65.128,49.4054 65.752,51.7491 65.752,54.5052C65.752,57.3481 65.0358,59.898 63.6035,62.1549C62.6921,63.6523 61.5527,64.911 60.1855,65.931C58.6447,67.1029 56.8273,67.9058 54.7331,68.3398C52.6389,68.7739 50.3657,68.9909 47.9134,68.9909L26.1686,68.9909L26.1686,21.0091L49.4759,21.0091C55.357,21.0959 59.5237,22.7995 61.9759,26.1198Z" style="fill:white;fill-rule:nonzero;"/> <path d="M35.7389,29.3424L35.7389,39.9219L47.5228,39.9219C49.6278,39.9219 51.3368,39.5258 52.6497,38.7337C53.9627,37.9416 54.6191,36.5365 54.6191,34.5182C54.6191,32.283 53.7511,30.8073 52.015,30.0911C50.5176,29.592 48.6079,29.3424 46.2858,29.3424L35.7389,29.3424ZM35.7389,47.8646L35.7389,60.6576L47.5228,60.6576C49.6278,60.6576 51.2663,60.3754 52.4382,59.8112C54.5649,58.7695 55.6283,56.773 55.6283,53.8216C55.6283,51.326 54.5974,49.6115 52.5358,48.6784C51.3856,48.1576 49.7689,47.8863 47.6855,47.8646L35.7389,47.8646ZM61.9759,26.1198C63.4516,28.1597 64.1895,30.6011 64.1895,33.444C64.1895,36.3737 63.4516,38.7283 61.9759,40.5078C61.1513,41.5061 59.936,42.4175 58.3301,43.2422C60.7823,44.1319 62.6324,45.5425 63.8802,47.474C65.128,49.4054 65.752,51.7491 65.752,54.5052C65.752,57.3481 65.0358,59.898 63.6035,62.1549C62.6921,63.6523 61.5527,64.911 60.1855,65.931C58.6447,67.1029 56.8273,67.9058 54.7331,68.3398C52.6389,68.7739 50.3657,68.9909 47.9134,68.9909L26.1686,68.9909L26.1686,21.0091L49.4759,21.0091C55.357,21.0959 59.5237,22.7995 61.9759,26.1198Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="C"> <g id="C">
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
<path d="M30.6608,26.0221C34.5671,22.0725 39.5367,20.0977 45.5697,20.0977C53.6426,20.0977 59.5454,22.7452 63.278,28.0404C65.3396,31.0135 66.4464,33.9974 66.5983,36.9922L56.5723,36.9922C55.9212,34.6918 55.0857,32.9557 54.0658,31.7839C52.2428,29.7005 49.541,28.6589 45.9603,28.6589C42.3145,28.6589 39.439,30.1291 37.334,33.0697C35.2289,36.0102 34.1764,40.1714 34.1764,45.5534C34.1764,50.9353 35.2886,54.9664 37.513,57.6465C39.7374,60.3266 42.564,61.6667 45.9928,61.6667C49.5085,61.6667 52.1886,60.5165 54.0332,58.2161C55.0532,56.9792 55.8995,55.1237 56.5723,52.6497L66.5007,52.6497C65.6326,57.8798 63.4136,62.1332 59.8438,65.4102C56.2739,68.6871 51.7003,70.3255 46.123,70.3255C39.222,70.3255 33.7967,68.112 29.847,63.6849C25.8974,59.2361 23.9225,53.138 23.9225,45.3906C23.9225,37.0139 26.1686,30.5577 30.6608,26.0221Z" style="fill:white;fill-rule:nonzero;"/> <path d="M30.6608,26.0221C34.5671,22.0725 39.5367,20.0977 45.5697,20.0977C53.6426,20.0977 59.5454,22.7452 63.278,28.0404C65.3396,31.0135 66.4464,33.9974 66.5983,36.9922L56.5723,36.9922C55.9212,34.6918 55.0857,32.9557 54.0658,31.7839C52.2428,29.7005 49.541,28.6589 45.9603,28.6589C42.3145,28.6589 39.439,30.1291 37.334,33.0697C35.2289,36.0102 34.1764,40.1714 34.1764,45.5534C34.1764,50.9353 35.2886,54.9664 37.513,57.6465C39.7374,60.3266 42.564,61.6667 45.9928,61.6667C49.5085,61.6667 52.1886,60.5165 54.0332,58.2161C55.0532,56.9792 55.8995,55.1237 56.5723,52.6497L66.5007,52.6497C65.6326,57.8798 63.4136,62.1332 59.8438,65.4102C56.2739,68.6871 51.7003,70.3255 46.123,70.3255C39.222,70.3255 33.7967,68.112 29.847,63.6849C25.8974,59.2361 23.9225,53.138 23.9225,45.3906C23.9225,37.0139 26.1686,30.5577 30.6608,26.0221Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="D"> <g id="D">
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
<path d="M35.7389,29.3424L35.7389,60.6576L44.9837,60.6576C49.7146,60.6576 53.0132,58.3247 54.8796,53.6589C55.8995,51.0981 56.4095,48.049 56.4095,44.5117C56.4095,39.6289 55.6445,35.88 54.1146,33.265C52.5846,30.65 49.541,29.3424 44.9837,29.3424L35.7389,29.3424ZM54.0983,22.0508C57.462,23.1576 60.1855,25.1866 62.2689,28.138C63.9399,30.5252 65.0792,33.1076 65.6868,35.8854C66.2945,38.6632 66.5983,41.3108 66.5983,43.8281C66.5983,50.2083 65.3179,55.612 62.7572,60.0391C59.2849,66.0069 53.9247,68.9909 46.6764,68.9909L26.0059,68.9909L26.0059,21.0091L46.6764,21.0091C49.6495,21.0525 52.1235,21.3997 54.0983,22.0508Z" style="fill:white;fill-rule:nonzero;"/> <path d="M35.7389,29.3424L35.7389,60.6576L44.9837,60.6576C49.7146,60.6576 53.0132,58.3247 54.8796,53.6589C55.8995,51.0981 56.4095,48.049 56.4095,44.5117C56.4095,39.6289 55.6445,35.88 54.1146,33.265C52.5846,30.65 49.541,29.3424 44.9837,29.3424L35.7389,29.3424ZM54.0983,22.0508C57.462,23.1576 60.1855,25.1866 62.2689,28.138C63.9399,30.5252 65.0792,33.1076 65.6868,35.8854C66.2945,38.6632 66.5983,41.3108 66.5983,43.8281C66.5983,50.2083 65.3179,55.612 62.7572,60.0391C59.2849,66.0069 53.9247,68.9909 46.6764,68.9909L26.0059,68.9909L26.0059,21.0091L46.6764,21.0091C49.6495,21.0525 52.1235,21.3997 54.0983,22.0508Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="E"> <g id="E">
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
<path d="M63.3268,29.5052L37.9362,29.5052L37.9362,39.694L61.2435,39.694L61.2435,48.0273L37.9362,48.0273L37.9362,60.3646L64.4987,60.3646L64.4987,68.9909L28.138,68.9909L28.138,21.0091L63.3268,21.0091L63.3268,29.5052Z" style="fill:white;fill-rule:nonzero;"/> <path d="M63.3268,29.5052L37.9362,29.5052L37.9362,39.694L61.2435,39.694L61.2435,48.0273L37.9362,48.0273L37.9362,60.3646L64.4987,60.3646L64.4987,68.9909L28.138,68.9909L28.138,21.0091L63.3268,21.0091L63.3268,29.5052Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 761 B

After

Width:  |  Height:  |  Size: 769 B

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="F"> <g id="F">
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
<path d="M29.7168,21.0742L63.7337,21.0742L63.7337,29.5052L39.6777,29.5052L39.6777,40.5404L60.7389,40.5404L60.7389,48.8737L39.6777,48.8737L39.6777,68.9909L29.7168,68.9909L29.7168,21.0742Z" style="fill:white;fill-rule:nonzero;"/> <path d="M29.7168,21.0742L63.7337,21.0742L63.7337,29.5052L39.6777,29.5052L39.6777,40.5404L60.7389,40.5404L60.7389,48.8737L39.6777,48.8737L39.6777,68.9909L29.7168,68.9909L29.7168,21.0742Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 733 B

After

Width:  |  Height:  |  Size: 741 B

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="G"> <g id="G">
<circle cx="45" cy="45" r="45" style="fill:rgb(109,190,69);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(109,190,69);"/>
<path d="M56.4095,35.9831C55.65,32.7062 53.7945,30.4167 50.8431,29.1146C49.1938,28.3984 47.36,28.0404 45.3418,28.0404C41.4789,28.0404 38.3051,29.4998 35.8203,32.4186C33.3355,35.3375 32.0931,39.7266 32.0931,45.5859C32.0931,51.4887 33.4386,55.6662 36.1296,58.1185C38.8205,60.5707 41.8804,61.7969 45.3092,61.7969C48.673,61.7969 51.429,60.8257 53.5775,58.8835C55.7259,56.9412 57.0497,54.3967 57.5488,51.25L46.4486,51.25L46.4486,43.2422L66.4355,43.2422L66.4355,68.9909L59.7949,68.9909L58.7858,63.0013C56.8544,65.2799 55.1183,66.8859 53.5775,67.819C50.9299,69.4466 47.6747,70.2604 43.8118,70.2604C37.4533,70.2604 32.245,68.0577 28.1868,63.6523C23.9551,59.2253 21.8392,53.1706 21.8392,45.4883C21.8392,37.7192 23.9768,31.4909 28.252,26.8034C32.5271,22.1159 38.1803,19.7721 45.2116,19.7721C51.3097,19.7721 56.2088,21.3184 59.9089,24.4108C63.6089,27.5033 65.7303,31.3607 66.2728,35.9831L56.4095,35.9831Z" style="fill:white;fill-rule:nonzero;"/> <path d="M56.4095,35.9831C55.65,32.7062 53.7945,30.4167 50.8431,29.1146C49.1938,28.3984 47.36,28.0404 45.3418,28.0404C41.4789,28.0404 38.3051,29.4998 35.8203,32.4186C33.3355,35.3375 32.0931,39.7266 32.0931,45.5859C32.0931,51.4887 33.4386,55.6662 36.1296,58.1185C38.8205,60.5707 41.8804,61.7969 45.3092,61.7969C48.673,61.7969 51.429,60.8257 53.5775,58.8835C55.7259,56.9412 57.0497,54.3967 57.5488,51.25L46.4486,51.25L46.4486,43.2422L66.4355,43.2422L66.4355,68.9909L59.7949,68.9909L58.7858,63.0013C56.8544,65.2799 55.1183,66.8859 53.5775,67.819C50.9299,69.4466 47.6747,70.2604 43.8118,70.2604C37.4533,70.2604 32.245,68.0577 28.1868,63.6523C23.9551,59.2253 21.8392,53.1706 21.8392,45.4883C21.8392,37.7192 23.9768,31.4909 28.252,26.8034C32.5271,22.1159 38.1803,19.7721 45.2116,19.7721C51.3097,19.7721 56.2088,21.3184 59.9089,24.4108C63.6089,27.5033 65.7303,31.3607 66.2728,35.9831L56.4095,35.9831Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g transform="matrix(1,0,0,1,-5,-5)"> <g transform="matrix(1,0,0,1,-5,-5)">
<g id="H"> <g id="H">
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)"> <g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(40,82,173);"/> <circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(40,82,173);"/>
</g> </g>
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)"> <g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
<path d="M7.127,27.185L7.127,-10.655L14.957,-10.655L14.957,3.772L29.744,3.772L29.744,-10.655L37.6,-10.655L37.6,27.185L29.744,27.185L29.744,10.293L14.957,10.293L14.957,27.185L7.127,27.185Z" style="fill:white;fill-rule:nonzero;"/> <path d="M7.127,27.185L7.127,-10.655L14.957,-10.655L14.957,3.772L29.744,3.772L29.744,-10.655L37.6,-10.655L37.6,27.185L29.744,27.185L29.744,10.293L14.957,10.293L14.957,27.185L7.127,27.185Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="J"> <g id="J">
<circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/>
<path d="M37.3991,50.7943L37.3991,51.901C37.4859,55.612 37.8928,58.2216 38.6198,59.7298C39.3468,61.2381 40.9039,61.9922 43.291,61.9922C45.6565,61.9922 47.219,61.1675 47.9785,59.5182C48.4342,58.5417 48.6621,56.8924 48.6621,54.5703L48.6621,21.0091L58.6882,21.0091L58.6882,54.4076C58.6882,58.4874 57.9829,61.7209 56.5723,64.1081C54.1851,68.1445 49.8774,70.1628 43.6491,70.1628C37.4208,70.1628 33.2433,68.5297 31.1165,65.2637C28.9898,61.9976 27.9264,57.5434 27.9264,51.901L27.9264,50.7943L37.3991,50.7943Z" style="fill:white;fill-rule:nonzero;"/> <path d="M37.3991,50.7943L37.3991,51.901C37.4859,55.612 37.8928,58.2216 38.6198,59.7298C39.3468,61.2381 40.9039,61.9922 43.291,61.9922C45.6565,61.9922 47.219,61.1675 47.9785,59.5182C48.4342,58.5417 48.6621,56.8924 48.6621,54.5703L48.6621,21.0091L58.6882,21.0091L58.6882,54.4076C58.6882,58.4874 57.9829,61.7209 56.5723,64.1081C54.1851,68.1445 49.8774,70.1628 43.6491,70.1628C37.4208,70.1628 33.2433,68.5297 31.1165,65.2637C28.9898,61.9976 27.9264,57.5434 27.9264,51.901L27.9264,50.7943L37.3991,50.7943Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="L"> <g id="L">
<circle cx="45" cy="45" r="45" style="fill:rgb(167,169,172);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(167,169,172);"/>
<path d="M29.7168,21.0091L39.7428,21.0091L39.7428,60.3646L63.5059,60.3646L63.5059,68.9909L29.7168,68.9909L29.7168,21.0091Z" style="fill:white;fill-rule:nonzero;"/> <path d="M29.7168,21.0091L39.7428,21.0091L39.7428,60.3646L63.5059,60.3646L63.5059,68.9909L29.7168,68.9909L29.7168,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 671 B

After

Width:  |  Height:  |  Size: 679 B

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="M"> <g id="M">
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
<path d="M54.1146,21.0091L68.5352,21.0091L68.5352,68.9909L59.1927,68.9909L59.1927,36.5365C59.1927,35.6033 59.2036,34.2958 59.2253,32.6139C59.247,30.9321 59.2578,29.6354 59.2578,28.724L50.1758,68.9909L40.4427,68.9909L31.4258,28.724C31.4258,29.6354 31.4366,30.9321 31.4583,32.6139C31.48,34.2958 31.4909,35.6033 31.4909,36.5365L31.4909,68.9909L22.1484,68.9909L22.1484,21.0091L36.7318,21.0091L45.4557,58.737L54.1146,21.0091Z" style="fill:white;fill-rule:nonzero;"/> <path d="M54.1146,21.0091L68.5352,21.0091L68.5352,68.9909L59.1927,68.9909L59.1927,36.5365C59.1927,35.6033 59.2036,34.2958 59.2253,32.6139C59.247,30.9321 59.2578,29.6354 59.2578,28.724L50.1758,68.9909L40.4427,68.9909L31.4258,28.724C31.4258,29.6354 31.4366,30.9321 31.4583,32.6139C31.48,34.2958 31.4909,35.6033 31.4909,36.5365L31.4909,68.9909L22.1484,68.9909L22.1484,21.0091L36.7318,21.0091L45.4557,58.737L54.1146,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 967 B

After

Width:  |  Height:  |  Size: 975 B

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="N"> <g id="N">
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
<path d="M25.8431,21.0091L36.3574,21.0091L55.4655,54.5052L55.4655,21.0091L64.8079,21.0091L64.8079,68.9909L54.7819,68.9909L35.1855,34.9089L35.1855,68.9909L25.8431,68.9909L25.8431,21.0091Z" style="fill:black;fill-rule:nonzero;"/> <path d="M25.8431,21.0091L36.3574,21.0091L55.4655,54.5052L55.4655,21.0091L64.8079,21.0091L64.8079,68.9909L54.7819,68.9909L35.1855,34.9089L35.1855,68.9909L25.8431,68.9909L25.8431,21.0091Z" style="fill:black;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 734 B

After

Width:  |  Height:  |  Size: 742 B

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="Q"> <g id="Q">
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
<path d="M48.597,61.4063C49.1829,61.2543 49.9316,60.9831 50.8431,60.5924L45.9928,55.9701L51.1686,50.5664L56.0189,55.1888C56.7784,53.6263 57.3101,52.2591 57.6139,51.0872C58.0914,49.3294 58.3301,47.2786 58.3301,44.9349C58.3301,39.553 57.2287,35.3917 55.026,32.4512C52.8234,29.5106 49.6061,28.0404 45.3743,28.0404C41.403,28.0404 38.2346,29.451 35.8691,32.2721C33.5037,35.0933 32.321,39.3142 32.321,44.9349C32.321,51.5104 34.0137,56.2196 37.3991,59.0625C39.5909,60.9071 42.2168,61.8294 45.2767,61.8294C46.4269,61.8294 47.5336,61.6884 48.597,61.4063ZM66.7936,54.9609C65.9473,57.717 64.6994,60.0065 63.0501,61.8294L68.584,67.0052L63.3431,72.474L57.5488,67.0052C55.791,68.0686 54.2719,68.8173 52.9915,69.2513C50.8431,69.9674 48.2715,70.3255 45.2767,70.3255C39.0267,70.3255 33.8618,68.4592 29.7819,64.7266C24.834,60.2344 22.36,53.6372 22.36,44.9349C22.36,36.1675 24.8991,29.5378 29.9772,25.0456C34.1222,21.378 39.2763,19.5443 45.4395,19.5443C51.6461,19.5443 56.8544,21.4865 61.0645,25.3711C65.9256,29.8633 68.3561,36.1458 68.3561,44.2188C68.3561,48.4939 67.8353,52.0747 66.7936,54.9609Z" style="fill:black;fill-rule:nonzero;"/> <path d="M48.597,61.4063C49.1829,61.2543 49.9316,60.9831 50.8431,60.5924L45.9928,55.9701L51.1686,50.5664L56.0189,55.1888C56.7784,53.6263 57.3101,52.2591 57.6139,51.0872C58.0914,49.3294 58.3301,47.2786 58.3301,44.9349C58.3301,39.553 57.2287,35.3917 55.026,32.4512C52.8234,29.5106 49.6061,28.0404 45.3743,28.0404C41.403,28.0404 38.2346,29.451 35.8691,32.2721C33.5037,35.0933 32.321,39.3142 32.321,44.9349C32.321,51.5104 34.0137,56.2196 37.3991,59.0625C39.5909,60.9071 42.2168,61.8294 45.2767,61.8294C46.4269,61.8294 47.5336,61.6884 48.597,61.4063ZM66.7936,54.9609C65.9473,57.717 64.6994,60.0065 63.0501,61.8294L68.584,67.0052L63.3431,72.474L57.5488,67.0052C55.791,68.0686 54.2719,68.8173 52.9915,69.2513C50.8431,69.9674 48.2715,70.3255 45.2767,70.3255C39.0267,70.3255 33.8618,68.4592 29.7819,64.7266C24.834,60.2344 22.36,53.6372 22.36,44.9349C22.36,36.1675 24.8991,29.5378 29.9772,25.0456C34.1222,21.378 39.2763,19.5443 45.4395,19.5443C51.6461,19.5443 56.8544,21.4865 61.0645,25.3711C65.9256,29.8633 68.3561,36.1458 68.3561,44.2188C68.3561,48.4939 67.8353,52.0747 66.7936,54.9609Z" style="fill:black;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="R"> <g id="R">
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
<path d="M36.0319,29.3424L36.0319,42.2331L47.3926,42.2331C49.6495,42.2331 51.3422,41.9727 52.4707,41.4518C54.4672,40.5404 55.4655,38.7391 55.4655,36.0482C55.4655,33.1402 54.4998,31.1871 52.5684,30.1888C51.4833,29.6246 49.8557,29.3424 47.6855,29.3424L36.0319,29.3424ZM57.5326,22.2461C59.3446,23.0056 60.88,24.1233 62.1387,25.599C63.1803,26.8142 64.005,28.1597 64.6126,29.6354C65.2203,31.1111 65.5241,32.793 65.5241,34.681C65.5241,36.9596 64.949,39.2003 63.7988,41.403C62.6487,43.6057 60.7498,45.1628 58.1022,46.0742C60.3158,46.964 61.8837,48.2281 62.806,49.8665C63.7283,51.505 64.1895,54.0061 64.1895,57.3698L64.1895,60.5924C64.1895,62.7843 64.2763,64.2708 64.4499,65.0521C64.7103,66.2891 65.3179,67.2005 66.2728,67.7865L66.2728,68.9909L55.2376,68.9909C54.9338,67.9275 54.7168,67.0703 54.5866,66.4193C54.3262,65.0738 54.1851,63.6957 54.1634,62.2852L54.0983,57.8255C54.0549,54.7656 53.4961,52.7257 52.4219,51.7057C51.3477,50.6858 49.3349,50.1758 46.3835,50.1758L36.0319,50.1758L36.0319,68.9909L26.2337,68.9909L26.2337,21.0091L49.7689,21.0091C53.1326,21.0742 55.7205,21.4865 57.5326,22.2461Z" style="fill:black;fill-rule:nonzero;"/> <path d="M36.0319,29.3424L36.0319,42.2331L47.3926,42.2331C49.6495,42.2331 51.3422,41.9727 52.4707,41.4518C54.4672,40.5404 55.4655,38.7391 55.4655,36.0482C55.4655,33.1402 54.4998,31.1871 52.5684,30.1888C51.4833,29.6246 49.8557,29.3424 47.6855,29.3424L36.0319,29.3424ZM57.5326,22.2461C59.3446,23.0056 60.88,24.1233 62.1387,25.599C63.1803,26.8142 64.005,28.1597 64.6126,29.6354C65.2203,31.1111 65.5241,32.793 65.5241,34.681C65.5241,36.9596 64.949,39.2003 63.7988,41.403C62.6487,43.6057 60.7498,45.1628 58.1022,46.0742C60.3158,46.964 61.8837,48.2281 62.806,49.8665C63.7283,51.505 64.1895,54.0061 64.1895,57.3698L64.1895,60.5924C64.1895,62.7843 64.2763,64.2708 64.4499,65.0521C64.7103,66.2891 65.3179,67.2005 66.2728,67.7865L66.2728,68.9909L55.2376,68.9909C54.9338,67.9275 54.7168,67.0703 54.5866,66.4193C54.3262,65.0738 54.1851,63.6957 54.1634,62.2852L54.0983,57.8255C54.0549,54.7656 53.4961,52.7257 52.4219,51.7057C51.3477,50.6858 49.3349,50.1758 46.3835,50.1758L36.0319,50.1758L36.0319,68.9909L26.2337,68.9909L26.2337,21.0091L49.7689,21.0091C53.1326,21.0742 55.7205,21.4865 57.5326,22.2461Z" style="fill:black;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="S"> <g id="S">
<circle cx="45" cy="45" r="45" style="fill:rgb(128,129,131);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(128,129,131);"/>
<path d="M35.1042,54.1797C35.408,56.3715 36.0048,58.01 36.8945,59.0951C38.5221,61.0699 41.3108,62.0573 45.2604,62.0573C47.6259,62.0573 49.5464,61.7969 51.0221,61.276C53.8216,60.2778 55.2214,58.4223 55.2214,55.7096C55.2214,54.1254 54.5269,52.8993 53.138,52.0313C51.7491,51.1849 49.5681,50.4362 46.5951,49.7852L41.5169,48.6458C36.5256,47.5174 33.0751,46.2912 31.1654,44.9674C27.9319,42.7539 26.3151,39.2925 26.3151,34.5833C26.3151,30.2865 27.8776,26.7166 31.0026,23.8737C34.1276,21.0308 38.7174,19.6094 44.7721,19.6094C49.8286,19.6094 54.1417,20.9494 57.7116,23.6296C61.2815,26.3097 63.1532,30.1997 63.3268,35.2995L53.6914,35.2995C53.5178,32.4132 52.2591,30.3624 49.9154,29.1471C48.3529,28.3442 46.4106,27.9427 44.0885,27.9427C41.5061,27.9427 39.4444,28.4635 37.9036,29.5052C36.3628,30.5469 35.5924,32.0009 35.5924,33.8672C35.5924,35.5816 36.352,36.862 37.8711,37.7083C38.8477,38.2726 40.931,38.9345 44.1211,39.694L52.3893,41.6797C56.0135,42.5477 58.7478,43.7088 60.5924,45.1628C63.457,47.4197 64.8893,50.6858 64.8893,54.9609C64.8893,59.3446 63.2129,62.985 59.86,65.8822C56.5072,68.7793 51.7708,70.2279 45.651,70.2279C39.401,70.2279 34.4857,68.801 30.9049,65.9473C27.3242,63.0935 25.5339,59.171 25.5339,54.1797L35.1042,54.1797Z" style="fill:white;fill-rule:nonzero;"/> <path d="M35.1042,54.1797C35.408,56.3715 36.0048,58.01 36.8945,59.0951C38.5221,61.0699 41.3108,62.0573 45.2604,62.0573C47.6259,62.0573 49.5464,61.7969 51.0221,61.276C53.8216,60.2778 55.2214,58.4223 55.2214,55.7096C55.2214,54.1254 54.5269,52.8993 53.138,52.0313C51.7491,51.1849 49.5681,50.4362 46.5951,49.7852L41.5169,48.6458C36.5256,47.5174 33.0751,46.2912 31.1654,44.9674C27.9319,42.7539 26.3151,39.2925 26.3151,34.5833C26.3151,30.2865 27.8776,26.7166 31.0026,23.8737C34.1276,21.0308 38.7174,19.6094 44.7721,19.6094C49.8286,19.6094 54.1417,20.9494 57.7116,23.6296C61.2815,26.3097 63.1532,30.1997 63.3268,35.2995L53.6914,35.2995C53.5178,32.4132 52.2591,30.3624 49.9154,29.1471C48.3529,28.3442 46.4106,27.9427 44.0885,27.9427C41.5061,27.9427 39.4444,28.4635 37.9036,29.5052C36.3628,30.5469 35.5924,32.0009 35.5924,33.8672C35.5924,35.5816 36.352,36.862 37.8711,37.7083C38.8477,38.2726 40.931,38.9345 44.1211,39.694L52.3893,41.6797C56.0135,42.5477 58.7478,43.7088 60.5924,45.1628C63.457,47.4197 64.8893,50.6858 64.8893,54.9609C64.8893,59.3446 63.2129,62.985 59.86,65.8822C56.5072,68.7793 51.7708,70.2279 45.651,70.2279C39.401,70.2279 34.4857,68.801 30.9049,65.9473C27.3242,63.0935 25.5339,59.171 25.5339,54.1797L35.1042,54.1797Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g transform="matrix(1,0,0,1,-5,-5)"> <g transform="matrix(1,0,0,1,-5,-5)">
<g id="T"> <g id="T">
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)"> <g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(0,174,239);"/> <circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(0,174,239);"/>
</g> </g>
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)"> <g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
<path d="M37.6,-10.655L37.6,-3.955L26.278,-3.955L26.278,27.185L18.32,27.185L18.32,-3.955L6.948,-3.955L6.948,-10.655L37.6,-10.655Z" style="fill:white;fill-rule:nonzero;"/> <path d="M37.6,-10.655L37.6,-3.955L26.278,-3.955L26.278,27.185L18.32,27.185L18.32,-3.955L6.948,-3.955L6.948,-10.655L37.6,-10.655Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 997 B

After

Width:  |  Height:  |  Size: 1011 B

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g transform="matrix(1,0,0,1,-5,-5)"> <g transform="matrix(1,0,0,1,-5,-5)">
<g id="W"> <g id="W">
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)"> <g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(252,204,10);"/> <circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(252,204,10);"/>
</g> </g>
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)"> <g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
<path d="M6.511,-10.655L11.517,11.012L12.596,17.044L13.699,11.14L17.961,-10.655L26.304,-10.655L30.797,11.012L31.952,17.044L33.107,11.243L38.164,-10.655L46.2,-10.655L35.546,27.185L27.998,27.185L23.429,5.056L22.094,-2.261L20.759,5.056L16.19,27.185L8.847,27.185L-1.883,-10.655L6.511,-10.655Z" style="fill:black;fill-rule:nonzero;"/> <path d="M6.511,-10.655L11.517,11.012L12.596,17.044L13.699,11.14L17.961,-10.655L26.304,-10.655L30.797,11.012L31.952,17.044L33.107,11.243L38.164,-10.655L46.2,-10.655L35.546,27.185L27.998,27.185L23.429,5.056L22.094,-2.261L20.759,5.056L16.19,27.185L8.847,27.185L-1.883,-10.655L6.511,-10.655Z" style="fill:black;fill-rule:nonzero;"/>
</g> </g>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> <svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="Z"> <g id="Z">
<circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/> <circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/>
<path d="M26.3314,60.5273L51.1035,29.5052L26.9499,29.5052L26.9499,21.0091L63.6035,21.0091L63.6035,29.0495L38.5059,60.5273L63.6686,60.5273L63.6686,68.9909L26.3314,68.9909L26.3314,60.5273Z" style="fill:white;fill-rule:nonzero;"/> <path d="M26.3314,60.5273L51.1035,29.5052L26.9499,29.5052L26.9499,21.0091L63.6035,21.0091L63.6035,29.0495L38.5059,60.5273L63.6686,60.5273L63.6686,68.9909L26.3314,68.9909L26.3314,60.5273Z" style="fill:white;fill-rule:nonzero;"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 734 B

After

Width:  |  Height:  |  Size: 742 B

View File

@@ -1,123 +1,123 @@
$(document).ready(function () { $(document).ready(function () {
function updateStationData(station) { function updateStationData(station) {
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: '/mta_data', url: '/mta_data',
contentType: "application/json", contentType: "application/json",
dataType: "json", dataType: "json",
async: true, async: true,
data: JSON.stringify({"station": station.find('.station-name:first').get(0).innerText}, null, '\t'), data: JSON.stringify({"station": station.find('.station-name:first').get(0).innerText}, null, '\t'),
success: function (data) { success: function (data) {
updateStation(station, data) updateStation(station, data)
}, },
error: function (request) { error: function (request) {
console.log(request.responseText); console.log(request.responseText);
} }
}); });
} }
function updateStartTime() { function updateStartTime() {
$.ajax({ $.ajax({
type: "get", type: "get",
url: '/start_time', url: '/start_time',
async: true, async: true,
success: function (data) { success: function (data) {
console.log("GETTING TIME") console.log("GETTING TIME")
console.log(data); console.log(data);
$("#start_time").text(data) $("#start_time").text(data)
}, },
error: function (request) { error: function (request) {
console.log(request.responseText); console.log(request.responseText);
} }
}); });
} }
function updateStation(station, data) { function updateStation(station, data) {
updateDirections(station, data, "North"); updateDirections(station, data, "North");
updateDirections(station, data, "South"); updateDirections(station, data, "South");
updateTime(data["LastUpdated"]) updateTime(data["LastUpdated"])
} }
function updateTime(lastUpdated) { function updateTime(lastUpdated) {
console.log(lastUpdated) console.log(lastUpdated)
$("#last_updated").text(lastUpdated) $("#last_updated").text(lastUpdated)
} }
function updateDirections(station, data, direction) { function updateDirections(station, data, direction) {
n = data[direction] n = data[direction]
list_items = station.find(".card:".concat(direction === "North" ? "first" : "last")).find(".station-info") list_items = station.find(".card:".concat(direction === "North" ? "first" : "last")).find(".station-info")
var i = 0; var i = 0;
for (var train in n) { for (var train in n) {
updateLineItem(list_items.get(i), n[train], train) updateLineItem(list_items.get(i), n[train], train)
i = i + 1 i = i + 1
} }
if (i < 3) { if (i < 3) {
console.log("Only 2 items updated") console.log("Only 2 items updated")
for (let remainingIndex = i; remainingIndex < 3; remainingIndex++) { for (let remainingIndex = i; remainingIndex < 3; remainingIndex++) {
updateLineItem(list_items.get(i), "No Trains Available", "N/A") updateLineItem(list_items.get(i), "No Trains Available", "N/A")
} }
} }
} }
function updateLineItem(listItem, times, train) { function updateLineItem(listItem, times, train) {
var timeString; var timeString;
if (typeof times === 'string' || times instanceof String) { if (typeof times === 'string' || times instanceof String) {
timeString = times; timeString = times;
} else { } else {
timeString = times.sort(function (a, b) { timeString = times.sort(function (a, b) {
return a - b; return a - b;
}).join(", "); }).join(", ");
} }
$(listItem).find("h1").text(timeString); $(listItem).find("h1").text(timeString);
if (imageExists("/static/images/lines/" + train + ".svg")) { if (imageExists("/static/images/lines/" + train + ".svg")) {
$(listItem).show() $(listItem).show()
$(listItem).find("img").attr("src", "/static/images/lines/" + train + ".svg") $(listItem).find("img").attr("src", "/static/images/lines/" + train + ".svg")
} else if (train === "N/A") { } else if (train === "N/A") {
console.log("Route Is NA - Disabling Route") console.log("Route Is NA - Disabling Route")
console.log($(listItem)) console.log($(listItem))
$(listItem).hide() $(listItem).hide()
} }
} }
function imageExists(image_url) { function imageExists(image_url) {
var http = new XMLHttpRequest(); var http = new XMLHttpRequest();
http.open('HEAD', image_url, false); http.open('HEAD', image_url, false);
http.send(); http.send();
return http.status != 404; return http.status != 404;
} }
const interval = setInterval(function () { const interval = setInterval(function () {
updateStationData($('#station_1')) updateStationData($('#station_1'))
}, 5000); }, 5000);
const interval2 = setInterval(function () { const interval2 = setInterval(function () {
updateStationData($('#station_2')) updateStationData($('#station_2'))
}, 6000); }, 6000);
updateStartTime(); updateStartTime();
}); });
function setStation(ele) { function setStation(ele) {
console.log(ele) console.log(ele)
console.log($(ele).text()) console.log($(ele).text())
var stop_name = ele.text; var stop_name = ele.text;
$.ajax({ $.ajax({
type: "POST", type: "POST",
//the url where you want to sent the userName and password to //the url where you want to sent the userName and password to
url: '/get_stop_id', url: '/get_stop_id',
contentType: "application/json", contentType: "application/json",
dataType: "json", dataType: "json",
async: true, async: true,
//json object to sent to the authentication url //json object to sent to the authentication url
data: JSON.stringify({"stop_name": stop_name}, null, '\t'), data: JSON.stringify({"stop_name": stop_name}, null, '\t'),
success: function (data, text) { success: function (data, text) {
alert(JSON.stringify(data)); alert(JSON.stringify(data));
}, },
error: function (request, status, error) { error: function (request, status, error) {
alert(request.responseText); alert(request.responseText);
} }
}); });
} }