diff --git a/.gitignore b/.gitignore
index ef987f7a..2cc796cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -159,26 +159,28 @@ cython_debug/
# Render output folder
/out
# Temporary logging directory
-/tmp
+/logs
# PSD templates directory
/templates
# For personal testing
/testing.py
# User generated data files
-/proxyshop/datas/
+/src/data/sets/
# User specific version tracker
-/proxyshop/version_tracker.json
+/src/data/version_tracker.json
# Generated new release
/release
# Environmental variables
-/proxyshop/__env__.py
+/src/__env__.py
# All plugins that aren't MrTeferi or SilvanMTG
-/proxyshop/plugins/*
-!/proxyshop/plugins/MrTeferi
-!/proxyshop/plugins/SilvanMTG
+/plugins/*
+!/plugins/MrTeferi
+!/plugins/SilvanMTG
+# All plugin templates
+/plugins/*/templates/*
# User generated config files
-/proxyshop/configs/*.ini
+/src/configs/*.ini
# User generated plugin config files
-/proxyshop/plugins/*/configs/*.ini
+/plugins/*/configs/*.ini
# Test generated symbol images
-/proxyshop/tests/symbols/**/*[.png, .jpg, .jpeg, .tif, .tga, .webp, .psd]
\ No newline at end of file
+/src/tests/symbols/**/*[.png, .jpg, .jpeg, .tif, .tga, .webp, .psd]
\ No newline at end of file
diff --git a/.idea/Proxyshop.iml b/.idea/Proxyshop.iml
index d6a00441..992135e5 100644
--- a/.idea/Proxyshop.iml
+++ b/.idea/Proxyshop.iml
@@ -4,7 +4,7 @@
-
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3f4a9f69..1914eb43 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/Proxyshop.spec b/Proxyshop.spec
index 6096fa3d..1c8fee9b 100644
--- a/Proxyshop.spec
+++ b/Proxyshop.spec
@@ -8,8 +8,8 @@ a = Analysis(['..\\Proxyshop\main.py'],
binaries=[],
datas=[],
hiddenimports=[
- 'proxyshop.templates',
- 'proxyshop.gui',
+ 'src.templates',
+ 'src.gui',
'kivy',
'svglib.svglib',
'reportlab.graphics',
@@ -28,7 +28,7 @@ pyz = PYZ(a.pure, a.zipped_data,
a.datas += [
('fonts/Beleren Small Caps.ttf', 'fonts/Beleren Small Caps.ttf', 'DATA'),
- ('proxyshop/img/proxyshop.png', 'proxyshop/img/proxyshop.png', 'DATA')
+ ('src/img/proxyshop.png', 'src/img/proxyshop.png', 'DATA')
]
exe = EXE(pyz,
@@ -47,4 +47,4 @@ exe = EXE(pyz,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
- icon='proxyshop/img/favicon.ico')
+ icon='src/img/favicon.ico')
diff --git a/build.py b/build.py
index 523b9370..7a58e13c 100644
--- a/build.py
+++ b/build.py
@@ -8,14 +8,20 @@
from shutil import copy2, copytree, rmtree, move
import PyInstaller.__main__
-from proxyshop.__version__ import version
+from src.__version__ import version
# Folder definitions
CWD = os.getcwd()
-PS = os.path.join(os.getcwd(), 'proxyshop')
DIST = os.path.join(CWD, 'dist')
-DIST_PS = os.path.join(os.getcwd(), 'dist/proxyshop')
-DIST_PS_PLUGINS = os.path.join(DIST_PS, 'plugins')
+
+SRC = os.path.join(CWD, 'src')
+DIST_SRC = os.path.join(DIST, 'src')
+
+DATA = os.path.join(SRC, 'data')
+DIST_DATA = os.path.join(DIST_SRC, 'data')
+
+PLUGINS = os.path.join(CWD, 'plugins')
+DIST_PLUGINS = os.path.join(DIST, 'plugins')
# All individual files that need to be copied upon pyinstaller completion
files = [
@@ -24,12 +30,12 @@
{'src': os.path.join(CWD, 'LICENSE'), 'dst': os.path.join(DIST, 'LICENSE')},
{'src': os.path.join(CWD, 'README.md'), 'dst': os.path.join(DIST, 'README.md')},
# --- PROXYSHOP DIRECTORY
- {'src': os.path.join(PS, 'tests.json'), 'dst': os.path.join(DIST_PS, 'tests.json')},
- {'src': os.path.join(PS, 'manifest.json'), 'dst': os.path.join(DIST_PS, 'manifest.json')},
- {'src': os.path.join(PS, 'symbols.json'), 'dst': os.path.join(DIST_PS, 'symbols.json')},
- {'src': os.path.join(PS, 'custom_symbols.json'), 'dst': os.path.join(DIST_PS, 'custom_symbols.json')},
- {'src': os.path.join(PS, 'templates.json'), 'dst': os.path.join(DIST_PS, 'templates.json')},
- {'src': os.path.join(PS, 'app_settings.json'), 'dst': os.path.join(DIST_PS, 'app_settings.json')},
+ {'src': os.path.join(DATA, 'tests.json'), 'dst': os.path.join(DIST_DATA, 'tests.json')},
+ {'src': os.path.join(DATA, 'manifest.json'), 'dst': os.path.join(DIST_DATA, 'manifest.json')},
+ {'src': os.path.join(DATA, 'symbols.json'), 'dst': os.path.join(DIST_DATA, 'symbols.json')},
+ {'src': os.path.join(DATA, 'templates.json'), 'dst': os.path.join(DIST_DATA, 'templates.json')},
+ {'src': os.path.join(DATA, 'watermarks.json'), 'dst': os.path.join(DIST_DATA, 'watermarks.json')},
+ {'src': os.path.join(DATA, 'app_settings.json'), 'dst': os.path.join(DIST_DATA, 'app_settings.json')},
]
# Folders that need to be copied
@@ -37,19 +43,21 @@
# --- WORKING DIRECTORY
{'src': os.path.join(CWD, "fonts"), 'dst': os.path.join(DIST, 'fonts')},
# --- PROXYSHOP DIRECTORY
- {'src': os.path.join(PS, "kv"), 'dst': os.path.join(DIST_PS, 'kv')},
- {'src': os.path.join(PS, "img"), 'dst': os.path.join(DIST_PS, 'img')},
- {'src': os.path.join(PS, "configs"), 'dst': os.path.join(DIST_PS, 'configs')},
+ {'src': os.path.join(SRC, "kv"), 'dst': os.path.join(DIST_SRC, 'kv')},
+ {'src': os.path.join(SRC, "img"), 'dst': os.path.join(DIST_SRC, 'img')},
+ {'src': os.path.join(SRC, "configs"), 'dst': os.path.join(DIST_SRC, 'configs')},
# --- PLUGINS DIRECTORY
- {'src': os.path.join(PS, "plugins/MrTeferi"), 'dst': os.path.join(DIST_PS_PLUGINS, 'MrTeferi')},
- {'src': os.path.join(PS, "plugins/SilvanMTG"), 'dst': os.path.join(DIST_PS_PLUGINS, 'SilvanMTG')},
+ {'src': os.path.join(PLUGINS, "MrTeferi"), 'dst': os.path.join(DIST_PLUGINS, 'MrTeferi')},
+ {'src': os.path.join(PLUGINS, "SilvanMTG"), 'dst': os.path.join(DIST_PLUGINS, 'SilvanMTG')},
]
# Directories containing ini files
-cfg_dirs = [
- os.path.join(DIST_PS, 'configs'),
- os.path.join(DIST_PS_PLUGINS, 'MrTeferi/configs'),
- os.path.join(DIST_PS_PLUGINS, 'SilvanMTG/configs')
+remove_dirs = [
+ os.path.join(DIST_SRC, 'configs'),
+ os.path.join(DIST_PLUGINS, 'MrTeferi/configs'),
+ os.path.join(DIST_PLUGINS, 'SilvanMTG/configs'),
+ os.path.join(DIST_PLUGINS, 'MrTeferi/templates'),
+ os.path.join(DIST_PLUGINS, 'SilvanMTG/templates')
]
@@ -58,11 +66,17 @@ def clear_build_files(clear_dist=True):
Clean out all PYCACHE files and Pyinstaller files
"""
os.system("pyclean -v .")
- try: rmtree(os.path.join(os.getcwd(), 'build'))
- except Exception as e: print(e)
+ if os.path.exists(os.path.join(CWD, '.venv')):
+ os.system("pyclean -v .venv")
+ try:
+ rmtree(os.path.join(os.getcwd(), 'build'))
+ except Exception as e:
+ print(e)
if clear_dist:
- try: rmtree(os.path.join(os.getcwd(), 'dist'))
- except Exception as e: print(e)
+ try:
+ rmtree(os.path.join(os.getcwd(), 'dist'))
+ except Exception as e:
+ print(e)
def make_dirs():
@@ -71,10 +85,10 @@ def make_dirs():
"""
# Ensure folders exist
Path(DIST).mkdir(mode=511, parents=True, exist_ok=True)
- Path(DIST_PS).mkdir(mode=511, parents=True, exist_ok=True)
+ Path(DIST_DATA).mkdir(mode=511, parents=True, exist_ok=True)
+ Path(DIST_PLUGINS).mkdir(mode=511, parents=True, exist_ok=True)
Path(os.path.join(DIST, "art")).mkdir(mode=511, parents=True, exist_ok=True)
Path(os.path.join(DIST, "templates")).mkdir(mode=511, parents=True, exist_ok=True)
- Path(DIST_PS_PLUGINS).mkdir(mode=511, parents=True, exist_ok=True)
def move_data():
@@ -83,20 +97,22 @@ def move_data():
"""
# Transfer our necessary files
print("Transferring data files...")
- for f in files: copy2(f['src'], f['dst'])
+ for f in files:
+ copy2(f['src'], f['dst'])
# Transfer our necessary folders
print("Transferring data folders...")
- for f in folders: copytree(f['src'], f['dst'])
+ for f in folders:
+ copytree(f['src'], f['dst'])
-def remove_ini_files():
+def remove_unneeded_files():
"""
- Remove autogenerated ini config files.
+ Remove autogenerated ini config files and PSD templates.
"""
- for directory in cfg_dirs:
+ for directory in remove_dirs:
for file_name in os.listdir(directory):
- if file_name.endswith(".ini"):
+ if file_name.endswith(('.ini', '.psd', '.psb')):
os.remove(os.path.join(directory, file_name))
@@ -129,6 +145,6 @@ def build_zip():
# Post-build steps
move_data()
- remove_ini_files()
+ remove_unneeded_files()
build_zip()
clear_build_files(False)
diff --git a/config.ini b/config.ini
index 0c4d18fa..f761815c 100644
--- a/config.ini
+++ b/config.ini
@@ -12,12 +12,13 @@ True.Collector.Info = 1
Force.English.Formatting = 0
[SYMBOLS]
-Default.Symbol =
-Auto.Set.Symbol = 1
-Auto.Symbol.Size = 1
+Symbol.Mode = default
+Default.Symbol = MTG
+Force.Default.Symbol = 0
Symbol.Stroke.Size = 6
-Fill.Symbol.Background = 0
-Classic.Symbol.Rendering = 0
+
+[WATERMARK]
+Enable.Watermark = 0
[APP]
Manual.Edit = 0
@@ -27,6 +28,8 @@ Targeted.Replace = 1
Dev.Mode = 0
[TEMPLATES]
+Border.Color = black
Render.Snow = 0
Render.Miracle = 0
+Render.Basic = 1
diff --git a/main.py b/main.py
index 518b7930..baac8a9b 100644
--- a/main.py
+++ b/main.py
@@ -2,27 +2,29 @@
PROXYSHOP - GUI LAUNCHER
"""
# Core imports
+import sys
import json
-import os
import os.path as osp
-import sys
-import threading
-import time
+from os import environ, listdir
+from threading import Thread
from pathlib import Path
-from time import perf_counter
-from glob import glob
-from typing import Union
+from time import sleep, perf_counter
+from typing import Union, Optional
+
+from _ctypes import COMError
from photoshop import api as ps
+from photoshop.api import PhotoshopPythonAPIError
+from photoshop.api._document import Document
# Development specific imports
development = False
if not hasattr(sys, '_MEIPASS'):
try:
- from proxyshop.__dev__ import development
+ from src.__dev__ import development
except ImportError:
development = False
if not development:
- os.environ["KIVY_NO_CONSOLELOG"] = "1"
+ environ["KIVY_NO_CONSOLELOG"] = "1"
# Kivy imports
from kivy.utils import get_color_from_hex
@@ -39,19 +41,21 @@
from kivy.uix.togglebutton import ToggleButton
# Proxyshop imports
-from proxyshop.__version__ import version
-from proxyshop.gui.creator import CreatorPanels
-from proxyshop.gui.dev import TestApp
-from proxyshop.gui.dict import GUI
-from proxyshop.gui.utils import (
- HoverBehavior, HoverButton
+from src.__version__ import version
+from src.gui.creator import CreatorPanels
+from src.gui.dev import TestApp
+from src.gui.utils import (
+ HoverBehavior, HoverButton, GUI
+)
+from src.gui.settings import SettingsPopup
+from src.update import download_s3_file
+from src.constants import con
+from src.core import (
+ retrieve_card_info, TemplateDetails, get_templates, card_types, get_template_class, get_my_templates
)
-from proxyshop.gui.settings import SettingsPopup
-from proxyshop.update import download_s3_file
-from proxyshop.constants import con
-from proxyshop.core import retrieve_card_info, TemplateDetails
-from proxyshop.settings import cfg
-from proxyshop import core, layouts
+from src.settings import cfg
+from src.layouts import CardLayout, layout_map
+from src.utils.strings import msg_success, msg_error, msg_warn, ps_version_check
# App configuration
Config.set('graphics', 'width', '800')
@@ -60,8 +64,7 @@
Config.write()
# Core vars
-card_types = core.card_types
-templates = core.get_templates()
+templates = get_templates()
"""
@@ -116,84 +119,136 @@ class ProxyshopApp(App):
def __init__(self, **kwargs):
super().__init__(**kwargs)
- # App settings
- self.title = f"Proxyshop v{version}"
- self.icon = 'proxyshop/img/proxyshop.png'
- self.cont_padding = 10
+ # Data
+ self._assigned_layouts = {
+ 'failed': []
+ }
+ self._templates_selected = {}
+ self._result = True
+ self._docref = None
+
+ """
+ KIVY PROPERTIES
+ """
+
+ @property
+ def title(self) -> str:
+ return f"Proxyshop v{version}"
+
+ @property
+ def icon(self) -> str:
+ return osp.join(con.path_img, 'proxyshop.png')
+
+ @property
+ def cont_padding(self) -> int:
+ return 10
+
+ """
+ SETTABLE PROPERTIES
+ """
+
+ @property
+ def assigned_layouts(self) -> dict[str, list[Union[str, CardLayout]]]:
+ # Tracks cards assigned to a layout
+ return self._assigned_layouts
- # User data
- self.assigned_layouts = {}
- self.result = True
- self.temps = {}
- self.docref = None
+ @assigned_layouts.setter
+ def assigned_layouts(self, value):
+ self._assigned_layouts = value
- def select_template(self, btn: ToggleButton):
+ @property
+ def templates_selected(self) -> dict[str, str]:
+ # Tracks the templates chosen by the user
+ return self._templates_selected
+
+ @templates_selected.setter
+ def templates_selected(self, value):
+ self._templates_selected = value
+
+ @property
+ def result(self) -> bool:
+ # Tracks the success result of the last render
+ return self._result
+
+ @result.setter
+ def result(self, value):
+ self._result = value
+
+ @property
+ def docref(self) -> Optional[Document]:
+ # Tracks the currently open Photoshop document
+ return self._docref
+
+ @docref.setter
+ def docref(self, value):
+ self._docref = value
+
+ """
+ METHODS
+ """
+
+ def select_template(self, btn: ToggleButton) -> None:
"""
- Add selected template to the templates dict.
+ Add selected template to the template dict.
+ @param btn: Button that was pressed and represents a given template.
"""
# Set the preview image
btn.parent.image.source = btn.parent.preview if (
osp.exists(btn.parent.preview)
- ) else osp.join(con.cwd, "proxyshop/img/NotFound.jpg")
+ ) else osp.join(con.cwd, "src/img/NotFound.jpg")
# Select the template
card_type = btn.parent.type
if btn.state == "down":
- self.temps[card_type] = btn.text
- btn.disabled = True
+ # Select the template, disable all other buttons
+ self.templates_selected[card_type] = btn.text
for name, button in GUI.template_btn[card_type].items():
if name != btn.text:
button.disabled = False
button.state = "normal"
+ btn.disabled = True
- def render_target(self):
+ def render_target(self) -> None:
"""
- RENDER TARGET IMAGE
+ Render card using target image selected in Photoshop.
"""
# Setup step
self.reset(disable_buttons=True, reset_data=True)
- temps = core.get_my_templates(self.temps)
+ temps = get_my_templates(self.templates_selected)
# Open file in PS
app = ps.Application()
- file = app.openDialog()
- if file is None:
- self.enable_buttons()
+ if not (file_name := self.select_art(app)):
return
# Assign layout to card
- card = self.assign_layout(file[0])
+ card = self.assign_layout(file_name)
if isinstance(card, str):
# Card failed to assign
- console.update(f"[color=#a84747]{card}[/color]")
+ console.update(msg_error(card))
self.enable_buttons()
return
# Start a new thread
console.update()
- template = temps[card.card_class]
- template['loaded_class'] = core.get_template_class(template)
- thr = threading.Thread(target=self.render, args=(template, card), daemon=True)
- self.start_thread(thr)
+ template = temps[card.card_class].copy()
+ template['loaded_class'] = get_template_class(template)
+ self.start_thread(Thread(target=self.render, args=(template, card), daemon=True))
# Return to normal
self.reset(close_document=True, enable_buttons=True)
- def render_all(self):
+ def render_all(self) -> None:
"""
- RENDER ALL IMAGES IN ART FOLDER
- Using our custom JSON
+ Render cards using all images located in the art folder.
"""
# Setup step
self.reset(disable_buttons=True, reset_data=True)
- temps = core.get_my_templates(self.temps)
- failed, files, cards, lthr, types = [], [], [], [], {}
+ temps = get_my_templates(self.templates_selected)
- # Select all images in art folder
- folder = osp.join(con.cwd, "art")
- extensions = ["*.png", "*.jpg", "*.tif", "*.jpeg", "*.webp", "*.jpf"]
- for ext in extensions:
- files.extend(glob(osp.join(folder, ext)))
+ # Key datas
+ layout_threads: list[Thread] = []
+ files = self.get_art_files()
# Is the list empty?
if len(files) == 0:
@@ -203,162 +258,105 @@ def render_all(self):
# Run through each file, assigning layout
for i, f in enumerate(files, start=0):
- lthr.append(threading.Thread(target=self.assign_layout, args=(f, i)))
- lthr[i].start()
- time.sleep(.05)
-
- # Join each thread and check its return
- for i, t in enumerate(lthr):
- t.join()
- if isinstance(self.assigned_layouts[i], str):
- failed.append(self.assigned_layouts[i])
- else:
- cards.append(self.assigned_layouts[i])
+ layout_threads.append(Thread(target=self.assign_layout, args=(f,)))
+ layout_threads[i].start()
+ # Scryfall rate limit
+ # https://scryfall.com/docs/api
+ sleep(.05)
+
+ # Complete each thread
+ for i, thread in enumerate(layout_threads):
+ thread.join()
# Did any cards fail to find?
- if len(failed) > 0:
+ if self.assigned_layouts.get('failed'):
# Some cards failed, should we continue?
proceed = console.error(
- "\n---- [b]I can't render the following cards[/b] ----\n{}".format("\n".join(failed)),
- color=False, continue_msg="---- [b]Would you still like to proceed?[/b] ----"
+ "\n---- [b]I can't render the following cards[/b] ----\n"
+ "{}".format("\n".join(self.assigned_layouts['failed'].copy())),
+ continue_msg="\n---- [b]Would you still like to proceed?[/b] ----"
)
+ # Cancel the operation
if not proceed:
self.enable_buttons()
return
+ console.update()
- # Create a segment of renders for each card class
- for c in cards:
- if c.card_class not in types:
- types[c.card_class] = [c]
- else:
- types[c.card_class].append(c)
+ # Render each card type as a different batch
+ for card_type, cards in self.assigned_layouts.items():
+ # Skip failed
+ if card_type == 'failed':
+ continue
- # Console next line, then render each segment as a different batch
- console.update()
- for card_type, cards in types.items():
# The template we'll use for this type
- template = temps[card_type]
- template['loaded_class'] = core.get_template_class(template)
+ template = temps[card_type].copy()
+ template['loaded_class'] = get_template_class(template)
for card in cards:
# Start render thread
- thr = threading.Thread(target=self.render, args=(template, card), daemon=True)
+ thr = Thread(target=self.render, args=(template, card), daemon=True)
if not self.start_thread(thr):
self.reset(close_document=True, enable_buttons=True)
return
+ # Card complete
+ self.reset()
# Render group complete
self.reset(close_document=True)
# All renders complete
self.enable_buttons()
- def render_custom(self, template: TemplateDetails, scryfall):
+ def render_custom(self, template: TemplateDetails, scryfall) -> None:
"""
Set up custom render job, then execute
"""
+ # Setup step
self.reset(disable_buttons=True, reset_data=True)
- try:
-
- # Choose an image
- app = ps.Application()
- file = app.openDialog()
- if file is None:
- self.enable_buttons()
- return
-
- # Setup file info
- file = {
- 'filename': file[0],
- 'name': scryfall['name'],
- 'artist': scryfall['artist'],
- 'set': scryfall['set'],
- 'creator': None
- }
- # If basic, manually call the BasicLandLayout class
- if scryfall['name'] in con.basic_land_names:
- layout = layouts.BasicLandLayout(file)
- else:
- # Instantiate layout OBJ, unpack scryfall json and store relevant data as attributes
- scryfall['lang'] = "en"
- try:
- layout = layouts.layout_map[scryfall['layout']](scryfall, file)
- except (KeyError, TypeError) as e:
- console.update(f"Layout not supported!\n", e)
- return
-
- # Get our template class
- try:
- template['loaded_class'] = core.get_template_class(template)
- except Exception as e:
- console.update(f"Template not found!\n", e)
- return
+ # Open file in PS
+ app = ps.Application()
+ if not (file_name := self.select_art(app)):
+ return
- # Execute template
- console.update()
- thr = threading.Thread(target=self.render, args=(template, layout), daemon=True)
- self.start_thread(thr)
+ # Setup file info
+ file = {
+ 'filename': file_name,
+ 'name': scryfall['name'],
+ 'artist': scryfall['artist'],
+ 'set': scryfall['set'],
+ 'creator': None
+ }
+ # Instantiate layout OBJ, unpack scryfall json and store relevant data as attributes
+ try:
+ # TODO: Improve logic to discern between different card classes
+ layout = layout_map[scryfall['layout']](scryfall, file)
+ template['loaded_class'] = get_template_class(template)
except Exception as e:
- console.update(f"General error! Maybe Photoshop was busy?\n", e)
+ console.update(f"Custom card failed!\n", e)
+ return
+
+ # Execute template
+ console.update()
+ thr = Thread(target=self.render, args=(template, layout), daemon=True)
+ self.start_thread(thr)
self.reset(close_document=True, enable_buttons=True)
- def assign_layout(
- self, filename: Union[Path, str], index: int = 0
- ) -> Union[str, layouts.BasicLandLayout, layouts.NormalLayout]:
+ def test_all(self, deep: bool = False) -> None:
"""
- Assign layout object to a card.
- @param filename: String including card name, plus optionally:
- - (artist name)
- - [set code]
- @param index: The index to save this layout for assigned_layouts
- @return: Layout object for this card
+ Test all templates in series.
+ @param deep: Tests every card case for each template if enabled.
"""
- # Get basic card information
- card = retrieve_card_info(filename)
-
- # Instantiate basic land and return it
- if card['name'] in con.basic_land_names:
- # If basic, manually call the BasicLandLayout class
- self.assigned_layouts[index] = layouts.BasicLandLayout(card)
- if not cfg.dev_mode:
- console.update(
- f"[color=#59d461]SUCCESS:[/color] {str(self.assigned_layouts[index])}"
- )
- return self.assigned_layouts[index]
-
- # Get scryfall info for any other type
- scryfall = card_info(card['name'], card['set'])
- if isinstance(scryfall, Exception):
- # Scryfall returned None or an exception
- console.log_exception(scryfall)
- self.assigned_layouts[index] = f"Scryfall search failed - [color=#a84747]{card['name']}[/color]"
- return self.assigned_layouts[index]
-
- # Instantiate layout OBJ, unpack scryfall json, store relevant data as attributes
- try:
- self.assigned_layouts[index] = layouts.layout_map[scryfall['layout']](scryfall, card)
- if not cfg.dev_mode:
- console.update(
- f"[color=#59d461]SUCCESS:[/color] {str(self.assigned_layouts[index])}"
- )
- return self.assigned_layouts[index]
- except Exception as e:
- # Layout object couldn't be created
- console.log_exception(e)
- self.assigned_layouts[index] = f"Layout incompatible - [color=#a84747]{card['name']}[/color]"
- return self.assigned_layouts[index]
-
- def test_all(self, deep: bool = False):
+ # Setup step
self.reset(disable_buttons=True, reset_data=True)
# Load temps and test case cards
- with open(osp.join(con.cwd, "proxyshop/tests.json"), encoding="utf-8") as fp:
+ with open(osp.join(con.cwd, "src/data/tests.json"), encoding="utf-8") as fp:
cases = json.load(fp)
- # Loop through each card, test all templates for that type
+ # Loop through each template type
for card_type, cards in cases.items():
- if not deep:
- cards = [cards[0]]
- console.update(f"\n[color=#59d461]---- {card_type.upper()} ----[/color]")
+ # Is this a deep test?
+ cards = [cards[0]] if not deep else cards
+ console.update(msg_success(f"\n---- {card_type.upper()} ----"))
for template in templates[card_type]:
# Loop through cards to test
failures = []
@@ -372,68 +370,120 @@ def test_all(self, deep: bool = False):
self.reset(enable_buttons=True)
return
# Grab the template class and start the render thread
- layout.filename = osp.join(con.cwd, "proxyshop/img/test.png")
- template['loaded_class'] = core.get_template_class(template)
- thr = threading.Thread(target=self.render, args=(template, layout))
+ layout.filename = osp.join(con.cwd, "src/img/test.png")
+ template['loaded_class'] = get_template_class(template)
+ thr = Thread(target=self.render, args=(template, layout))
if not self.start_thread(thr):
failures.append(card[0])
+ # Card finished
+ self.reset()
+ # Template finished
self.reset(close_document=True)
- if len(failures) > 0:
- failed = ", ".join(failures)
- console.update(f"[color=#a84747]FAILED ({failed})[/color]")
- else:
- console.update("[color=#59d461]SUCCESS[/color]")
+ console.update(
+ # Did any tests fail?
+ msg_error(f"FAILED ({', '.join(failures)})") if failures
+ else msg_success("SUCCESS")
+ )
+ # All tests finished
self.reset(enable_buttons=True)
- def test_target(self, card_type: str, template: TemplateDetails):
+ def test_target(self, card_type: str, template: TemplateDetails) -> None:
+ """
+ Tests a specific template, always tests every case.
+ @param card_type: Type of card, corresponds to template type.
+ @param template: Specific template to test.
+ """
+ # Setup step
self.reset(disable_buttons=True, reset_data=True)
# Load test case cards
- with open(osp.join(con.cwd, "proxyshop/tests.json"), encoding="utf-8") as fp:
+ with open(osp.join(con.cwd, "src/data/tests.json"), encoding="utf-8") as fp:
cards = json.load(fp)
# Loop through our cases
- console.update(f"\n[color=#59d461]---- {template['class_name']} ----[/color]")
+ console.update(msg_success(f"\n---- {template['class_name']} ----"))
for card in cards[card_type]:
+ # Get the layout object
layout = self.assign_layout(card[0])
if isinstance(layout, str):
# Layout or Scryfall Fail
console.update(layout)
self.reset(enable_buttons=True)
return
- layout.filename = osp.join(con.cwd, "proxyshop/img/test.png")
+
+ # Start the render
+ layout.filename = osp.join(con.cwd, "src/img/test.png")
console.update(f"{card[0]} ... ", end="")
- template['loaded_class'] = core.get_template_class(template)
- thr = threading.Thread(target=self.render, args=(template, layout), daemon=True)
- if self.start_thread(thr):
- console.update("[color=#59d461]SUCCESS[/color]")
- else:
- console.update(f"[color=#a84747]FAILED - {card[1]}[/color]")
+ template['loaded_class'] = get_template_class(template)
+ thr = Thread(target=self.render, args=(template, layout), daemon=True)
+ console.update(
+ msg_success("SUCCESS") if self.start_thread(thr)
+ else msg_error(f"FAILED - {card[1]}")
+ )
+ # Card finished
self.reset()
+ # All tests finished
self.reset(close_document=True, enable_buttons=True)
+ def assign_layout(self, filename: Union[Path, str]) -> Union[str, CardLayout]:
+ """
+ Assign layout object to a card.
+ @param filename: String including card name, plus optionally:
+ - (artist name)
+ - [set code]
+ - {collector number}
+ @return: Layout object for this card
+ """
+ # Get basic card information
+ card = retrieve_card_info(filename)
+
+ # Get scryfall info for any other type
+ scryfall = card_info(card['name'], card['set'])
+ if isinstance(scryfall, Exception) or not scryfall:
+ # Scryfall data invalid
+ console.log_exception(scryfall)
+ failure = f"Scryfall search failed: {msg_error(card['name'])}"
+ self.assigned_layouts['failed'].append(failure)
+ return failure
+
+ # Instantiate layout object
+ layout = layout_map.get(scryfall['layout'])
+ layout = layout(scryfall, card) if layout else f"Layout incompatible: {msg_error(card['name'])}"
+
+ # Did the layout fail?
+ if isinstance(layout, str):
+ self.assigned_layouts['failed'].append(layout)
+ return layout
+
+ # Assign the card
+ self.assigned_layouts.setdefault(layout.card_class, []).append(layout)
+ if not cfg.dev_mode:
+ console.update(f"{msg_success('SUCCESS:')} {str(layout)}")
+ return layout
+
def render(
- self, template: TemplateDetails, card: any
+ self, template: TemplateDetails, card: CardLayout
) -> None:
"""
- Execute a render job.
- @param template: Template details containing class, plugin, name, and type.
- @param card: Layout object containing validated scryfall data.
+ Execute a render job using a given template and layout object.
+ @param template: Template details containing class, plugin, etc.
+ @param card: Layout object representing validated scryfall data.
"""
try:
if not cfg.dev_mode:
- console.update(f"[color=#59d461]---- {card.name} ----[/color]")
+ console.update(msg_success(f"---- {card.name} ----"))
cfg.load(template=template)
+ card.template_path = template['templates_path']
proxy = template['loaded_class'](card)
self.docref = proxy.docref
self.result = proxy.execute()
del proxy
except Exception as e:
console.error(
- "Template failed to load! This plugin may be busted.", e
+ msg_error("Template failed to load!"), e
)
- def start_thread(self, thr: threading.Thread) -> bool:
+ def start_thread(self, thr: Thread) -> bool:
"""
Create a counter, start a thread, print time completed.
@param thr: Thread object
@@ -473,7 +523,27 @@ def reset(
if disable_buttons:
self.disable_buttons()
if reset_data:
- self.assigned_layouts = {}
+ self.assigned_layouts = {
+ 'failed': []
+ }
+
+ def select_art(self, app: ps.Application) -> Optional[str]:
+ """
+ Open file select dialog in Photoshop, return the file.
+ @return: File object.
+ """
+ try:
+ file = app.openDialog()
+ except (COMError, PhotoshopPythonAPIError):
+ # Photoshop is busy
+ console.update("Photoshop is not responding!")
+ self.enable_buttons()
+ return
+ if not file:
+ # No file selected
+ self.enable_buttons()
+ return
+ return file[0]
def close_document(self) -> None:
"""
@@ -485,10 +555,39 @@ def close_document(self) -> None:
self.docref.close(ps.SaveOptions.DoNotSaveChanges)
self.docref = None
except Exception as e:
- print(e)
+ # Document wasn't available
+ print("Couldn't close corresponding document!")
+ console.log_exception(e)
+
+ @staticmethod
+ def get_art_files(dir_name: str = 'art') -> list[str]:
+ """
+ Grab all supported image files within a given directory.
+ @param dir_name: Folder within the working directory containing images.
+ @return: List of art files.
+ """
+ # Folder, file list, supported extensions
+ folder = osp.join(con.cwd, dir_name)
+ all_files = listdir(folder)
+ ext = (".png", ".jpg", ".tif", ".jpeg", ".jpf")
+
+ # Select all images in folder not prepended with !
+ files = [osp.join(folder, f) for f in all_files if f.endswith(ext) and f[0] != '!']
+
+ # Check for webp files
+ files_webp = [osp.join(folder, f) for f in all_files if f.endswith('.webp') and f[0] != '!']
+ # Check if Photoshop version supports webp
+ if files_webp and not ps_version_check(con.version_webp):
+ console.update(msg_warn('Skipped WEBP image, WEBP requires Photoshop ^23.2.0'))
+ elif files_webp:
+ files.extend(files_webp)
+ return files
@staticmethod
async def open_app_settings() -> None:
+ """
+ Opens a settings panel for global or template specific configs.
+ """
cfg_panel = SettingsPopup()
cfg_panel.open()
@@ -504,6 +603,7 @@ def disable_buttons(self) -> None:
else:
self.root.ids.rend_targ_btn.disabled = True
self.root.ids.rend_all_btn.disabled = True
+ self.root.ids.app_settings_btn.disabled = True
console.ids.update_btn.disabled = True
def enable_buttons(self) -> None:
@@ -518,6 +618,7 @@ def enable_buttons(self) -> None:
else:
self.root.ids.rend_targ_btn.disabled = False
self.root.ids.rend_all_btn.disabled = False
+ self.root.ids.app_settings_btn.disabled = False
console.ids.update_btn.disabled = False
def build(self) -> Union[TestApp, ProxyshopPanels]:
@@ -567,7 +668,7 @@ def __init__(self, **kwargs):
scroll_box.add_widget(TemplateList(temps, preview=container.ids.preview_image))
container.ids.preview_image.source = temps[0]['preview_path'] if (
osp.exists(temps[0]['preview_path'])
- ) else osp.join(con.cwd, 'proxyshop/img/NotFound.jpg')
+ ) else osp.join(con.cwd, 'src/img/NotFound.jpg')
container.ids.template_view_container.add_widget(scroll_box)
tab.content = container
self.add_widget(tab)
@@ -648,25 +749,25 @@ async def open_settings(self):
# Update symbol library and manifest
try:
if not development:
- download_s3_file('manifest.json', osp.join(con.cwd, 'proxyshop/manifest.json'))
- download_s3_file('symbols.json', osp.join(con.cwd, 'proxyshop/symbols.json'))
+ download_s3_file('manifest.json', osp.join(con.cwd, 'src/data/manifest.json'))
+ download_s3_file('symbols.json', osp.join(con.cwd, 'src/data/symbols.json'))
con.reload()
except Exception as err:
print(err)
# Ensure mandatory folders are created
Path(osp.join(con.cwd, "out")).mkdir(mode=511, parents=True, exist_ok=True)
- Path(osp.join(con.cwd, "tmp")).mkdir(mode=511, parents=True, exist_ok=True)
+ Path(osp.join(con.cwd, "logs")).mkdir(mode=511, parents=True, exist_ok=True)
Path(osp.join(con.cwd, "templates")).mkdir(mode=511, parents=True, exist_ok=True)
- Path(osp.join(con.cwd, "proxyshop/datas")).mkdir(mode=511, parents=True, exist_ok=True)
+ Path(osp.join(con.cwd, "src/data/sets")).mkdir(mode=511, parents=True, exist_ok=True)
# Launch the app
Factory.register('HoverBehavior', HoverBehavior)
- Builder.load_file(osp.join(con.cwd, "proxyshop/kv/proxyshop.kv"))
+ Builder.load_file(osp.join(con.cwd, "src/kv/proxyshop.kv"))
# Imports that load console must be imported here
- from proxyshop.scryfall import card_info
- from proxyshop.__console__ import console
+ from src.scryfall import card_info
+ from src.__console__ import console
# Start app
ProxyshopApp().run()
diff --git a/proxyshop/plugins/MrTeferi/README.md b/plugins/MrTeferi/README.md
similarity index 100%
rename from proxyshop/plugins/MrTeferi/README.md
rename to plugins/MrTeferi/README.md
diff --git a/proxyshop/plugins/MrTeferi/actions/pencilsketch.py b/plugins/MrTeferi/actions/pencilsketch.py
similarity index 97%
rename from proxyshop/plugins/MrTeferi/actions/pencilsketch.py
rename to plugins/MrTeferi/actions/pencilsketch.py
index 306d6ca5..305f42c3 100644
--- a/proxyshop/plugins/MrTeferi/actions/pencilsketch.py
+++ b/plugins/MrTeferi/actions/pencilsketch.py
@@ -1,7 +1,9 @@
"""
Pencil Sketchify Action Module
"""
-from proxyshop.__console__ import console
+from typing import Union
+
+from src.__console__ import console
import photoshop.api as ps
app = ps.Application()
cID = app.charIDToTypeID
@@ -14,12 +16,12 @@
"""
-def new_layer(id):
+def new_layer(index: int):
desc1 = ps.ActionDescriptor()
ref1 = ps.ActionReference()
ref1.putClass(cID('Lyr '))
desc1.putReference(cID('null'), ref1)
- desc1.putInteger(cID('LyrI'), id)
+ desc1.putInteger(cID('LyrI'), index)
app.executeAction(cID('Mk '), desc1, dialog_mode)
@@ -36,18 +38,16 @@ def select_bg():
def reset_colors():
- """
desc1 = ps.ActionDescriptor()
ref1 = ps.ActionReference()
ref1.putProperty(cID('Clr '), cID('Clrs'))
desc1.putReference(cID('null'), ref1)
app.executeAction(cID('Rset'), desc1, dialog_mode)
- """
- pass
-def move_layer(pos, id):
- if isinstance(id, int): id = [id]
+def move_layer(pos, index: Union[int, list[int]]):
+ if isinstance(index, int):
+ index = [index]
desc1 = ps.ActionDescriptor()
ref1 = ps.ActionReference()
ref1.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
@@ -58,13 +58,13 @@ def move_layer(pos, id):
desc1.putBoolean(cID('Adjs'), False)
desc1.putInteger(cID('Vrsn'), 5)
list1 = ps.ActionList()
- for i in id:
+ for i in index:
list1.putInteger(i)
desc1.putList(cID('LyrI'), list1)
app.executeAction(cID('move'), desc1, dialog_mode)
-def set_opacity(opacity):
+def set_opacity(opacity: float):
desc1 = ps.ActionDescriptor()
ref1 = ps.ActionReference()
ref1.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
@@ -75,19 +75,19 @@ def set_opacity(opacity):
app.executeAction(cID('setd'), desc1, dialog_mode)
-def select_layer(name, id):
+def select_layer(name: str, index: int):
desc1 = ps.ActionDescriptor()
ref1 = ps.ActionReference()
ref1.putName(cID('Lyr '), name)
desc1.putReference(cID('null'), ref1)
desc1.putBoolean(cID('MkVs'), False)
list1 = ps.ActionList()
- list1.putInteger(id)
+ list1.putInteger(index)
desc1.putList(cID('LyrI'), list1)
app.executeAction(cID('slct'), desc1, dialog_mode)
-def select_layers(name, layers):
+def select_layers(name: str, layers: list[int]):
desc1 = ps.ActionDescriptor()
ref1 = ps.ActionReference()
ref1.putName(cID('Lyr '), name)
@@ -118,8 +118,10 @@ def hide_layer(name=None):
desc1 = ps.ActionDescriptor()
list1 = ps.ActionList()
ref1 = ps.ActionReference()
- if name: ref1.putName(cID('Lyr '), name)
- else: ref1.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
+ if name:
+ ref1.putName(cID('Lyr '), name)
+ else:
+ ref1.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
list1.putReference(ref1)
desc1.putList(cID('null'), list1)
app.executeAction(cID('Hd '), desc1, dialog_mode)
@@ -129,8 +131,10 @@ def show_layer(name=None):
desc1 = ps.ActionDescriptor()
list1 = ps.ActionList()
ref1 = ps.ActionReference()
- if name: ref1.putName(cID('Lyr '), name)
- else: ref1.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
+ if name:
+ ref1.putName(cID('Lyr '), name)
+ else:
+ ref1.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
list1.putReference(ref1)
desc1.putList(cID('null'), list1)
app.executeAction(cID('Shw '), desc1, dialog_mode)
@@ -164,6 +168,24 @@ def blend(key):
app.executeAction(cID('setd'), desc1, dialog_mode)
+"""
+FILTERS
+"""
+
+
+def filter_photocopy(detail: int = 2, darken: int = 5):
+ """
+ Apply photocopy filter.
+ @param detail: Level of detail.
+ @param darken: Darkness amount.
+ """
+ desc1 = ps.ActionDescriptor()
+ desc1.putEnumerated(cID('GEfk'), cID('GEft'), cID('Phtc'))
+ desc1.putInteger(sID('detail '), detail)
+ desc1.putInteger(sID('darken'), darken)
+ app.executeAction(1195730531, desc1, dialog_mode)
+
+
# Utility commands
def blend_multiply(): blend('multiply')
def blend_color_dodge(): blend('colorDodge')
@@ -218,11 +240,7 @@ def run(draft_sketch=False, rough_sketch=False, black_and_white=True, manual_edi
reset_colors()
# Filter Gallery - Photocopy
- desc1 = ps.ActionDescriptor()
- desc1.putEnumerated(cID('GEfk'), cID('GEft'), cID('Phtc'))
- desc1.putInteger(cID('Dtl '), 2)
- desc1.putInteger(cID('Drkn'), 5)
- app.executeAction(1195730531, desc1, dialog_mode)
+ filter_photocopy(detail=2, darken=5)
# Set - Blending Multiply
blend_multiply()
@@ -243,12 +261,12 @@ def run(draft_sketch=False, rough_sketch=False, black_and_white=True, manual_edi
desc1 = ps.ActionDescriptor()
list1 = ps.ActionList()
desc2 = ps.ActionDescriptor()
+ desc3 = ps.ActionDescriptor()
desc2.putEnumerated(cID('GEfk'), cID('GEft'), cID('AccE'))
desc2.putInteger(cID('EdgW'), 3)
desc2.putInteger(cID('EdgB'), 20)
desc2.putInteger(cID('Smth'), 15)
list1.putObject(cID('GEfc'), desc2)
- desc3 = ps.ActionDescriptor()
desc3.putEnumerated(cID('GEfk'), cID('GEft'), cID('Phtc'))
desc3.putInteger(cID('Dtl '), 1)
desc3.putInteger(cID('Drkn'), 49)
@@ -665,11 +683,7 @@ def run(draft_sketch=False, rough_sketch=False, black_and_white=True, manual_edi
reset_colors()
# Filter Gallery - Photocopy
- desc1 = ps.ActionDescriptor()
- desc1.putEnumerated(cID('GEfk'), cID('GEft'), cID('Phtc'))
- desc1.putInteger(cID('Dtl '), 2)
- desc1.putInteger(cID('Drkn'), 5)
- app.executeAction(1195730531, desc1, dialog_mode)
+ filter_photocopy(detail=2, darken=5)
# Set
blend_multiply()
diff --git a/proxyshop/plugins/MrTeferi/actions/sketch.py b/plugins/MrTeferi/actions/sketch.py
similarity index 100%
rename from proxyshop/plugins/MrTeferi/actions/sketch.py
rename to plugins/MrTeferi/actions/sketch.py
diff --git a/proxyshop/plugins/MrTeferi/configs/SketchTemplate.json b/plugins/MrTeferi/configs/SketchTemplate.json
similarity index 100%
rename from proxyshop/plugins/MrTeferi/configs/SketchTemplate.json
rename to plugins/MrTeferi/configs/SketchTemplate.json
diff --git a/proxyshop/plugins/MrTeferi/img/BasicLandDarkMode.jpg b/plugins/MrTeferi/img/BasicLandDarkMode.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/BasicLandDarkMode.jpg
rename to plugins/MrTeferi/img/BasicLandDarkMode.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/ColorshiftedTemplate.jpg b/plugins/MrTeferi/img/ColorshiftedTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/ColorshiftedTemplate.jpg
rename to plugins/MrTeferi/img/ColorshiftedTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/CrimsonFangTemplate.jpg b/plugins/MrTeferi/img/CrimsonFangTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/CrimsonFangTemplate.jpg
rename to plugins/MrTeferi/img/CrimsonFangTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/DoubleFeatureTemplate.jpg b/plugins/MrTeferi/img/DoubleFeatureTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/DoubleFeatureTemplate.jpg
rename to plugins/MrTeferi/img/DoubleFeatureTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/KaldheimTemplate.jpg b/plugins/MrTeferi/img/KaldheimTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/KaldheimTemplate.jpg
rename to plugins/MrTeferi/img/KaldheimTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/MaleMPCTemplate.jpg b/plugins/MrTeferi/img/MaleMPCTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/MaleMPCTemplate.jpg
rename to plugins/MrTeferi/img/MaleMPCTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/PhyrexianTemplate.jpg b/plugins/MrTeferi/img/PhyrexianTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/PhyrexianTemplate.jpg
rename to plugins/MrTeferi/img/PhyrexianTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/img/SketchTemplate.jpg b/plugins/MrTeferi/img/SketchTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/MrTeferi/img/SketchTemplate.jpg
rename to plugins/MrTeferi/img/SketchTemplate.jpg
diff --git a/proxyshop/plugins/MrTeferi/manifest.json b/plugins/MrTeferi/manifest.json
similarity index 100%
rename from proxyshop/plugins/MrTeferi/manifest.json
rename to plugins/MrTeferi/manifest.json
diff --git a/proxyshop/plugins/MrTeferi/template_map.json b/plugins/MrTeferi/template_map.json
similarity index 100%
rename from proxyshop/plugins/MrTeferi/template_map.json
rename to plugins/MrTeferi/template_map.json
diff --git a/proxyshop/plugins/MrTeferi/templates.py b/plugins/MrTeferi/templates.py
similarity index 92%
rename from proxyshop/plugins/MrTeferi/templates.py
rename to plugins/MrTeferi/templates.py
index 3fc7c065..67006e71 100644
--- a/proxyshop/plugins/MrTeferi/templates.py
+++ b/plugins/MrTeferi/templates.py
@@ -5,10 +5,10 @@
from typing import Optional, Callable
from actions import pencilsketch, sketch
-import proxyshop.templates as temp
-from proxyshop.constants import con
-from proxyshop.settings import cfg
-import proxyshop.helpers as psd
+import src.templates as temp
+from src.constants import con
+from src.settings import cfg
+import src.helpers as psd
from photoshop.api._artlayer import ArtLayer
import photoshop.api as ps
@@ -25,7 +25,7 @@ class SketchTemplate (temp.NormalTemplate):
Sketch showcase from MH2
Original PSD by Nelynes
"""
- template_file_name = "MrTeferi/sketch"
+ template_file_name = "sketch"
template_suffix = "Sketch"
@property
@@ -87,7 +87,7 @@ class KaldheimTemplate (temp.NormalTemplate):
Kaldheim viking legendary showcase.
Original Template by FeuerAmeise
"""
- template_file_name = "MrTeferi/kaldheim"
+ template_file_name = "kaldheim"
template_suffix = "Kaldheim"
@property
@@ -128,7 +128,7 @@ class CrimsonFangTemplate (temp.NormalTemplate):
Works for Normal and Transform cards
Transform is kinda experimental.
"""
- template_file_name = "MrTeferi/crimson-fang"
+ template_file_name = "crimson-fang"
template_suffix = "Fang"
@property
@@ -173,7 +173,7 @@ class PhyrexianTemplate (temp.NormalTemplate):
"""
From the Phyrexian secret lair promo
"""
- template_file_name = "MrTeferi/phyrexian"
+ template_file_name = "phyrexian"
template_suffix = "Phyrexian"
@property
@@ -199,7 +199,7 @@ class DoubleFeatureTemplate (temp.NormalTemplate):
Original assets from Warpdandy's Proximity Template
Doesn't support companion, nyx, or twins layers.
"""
- template_file_name = "MrTeferi/double-feature"
+ template_file_name = "double-feature"
template_suffix = "Double Feature"
@property
@@ -227,7 +227,7 @@ class MaleMPCTemplate (temp.NormalTemplate):
"""
MaleMPC's extended black box template.
"""
- template_file_name = "MrTeferi/male-mpc"
+ template_file_name = "male-mpc"
template_suffix = "Extended Black"
@cached_property
@@ -264,7 +264,7 @@ class ColorshiftedTemplate (temp.NormalTemplate):
Rendered from CC and MSE assets. Most titleboxes are built into pinlines.
Doesn't support special layers for nyx, companion, land, or colorless.
"""
- template_file_name = "MrTeferi/colorshifted"
+ template_file_name = "colorshifted"
template_suffix = "Shifted"
def __init__(self, layout):
@@ -312,9 +312,9 @@ def enable_frame_layers(self):
# White brush and artist for black border
if self.layout.pinlines[0:1] == "B" and len(self.pinlines) < 3:
- psd.getLayer("Artist", self.legal_layer).textItem.color = psd.rgb_white()
- psd.getLayer("Brush B", self.legal_layer).visible = False
- psd.getLayer("Brush W", self.legal_layer).visible = True
+ psd.getLayer("Artist", self.legal_group).textItem.color = psd.rgb_white()
+ psd.getLayer("Brush B", self.legal_group).visible = False
+ psd.getLayer("Brush W", self.legal_group).visible = True
super().enable_frame_layers()
@@ -329,7 +329,7 @@ class BasicLandDarkMode (temp.BasicLandTemplate):
Basic land Dark Mode
Credit to Vittorio Masia (Sid)
"""
- template_file_name = "MrTeferi/basic-dark-mode"
+ template_file_name = "basic-dark-mode"
template_suffix = f"Dark"
def __init__(self, layout):
@@ -338,7 +338,7 @@ def __init__(self, layout):
def collector_info(self):
# Collector info only has artist
- psd.replace_text(psd.getLayer(con.layers.ARTIST, self.legal_layer), "Artist", self.layout.artist)
+ psd.replace_text(psd.getLayer(con.layers.ARTIST, self.legal_group), "Artist", self.layout.artist)
def load_artwork(self):
super().load_artwork()
diff --git a/proxyshop/plugins/SilvanMTG/img/SilvanExtendedTemplate.jpg b/plugins/SilvanMTG/img/SilvanExtendedTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/SilvanMTG/img/SilvanExtendedTemplate.jpg
rename to plugins/SilvanMTG/img/SilvanExtendedTemplate.jpg
diff --git a/proxyshop/plugins/SilvanMTG/img/SilvanMDFCFrontTemplate.jpg b/plugins/SilvanMTG/img/SilvanMDFCFrontTemplate.jpg
similarity index 100%
rename from proxyshop/plugins/SilvanMTG/img/SilvanMDFCFrontTemplate.jpg
rename to plugins/SilvanMTG/img/SilvanMDFCFrontTemplate.jpg
diff --git a/proxyshop/plugins/SilvanMTG/manifest.json b/plugins/SilvanMTG/manifest.json
similarity index 100%
rename from proxyshop/plugins/SilvanMTG/manifest.json
rename to plugins/SilvanMTG/manifest.json
diff --git a/proxyshop/plugins/SilvanMTG/template_map.json b/plugins/SilvanMTG/template_map.json
similarity index 100%
rename from proxyshop/plugins/SilvanMTG/template_map.json
rename to plugins/SilvanMTG/template_map.json
diff --git a/proxyshop/plugins/SilvanMTG/templates.py b/plugins/SilvanMTG/templates.py
similarity index 72%
rename from proxyshop/plugins/SilvanMTG/templates.py
rename to plugins/SilvanMTG/templates.py
index d7fb419c..fa1be98d 100644
--- a/proxyshop/plugins/SilvanMTG/templates.py
+++ b/plugins/SilvanMTG/templates.py
@@ -5,10 +5,9 @@
from photoshop.api._artlayer import ArtLayer
-import proxyshop.templates as temp
-from proxyshop.constants import con
-from proxyshop.settings import cfg
-import proxyshop.helpers as psd
+import src.templates as temp
+from src.constants import con
+import src.helpers as psd
import photoshop.api as ps
app = ps.Application()
@@ -17,13 +16,9 @@ class SilvanExtendedTemplate (temp.NormalTemplate):
"""
Silvan's legendary extended template used for WillieTanner proxies
"""
- template_file_name = "SilvanMTG/extended"
+ template_file_name = "extended"
template_suffix = "Extended"
- def __init__(self, layout):
- cfg.remove_reminder = True
- super().__init__(layout)
-
@property
def background_layer(self) -> Optional[ArtLayer]:
# Background
@@ -39,11 +34,15 @@ def load_artwork(self):
# Content aware fill
psd.content_fill_empty_area(self.art_layer)
+ def enable_crown(self) -> None:
+ super().enable_crown()
+ psd.enable_mask(self.background_layer.parent)
+
def enable_hollow_crown(self, shadows: Optional[ArtLayer] = None) -> None:
super().enable_hollow_crown()
- shadows = psd.getLayer("Shadows Light", "Shadows")
- if shadows:
+ # Mask shadows overlaying hollow crown
+ if shadows := psd.getLayer("Shadows Light", "Shadows"):
psd.enable_mask(shadows)
@@ -56,14 +55,10 @@ class SilvanMDFCBackTemplate (temp.MDFCBackTemplate):
"""
Silvan extended template modified for MDFC
"""
- template_file_name = "SilvanMTG/extended-mdfc-back"
+ template_file_name = "extended-mdfc-back"
dfc_layer_group = con.layers.MDFC_BACK
template_suffix = "Extended"
- def __init__(self, layout):
- cfg.remove_reminder = True
- super().__init__(layout)
-
def load_artwork(self):
super().load_artwork()
@@ -75,6 +70,6 @@ class SilvanMDFCFrontTemplate (SilvanMDFCBackTemplate):
"""
Silvan extended template modified for MDFC
"""
- template_file_name = "SilvanMTG/extended-mdfc-front"
+ template_file_name = "extended-mdfc-front"
dfc_layer_group = con.layers.MDFC_FRONT
template_suffix = "Extended"
diff --git a/poetry.lock b/poetry.lock
index 6fcbcd47..2383dffd 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,31 +1,20 @@
# This file is automatically @generated by Poetry and should not be changed by hand.
-[[package]]
-name = "altgraph"
-version = "0.17.3"
-description = "Python graph (network) package"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
- {file = "altgraph-0.17.3-py2.py3-none-any.whl", hash = "sha256:c8ac1ca6772207179ed8003ce7687757c04b0b71536f81e2ac5755c6226458fe"},
- {file = "altgraph-0.17.3.tar.gz", hash = "sha256:ad33358114df7c9416cdb8fa1eaa5852166c505118717021c6a8c7c7abbd03dd"},
-]
-
[[package]]
name = "argcomplete"
-version = "2.0.0"
+version = "2.0.6"
description = "Bash tab completion for argparse"
category = "dev"
optional = false
python-versions = ">=3.6"
files = [
- {file = "argcomplete-2.0.0-py2.py3-none-any.whl", hash = "sha256:cffa11ea77999bb0dd27bb25ff6dc142a6796142f68d45b1a26b11f58724561e"},
- {file = "argcomplete-2.0.0.tar.gz", hash = "sha256:6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20"},
+ {file = "argcomplete-2.0.6-py3-none-any.whl", hash = "sha256:6c2170b3e0ab54683cb28d319b65261bde1f11388be688b68118b7d281e34c94"},
+ {file = "argcomplete-2.0.6.tar.gz", hash = "sha256:dc33528d96727882b576b24bc89ed038f3c6abbb6855ff9bb6be23384afff9d6"},
]
[package.extras]
-test = ["coverage", "flake8", "pexpect", "wheel"]
+lint = ["flake8", "mypy"]
+test = ["coverage", "flake8", "mypy", "pexpect", "wheel"]
[[package]]
name = "asyncgui"
@@ -175,14 +164,14 @@ files = [
[[package]]
name = "exceptiongroup"
-version = "1.1.0"
+version = "1.1.1"
description = "Backport of PEP 654 (exception groups)"
category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"},
- {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"},
+ {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"},
+ {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"},
]
[package.extras]
@@ -411,21 +400,6 @@ files = [
[package.dependencies]
requests = "*"
-[[package]]
-name = "macholib"
-version = "1.16.2"
-description = "Mach-O header analysis and editing"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
- {file = "macholib-1.16.2-py2.py3-none-any.whl", hash = "sha256:44c40f2cd7d6726af8fa6fe22549178d3a4dfecc35a9cd15ea916d9c83a688e0"},
- {file = "macholib-1.16.2.tar.gz", hash = "sha256:557bbfa1bb255c20e9abafe7ed6cd8046b48d9525db2f9b77d3122a63a2a8bf8"},
-]
-
-[package.dependencies]
-altgraph = ">=0.17"
-
[[package]]
name = "markupsafe"
version = "2.1.2"
@@ -561,18 +535,6 @@ files = [
{file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"},
]
-[[package]]
-name = "pefile"
-version = "2023.2.7"
-description = "Python PE parsing module"
-category = "dev"
-optional = false
-python-versions = ">=3.6.0"
-files = [
- {file = "pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6"},
- {file = "pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc"},
-]
-
[[package]]
name = "photoshop-python-api"
version = "0.21.1"
@@ -738,52 +700,6 @@ files = [
[package.extras]
plugins = ["importlib-metadata"]
-[[package]]
-name = "pyinstaller"
-version = "5.8.0"
-description = "PyInstaller bundles a Python application and all its dependencies into a single package."
-category = "dev"
-optional = false
-python-versions = "<3.12,>=3.7"
-files = [
- {file = "pyinstaller-5.8.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:502a2166165a8e8c3d99c19272e923d2548bac2132424d78910ef9dd8bb11705"},
- {file = "pyinstaller-5.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:bf1f7b7e88b467d7aefcdb2bc9cbd2e856ca88c5ab232c0efe0848f146d3bd5f"},
- {file = "pyinstaller-5.8.0-py3-none-manylinux2014_i686.whl", hash = "sha256:a62ee598b137202ef2e99d8dbaee6bc7379a6565c3ddf0331decb41b98eff1a2"},
- {file = "pyinstaller-5.8.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e68bcadf32edc1171ccb06117699a6a4f8e924b7c2c8812cfa00fd0186ade4ee"},
- {file = "pyinstaller-5.8.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ded780f0d3642d7bfc21d97b98d4ec4b41d2fe70c3f5c5d243868612f536e011"},
- {file = "pyinstaller-5.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9361eff44c7108c2312f39d85ed768c4ada7e0aa729046bbcef3ef3c1577d18"},
- {file = "pyinstaller-5.8.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:5c9632a20faecd6d79f0124afb31e6557414d19be271e572765b474f860f8d76"},
- {file = "pyinstaller-5.8.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:8d004699c5d71c704c14a5f81eec233faa4f87a3bf0ae68e222b87d63f5dd17e"},
- {file = "pyinstaller-5.8.0-py3-none-win32.whl", hash = "sha256:3b74f50a57b1413047042e47033480b7324b091f23dff790a4494af32b377d94"},
- {file = "pyinstaller-5.8.0-py3-none-win_amd64.whl", hash = "sha256:4f4d818588e2d8de4bf24ed018056c3de0c95898ad25719e12d68626161b4933"},
- {file = "pyinstaller-5.8.0-py3-none-win_arm64.whl", hash = "sha256:bacf236b5c2f8f674723a39daca399646dceb470881f842f52e393b9a67ff2f8"},
- {file = "pyinstaller-5.8.0.tar.gz", hash = "sha256:314fb883caf3cbf06adbea2b77671bb73c3481568e994af0467ea7e47eb64755"},
-]
-
-[package.dependencies]
-altgraph = "*"
-macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""}
-pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""}
-pyinstaller-hooks-contrib = ">=2021.4"
-pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""}
-setuptools = ">=42.0.0"
-
-[package.extras]
-encryption = ["tinyaes (>=1.0.0)"]
-hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"]
-
-[[package]]
-name = "pyinstaller-hooks-contrib"
-version = "2023.0"
-description = "Community maintained hooks for PyInstaller"
-category = "dev"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pyinstaller-hooks-contrib-2023.0.tar.gz", hash = "sha256:bd578781cd6a33ef713584bf3726f7cd60a3e656ec08a6cc7971e39990808cc0"},
- {file = "pyinstaller_hooks_contrib-2023.0-py2.py3-none-any.whl", hash = "sha256:29d052eb73e0ab8f137f11df8e73d464c1c6d4c3044d9dc8df2af44639d8bfbf"},
-]
-
[[package]]
name = "pypiwin32"
version = "223"
@@ -801,14 +717,14 @@ pywin32 = ">=223"
[[package]]
name = "pytest"
-version = "7.2.1"
+version = "7.2.2"
description = "pytest: simple powerful testing with Python"
category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"},
- {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"},
+ {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"},
+ {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"},
]
[package.dependencies]
@@ -847,18 +763,6 @@ files = [
{file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"},
]
-[[package]]
-name = "pywin32-ctypes"
-version = "0.2.0"
-description = ""
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
- {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
- {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
-]
-
[[package]]
name = "pyyaml"
version = "6.0"
@@ -951,14 +855,14 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "setuptools"
-version = "67.4.0"
+version = "67.6.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "setuptools-67.4.0-py3-none-any.whl", hash = "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251"},
- {file = "setuptools-67.4.0.tar.gz", hash = "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330"},
+ {file = "setuptools-67.6.0-py3-none-any.whl", hash = "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2"},
+ {file = "setuptools-67.6.0.tar.gz", hash = "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077"},
]
[package.extras]
@@ -1009,7 +913,7 @@ files = [
name = "typing-extensions"
version = "4.5.0"
description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "dev"
+category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -1019,14 +923,14 @@ files = [
[[package]]
name = "urllib3"
-version = "1.26.14"
+version = "1.26.15"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
files = [
- {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"},
- {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"},
+ {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"},
+ {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"},
]
[package.extras]
@@ -1064,4 +968,4 @@ test = ["pytest (>=3.0.0)"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.8,<3.12"
-content-hash = "001dd98b2ddcba859c0cb922beefe676bf811bf9792a41f8d94061642de9ceaa"
+content-hash = "71cddf08b9c3e815d35f3016a2eb3a8cf2abe3244a2e147e9edb94717d7b4a9b"
diff --git a/proxyshop/__console__.py b/proxyshop/__console__.py
deleted file mode 100644
index 9163df11..00000000
--- a/proxyshop/__console__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from proxyshop.constants import con
-
-if not con.headless:
- from proxyshop.gui.console import Console
-else:
- from proxyshop.core import Console
-
-console = Console()
diff --git a/proxyshop/gui/dict.py b/proxyshop/gui/dict.py
deleted file mode 100644
index 83b44c25..00000000
--- a/proxyshop/gui/dict.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-GUI Element Tracking Module
-"""
-
-from kivy.uix.boxlayout import BoxLayout
-from kivy.uix.button import Button
-from kivy.uix.togglebutton import ToggleButton
-
-from proxyshop.core import card_types
-
-
-class GUIResources:
- def __init__(self):
- self.template_row: dict[str, [str, BoxLayout]] = {k: {} for k in card_types}
- self.template_btn: dict[str, [str, ToggleButton]] = {k: {} for k in card_types}
- self.template_btn_cfg: dict[str, [str, Button]] = {k: {} for k in card_types}
-
-
-GUI = GUIResources()
diff --git a/proxyshop/scryfall.py b/proxyshop/scryfall.py
deleted file mode 100644
index 5c9d9eff..00000000
--- a/proxyshop/scryfall.py
+++ /dev/null
@@ -1,148 +0,0 @@
-"""
-FUNCTIONS THAT INTERACT WITH SCRYFALL
-"""
-import os
-import time
-import json
-from shutil import copyfileobj
-
-import requests
-from typing import Optional, Union
-from urllib import parse
-
-from proxyshop.settings import cfg
-from proxyshop.constants import con
-from proxyshop.__console__ import console
-
-
-def card_info(card_name: str, card_set: Optional[str] = None) -> Union[dict, Exception]:
- """
- Search Scryfall for a card.
- @param card_name: Name of card
- @param card_set: Set code of card
- @return: Card dict or error
- """
- # Alternate language
- if cfg.lang != "en":
- card = get_card_search(card_name, cfg.lang, card_set)
- if isinstance(card, dict):
- return card
- # Failed to find alternate language version
- if not cfg.dev_mode:
- console.update(
- f"Reverting to English: [b]{card_name} [lang: {str(cfg.lang)}][/b]", card
- )
-
- # Query the card in English
- card = get_card_search(card_name, set_code=card_set)
- return card
-
-
-def get_card_search(
- name: str,
- language: Optional[str] = None,
- set_code: Optional[str] = None
-) -> Union[dict, Exception]:
- """
- Get card using cards/search scryfall API.
- @param name: Name of the card, ex: Damnation
- @param language: Lang code to look for, ex: en
- @param set_code: Set code to look for, ex: MH2
- @return: Card dict or exception
- """
- # Order, language, set code
- order = "&order=released&dir=asc" if cfg.scry_ascending else ""
- lang = f" lang:{language}" if language else ""
- code = f"+set%3A{set_code}" if set_code else ""
-
- # Query Scryfall, 3 retries
- url = f'https://api.scryfall.com/cards/search?unique=prints' \
- f'{order}&q=!"{parse.quote(name)}"{code} include:extras{lang}'
- err = None
- for i in range(3):
- try:
- card = requests.get(url, headers=con.http_header).json()
- for card in card['data']:
- if 'set_type' in card:
- if card['set_type'] != "memorabilia" or 'Championship' in card['set_name']:
- return add_meld_info(card)
- raise Exception("Could not find a playable card with this name!")
- except Exception as e:
- err = e
- time.sleep(float(i / 3))
- return err
-
-
-def set_info(set_code: str) -> Optional[dict]:
- """
- Search scryfall for a set
- @param set_code: The set to look for, ex: MH2
- @return: MTG set dict or None
- """
- # Has this set been logged?
- filepath = os.path.join(con.cwd, f"proxyshop/datas/SET-{set_code.upper()}.json")
- try:
- if os.path.exists(filepath):
- with open(filepath, "r", encoding="utf-8") as f:
- loaded = json.load(f)
- return loaded
- except Exception as e:
- console.log_exception(e)
- err = None
- url = f"https://mtgjson.com/api/v5/{set_code.upper()}.json"
-
- # Try up to 5 times
- for i in range(5):
- try:
- source = requests.get(url, headers=con.http_header).text
- j = json.loads(source)['data']
- j.pop('cards')
- with open(filepath, "w", encoding="utf-8") as f:
- json.dump(j, f, sort_keys=True, ensure_ascii=False)
- return j
- except Exception as e:
- # Remote disconnected
- err = e
- time.sleep(float(i/5))
- console.log_exception(err)
- return
-
-
-def card_scan(img_url: str) -> Optional[str]:
- """
- Downloads scryfall art from URL
- @param img_url: Scryfall URI for image.
- @return: Filename of the saved image.
- """
- try:
- r = requests.get(img_url, stream=True)
- with open(con.scryfall_scan_path, 'wb') as f:
- copyfileobj(r.raw, f)
- if not cfg.dev_mode:
- console.update(f"Downloaded Scryfall scan!")
- return f.name
- except Exception as e:
- # HTTP request failed
- if not cfg.dev_mode:
- console.update(f"Couldn't retrieve scryfall image scan! Continuing without it.", e)
- return
-
-
-def add_meld_info(card_json: dict) -> dict:
- """
- If the current card is a meld card, it's important to retrieve information about its faces here, since it'll be
- difficult to make another query while building the card's layout obj. For each part in all_parts, query Scryfall
- for the full card info from that part's uri.
- """
- # Only for Meld cards
- if card_json['layout'] == "meld":
- # Add list of faces to the JSON data
- card_json['faces'] = []
- for part in card_json['all_parts']:
- # Ignore tokens and other objects
- if part['component'] in ('meld_part', 'meld_result'):
- # Grab the card face data, add component type, insert it
- data = requests.get(part["uri"], headers=con.http_header).json()
- data['component'] = part['component']
- card_json["faces"].append(data)
- return card_json
diff --git a/proxyshop/tests/utility.py b/proxyshop/tests/utility.py
deleted file mode 100644
index 64889382..00000000
--- a/proxyshop/tests/utility.py
+++ /dev/null
@@ -1,137 +0,0 @@
-"""
-TESTING UTILITY
-For contributors and plugin development.
-"""
-# CORE MODULES
-import os
-from time import perf_counter
-from typing import Optional
-
-import photoshop.api as ps
-from photoshop.api._artlayer import ArtLayer
-
-from proxyshop.constants import con
-con.headless = True
-import proxyshop.helpers as psd
-
-app = ps.Application()
-cID = app.charIDToTypeID
-sID = app.stringIDToTypeID
-
-
-"""
-CURRENTLY IN DEVELOPMENT
-"""
-
-
-def place_watermark(ref: ArtLayer, name: str = "GU") -> ArtLayer:
- """
- Places an SVG watermark.
- @param ref: Reference used to frame the watermark.
- @param name: Name to give the new watermark layer.
- @return: New watermark player.
- """
- wm = psd.import_svg(os.path.join(con.cwd, f"proxyshop/img/watermarks/{name}.svg"))
- psd.align_vertical(wm, ref)
- psd.align_horizontal(wm, ref)
- app.activeDocument.activeLayer.opacity = 50
- psd.frame_layer(wm, ref, smallest=True)
- wm.resize(80, 80, ps.AnchorPosition.MiddleCenter)
- wm.move(psd.getLayerSet("Pinlines & Textbox"), ps.ElementPlacement.PlaceBefore)
- wm.blendMode = ps.BlendMode.ColorBurn
- return wm
-
-
-"""
-TEMPLATE TESTING UTILITIES
-"""
-
-
-def test_new_color(new: str, old: Optional[str] = None, ignore: Optional[list[str]] = None):
- """
- Enables given color in all necessary groups. Optionally disable a color in those groups.
- @param new: Color to enable.
- @param old: Color to disable.
- @param ignore: Groups to ignore.
- @return:
- """
- if ignore is None:
- ignore = ["Pinlines & Textbox"]
- groups = ["Name & Title Boxes", "Legendary Crown", "Pinlines & Textbox", "Background", "PT Box"]
- for r in ignore:
- groups.remove(r)
- for g in groups:
- # Enable new color
- psd.getLayer(new, g).visible = True
- # Disable old color
- if old:
- psd.getLayer(old, g).visible = False
-
-
-def make_duals(
- name="Pinlines & Textbox",
- mask_top: Optional[str] = "MASK",
- mask_bottom: Optional[str] = None
-):
- """
- Creates dual color layers for a given group.
- @param name: Name of the group.
- @param mask_top: Mask to place on top color.
- @param mask_bottom: Mask to place on bottom color.
- @return:
- """
- duals = ["WU", "WB", "RW", "GW", "UB", "UR", "GU", "BR", "BG", "RG"]
- group = psd.getLayerSet(name)
- mask_top = psd.getLayer(mask_top, group) if mask_top else None
- mask_bottom = psd.getLayer(mask_bottom, group) if mask_bottom else None
- ref = psd.getLayer("W", group)
-
- # Loop through each dual
- for dual in duals:
- # Change layer visibility
- top = psd.getLayer(dual[0], group).duplicate(ref, ps.ElementPlacement.PlaceBefore)
- bottom = psd.getLayer(dual[1], group).duplicate(top, ps.ElementPlacement.PlaceAfter)
- top.visible = True
- bottom.visible = True
-
- # Enable masks
- if mask_top:
- psd.copy_layer_mask(mask_top, top)
- if mask_bottom:
- psd.copy_layer_mask(mask_bottom, bottom)
-
- # Merge the layers and rename
- new_layer = psd.merge_layers([top, bottom])
- new_layer.name = dual
-
-
-"""
-EXECUTION TIME TESTING
-"""
-
-
-def t1(arg):
- return 'result'
-
-
-def t2(arg):
- return 'result'
-
-
-# Establish your variables outside the test
-variable = "Some variable"
-
-# Test speed of first function
-s = perf_counter()
-result1 = t1(variable)
-print(f"Test 1: {perf_counter()-s} seconds")
-
-# Test speed of second function
-s = perf_counter()
-result2 = t2(variable)
-print(f"Test 2: {perf_counter()-s} seconds")
-
-# Optionally check that results match
-print('\n')
-print(result1)
-print(result2)
diff --git a/proxyshop/utils.py b/proxyshop/utils.py
deleted file mode 100644
index e6f02086..00000000
--- a/proxyshop/utils.py
+++ /dev/null
@@ -1,13 +0,0 @@
-"""
-Utility Helpers Module
-"""
-import unicodedata
-import string
-
-
-def normalize_str(st: str) -> str:
- # Ignore accents and unusual characters, all lowercase
- st = unicodedata.normalize("NFD", st).encode("ascii", "ignore").decode("utf8").lower()
-
- # Remove punctuation
- return st.translate(str.maketrans("", "", string.punctuation))
diff --git a/pyproject.toml b/pyproject.toml
index 0f88f2e0..f4485f93 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,12 +14,13 @@ asynckivy = "^0.5.4"
Pillow = "^9.4.0"
pyclean = "^2.2.0"
kivy = {extras = ["base", "media"], version = "^2.1.0"}
+typing-extensions = "^4.5.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7.2.0"
mypy = "^0.991"
commitizen = "^2.39.1"
-pyinstaller = "^5.7.0"
+setuptools = "^67.6.0"
[build-system]
requires = ["poetry-core"]
@@ -31,5 +32,5 @@ changelog_start_rev = 'v1.2.0'
tag_format = "v$major.$minor.$patch"
update_changelog_on_bump = true
version_files = [
- "proxyshop/__version__.py"
+ "src/__version__.py"
]
\ No newline at end of file
diff --git a/src/__console__.py b/src/__console__.py
new file mode 100644
index 00000000..bedbd07f
--- /dev/null
+++ b/src/__console__.py
@@ -0,0 +1,8 @@
+from src.constants import con
+
+if not con.headless:
+ from src.gui.console import Console
+else:
+ from src.core import Console
+
+console = Console()
diff --git a/proxyshop/__dev__.py b/src/__dev__.py
similarity index 100%
rename from proxyshop/__dev__.py
rename to src/__dev__.py
diff --git a/proxyshop/__version__.py b/src/__version__.py
similarity index 100%
rename from proxyshop/__version__.py
rename to src/__version__.py
diff --git a/proxyshop/configs/BasicLandClassicTemplate.json b/src/configs/BasicLandClassicTemplate.json
similarity index 100%
rename from proxyshop/configs/BasicLandClassicTemplate.json
rename to src/configs/BasicLandClassicTemplate.json
diff --git a/proxyshop/configs/InventionTemplate.json b/src/configs/InventionTemplate.json
similarity index 100%
rename from proxyshop/configs/InventionTemplate.json
rename to src/configs/InventionTemplate.json
diff --git a/proxyshop/configs/NormalClassicTemplate.json b/src/configs/NormalClassicTemplate.json
similarity index 100%
rename from proxyshop/configs/NormalClassicTemplate.json
rename to src/configs/NormalClassicTemplate.json
diff --git a/proxyshop/constants.py b/src/constants.py
similarity index 81%
rename from proxyshop/constants.py
rename to src/constants.py
index 4fb5ba1e..a3a7b539 100644
--- a/proxyshop/constants.py
+++ b/src/constants.py
@@ -7,8 +7,8 @@
import json
from dataclasses import dataclass
try:
- from proxyshop.__env__ import google
- from proxyshop.__env__ import cloudfront
+ from src.__env__ import google
+ from src.__env__ import cloudfront
except ModuleNotFoundError:
google = ""
cloudfront = ""
@@ -174,14 +174,24 @@ def __init__(self):
def load_values(self):
- # Current working directory
+ # Key file paths
self.cwd = os.getcwd()
+ self.path_src = osp.join(self.cwd, 'src')
+ self.path_logs = osp.join(self.cwd, 'logs')
+ self.path_plugins = osp.join(self.cwd, 'plugins')
+ self.path_img = osp.join(self.path_src, 'img')
+ self.path_data = osp.join(self.path_src, 'data')
+ self.path_tests = osp.join(self.path_src, 'tests')
+ self.path_data_sets = osp.join(self.path_data, 'sets')
+ self.path_scryfall_scan = osp.join(self.path_logs, "card.jpg")
+ self.path_version_tracker = osp.join(self.path_data, 'version_tracker.json')
+ self.path_config_json = osp.join(self.path_data, 'app_settings.json')
# Import version tracker
- if not os.path.exists(os.path.join(self.cwd, "proxyshop/version_tracker.json")):
- with open(os.path.join(self.cwd, "proxyshop/version_tracker.json"), "w", encoding="utf-8") as tr:
+ if not osp.exists(self.path_version_tracker):
+ with open(self.path_version_tracker, "w", encoding="utf-8") as tr:
json.dump({}, tr, indent=4)
- with open(os.path.join(self.cwd, "proxyshop/version_tracker.json"), "r", encoding="utf-8") as tr:
+ with open(self.path_version_tracker, "r", encoding="utf-8") as tr:
try:
self.versions = json.load(tr)
except json.decoder.JSONDecodeError:
@@ -191,10 +201,6 @@ def load_values(self):
self.google_api = google
self.cloudfront_url = cloudfront
- # Important paths
- self.json_custom_path = os.path.join(self.cwd, "tmp\\custom.json")
- self.scryfall_scan_path = os.path.join(self.cwd, "tmp\\card.jpg")
-
# Card classes - finer grained than Scryfall layouts
self.normal_class = "normal"
self.transform_front_class = "transform_front"
@@ -288,23 +294,25 @@ def load_values(self):
# Basic land dictionary
self.basic_land_names = [
- "Plains",
- "Island",
- "Swamp",
- "Mountain",
- "Forest",
- "Wastes",
- "Snow-Covered Plains",
- "Snow-Covered Island",
- "Snow-Covered Swamp",
- "Snow-Covered Mountain",
- "Snow-Covered Forest"
+ "plains",
+ "island",
+ "swamp",
+ "mountain",
+ "forest",
+ "wastes",
+ "snowcoveredplains",
+ "snowcoveredisland",
+ "snowcoveredswamp",
+ "snowcoveredmountain",
+ "snowcoveredforest"
]
# Color reference dictionary
self.colors = {
'black': [0, 0, 0],
- 'white': [255, 255, 255]
+ 'white': [255, 255, 255],
+ 'silver': [167, 177, 186],
+ 'gold': [166, 135, 75]
}
# Rarity gradient dictionary
@@ -363,10 +371,30 @@ def load_values(self):
]
}
+ # Watermark colors
+ self.watermark_colors = {
+ 'W': [183, 157, 88],
+ 'U': [140, 172, 197],
+ 'B': [94, 94, 94],
+ 'R': [198, 109, 57],
+ 'G': [89, 140, 82],
+ 'Gold': [202, 179, 77],
+ 'Land': [94, 84, 72],
+ 'Artifact': [100, 125, 134],
+ 'Colorless': [100, 125, 134]
+ }
+
+ # Import watermark library
+ with open(osp.join(self.path_data, 'watermarks.json'), "r", encoding="utf-8-sig") as js:
+ self.watermarks = json.load(js)
+
# Import set symbol library
- with open(osp.join(self.cwd, "proxyshop/symbols.json"), "r", encoding="utf-8-sig") as js:
+ with open(osp.join(self.path_data, "symbols.json"), "r", encoding="utf-8-sig") as js:
self.set_symbols = json.load(js)
- with open(osp.join(self.cwd, "proxyshop/custom_symbols.json"), "r", encoding="utf-8-sig") as js:
+ if not osp.exists(osp.join(self.path_data, "custom_symbols.json")):
+ with open(osp.join(self.path_data, "custom_symbols.json"), "w", encoding="utf-8") as cs:
+ json.dump({}, cs, indent=4)
+ with open(osp.join(self.path_data, "custom_symbols.json"), "r", encoding="utf-8-sig") as js:
self.set_symbols.update(json.load(js))
# Font names
@@ -421,6 +449,15 @@ def load_values(self):
# Run headless
self.headless = False
+ # Version compatibility features
+ self.version_webp = '23.2.0'
+ self.version_targeted_replace = '22.0.0'
+
+ # Console message colors
+ self.console_message_error = "#a84747"
+ self.console_message_warning = "#d4c53d"
+ self.console_message_success = "#59d461"
+
def reload(self):
"""
Reloads default values
@@ -431,7 +468,7 @@ def update_version_tracker(self):
"""
Updates the version tracker json with current dict.
"""
- with open(os.path.join(self.cwd, "proxyshop/version_tracker.json"), "w", encoding="utf-8") as vt:
+ with open(self.path_version_tracker, "w", encoding="utf-8") as vt:
json.dump(self.versions, vt, indent=4)
diff --git a/proxyshop/core.py b/src/core.py
similarity index 92%
rename from proxyshop/core.py
rename to src/core.py
index 9ef3f1dc..088a899b 100644
--- a/proxyshop/core.py
+++ b/src/core.py
@@ -12,8 +12,8 @@
from typing import Optional, Callable, TypedDict, Union
from typing_extensions import NotRequired
from importlib import util, import_module
-from proxyshop import update
-from proxyshop.constants import con
+from src import update
+from src.constants import con
# All Template types
card_types = {
@@ -49,7 +49,8 @@
class TemplateDetails(TypedDict):
class_name: str
plugin_path: Optional[str]
- preview_path: Optional[str]
+ preview_path: str
+ templates_path: str
config_path: str
name: str
type: str
@@ -87,7 +88,7 @@ def get_template_class(template: TemplateDetails) -> Callable:
"""
# Built-in template?
if not template['plugin_path']:
- return getattr(import_module("proxyshop.templates"), template['class_name'])
+ return getattr(import_module("src.templates"), template['class_name'])
# Plugin template
spec = util.spec_from_file_location("templates", template['plugin_path'])
@@ -102,10 +103,10 @@ def get_templates() -> dict[str, list[TemplateDetails]]:
@return: Dictionary of lists containing template details.
"""
# Plugin folders
- folders = glob(os.path.join(con.cwd, "proxyshop\\plugins\\*\\"))
+ folders = glob(os.path.join(con.path_plugins, "*\\"))
# Process the default templates.json
- with open(os.path.join(con.cwd, "proxyshop\\templates.json"), encoding="utf-8") as f:
+ with open(os.path.join(con.path_data, "templates.json"), encoding="utf-8") as f:
app_json = json.load(f)
main_json = {}
for card_type, templates in app_json.items():
@@ -114,8 +115,9 @@ def get_templates() -> dict[str, list[TemplateDetails]]:
for name, class_name in templates.items():
main_json[card_type].append({
"plugin_path": None,
- "config_path": osp.join(con.cwd, f"proxyshop/configs/{class_name}.json"),
- "preview_path": osp.join(con.cwd, f"proxyshop/img/{class_name}.jpg"),
+ "config_path": osp.join(con.path_src, f"configs/{class_name}.json"),
+ "preview_path": osp.join(con.path_img, f"{class_name}.jpg"),
+ "templates_path": osp.join(con.cwd, 'templates'),
"class_name": class_name,
"name": name,
"type": named_type
@@ -143,6 +145,7 @@ def get_templates() -> dict[str, list[TemplateDetails]]:
"plugin_path": py_file,
"config_path": py_file.replace('templates.py', f'configs/{class_name}.json'),
"preview_path": py_file.replace('templates.py', f'img/{class_name}.jpg'),
+ 'templates_path': py_file.replace('.py', ''),
"class_name": class_name,
"name": name,
"type": named_type
@@ -257,7 +260,7 @@ def check_for_updates() -> dict:
updates: dict[list[dict]] = {}
# Base app manifest
- with open("proxyshop/manifest.json", encoding="utf-8") as f:
+ with open(osp.join(con.path_data, "manifest.json"), encoding="utf-8") as f:
# Get config info
data = json.load(f)
s3_enabled = data['__CONFIG__']['S3']
@@ -276,7 +279,7 @@ def check_for_updates() -> dict:
temp['type'] = cat
temp['name'] = name
temp['plugin'] = None
- temp['manifest'] = os.path.join(con.cwd, 'proxyshop/manifest.json')
+ temp['manifest'] = os.path.join(con.path_data, 'manifest.json')
temp['s3'] = s3_enabled
# Does this template need an update?
@@ -286,7 +289,7 @@ def check_for_updates() -> dict:
# Get plugin manifests
plugins = []
- folders = glob(os.path.join(con.cwd, "proxyshop\\plugins\\*\\"))
+ folders = glob(os.path.join(con.path_plugins, "*\\"))
for folder in folders:
if 'manifest.json' in os.listdir(folder):
plugins.append({
@@ -346,7 +349,7 @@ def version_check(temp: dict, plugin: Optional[str] = None) -> Optional[dict]:
print(f"{temp['name']} ({temp['file']}) couldn't be located!")
return
plugin_path = f"{plugin}/" if plugin else ""
- full_path = osp.join(con.cwd, f"templates/{plugin_path}{temp['file']}")
+ full_path = osp.join(con.path_plugins, f"{plugin_path}templates/{temp['file']}")
if 'description' not in data or not data['description']:
data['description'] = "v1.0.0"
current = get_current_version(temp['id'], full_path)
@@ -435,16 +438,6 @@ def gdrive_metadata(file_id: str) -> dict:
return requests.get(source, headers=con.http_header).json()
-"""
-SYSTEM FUNCTIONS
-"""
-
-
-def import_json_config(path: str) -> dict:
- with open(os.path.join(f"{con.cwd}/proxyshop/plugins", path)) as f:
- return json.load(f)
-
-
"""
HEADLESS CONSOLE
"""
@@ -456,7 +449,7 @@ class Console:
"""
@staticmethod
- def message(msg):
+ def update(msg):
print(msg)
@staticmethod
diff --git a/proxyshop/app_settings.json b/src/data/app_settings.json
similarity index 61%
rename from proxyshop/app_settings.json
rename to src/data/app_settings.json
index 164e6798..85fce28d 100644
--- a/proxyshop/app_settings.json
+++ b/src/data/app_settings.json
@@ -9,21 +9,24 @@
"desc": "File extension to use for rendered images.\n[b](Default: jpg)[/b]",
"section": "FILES",
"key": "Output.Filetype",
- "options": ["jpg", "png", "psd"]
+ "options": ["jpg", "png", "psd"],
+ "default": "jpg"
},
{
"type": "bool",
"title": "[b]Save Artist Name[/b]",
"desc": "Include artist in rendered file name, e.g. Damnation (Seb McKinnon).jpg\n[b](Default: True)[/b]",
"section": "FILES",
- "key": "Save.Artist.Name"
+ "key": "Save.Artist.Name",
+ "default": 1
},
{
"type": "bool",
"title": "[b]Overwrite Duplicates[/b]",
"desc": "Overwrite rendered files with identical file names.\n[b](Default: True)[/b]",
"section": "FILES",
- "key": "Overwrite.Duplicate"
+ "key": "Overwrite.Duplicate",
+ "default": 1
},
{
"type": "title",
@@ -35,89 +38,97 @@
"desc": "A scryfall supported language code to look for alternate language text.\nPhyrexian is not supported at this time.\n[b](Default: en)[/b]",
"section": "TEXT",
"key": "Language",
- "options": ["en", "es", "fr", "de", "it", "pt", "jp", "kr", "ru", "cs", "ct"]
+ "options": ["en", "es", "fr", "de", "it", "pt", "jp", "kr", "ru", "cs", "ct"],
+ "default": "en"
},
{
"type": "bool",
"title": "[b]Enable Flavor Divider[/b]",
"desc": "Adds flavor divider to rendered card when appropriate.\n[b](Default: True)[/b]",
"section": "TEXT",
- "key": "Flavor.Divider"
+ "key": "Flavor.Divider",
+ "default": 1
},
{
"type": "bool",
"title": "[b]Remove Flavor Text[/b]",
"desc": "Renders cards without flavor text.\n[b](Default: False)[/b]",
"section": "TEXT",
- "key": "No.Flavor.Text"
+ "key": "No.Flavor.Text",
+ "default": 0
},
{
"type": "bool",
"title": "[b]Remove Reminder Text[/b]",
"desc": "Renders cards without reminder text.\n[b](Default: False)[/b]",
"section": "TEXT",
- "key": "No.Reminder.Text"
+ "key": "No.Reminder.Text",
+ "default": 0
},
{
"type": "bool",
"title": "[b]Realistic Collector Info[/b]",
"desc": "Disabling this will limit collector info to set code and artist only.\n[b](Default: True)[/b]",
"section": "TEXT",
- "key": "True.Collector.Info"
+ "key": "True.Collector.Info",
+ "default": 1
},
{
"type": "bool",
"title": "[b]Force English Formatting[/b]",
"desc": "Enabling this will force Photoshop text layers to use English formatting.\n[b](Default: False)[/b]",
"section": "TEXT",
- "key": "Force.English.Formatting"
+ "key": "Force.English.Formatting",
+ "default": 0
},
{
"type": "title",
"title": "Expansion Symbol"
},
{
- "type": "string",
- "title": "[b]Default Expansion Symbol[/b]",
- "desc": "Symbol character used in lieu of an automatically generated one.\nCopy the symbol from here: http://keyrune.andrewgioia.com/cheatsheet.html\n[b]This setting must be changed manually.[/b]",
+ "type": "options",
+ "title": "[b]Symbol Render Mode[/b]",
+ "desc": "Default: Renders using Keyrune + layer effects.\nClassic: Renders using Keyrune + gradient layers.\nSVG: Renders using SVGs sourced from CCGHQ.\nNone: Completely disables expansion symbol.\n[b](Default: 'default')[/b]",
"section": "SYMBOLS",
- "key": "Default.Symbol",
- "disabled": true
+ "key": "Symbol.Mode",
+ "options": ["default", "classic", "svg", "none"],
+ "default": "default"
},
{
- "type": "bool",
- "title": "[b]Automatically Generate Expansion Symbol[/b]",
- "desc": "Generates an accurate looking expansion symbol.\n[b](Default: True)[/b]",
+ "type": "string",
+ "title": "[b]Default Expansion Symbol[/b]",
+ "desc": "Symbol used when an automatic symbol couldn't be found.\nEnter an appropriate Magic the Gathering set code.\nList of Keyrune symbols and setcode: https://keyrune.andrewgioia.com/cheatsheet.html\n[b](Default: MTG)[/b]",
"section": "SYMBOLS",
- "key": "Auto.Set.Symbol"
+ "key": "Default.Symbol",
+ "default": "MTG"
},
{
"type": "bool",
- "title": "[b]Automatically Position Expansion Symbol[/b]",
- "desc": "Sizes and positions the expansion symbol to fit the type bar.\n[b](Default: True)[/b]",
+ "title": "[b]Force Default Expansion Symbol[/b]",
+ "desc": "Forces Proxyshop to always used the Default Expansion Symbol chosen above.\n[b](Default: False)[/b]",
"section": "SYMBOLS",
- "key": "Auto.Symbol.Size"
+ "key": "Force.Default.Symbol",
+ "default": 0
},
{
"type": "numeric",
- "title": "[b]Expansion Symbol Outline Size[/b]",
+ "title": "[b]Default Expansion Symbol Outline[/b]",
"desc": "Changes the thickness of the expansion symbol outline when not fully automated.\n[b](Default: 6)[/b]",
"section": "SYMBOLS",
- "key": "Symbol.Stroke.Size"
+ "key": "Symbol.Stroke.Size",
+ "default": 6
},
{
- "type": "bool",
- "title": "[b]Fill Expansion Symbol Background[/b]",
- "desc": "Fills empty space in expansion symbol. This feature is mostly deprecated now.\n[b](Default: False)[/b]",
- "section": "SYMBOLS",
- "key": "Fill.Symbol.Background"
+ "type": "title",
+ "title": "Watermarks"
},
{
"type": "bool",
- "title": "[b]Classic Symbol Rendering[/b]",
- "desc": "Renders expansion symbols using old methodology (pre v1.5.0).\n[b](Default: False)[/b]",
- "section": "SYMBOLS",
- "key": "Classic.Symbol.Rendering"
+ "title": "[b]Enable Watermark[/b]",
+ "desc": "Automatically generate watermark when detected and supported.\n[b](Default: False)[/b]",
+ "section": "WATERMARK",
+ "key": "Enable.Watermark",
+ "default": 0
},
{
"type": "title",
@@ -128,28 +139,32 @@
"title": "[b]Manual Editing Mode[/b]",
"desc": "Pause the render process before saving to allow for manual edits.\n[b](Default: False)[/b]",
"section": "APP",
- "key": "Manual.Edit"
+ "key": "Manual.Edit",
+ "default": 0
},
{
"type": "bool",
"title": "[b]Skip Failed Cards[/b]",
"desc": "Automatically skip failed cards without asking for confirmation.\n[b](Default: False)[/b]",
"section": "APP",
- "key": "Skip.Failed"
+ "key": "Skip.Failed",
+ "default": 0
},
{
"type": "bool",
"title": "[b]Scryfall Search Ascending[/b]",
"desc": "When pulling card from Scryfall, search from oldest to most recent.\n[b](Default: False)[/b]",
"section": "APP",
- "key": "Scryfall.Ascending"
+ "key": "Scryfall.Ascending",
+ "default": 0
},
{
"type": "bool",
"title": "[b]Targeted Text Replacement[/b]",
"desc": "Disabling this can fix a crash that occurs on some versions of Photoshop.\nTry disabling this if experiencing a crash during the collector info step.\n[b](Default: True)[/b]",
"section": "APP",
- "key": "Targeted.Replace"
+ "key": "Targeted.Replace",
+ "default": 1
},
{
"type": "bool",
@@ -157,24 +172,44 @@
"desc": "Enabling this will change the GUI into a simple testing interface.\n[b]This setting must be changed manually.[/b]",
"section": "APP",
"key": "Dev.Mode",
- "disabled": true
+ "disabled": true,
+ "default": 0
},
{
"type": "title",
"title": "Special Template Settings"
},
+ {
+ "type": "options",
+ "title": "[b]Border Color[/b]",
+ "desc": "Choose the color of the card border used across templates.\nWill work on most templates, but considered experimental.\n[b](Default: 'black')[/b]",
+ "section": "TEMPLATES",
+ "key": "Border.Color",
+ "options": ["black", "white", "silver", "gold"],
+ "default": "black"
+ },
{
"type": "bool",
"title": "[b]Render Snow Cards with Snow Template[/b]",
"desc": "When enabled, snow cards will be rendered using Snow template type.\n[b](Default: False)[/b]",
"section": "TEMPLATES",
- "key": "Render.Snow"
+ "key": "Render.Snow",
+ "default": 0
},
{
"type": "bool",
"title": "[b]Render Miracle Cards with Miracle Template[/b]",
"desc": "When enabled, miracle cards will be rendered using Miracle template type.\n[b](Default: False)[/b]",
"section": "TEMPLATES",
- "key": "Render.Miracle"
+ "key": "Render.Miracle",
+ "default": 0
+ },
+ {
+ "type": "bool",
+ "title": "[b]Render Basic Land Cards with Basic Land Template[/b]",
+ "desc": "When disabled, Basic Land cards will be rendered using Normal template type.\n[b](Default: True)[/b]",
+ "section": "TEMPLATES",
+ "key": "Render.Basic",
+ "default": 1
}
]
\ No newline at end of file
diff --git a/proxyshop/custom_symbols.json b/src/data/custom_symbols.json
similarity index 100%
rename from proxyshop/custom_symbols.json
rename to src/data/custom_symbols.json
diff --git a/proxyshop/manifest.json b/src/data/manifest.json
similarity index 97%
rename from proxyshop/manifest.json
rename to src/data/manifest.json
index 9542e716..b0ec1e1e 100644
--- a/proxyshop/manifest.json
+++ b/src/data/manifest.json
@@ -42,6 +42,10 @@
"Snow": {
"file": "snow.psd",
"id": "1KTvgxYg0wS8YuLDoVjt37-0HaEMhZKvH"
+ },
+ "Universes Beyond": {
+ "file": "universes-beyond.psd",
+ "id": "1wdn4NELA5N-25zq4DcumiNfMdY9H2ojd"
}
},
"Transform": {
diff --git a/proxyshop/symbols.json b/src/data/symbols.json
similarity index 98%
rename from proxyshop/symbols.json
rename to src/data/symbols.json
index a3af6973..c083afbc 100644
--- a/proxyshop/symbols.json
+++ b/src/data/symbols.json
@@ -166,7 +166,7 @@
"char": "",
"gradient": {
"rotation": 0,
- "scale": "80",
+ "scale": 80,
"colors": {
"u": [
{
@@ -387,7 +387,7 @@
"BFZ": "",
"EXP": "",
"C15": "",
- "PZ1": "",
+ "PZ1": "MTG",
"OGW": "",
"DDQ": "",
"W16": [
@@ -784,9 +784,13 @@
{
"char": "",
"fill": "white",
- "stroke": ["black", 6],
+ "stroke": ["black", 4],
"common-fill": "white",
- "common-stroke": ["white", 6]
+ "common-stroke": ["white", 4],
+ "gradient": {
+ "rotation": 0,
+ "scale": 100
+ }
},
{
"char": "",
@@ -1079,13 +1083,13 @@
"fill": "white",
"stroke": {
"color": "black",
- "weight": "4",
+ "weight": 4,
"style": "in"
},
"common-fill": "white",
"common-stroke": {
"color": "black",
- "weight": "4",
+ "weight": 4,
"style": "in"
}
},
@@ -1094,12 +1098,12 @@
"rarity": false,
"stroke": {
"color": "black",
- "weight": "4",
+ "weight": 4,
"style": "center"
},
"common-stroke": {
"color": "black",
- "weight": "4",
+ "weight": 4,
"style": "center"
}
}
diff --git a/proxyshop/templates.json b/src/data/templates.json
similarity index 87%
rename from proxyshop/templates.json
rename to src/data/templates.json
index 3e831adb..e9d2eca8 100644
--- a/proxyshop/templates.json
+++ b/src/data/templates.json
@@ -9,13 +9,16 @@
"Expedition": "ExpeditionTemplate",
"Womens Day": "WomensDayTemplate",
"Miracle": "MiracleTemplate",
- "Snow": "SnowTemplate"
+ "Snow": "SnowTemplate",
+ "Universes Beyond": "UniversesBeyondTemplate"
},
"transform_front": {
- "Normal": "TransformFrontTemplate"
+ "Normal": "TransformFrontTemplate",
+ "Universes Beyond": "UniversesBeyondTemplate"
},
"transform_back": {
- "Normal": "TransformBackTemplate"
+ "Normal": "TransformBackTemplate",
+ "Universes Beyond": "UniversesBeyondTemplate"
},
"mdfc_front": {
"Normal": "MDFCFrontTemplate"
diff --git a/proxyshop/tests.json b/src/data/tests.json
similarity index 87%
rename from proxyshop/tests.json
rename to src/data/tests.json
index 10272815..f0ade258 100644
--- a/proxyshop/tests.json
+++ b/src/data/tests.json
@@ -36,8 +36,14 @@
["Guul Draz Assassin", "Creature - 2"]
],
"saga": [
- ["Time of Ice", "Mono"],
- ["Battle of Frost and Fire", "Dual - 3"]
+ ["Time of Ice", "Mono Color"],
+ ["Battle of Frost and Fire", "Dual Color"],
+ ["The Elder Dragon War", "Read Ahead"],
+ ["The Restoration of Eiganjo", "Transform"]
+ ],
+ "class": [
+ ["Wizard Class", "Mono Color"],
+ ["Rogue Class", "Dual Color"]
],
"miracle": [
["Terminus", "Noncreature Mono"],
diff --git a/src/data/watermarks.json b/src/data/watermarks.json
new file mode 100644
index 00000000..88d07af4
--- /dev/null
+++ b/src/data/watermarks.json
@@ -0,0 +1,8 @@
+{
+ "obscura": { "scale": 92 },
+ "brokers": { "scale": 92 },
+ "maestros": { "scale": 92 },
+ "riveteers": { "scale": 92 },
+ "cabaretti": { "scale": 92 },
+ "phyrexian": { "scale": 92 }
+}
\ No newline at end of file
diff --git a/proxyshop/format_text.py b/src/format_text.py
similarity index 99%
rename from proxyshop/format_text.py
rename to src/format_text.py
index b8736da5..a6a3a6ba 100644
--- a/proxyshop/format_text.py
+++ b/src/format_text.py
@@ -8,9 +8,9 @@
import photoshop.api as ps
from photoshop.api._artlayer import ArtLayer
-import proxyshop.helpers as psd
-from proxyshop.constants import con
-from proxyshop.__console__ import console
+import src.helpers as psd
+from src.constants import con
+from src.__console__ import console
# QOL Definitions
app = ps.Application()
diff --git a/proxyshop/frame_logic.py b/src/frame_logic.py
similarity index 78%
rename from proxyshop/frame_logic.py
rename to src/frame_logic.py
index 77adc56d..705fbed1 100644
--- a/proxyshop/frame_logic.py
+++ b/src/frame_logic.py
@@ -3,8 +3,8 @@
"""
from typing import Union, Optional, TypedDict
-from proxyshop.constants import con
-from proxyshop.settings import cfg
+from src.constants import con
+from src.settings import cfg
class FrameDetails(TypedDict):
@@ -98,10 +98,10 @@ def select_frame_layers(card: dict) -> FrameDetails:
# Iterate over rules text lines
basic_identity = ''
for line in oracle_text.split('\n'):
- # Identify if the card is a fetchland
+ # Identify if the card is a fetch land
if 'search your library' in line.lower():
if 'cycling' not in line.lower():
- # Fetchland of some kind, find basic land types
+ # Fetch land of some kind, find basic land types
for key, basic in basic_colors.items():
if key in line:
# The land has this basic type in the line of rules text where it fetches
@@ -126,24 +126,27 @@ def select_frame_layers(card: dict) -> FrameDetails:
'is_colorless': False,
}
elif len(basic_identity) == 3:
- # Three basic mentioned - panorama land
+ # Three basic mentioned, Panorama case
return {
'background': con.layers.LAND,
'pinlines': con.layers.LAND,
'twins': con.layers.LAND,
'is_colorless': False,
}
- elif line.find(con.layers.LAND.lower()) >= 0:
+ elif con.layers.LAND.lower() in line:
# Assume we get here when the land fetches for any basic
- if 'tapped' not in line or 'untap' in line:
- # Gold fetchland
+ if ('tapped' not in line or 'untap' in line) and (
+ # Ash Barrens case
+ 'into your hand' not in line
+ ):
+ # Gold fetch land
return {
'background': con.layers.LAND,
'pinlines': con.layers.GOLD,
'twins': con.layers.GOLD,
'is_colorless': False,
}
- # Colorless fetchland
+ # Colorless fetch land
return {
'background': con.layers.LAND,
'pinlines': con.layers.LAND,
@@ -152,29 +155,27 @@ def select_frame_layers(card: dict) -> FrameDetails:
}
# Check if the line adds one mana of any color
- if 'add' in line.lower() and 'mana' in line:
- if (
- 'color ' in line
- or 'colors ' in line
- or 'color.' in line
- or 'colors.' in line
- or 'any type' in line
- ):
- # Identified an ability of a potentially gold land
- # If the ability doesn't include the phrases "enters the battlefield", "Remove a charge
- # counter", and "luck counter", and doesn't include the word "Sacrifice", then it's
- # considered a gold land
- phrases = ['enters the battlefield', 'Remove a charge counter', 'Sacrifice', 'luck counter']
- if not any(x in line for x in phrases):
- # This is a gold land - use gold twins and pinlines
- return {
- 'background': con.layers.LAND,
- 'pinlines': con.layers.GOLD,
- 'twins': con.layers.GOLD,
- 'is_colorless': False,
- }
+ if ('add' in line.lower() and 'mana' in line) and (
+ 'color ' in line
+ or 'colors ' in line
+ or 'color.' in line
+ or 'colors.' in line
+ or 'any type' in line
+ ):
+ # Potential Gold Land
+ # If the ability doesn't include "enters the battlefield", "Remove a charge
+ # counter", "luck counter", or "Sacrifice", it's probably a Gold land.
+ phrases = ['enters the battlefield', 'Remove a charge counter', 'Sacrifice', 'luck counter']
+ if not any(x in line for x in phrases):
+ # This is a gold land - use gold twins and pinlines
+ return {
+ 'background': con.layers.LAND,
+ 'pinlines': con.layers.GOLD,
+ 'twins': con.layers.GOLD,
+ 'is_colorless': False,
+ }
- # Check if the line makes all lands X type, ex: Urborg
+ # Check if the line makes all lands X type, ex: Urborg, Tomb of Yawgmoth
if 'Each land is a ' in line:
for k, v in basic_colors.items():
if k in line:
@@ -334,36 +335,52 @@ def select_frame_layers(card: dict) -> FrameDetails:
"""
-def format_expansion_symbol_info(symbol: Union[str, list]) -> Optional[tuple[str, list]]:
+def format_expansion_symbol_info(symbol: Union[str, list], rarity: str) -> Optional[tuple[str, list]]:
"""
Takes in set code and returns information needed to build the expansion symbol.
@param symbol: Symbol chosen by layout object.
+ @param rarity: Rarity of the symbol.
@return: List of dicts containing information about this symbol.
"""
+ rare = bool(rarity != con.rarity_common)
if isinstance(symbol, str):
return symbol, [{
'char': symbol,
- 'rarity': True,
- 'fill': 'black' if cfg.fill_symbol else False,
- 'color': False,
- 'stroke': ['black', cfg.symbol_stroke],
- 'common-fill': 'white' if cfg.fill_symbol else False,
- 'common-color': False,
- 'common-stroke': ['white', cfg.symbol_stroke],
- 'scale-factor': 1
+ 'rarity': rare,
+ 'stroke': ['black', cfg.symbol_stroke] if rare else ['white', cfg.symbol_stroke],
+ 'scale': 1
+ }]
+ if isinstance(symbol, dict):
+ ref = symbol.get('char', 'X')
+ return ref, [{
+ 'char': ref,
+ 'rarity': bool(symbol.get('rarity', True) and rare),
+ 'fill': symbol.get('fill', False) if rare else symbol.get('common-fill', False),
+ 'color': symbol.get('color', False) if rare else symbol.get('common-color', False),
+ 'stroke': symbol.get(
+ 'stroke', ['black', cfg.symbol_stroke]
+ ) if rare else symbol.get(
+ 'common-stroke', ['white', cfg.symbol_stroke]
+ ),
+ 'scale': symbol.get('scale', 1)
}]
if isinstance(symbol, list):
- ref = symbol[0]['char']
+ ref = symbol[0].get('char', 'X')
+ syms = []
for sym in symbol:
- sym['rarity'] = sym.get('rarity', True)
- sym['fill'] = sym.get('fill', False)
- sym['color'] = sym.get('color', False)
- sym['stroke'] = sym.get('stroke', ['black', cfg.symbol_stroke])
- sym['common-fill'] = sym.get('common-fill', False)
- sym['common-color'] = sym.get('common-color', False)
- sym['common-stroke'] = sym.get('common-stroke', ['white', cfg.symbol_stroke])
- sym['scale-factor'] = sym.get('scale-factor', 1)
+ syms.append({
+ 'char': sym.get('char', 'X'),
+ 'rarity': bool(sym.get('rarity', True) and rare),
+ 'fill': sym.get('fill', False) if rare else sym.get('common-fill', False),
+ 'color': sym.get('color', False) if rare else sym.get('common-color', False),
+ 'stroke': sym.get(
+ 'stroke', ['black', cfg.symbol_stroke]
+ ) if rare else sym.get(
+ 'common-stroke', ['white', cfg.symbol_stroke]
+ ),
+ 'scale': sym.get('scale', 1)
+ })
if sym.get('reference', False):
- ref = sym['char']
- return ref, symbol
+ sym.get('char', 'X')
+ return ref, syms
return
diff --git a/proxyshop/gui/console.py b/src/gui/console.py
similarity index 90%
rename from proxyshop/gui/console.py
rename to src/gui/console.py
index ed0cb107..22cd9c00 100644
--- a/proxyshop/gui/console.py
+++ b/src/gui/console.py
@@ -15,9 +15,9 @@
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
-from proxyshop.constants import con
-from proxyshop.gui.updater import UpdatePopup
-from proxyshop.settings import cfg, Singleton
+from src.constants import con
+from src.gui.updater import UpdatePopup
+from src.settings import cfg, Singleton
class Console(BoxLayout):
@@ -25,7 +25,7 @@ class Console(BoxLayout):
Main console class
"""
__metaclass__ = Singleton
- Builder.load_file(os.path.join(con.cwd, "proxyshop/kv/console.kv"))
+ Builder.load_file(os.path.join(con.cwd, "src/kv/console.kv"))
lines = 1
def __init__(self, **kwargs):
@@ -54,16 +54,16 @@ def update(self, msg="", e=None, end="\n"):
def log_error(self, msg, card, template=None, e=None):
"""
- Log failed card in tmp
+ Log failed card in a log file.
Then prompt error request
"""
cur_time = dt.now().strftime("%m/%d/%Y %H:%M")
log_text = f"{card} ({template}) [{cur_time}]\n" if template else f"{card} [{cur_time}]\n"
- with open(os.path.join(con.cwd, "tmp/failed.txt"), "a", encoding="utf-8") as log:
+ with open(os.path.join(con.path_logs, "failed.txt"), "a", encoding="utf-8") as log:
log.write(log_text)
return self.error(msg, e)
- def error(self, msg, e=None, color=True, continue_msg="Continue to next card?"):
+ def error(self, msg, e=None, continue_msg="Continue to next card?"):
"""
Display error, wait for user to cancel or continue.
"""
@@ -78,11 +78,9 @@ def error(self, msg, e=None, color=True, continue_msg="Continue to next card?"):
if cfg.dev_mode:
return False
- # Color message?
- if color:
- msg = f"[color=#a84747]{msg}[/color]\n"
+ # Automatically skip to next card?
if cfg.skip_failed:
- continue_msg = "Skipping this card!!"
+ continue_msg = "Skipping this card!"
# Notify user
self.update(f"{msg}{continue_msg}")
@@ -139,7 +137,7 @@ def end_await(self):
self.ids.cancel_btn.disabled = True
@staticmethod
- def log_exception(error: Union[Exception, str], log_file: str = "tmp/error.txt"):
+ def log_exception(error: Union[Exception, str], log_file: str = "error.txt"):
"""
Log python exception.
"""
@@ -153,7 +151,7 @@ def log_exception(error: Union[Exception, str], log_file: str = "tmp/error.txt")
# Add to log file
cur_time = dt.now().strftime("%m/%d/%Y %H:%M")
- with open(os.path.join(con.cwd, log_file), "a", encoding="utf-8") as log:
+ with open(os.path.join(con.path_logs, log_file), "a", encoding="utf-8") as log:
log.write("============================================================================\n")
log.write(f"> {cur_time}\n")
log.write("============================================================================\n")
diff --git a/proxyshop/gui/creator.py b/src/gui/creator.py
similarity index 97%
rename from proxyshop/gui/creator.py
rename to src/gui/creator.py
index f6254c67..77388783 100644
--- a/proxyshop/gui/creator.py
+++ b/src/gui/creator.py
@@ -11,9 +11,9 @@
from kivy.uix.tabbedpanel import TabbedPanelItem, TabbedPanel
from kivy.uix.textinput import TextInput
-from proxyshop.constants import con
-from proxyshop.core import TemplateDetails, get_templates, get_my_templates
-from proxyshop.settings import cfg
+from src.constants import con
+from src.core import TemplateDetails, get_templates, get_my_templates
+from src.settings import cfg
"""
DISPLAY ELEMENTS
@@ -21,7 +21,7 @@
class CreatorPanels(TabbedPanel):
- Builder.load_file(os.path.join(con.cwd, "proxyshop/kv/creator.kv"))
+ Builder.load_file(os.path.join(con.cwd, "src/kv/creator.kv"))
def __init__(self, **kwargs):
super().__init__(**kwargs)
diff --git a/proxyshop/gui/dev.py b/src/gui/dev.py
similarity index 90%
rename from proxyshop/gui/dev.py
rename to src/gui/dev.py
index 5e292c18..52e4c4a2 100644
--- a/proxyshop/gui/dev.py
+++ b/src/gui/dev.py
@@ -10,16 +10,16 @@
from kivy.uix.popup import Popup
from kivy.uix.label import Label
-from proxyshop.constants import con
-from proxyshop.core import get_templates, TemplateDetails
-from proxyshop.gui.utils import HoverButton
+from src.constants import con
+from src.core import get_templates, TemplateDetails
+from src.gui.utils import HoverButton
class TestApp(BoxLayout):
"""
Template Tester
"""
- Builder.load_file(os.path.join(con.cwd, "proxyshop/kv/dev.kv"))
+ Builder.load_file(os.path.join(con.cwd, "src/kv/dev.kv"))
def __init__(self, **kwargs):
super().__init__(**kwargs)
diff --git a/proxyshop/gui/settings.py b/src/gui/settings.py
similarity index 65%
rename from proxyshop/gui/settings.py
rename to src/gui/settings.py
index 76b3c82b..da36d8fd 100644
--- a/proxyshop/gui/settings.py
+++ b/src/gui/settings.py
@@ -2,12 +2,9 @@
KIVY SETTINGS POPUPS
"""
import os.path as osp
-import json
-import shutil
from pathlib import Path
from typing import Optional
from kivy.config import ConfigParser
-import configparser
from kivy.core.window import Window
from kivy.metrics import dp
@@ -20,9 +17,9 @@
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.widget import Widget
-from proxyshop.core import TemplateDetails
-from proxyshop.constants import con
-
+from src.core import TemplateDetails
+from src.constants import con
+from src.utils.files import verify_config_fields, get_valid_config_json
"""
AESTHETIC CLASSES
@@ -30,6 +27,9 @@
class FormattedSettingString(SettingString):
+ """
+ Create custom SettingString class to allow Markup in title.
+ """
def _create_popup(self, instance):
# create popup layout
content = BoxLayout(orientation='vertical', spacing='5dp')
@@ -67,6 +67,9 @@ def _create_popup(self, instance):
class FormattedSettingNumeric(SettingNumeric):
+ """
+ Create custom SettingNumeric class to allow Markup in title.
+ """
def _create_popup(self, instance):
# create popup layout
content = BoxLayout(orientation='vertical', spacing='5dp')
@@ -104,6 +107,9 @@ def _create_popup(self, instance):
class FormattedSettingOptions(SettingOptions):
+ """
+ Create custom SettingOptions class to allow Markup in title.
+ """
def _create_popup(self, instance):
# create the popup
content = BoxLayout(orientation='vertical', spacing='5dp')
@@ -141,91 +147,57 @@ def _create_popup(self, instance):
class SettingsPopup(ModalView):
@property
- def app_ini(self) -> str:
+ def path_ini(self) -> Optional:
+ # Template INI config path
+ if self.template and self.template.get('config_path'):
+ return self.template.get('config_path', '').replace('json', 'ini')
return osp.join(con.cwd, "config.ini")
@property
- def app_json(self) -> str:
- return osp.join(con.cwd, "proxyshop/app_settings.json")
+ def path_template_json(self) -> Optional[str]:
+ # Template JSON config path
+ if self.template and osp.exists(self.template.get('config_path')):
+ return self.template.get('config_path')
+ return
def __init__(self, template: Optional[TemplateDetails] = None, **kwargs):
super().__init__(**kwargs)
+ self.template = template
- # Create ini if one doesn't exist
- if template:
- self.create_config(template)
- custom_json = self.update_config(template['config_path']) if osp.exists(template['config_path']) else None
- else:
- self.path_ini = self.app_ini
- custom_json = None
-
- app_config = ConfigParser(allow_no_value=True)
- app_config.optionxform = str
- app_config.read(self.path_ini)
-
+ # Configure settings panel
s = Settings()
s.bind(on_close=self.dismiss)
s.register_type('options', FormattedSettingOptions)
s.register_type('string', FormattedSettingString)
s.register_type('numeric', FormattedSettingNumeric)
- if custom_json:
- s.add_json_panel(f"{template['name']} Template", app_config, data=custom_json)
- s.add_json_panel('App Settings', app_config, 'proxyshop/app_settings.json')
+
+ # Load ini file
+ self.verify_ini_file()
+ app_config = ConfigParser(allow_no_value=True)
+ app_config.optionxform = str
+ app_config.read(self.path_ini)
+
+ # Load JSON settings into panel
+ if self.path_template_json:
+ s.add_json_panel(
+ f"{template['name']} Template", app_config,
+ data=get_valid_config_json(self.path_template_json)
+ )
+ s.add_json_panel(
+ 'App Settings', app_config,
+ data=get_valid_config_json(con.path_config_json)
+ )
self.add_widget(s)
- def create_config(self, template: TemplateDetails):
+ def verify_ini_file(self):
"""
- Check this template's ini exists, if it doesn't create one.
- @param template:
- @return:
+ Verify that the ini file for the app/template contains necessary fields outlined in JSON.
"""
- self.path_ini = template['config_path'].replace('json', 'ini')
- if not osp.exists(self.path_ini):
- Path(osp.dirname(self.path_ini)).mkdir(mode=511, parents=True, exist_ok=True)
- shutil.copyfile('config.ini', self.path_ini)
-
- def update_config(self, json_path) -> str:
- # Load the json
- changed = False
- with open(json_path, "r", encoding="utf-8") as f:
- raw = json.load(f)
-
- # Load the config
- conf_file = configparser.ConfigParser(allow_no_value=True)
- conf_file.optionxform = str
- with open(self.path_ini, "r", encoding="utf-8") as f:
- conf_file.read_file(f)
-
- # Build a dictionary of the necessary values
- data = {}
- for row in raw:
- if row['type'] == 'title':
- continue
- if row['section'] not in data:
- data[row['section']] = []
- data[row['section']].append({
- 'key': row['key'],
- 'value': row['default'] if 'default' in row else 0
- })
- if 'default' in row:
- row.pop('default')
-
- # Build the sections and rows into the ini
- for section, settings in data.items():
- # Check if the section exists
- if not conf_file.has_section(section):
- conf_file.add_section(section)
- changed = True
- # Check if each setting exists
- for setting in settings:
- if not conf_file.has_option(section, setting['key']):
- conf_file.set(section, setting['key'], str(setting['value']))
- changed = True
-
- # If ini has changed, write changes
- if changed:
- with open(self.path_ini, "w", encoding="utf-8") as f:
- conf_file.write(f)
-
- # Return json data
- return json.dumps(raw)
+ # Ensure folder exists
+ Path(osp.dirname(self.path_ini)).mkdir(mode=511, parents=True, exist_ok=True)
+
+ # Ensure app fields exist
+ verify_config_fields(self.path_ini, con.path_config_json)
+ if self.path_template_json:
+ # Ensure template fields exist
+ verify_config_fields(self.path_ini, self.path_template_json)
diff --git a/proxyshop/gui/updater.py b/src/gui/updater.py
similarity index 83%
rename from proxyshop/gui/updater.py
rename to src/gui/updater.py
index 6ff073d4..2905c9c9 100644
--- a/proxyshop/gui/updater.py
+++ b/src/gui/updater.py
@@ -10,15 +10,16 @@
from kivy.uix.label import Label
import asynckivy as ak
-from proxyshop.constants import con
-from proxyshop.core import check_for_updates, update_template
+from src.constants import con
+from src.core import check_for_updates, update_template
+from src.utils.strings import msg_success, msg_error
class UpdatePopup(Popup):
"""
Popup modal for updating templates.
"""
- Builder.load_file(os.path.join(con.cwd, "proxyshop/kv/updater.kv"))
+ Builder.load_file(os.path.join(con.cwd, "src/kv/updater.kv"))
loading = True
updates = {}
categories = {}
@@ -34,8 +35,8 @@ async def populate_updates(self):
"""
Load the list of updates available.
"""
- # Binary tracker for alternating color
- chk = 0
+ # Track current background color
+ bg_color = "#181818"
# Remove loading screen
if self.loading:
@@ -49,8 +50,7 @@ async def populate_updates(self):
# Loop through updates within this category
for i, temp in enumerate(temps):
# Alternate table item color
- if chk == 0: chk, bg_color = 1, "#101010"
- else: chk, bg_color = 0, "#181818"
+ bg_color = "#101010" if bg_color == "#181818" else "#181818"
self.entries[temp['id']] = UpdateEntry(self, temp, bg_color)
self.ids.container.add_widget(self.entries[temp['id']])
@@ -62,11 +62,10 @@ async def populate_updates(self):
class UpdateEntry(BoxLayout):
def __init__(self, parent: Popup, temp: dict, bg_color: str, **kwargs):
- if temp['plugin']: plugin = f" [size=18]({temp['plugin']})[/size]"
- else: plugin = ""
+ plugin = f" [size=18]({temp['plugin']})[/size]" if temp.get('plugin') else ""
self.bg_color = bg_color
self.name = f"{temp['type']} - {temp['name']}{plugin}"
- self.status = f"[color=#59d461]{temp['version_new']}[/color]"
+ self.status = msg_success(temp['version_new'])
self.data = temp
self.root = parent
super().__init__(**kwargs)
@@ -86,7 +85,7 @@ async def download_update(self, download: BoxLayout) -> None:
self.root.ids.container.remove_widget(self.root.entries[self.data['id']])
else:
download.clear_widgets()
- download.add_widget(Label(text="[color=#a84747]FAILED[/color]", markup=True))
+ download.add_widget(Label(text=msg_error("FAILED"), markup=True))
async def mark_updated(self):
self.root.ids.container.remove_widget(self.root.entries[self.data['id']])
diff --git a/proxyshop/gui/utils.py b/src/gui/utils.py
similarity index 88%
rename from proxyshop/gui/utils.py
rename to src/gui/utils.py
index 380ac1b2..52e37ae9 100644
--- a/proxyshop/gui/utils.py
+++ b/src/gui/utils.py
@@ -5,9 +5,13 @@
from kivy.core.text import LabelBase
from kivy.core.window import Window
from kivy.properties import BooleanProperty, ObjectProperty
+from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
+from kivy.uix.togglebutton import ToggleButton
from kivy.utils import get_color_from_hex
+from src.core import card_types
+
"""
UTILITY FUNCTIONS
"""
@@ -138,3 +142,18 @@ def on_leave(self):
Window.set_system_cursor('arrow')
self.text = self.org_text
self.background_color = self.org_color
+
+
+"""
+RESOURCES
+"""
+
+
+class GUIResources:
+ def __init__(self):
+ self.template_row: dict[str, [str, BoxLayout]] = {k: {} for k in card_types}
+ self.template_btn: dict[str, [str, ToggleButton]] = {k: {} for k in card_types}
+ self.template_btn_cfg: dict[str, [str, Button]] = {k: {} for k in card_types}
+
+
+GUI = GUIResources()
diff --git a/proxyshop/helpers.py b/src/helpers.py
similarity index 67%
rename from proxyshop/helpers.py
rename to src/helpers.py
index 29d757de..bf44f770 100644
--- a/proxyshop/helpers.py
+++ b/src/helpers.py
@@ -4,43 +4,31 @@
from typing import Optional, Union
import os
-import photoshop.api as ps
-from photoshop.api import PhotoshopPythonAPIError, SolidColor
+from photoshop.api import (
+ PhotoshopPythonAPIError, SolidColor, Application, DialogModes, Units, ActionDescriptor,
+ ColorModel, RasterizeType, ElementPlacement, ActionReference, LayerKind, BlendMode,
+ AnchorPosition, SaveOptions, ActionList, PNGSaveOptions, JPEGSaveOptions, PhotoshopSaveOptions
+)
from photoshop.api._artlayer import ArtLayer
from photoshop.api._layerSet import LayerSet
-from proxyshop.constants import con
-from proxyshop.scryfall import card_scan
-from proxyshop.settings import cfg
+from src.constants import con
+from src.scryfall import card_scan
+from src.settings import cfg
+from src.utils.enums_photoshop import Alignment, Stroke
+from src.utils.strings import ps_version_check
+from src.utils.types_photoshop import EffectStroke, EffectDropShadow, EffectGradientOverlay, LayerEffects, \
+ EffectColorOverlay
# QOL Definitions
-app = ps.Application()
+app = Application()
sID = app.stringIDToTypeID
cID = app.charIDToTypeID
-NO_DIALOG = ps.DialogModes.DisplayNoDialogs
+NO_DIALOG = DialogModes.DisplayNoDialogs
# Ensure scaling with pixels, font size with points
-app.preferences.rulerUnits = ps.Units.Pixels
-app.preferences.typeUnits = ps.Units.Points
-
-
-"""
-SYSTEM FUNCTIONS
-"""
-
-
-def check_fonts(fonts: list) -> list:
- """
- Check if given fonts exist in users Photoshop Application.
- @return: Array of missing fonts or None
- """
- missing = []
- for f in fonts:
- try:
- assert isinstance(app.fonts.getByName(f).name, str)
- except AssertionError:
- missing.append(f)
- return missing
+app.preferences.rulerUnits = Units.Pixels
+app.preferences.typeUnits = Units.Points
"""
@@ -56,36 +44,30 @@ def getLayer(name: str, group: Optional[Union[str, list, tuple, LayerSet]] = Non
@return: Layer object requested
"""
try:
- layer_set = None
- if group is None:
- # No LayerSet given
- for layer in app.activeDocument.layers:
- if layer.name == name:
- return layer
- elif isinstance(group, str):
+ # Was LayerSet provided?
+ if isinstance(group, str):
# LayerSet name given
- layer_set = app.activeDocument.layerSets.getByName(group)
+ return app.activeDocument.layerSets.getByName(group).layers.getByName(name)
+ elif isinstance(group, LayerSet):
+ # LayerSet object given
+ return group.layers.getByName(name)
elif isinstance(group, (tuple, list)):
- # List of layerSet names/objects given
+ # Tuple or list of LayerSets
+ layer_set = app.activeDocument
for g in group:
- # First in list or not?
- if not layer_set:
- if isinstance(g, str):
- layer_set = app.activeDocument.layerSets.getByName(g)
- else:
- layer_set = g
- else:
+ if isinstance(g, str):
+ # LayerSet name given
layer_set = layer_set.layerSets.getByName(g)
- else:
- # Else, assume layerSet object given
- layer_set = group
-
- # Find our layer
- for layer in layer_set.layers:
- if layer.name == name:
- return layer
+ elif isinstance(g, LayerSet):
+ # LayerSet object given
+ layer_set = g
+ return layer_set.layers.getByName(name)
+ # Valid LayerSet not given
+ return app.activeDocument.layers.getByName(name)
except (PhotoshopPythonAPIError, AttributeError, TypeError):
print(f'\nLayer "{name}" could not be found!')
+ if group:
+ print(f"LayerSet reference used: {group}")
return
@@ -97,30 +79,33 @@ def getLayerSet(name: str, group: Optional[Union[str, list, tuple, LayerSet]] =
@return: Group object requested.
"""
try:
- if group:
- layer_set = None
- if isinstance(group, str):
- # Set name given
- layer_set = app.activeDocument.layerSets.getByName(group)
- return layer_set.layerSets.getByName(name)
- elif isinstance(group, (tuple, list)):
- # Tuple or list of groups
- for g in group:
- # First in the list
- if not layer_set:
- if isinstance(g, str):
- layer_set = app.activeDocument.layerSets.getByName(g)
- else:
- layer_set = g
- else:
- layer_set = layer_set.layerSets.getByName(g)
- return layer_set.layerSets.getByName(name)
- # Set object given
+ # Was LayerSet provided?
+ if not group:
+ # No LayerSet given
+ return app.activeDocument.layerSets.getByName(name)
+ if isinstance(group, str):
+ # LayerSet name given
+ return app.activeDocument.layerSets.getByName(group).layerSets.getByName(name)
+ elif isinstance(group, (tuple, list)):
+ # Tuple or list of groups
+ layer_set = app.activeDocument
+ for g in group:
+ if isinstance(g, str):
+ # LayerSet name given
+ layer_set = layer_set.layerSets.getByName(g)
+ elif isinstance(g, LayerSet):
+ # LayerSet object given
+ layer_set = g
+ return layer_set.layerSets.getByName(name)
+ elif isinstance(group, LayerSet):
+ # LayerSet object given
return group.layerSets.getByName(name)
- # Look through entire document
- return app.activeDocument.layerSets.getByName(name)
+ # LayerSet can't be located
+ raise PhotoshopPythonAPIError(f"LayerSet given invalid: {group}")
except (PhotoshopPythonAPIError, AttributeError, TypeError):
- print(f'\nLayerSet "{name}" could not be found!')
+ print(f'LayerSet "{name}" could not be found!')
+ if group:
+ print(f"LayerSet reference used: {group}")
return
@@ -129,43 +114,43 @@ def getLayerSet(name: str, group: Optional[Union[str, list, tuple, LayerSet]] =
"""
-def rgb_black() -> ps.SolidColor:
+def rgb_black() -> SolidColor:
"""
Creates a black SolidColor object.
@return: SolidColor object
"""
- color = ps.SolidColor()
+ color = SolidColor()
color.rgb.red = 0
color.rgb.green = 0
color.rgb.blue = 0
return color
-def rgb_grey() -> ps.SolidColor:
+def rgb_grey() -> SolidColor:
"""
Creates a grey SolidColor object.
@return: SolidColor object.
"""
- color = ps.SolidColor()
+ color = SolidColor()
color.rgb.red = 170
color.rgb.green = 170
color.rgb.blue = 170
return color
-def rgb_white() -> ps.SolidColor:
+def rgb_white() -> SolidColor:
"""
Creates a white SolidColor object.
@return: SolidColor object.
"""
- color = ps.SolidColor()
+ color = SolidColor()
color.rgb.red = 255
color.rgb.green = 255
color.rgb.blue = 255
return color
-def get_rgb(r: int, g: int, b: int) -> ps.SolidColor:
+def get_rgb(r: int, g: int, b: int) -> SolidColor:
"""
Creates a SolidColor object with the given RGB values.
@param r: Integer from 0 to 255 for red spectrum.
@@ -173,14 +158,14 @@ def get_rgb(r: int, g: int, b: int) -> ps.SolidColor:
@param b: Integer from 0 to 255 for blue spectrum.
@return: SolidColor object.
"""
- color = ps.SolidColor()
+ color = SolidColor()
color.rgb.red = r
color.rgb.green = g
color.rgb.blue = b
return color
-def get_cmyk(c: float, m: float, y: float, k: float) -> ps.SolidColor:
+def get_cmyk(c: float, m: float, y: float, k: float) -> SolidColor:
"""
Creates a SolidColor object with the given CMYK values.
@param c: Float from 0.0 to 100.0 for Cyan component.
@@ -189,7 +174,7 @@ def get_cmyk(c: float, m: float, y: float, k: float) -> ps.SolidColor:
@param k: Float from 0.0 to 100.0 for blacK component.
@return: SolidColor object.
"""
- color = ps.SolidColor()
+ color = SolidColor()
color.cmyk.cyan = c
color.cmyk.magenta = m
color.cmyk.yellow = y
@@ -197,7 +182,7 @@ def get_cmyk(c: float, m: float, y: float, k: float) -> ps.SolidColor:
return color
-def get_color(color: Union[list[int], str, dict]) -> ps.SolidColor:
+def get_color(color: Union[SolidColor, list[int], str, dict]) -> SolidColor:
"""
Automatically get either cmyk or rgb color given a range of
@param color: Array containing 3 (RGB) or 4 (CMYK) numbers between 0 and 255, or the name of a known color.
@@ -232,26 +217,26 @@ def get_color(color: Union[list[int], str, dict]) -> ps.SolidColor:
raise ValueError(f"Unrecognized color notation given: {color}")
-def apply_rgb(action: ps.ActionDescriptor, color: ps.SolidColor) -> None:
+def apply_rgb(action: ActionDescriptor, color: SolidColor) -> None:
"""
Apply RGB SolidColor object to action descriptor.
@param action: ActionDescriptor object.
@param color: SolidColor object matching RGB model.
"""
- ad = ps.ActionDescriptor()
+ ad = ActionDescriptor()
ad.putDouble(sID("red"), color.rgb.red)
ad.putDouble(sID("green"), color.rgb.green)
ad.putDouble(sID("blue"), color.rgb.blue)
action.putObject(sID("color"), sID("RGBColor"), ad)
-def apply_cmyk(action: ps.ActionDescriptor, color: ps.SolidColor) -> None:
+def apply_cmyk(action: ActionDescriptor, color: SolidColor) -> None:
"""
Apply CMYK SolidColor object to action descriptor.
@param action: ActionDescriptor object.
@param color: SolidColor object matching CMYK model.
"""
- ad = ps.ActionDescriptor()
+ ad = ActionDescriptor()
ad.putDouble(cID("Cyn "), color.cmyk.cyan)
ad.putDouble(cID("Mgnt"), color.cmyk.magenta)
ad.putDouble(cID("Ylw "), color.cmyk.yellow)
@@ -259,15 +244,15 @@ def apply_cmyk(action: ps.ActionDescriptor, color: ps.SolidColor) -> None:
action.putObject(cID("Clr "), cID("CMYC"), ad)
-def apply_color(action: ps.ActionDescriptor, color: ps.SolidColor) -> None:
+def apply_color(action: ActionDescriptor, color: SolidColor) -> None:
"""
Applies color to the specified action descriptor.
@param action: ActionDescriptor object.
@param color: CMYK or RGB SolidColor object.
"""
- if color.model == ps.ColorModel.RGBModel:
+ if color.model == ColorModel.RGBModel:
apply_rgb(action, color)
- elif color.model == ps.ColorModel.CMYKModel:
+ elif color.model == ColorModel.CMYKModel:
apply_cmyk(action, color)
else:
raise ValueError(f"Received unsupported color object: {color}")
@@ -331,8 +316,8 @@ def get_text_layer_bounds(layer: ArtLayer, legacy: bool = False) -> dict[str: Un
@return: Array of the bounds of the given layer.
"""
if int(app.version[0:2]) < 21 or legacy:
- layer_copy = layer.duplicate(app.activeDocument, ps.ElementPlacement.PlaceInside)
- layer_copy.rasterize(ps.RasterizeType.TextContents)
+ layer_copy = layer.duplicate(app.activeDocument, ElementPlacement.PlaceInside)
+ layer_copy.rasterize(RasterizeType.TextContents)
layer_bounds = layer.bounds
layer_copy.remove()
return layer_bounds
@@ -348,22 +333,22 @@ def get_text_layer_dimensions(layer, legacy: bool = False) -> dict[str: Union[in
@return: Dict containing height and width of the given layer.
"""
if int(app.version[0:2]) < 21 or legacy:
- layer_copy = layer.duplicate(app.activeDocument, ps.ElementPlacement.PlaceInside)
- layer_copy.rasterize(ps.RasterizeType.TextContents)
+ layer_copy = layer.duplicate(app.activeDocument, ElementPlacement.PlaceInside)
+ layer_copy.rasterize(RasterizeType.TextContents)
dimensions = get_layer_dimensions(layer_copy)
layer_copy.remove()
return dimensions
return get_layer_dimensions(layer)
-def get_text_layer_color(layer: ArtLayer) -> ps.SolidColor:
+def get_text_layer_color(layer: ArtLayer) -> SolidColor:
"""
Occasionally, Photoshop has issues with retrieving the color of a text layer. This helper guards
against errors and null values by defaulting to rgb_black() in the event of a problem.
@param layer: Layer object that must be TextLayer
@return: SolidColor object representing the color of the text item.
"""
- if isinstance(layer, ArtLayer) and layer.kind == ps.LayerKind.TextLayer:
+ if isinstance(layer, ArtLayer) and layer.kind == LayerKind.TextLayer:
if hasattr(layer.textItem, 'color'):
return layer.textItem.color
print(f"Couldn't retrieve color of layer: {layer.name}")
@@ -383,7 +368,7 @@ def get_text_scale_factor(layer: Optional[ArtLayer] = None, axis: str = "xx") ->
# Get the scale factor if not 1
factor = 1
- ref = ps.ActionReference()
+ ref = ActionReference()
ref.putEnumerated(cID("Lyr "), cID("Ordn"), cID("Trgt"))
desc = app.executeActionGet(ref).getObjectValue(sID('textKey'))
if desc.hasKey(sID('transform')):
@@ -403,15 +388,15 @@ def set_text_size(size: int, layer: Optional[ArtLayer] = None) -> None:
app.activeDocument.activeLayer = layer
# Set the new size
- desc2361 = ps.ActionDescriptor()
- ref68 = ps.ActionReference()
- desc2362 = ps.ActionDescriptor()
+ desc2361 = ActionDescriptor()
+ ref68 = ActionReference()
+ desc2362 = ActionDescriptor()
ref68.putProperty(sID("property"), sID("textStyle"))
ref68.putEnumerated(sID("textLayer"), sID("ordinal"), sID("targetEnum"))
desc2361.putReference(sID("target"), ref68)
desc2362.putInteger(sID("textOverrideFeatureName"), 808465458)
desc2362.putInteger(sID("typeStyleOperationType"), 3)
- desc2362.PutUnitDouble(sID("size"), sID("pointsUnit"), size)
+ desc2362.putUnitDouble(sID("size"), sID("pointsUnit"), size)
desc2361.putObject(sID("to"), sID("textStyle"), desc2362)
app.ExecuteAction(sID("set"), desc2361, NO_DIALOG)
@@ -452,20 +437,20 @@ def select_layer(
@param make_visible: Make the layer visible if not currently visible?
Doesn't work with adding layers to selection.
"""
- desc1 = ps.ActionDescriptor()
- ref1 = ps.ActionReference()
- ref1.PutIdentifier(sID("layer"), layer.id)
- desc1.PutReference(sID("target"), ref1)
+ desc1 = ActionDescriptor()
+ ref1 = ActionReference()
+ ref1.putIdentifier(sID("layer"), layer.id)
+ desc1.putReference(sID("target"), ref1)
# Add to currently selected layers?
if add:
- desc1.PutEnumerated(
+ desc1.putEnumerated(
sID('selectionModifier'),
sID('selectionModifierType'),
sID('addToSelection')
)
# Force visible?
- desc1.PutBoolean(sID("makeVisible"), make_visible)
- app.executeAction(sID('select'), desc1, ps.DialogModes.DisplayNoDialogs)
+ desc1.putBoolean(sID("makeVisible"), make_visible)
+ app.executeAction(sID('select'), desc1, DialogModes.DisplayNoDialogs)
def select_layers(layers: list[ArtLayer, LayerSet]):
@@ -483,8 +468,8 @@ def select_no_layers() -> None:
"""
Deselect all layers.
"""
- selectNone = ps.ActionDescriptor()
- ref = ps.ActionReference()
+ selectNone = ActionDescriptor()
+ ref = ActionReference()
ref.putEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
selectNone.putReference(cID("null"), ref)
app.executeAction(sID("selectNoLayers"), selectNone, NO_DIALOG)
@@ -502,7 +487,7 @@ def merge_layers(layers: list[ArtLayer] = None, name: Optional[str] = None) -> A
select_layers(layers)
# Merge layers and return result
- app.ExecuteAction(sID("mergeLayersNew"), ps.ActionDescriptor(), NO_DIALOG)
+ app.ExecuteAction(sID("mergeLayersNew"), ActionDescriptor(), NO_DIALOG)
if name:
app.activeDocument.activeLayer.name = name
return app.activeDocument.activeLayer
@@ -523,20 +508,20 @@ def group_layers(
select_layers(layers)
# Group the layers
- desc1 = ps.ActionDescriptor()
- ref1 = ps.ActionReference()
- ref2 = ps.ActionReference()
+ desc1 = ActionDescriptor()
+ ref1 = ActionReference()
+ ref2 = ActionReference()
ref1.putClass(sID("layerSection"))
desc1.putReference(sID('null'), ref1)
ref2.putEnumerated(cID('Lyr '), cID('Ordn'), cID('Trgt'))
desc1.putReference(cID('From'), ref2)
- desc2 = ps.ActionDescriptor()
+ desc2 = ActionDescriptor()
desc2.putString(cID('Nm '), name)
desc1.putObject(cID('Usng'), sID("layerSection"), desc2)
desc1.putInteger(sID("layerSectionStart"), 0)
desc1.putInteger(sID("layerSectionEnd"), 1)
desc1.putString(cID('Nm '), name)
- app.executeAction(cID('Mk '), desc1, ps.DialogModes.DisplayNoDialogs)
+ app.executeAction(cID('Mk '), desc1, DialogModes.DisplayNoDialogs)
return app.activeDocument.activeLayer
@@ -549,17 +534,17 @@ def copy_layer_mask(
@param layer_from: Layer to copy from.
@param layer_to: Layer to copy to.
"""
- desc255 = ps.ActionDescriptor()
- ref17 = ps.ActionReference()
- ref18 = ps.ActionReference()
- desc255.PutClass(sID("new"), sID("channel"))
- ref17.PutEnumerated(sID("channel"), sID("channel"), sID("mask"))
- ref17.PutIdentifier(sID("layer"), layer_to.id)
- desc255.PutReference(sID("at"), ref17)
- ref18.PutEnumerated(sID("channel"), sID("channel"), sID("mask"))
- ref18.PutIdentifier(sID("layer"), layer_from.id)
- desc255.PutReference(sID("using"), ref18)
- app.ExecuteAction(sID("make"), desc255, ps.DialogModes.DisplayNoDialogs)
+ desc255 = ActionDescriptor()
+ ref17 = ActionReference()
+ ref18 = ActionReference()
+ desc255.putClass(sID("new"), sID("channel"))
+ ref17.putEnumerated(sID("channel"), sID("channel"), sID("mask"))
+ ref17.putIdentifier(sID("layer"), layer_to.id)
+ desc255.putReference(sID("at"), ref17)
+ ref18.putEnumerated(sID("channel"), sID("channel"), sID("mask"))
+ ref18.putIdentifier(sID("layer"), layer_from.id)
+ desc255.putReference(sID("using"), ref18)
+ app.ExecuteAction(sID("make"), desc255, DialogModes.DisplayNoDialogs)
def duplicate_group(name: str):
@@ -568,13 +553,13 @@ def duplicate_group(name: str):
@param name: Name to give the newly created layer set.
@return: The newly created layer set object.
"""
- desc241 = ps.ActionDescriptor()
- ref4 = ps.ActionReference()
- ref4.PutEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
- desc241.PutReference(sID("target"), ref4)
- desc241.PutString(sID("name"), name)
- desc241.PutInteger(sID("version"), 5)
- app.ExecuteAction(sID("duplicate"), desc241, ps.DialogModes.DisplayNoDialogs)
+ desc241 = ActionDescriptor()
+ ref4 = ActionReference()
+ ref4.putEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
+ desc241.putReference(sID("target"), ref4)
+ desc241.putString(sID("name"), name)
+ desc241.putInteger(sID("version"), 5)
+ app.ExecuteAction(sID("duplicate"), desc241, DialogModes.DisplayNoDialogs)
return app.activeDocument.activeLayer
@@ -584,17 +569,12 @@ def create_new_layer(layer_name: Optional[str] = None) -> ArtLayer:
@param layer_name: Optional name for the new layer
@return: Newly created layer object
"""
- if layer_name is None:
- layer_name = "Layer"
-
# Create new layer at top of layers
active_layer = app.activeDocument.activeLayer
- layer = app.activeDocument.artLayers.add()
+ layer = app.activeDocument.artLayers.add(layer_name=layer_name or "Layer")
# Name it & set blend mode to normal
- layer.name = layer_name
- layer.blendMode = ps.BlendMode.NormalBlend
- layer.visible = True
+ layer.blendMode = BlendMode.NormalBlend
# Move the layer below
layer.moveAfter(active_layer)
@@ -610,7 +590,7 @@ def smart_layer(layer: Union[ArtLayer, LayerSet] = None) -> ArtLayer:
"""
if layer:
app.activeDocument.activeLayer = layer
- app.ExecuteAction(sID("newPlacedLayer"), None, ps.DialogModes.DisplayNoDialogs)
+ app.ExecuteAction(sID("newPlacedLayer"), None, DialogModes.DisplayNoDialogs)
return app.activeDocument.activeLayer
@@ -620,11 +600,11 @@ def lock_layer(layer: Union[ArtLayer, LayerSet], protection: str = "protectAll")
@param layer: The layer to lock.
@param protection: protectAll to lock, protectNone to unlock
"""
- desc819 = ps.ActionDescriptor()
- ref378 = ps.ActionReference()
+ desc819 = ActionDescriptor()
+ ref378 = ActionReference()
ref378.putIdentifier(cID("Lyr "), layer.id)
desc819.putReference(cID("null"), ref378)
- desc820 = ps.ActionDescriptor()
+ desc820 = ActionDescriptor()
desc820.putBoolean(sID(protection), True)
idlayerLocking = sID("layerLocking")
desc819.putObject(idlayerLocking, idlayerLocking, desc820)
@@ -664,9 +644,9 @@ def select_layer_pixels(layer: Optional[ArtLayer]) -> None:
@param layer: Layer to select. Uses active layer if not provided.
"""
idChnl = cID("Chnl")
- des1 = ps.ActionDescriptor()
- ref1 = ps.ActionReference()
- ref2 = ps.ActionReference()
+ des1 = ActionDescriptor()
+ ref1 = ActionReference()
+ ref2 = ActionReference()
ref1.putProperty(idChnl, cID("fsel"))
des1.putReference(cID("null"), ref1)
ref2.putEnumerated(idChnl, idChnl, cID("Trsp"))
@@ -677,7 +657,7 @@ def select_layer_pixels(layer: Optional[ArtLayer]) -> None:
def align(
- align_type: str = "AdCH",
+ align_type: Alignment = Alignment.CenterHorizontal,
layer: Optional[Union[ArtLayer, LayerSet]] = None,
reference: Optional[Union[ArtLayer, LayerSet]] = None
) -> None:
@@ -697,12 +677,12 @@ def align(
app.activeDocument.activeLayer = layer
# Align the current layer to selection
- desc = ps.ActionDescriptor()
- ref = ps.ActionReference()
- ref.putEnumerated(cID("Lyr "), cID("Ordn"), cID("Trgt"))
- desc.putReference(cID("null"), ref)
- desc.putEnumerated(cID("Usng"), cID("ADSt"), cID(align_type))
- app.executeAction(cID("Algn"), desc, NO_DIALOG)
+ desc = ActionDescriptor()
+ ref = ActionReference()
+ ref.putEnumerated(sID('layer'), sID('ordinal'), sID('targetEnum'))
+ desc.putReference(sID('null'), ref)
+ desc.putEnumerated(sID('using'), cID('ADSt'), align_type.value)
+ app.executeAction(sID('align'), desc, NO_DIALOG)
def align_vertical(
@@ -714,19 +694,19 @@ def align_vertical(
@param layer: ArtLayer or LayerSet to align. Uses active layer if not provided.
@param reference: Reference to align the layer within. Uses current selection if not provided.
"""
- align("AdCV", layer, reference)
+ align(Alignment.CenterVertical, layer, reference)
def align_horizontal(
- layer: Optional[Union[ArtLayer, LayerSet]] = None,
- reference: Optional[Union[ArtLayer, LayerSet]] = None
+ layer: Optional[Union[ArtLayer, LayerSet]] = None,
+ reference: Optional[Union[ArtLayer, LayerSet]] = None
) -> None:
"""
Align the currently active layer horizontally with respect to the current selection.
@param layer: ArtLayer or LayerSet to align. Uses active layer if not provided.
@param reference: Reference to align the layer within. Uses current selection if not provided.
"""
- align("AdCH", layer, reference)
+ align(Alignment.CenterHorizontal, layer, reference)
def position_between_layers(
@@ -786,10 +766,9 @@ def space_layers_apart(layers: list[Union[ArtLayer, LayerSet]], gap: Union[int,
def frame_layer(
layer: ArtLayer,
reference: ArtLayer,
- anchor: ps.AnchorPosition = ps.AnchorPosition.TopLeft,
smallest: bool = False,
- align_h: bool = True,
- align_v: bool = True
+ anchor: AnchorPosition = AnchorPosition.TopLeft,
+ alignments: Optional[list[Alignment]] = None
) -> None:
"""
Scale a layer equally to the bounds of a reference layer, then center the layer vertically and horizontally
@@ -799,56 +778,29 @@ def frame_layer(
layer_dim = get_layer_dimensions(layer)
ref_dim = get_layer_dimensions(reference)
- # Determine how much to scale the layer by such that it fits into the reference layer's bounds
+ # Scale the layer to fit either the largest, or the smallest dimension
action = min if smallest else max
scale = 100 * action((ref_dim['width'] / layer_dim['width']), (ref_dim['height'] / layer_dim['height']))
layer.resize(scale, scale, anchor)
- # Align the layer
+ # Make any alignments
select_layer_bounds(reference)
app.activeDocument.activeLayer = layer
- if align_h:
- align_horizontal()
- if align_v:
- align_vertical()
+ if alignments is None:
+ # Default alignments are center horizontal and vertical
+ alignments = [Alignment.CenterHorizontal, Alignment.CenterVertical]
+ for a in alignments:
+ align(a)
clear_selection()
-def set_active_layer_mask(visible: bool = True) -> None:
- """
- Set the visibility of the active layer's layer mask.
- """
- desc3078 = ps.ActionDescriptor()
- desc3079 = ps.ActionDescriptor()
- ref1567 = ps.ActionReference()
- ref1567.putEnumerated(cID("Lyr "), cID("Ordn"), cID("Trgt"))
- desc3078.putReference(cID("null"), ref1567)
- desc3079.putBoolean(cID("UsrM"), visible)
- desc3078.putObject(cID("T "), cID("Lyr "), desc3079)
- app.executeAction(cID("setd"), desc3078, NO_DIALOG)
-
-
-def enable_active_layer_mask() -> None:
- """
- Enables the active layer's layer mask.
- """
- set_active_layer_mask(True)
-
-
-def disable_active_layer_mask() -> None:
- """
- Disables the active layer's layer mask.
- """
- set_active_layer_mask(False)
-
-
def set_layer_mask(layer: ArtLayer, visible: bool = True) -> None:
"""
Set the visibility of the active layer's layer mask.
"""
- desc1 = ps.ActionDescriptor()
- desc2 = ps.ActionDescriptor()
- ref1 = ps.ActionReference()
+ desc1 = ActionDescriptor()
+ desc2 = ActionDescriptor()
+ ref1 = ActionReference()
ref1.putIdentifier(cID("Lyr "), layer.id)
desc1.putReference(cID("null"), ref1)
desc2.putBoolean(cID("UsrM"), visible)
@@ -872,66 +824,108 @@ def disable_mask(layer: Union[ArtLayer, LayerSet]) -> None:
set_layer_mask(layer, False)
-def leaf_layers() -> list[ArtLayer]:
+def set_fx_visibility(layer: Optional[Union[ArtLayer, LayerSet]], visible: bool = True) -> None:
"""
- Utility function to iterate over leaf layers in a document
+ Shows or hides the layer effects on a given layer.
+ @param layer: ArtLayer or LayerSet, use active if not provided.
+ @param visible: Make visible if True, otherwise hide.
"""
- to_visit = [node for node in app.activeDocument.layers]
- layers = []
- while to_visit:
- node = to_visit.pop()
- try:
- to_visit.extend([n for n in node.layers])
- except (NameError, AttributeError):
- # It's a leaf node, no sublayers
- layers.append(node)
+ if not layer:
+ layer = app.activeDocument.activeLayer
+ else:
+ app.activeDocument.activeLayer = layer
+
+ # Change visibility
+ desc = ActionDescriptor()
+ action_list = ActionList()
+ ref = ActionReference()
+ ref.putClass(sID("layerEffects"))
+ ref.putIdentifier(sID("layer"), layer.id)
+ action_list.putReference(ref)
+ desc.putList(sID("target"), action_list)
+ app.executeAction(sID("show" if visible else "hide"), desc, NO_DIALOG)
+
+
+def enable_layer_fx(layer: Optional[Union[ArtLayer, LayerSet]]) -> None:
+ """
+ Passthrough function for `change_fx_visibility` to enable effects on layer.
+ @param layer: ArtLayer or LayerSet, will use active if not provided.
+ """
+ set_fx_visibility(layer, True)
+
+
+def disable_layer_fx(layer: Optional[Union[ArtLayer, LayerSet]]) -> None:
+ """
+ Passthrough function for `change_fx_visibility` to enable effects on layer.
+ @param layer: ArtLayer or LayerSet, will use active if not provided.
+ """
+ set_fx_visibility(layer, False)
+
+
+def set_fill_opacity(opacity: float, layer: Optional[Union[ArtLayer, LayerSet]]) -> None:
+ """
+ Sets the fill opacity of a given layer.
+ @param opacity: Fill opacity to set.
+ @param layer: ArtLayer or LayerSet object.
+ """
+ # Set the active layer
+ if layer:
+ app.activeDocument.activeLayer = layer
+
+ # Set the layer's fill opacity
+ d = ActionDescriptor()
+ ref = ActionReference()
+ d1 = ActionDescriptor()
+ ref.PutEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
+ d.PutReference(sID("target"), ref)
+ d1.PutUnitDouble(sID("fillOpacity"), sID("percentUnit"), opacity)
+ d.PutObject(sID("to"), sID("layer"), d1)
+ app.ExecuteAction(sID("set"), d, NO_DIALOG)
+
+
+def get_leaf_layers(group: Optional[LayerSet] = None) -> list[ArtLayer]:
+ """
+ Utility function to generate a list of leaf layers in a LayerSet or document.
+ @param group: Group to grab leaf layers from.
+ @return: A list of leaf layers in a LayerSet or document.
+ """
+ if not group:
+ group = app.activeDocument
+ layers = [node for node in group.artLayers]
+ for g in group.layerSets:
+ layers.extend(get_leaf_layers(g))
return layers
-def apply_stroke(
- layer: ArtLayer,
- stroke_weight: int,
- stroke_color: ps.SolidColor = rgb_black()
-) -> None:
+def get_layer_tree(group: Optional[LayerSet] = None) -> dict[str, Union[ArtLayer, dict[str, ArtLayer]]]:
"""
- Applies an outer stroke to the active layer with the specified weight and color.
- """
- desc608 = ps.ActionDescriptor()
- desc609 = ps.ActionDescriptor()
- desc610 = ps.ActionDescriptor()
- ref149 = ps.ActionReference()
- ref149.putProperty(cID("Prpr"), cID("Lefx"))
- ref149.putIdentifier(cID("Lyr "), layer.id)
- desc608.putReference(cID("null"), ref149)
- desc609.putUnitDouble(cID("Scl "), cID("#Prc"), 200)
- desc610.putBoolean(cID("enab"), True)
- desc610.putEnumerated(cID("Styl"), cID("FStl"), cID("OutF"))
- desc610.putEnumerated(cID("PntT"), cID("FrFl"), cID("SClr"))
- desc610.putEnumerated(cID("Md "), cID("BlnM"), cID("Nrml"))
- desc610.putUnitDouble(cID("Opct"), cID("#Prc"), 100)
- desc610.putUnitDouble(cID("Sz "), cID("#Pxl"), int(stroke_weight))
- apply_color(desc610, stroke_color)
- desc609.putObject(cID("FrFX"), cID("FrFX"), desc610)
- desc608.putObject(cID("T "), cID("Lefx"), desc609)
- app.executeAction(cID("setd"), desc608, NO_DIALOG)
-
-
-def clear_layer_style(layer: Union[ArtLayer, LayerSet]) -> None:
+ Composes a dictionary tree of layers in the active document or a specific LayerSet.
+ @param: A specific group to create a dictionary tree for.
+ @return: A dictionary tree comprised of all the layers in a document or group.
+ """
+ if not group:
+ group = app.activeDocument
+ layers = {layer.name: layer for layer in group.artLayers}
+ for g in group.layerSets:
+ layers[g.name] = get_layer_tree(g)
+ return layers
+
+
+def clear_layer_style(layer: Union[ArtLayer, LayerSet, None]) -> None:
"""
Removes all layer style effects.
@param layer: Layer object
"""
- current = app.activeDocument.activeLayer
- app.activeDocument.activeLayer = layer
+ if layer:
+ app.activeDocument.activeLayer = layer
try:
- desc1600 = ps.ActionDescriptor()
- ref126 = ps.ActionReference()
- ref126.PutEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
- desc1600.PutReference(sID("target"), ref126)
+ desc1600 = ActionDescriptor()
+ ref126 = ActionReference()
+ ref126.putEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
+ desc1600.putReference(sID("target"), ref126)
app.ExecuteAction(sID("disableLayerStyle"), desc1600, NO_DIALOG)
except Exception as e:
print(e, f'\nLayer "{layer.name}" has no effects!')
- app.activeDocument.activeLayer = current
def rasterize_layer_style(layer: ArtLayer) -> None:
@@ -939,11 +933,11 @@ def rasterize_layer_style(layer: ArtLayer) -> None:
Rasterizes a layer including its style.
@param layer: Layer object
"""
- desc1 = ps.ActionDescriptor()
- ref1 = ps.ActionReference()
+ desc1 = ActionDescriptor()
+ ref1 = ActionReference()
ref1.putIdentifier(sID("layer"), layer.id)
- desc1.PutReference(sID("target"), ref1)
- desc1.PutEnumerated(sID("what"), sID("rasterizeItem"), sID("layerStyle"))
+ desc1.putReference(sID("target"), ref1)
+ desc1.putEnumerated(sID("what"), sID("rasterizeItem"), sID("layerStyle"))
app.ExecuteAction(sID("rasterizeLayer"), desc1, NO_DIALOG)
@@ -953,17 +947,17 @@ def import_art(layer: ArtLayer, file: str) -> None:
@param layer: Layer to make active and receive image.
@param file: Image file to import.
"""
- desc = ps.ActionDescriptor()
+ desc = ActionDescriptor()
app.activeDocument.activeLayer = layer
- desc.putPath(app.charIDToTypeID("null"), file)
- app.executeAction(app.charIDToTypeID("Plc "), desc)
+ desc.putPath(cID("null"), file)
+ app.executeAction(cID("Plc "), desc)
app.activeDocument.activeLayer.name = "Layer 1"
def import_svg(
file: str,
ref: Union[ArtLayer, LayerSet] = None,
- placement: Optional[ps.ElementPlacement] = None
+ placement: Optional[ElementPlacement] = None
) -> ArtLayer:
"""
Imports an SVG image, then moves it if needed.
@@ -973,9 +967,9 @@ def import_svg(
@return: New layer containing SVG.
"""
# Import the art
- desc = ps.ActionDescriptor()
- desc.putPath(app.charIDToTypeID("null"), file)
- app.executeAction(app.charIDToTypeID("Plc "), desc)
+ desc = ActionDescriptor()
+ desc.putPath(cID("null"), file)
+ app.executeAction(cID("Plc "), desc)
# Position the layer if needed
if ref and placement:
@@ -1007,7 +1001,7 @@ def paste_file(
# Select the entire image, copy it, and close the file
app.activeDocument.selection.selectAll()
app.activeDocument.selection.copy()
- app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges)
+ app.activeDocument.close(SaveOptions.DoNotSaveChanges)
# Paste the image into the specific layer
app.activeDocument.paste()
@@ -1029,8 +1023,8 @@ def paste_file_into_new_layer(file: str) -> ArtLayer:
def add_color_to_gradient(
- action_list: ps.ActionList,
- color: ps.SolidColor,
+ action_list: ActionList,
+ color: SolidColor,
location: int,
midpoint: int
) -> None:
@@ -1040,17 +1034,16 @@ def add_color_to_gradient(
@param color: SolidColor object
@param location: Location of the color along the track.
@param midpoint: Percentage midpoint between this color and the next.
- @return:
"""
- action = ps.ActionDescriptor()
+ action = ActionDescriptor()
apply_color(action, color)
- action.PutEnumerated(sID("type"), sID("colorStopType"), sID("userStop"))
- action.PutInteger(sID("location"), location)
- action.PutInteger(sID("midpoint"), midpoint)
- action_list.PutObject(sID("colorStop"), action)
+ action.putEnumerated(sID("type"), sID("colorStopType"), sID("userStop"))
+ action.putInteger(sID("location"), location)
+ action.putInteger(sID("midpoint"), midpoint)
+ action_list.putObject(sID("colorStop"), action)
-def apply_fx(layer: Union[ArtLayer, LayerSet], effects: list[dict]) -> None:
+def apply_fx(layer: Union[ArtLayer, LayerSet], effects: list[LayerEffects]) -> None:
"""
Apply multiple layer effects to a layer.
@param layer: Layer or Layer Set object.
@@ -1058,133 +1051,135 @@ def apply_fx(layer: Union[ArtLayer, LayerSet], effects: list[dict]) -> None:
"""
# Set up the main action
app.activeDocument.activeLayer = layer
- main_action = ps.ActionDescriptor()
- fx_action = ps.ActionDescriptor()
- main_ref = ps.ActionReference()
- main_ref.PutProperty(sID("property"), sID("layerEffects"))
- main_ref.PutEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
- main_action.PutReference(sID("target"), main_ref)
+ main_action = ActionDescriptor()
+ fx_action = ActionDescriptor()
+ main_ref = ActionReference()
+ main_ref.putProperty(sID("property"), sID("layerEffects"))
+ main_ref.putEnumerated(sID("layer"), sID("ordinal"), sID("targetEnum"))
+ main_action.putReference(sID("target"), main_ref)
# Add each action from fx dictionary
for fx in effects:
if fx['type'] == 'stroke':
- apply_fx_stroke(fx_action, **fx)
- elif fx['type'] == 'gradient':
- apply_fx_gradient(fx_action, **fx)
+ apply_fx_stroke(fx_action, fx)
elif fx['type'] == 'drop-shadow':
- apply_fx_drop_shadow(fx_action, **fx)
+ apply_fx_drop_shadow(fx_action, fx)
+ elif fx['type'] == 'gradient-overlay':
+ apply_fx_gradient_overlay(fx_action, fx)
+ elif fx['type'] == 'color-overlay':
+ apply_fx_color_overlay(fx_action, fx)
# Apply all fx actions
- main_action.PutObject(sID("to"), sID("layerEffects"), fx_action)
- app.ExecuteAction(sID("set"), main_action, ps.DialogModes.DisplayNoDialogs)
+ main_action.putObject(sID("to"), sID("layerEffects"), fx_action)
+ app.ExecuteAction(sID("set"), main_action, DialogModes.DisplayNoDialogs)
-def apply_fx_stroke(action: ps.ActionDescriptor, **kw) -> None:
+def apply_fx_stroke(action: ActionDescriptor, fx: EffectStroke) -> None:
"""
Adds stroke effect to layer effects action.
@param action: Pending layer effects action descriptor.
- @param kw: Optional keywords governing stroke behavior.
+ @param fx: Stroke effect properties.
"""
- d = ps.ActionDescriptor()
- if kw.get("style") == 'in':
- stroke_style = 'insetFrame'
- elif kw.get("style") == 'center':
- stroke_style = 'centeredFrame'
- else:
- stroke_style = 'outsetFrame'
- d.PutEnumerated(sID("style"), sID("frameStyle"), sID(stroke_style))
- d.PutEnumerated(sID("paintType"), sID("frameFill"), sID("solidColor"))
- d.PutEnumerated(sID("mode"), sID("blendMode"), sID("normal"))
- d.PutUnitDouble(sID("opacity"), sID("percentUnit"), int(kw.get('opacity', 100)))
- d.PutUnitDouble(sID("size"), sID("pixelsUnit"), int(kw.get('weight', 6)))
- apply_color(d, get_color(kw.get('color', [0, 0, 0])))
- d.PutBoolean(sID("overprint"), False)
- action.PutObject(sID("frameFX"), sID("frameFX"), d)
+ d = ActionDescriptor()
+ d.putEnumerated(sID("style"), sID("frameStyle"), Stroke.position(fx.get('style', 'out')))
+ d.putEnumerated(sID("paintType"), sID("frameFill"), sID("solidColor"))
+ d.putEnumerated(sID("mode"), sID("blendMode"), sID("normal"))
+ d.putUnitDouble(sID("opacity"), sID("percentUnit"), int(fx.get('opacity', 100)))
+ d.putUnitDouble(sID("size"), sID("pixelsUnit"), int(fx.get('weight', 6)))
+ apply_color(d, get_color(fx.get('color', [0, 0, 0])))
+ d.putBoolean(sID("overprint"), False)
+ action.putObject(sID("frameFX"), sID("frameFX"), d)
-def apply_fx_drop_shadow(action: ps.ActionDescriptor, **kw) -> None:
+def apply_fx_drop_shadow(action: ActionDescriptor, fx: EffectDropShadow) -> None:
"""
Adds drop shadow effect to layer effects action.
@param action: Pending layer effects action descriptor.
- @param kw: Optional keywords governing drop shadow behavior.
- """
- d1 = ps.ActionDescriptor()
- d2 = ps.ActionDescriptor()
- d_color = ps.ActionDescriptor()
- d1.PutEnumerated(sID("mode"), sID("blendMode"), sID("multiply"))
- d_color.PutDouble(sID("red"), 0.000000)
- d_color.PutDouble(sID("grain"), 0.000000)
- d_color.PutDouble(sID("blue"), 0.000000)
- d1.PutObject(sID("color"), sID("RGBColor"), d_color)
- d1.PutUnitDouble(sID("opacity"), sID("percentUnit"), float(kw.get('opacity', 100.000000)))
- d1.PutBoolean(sID("useGlobalAngle"), False)
- d1.PutUnitDouble(sID("localLightingAngle"), sID("angleUnit"), float(kw.get('rotation', 45.000000)))
- d1.PutUnitDouble(sID("distance"), sID("pixelsUnit"), float(kw.get('distance', 10.000000)))
- d1.PutUnitDouble(sID("chokeMatte"), sID("pixelsUnit"), float(kw.get('spread', 0.000000)))
- d1.PutUnitDouble(sID("blur"), sID("pixelsUnit"), float(kw.get('size', 0.000000)))
- d1.PutUnitDouble(sID("noise"), sID("percentUnit"), 0.000000)
- d1.PutBoolean(sID("antiAlias"), False)
- d2.PutString(sID("name"), "Linear")
- d1.PutObject(sID("transferSpec"), sID("shapeCurveType"), d2)
- d1.PutBoolean(sID("layerConceals"), True)
- action.PutObject(sID("dropShadow"), sID("dropShadow"), d1)
-
-
-def apply_fx_gradient(action: ps.ActionDescriptor, **kw) -> None:
+ @param fx: Drop Shadow effect properties.
+ """
+ d1 = ActionDescriptor()
+ d2 = ActionDescriptor()
+ d_color = ActionDescriptor()
+ d1.putEnumerated(sID("mode"), sID("blendMode"), sID("multiply"))
+ d_color.putDouble(sID("red"), 0.000000)
+ d_color.putDouble(sID("grain"), 0.000000)
+ d_color.putDouble(sID("blue"), 0.000000)
+ d1.putObject(sID("color"), sID("RGBColor"), d_color)
+ d1.putUnitDouble(sID("opacity"), sID("percentUnit"), float(fx.get('opacity', 100.000000)))
+ d1.putBoolean(sID("useGlobalAngle"), False)
+ d1.putUnitDouble(sID("localLightingAngle"), sID("angleUnit"), float(fx.get('rotation', 45.000000)))
+ d1.putUnitDouble(sID("distance"), sID("pixelsUnit"), float(fx.get('distance', 10.000000)))
+ d1.putUnitDouble(sID("chokeMatte"), sID("pixelsUnit"), float(fx.get('spread', 0.000000)))
+ d1.putUnitDouble(sID("blur"), sID("pixelsUnit"), float(fx.get('size', 0.000000)))
+ d1.putUnitDouble(sID("noise"), sID("percentUnit"), 0.000000)
+ d1.putBoolean(sID("antiAlias"), False)
+ d2.putString(sID("name"), "Linear")
+ d1.putObject(sID("transferSpec"), sID("shapeCurveType"), d2)
+ d1.putBoolean(sID("layerConceals"), True)
+ action.putObject(sID("dropShadow"), sID("dropShadow"), d1)
+
+
+def apply_fx_gradient_overlay(
+ action: ActionDescriptor, fx: EffectGradientOverlay
+) -> None:
"""
Adds gradient effect to layer effects action.
@param action: Pending layer effects action descriptor.
- @param kw: Optional keywords governing gradient behavior.
- """
- d1 = ps.ActionDescriptor()
- d2 = ps.ActionDescriptor()
- d3 = ps.ActionDescriptor()
- d4 = ps.ActionDescriptor()
- d5 = ps.ActionDescriptor()
- color_list = ps.ActionList()
- transparency_list = ps.ActionList()
- d1.PutEnumerated(sID("mode"), sID("blendMode"), sID("normal"))
- d1.PutUnitDouble(sID("opacity"), sID("percentUnit"), int(kw.get('opacity', 100)))
- d2.PutEnumerated(sID("gradientForm"), sID("gradientForm"), sID("customStops"))
- d2.PutDouble(sID("interfaceIconFrameDimmed"), int(kw.get('size', 4096)))
- for c in kw.get('colors', []):
+ @param fx: Gradient Overlay effect properties.
+ """
+ d1 = ActionDescriptor()
+ d2 = ActionDescriptor()
+ d3 = ActionDescriptor()
+ d4 = ActionDescriptor()
+ d5 = ActionDescriptor()
+ color_list = ActionList()
+ transparency_list = ActionList()
+ d1.putEnumerated(sID("mode"), sID("blendMode"), sID("normal"))
+ d1.putUnitDouble(sID("opacity"), sID("percentUnit"), int(fx.get('opacity', 100)))
+ d2.putEnumerated(sID("gradientForm"), sID("gradientForm"), sID("customStops"))
+ d2.putDouble(sID("interfaceIconFrameDimmed"), int(fx.get('size', 4096)))
+ for c in fx.get('colors', []):
add_color_to_gradient(
color_list,
get_color(c.get('color', [0, 0, 0])),
int(c.get('location', 0)),
int(c.get('midpoint', 50))
)
- d2.PutList(sID("colors"), color_list)
- d3.PutUnitDouble(sID("opacity"), sID("percentUnit"), 100)
- d3.PutInteger(sID("location"), 0)
- d3.PutInteger(sID("midpoint"), 50)
- transparency_list.PutObject(sID("transferSpec"), d3)
- d4.PutUnitDouble(sID("opacity"), sID("percentUnit"), 100)
- d4.PutInteger(sID("location"), int(kw.get('size', 4096)))
- d4.PutInteger(sID("midpoint"), 50)
- transparency_list.PutObject(sID("transferSpec"), d4)
- d2.PutList(sID("transparency"), transparency_list)
- d1.PutObject(sID("gradient"), sID("gradientClassEvent"), d2)
- d1.PutUnitDouble(sID("angle"), sID("angleUnit"), int(kw.get('rotation', 45)))
- d1.PutEnumerated(sID("type"), sID("gradientType"), sID("linear"))
- d1.PutBoolean(sID("reverse"), False)
- d1.PutBoolean(sID("dither"), False)
- d1.PutEnumerated(cID("gs99"), sID("gradientInterpolationMethodType"), sID("classic"))
- d1.PutBoolean(sID("align"), True)
- d1.PutUnitDouble(sID("scale"), sID("percentUnit"), int(kw.get('scale', 70)))
- d5.PutUnitDouble(sID("horizontal"), sID("percentUnit"), 0)
- d5.PutUnitDouble(sID("vertical"), sID("percentUnit"), 0)
- d1.PutObject(sID("offset"), sID("paint"), d5)
- action.PutObject(sID("gradientFill"), sID("gradientFill"), d1)
-
-
-def apply_fx_fill(action: ps.ActionDescriptor, **kw) -> None:
+ d2.putList(sID("colors"), color_list)
+ d3.putUnitDouble(sID("opacity"), sID("percentUnit"), 100)
+ d3.putInteger(sID("location"), 0)
+ d3.putInteger(sID("midpoint"), 50)
+ transparency_list.putObject(sID("transferSpec"), d3)
+ d4.putUnitDouble(sID("opacity"), sID("percentUnit"), 100)
+ d4.putInteger(sID("location"), int(fx.get('size', 4096)))
+ d4.putInteger(sID("midpoint"), 50)
+ transparency_list.putObject(sID("transferSpec"), d4)
+ d2.putList(sID("transparency"), transparency_list)
+ d1.putObject(sID("gradient"), sID("gradientClassEvent"), d2)
+ d1.putUnitDouble(sID("angle"), sID("angleUnit"), int(fx.get('rotation', 45)))
+ d1.putEnumerated(sID("type"), sID("gradientType"), sID("linear"))
+ d1.putBoolean(sID("reverse"), False)
+ d1.putBoolean(sID("dither"), False)
+ d1.putEnumerated(cID("gs99"), sID("gradientInterpolationMethodType"), sID("classic"))
+ d1.putBoolean(sID("align"), True)
+ d1.putUnitDouble(sID("scale"), sID("percentUnit"), int(fx.get('scale', 70)))
+ d5.putUnitDouble(sID("horizontal"), sID("percentUnit"), 0)
+ d5.putUnitDouble(sID("vertical"), sID("percentUnit"), 0)
+ d1.putObject(sID("offset"), sID("paint"), d5)
+ action.putObject(sID("gradientFill"), sID("gradientFill"), d1)
+
+
+def apply_fx_color_overlay(action: ActionDescriptor, fx: EffectColorOverlay) -> None:
"""
Adds a solid color overlay to layer effects action.
@param action: Pending layer effects action descriptor.
- @param kw: Optional keywords governing overlay behavior.
+ @param fx: Color Overlay effect properties.
"""
- pass
+ d = ActionDescriptor()
+ d.PutEnumerated(sID("mode"), sID("blendMode"), sID("normal"))
+ apply_color(d, fx.get('color', rgb_black()))
+ d.PutUnitDouble(sID("opacity"), sID("percentUnit"), 100.000000)
+ action.PutObject(sID("solidFill"), sID("solidFill"), d)
"""
@@ -1204,18 +1199,17 @@ def replace_text(layer: ArtLayer, find: str, replace: str) -> None:
app.activeDocument.activeLayer = layer
# Find and replace
- desc31 = ps.ActionDescriptor()
- ref3 = ps.ActionReference()
- desc32 = ps.ActionDescriptor()
+ desc31 = ActionDescriptor()
+ ref3 = ActionReference()
+ desc32 = ActionDescriptor()
ref3.putProperty(sID("property"), sID("findReplace"))
- ref3.putEnumerated(cID('TxLr'), cID('Ordn'), cID('Trgt'))
+ ref3.putEnumerated(sID('textLayer'), sID('ordinal'), sID('targetEnum'))
desc31.putReference(sID("null"), ref3)
desc32.putString(sID("find"), f"{find}")
desc32.putString(sID("replace"), f"{replace}")
- # if cfg.targeted_replace: app.bringToFront()
desc32.putBoolean(
sID("checkAll"), # Targeted replace doesn't work on old PS versions
- False if cfg.targeted_replace and int(app.version[0:2]) > 22 else True
+ False if cfg.targeted_replace and ps_version_check(con.version_targeted_replace) else True
)
desc32.putBoolean(sID("forward"), True)
desc32.putBoolean(sID("caseSensitive"), True)
@@ -1244,12 +1238,12 @@ def trim_transparent_pixels() -> None:
"""
Trim transparent pixels from Photoshop document.
"""
- desc258 = ps.ActionDescriptor()
- desc258.PutEnumerated(sID("trimBasedOn"), sID("trimBasedOn"), sID("transparency"))
- desc258.PutBoolean(sID("top"), True)
- desc258.PutBoolean(sID("bottom"), True)
- desc258.PutBoolean(sID("left"), True)
- desc258.PutBoolean(sID("right"), True)
+ desc258 = ActionDescriptor()
+ desc258.putEnumerated(sID("trimBasedOn"), sID("trimBasedOn"), sID("transparency"))
+ desc258.putBoolean(sID("top"), True)
+ desc258.putBoolean(sID("bottom"), True)
+ desc258.putBoolean(sID("left"), True)
+ desc258.putBoolean(sID("right"), True)
app.ExecuteAction(sID("trim"), desc258, NO_DIALOG)
@@ -1259,13 +1253,13 @@ def run_action(action_set: str, action: str) -> None:
@param action_set: Name of the group the action is in.
@param action: Name of the action.
"""
- desc310 = ps.ActionDescriptor()
- ref7 = ps.ActionReference()
- desc310.PutBoolean(sID("dontRecord"), False)
- desc310.PutBoolean(sID("forceNotify"), True)
- ref7.PutName(sID("action"), action)
- ref7.PutName(sID("actionSet"), action_set)
- desc310.PutReference(sID("target"), ref7)
+ desc310 = ActionDescriptor()
+ ref7 = ActionReference()
+ desc310.putBoolean(sID("dontRecord"), False)
+ desc310.putBoolean(sID("forceNotify"), True)
+ ref7.putName(sID("action"), action)
+ ref7.putName(sID("actionSet"), action_set)
+ desc310.putReference(sID("target"), ref7)
app.ExecuteAction(sID("play"), desc310, NO_DIALOG)
@@ -1275,7 +1269,7 @@ def save_document_png(file_name: str, directory='out') -> None:
@param file_name: Name of the output file.
@param directory: Directory to save the file.
"""
- png_options = ps.PNGSaveOptions()
+ png_options = PNGSaveOptions()
png_options.compression = 3
app.activeDocument.saveAs(
file_path=os.path.join(con.cwd, f"{directory}/{file_name}.png"),
@@ -1289,7 +1283,7 @@ def save_document_jpeg(file_name: str, directory='out') -> None:
@param file_name: Name of the output file.
@param directory: Directory to save the file.
"""
- jpeg_options = ps.JPEGSaveOptions(quality=12)
+ jpeg_options = JPEGSaveOptions(quality=12)
jpeg_options.scans = 3
app.activeDocument.saveAs(
file_path=os.path.join(con.cwd, f"{directory}/{file_name}.jpg"),
@@ -1305,7 +1299,7 @@ def save_document_psd(file_name: str, directory='out') -> None:
"""
app.activeDocument.saveAs(
file_path=os.path.join(con.cwd, f"{directory}/{file_name}.psd"),
- options=ps.PhotoshopSaveOptions(),
+ options=PhotoshopSaveOptions(),
asCopy=True
)
@@ -1314,43 +1308,19 @@ def close_document() -> None:
"""
Close the document
"""
- app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges)
-
-
-def open_svg(path: str, max_width: int = 500, dpi: int = 1200) -> None:
- """
- Opens a rasterized SVG file in Photoshop.
- @param path: Path to the file
- @param max_width: Max width, height will be proportional
- @param dpi: Pixel density of the image
- """
- desc227 = ps.ActionDescriptor()
- desc228 = ps.ActionDescriptor()
- desc227.PutBoolean(sID("dontRecord"), False)
- desc227.PutBoolean(sID("forceNotify"), True)
- desc227.PutPath(sID("target"), path)
- desc228.PutUnitDouble(sID("width"), sID("pixelsUnit"), max_width)
- desc228.PutUnitDouble(sID("resolution"), sID("densityUnit"), dpi)
- desc228.PutEnumerated(sID("mode"), sID("colorSpace"), sID("RGBColor"))
- desc228.PutBoolean(sID("antiAlias"), True)
- desc228.PutBoolean(sID("constrainProportions"), True)
- desc227.PutObject(sID("as"), sID("svgFormat"), desc228)
- app.ExecuteAction(sID("open"), desc227, NO_DIALOG)
+ app.activeDocument.close(SaveOptions.DoNotSaveChanges)
-def reset_document(filename: str) -> None:
+def reset_document() -> None:
"""
Reset all changes to the current document.
- @param filename: Document file name
"""
- if '/' in filename:
- filename = filename.split('/')[-1]
idslct = cID("slct")
- desc9 = ps.ActionDescriptor()
+ desc9 = ActionDescriptor()
idnull = cID("null")
- ref1 = ps.ActionReference()
+ ref1 = ActionReference()
idSnpS = cID("SnpS")
- ref1.putName(idSnpS, filename)
+ ref1.putName(idSnpS, app.activeDocument.name)
desc9.putReference(idnull, ref1)
app.executeAction(idslct, desc9, NO_DIALOG)
@@ -1372,11 +1342,11 @@ def content_fill_empty_area(layer: Optional[ArtLayer] = None) -> None:
app.activeDocument.activeLayer = layer
# Select pixels of active layer
- desc307 = ps.ActionDescriptor()
- ref257 = ps.ActionReference()
+ desc307 = ActionDescriptor()
+ ref257 = ActionReference()
ref257.putProperty(cID("Chnl"), cID("fsel"))
desc307.putReference(cID("null"), ref257)
- ref258 = ps.ActionReference()
+ ref258 = ActionReference()
idChnl = cID("Chnl")
ref258.putEnumerated(idChnl, idChnl, cID("Trsp"))
if layer:
@@ -1387,7 +1357,7 @@ def content_fill_empty_area(layer: Optional[ArtLayer] = None) -> None:
# Rasterize
docRef = app.activeDocument
active_layer = docRef.activeLayer
- active_layer.rasterize(ps.RasterizeType.EntireLayer)
+ active_layer.rasterize(RasterizeType.EntireLayer)
# Manipulate selection - invert, expand 8px, smooth 4px
selection = docRef.selection
@@ -1396,7 +1366,7 @@ def content_fill_empty_area(layer: Optional[ArtLayer] = None) -> None:
selection.smooth(4)
# Content aware fill
- desc12 = ps.ActionDescriptor()
+ desc12 = ActionDescriptor()
desc12.putEnumerated(cID("Usng"), cID("FlCn"), sID("contentAware"))
desc12.putUnitDouble(cID("Opct"), cID("#Prc"), 100)
desc12.putEnumerated(cID("Md "), cID("BlnM"), cID("Nrml"))
@@ -1415,7 +1385,7 @@ def apply_vibrant_saturation(vibrancy: int, saturation: int) -> None:
"""
# dialogMode (Have dialog popup?)
idvibrance = sID("vibrance")
- desc232 = ps.ActionDescriptor()
+ desc232 = ActionDescriptor()
desc232.putInteger(idvibrance, vibrancy)
desc232.putInteger(cID("Strt"), saturation)
app.executeAction(idvibrance, desc232, NO_DIALOG)
@@ -1427,43 +1397,43 @@ def repair_edges(edge: int = 6) -> None:
@param edge: How many pixels to select at the edge.
"""
# Select all
- desc632724 = ps.ActionDescriptor()
- ref489 = ps.ActionReference()
- ref489.PutProperty(sID("channel"), sID("selection"))
- desc632724.PutReference(sID("target"), ref489)
- desc632724.PutEnumerated(sID("to"), sID("ordinal"), sID("allEnum"))
+ desc632724 = ActionDescriptor()
+ ref489 = ActionReference()
+ ref489.putProperty(sID("channel"), sID("selection"))
+ desc632724.putReference(sID("target"), ref489)
+ desc632724.putEnumerated(sID("to"), sID("ordinal"), sID("allEnum"))
app.ExecuteAction(sID("set"), desc632724, NO_DIALOG)
# Contract selection
- contract = ps.ActionDescriptor()
- contract.PutUnitDouble(sID("by"), sID("pixelsUnit"), edge)
- contract.PutBoolean(sID("selectionModifyEffectAtCanvasBounds"), True)
+ contract = ActionDescriptor()
+ contract.putUnitDouble(sID("by"), sID("pixelsUnit"), edge)
+ contract.putBoolean(sID("selectionModifyEffectAtCanvasBounds"), True)
app.ExecuteAction(sID("contract"), contract, NO_DIALOG)
# Inverse the selection
app.ExecuteAction(sID("inverse"), None, NO_DIALOG)
# Content aware fill
- desc_caf = ps.ActionDescriptor()
- desc_caf.PutEnumerated(
+ desc_caf = ActionDescriptor()
+ desc_caf.putEnumerated(
sID("cafSamplingRegion"),
sID("cafSamplingRegion"),
sID("cafSamplingRegionRectangular")
)
- desc_caf.PutBoolean(sID("cafSampleAllLayers"), False)
- desc_caf.PutEnumerated(
+ desc_caf.putBoolean(sID("cafSampleAllLayers"), False)
+ desc_caf.putEnumerated(
sID("cafColorAdaptationLevel"),
sID("cafColorAdaptationLevel"),
sID("cafColorAdaptationDefault")
)
- desc_caf.PutEnumerated(
+ desc_caf.putEnumerated(
sID("cafRotationAmount"),
sID("cafRotationAmount"),
sID("cafRotationAmountNone")
)
- desc_caf.PutBoolean(sID("cafScale"), False)
- desc_caf.PutBoolean(sID("cafMirror"), False)
- desc_caf.PutEnumerated(
+ desc_caf.putBoolean(sID("cafScale"), False)
+ desc_caf.putBoolean(sID("cafMirror"), False)
+ desc_caf.putEnumerated(
sID("cafOutput"),
sID("cafOutput"),
sID("cafOutputToNewLayer")
@@ -1495,18 +1465,18 @@ def insert_scryfall_scan(image_url: str) -> Optional[ArtLayer]:
"""
-def fill_expansion_symbol(reference: ArtLayer, color: ps.SolidColor = rgb_black()) -> ArtLayer:
+def fill_expansion_symbol(reference: ArtLayer, color: SolidColor = rgb_black()) -> ArtLayer:
"""
Give the symbol a background for open space symbols (i.e. M10)
@param reference: Reference layer to put the new fill layer underneath
@param color: Color of the background fill
"""
# Magic Wand contiguous outside symbol
- coords = ps.ActionDescriptor()
+ coords = ActionDescriptor()
coords.putUnitDouble(cID("Hrzn"), cID("#Pxl"), 5)
coords.putUnitDouble(cID("Vrtc"), cID("#Pxl"), 5)
- click1 = ps.ActionDescriptor()
- ref1 = ps.ActionReference()
+ click1 = ActionDescriptor()
+ ref1 = ActionReference()
ref1.putProperty(cID("Chnl"), cID("fsel"))
click1.putReference(cID("null"), ref1)
click1.putObject(cID("T "), cID("Pnt "), coords)
@@ -1521,12 +1491,12 @@ def fill_expansion_symbol(reference: ArtLayer, color: ps.SolidColor = rgb_black(
# Make a new layer
layer = app.activeDocument.artLayers.add()
layer.name = "Expansion Mask"
- layer.blendMode = ps.BlendMode.NormalBlend
+ layer.blendMode = BlendMode.NormalBlend
layer.moveAfter(reference)
# Fill selection with stroke color
app.foregroundColor = color
- click3 = ps.ActionDescriptor()
+ click3 = ActionDescriptor()
click3.putObject(cID("From"), cID("Pnt "), coords)
click3.putInteger(cID("Tlrn"), 0)
click3.putEnumerated(cID("Usng"), cID("FlCn"), cID("FrgC"))
@@ -1559,11 +1529,6 @@ def process_expansion_symbol_info(symbol: Union[str, list], rarity: str) -> Opti
cfg.symbol_stroke
])
}
- if cfg.fill_symbol:
- # Background fill action
- symbol['fill'] = get_color(
- 'white' if rarity == con.rarity_common else 'black'
- )
if rarity != con.rarity_common:
# Gradient overlay action
symbol['rarity'] = True
@@ -1612,16 +1577,14 @@ def format_expansion_symbol_dict(sym: dict, rarity: str) -> dict:
if sym.get('fill'):
# Background fill definition - Optional
symbol['fill'] = format_symbol_fx_fill(sym['fill'], rarity) if sym['fill'] != 'rarity' else 'rarity'
- if sym.get('rarity', True) or sym.get('fill') == 'rarity':
+ if sym.get('rarity', True) or symbol.get('fill') == 'rarity':
# Generate gradient FX by default
- gradient = format_symbol_fx_gradient(
+ symbol['gradient'] = format_symbol_fx_gradient(
rarity,
sym.get('gradient')
)
- if gradient:
- # Add only if its needed
- symbol['gradient'] = gradient
- symbol['rarity'] = sym.get('rarity', True)
+ # Only enable if rarity fill not enabled
+ symbol['rarity'] = sym.get('rarity', bool(symbol.get('fill') != 'rarity'))
return symbol
# Common only attributes
@@ -1639,51 +1602,60 @@ def format_expansion_symbol_dict(sym: dict, rarity: str) -> dict:
return symbol
-def format_symbol_fx_fill(fx: Union[str, list, dict], rarity: str) -> SolidColor:
+def format_symbol_fx_fill(fx: Union[str, list, dict], rarity: str) -> Optional[SolidColor]:
"""
Format background fill effect info.
@param fx: Background fill details.
@param rarity: Card rarity.
@return: Formatted background fill details.
"""
+ # Dict typically provides a color for each rarity
if isinstance(fx, dict):
+ # Grab color according to rarity
if rarity[0] in fx:
return get_color(fx[rarity[0]])
+ # Rarity not found, take the first one
return get_color(list(fx.values())[0])
- return get_color(fx)
+ # List notation or named color
+ if isinstance(fx, list) or isinstance(fx, str):
+ return get_color(fx)
+ return
-def format_symbol_fx_stroke(fx: Union[bool, list, dict]) -> Optional[dict]:
+def format_symbol_fx_stroke(fx: Union[bool, list, dict]) -> Optional[EffectStroke]:
"""
Produces a correct dictionary for layer effects type: stroke.
@param fx: The stroke definition we were given by the user.
@return: Formatted stroke definition for this effect.
"""
+ # Layer effects details notation
if isinstance(fx, dict):
return {
'type': 'stroke',
- 'weight': fx.get('weight') or fx.get('size', cfg.symbol_stroke),
+ 'weight': int(fx.get('weight') or fx.get('size', cfg.symbol_stroke)),
'color': get_color(fx.get('color', [0, 0, 0])),
- 'opacity': fx.get('opacity', 100),
+ 'opacity': int(fx.get('opacity', 100)),
'style': fx.get('style', 'out')
}
+ # Simple [color, weight] notation
if isinstance(fx, list):
return {
'type': 'stroke',
- 'weight': fx[1],
- 'color': get_color(con.colors[fx[0]]),
- 'opacity': 100,
+ 'weight': int(fx[1]),
+ 'color': get_color(fx[0]),
+ 'opacity': int(100),
'style': 'out'
}
return
-def format_symbol_fx_drop_shadow(fx: Union[bool, dict]) -> Optional[dict]:
+def format_symbol_fx_drop_shadow(fx: Union[bool, dict]) -> Optional[EffectDropShadow]:
"""
Produces a correct dictionary for layer effects type: drop-shadow.
@param fx: The drop shadow definition we were given by the user.
@return: Formatted drop shadow definition for this effect.
"""
+ # Simple toggle
if isinstance(fx, bool) and fx:
return {
'type': 'drop-shadow',
@@ -1693,19 +1665,22 @@ def format_symbol_fx_drop_shadow(fx: Union[bool, dict]) -> Optional[dict]:
'spread': 0,
'size': 0,
}
+ # Layer effects details notation
if isinstance(fx, dict):
return {
'type': 'drop-shadow',
- 'opacity': fx.get('opacity', 100),
- 'rotation': fx.get('rotation', 45),
- 'distance': fx.get('distance', 10),
- 'spread': fx.get('spread', 0),
- 'size': fx.get('size', 0),
+ 'opacity': int(fx.get('opacity', 100)),
+ 'rotation': int(fx.get('rotation', 45)),
+ 'distance': int(fx.get('distance', 10)),
+ 'spread': int(fx.get('spread', 0)),
+ 'size': int(fx.get('size', 0)),
}
return
-def format_symbol_fx_gradient(rarity: str, gradient: Optional[dict] = None) -> Optional[dict]:
+def format_symbol_fx_gradient(
+ rarity: str, gradient: Optional[dict] = None
+) -> Optional[EffectGradientOverlay]:
"""
Produces a correct dictionary for layer effects type: gradient overlay.
@param rarity: The rarity of this symbol.
@@ -1751,7 +1726,7 @@ def format_symbol_fx_gradient(rarity: str, gradient: Optional[dict] = None) -> O
color_map.update(rarities)
# Return None if no colors given
- gradient_colors = color_map[rarity[0]]
+ gradient_colors = color_map.get(rarity[0])
if not gradient_colors:
return
@@ -1761,9 +1736,10 @@ def format_symbol_fx_gradient(rarity: str, gradient: Optional[dict] = None) -> O
# Create new definition
return {
- 'type': 'gradient',
+ 'type': 'gradient-overlay',
'size': gradient.get('size', 4096),
'scale': gradient.get('scale', 70),
'rotation': gradient.get('rotation', 45),
+ 'opacity': gradient.get('opacity', 100),
'colors': gradient_colors
}
diff --git a/proxyshop/img/AdventureTemplate.jpg b/src/img/AdventureTemplate.jpg
similarity index 100%
rename from proxyshop/img/AdventureTemplate.jpg
rename to src/img/AdventureTemplate.jpg
diff --git a/proxyshop/img/BasicLandClassicTemplate.jpg b/src/img/BasicLandClassicTemplate.jpg
similarity index 100%
rename from proxyshop/img/BasicLandClassicTemplate.jpg
rename to src/img/BasicLandClassicTemplate.jpg
diff --git a/proxyshop/img/BasicLandTemplate.jpg b/src/img/BasicLandTemplate.jpg
similarity index 100%
rename from proxyshop/img/BasicLandTemplate.jpg
rename to src/img/BasicLandTemplate.jpg
diff --git a/proxyshop/img/BasicLandTherosTemplate.jpg b/src/img/BasicLandTherosTemplate.jpg
similarity index 100%
rename from proxyshop/img/BasicLandTherosTemplate.jpg
rename to src/img/BasicLandTherosTemplate.jpg
diff --git a/proxyshop/img/BasicLandUnstableTemplate.jpg b/src/img/BasicLandUnstableTemplate.jpg
similarity index 100%
rename from proxyshop/img/BasicLandUnstableTemplate.jpg
rename to src/img/BasicLandUnstableTemplate.jpg
diff --git a/proxyshop/img/ExpeditionTemplate.jpg b/src/img/ExpeditionTemplate.jpg
similarity index 100%
rename from proxyshop/img/ExpeditionTemplate.jpg
rename to src/img/ExpeditionTemplate.jpg
diff --git a/proxyshop/img/InventionTemplate.jpg b/src/img/InventionTemplate.jpg
similarity index 100%
rename from proxyshop/img/InventionTemplate.jpg
rename to src/img/InventionTemplate.jpg
diff --git a/proxyshop/img/IxalanTemplate.jpg b/src/img/IxalanTemplate.jpg
similarity index 100%
rename from proxyshop/img/IxalanTemplate.jpg
rename to src/img/IxalanTemplate.jpg
diff --git a/proxyshop/img/LevelerTemplate.jpg b/src/img/LevelerTemplate.jpg
similarity index 100%
rename from proxyshop/img/LevelerTemplate.jpg
rename to src/img/LevelerTemplate.jpg
diff --git a/proxyshop/img/MDFCFrontTemplate.jpg b/src/img/MDFCFrontTemplate.jpg
similarity index 100%
rename from proxyshop/img/MDFCFrontTemplate.jpg
rename to src/img/MDFCFrontTemplate.jpg
diff --git a/proxyshop/img/MiracleTemplate.jpg b/src/img/MiracleTemplate.jpg
similarity index 100%
rename from proxyshop/img/MiracleTemplate.jpg
rename to src/img/MiracleTemplate.jpg
diff --git a/proxyshop/img/MutateTemplate.jpg b/src/img/MutateTemplate.jpg
similarity index 100%
rename from proxyshop/img/MutateTemplate.jpg
rename to src/img/MutateTemplate.jpg
diff --git a/proxyshop/img/NormalClassicTemplate.jpg b/src/img/NormalClassicTemplate.jpg
similarity index 100%
rename from proxyshop/img/NormalClassicTemplate.jpg
rename to src/img/NormalClassicTemplate.jpg
diff --git a/proxyshop/img/NormalExtendedTemplate.jpg b/src/img/NormalExtendedTemplate.jpg
similarity index 100%
rename from proxyshop/img/NormalExtendedTemplate.jpg
rename to src/img/NormalExtendedTemplate.jpg
diff --git a/proxyshop/img/NormalFullartTemplate.jpg b/src/img/NormalFullartTemplate.jpg
similarity index 100%
rename from proxyshop/img/NormalFullartTemplate.jpg
rename to src/img/NormalFullartTemplate.jpg
diff --git a/proxyshop/img/NormalTemplate.jpg b/src/img/NormalTemplate.jpg
similarity index 100%
rename from proxyshop/img/NormalTemplate.jpg
rename to src/img/NormalTemplate.jpg
diff --git a/proxyshop/img/NotFound.jpg b/src/img/NotFound.jpg
similarity index 100%
rename from proxyshop/img/NotFound.jpg
rename to src/img/NotFound.jpg
diff --git a/proxyshop/img/Overlay.png b/src/img/Overlay.png
similarity index 100%
rename from proxyshop/img/Overlay.png
rename to src/img/Overlay.png
diff --git a/proxyshop/img/PlaneswalkerExtendedTemplate.jpg b/src/img/PlaneswalkerExtendedTemplate.jpg
similarity index 100%
rename from proxyshop/img/PlaneswalkerExtendedTemplate.jpg
rename to src/img/PlaneswalkerExtendedTemplate.jpg
diff --git a/proxyshop/img/PlaneswalkerMDFCFrontExtendedTemplate.jpg b/src/img/PlaneswalkerMDFCFrontExtendedTemplate.jpg
similarity index 100%
rename from proxyshop/img/PlaneswalkerMDFCFrontExtendedTemplate.jpg
rename to src/img/PlaneswalkerMDFCFrontExtendedTemplate.jpg
diff --git a/proxyshop/img/PlaneswalkerMDFCFrontTemplate.jpg b/src/img/PlaneswalkerMDFCFrontTemplate.jpg
similarity index 100%
rename from proxyshop/img/PlaneswalkerMDFCFrontTemplate.jpg
rename to src/img/PlaneswalkerMDFCFrontTemplate.jpg
diff --git a/proxyshop/img/PlaneswalkerTemplate.jpg b/src/img/PlaneswalkerTemplate.jpg
similarity index 100%
rename from proxyshop/img/PlaneswalkerTemplate.jpg
rename to src/img/PlaneswalkerTemplate.jpg
diff --git a/proxyshop/img/PlaneswalkerTransformFrontExtendedTemplate.jpg b/src/img/PlaneswalkerTransformFrontExtendedTemplate.jpg
similarity index 100%
rename from proxyshop/img/PlaneswalkerTransformFrontExtendedTemplate.jpg
rename to src/img/PlaneswalkerTransformFrontExtendedTemplate.jpg
diff --git a/proxyshop/img/PlaneswalkerTransformFrontTemplate.jpg b/src/img/PlaneswalkerTransformFrontTemplate.jpg
similarity index 100%
rename from proxyshop/img/PlaneswalkerTransformFrontTemplate.jpg
rename to src/img/PlaneswalkerTransformFrontTemplate.jpg
diff --git a/proxyshop/img/PrototypeTemplate.jpg b/src/img/PrototypeTemplate.jpg
similarity index 100%
rename from proxyshop/img/PrototypeTemplate.jpg
rename to src/img/PrototypeTemplate.jpg
diff --git a/proxyshop/img/SagaTemplate.jpg b/src/img/SagaTemplate.jpg
similarity index 100%
rename from proxyshop/img/SagaTemplate.jpg
rename to src/img/SagaTemplate.jpg
diff --git a/proxyshop/img/SnowTemplate.jpg b/src/img/SnowTemplate.jpg
similarity index 100%
rename from proxyshop/img/SnowTemplate.jpg
rename to src/img/SnowTemplate.jpg
diff --git a/proxyshop/img/StargazingTemplate.jpg b/src/img/StargazingTemplate.jpg
similarity index 100%
rename from proxyshop/img/StargazingTemplate.jpg
rename to src/img/StargazingTemplate.jpg
diff --git a/proxyshop/img/TransformFrontTemplate.jpg b/src/img/TransformFrontTemplate.jpg
similarity index 100%
rename from proxyshop/img/TransformFrontTemplate.jpg
rename to src/img/TransformFrontTemplate.jpg
diff --git a/src/img/UniversesBeyondTemplate.jpg b/src/img/UniversesBeyondTemplate.jpg
new file mode 100644
index 00000000..c273406f
Binary files /dev/null and b/src/img/UniversesBeyondTemplate.jpg differ
diff --git a/proxyshop/img/WomensDayTemplate.jpg b/src/img/WomensDayTemplate.jpg
similarity index 100%
rename from proxyshop/img/WomensDayTemplate.jpg
rename to src/img/WomensDayTemplate.jpg
diff --git a/proxyshop/img/config.png b/src/img/config.png
similarity index 100%
rename from proxyshop/img/config.png
rename to src/img/config.png
diff --git a/proxyshop/img/favicon.ico b/src/img/favicon.ico
similarity index 100%
rename from proxyshop/img/favicon.ico
rename to src/img/favicon.ico
diff --git a/proxyshop/img/loading.gif b/src/img/loading.gif
similarity index 100%
rename from proxyshop/img/loading.gif
rename to src/img/loading.gif
diff --git a/proxyshop/img/proxyshop.png b/src/img/proxyshop.png
similarity index 100%
rename from proxyshop/img/proxyshop.png
rename to src/img/proxyshop.png
diff --git a/src/img/symbols/10E/80.svg b/src/img/symbols/10E/80.svg
new file mode 100644
index 00000000..c1dca385
--- /dev/null
+++ b/src/img/symbols/10E/80.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/img/symbols/10E/C.svg b/src/img/symbols/10E/C.svg
new file mode 100644
index 00000000..df60fec8
--- /dev/null
+++ b/src/img/symbols/10E/C.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/img/symbols/10E/M.svg b/src/img/symbols/10E/M.svg
new file mode 100644
index 00000000..54fc61df
--- /dev/null
+++ b/src/img/symbols/10E/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/10E/R.svg b/src/img/symbols/10E/R.svg
new file mode 100644
index 00000000..128259b4
--- /dev/null
+++ b/src/img/symbols/10E/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/10E/T.svg b/src/img/symbols/10E/T.svg
new file mode 100644
index 00000000..87be67ea
--- /dev/null
+++ b/src/img/symbols/10E/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/10E/U.svg b/src/img/symbols/10E/U.svg
new file mode 100644
index 00000000..be460345
--- /dev/null
+++ b/src/img/symbols/10E/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/10E/WM.svg b/src/img/symbols/10E/WM.svg
new file mode 100644
index 00000000..1cf58d44
--- /dev/null
+++ b/src/img/symbols/10E/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/2ED/80.svg b/src/img/symbols/2ED/80.svg
new file mode 100644
index 00000000..93653943
--- /dev/null
+++ b/src/img/symbols/2ED/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/2ED/C.svg b/src/img/symbols/2ED/C.svg
new file mode 100644
index 00000000..7156e25a
--- /dev/null
+++ b/src/img/symbols/2ED/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/2ED/M.svg b/src/img/symbols/2ED/M.svg
new file mode 100644
index 00000000..60d4adae
--- /dev/null
+++ b/src/img/symbols/2ED/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/2ED/R.svg b/src/img/symbols/2ED/R.svg
new file mode 100644
index 00000000..d849c31a
--- /dev/null
+++ b/src/img/symbols/2ED/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/2ED/T.svg b/src/img/symbols/2ED/T.svg
new file mode 100644
index 00000000..f050550d
--- /dev/null
+++ b/src/img/symbols/2ED/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/2ED/U.svg b/src/img/symbols/2ED/U.svg
new file mode 100644
index 00000000..0df331d1
--- /dev/null
+++ b/src/img/symbols/2ED/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/2ED/WM.svg b/src/img/symbols/2ED/WM.svg
new file mode 100644
index 00000000..6bb03ae7
--- /dev/null
+++ b/src/img/symbols/2ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/80.svg b/src/img/symbols/2ED_ALT/80.svg
new file mode 100644
index 00000000..1971b4cd
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/C.svg b/src/img/symbols/2ED_ALT/C.svg
new file mode 100644
index 00000000..a0137015
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/M.svg b/src/img/symbols/2ED_ALT/M.svg
new file mode 100644
index 00000000..bcffef55
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/R.svg b/src/img/symbols/2ED_ALT/R.svg
new file mode 100644
index 00000000..decbc72b
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/T.svg b/src/img/symbols/2ED_ALT/T.svg
new file mode 100644
index 00000000..1706b0c1
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/T.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/U.svg b/src/img/symbols/2ED_ALT/U.svg
new file mode 100644
index 00000000..4efd25ff
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/2ED_ALT/WM.svg b/src/img/symbols/2ED_ALT/WM.svg
new file mode 100644
index 00000000..d12a057c
--- /dev/null
+++ b/src/img/symbols/2ED_ALT/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/80.svg b/src/img/symbols/2ED_ALT2/80.svg
new file mode 100644
index 00000000..16d1c031
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/80.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/C.svg b/src/img/symbols/2ED_ALT2/C.svg
new file mode 100644
index 00000000..5b16f828
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/C.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/M.svg b/src/img/symbols/2ED_ALT2/M.svg
new file mode 100644
index 00000000..f661651b
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/R.svg b/src/img/symbols/2ED_ALT2/R.svg
new file mode 100644
index 00000000..f65a4334
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/T.svg b/src/img/symbols/2ED_ALT2/T.svg
new file mode 100644
index 00000000..e951ae2b
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/U.svg b/src/img/symbols/2ED_ALT2/U.svg
new file mode 100644
index 00000000..53bf5a4a
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/2ED_ALT2/WM.svg b/src/img/symbols/2ED_ALT2/WM.svg
new file mode 100644
index 00000000..b7305354
--- /dev/null
+++ b/src/img/symbols/2ED_ALT2/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/2X2/80.svg b/src/img/symbols/2X2/80.svg
new file mode 100644
index 00000000..3dbd8da1
--- /dev/null
+++ b/src/img/symbols/2X2/80.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/2X2/C.svg b/src/img/symbols/2X2/C.svg
new file mode 100644
index 00000000..4f1c36a2
--- /dev/null
+++ b/src/img/symbols/2X2/C.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/2X2/M.svg b/src/img/symbols/2X2/M.svg
new file mode 100644
index 00000000..fb2a4e28
--- /dev/null
+++ b/src/img/symbols/2X2/M.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/src/img/symbols/2X2/R.svg b/src/img/symbols/2X2/R.svg
new file mode 100644
index 00000000..7e223ee1
--- /dev/null
+++ b/src/img/symbols/2X2/R.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/src/img/symbols/2X2/T.svg b/src/img/symbols/2X2/T.svg
new file mode 100644
index 00000000..258d8b6a
--- /dev/null
+++ b/src/img/symbols/2X2/T.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/2X2/U.svg b/src/img/symbols/2X2/U.svg
new file mode 100644
index 00000000..2ab833f9
--- /dev/null
+++ b/src/img/symbols/2X2/U.svg
@@ -0,0 +1,50 @@
+
+
+
+
diff --git a/src/img/symbols/2X2/WM.svg b/src/img/symbols/2X2/WM.svg
new file mode 100644
index 00000000..419da503
--- /dev/null
+++ b/src/img/symbols/2X2/WM.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/src/img/symbols/2XM/80.svg b/src/img/symbols/2XM/80.svg
new file mode 100644
index 00000000..a3a41d73
--- /dev/null
+++ b/src/img/symbols/2XM/80.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/2XM/C.svg b/src/img/symbols/2XM/C.svg
new file mode 100644
index 00000000..59952277
--- /dev/null
+++ b/src/img/symbols/2XM/C.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/2XM/M.svg b/src/img/symbols/2XM/M.svg
new file mode 100644
index 00000000..3e107ad3
--- /dev/null
+++ b/src/img/symbols/2XM/M.svg
@@ -0,0 +1,148 @@
+
+
diff --git a/src/img/symbols/2XM/R.svg b/src/img/symbols/2XM/R.svg
new file mode 100644
index 00000000..5fcd70c8
--- /dev/null
+++ b/src/img/symbols/2XM/R.svg
@@ -0,0 +1,109 @@
+
+
diff --git a/src/img/symbols/2XM/T.svg b/src/img/symbols/2XM/T.svg
new file mode 100644
index 00000000..24c830be
--- /dev/null
+++ b/src/img/symbols/2XM/T.svg
@@ -0,0 +1,109 @@
+
+
diff --git a/src/img/symbols/2XM/U.svg b/src/img/symbols/2XM/U.svg
new file mode 100644
index 00000000..e893f98f
--- /dev/null
+++ b/src/img/symbols/2XM/U.svg
@@ -0,0 +1,109 @@
+
+
diff --git a/src/img/symbols/3ED/80.svg b/src/img/symbols/3ED/80.svg
new file mode 100644
index 00000000..5dc26468
--- /dev/null
+++ b/src/img/symbols/3ED/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/3ED/C.svg b/src/img/symbols/3ED/C.svg
new file mode 100644
index 00000000..0a195e40
--- /dev/null
+++ b/src/img/symbols/3ED/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/3ED/M.svg b/src/img/symbols/3ED/M.svg
new file mode 100644
index 00000000..7f67a994
--- /dev/null
+++ b/src/img/symbols/3ED/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/3ED/R.svg b/src/img/symbols/3ED/R.svg
new file mode 100644
index 00000000..399e2864
--- /dev/null
+++ b/src/img/symbols/3ED/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/3ED/T.svg b/src/img/symbols/3ED/T.svg
new file mode 100644
index 00000000..b033a375
--- /dev/null
+++ b/src/img/symbols/3ED/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/3ED/U.svg b/src/img/symbols/3ED/U.svg
new file mode 100644
index 00000000..c3a62024
--- /dev/null
+++ b/src/img/symbols/3ED/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/3ED/WM.svg b/src/img/symbols/3ED/WM.svg
new file mode 100644
index 00000000..a630272b
--- /dev/null
+++ b/src/img/symbols/3ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/80.svg b/src/img/symbols/3ED_ALT/80.svg
new file mode 100644
index 00000000..0931a962
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/C.svg b/src/img/symbols/3ED_ALT/C.svg
new file mode 100644
index 00000000..467dfd33
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/M.svg b/src/img/symbols/3ED_ALT/M.svg
new file mode 100644
index 00000000..97fec57d
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/R.svg b/src/img/symbols/3ED_ALT/R.svg
new file mode 100644
index 00000000..406bb040
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/T.svg b/src/img/symbols/3ED_ALT/T.svg
new file mode 100644
index 00000000..cf9e8a6c
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/T.svg
@@ -0,0 +1,69 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/U.svg b/src/img/symbols/3ED_ALT/U.svg
new file mode 100644
index 00000000..512ba413
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/3ED_ALT/WM.svg b/src/img/symbols/3ED_ALT/WM.svg
new file mode 100644
index 00000000..d9f66b99
--- /dev/null
+++ b/src/img/symbols/3ED_ALT/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/80.svg b/src/img/symbols/3ED_ALT2/80.svg
new file mode 100644
index 00000000..cb20e5dc
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/C.svg b/src/img/symbols/3ED_ALT2/C.svg
new file mode 100644
index 00000000..d60f5964
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/M.svg b/src/img/symbols/3ED_ALT2/M.svg
new file mode 100644
index 00000000..7b119bf2
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/R.svg b/src/img/symbols/3ED_ALT2/R.svg
new file mode 100644
index 00000000..83d89044
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/T.svg b/src/img/symbols/3ED_ALT2/T.svg
new file mode 100644
index 00000000..338bd5c3
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/U.svg b/src/img/symbols/3ED_ALT2/U.svg
new file mode 100644
index 00000000..b534d9a9
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/3ED_ALT2/WM.svg b/src/img/symbols/3ED_ALT2/WM.svg
new file mode 100644
index 00000000..c2eb1780
--- /dev/null
+++ b/src/img/symbols/3ED_ALT2/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/40K/80.svg b/src/img/symbols/40K/80.svg
new file mode 100644
index 00000000..d823ec88
--- /dev/null
+++ b/src/img/symbols/40K/80.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/src/img/symbols/40K/C.svg b/src/img/symbols/40K/C.svg
new file mode 100644
index 00000000..bb7747ea
--- /dev/null
+++ b/src/img/symbols/40K/C.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/img/symbols/40K/M.svg b/src/img/symbols/40K/M.svg
new file mode 100644
index 00000000..7c293e1b
--- /dev/null
+++ b/src/img/symbols/40K/M.svg
@@ -0,0 +1,63 @@
+
+
+
+
diff --git a/src/img/symbols/40K/R.svg b/src/img/symbols/40K/R.svg
new file mode 100644
index 00000000..99e27ca9
--- /dev/null
+++ b/src/img/symbols/40K/R.svg
@@ -0,0 +1,64 @@
+
+
+
+
diff --git a/src/img/symbols/40K/T.svg b/src/img/symbols/40K/T.svg
new file mode 100644
index 00000000..3e94d7cd
--- /dev/null
+++ b/src/img/symbols/40K/T.svg
@@ -0,0 +1,69 @@
+
+
+
+
diff --git a/src/img/symbols/40K/U.svg b/src/img/symbols/40K/U.svg
new file mode 100644
index 00000000..abb558e1
--- /dev/null
+++ b/src/img/symbols/40K/U.svg
@@ -0,0 +1,63 @@
+
+
+
+
diff --git a/src/img/symbols/40K/WM.svg b/src/img/symbols/40K/WM.svg
new file mode 100644
index 00000000..5c807671
--- /dev/null
+++ b/src/img/symbols/40K/WM.svg
@@ -0,0 +1,33 @@
+
+
+
+
diff --git a/src/img/symbols/4ED/80.svg b/src/img/symbols/4ED/80.svg
new file mode 100644
index 00000000..8e91ade7
--- /dev/null
+++ b/src/img/symbols/4ED/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/4ED/C.svg b/src/img/symbols/4ED/C.svg
new file mode 100644
index 00000000..accae786
--- /dev/null
+++ b/src/img/symbols/4ED/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/4ED/M.svg b/src/img/symbols/4ED/M.svg
new file mode 100644
index 00000000..5e8115e9
--- /dev/null
+++ b/src/img/symbols/4ED/M.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/4ED/R.svg b/src/img/symbols/4ED/R.svg
new file mode 100644
index 00000000..e330bc34
--- /dev/null
+++ b/src/img/symbols/4ED/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/4ED/T.svg b/src/img/symbols/4ED/T.svg
new file mode 100644
index 00000000..95214d1f
--- /dev/null
+++ b/src/img/symbols/4ED/T.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/4ED/U.svg b/src/img/symbols/4ED/U.svg
new file mode 100644
index 00000000..b05249de
--- /dev/null
+++ b/src/img/symbols/4ED/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/4ED/WM.svg b/src/img/symbols/4ED/WM.svg
new file mode 100644
index 00000000..24019051
--- /dev/null
+++ b/src/img/symbols/4ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/80.svg b/src/img/symbols/4ED_ALT/80.svg
new file mode 100644
index 00000000..d991d2cf
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/C.svg b/src/img/symbols/4ED_ALT/C.svg
new file mode 100644
index 00000000..6e932897
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/M.svg b/src/img/symbols/4ED_ALT/M.svg
new file mode 100644
index 00000000..e621d771
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/R.svg b/src/img/symbols/4ED_ALT/R.svg
new file mode 100644
index 00000000..baa2f3bc
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/T.svg b/src/img/symbols/4ED_ALT/T.svg
new file mode 100644
index 00000000..8c051d7f
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/T.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/U.svg b/src/img/symbols/4ED_ALT/U.svg
new file mode 100644
index 00000000..04149091
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/4ED_ALT/WM.svg b/src/img/symbols/4ED_ALT/WM.svg
new file mode 100644
index 00000000..8db162fc
--- /dev/null
+++ b/src/img/symbols/4ED_ALT/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/80.svg b/src/img/symbols/4ED_ALT2/80.svg
new file mode 100644
index 00000000..4e740a7b
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/C.svg b/src/img/symbols/4ED_ALT2/C.svg
new file mode 100644
index 00000000..a822550b
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/M.svg b/src/img/symbols/4ED_ALT2/M.svg
new file mode 100644
index 00000000..aee3f3c6
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/M.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/R.svg b/src/img/symbols/4ED_ALT2/R.svg
new file mode 100644
index 00000000..4c72e756
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/R.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/T.svg b/src/img/symbols/4ED_ALT2/T.svg
new file mode 100644
index 00000000..a11eac6b
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/T.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/U.svg b/src/img/symbols/4ED_ALT2/U.svg
new file mode 100644
index 00000000..c1acb5f7
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/U.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/4ED_ALT2/WM.svg b/src/img/symbols/4ED_ALT2/WM.svg
new file mode 100644
index 00000000..cf4ebe50
--- /dev/null
+++ b/src/img/symbols/4ED_ALT2/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/5DN/80.svg b/src/img/symbols/5DN/80.svg
new file mode 100644
index 00000000..68c4d3c8
--- /dev/null
+++ b/src/img/symbols/5DN/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/5DN/C.svg b/src/img/symbols/5DN/C.svg
new file mode 100644
index 00000000..d4e2bc37
--- /dev/null
+++ b/src/img/symbols/5DN/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/5DN/M.svg b/src/img/symbols/5DN/M.svg
new file mode 100644
index 00000000..5069c54c
--- /dev/null
+++ b/src/img/symbols/5DN/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/5DN/R.svg b/src/img/symbols/5DN/R.svg
new file mode 100644
index 00000000..ac954d9b
--- /dev/null
+++ b/src/img/symbols/5DN/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/5DN/T.svg b/src/img/symbols/5DN/T.svg
new file mode 100644
index 00000000..0792251d
--- /dev/null
+++ b/src/img/symbols/5DN/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/5DN/U.svg b/src/img/symbols/5DN/U.svg
new file mode 100644
index 00000000..b76e3e1c
--- /dev/null
+++ b/src/img/symbols/5DN/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/5DN/WM.svg b/src/img/symbols/5DN/WM.svg
new file mode 100644
index 00000000..8e2c156a
--- /dev/null
+++ b/src/img/symbols/5DN/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/5ED/80.svg b/src/img/symbols/5ED/80.svg
new file mode 100644
index 00000000..9329f424
--- /dev/null
+++ b/src/img/symbols/5ED/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/5ED/C.svg b/src/img/symbols/5ED/C.svg
new file mode 100644
index 00000000..b9df81fe
--- /dev/null
+++ b/src/img/symbols/5ED/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/5ED/M.svg b/src/img/symbols/5ED/M.svg
new file mode 100644
index 00000000..ab990296
--- /dev/null
+++ b/src/img/symbols/5ED/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/5ED/R.svg b/src/img/symbols/5ED/R.svg
new file mode 100644
index 00000000..bee1f463
--- /dev/null
+++ b/src/img/symbols/5ED/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/5ED/T.svg b/src/img/symbols/5ED/T.svg
new file mode 100644
index 00000000..73bba7e0
--- /dev/null
+++ b/src/img/symbols/5ED/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/5ED/U.svg b/src/img/symbols/5ED/U.svg
new file mode 100644
index 00000000..efa7161b
--- /dev/null
+++ b/src/img/symbols/5ED/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/5ED/WM.svg b/src/img/symbols/5ED/WM.svg
new file mode 100644
index 00000000..c8fa2a9d
--- /dev/null
+++ b/src/img/symbols/5ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/6ED/80.svg b/src/img/symbols/6ED/80.svg
new file mode 100644
index 00000000..82d6b2ca
--- /dev/null
+++ b/src/img/symbols/6ED/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/6ED/C.svg b/src/img/symbols/6ED/C.svg
new file mode 100644
index 00000000..571404e0
--- /dev/null
+++ b/src/img/symbols/6ED/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/6ED/M.svg b/src/img/symbols/6ED/M.svg
new file mode 100644
index 00000000..1e3c7396
--- /dev/null
+++ b/src/img/symbols/6ED/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/6ED/R.svg b/src/img/symbols/6ED/R.svg
new file mode 100644
index 00000000..969b8c64
--- /dev/null
+++ b/src/img/symbols/6ED/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/6ED/T.svg b/src/img/symbols/6ED/T.svg
new file mode 100644
index 00000000..b6160e93
--- /dev/null
+++ b/src/img/symbols/6ED/T.svg
@@ -0,0 +1,72 @@
+
+
diff --git a/src/img/symbols/6ED/U.svg b/src/img/symbols/6ED/U.svg
new file mode 100644
index 00000000..f31fc20a
--- /dev/null
+++ b/src/img/symbols/6ED/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/6ED/WM.svg b/src/img/symbols/6ED/WM.svg
new file mode 100644
index 00000000..4a02eee0
--- /dev/null
+++ b/src/img/symbols/6ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/7ED/80.svg b/src/img/symbols/7ED/80.svg
new file mode 100644
index 00000000..89f1c3aa
--- /dev/null
+++ b/src/img/symbols/7ED/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/7ED/C.svg b/src/img/symbols/7ED/C.svg
new file mode 100644
index 00000000..89e1b21f
--- /dev/null
+++ b/src/img/symbols/7ED/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/7ED/M.svg b/src/img/symbols/7ED/M.svg
new file mode 100644
index 00000000..2a90ed93
--- /dev/null
+++ b/src/img/symbols/7ED/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/7ED/R.svg b/src/img/symbols/7ED/R.svg
new file mode 100644
index 00000000..d1fa65cc
--- /dev/null
+++ b/src/img/symbols/7ED/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/7ED/T.svg b/src/img/symbols/7ED/T.svg
new file mode 100644
index 00000000..0d0c3d3f
--- /dev/null
+++ b/src/img/symbols/7ED/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/7ED/U.svg b/src/img/symbols/7ED/U.svg
new file mode 100644
index 00000000..4eda6aa2
--- /dev/null
+++ b/src/img/symbols/7ED/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/7ED/WM.svg b/src/img/symbols/7ED/WM.svg
new file mode 100644
index 00000000..208e9cf2
--- /dev/null
+++ b/src/img/symbols/7ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/8ED/80.svg b/src/img/symbols/8ED/80.svg
new file mode 100644
index 00000000..86787283
--- /dev/null
+++ b/src/img/symbols/8ED/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/8ED/C.svg b/src/img/symbols/8ED/C.svg
new file mode 100644
index 00000000..7f511b4d
--- /dev/null
+++ b/src/img/symbols/8ED/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/8ED/M.svg b/src/img/symbols/8ED/M.svg
new file mode 100644
index 00000000..bc693133
--- /dev/null
+++ b/src/img/symbols/8ED/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/8ED/R.svg b/src/img/symbols/8ED/R.svg
new file mode 100644
index 00000000..c1874b70
--- /dev/null
+++ b/src/img/symbols/8ED/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/8ED/T.svg b/src/img/symbols/8ED/T.svg
new file mode 100644
index 00000000..4697b055
--- /dev/null
+++ b/src/img/symbols/8ED/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/8ED/U.svg b/src/img/symbols/8ED/U.svg
new file mode 100644
index 00000000..46b01e7f
--- /dev/null
+++ b/src/img/symbols/8ED/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/8ED/WM.svg b/src/img/symbols/8ED/WM.svg
new file mode 100644
index 00000000..5857d017
--- /dev/null
+++ b/src/img/symbols/8ED/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/9ED/80.svg b/src/img/symbols/9ED/80.svg
new file mode 100644
index 00000000..c9671749
--- /dev/null
+++ b/src/img/symbols/9ED/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/9ED/C.svg b/src/img/symbols/9ED/C.svg
new file mode 100644
index 00000000..6a9d4c67
--- /dev/null
+++ b/src/img/symbols/9ED/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/9ED/M.svg b/src/img/symbols/9ED/M.svg
new file mode 100644
index 00000000..67deabbc
--- /dev/null
+++ b/src/img/symbols/9ED/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/9ED/R.svg b/src/img/symbols/9ED/R.svg
new file mode 100644
index 00000000..3ed8161f
--- /dev/null
+++ b/src/img/symbols/9ED/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/9ED/T.svg b/src/img/symbols/9ED/T.svg
new file mode 100644
index 00000000..f9ef9be7
--- /dev/null
+++ b/src/img/symbols/9ED/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/9ED/U.svg b/src/img/symbols/9ED/U.svg
new file mode 100644
index 00000000..1450c3da
--- /dev/null
+++ b/src/img/symbols/9ED/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/9ED/WM.svg b/src/img/symbols/9ED/WM.svg
new file mode 100644
index 00000000..7c79f309
--- /dev/null
+++ b/src/img/symbols/9ED/WM.svg
@@ -0,0 +1,3 @@
+
+
diff --git a/src/img/symbols/A22/C.svg b/src/img/symbols/A22/C.svg
new file mode 100644
index 00000000..84087a95
--- /dev/null
+++ b/src/img/symbols/A22/C.svg
@@ -0,0 +1,36 @@
+
+
+
+
diff --git a/src/img/symbols/A22/LOGO.svg b/src/img/symbols/A22/LOGO.svg
new file mode 100644
index 00000000..f871d739
--- /dev/null
+++ b/src/img/symbols/A22/LOGO.svg
@@ -0,0 +1,38 @@
+
+
+
+
diff --git a/src/img/symbols/A22/M.svg b/src/img/symbols/A22/M.svg
new file mode 100644
index 00000000..e526fef9
--- /dev/null
+++ b/src/img/symbols/A22/M.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/A22/R.svg b/src/img/symbols/A22/R.svg
new file mode 100644
index 00000000..5fdc6e93
--- /dev/null
+++ b/src/img/symbols/A22/R.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/A22/U.svg b/src/img/symbols/A22/U.svg
new file mode 100644
index 00000000..e7919854
--- /dev/null
+++ b/src/img/symbols/A22/U.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/A22/WM.svg b/src/img/symbols/A22/WM.svg
new file mode 100644
index 00000000..ecd534ed
--- /dev/null
+++ b/src/img/symbols/A22/WM.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/src/img/symbols/A23/C.svg b/src/img/symbols/A23/C.svg
new file mode 100644
index 00000000..7e6b146a
--- /dev/null
+++ b/src/img/symbols/A23/C.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/A23/M.svg b/src/img/symbols/A23/M.svg
new file mode 100644
index 00000000..2be191c8
--- /dev/null
+++ b/src/img/symbols/A23/M.svg
@@ -0,0 +1,67 @@
+
+
+
+
diff --git a/src/img/symbols/A23/R.svg b/src/img/symbols/A23/R.svg
new file mode 100644
index 00000000..209b4659
--- /dev/null
+++ b/src/img/symbols/A23/R.svg
@@ -0,0 +1,65 @@
+
+
+
+
diff --git a/src/img/symbols/A23/U.svg b/src/img/symbols/A23/U.svg
new file mode 100644
index 00000000..e2b61eb4
--- /dev/null
+++ b/src/img/symbols/A23/U.svg
@@ -0,0 +1,66 @@
+
+
+
+
diff --git a/src/img/symbols/A25/80.svg b/src/img/symbols/A25/80.svg
new file mode 100644
index 00000000..121d9665
--- /dev/null
+++ b/src/img/symbols/A25/80.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/A25/C.svg b/src/img/symbols/A25/C.svg
new file mode 100644
index 00000000..3a6e5849
--- /dev/null
+++ b/src/img/symbols/A25/C.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/A25/M.svg b/src/img/symbols/A25/M.svg
new file mode 100644
index 00000000..4cc6679a
--- /dev/null
+++ b/src/img/symbols/A25/M.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/A25/R.svg b/src/img/symbols/A25/R.svg
new file mode 100644
index 00000000..71b96753
--- /dev/null
+++ b/src/img/symbols/A25/R.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/A25/T.svg b/src/img/symbols/A25/T.svg
new file mode 100644
index 00000000..4e859679
--- /dev/null
+++ b/src/img/symbols/A25/T.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/A25/U.svg b/src/img/symbols/A25/U.svg
new file mode 100644
index 00000000..552b8ebf
--- /dev/null
+++ b/src/img/symbols/A25/U.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/src/img/symbols/A25/WM.svg b/src/img/symbols/A25/WM.svg
new file mode 100644
index 00000000..eb8aa5fb
--- /dev/null
+++ b/src/img/symbols/A25/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/AER/80.svg b/src/img/symbols/AER/80.svg
new file mode 100644
index 00000000..1c45d44a
--- /dev/null
+++ b/src/img/symbols/AER/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/AER/C.svg b/src/img/symbols/AER/C.svg
new file mode 100644
index 00000000..1ca0e3d3
--- /dev/null
+++ b/src/img/symbols/AER/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/AER/M.svg b/src/img/symbols/AER/M.svg
new file mode 100644
index 00000000..72e4fe4f
--- /dev/null
+++ b/src/img/symbols/AER/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/AER/R.svg b/src/img/symbols/AER/R.svg
new file mode 100644
index 00000000..8e01d6a0
--- /dev/null
+++ b/src/img/symbols/AER/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/AER/T.svg b/src/img/symbols/AER/T.svg
new file mode 100644
index 00000000..e69ecc7c
--- /dev/null
+++ b/src/img/symbols/AER/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/AER/U.svg b/src/img/symbols/AER/U.svg
new file mode 100644
index 00000000..ad931804
--- /dev/null
+++ b/src/img/symbols/AER/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/AER/Watermark - M25.svg b/src/img/symbols/AER/Watermark - M25.svg
new file mode 100644
index 00000000..16833894
--- /dev/null
+++ b/src/img/symbols/AER/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/AFC/80.svg b/src/img/symbols/AFC/80.svg
new file mode 100644
index 00000000..1dff118e
--- /dev/null
+++ b/src/img/symbols/AFC/80.svg
@@ -0,0 +1,41 @@
+
+
+
+
diff --git a/src/img/symbols/AFC/C.svg b/src/img/symbols/AFC/C.svg
new file mode 100644
index 00000000..3d226725
--- /dev/null
+++ b/src/img/symbols/AFC/C.svg
@@ -0,0 +1,41 @@
+
+
+
+
diff --git a/src/img/symbols/AFC/M.svg b/src/img/symbols/AFC/M.svg
new file mode 100644
index 00000000..bf4289b8
--- /dev/null
+++ b/src/img/symbols/AFC/M.svg
@@ -0,0 +1,53 @@
+
+
+
diff --git a/src/img/symbols/AFC/R.svg b/src/img/symbols/AFC/R.svg
new file mode 100644
index 00000000..f94b8d8c
--- /dev/null
+++ b/src/img/symbols/AFC/R.svg
@@ -0,0 +1,53 @@
+
+
+
diff --git a/src/img/symbols/AFC/T.svg b/src/img/symbols/AFC/T.svg
new file mode 100644
index 00000000..56e7d659
--- /dev/null
+++ b/src/img/symbols/AFC/T.svg
@@ -0,0 +1,84 @@
+
+
+
+
diff --git a/src/img/symbols/AFC/U.svg b/src/img/symbols/AFC/U.svg
new file mode 100644
index 00000000..35a214bb
--- /dev/null
+++ b/src/img/symbols/AFC/U.svg
@@ -0,0 +1,53 @@
+
+
+
diff --git a/src/img/symbols/AFC/WM.svg b/src/img/symbols/AFC/WM.svg
new file mode 100644
index 00000000..4f9eace9
--- /dev/null
+++ b/src/img/symbols/AFC/WM.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/80.svg b/src/img/symbols/AFR/80.svg
new file mode 100644
index 00000000..ae9edb49
--- /dev/null
+++ b/src/img/symbols/AFR/80.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/C.svg b/src/img/symbols/AFR/C.svg
new file mode 100644
index 00000000..ffdfe6ad
--- /dev/null
+++ b/src/img/symbols/AFR/C.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/M.svg b/src/img/symbols/AFR/M.svg
new file mode 100644
index 00000000..be6ac894
--- /dev/null
+++ b/src/img/symbols/AFR/M.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/R.svg b/src/img/symbols/AFR/R.svg
new file mode 100644
index 00000000..67002690
--- /dev/null
+++ b/src/img/symbols/AFR/R.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/T.svg b/src/img/symbols/AFR/T.svg
new file mode 100644
index 00000000..67296e50
--- /dev/null
+++ b/src/img/symbols/AFR/T.svg
@@ -0,0 +1,130 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/U.svg b/src/img/symbols/AFR/U.svg
new file mode 100644
index 00000000..f845f21e
--- /dev/null
+++ b/src/img/symbols/AFR/U.svg
@@ -0,0 +1,50 @@
+
+
+
+
diff --git a/src/img/symbols/AFR/WM.svg b/src/img/symbols/AFR/WM.svg
new file mode 100644
index 00000000..3a12285e
--- /dev/null
+++ b/src/img/symbols/AFR/WM.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/img/symbols/AKH/80.svg b/src/img/symbols/AKH/80.svg
new file mode 100644
index 00000000..6160076e
--- /dev/null
+++ b/src/img/symbols/AKH/80.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/AKH/C.svg b/src/img/symbols/AKH/C.svg
new file mode 100644
index 00000000..232f5795
--- /dev/null
+++ b/src/img/symbols/AKH/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/AKH/M.svg b/src/img/symbols/AKH/M.svg
new file mode 100644
index 00000000..3dc7210d
--- /dev/null
+++ b/src/img/symbols/AKH/M.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/AKH/R.svg b/src/img/symbols/AKH/R.svg
new file mode 100644
index 00000000..1bf94742
--- /dev/null
+++ b/src/img/symbols/AKH/R.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/AKH/T.svg b/src/img/symbols/AKH/T.svg
new file mode 100644
index 00000000..a271bbdc
--- /dev/null
+++ b/src/img/symbols/AKH/T.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/AKH/U.svg b/src/img/symbols/AKH/U.svg
new file mode 100644
index 00000000..d133475d
--- /dev/null
+++ b/src/img/symbols/AKH/U.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/AKH/WM.svg b/src/img/symbols/AKH/WM.svg
new file mode 100644
index 00000000..2f5fbd55
--- /dev/null
+++ b/src/img/symbols/AKH/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/AKH/Watermark - M25.svg b/src/img/symbols/AKH/Watermark - M25.svg
new file mode 100644
index 00000000..c312455b
--- /dev/null
+++ b/src/img/symbols/AKH/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/ALA/80.svg b/src/img/symbols/ALA/80.svg
new file mode 100644
index 00000000..6305c424
--- /dev/null
+++ b/src/img/symbols/ALA/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ALA/C.svg b/src/img/symbols/ALA/C.svg
new file mode 100644
index 00000000..24c010da
--- /dev/null
+++ b/src/img/symbols/ALA/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ALA/M.svg b/src/img/symbols/ALA/M.svg
new file mode 100644
index 00000000..e46621ad
--- /dev/null
+++ b/src/img/symbols/ALA/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/ALA/R.svg b/src/img/symbols/ALA/R.svg
new file mode 100644
index 00000000..db57a615
--- /dev/null
+++ b/src/img/symbols/ALA/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ALA/T.svg b/src/img/symbols/ALA/T.svg
new file mode 100644
index 00000000..c01b1cd9
--- /dev/null
+++ b/src/img/symbols/ALA/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ALA/U.svg b/src/img/symbols/ALA/U.svg
new file mode 100644
index 00000000..063c6031
--- /dev/null
+++ b/src/img/symbols/ALA/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ALA/WM.svg b/src/img/symbols/ALA/WM.svg
new file mode 100644
index 00000000..2b482a11
--- /dev/null
+++ b/src/img/symbols/ALA/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ALL/80.svg b/src/img/symbols/ALL/80.svg
new file mode 100644
index 00000000..2dd3586d
--- /dev/null
+++ b/src/img/symbols/ALL/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ALL/C - Original.svg b/src/img/symbols/ALL/C - Original.svg
new file mode 100644
index 00000000..0baa0478
--- /dev/null
+++ b/src/img/symbols/ALL/C - Original.svg
@@ -0,0 +1,41 @@
+
+
diff --git a/src/img/symbols/ALL/C.svg b/src/img/symbols/ALL/C.svg
new file mode 100644
index 00000000..c54647bc
--- /dev/null
+++ b/src/img/symbols/ALL/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ALL/M.svg b/src/img/symbols/ALL/M.svg
new file mode 100644
index 00000000..ba404955
--- /dev/null
+++ b/src/img/symbols/ALL/M.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/ALL/R.svg b/src/img/symbols/ALL/R.svg
new file mode 100644
index 00000000..435a91b3
--- /dev/null
+++ b/src/img/symbols/ALL/R.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/ALL/T.svg b/src/img/symbols/ALL/T.svg
new file mode 100644
index 00000000..93beacb7
--- /dev/null
+++ b/src/img/symbols/ALL/T.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/ALL/U.svg b/src/img/symbols/ALL/U.svg
new file mode 100644
index 00000000..7a7f76a8
--- /dev/null
+++ b/src/img/symbols/ALL/U.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/ALL/WM.svg b/src/img/symbols/ALL/WM.svg
new file mode 100644
index 00000000..d4ccdf6e
--- /dev/null
+++ b/src/img/symbols/ALL/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ALL/Watermark - M25.svg b/src/img/symbols/ALL/Watermark - M25.svg
new file mode 100644
index 00000000..89369545
--- /dev/null
+++ b/src/img/symbols/ALL/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/ANA/80.svg b/src/img/symbols/ANA/80.svg
new file mode 100644
index 00000000..ddbb83d9
--- /dev/null
+++ b/src/img/symbols/ANA/80.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/ANA/C.svg b/src/img/symbols/ANA/C.svg
new file mode 100644
index 00000000..b642cc33
--- /dev/null
+++ b/src/img/symbols/ANA/C.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/ANA/M.svg b/src/img/symbols/ANA/M.svg
new file mode 100644
index 00000000..de016f96
--- /dev/null
+++ b/src/img/symbols/ANA/M.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/src/img/symbols/ANA/R.svg b/src/img/symbols/ANA/R.svg
new file mode 100644
index 00000000..d0e7e08f
--- /dev/null
+++ b/src/img/symbols/ANA/R.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/ANA/T.svg b/src/img/symbols/ANA/T.svg
new file mode 100644
index 00000000..5f833aba
--- /dev/null
+++ b/src/img/symbols/ANA/T.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/ANA/U.svg b/src/img/symbols/ANA/U.svg
new file mode 100644
index 00000000..edd69834
--- /dev/null
+++ b/src/img/symbols/ANA/U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/ANA/WM.svg b/src/img/symbols/ANA/WM.svg
new file mode 100644
index 00000000..933c804b
--- /dev/null
+++ b/src/img/symbols/ANA/WM.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/APC/80.svg b/src/img/symbols/APC/80.svg
new file mode 100644
index 00000000..996143ee
--- /dev/null
+++ b/src/img/symbols/APC/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/APC/C.svg b/src/img/symbols/APC/C.svg
new file mode 100644
index 00000000..cfcd16ad
--- /dev/null
+++ b/src/img/symbols/APC/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/APC/M.svg b/src/img/symbols/APC/M.svg
new file mode 100644
index 00000000..73ef5b6d
--- /dev/null
+++ b/src/img/symbols/APC/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/APC/R.svg b/src/img/symbols/APC/R.svg
new file mode 100644
index 00000000..d3611d76
--- /dev/null
+++ b/src/img/symbols/APC/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/APC/T.svg b/src/img/symbols/APC/T.svg
new file mode 100644
index 00000000..fda1a4fe
--- /dev/null
+++ b/src/img/symbols/APC/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/APC/U.svg b/src/img/symbols/APC/U.svg
new file mode 100644
index 00000000..26afa920
--- /dev/null
+++ b/src/img/symbols/APC/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/APC/Watermark - M25.svg b/src/img/symbols/APC/Watermark - M25.svg
new file mode 100644
index 00000000..c84e1b9a
--- /dev/null
+++ b/src/img/symbols/APC/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ARB/80.svg b/src/img/symbols/ARB/80.svg
new file mode 100644
index 00000000..ac437947
--- /dev/null
+++ b/src/img/symbols/ARB/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ARB/C.svg b/src/img/symbols/ARB/C.svg
new file mode 100644
index 00000000..69ce021b
--- /dev/null
+++ b/src/img/symbols/ARB/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ARB/M.svg b/src/img/symbols/ARB/M.svg
new file mode 100644
index 00000000..f2f4f7ff
--- /dev/null
+++ b/src/img/symbols/ARB/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/ARB/R.svg b/src/img/symbols/ARB/R.svg
new file mode 100644
index 00000000..545acdf3
--- /dev/null
+++ b/src/img/symbols/ARB/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARB/T.svg b/src/img/symbols/ARB/T.svg
new file mode 100644
index 00000000..28f36445
--- /dev/null
+++ b/src/img/symbols/ARB/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARB/U.svg b/src/img/symbols/ARB/U.svg
new file mode 100644
index 00000000..0e231ea3
--- /dev/null
+++ b/src/img/symbols/ARB/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARB/Watermark - M25.svg b/src/img/symbols/ARB/Watermark - M25.svg
new file mode 100644
index 00000000..5c38438f
--- /dev/null
+++ b/src/img/symbols/ARB/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ARC/80.svg b/src/img/symbols/ARC/80.svg
new file mode 100644
index 00000000..3567639e
--- /dev/null
+++ b/src/img/symbols/ARC/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ARC/C.svg b/src/img/symbols/ARC/C.svg
new file mode 100644
index 00000000..44906dc6
--- /dev/null
+++ b/src/img/symbols/ARC/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ARC/M.svg b/src/img/symbols/ARC/M.svg
new file mode 100644
index 00000000..2afe03f2
--- /dev/null
+++ b/src/img/symbols/ARC/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARC/R.svg b/src/img/symbols/ARC/R.svg
new file mode 100644
index 00000000..1b6a2b0a
--- /dev/null
+++ b/src/img/symbols/ARC/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARC/T.svg b/src/img/symbols/ARC/T.svg
new file mode 100644
index 00000000..ba35b1cf
--- /dev/null
+++ b/src/img/symbols/ARC/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARC/U.svg b/src/img/symbols/ARC/U.svg
new file mode 100644
index 00000000..b2babd1d
--- /dev/null
+++ b/src/img/symbols/ARC/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ARC/WM.svg b/src/img/symbols/ARC/WM.svg
new file mode 100644
index 00000000..1872f612
--- /dev/null
+++ b/src/img/symbols/ARC/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ARN/80.svg b/src/img/symbols/ARN/80.svg
new file mode 100644
index 00000000..05948718
--- /dev/null
+++ b/src/img/symbols/ARN/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ARN/C - Original.svg b/src/img/symbols/ARN/C - Original.svg
new file mode 100644
index 00000000..644c2936
--- /dev/null
+++ b/src/img/symbols/ARN/C - Original.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/ARN/C.svg b/src/img/symbols/ARN/C.svg
new file mode 100644
index 00000000..deae2e96
--- /dev/null
+++ b/src/img/symbols/ARN/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ARN/M.svg b/src/img/symbols/ARN/M.svg
new file mode 100644
index 00000000..d8215341
--- /dev/null
+++ b/src/img/symbols/ARN/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ARN/R.svg b/src/img/symbols/ARN/R.svg
new file mode 100644
index 00000000..27da8105
--- /dev/null
+++ b/src/img/symbols/ARN/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ARN/T.svg b/src/img/symbols/ARN/T.svg
new file mode 100644
index 00000000..8386dabb
--- /dev/null
+++ b/src/img/symbols/ARN/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ARN/U.svg b/src/img/symbols/ARN/U.svg
new file mode 100644
index 00000000..4936e456
--- /dev/null
+++ b/src/img/symbols/ARN/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ARN/Watermark - M25.svg b/src/img/symbols/ARN/Watermark - M25.svg
new file mode 100644
index 00000000..1c3d4cfd
--- /dev/null
+++ b/src/img/symbols/ARN/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/ATH/80.svg b/src/img/symbols/ATH/80.svg
new file mode 100644
index 00000000..202b8ebb
--- /dev/null
+++ b/src/img/symbols/ATH/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ATH/C.svg b/src/img/symbols/ATH/C.svg
new file mode 100644
index 00000000..7bdfb25e
--- /dev/null
+++ b/src/img/symbols/ATH/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ATH/M.svg b/src/img/symbols/ATH/M.svg
new file mode 100644
index 00000000..14fecde0
--- /dev/null
+++ b/src/img/symbols/ATH/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATH/R.svg b/src/img/symbols/ATH/R.svg
new file mode 100644
index 00000000..2a91973d
--- /dev/null
+++ b/src/img/symbols/ATH/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATH/T.svg b/src/img/symbols/ATH/T.svg
new file mode 100644
index 00000000..460e8e38
--- /dev/null
+++ b/src/img/symbols/ATH/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATH/U.svg b/src/img/symbols/ATH/U.svg
new file mode 100644
index 00000000..b2be0a5f
--- /dev/null
+++ b/src/img/symbols/ATH/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATH/WM.svg b/src/img/symbols/ATH/WM.svg
new file mode 100644
index 00000000..56600298
--- /dev/null
+++ b/src/img/symbols/ATH/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ATQ/80.svg b/src/img/symbols/ATQ/80.svg
new file mode 100644
index 00000000..cbe69515
--- /dev/null
+++ b/src/img/symbols/ATQ/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ATQ/C - Original.svg b/src/img/symbols/ATQ/C - Original.svg
new file mode 100644
index 00000000..15942bfd
--- /dev/null
+++ b/src/img/symbols/ATQ/C - Original.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ATQ/C.svg b/src/img/symbols/ATQ/C.svg
new file mode 100644
index 00000000..8171f709
--- /dev/null
+++ b/src/img/symbols/ATQ/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ATQ/M.svg b/src/img/symbols/ATQ/M.svg
new file mode 100644
index 00000000..bde4a372
--- /dev/null
+++ b/src/img/symbols/ATQ/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATQ/R.svg b/src/img/symbols/ATQ/R.svg
new file mode 100644
index 00000000..c2d11206
--- /dev/null
+++ b/src/img/symbols/ATQ/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATQ/T.svg b/src/img/symbols/ATQ/T.svg
new file mode 100644
index 00000000..27032915
--- /dev/null
+++ b/src/img/symbols/ATQ/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATQ/U.svg b/src/img/symbols/ATQ/U.svg
new file mode 100644
index 00000000..b55b0210
--- /dev/null
+++ b/src/img/symbols/ATQ/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ATQ/WM.svg b/src/img/symbols/ATQ/WM.svg
new file mode 100644
index 00000000..598999a5
--- /dev/null
+++ b/src/img/symbols/ATQ/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ATQ/Watermark - M25.svg b/src/img/symbols/ATQ/Watermark - M25.svg
new file mode 100644
index 00000000..4ad31d2a
--- /dev/null
+++ b/src/img/symbols/ATQ/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/AVR/80.svg b/src/img/symbols/AVR/80.svg
new file mode 100644
index 00000000..adbb09df
--- /dev/null
+++ b/src/img/symbols/AVR/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/AVR/C.svg b/src/img/symbols/AVR/C.svg
new file mode 100644
index 00000000..58a5c652
--- /dev/null
+++ b/src/img/symbols/AVR/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/AVR/M.svg b/src/img/symbols/AVR/M.svg
new file mode 100644
index 00000000..b7d308b6
--- /dev/null
+++ b/src/img/symbols/AVR/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/AVR/R.svg b/src/img/symbols/AVR/R.svg
new file mode 100644
index 00000000..5edb1e1f
--- /dev/null
+++ b/src/img/symbols/AVR/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/AVR/T.svg b/src/img/symbols/AVR/T.svg
new file mode 100644
index 00000000..050acb91
--- /dev/null
+++ b/src/img/symbols/AVR/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/AVR/U.svg b/src/img/symbols/AVR/U.svg
new file mode 100644
index 00000000..0f3e6186
--- /dev/null
+++ b/src/img/symbols/AVR/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/AVR/WM.svg b/src/img/symbols/AVR/WM.svg
new file mode 100644
index 00000000..d8d02b7b
--- /dev/null
+++ b/src/img/symbols/AVR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/Arena/80.svg b/src/img/symbols/Arena/80.svg
new file mode 100644
index 00000000..5e562a2f
--- /dev/null
+++ b/src/img/symbols/Arena/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/Arena/C.svg b/src/img/symbols/Arena/C.svg
new file mode 100644
index 00000000..52eb9406
--- /dev/null
+++ b/src/img/symbols/Arena/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/Arena/M.svg b/src/img/symbols/Arena/M.svg
new file mode 100644
index 00000000..ffe39538
--- /dev/null
+++ b/src/img/symbols/Arena/M.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/Arena/R.svg b/src/img/symbols/Arena/R.svg
new file mode 100644
index 00000000..adb76dd5
--- /dev/null
+++ b/src/img/symbols/Arena/R.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/Arena/S.svg b/src/img/symbols/Arena/S.svg
new file mode 100644
index 00000000..a4cae234
--- /dev/null
+++ b/src/img/symbols/Arena/S.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/Arena/T.svg b/src/img/symbols/Arena/T.svg
new file mode 100644
index 00000000..82143e0c
--- /dev/null
+++ b/src/img/symbols/Arena/T.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/Arena/U.svg b/src/img/symbols/Arena/U.svg
new file mode 100644
index 00000000..bba82ab9
--- /dev/null
+++ b/src/img/symbols/Arena/U.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/Arena/WM.svg b/src/img/symbols/Arena/WM.svg
new file mode 100644
index 00000000..ac2c3319
--- /dev/null
+++ b/src/img/symbols/Arena/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/Astral/80.svg b/src/img/symbols/Astral/80.svg
new file mode 100644
index 00000000..ab30df67
--- /dev/null
+++ b/src/img/symbols/Astral/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Astral/C.svg b/src/img/symbols/Astral/C.svg
new file mode 100644
index 00000000..8fc96a1f
--- /dev/null
+++ b/src/img/symbols/Astral/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Astral/M.svg b/src/img/symbols/Astral/M.svg
new file mode 100644
index 00000000..2c97aff8
--- /dev/null
+++ b/src/img/symbols/Astral/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Astral/R.svg b/src/img/symbols/Astral/R.svg
new file mode 100644
index 00000000..08a9ec7a
--- /dev/null
+++ b/src/img/symbols/Astral/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Astral/T.svg b/src/img/symbols/Astral/T.svg
new file mode 100644
index 00000000..0b1ed94c
--- /dev/null
+++ b/src/img/symbols/Astral/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Astral/U.svg b/src/img/symbols/Astral/U.svg
new file mode 100644
index 00000000..651322ee
--- /dev/null
+++ b/src/img/symbols/Astral/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Astral/WM.svg b/src/img/symbols/Astral/WM.svg
new file mode 100644
index 00000000..ffe9ca11
--- /dev/null
+++ b/src/img/symbols/Astral/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/BBD/80.svg b/src/img/symbols/BBD/80.svg
new file mode 100644
index 00000000..bdf7384f
--- /dev/null
+++ b/src/img/symbols/BBD/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/BBD/C.svg b/src/img/symbols/BBD/C.svg
new file mode 100644
index 00000000..6b28d5da
--- /dev/null
+++ b/src/img/symbols/BBD/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/BBD/M.svg b/src/img/symbols/BBD/M.svg
new file mode 100644
index 00000000..3d01cdf5
--- /dev/null
+++ b/src/img/symbols/BBD/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/BBD/R.svg b/src/img/symbols/BBD/R.svg
new file mode 100644
index 00000000..b233d5ae
--- /dev/null
+++ b/src/img/symbols/BBD/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/BBD/T.svg b/src/img/symbols/BBD/T.svg
new file mode 100644
index 00000000..e60e8c83
--- /dev/null
+++ b/src/img/symbols/BBD/T.svg
@@ -0,0 +1,63 @@
+
+
diff --git a/src/img/symbols/BBD/U.svg b/src/img/symbols/BBD/U.svg
new file mode 100644
index 00000000..ff3cb19c
--- /dev/null
+++ b/src/img/symbols/BBD/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/BBD/WM.svg b/src/img/symbols/BBD/WM.svg
new file mode 100644
index 00000000..d4eb69f3
--- /dev/null
+++ b/src/img/symbols/BBD/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/BFZ/80.svg b/src/img/symbols/BFZ/80.svg
new file mode 100644
index 00000000..013129f5
--- /dev/null
+++ b/src/img/symbols/BFZ/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/BFZ/C.svg b/src/img/symbols/BFZ/C.svg
new file mode 100644
index 00000000..6d6161ce
--- /dev/null
+++ b/src/img/symbols/BFZ/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/BFZ/M.svg b/src/img/symbols/BFZ/M.svg
new file mode 100644
index 00000000..2214bdfc
--- /dev/null
+++ b/src/img/symbols/BFZ/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BFZ/R.svg b/src/img/symbols/BFZ/R.svg
new file mode 100644
index 00000000..854e35fb
--- /dev/null
+++ b/src/img/symbols/BFZ/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BFZ/T.svg b/src/img/symbols/BFZ/T.svg
new file mode 100644
index 00000000..5e25122e
--- /dev/null
+++ b/src/img/symbols/BFZ/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BFZ/U.svg b/src/img/symbols/BFZ/U.svg
new file mode 100644
index 00000000..32785a7a
--- /dev/null
+++ b/src/img/symbols/BFZ/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BFZ/Watermark - M25.svg b/src/img/symbols/BFZ/Watermark - M25.svg
new file mode 100644
index 00000000..a1526b06
--- /dev/null
+++ b/src/img/symbols/BFZ/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/BNG/80.svg b/src/img/symbols/BNG/80.svg
new file mode 100644
index 00000000..f2d0981a
--- /dev/null
+++ b/src/img/symbols/BNG/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/BNG/C.svg b/src/img/symbols/BNG/C.svg
new file mode 100644
index 00000000..d879d929
--- /dev/null
+++ b/src/img/symbols/BNG/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/BNG/M.svg b/src/img/symbols/BNG/M.svg
new file mode 100644
index 00000000..3e057515
--- /dev/null
+++ b/src/img/symbols/BNG/M.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/BNG/R.svg b/src/img/symbols/BNG/R.svg
new file mode 100644
index 00000000..f7b6ba51
--- /dev/null
+++ b/src/img/symbols/BNG/R.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/BNG/T.svg b/src/img/symbols/BNG/T.svg
new file mode 100644
index 00000000..fbdec216
--- /dev/null
+++ b/src/img/symbols/BNG/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/BNG/U.svg b/src/img/symbols/BNG/U.svg
new file mode 100644
index 00000000..e5689af2
--- /dev/null
+++ b/src/img/symbols/BNG/U.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/BNG/Watermark - M25.svg b/src/img/symbols/BNG/Watermark - M25.svg
new file mode 100644
index 00000000..14388010
--- /dev/null
+++ b/src/img/symbols/BNG/Watermark - M25.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/BOK/80.svg b/src/img/symbols/BOK/80.svg
new file mode 100644
index 00000000..8bd88bcc
--- /dev/null
+++ b/src/img/symbols/BOK/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/BOK/C.svg b/src/img/symbols/BOK/C.svg
new file mode 100644
index 00000000..a4b7d35d
--- /dev/null
+++ b/src/img/symbols/BOK/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/BOK/M.svg b/src/img/symbols/BOK/M.svg
new file mode 100644
index 00000000..f8cd9a14
--- /dev/null
+++ b/src/img/symbols/BOK/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BOK/R.svg b/src/img/symbols/BOK/R.svg
new file mode 100644
index 00000000..aae81105
--- /dev/null
+++ b/src/img/symbols/BOK/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BOK/T.svg b/src/img/symbols/BOK/T.svg
new file mode 100644
index 00000000..ed600eaa
--- /dev/null
+++ b/src/img/symbols/BOK/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BOK/U.svg b/src/img/symbols/BOK/U.svg
new file mode 100644
index 00000000..72d03a07
--- /dev/null
+++ b/src/img/symbols/BOK/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/BOK/WM.svg b/src/img/symbols/BOK/WM.svg
new file mode 100644
index 00000000..42f9db5c
--- /dev/null
+++ b/src/img/symbols/BOK/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/BOT/80.svg b/src/img/symbols/BOT/80.svg
new file mode 100644
index 00000000..74b924f3
--- /dev/null
+++ b/src/img/symbols/BOT/80.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/BOT/C.svg b/src/img/symbols/BOT/C.svg
new file mode 100644
index 00000000..7c2ae26d
--- /dev/null
+++ b/src/img/symbols/BOT/C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/BOT/M.svg b/src/img/symbols/BOT/M.svg
new file mode 100644
index 00000000..21074908
--- /dev/null
+++ b/src/img/symbols/BOT/M.svg
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/src/img/symbols/BOT/R.svg b/src/img/symbols/BOT/R.svg
new file mode 100644
index 00000000..38716306
--- /dev/null
+++ b/src/img/symbols/BOT/R.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/img/symbols/BOT/T.svg b/src/img/symbols/BOT/T.svg
new file mode 100644
index 00000000..0d03f831
--- /dev/null
+++ b/src/img/symbols/BOT/T.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/BOT/U.svg b/src/img/symbols/BOT/U.svg
new file mode 100644
index 00000000..11053eed
--- /dev/null
+++ b/src/img/symbols/BOT/U.svg
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/src/img/symbols/BOT/WM.svg b/src/img/symbols/BOT/WM.svg
new file mode 100644
index 00000000..537e1951
--- /dev/null
+++ b/src/img/symbols/BOT/WM.svg
@@ -0,0 +1,22 @@
+
+
+
+
diff --git a/src/img/symbols/BRB/80.svg b/src/img/symbols/BRB/80.svg
new file mode 100644
index 00000000..f55178da
--- /dev/null
+++ b/src/img/symbols/BRB/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/BRB/C.svg b/src/img/symbols/BRB/C.svg
new file mode 100644
index 00000000..87e78ed8
--- /dev/null
+++ b/src/img/symbols/BRB/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/BRB/M.svg b/src/img/symbols/BRB/M.svg
new file mode 100644
index 00000000..d765c511
--- /dev/null
+++ b/src/img/symbols/BRB/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BRB/R.svg b/src/img/symbols/BRB/R.svg
new file mode 100644
index 00000000..33a736f7
--- /dev/null
+++ b/src/img/symbols/BRB/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BRB/T.svg b/src/img/symbols/BRB/T.svg
new file mode 100644
index 00000000..247b1204
--- /dev/null
+++ b/src/img/symbols/BRB/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BRB/U.svg b/src/img/symbols/BRB/U.svg
new file mode 100644
index 00000000..67888a9d
--- /dev/null
+++ b/src/img/symbols/BRB/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BRB/WM.svg b/src/img/symbols/BRB/WM.svg
new file mode 100644
index 00000000..c5b85411
--- /dev/null
+++ b/src/img/symbols/BRB/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/BRC/80.svg b/src/img/symbols/BRC/80.svg
new file mode 100644
index 00000000..cae40a92
--- /dev/null
+++ b/src/img/symbols/BRC/80.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/src/img/symbols/BRC/C.svg b/src/img/symbols/BRC/C.svg
new file mode 100644
index 00000000..4409c127
--- /dev/null
+++ b/src/img/symbols/BRC/C.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/src/img/symbols/BRC/M.svg b/src/img/symbols/BRC/M.svg
new file mode 100644
index 00000000..90a8fc9f
--- /dev/null
+++ b/src/img/symbols/BRC/M.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/BRC/R.svg b/src/img/symbols/BRC/R.svg
new file mode 100644
index 00000000..866d0ba9
--- /dev/null
+++ b/src/img/symbols/BRC/R.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/BRC/T.svg b/src/img/symbols/BRC/T.svg
new file mode 100644
index 00000000..22f2ad52
--- /dev/null
+++ b/src/img/symbols/BRC/T.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/BRC/U.svg b/src/img/symbols/BRC/U.svg
new file mode 100644
index 00000000..bc7ff9f8
--- /dev/null
+++ b/src/img/symbols/BRC/U.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/BRC/WM.svg b/src/img/symbols/BRC/WM.svg
new file mode 100644
index 00000000..bcff6c6e
--- /dev/null
+++ b/src/img/symbols/BRC/WM.svg
@@ -0,0 +1,21 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/80.svg b/src/img/symbols/BRO/80.svg
new file mode 100644
index 00000000..8d856c85
--- /dev/null
+++ b/src/img/symbols/BRO/80.svg
@@ -0,0 +1,31 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/C.svg b/src/img/symbols/BRO/C.svg
new file mode 100644
index 00000000..2bd5fc11
--- /dev/null
+++ b/src/img/symbols/BRO/C.svg
@@ -0,0 +1,31 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/M.svg b/src/img/symbols/BRO/M.svg
new file mode 100644
index 00000000..8141ecad
--- /dev/null
+++ b/src/img/symbols/BRO/M.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/R.svg b/src/img/symbols/BRO/R.svg
new file mode 100644
index 00000000..8d66a10a
--- /dev/null
+++ b/src/img/symbols/BRO/R.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/T.svg b/src/img/symbols/BRO/T.svg
new file mode 100644
index 00000000..6b9cc2ed
--- /dev/null
+++ b/src/img/symbols/BRO/T.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/U.svg b/src/img/symbols/BRO/U.svg
new file mode 100644
index 00000000..10ff445e
--- /dev/null
+++ b/src/img/symbols/BRO/U.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/BRO/WM.svg b/src/img/symbols/BRO/WM.svg
new file mode 100644
index 00000000..26db89ee
--- /dev/null
+++ b/src/img/symbols/BRO/WM.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/80.svg b/src/img/symbols/BRR/80.svg
new file mode 100644
index 00000000..733389b6
--- /dev/null
+++ b/src/img/symbols/BRR/80.svg
@@ -0,0 +1,32 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/C.svg b/src/img/symbols/BRR/C.svg
new file mode 100644
index 00000000..31934226
--- /dev/null
+++ b/src/img/symbols/BRR/C.svg
@@ -0,0 +1,32 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/M.svg b/src/img/symbols/BRR/M.svg
new file mode 100644
index 00000000..be2ea0f1
--- /dev/null
+++ b/src/img/symbols/BRR/M.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/R.svg b/src/img/symbols/BRR/R.svg
new file mode 100644
index 00000000..5f2edfd1
--- /dev/null
+++ b/src/img/symbols/BRR/R.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/T.svg b/src/img/symbols/BRR/T.svg
new file mode 100644
index 00000000..14c87f4e
--- /dev/null
+++ b/src/img/symbols/BRR/T.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/U.svg b/src/img/symbols/BRR/U.svg
new file mode 100644
index 00000000..fec73674
--- /dev/null
+++ b/src/img/symbols/BRR/U.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/BRR/WM.svg b/src/img/symbols/BRR/WM.svg
new file mode 100644
index 00000000..8d8d2db0
--- /dev/null
+++ b/src/img/symbols/BRR/WM.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/src/img/symbols/BTD/80.svg b/src/img/symbols/BTD/80.svg
new file mode 100644
index 00000000..1340466c
--- /dev/null
+++ b/src/img/symbols/BTD/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/BTD/C.svg b/src/img/symbols/BTD/C.svg
new file mode 100644
index 00000000..c17adf5e
--- /dev/null
+++ b/src/img/symbols/BTD/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/BTD/M.svg b/src/img/symbols/BTD/M.svg
new file mode 100644
index 00000000..6eeebf18
--- /dev/null
+++ b/src/img/symbols/BTD/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BTD/R.svg b/src/img/symbols/BTD/R.svg
new file mode 100644
index 00000000..dbd44bd4
--- /dev/null
+++ b/src/img/symbols/BTD/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BTD/T.svg b/src/img/symbols/BTD/T.svg
new file mode 100644
index 00000000..f2429469
--- /dev/null
+++ b/src/img/symbols/BTD/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BTD/U.svg b/src/img/symbols/BTD/U.svg
new file mode 100644
index 00000000..8663491d
--- /dev/null
+++ b/src/img/symbols/BTD/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/BTD/WM.svg b/src/img/symbols/BTD/WM.svg
new file mode 100644
index 00000000..8f24e91a
--- /dev/null
+++ b/src/img/symbols/BTD/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/Blank/80.svg b/src/img/symbols/Blank/80.svg
new file mode 100644
index 00000000..83c9037d
--- /dev/null
+++ b/src/img/symbols/Blank/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/Blank/C.svg b/src/img/symbols/Blank/C.svg
new file mode 100644
index 00000000..3c0dbb49
--- /dev/null
+++ b/src/img/symbols/Blank/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/Blank/M.svg b/src/img/symbols/Blank/M.svg
new file mode 100644
index 00000000..b1c3afe6
--- /dev/null
+++ b/src/img/symbols/Blank/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Blank/R.svg b/src/img/symbols/Blank/R.svg
new file mode 100644
index 00000000..e5721909
--- /dev/null
+++ b/src/img/symbols/Blank/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Blank/T.svg b/src/img/symbols/Blank/T.svg
new file mode 100644
index 00000000..4c74ef5e
--- /dev/null
+++ b/src/img/symbols/Blank/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Blank/U.svg b/src/img/symbols/Blank/U.svg
new file mode 100644
index 00000000..92210397
--- /dev/null
+++ b/src/img/symbols/Blank/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Blank/WM.svg b/src/img/symbols/Blank/WM.svg
new file mode 100644
index 00000000..a7f45373
--- /dev/null
+++ b/src/img/symbols/Blank/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/C13/80.svg b/src/img/symbols/C13/80.svg
new file mode 100644
index 00000000..d60ad372
--- /dev/null
+++ b/src/img/symbols/C13/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C13/C.svg b/src/img/symbols/C13/C.svg
new file mode 100644
index 00000000..bf9c6eb2
--- /dev/null
+++ b/src/img/symbols/C13/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C13/M.svg b/src/img/symbols/C13/M.svg
new file mode 100644
index 00000000..b3f511de
--- /dev/null
+++ b/src/img/symbols/C13/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/C13/R.svg b/src/img/symbols/C13/R.svg
new file mode 100644
index 00000000..3285e7ba
--- /dev/null
+++ b/src/img/symbols/C13/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/C13/T.svg b/src/img/symbols/C13/T.svg
new file mode 100644
index 00000000..4cb80914
--- /dev/null
+++ b/src/img/symbols/C13/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/C13/U.svg b/src/img/symbols/C13/U.svg
new file mode 100644
index 00000000..45bb42ed
--- /dev/null
+++ b/src/img/symbols/C13/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/C13/Watermark - M25.svg b/src/img/symbols/C13/Watermark - M25.svg
new file mode 100644
index 00000000..4f230bb8
--- /dev/null
+++ b/src/img/symbols/C13/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/C14/80.svg b/src/img/symbols/C14/80.svg
new file mode 100644
index 00000000..907050f7
--- /dev/null
+++ b/src/img/symbols/C14/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C14/C.svg b/src/img/symbols/C14/C.svg
new file mode 100644
index 00000000..8a694ad3
--- /dev/null
+++ b/src/img/symbols/C14/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C14/M.svg b/src/img/symbols/C14/M.svg
new file mode 100644
index 00000000..e75971e3
--- /dev/null
+++ b/src/img/symbols/C14/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C14/R.svg b/src/img/symbols/C14/R.svg
new file mode 100644
index 00000000..0ab15700
--- /dev/null
+++ b/src/img/symbols/C14/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C14/T.svg b/src/img/symbols/C14/T.svg
new file mode 100644
index 00000000..6418b4dd
--- /dev/null
+++ b/src/img/symbols/C14/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C14/U.svg b/src/img/symbols/C14/U.svg
new file mode 100644
index 00000000..667bc329
--- /dev/null
+++ b/src/img/symbols/C14/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C14/Watermark - M25.svg b/src/img/symbols/C14/Watermark - M25.svg
new file mode 100644
index 00000000..50fbaaa0
--- /dev/null
+++ b/src/img/symbols/C14/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/C15/80.svg b/src/img/symbols/C15/80.svg
new file mode 100644
index 00000000..4d27c1aa
--- /dev/null
+++ b/src/img/symbols/C15/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C15/C.svg b/src/img/symbols/C15/C.svg
new file mode 100644
index 00000000..f46ab0d1
--- /dev/null
+++ b/src/img/symbols/C15/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C15/M.svg b/src/img/symbols/C15/M.svg
new file mode 100644
index 00000000..f61847ac
--- /dev/null
+++ b/src/img/symbols/C15/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/C15/R.svg b/src/img/symbols/C15/R.svg
new file mode 100644
index 00000000..44fd7f02
--- /dev/null
+++ b/src/img/symbols/C15/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/C15/T.svg b/src/img/symbols/C15/T.svg
new file mode 100644
index 00000000..d277ed63
--- /dev/null
+++ b/src/img/symbols/C15/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/C15/U.svg b/src/img/symbols/C15/U.svg
new file mode 100644
index 00000000..47e2736b
--- /dev/null
+++ b/src/img/symbols/C15/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/C15/Watermark - M25.svg b/src/img/symbols/C15/Watermark - M25.svg
new file mode 100644
index 00000000..3fe379ae
--- /dev/null
+++ b/src/img/symbols/C15/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/C16/80.svg b/src/img/symbols/C16/80.svg
new file mode 100644
index 00000000..fb92abac
--- /dev/null
+++ b/src/img/symbols/C16/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/C16/C.svg b/src/img/symbols/C16/C.svg
new file mode 100644
index 00000000..7f54302f
--- /dev/null
+++ b/src/img/symbols/C16/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C16/M.svg b/src/img/symbols/C16/M.svg
new file mode 100644
index 00000000..96c3c5ae
--- /dev/null
+++ b/src/img/symbols/C16/M.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/C16/R.svg b/src/img/symbols/C16/R.svg
new file mode 100644
index 00000000..e97ab895
--- /dev/null
+++ b/src/img/symbols/C16/R.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/C16/T.svg b/src/img/symbols/C16/T.svg
new file mode 100644
index 00000000..8313299d
--- /dev/null
+++ b/src/img/symbols/C16/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/C16/U.svg b/src/img/symbols/C16/U.svg
new file mode 100644
index 00000000..d174ae07
--- /dev/null
+++ b/src/img/symbols/C16/U.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/C16/Watermark - M25.svg b/src/img/symbols/C16/Watermark - M25.svg
new file mode 100644
index 00000000..fd636398
--- /dev/null
+++ b/src/img/symbols/C16/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/C17/80.svg b/src/img/symbols/C17/80.svg
new file mode 100644
index 00000000..a18dc9c8
--- /dev/null
+++ b/src/img/symbols/C17/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C17/C.svg b/src/img/symbols/C17/C.svg
new file mode 100644
index 00000000..43072113
--- /dev/null
+++ b/src/img/symbols/C17/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C17/M.svg b/src/img/symbols/C17/M.svg
new file mode 100644
index 00000000..273b05f0
--- /dev/null
+++ b/src/img/symbols/C17/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C17/R.svg b/src/img/symbols/C17/R.svg
new file mode 100644
index 00000000..f65cff41
--- /dev/null
+++ b/src/img/symbols/C17/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C17/T.svg b/src/img/symbols/C17/T.svg
new file mode 100644
index 00000000..8810fda9
--- /dev/null
+++ b/src/img/symbols/C17/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C17/U.svg b/src/img/symbols/C17/U.svg
new file mode 100644
index 00000000..5850b8c0
--- /dev/null
+++ b/src/img/symbols/C17/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/C17/Watermark - M25.svg b/src/img/symbols/C17/Watermark - M25.svg
new file mode 100644
index 00000000..199a2e78
--- /dev/null
+++ b/src/img/symbols/C17/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/C18/80.svg b/src/img/symbols/C18/80.svg
new file mode 100644
index 00000000..5c48c126
--- /dev/null
+++ b/src/img/symbols/C18/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/C18/C.svg b/src/img/symbols/C18/C.svg
new file mode 100644
index 00000000..66d480b8
--- /dev/null
+++ b/src/img/symbols/C18/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/C18/M.svg b/src/img/symbols/C18/M.svg
new file mode 100644
index 00000000..587828e4
--- /dev/null
+++ b/src/img/symbols/C18/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/C18/R.svg b/src/img/symbols/C18/R.svg
new file mode 100644
index 00000000..530e1c3d
--- /dev/null
+++ b/src/img/symbols/C18/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/C18/T.svg b/src/img/symbols/C18/T.svg
new file mode 100644
index 00000000..e4e2581d
--- /dev/null
+++ b/src/img/symbols/C18/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/C18/U.svg b/src/img/symbols/C18/U.svg
new file mode 100644
index 00000000..c2fb5e53
--- /dev/null
+++ b/src/img/symbols/C18/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/C18/WM.svg b/src/img/symbols/C18/WM.svg
new file mode 100644
index 00000000..e921a79c
--- /dev/null
+++ b/src/img/symbols/C18/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/C19/C.svg b/src/img/symbols/C19/C.svg
new file mode 100644
index 00000000..d490ca3e
--- /dev/null
+++ b/src/img/symbols/C19/C.svg
@@ -0,0 +1,73 @@
+
+
+
+
diff --git a/src/img/symbols/C19/Inaccurate.txt b/src/img/symbols/C19/Inaccurate.txt
new file mode 100644
index 00000000..3f05efc9
--- /dev/null
+++ b/src/img/symbols/C19/Inaccurate.txt
@@ -0,0 +1 @@
+C is still not right
\ No newline at end of file
diff --git a/src/img/symbols/C19/M.svg b/src/img/symbols/C19/M.svg
new file mode 100644
index 00000000..088ef9b4
--- /dev/null
+++ b/src/img/symbols/C19/M.svg
@@ -0,0 +1,108 @@
+
+
+
+
diff --git a/src/img/symbols/C19/R.svg b/src/img/symbols/C19/R.svg
new file mode 100644
index 00000000..a922a2a0
--- /dev/null
+++ b/src/img/symbols/C19/R.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/C19/U.svg b/src/img/symbols/C19/U.svg
new file mode 100644
index 00000000..333d579f
--- /dev/null
+++ b/src/img/symbols/C19/U.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/C20/80.svg b/src/img/symbols/C20/80.svg
new file mode 100644
index 00000000..c9b5c363
--- /dev/null
+++ b/src/img/symbols/C20/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C20/C.svg b/src/img/symbols/C20/C.svg
new file mode 100644
index 00000000..9c5617d7
--- /dev/null
+++ b/src/img/symbols/C20/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/C20/M.svg b/src/img/symbols/C20/M.svg
new file mode 100644
index 00000000..c503acba
--- /dev/null
+++ b/src/img/symbols/C20/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/C20/R.svg b/src/img/symbols/C20/R.svg
new file mode 100644
index 00000000..7a7a4bbd
--- /dev/null
+++ b/src/img/symbols/C20/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/C20/T.svg b/src/img/symbols/C20/T.svg
new file mode 100644
index 00000000..5e311026
--- /dev/null
+++ b/src/img/symbols/C20/T.svg
@@ -0,0 +1,82 @@
+
+
diff --git a/src/img/symbols/C20/U.svg b/src/img/symbols/C20/U.svg
new file mode 100644
index 00000000..e10dd2b8
--- /dev/null
+++ b/src/img/symbols/C20/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/C20/WM.svg b/src/img/symbols/C20/WM.svg
new file mode 100644
index 00000000..2a705043
--- /dev/null
+++ b/src/img/symbols/C20/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/C21/80.svg b/src/img/symbols/C21/80.svg
new file mode 100644
index 00000000..7dcc7697
--- /dev/null
+++ b/src/img/symbols/C21/80.svg
@@ -0,0 +1,78 @@
+
+
diff --git a/src/img/symbols/C21/C.svg b/src/img/symbols/C21/C.svg
new file mode 100644
index 00000000..a17b5dac
--- /dev/null
+++ b/src/img/symbols/C21/C.svg
@@ -0,0 +1,78 @@
+
+
diff --git a/src/img/symbols/C21/M.svg b/src/img/symbols/C21/M.svg
new file mode 100644
index 00000000..8a350731
--- /dev/null
+++ b/src/img/symbols/C21/M.svg
@@ -0,0 +1,113 @@
+
+
diff --git a/src/img/symbols/C21/R.svg b/src/img/symbols/C21/R.svg
new file mode 100644
index 00000000..7164d1a0
--- /dev/null
+++ b/src/img/symbols/C21/R.svg
@@ -0,0 +1,113 @@
+
+
diff --git a/src/img/symbols/C21/T.svg b/src/img/symbols/C21/T.svg
new file mode 100644
index 00000000..ae927ef8
--- /dev/null
+++ b/src/img/symbols/C21/T.svg
@@ -0,0 +1,114 @@
+
+
diff --git a/src/img/symbols/C21/U.svg b/src/img/symbols/C21/U.svg
new file mode 100644
index 00000000..3d880415
--- /dev/null
+++ b/src/img/symbols/C21/U.svg
@@ -0,0 +1,113 @@
+
+
diff --git a/src/img/symbols/C21/WM.svg b/src/img/symbols/C21/WM.svg
new file mode 100644
index 00000000..e8ae285b
--- /dev/null
+++ b/src/img/symbols/C21/WM.svg
@@ -0,0 +1,78 @@
+
+
diff --git a/src/img/symbols/CC1/80.svg b/src/img/symbols/CC1/80.svg
new file mode 100644
index 00000000..59b4cab5
--- /dev/null
+++ b/src/img/symbols/CC1/80.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/src/img/symbols/CC1/C.SVG b/src/img/symbols/CC1/C.SVG
new file mode 100644
index 00000000..85e9a456
--- /dev/null
+++ b/src/img/symbols/CC1/C.SVG
@@ -0,0 +1,58 @@
+
+
diff --git a/src/img/symbols/CC1/M.svg b/src/img/symbols/CC1/M.svg
new file mode 100644
index 00000000..9d3c3618
--- /dev/null
+++ b/src/img/symbols/CC1/M.svg
@@ -0,0 +1,163 @@
+
+
diff --git a/src/img/symbols/CC1/R.svg b/src/img/symbols/CC1/R.svg
new file mode 100644
index 00000000..3e3ea34f
--- /dev/null
+++ b/src/img/symbols/CC1/R.svg
@@ -0,0 +1,163 @@
+
+
diff --git a/src/img/symbols/CC1/T.svg b/src/img/symbols/CC1/T.svg
new file mode 100644
index 00000000..2e20621e
--- /dev/null
+++ b/src/img/symbols/CC1/T.svg
@@ -0,0 +1,163 @@
+
+
diff --git a/src/img/symbols/CC1/U.SVG b/src/img/symbols/CC1/U.SVG
new file mode 100644
index 00000000..bd33e247
--- /dev/null
+++ b/src/img/symbols/CC1/U.SVG
@@ -0,0 +1,163 @@
+
+
diff --git a/src/img/symbols/CC1/WM.svg b/src/img/symbols/CC1/WM.svg
new file mode 100644
index 00000000..9f41025d
--- /dev/null
+++ b/src/img/symbols/CC1/WM.svg
@@ -0,0 +1,43 @@
+
+
diff --git a/src/img/symbols/CHK/80.svg b/src/img/symbols/CHK/80.svg
new file mode 100644
index 00000000..15757576
--- /dev/null
+++ b/src/img/symbols/CHK/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/CHK/C.svg b/src/img/symbols/CHK/C.svg
new file mode 100644
index 00000000..656734ad
--- /dev/null
+++ b/src/img/symbols/CHK/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/CHK/M.svg b/src/img/symbols/CHK/M.svg
new file mode 100644
index 00000000..c09e90b5
--- /dev/null
+++ b/src/img/symbols/CHK/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHK/R.svg b/src/img/symbols/CHK/R.svg
new file mode 100644
index 00000000..756203a6
--- /dev/null
+++ b/src/img/symbols/CHK/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHK/T.svg b/src/img/symbols/CHK/T.svg
new file mode 100644
index 00000000..d2687f73
--- /dev/null
+++ b/src/img/symbols/CHK/T.svg
@@ -0,0 +1,68 @@
+
+
diff --git a/src/img/symbols/CHK/U.svg b/src/img/symbols/CHK/U.svg
new file mode 100644
index 00000000..04674730
--- /dev/null
+++ b/src/img/symbols/CHK/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHK/WM.svg b/src/img/symbols/CHK/WM.svg
new file mode 100644
index 00000000..e29e00bc
--- /dev/null
+++ b/src/img/symbols/CHK/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/CHK/WM2.svg b/src/img/symbols/CHK/WM2.svg
new file mode 100644
index 00000000..ad09f993
--- /dev/null
+++ b/src/img/symbols/CHK/WM2.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CHR/80.svg b/src/img/symbols/CHR/80.svg
new file mode 100644
index 00000000..5ad59391
--- /dev/null
+++ b/src/img/symbols/CHR/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CHR/C.svg b/src/img/symbols/CHR/C.svg
new file mode 100644
index 00000000..1b9e2e54
--- /dev/null
+++ b/src/img/symbols/CHR/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CHR/M.svg b/src/img/symbols/CHR/M.svg
new file mode 100644
index 00000000..ff470381
--- /dev/null
+++ b/src/img/symbols/CHR/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHR/R.svg b/src/img/symbols/CHR/R.svg
new file mode 100644
index 00000000..b52e1c60
--- /dev/null
+++ b/src/img/symbols/CHR/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHR/Renaissance.svg b/src/img/symbols/CHR/Renaissance.svg
new file mode 100644
index 00000000..651b7c12
--- /dev/null
+++ b/src/img/symbols/CHR/Renaissance.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHR/Rinascimento.svg b/src/img/symbols/CHR/Rinascimento.svg
new file mode 100644
index 00000000..25167e3b
--- /dev/null
+++ b/src/img/symbols/CHR/Rinascimento.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/CHR/T.svg b/src/img/symbols/CHR/T.svg
new file mode 100644
index 00000000..dc8de550
--- /dev/null
+++ b/src/img/symbols/CHR/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHR/U.svg b/src/img/symbols/CHR/U.svg
new file mode 100644
index 00000000..ea9cc775
--- /dev/null
+++ b/src/img/symbols/CHR/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CHR/WM.svg b/src/img/symbols/CHR/WM.svg
new file mode 100644
index 00000000..7233c33d
--- /dev/null
+++ b/src/img/symbols/CHR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CLB/80.svg b/src/img/symbols/CLB/80.svg
new file mode 100644
index 00000000..9e06b9c6
--- /dev/null
+++ b/src/img/symbols/CLB/80.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/CLB/C.svg b/src/img/symbols/CLB/C.svg
new file mode 100644
index 00000000..90321b66
--- /dev/null
+++ b/src/img/symbols/CLB/C.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/src/img/symbols/CLB/M.svg b/src/img/symbols/CLB/M.svg
new file mode 100644
index 00000000..d8d85399
--- /dev/null
+++ b/src/img/symbols/CLB/M.svg
@@ -0,0 +1,132 @@
+
+
+
+
diff --git a/src/img/symbols/CLB/R.svg b/src/img/symbols/CLB/R.svg
new file mode 100644
index 00000000..649301ed
--- /dev/null
+++ b/src/img/symbols/CLB/R.svg
@@ -0,0 +1,124 @@
+
+
+
+
diff --git a/src/img/symbols/CLB/T.svg b/src/img/symbols/CLB/T.svg
new file mode 100644
index 00000000..c61a87e7
--- /dev/null
+++ b/src/img/symbols/CLB/T.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/CLB/U.svg b/src/img/symbols/CLB/U.svg
new file mode 100644
index 00000000..7283719d
--- /dev/null
+++ b/src/img/symbols/CLB/U.svg
@@ -0,0 +1,132 @@
+
+
+
+
diff --git a/src/img/symbols/CLB/WM.svg b/src/img/symbols/CLB/WM.svg
new file mode 100644
index 00000000..bf5256fe
--- /dev/null
+++ b/src/img/symbols/CLB/WM.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/CM1/80.svg b/src/img/symbols/CM1/80.svg
new file mode 100644
index 00000000..2bbc3aa2
--- /dev/null
+++ b/src/img/symbols/CM1/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/CM1/C.svg b/src/img/symbols/CM1/C.svg
new file mode 100644
index 00000000..ac1d3d9b
--- /dev/null
+++ b/src/img/symbols/CM1/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/CM1/M.svg b/src/img/symbols/CM1/M.svg
new file mode 100644
index 00000000..7afd94a3
--- /dev/null
+++ b/src/img/symbols/CM1/M.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/CM1/R.svg b/src/img/symbols/CM1/R.svg
new file mode 100644
index 00000000..3a6e7b53
--- /dev/null
+++ b/src/img/symbols/CM1/R.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/CM1/T.svg b/src/img/symbols/CM1/T.svg
new file mode 100644
index 00000000..904d3c2a
--- /dev/null
+++ b/src/img/symbols/CM1/T.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/CM1/U.svg b/src/img/symbols/CM1/U.svg
new file mode 100644
index 00000000..f81fb6a4
--- /dev/null
+++ b/src/img/symbols/CM1/U.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/CM1/WM.svg b/src/img/symbols/CM1/WM.svg
new file mode 100644
index 00000000..2f6bd044
--- /dev/null
+++ b/src/img/symbols/CM1/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CM2/80.svg b/src/img/symbols/CM2/80.svg
new file mode 100644
index 00000000..234ae8a0
--- /dev/null
+++ b/src/img/symbols/CM2/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/CM2/C.svg b/src/img/symbols/CM2/C.svg
new file mode 100644
index 00000000..a4cc4971
--- /dev/null
+++ b/src/img/symbols/CM2/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/CM2/M.svg b/src/img/symbols/CM2/M.svg
new file mode 100644
index 00000000..4d86706c
--- /dev/null
+++ b/src/img/symbols/CM2/M.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/CM2/R.svg b/src/img/symbols/CM2/R.svg
new file mode 100644
index 00000000..12661f24
--- /dev/null
+++ b/src/img/symbols/CM2/R.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/CM2/T.svg b/src/img/symbols/CM2/T.svg
new file mode 100644
index 00000000..3c550c67
--- /dev/null
+++ b/src/img/symbols/CM2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CM2/U.svg b/src/img/symbols/CM2/U.svg
new file mode 100644
index 00000000..950d8117
--- /dev/null
+++ b/src/img/symbols/CM2/U.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/CM2/WM.svg b/src/img/symbols/CM2/WM.svg
new file mode 100644
index 00000000..faac0046
--- /dev/null
+++ b/src/img/symbols/CM2/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/CMA/80.svg b/src/img/symbols/CMA/80.svg
new file mode 100644
index 00000000..1c7be45b
--- /dev/null
+++ b/src/img/symbols/CMA/80.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/CMA/C.svg b/src/img/symbols/CMA/C.svg
new file mode 100644
index 00000000..1bf2ec61
--- /dev/null
+++ b/src/img/symbols/CMA/C.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/CMA/M.svg b/src/img/symbols/CMA/M.svg
new file mode 100644
index 00000000..74ade7bd
--- /dev/null
+++ b/src/img/symbols/CMA/M.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CMA/R.svg b/src/img/symbols/CMA/R.svg
new file mode 100644
index 00000000..023b9236
--- /dev/null
+++ b/src/img/symbols/CMA/R.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CMA/T.svg b/src/img/symbols/CMA/T.svg
new file mode 100644
index 00000000..37d417f4
--- /dev/null
+++ b/src/img/symbols/CMA/T.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CMA/U.svg b/src/img/symbols/CMA/U.svg
new file mode 100644
index 00000000..060b58fc
--- /dev/null
+++ b/src/img/symbols/CMA/U.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CMA/WM.svg b/src/img/symbols/CMA/WM.svg
new file mode 100644
index 00000000..d8daa783
--- /dev/null
+++ b/src/img/symbols/CMA/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CMD/80.svg b/src/img/symbols/CMD/80.svg
new file mode 100644
index 00000000..e4b91c04
--- /dev/null
+++ b/src/img/symbols/CMD/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CMD/C.svg b/src/img/symbols/CMD/C.svg
new file mode 100644
index 00000000..14c20528
--- /dev/null
+++ b/src/img/symbols/CMD/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CMD/M.svg b/src/img/symbols/CMD/M.svg
new file mode 100644
index 00000000..13bcada2
--- /dev/null
+++ b/src/img/symbols/CMD/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/CMD/R.svg b/src/img/symbols/CMD/R.svg
new file mode 100644
index 00000000..9b8b9d65
--- /dev/null
+++ b/src/img/symbols/CMD/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/CMD/T.svg b/src/img/symbols/CMD/T.svg
new file mode 100644
index 00000000..e3285cd6
--- /dev/null
+++ b/src/img/symbols/CMD/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CMD/U.svg b/src/img/symbols/CMD/U.svg
new file mode 100644
index 00000000..d989e800
--- /dev/null
+++ b/src/img/symbols/CMD/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CMD/Watermark - M25.svg b/src/img/symbols/CMD/Watermark - M25.svg
new file mode 100644
index 00000000..b2f4b23f
--- /dev/null
+++ b/src/img/symbols/CMD/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CMM/80.svg b/src/img/symbols/CMM/80.svg
new file mode 100644
index 00000000..5cf68867
--- /dev/null
+++ b/src/img/symbols/CMM/80.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/CMM/C.svg b/src/img/symbols/CMM/C.svg
new file mode 100644
index 00000000..7c9190bf
--- /dev/null
+++ b/src/img/symbols/CMM/C.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/CMM/M.svg b/src/img/symbols/CMM/M.svg
new file mode 100644
index 00000000..d8e5dee9
--- /dev/null
+++ b/src/img/symbols/CMM/M.svg
@@ -0,0 +1,75 @@
+
+
+
+
diff --git a/src/img/symbols/CMM/R.svg b/src/img/symbols/CMM/R.svg
new file mode 100644
index 00000000..536208a9
--- /dev/null
+++ b/src/img/symbols/CMM/R.svg
@@ -0,0 +1,70 @@
+
+
+
+
diff --git a/src/img/symbols/CMM/T.svg b/src/img/symbols/CMM/T.svg
new file mode 100644
index 00000000..124324bb
--- /dev/null
+++ b/src/img/symbols/CMM/T.svg
@@ -0,0 +1,100 @@
+
+
+
+
diff --git a/src/img/symbols/CMM/U.svg b/src/img/symbols/CMM/U.svg
new file mode 100644
index 00000000..e102fa4d
--- /dev/null
+++ b/src/img/symbols/CMM/U.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/src/img/symbols/CMM/WM.svg b/src/img/symbols/CMM/WM.svg
new file mode 100644
index 00000000..33d097e0
--- /dev/null
+++ b/src/img/symbols/CMM/WM.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/src/img/symbols/CMR/C.svg b/src/img/symbols/CMR/C.svg
new file mode 100644
index 00000000..0a7667c1
--- /dev/null
+++ b/src/img/symbols/CMR/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/CMR/M.svg b/src/img/symbols/CMR/M.svg
new file mode 100644
index 00000000..19327378
--- /dev/null
+++ b/src/img/symbols/CMR/M.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CMR/R.svg b/src/img/symbols/CMR/R.svg
new file mode 100644
index 00000000..13dcfd91
--- /dev/null
+++ b/src/img/symbols/CMR/R.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CMR/U.svg b/src/img/symbols/CMR/U.svg
new file mode 100644
index 00000000..d8d1f8aa
--- /dev/null
+++ b/src/img/symbols/CMR/U.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CN2/80.svg b/src/img/symbols/CN2/80.svg
new file mode 100644
index 00000000..68fe0052
--- /dev/null
+++ b/src/img/symbols/CN2/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/CN2/C.svg b/src/img/symbols/CN2/C.svg
new file mode 100644
index 00000000..1adf52d2
--- /dev/null
+++ b/src/img/symbols/CN2/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/CN2/M.svg b/src/img/symbols/CN2/M.svg
new file mode 100644
index 00000000..5cdc8ef8
--- /dev/null
+++ b/src/img/symbols/CN2/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CN2/R.svg b/src/img/symbols/CN2/R.svg
new file mode 100644
index 00000000..d490fcd3
--- /dev/null
+++ b/src/img/symbols/CN2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CN2/T.svg b/src/img/symbols/CN2/T.svg
new file mode 100644
index 00000000..aea79d51
--- /dev/null
+++ b/src/img/symbols/CN2/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CN2/U.svg b/src/img/symbols/CN2/U.svg
new file mode 100644
index 00000000..dc100b88
--- /dev/null
+++ b/src/img/symbols/CN2/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CN2/WM.svg b/src/img/symbols/CN2/WM.svg
new file mode 100644
index 00000000..98348601
--- /dev/null
+++ b/src/img/symbols/CN2/WM.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/CN2/Watermark - M25.svg b/src/img/symbols/CN2/Watermark - M25.svg
new file mode 100644
index 00000000..d46429dc
--- /dev/null
+++ b/src/img/symbols/CN2/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CNS/80.svg b/src/img/symbols/CNS/80.svg
new file mode 100644
index 00000000..df933983
--- /dev/null
+++ b/src/img/symbols/CNS/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/CNS/C.svg b/src/img/symbols/CNS/C.svg
new file mode 100644
index 00000000..c1f17ab9
--- /dev/null
+++ b/src/img/symbols/CNS/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/CNS/M.svg b/src/img/symbols/CNS/M.svg
new file mode 100644
index 00000000..58e5bfd0
--- /dev/null
+++ b/src/img/symbols/CNS/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/CNS/R.svg b/src/img/symbols/CNS/R.svg
new file mode 100644
index 00000000..dd1a6fb6
--- /dev/null
+++ b/src/img/symbols/CNS/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/CNS/T.svg b/src/img/symbols/CNS/T.svg
new file mode 100644
index 00000000..7f8e74ed
--- /dev/null
+++ b/src/img/symbols/CNS/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/CNS/U.svg b/src/img/symbols/CNS/U.svg
new file mode 100644
index 00000000..d7e4e76a
--- /dev/null
+++ b/src/img/symbols/CNS/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/CNS/Watermark - M25.svg b/src/img/symbols/CNS/Watermark - M25.svg
new file mode 100644
index 00000000..f840cb1c
--- /dev/null
+++ b/src/img/symbols/CNS/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CONF/80.svg b/src/img/symbols/CONF/80.svg
new file mode 100644
index 00000000..ef5aee35
--- /dev/null
+++ b/src/img/symbols/CONF/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CONF/C.svg b/src/img/symbols/CONF/C.svg
new file mode 100644
index 00000000..35a22c6d
--- /dev/null
+++ b/src/img/symbols/CONF/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CONF/M.svg b/src/img/symbols/CONF/M.svg
new file mode 100644
index 00000000..d17ff235
--- /dev/null
+++ b/src/img/symbols/CONF/M.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/CONF/R.svg b/src/img/symbols/CONF/R.svg
new file mode 100644
index 00000000..cde1ac59
--- /dev/null
+++ b/src/img/symbols/CONF/R.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/CONF/T.svg b/src/img/symbols/CONF/T.svg
new file mode 100644
index 00000000..a7a1f09e
--- /dev/null
+++ b/src/img/symbols/CONF/T.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/CONF/U.svg b/src/img/symbols/CONF/U.svg
new file mode 100644
index 00000000..6b823288
--- /dev/null
+++ b/src/img/symbols/CONF/U.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/CONF/WM.svg b/src/img/symbols/CONF/WM.svg
new file mode 100644
index 00000000..580e3784
--- /dev/null
+++ b/src/img/symbols/CONF/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CSP/80.svg b/src/img/symbols/CSP/80.svg
new file mode 100644
index 00000000..61641308
--- /dev/null
+++ b/src/img/symbols/CSP/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CSP/C.svg b/src/img/symbols/CSP/C.svg
new file mode 100644
index 00000000..3cc3b7ac
--- /dev/null
+++ b/src/img/symbols/CSP/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CSP/M.svg b/src/img/symbols/CSP/M.svg
new file mode 100644
index 00000000..7f30910c
--- /dev/null
+++ b/src/img/symbols/CSP/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CSP/R.svg b/src/img/symbols/CSP/R.svg
new file mode 100644
index 00000000..d572254c
--- /dev/null
+++ b/src/img/symbols/CSP/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CSP/T.svg b/src/img/symbols/CSP/T.svg
new file mode 100644
index 00000000..c158b6e5
--- /dev/null
+++ b/src/img/symbols/CSP/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CSP/U.svg b/src/img/symbols/CSP/U.svg
new file mode 100644
index 00000000..4f9a557c
--- /dev/null
+++ b/src/img/symbols/CSP/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/CSP/WM.svg b/src/img/symbols/CSP/WM.svg
new file mode 100644
index 00000000..4a1d0651
--- /dev/null
+++ b/src/img/symbols/CSP/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CSP/WM2.svg b/src/img/symbols/CSP/WM2.svg
new file mode 100644
index 00000000..c1667cfb
--- /dev/null
+++ b/src/img/symbols/CSP/WM2.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/CST/ALL-80.svg b/src/img/symbols/CST/ALL-80.svg
new file mode 100644
index 00000000..922ad3ae
--- /dev/null
+++ b/src/img/symbols/CST/ALL-80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/CST/ALL-C.svg b/src/img/symbols/CST/ALL-C.svg
new file mode 100644
index 00000000..ba16f99a
--- /dev/null
+++ b/src/img/symbols/CST/ALL-C.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/CST/ALL-M.svg b/src/img/symbols/CST/ALL-M.svg
new file mode 100644
index 00000000..57604505
--- /dev/null
+++ b/src/img/symbols/CST/ALL-M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CST/ALL-R.svg b/src/img/symbols/CST/ALL-R.svg
new file mode 100644
index 00000000..fd38ec98
--- /dev/null
+++ b/src/img/symbols/CST/ALL-R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CST/ALL-T.svg b/src/img/symbols/CST/ALL-T.svg
new file mode 100644
index 00000000..ee10d76a
--- /dev/null
+++ b/src/img/symbols/CST/ALL-T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CST/ALL-U.svg b/src/img/symbols/CST/ALL-U.svg
new file mode 100644
index 00000000..917f4b5c
--- /dev/null
+++ b/src/img/symbols/CST/ALL-U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/CST/IA-80.svg b/src/img/symbols/CST/IA-80.svg
new file mode 100644
index 00000000..1d658456
--- /dev/null
+++ b/src/img/symbols/CST/IA-80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/CST/IA-C.svg b/src/img/symbols/CST/IA-C.svg
new file mode 100644
index 00000000..56f81104
--- /dev/null
+++ b/src/img/symbols/CST/IA-C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/CST/IA-M.svg b/src/img/symbols/CST/IA-M.svg
new file mode 100644
index 00000000..82309f1e
--- /dev/null
+++ b/src/img/symbols/CST/IA-M.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/src/img/symbols/CST/IA-R.svg b/src/img/symbols/CST/IA-R.svg
new file mode 100644
index 00000000..3da2f778
--- /dev/null
+++ b/src/img/symbols/CST/IA-R.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/src/img/symbols/CST/IA-T.svg b/src/img/symbols/CST/IA-T.svg
new file mode 100644
index 00000000..aae4d937
--- /dev/null
+++ b/src/img/symbols/CST/IA-T.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/src/img/symbols/CST/IA-U.svg b/src/img/symbols/CST/IA-U.svg
new file mode 100644
index 00000000..d9f3dca9
--- /dev/null
+++ b/src/img/symbols/CST/IA-U.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/src/img/symbols/Collectors' Edition - International/80.svg b/src/img/symbols/Collectors' Edition - International/80.svg
new file mode 100644
index 00000000..32b46d45
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition - International/C.svg b/src/img/symbols/Collectors' Edition - International/C.svg
new file mode 100644
index 00000000..9e59e5bd
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition - International/M.svg b/src/img/symbols/Collectors' Edition - International/M.svg
new file mode 100644
index 00000000..21c933fe
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition - International/R.svg b/src/img/symbols/Collectors' Edition - International/R.svg
new file mode 100644
index 00000000..97b29658
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition - International/T.svg b/src/img/symbols/Collectors' Edition - International/T.svg
new file mode 100644
index 00000000..92badd5a
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition - International/U.svg b/src/img/symbols/Collectors' Edition - International/U.svg
new file mode 100644
index 00000000..56b073dd
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition - International/WM.svg b/src/img/symbols/Collectors' Edition - International/WM.svg
new file mode 100644
index 00000000..a183746b
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition - International/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/80.svg b/src/img/symbols/Collectors' Edition/80.svg
new file mode 100644
index 00000000..65c7d4f5
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/C.svg b/src/img/symbols/Collectors' Edition/C.svg
new file mode 100644
index 00000000..c177d999
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/M.svg b/src/img/symbols/Collectors' Edition/M.svg
new file mode 100644
index 00000000..00c9eb9b
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/R.svg b/src/img/symbols/Collectors' Edition/R.svg
new file mode 100644
index 00000000..a5576e37
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/T.svg b/src/img/symbols/Collectors' Edition/T.svg
new file mode 100644
index 00000000..f8f05929
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/U.svg b/src/img/symbols/Collectors' Edition/U.svg
new file mode 100644
index 00000000..7be2ae87
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Collectors' Edition/WM.svg b/src/img/symbols/Collectors' Edition/WM.svg
new file mode 100644
index 00000000..d200c633
--- /dev/null
+++ b/src/img/symbols/Collectors' Edition/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/Cube/cube_c.svg b/src/img/symbols/Cube/cube_c.svg
new file mode 100644
index 00000000..6448355a
--- /dev/null
+++ b/src/img/symbols/Cube/cube_c.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/Cube/cube_m.svg b/src/img/symbols/Cube/cube_m.svg
new file mode 100644
index 00000000..85ef77ea
--- /dev/null
+++ b/src/img/symbols/Cube/cube_m.svg
@@ -0,0 +1,69 @@
+
+
diff --git a/src/img/symbols/Cube/cube_r.svg b/src/img/symbols/Cube/cube_r.svg
new file mode 100644
index 00000000..c862cc51
--- /dev/null
+++ b/src/img/symbols/Cube/cube_r.svg
@@ -0,0 +1,69 @@
+
+
diff --git a/src/img/symbols/Cube/cube_u.svg b/src/img/symbols/Cube/cube_u.svg
new file mode 100644
index 00000000..fa2376b4
--- /dev/null
+++ b/src/img/symbols/Cube/cube_u.svg
@@ -0,0 +1,69 @@
+
+
diff --git a/src/img/symbols/DCI/80.svg b/src/img/symbols/DCI/80.svg
new file mode 100644
index 00000000..fdfb4a55
--- /dev/null
+++ b/src/img/symbols/DCI/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DCI/C.svg b/src/img/symbols/DCI/C.svg
new file mode 100644
index 00000000..d32c6e5d
--- /dev/null
+++ b/src/img/symbols/DCI/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DCI/M.svg b/src/img/symbols/DCI/M.svg
new file mode 100644
index 00000000..2dad18ed
--- /dev/null
+++ b/src/img/symbols/DCI/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI/R.svg b/src/img/symbols/DCI/R.svg
new file mode 100644
index 00000000..d211ca5d
--- /dev/null
+++ b/src/img/symbols/DCI/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI/T.svg b/src/img/symbols/DCI/T.svg
new file mode 100644
index 00000000..4c78dd0e
--- /dev/null
+++ b/src/img/symbols/DCI/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI/U.svg b/src/img/symbols/DCI/U.svg
new file mode 100644
index 00000000..47a291fe
--- /dev/null
+++ b/src/img/symbols/DCI/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI/WM.svg b/src/img/symbols/DCI/WM.svg
new file mode 100644
index 00000000..73889934
--- /dev/null
+++ b/src/img/symbols/DCI/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DCI_ALT/M.svg b/src/img/symbols/DCI_ALT/M.svg
new file mode 100644
index 00000000..f21432ab
--- /dev/null
+++ b/src/img/symbols/DCI_ALT/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI_ALT/R.svg b/src/img/symbols/DCI_ALT/R.svg
new file mode 100644
index 00000000..2571c187
--- /dev/null
+++ b/src/img/symbols/DCI_ALT/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI_ALT/T.svg b/src/img/symbols/DCI_ALT/T.svg
new file mode 100644
index 00000000..6e926994
--- /dev/null
+++ b/src/img/symbols/DCI_ALT/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DCI_ALT/U.svg b/src/img/symbols/DCI_ALT/U.svg
new file mode 100644
index 00000000..46579de3
--- /dev/null
+++ b/src/img/symbols/DCI_ALT/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/80.svg b/src/img/symbols/DD1 (EVG)/80.svg
new file mode 100644
index 00000000..c34d3d67
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/C.svg b/src/img/symbols/DD1 (EVG)/C.svg
new file mode 100644
index 00000000..c334402e
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/M.svg b/src/img/symbols/DD1 (EVG)/M.svg
new file mode 100644
index 00000000..6bbdcdea
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/R.svg b/src/img/symbols/DD1 (EVG)/R.svg
new file mode 100644
index 00000000..efda3661
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/T.svg b/src/img/symbols/DD1 (EVG)/T.svg
new file mode 100644
index 00000000..7a5f0f3d
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/U.svg b/src/img/symbols/DD1 (EVG)/U.svg
new file mode 100644
index 00000000..13b9fbe8
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DD1 (EVG)/WM.svg b/src/img/symbols/DD1 (EVG)/WM.svg
new file mode 100644
index 00000000..6e7b5063
--- /dev/null
+++ b/src/img/symbols/DD1 (EVG)/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/80.svg b/src/img/symbols/DD2 (JVC)/80.svg
new file mode 100644
index 00000000..9cadf18a
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/C.svg b/src/img/symbols/DD2 (JVC)/C.svg
new file mode 100644
index 00000000..3bf26e74
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/M.svg b/src/img/symbols/DD2 (JVC)/M.svg
new file mode 100644
index 00000000..7b9f3d9f
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/R.svg b/src/img/symbols/DD2 (JVC)/R.svg
new file mode 100644
index 00000000..77248968
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/T.svg b/src/img/symbols/DD2 (JVC)/T.svg
new file mode 100644
index 00000000..60ec8991
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/U.svg b/src/img/symbols/DD2 (JVC)/U.svg
new file mode 100644
index 00000000..d4c09ba5
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DD2 (JVC)/WM.svg b/src/img/symbols/DD2 (JVC)/WM.svg
new file mode 100644
index 00000000..fc2b0d14
--- /dev/null
+++ b/src/img/symbols/DD2 (JVC)/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/80.svg b/src/img/symbols/DDC (DVD)/80.svg
new file mode 100644
index 00000000..d038c161
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/C.svg b/src/img/symbols/DDC (DVD)/C.svg
new file mode 100644
index 00000000..c50dddab
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/M.svg b/src/img/symbols/DDC (DVD)/M.svg
new file mode 100644
index 00000000..960e9f4b
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/R.svg b/src/img/symbols/DDC (DVD)/R.svg
new file mode 100644
index 00000000..5eea8332
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/T.svg b/src/img/symbols/DDC (DVD)/T.svg
new file mode 100644
index 00000000..8576b1d3
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/U.svg b/src/img/symbols/DDC (DVD)/U.svg
new file mode 100644
index 00000000..9a8d3da7
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDC (DVD)/WM.svg b/src/img/symbols/DDC (DVD)/WM.svg
new file mode 100644
index 00000000..d2d473ef
--- /dev/null
+++ b/src/img/symbols/DDC (DVD)/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/80.svg b/src/img/symbols/DDD (GVL)/80.svg
new file mode 100644
index 00000000..177e0fce
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/C.svg b/src/img/symbols/DDD (GVL)/C.svg
new file mode 100644
index 00000000..15fd2459
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/M.svg b/src/img/symbols/DDD (GVL)/M.svg
new file mode 100644
index 00000000..c9abcf2a
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/R.svg b/src/img/symbols/DDD (GVL)/R.svg
new file mode 100644
index 00000000..ad9ffb84
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/T.svg b/src/img/symbols/DDD (GVL)/T.svg
new file mode 100644
index 00000000..02549d3e
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/U.svg b/src/img/symbols/DDD (GVL)/U.svg
new file mode 100644
index 00000000..b7f51936
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDD (GVL)/WM.svg b/src/img/symbols/DDD (GVL)/WM.svg
new file mode 100644
index 00000000..0bcee6e5
--- /dev/null
+++ b/src/img/symbols/DDD (GVL)/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDE/80.svg b/src/img/symbols/DDE/80.svg
new file mode 100644
index 00000000..001fc938
--- /dev/null
+++ b/src/img/symbols/DDE/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDE/C.svg b/src/img/symbols/DDE/C.svg
new file mode 100644
index 00000000..5f8a5a12
--- /dev/null
+++ b/src/img/symbols/DDE/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDE/M.svg b/src/img/symbols/DDE/M.svg
new file mode 100644
index 00000000..8e14516b
--- /dev/null
+++ b/src/img/symbols/DDE/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DDE/R.svg b/src/img/symbols/DDE/R.svg
new file mode 100644
index 00000000..0d5d6e08
--- /dev/null
+++ b/src/img/symbols/DDE/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDE/T.svg b/src/img/symbols/DDE/T.svg
new file mode 100644
index 00000000..72b60807
--- /dev/null
+++ b/src/img/symbols/DDE/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDE/U.svg b/src/img/symbols/DDE/U.svg
new file mode 100644
index 00000000..170e47a7
--- /dev/null
+++ b/src/img/symbols/DDE/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDE/WM.svg b/src/img/symbols/DDE/WM.svg
new file mode 100644
index 00000000..b41d1596
--- /dev/null
+++ b/src/img/symbols/DDE/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDF/80.svg b/src/img/symbols/DDF/80.svg
new file mode 100644
index 00000000..70fe55aa
--- /dev/null
+++ b/src/img/symbols/DDF/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDF/C.svg b/src/img/symbols/DDF/C.svg
new file mode 100644
index 00000000..6bf3ddf2
--- /dev/null
+++ b/src/img/symbols/DDF/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDF/M.svg b/src/img/symbols/DDF/M.svg
new file mode 100644
index 00000000..c01057ca
--- /dev/null
+++ b/src/img/symbols/DDF/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDF/R.svg b/src/img/symbols/DDF/R.svg
new file mode 100644
index 00000000..b31d4f80
--- /dev/null
+++ b/src/img/symbols/DDF/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDF/T.svg b/src/img/symbols/DDF/T.svg
new file mode 100644
index 00000000..97ff85c4
--- /dev/null
+++ b/src/img/symbols/DDF/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDF/U.svg b/src/img/symbols/DDF/U.svg
new file mode 100644
index 00000000..a422bbc1
--- /dev/null
+++ b/src/img/symbols/DDF/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDF/WM.svg b/src/img/symbols/DDF/WM.svg
new file mode 100644
index 00000000..acaaa8ff
--- /dev/null
+++ b/src/img/symbols/DDF/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDG/80.svg b/src/img/symbols/DDG/80.svg
new file mode 100644
index 00000000..d7cdd496
--- /dev/null
+++ b/src/img/symbols/DDG/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDG/C.svg b/src/img/symbols/DDG/C.svg
new file mode 100644
index 00000000..4fd6bc29
--- /dev/null
+++ b/src/img/symbols/DDG/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDG/M.svg b/src/img/symbols/DDG/M.svg
new file mode 100644
index 00000000..0af0467b
--- /dev/null
+++ b/src/img/symbols/DDG/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DDG/R.svg b/src/img/symbols/DDG/R.svg
new file mode 100644
index 00000000..9f16be80
--- /dev/null
+++ b/src/img/symbols/DDG/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDG/T.svg b/src/img/symbols/DDG/T.svg
new file mode 100644
index 00000000..e43232f5
--- /dev/null
+++ b/src/img/symbols/DDG/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDG/U.svg b/src/img/symbols/DDG/U.svg
new file mode 100644
index 00000000..7a4f382b
--- /dev/null
+++ b/src/img/symbols/DDG/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDG/WM.svg b/src/img/symbols/DDG/WM.svg
new file mode 100644
index 00000000..52e66e3d
--- /dev/null
+++ b/src/img/symbols/DDG/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDH/80.svg b/src/img/symbols/DDH/80.svg
new file mode 100644
index 00000000..c362cb30
--- /dev/null
+++ b/src/img/symbols/DDH/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DDH/C.svg b/src/img/symbols/DDH/C.svg
new file mode 100644
index 00000000..5223e811
--- /dev/null
+++ b/src/img/symbols/DDH/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DDH/M.svg b/src/img/symbols/DDH/M.svg
new file mode 100644
index 00000000..18e9dac2
--- /dev/null
+++ b/src/img/symbols/DDH/M.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/DDH/R.svg b/src/img/symbols/DDH/R.svg
new file mode 100644
index 00000000..1e5ed85b
--- /dev/null
+++ b/src/img/symbols/DDH/R.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/DDH/T.svg b/src/img/symbols/DDH/T.svg
new file mode 100644
index 00000000..45b6646b
--- /dev/null
+++ b/src/img/symbols/DDH/T.svg
@@ -0,0 +1,72 @@
+
+
diff --git a/src/img/symbols/DDH/U.svg b/src/img/symbols/DDH/U.svg
new file mode 100644
index 00000000..79238a31
--- /dev/null
+++ b/src/img/symbols/DDH/U.svg
@@ -0,0 +1,43 @@
+
+
diff --git a/src/img/symbols/DDH/WM.svg b/src/img/symbols/DDH/WM.svg
new file mode 100644
index 00000000..47b20a7d
--- /dev/null
+++ b/src/img/symbols/DDH/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DDI/80.svg b/src/img/symbols/DDI/80.svg
new file mode 100644
index 00000000..580a47c2
--- /dev/null
+++ b/src/img/symbols/DDI/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/DDI/C.svg b/src/img/symbols/DDI/C.svg
new file mode 100644
index 00000000..0590d915
--- /dev/null
+++ b/src/img/symbols/DDI/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/DDI/M.svg b/src/img/symbols/DDI/M.svg
new file mode 100644
index 00000000..e5a4458a
--- /dev/null
+++ b/src/img/symbols/DDI/M.svg
@@ -0,0 +1,30 @@
+
+
diff --git a/src/img/symbols/DDI/R.svg b/src/img/symbols/DDI/R.svg
new file mode 100644
index 00000000..6705576f
--- /dev/null
+++ b/src/img/symbols/DDI/R.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/DDI/T.svg b/src/img/symbols/DDI/T.svg
new file mode 100644
index 00000000..17611036
--- /dev/null
+++ b/src/img/symbols/DDI/T.svg
@@ -0,0 +1,30 @@
+
+
diff --git a/src/img/symbols/DDI/U.svg b/src/img/symbols/DDI/U.svg
new file mode 100644
index 00000000..e2ee3948
--- /dev/null
+++ b/src/img/symbols/DDI/U.svg
@@ -0,0 +1,30 @@
+
+
diff --git a/src/img/symbols/DDI/WM.svg b/src/img/symbols/DDI/WM.svg
new file mode 100644
index 00000000..93e32bcc
--- /dev/null
+++ b/src/img/symbols/DDI/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DDJ/80.svg b/src/img/symbols/DDJ/80.svg
new file mode 100644
index 00000000..39dac06d
--- /dev/null
+++ b/src/img/symbols/DDJ/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDJ/C.svg b/src/img/symbols/DDJ/C.svg
new file mode 100644
index 00000000..25d8fb68
--- /dev/null
+++ b/src/img/symbols/DDJ/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DDJ/M.svg b/src/img/symbols/DDJ/M.svg
new file mode 100644
index 00000000..ea3308ee
--- /dev/null
+++ b/src/img/symbols/DDJ/M.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/DDJ/R.svg b/src/img/symbols/DDJ/R.svg
new file mode 100644
index 00000000..23f0028b
--- /dev/null
+++ b/src/img/symbols/DDJ/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDJ/T.svg b/src/img/symbols/DDJ/T.svg
new file mode 100644
index 00000000..7c8f6af2
--- /dev/null
+++ b/src/img/symbols/DDJ/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDJ/U.svg b/src/img/symbols/DDJ/U.svg
new file mode 100644
index 00000000..f0220dd4
--- /dev/null
+++ b/src/img/symbols/DDJ/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDJ/WM.svg b/src/img/symbols/DDJ/WM.svg
new file mode 100644
index 00000000..a2401be8
--- /dev/null
+++ b/src/img/symbols/DDJ/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDK/80.svg b/src/img/symbols/DDK/80.svg
new file mode 100644
index 00000000..642f8e38
--- /dev/null
+++ b/src/img/symbols/DDK/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DDK/C.svg b/src/img/symbols/DDK/C.svg
new file mode 100644
index 00000000..315116ed
--- /dev/null
+++ b/src/img/symbols/DDK/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DDK/M.svg b/src/img/symbols/DDK/M.svg
new file mode 100644
index 00000000..582050fd
--- /dev/null
+++ b/src/img/symbols/DDK/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DDK/R.svg b/src/img/symbols/DDK/R.svg
new file mode 100644
index 00000000..21c406b0
--- /dev/null
+++ b/src/img/symbols/DDK/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DDK/T.svg b/src/img/symbols/DDK/T.svg
new file mode 100644
index 00000000..481a17e9
--- /dev/null
+++ b/src/img/symbols/DDK/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DDK/U.svg b/src/img/symbols/DDK/U.svg
new file mode 100644
index 00000000..3863994d
--- /dev/null
+++ b/src/img/symbols/DDK/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DDK/WM.svg b/src/img/symbols/DDK/WM.svg
new file mode 100644
index 00000000..5309bf0f
--- /dev/null
+++ b/src/img/symbols/DDK/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DDL/80.svg b/src/img/symbols/DDL/80.svg
new file mode 100644
index 00000000..ee07ce0b
--- /dev/null
+++ b/src/img/symbols/DDL/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DDL/C.svg b/src/img/symbols/DDL/C.svg
new file mode 100644
index 00000000..a4d1a694
--- /dev/null
+++ b/src/img/symbols/DDL/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DDL/M.svg b/src/img/symbols/DDL/M.svg
new file mode 100644
index 00000000..70de48e8
--- /dev/null
+++ b/src/img/symbols/DDL/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDL/R.svg b/src/img/symbols/DDL/R.svg
new file mode 100644
index 00000000..ee56e9a3
--- /dev/null
+++ b/src/img/symbols/DDL/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DDL/T.svg b/src/img/symbols/DDL/T.svg
new file mode 100644
index 00000000..ba81f1d5
--- /dev/null
+++ b/src/img/symbols/DDL/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DDL/U.svg b/src/img/symbols/DDL/U.svg
new file mode 100644
index 00000000..5e4a53e3
--- /dev/null
+++ b/src/img/symbols/DDL/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DDL/WM.svg b/src/img/symbols/DDL/WM.svg
new file mode 100644
index 00000000..b9efac11
--- /dev/null
+++ b/src/img/symbols/DDL/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DDM/80.svg b/src/img/symbols/DDM/80.svg
new file mode 100644
index 00000000..95f2640b
--- /dev/null
+++ b/src/img/symbols/DDM/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDM/C.svg b/src/img/symbols/DDM/C.svg
new file mode 100644
index 00000000..4b30982a
--- /dev/null
+++ b/src/img/symbols/DDM/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDM/M.svg b/src/img/symbols/DDM/M.svg
new file mode 100644
index 00000000..db179a11
--- /dev/null
+++ b/src/img/symbols/DDM/M.svg
@@ -0,0 +1,79 @@
+
+
diff --git a/src/img/symbols/DDM/R.svg b/src/img/symbols/DDM/R.svg
new file mode 100644
index 00000000..a48f68ad
--- /dev/null
+++ b/src/img/symbols/DDM/R.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/DDM/T.svg b/src/img/symbols/DDM/T.svg
new file mode 100644
index 00000000..f1e9e9fe
--- /dev/null
+++ b/src/img/symbols/DDM/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/DDM/U.svg b/src/img/symbols/DDM/U.svg
new file mode 100644
index 00000000..475b857b
--- /dev/null
+++ b/src/img/symbols/DDM/U.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/DDM/WM.svg b/src/img/symbols/DDM/WM.svg
new file mode 100644
index 00000000..972c8487
--- /dev/null
+++ b/src/img/symbols/DDM/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/DDN/80.svg b/src/img/symbols/DDN/80.svg
new file mode 100644
index 00000000..098bd6bf
--- /dev/null
+++ b/src/img/symbols/DDN/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDN/C.svg b/src/img/symbols/DDN/C.svg
new file mode 100644
index 00000000..65f98d84
--- /dev/null
+++ b/src/img/symbols/DDN/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDN/M.svg b/src/img/symbols/DDN/M.svg
new file mode 100644
index 00000000..81c934e6
--- /dev/null
+++ b/src/img/symbols/DDN/M.svg
@@ -0,0 +1,71 @@
+
+
diff --git a/src/img/symbols/DDN/R.svg b/src/img/symbols/DDN/R.svg
new file mode 100644
index 00000000..3ebe9f2e
--- /dev/null
+++ b/src/img/symbols/DDN/R.svg
@@ -0,0 +1,71 @@
+
+
diff --git a/src/img/symbols/DDN/T.svg b/src/img/symbols/DDN/T.svg
new file mode 100644
index 00000000..feebe86a
--- /dev/null
+++ b/src/img/symbols/DDN/T.svg
@@ -0,0 +1,72 @@
+
+
diff --git a/src/img/symbols/DDN/U.svg b/src/img/symbols/DDN/U.svg
new file mode 100644
index 00000000..fac1da1a
--- /dev/null
+++ b/src/img/symbols/DDN/U.svg
@@ -0,0 +1,71 @@
+
+
diff --git a/src/img/symbols/DDN/WM.svg b/src/img/symbols/DDN/WM.svg
new file mode 100644
index 00000000..0dbef015
--- /dev/null
+++ b/src/img/symbols/DDN/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/DDO/80.svg b/src/img/symbols/DDO/80.svg
new file mode 100644
index 00000000..35435a96
--- /dev/null
+++ b/src/img/symbols/DDO/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDO/C.svg b/src/img/symbols/DDO/C.svg
new file mode 100644
index 00000000..879f7d9f
--- /dev/null
+++ b/src/img/symbols/DDO/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDO/M.svg b/src/img/symbols/DDO/M.svg
new file mode 100644
index 00000000..dbd33907
--- /dev/null
+++ b/src/img/symbols/DDO/M.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/DDO/R.svg b/src/img/symbols/DDO/R.svg
new file mode 100644
index 00000000..18449eb2
--- /dev/null
+++ b/src/img/symbols/DDO/R.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/DDO/T.svg b/src/img/symbols/DDO/T.svg
new file mode 100644
index 00000000..ff6b2b15
--- /dev/null
+++ b/src/img/symbols/DDO/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/DDO/U.svg b/src/img/symbols/DDO/U.svg
new file mode 100644
index 00000000..0583ce2a
--- /dev/null
+++ b/src/img/symbols/DDO/U.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/DDO/WM.svg b/src/img/symbols/DDO/WM.svg
new file mode 100644
index 00000000..1741721b
--- /dev/null
+++ b/src/img/symbols/DDO/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/DDP/80.svg b/src/img/symbols/DDP/80.svg
new file mode 100644
index 00000000..416ccefc
--- /dev/null
+++ b/src/img/symbols/DDP/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDP/C.svg b/src/img/symbols/DDP/C.svg
new file mode 100644
index 00000000..add78dee
--- /dev/null
+++ b/src/img/symbols/DDP/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDP/M.svg b/src/img/symbols/DDP/M.svg
new file mode 100644
index 00000000..707d45a4
--- /dev/null
+++ b/src/img/symbols/DDP/M.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/src/img/symbols/DDP/R.svg b/src/img/symbols/DDP/R.svg
new file mode 100644
index 00000000..b7e4dd07
--- /dev/null
+++ b/src/img/symbols/DDP/R.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/src/img/symbols/DDP/T.svg b/src/img/symbols/DDP/T.svg
new file mode 100644
index 00000000..c5ce219c
--- /dev/null
+++ b/src/img/symbols/DDP/T.svg
@@ -0,0 +1,67 @@
+
+
diff --git a/src/img/symbols/DDP/U.svg b/src/img/symbols/DDP/U.svg
new file mode 100644
index 00000000..4f15e682
--- /dev/null
+++ b/src/img/symbols/DDP/U.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/src/img/symbols/DDP/WM.svg b/src/img/symbols/DDP/WM.svg
new file mode 100644
index 00000000..69f37f17
--- /dev/null
+++ b/src/img/symbols/DDP/WM.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/DDQ/80.svg b/src/img/symbols/DDQ/80.svg
new file mode 100644
index 00000000..692c99b8
--- /dev/null
+++ b/src/img/symbols/DDQ/80.svg
@@ -0,0 +1,52 @@
+
+
diff --git a/src/img/symbols/DDQ/C.svg b/src/img/symbols/DDQ/C.svg
new file mode 100644
index 00000000..fe084bcd
--- /dev/null
+++ b/src/img/symbols/DDQ/C.svg
@@ -0,0 +1,52 @@
+
+
diff --git a/src/img/symbols/DDQ/M.svg b/src/img/symbols/DDQ/M.svg
new file mode 100644
index 00000000..12a4a847
--- /dev/null
+++ b/src/img/symbols/DDQ/M.svg
@@ -0,0 +1,112 @@
+
+
diff --git a/src/img/symbols/DDQ/R.svg b/src/img/symbols/DDQ/R.svg
new file mode 100644
index 00000000..e34a721a
--- /dev/null
+++ b/src/img/symbols/DDQ/R.svg
@@ -0,0 +1,112 @@
+
+
diff --git a/src/img/symbols/DDQ/T.svg b/src/img/symbols/DDQ/T.svg
new file mode 100644
index 00000000..a5594726
--- /dev/null
+++ b/src/img/symbols/DDQ/T.svg
@@ -0,0 +1,114 @@
+
+
diff --git a/src/img/symbols/DDQ/U.svg b/src/img/symbols/DDQ/U.svg
new file mode 100644
index 00000000..c2b89bea
--- /dev/null
+++ b/src/img/symbols/DDQ/U.svg
@@ -0,0 +1,112 @@
+
+
diff --git a/src/img/symbols/DDQ/WM.svg b/src/img/symbols/DDQ/WM.svg
new file mode 100644
index 00000000..9f37237c
--- /dev/null
+++ b/src/img/symbols/DDQ/WM.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDR/80.svg b/src/img/symbols/DDR/80.svg
new file mode 100644
index 00000000..a6321113
--- /dev/null
+++ b/src/img/symbols/DDR/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDR/C.svg b/src/img/symbols/DDR/C.svg
new file mode 100644
index 00000000..2a3a22dc
--- /dev/null
+++ b/src/img/symbols/DDR/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/DDR/M.svg b/src/img/symbols/DDR/M.svg
new file mode 100644
index 00000000..b6ef5355
--- /dev/null
+++ b/src/img/symbols/DDR/M.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/src/img/symbols/DDR/R.svg b/src/img/symbols/DDR/R.svg
new file mode 100644
index 00000000..6f743b06
--- /dev/null
+++ b/src/img/symbols/DDR/R.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/src/img/symbols/DDR/T.svg b/src/img/symbols/DDR/T.svg
new file mode 100644
index 00000000..684fe2ff
--- /dev/null
+++ b/src/img/symbols/DDR/T.svg
@@ -0,0 +1,67 @@
+
+
diff --git a/src/img/symbols/DDR/U.svg b/src/img/symbols/DDR/U.svg
new file mode 100644
index 00000000..a03c5c43
--- /dev/null
+++ b/src/img/symbols/DDR/U.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/src/img/symbols/DDR/WM.svg b/src/img/symbols/DDR/WM.svg
new file mode 100644
index 00000000..458b8312
--- /dev/null
+++ b/src/img/symbols/DDR/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/DDS/80.svg b/src/img/symbols/DDS/80.svg
new file mode 100644
index 00000000..e04a38b6
--- /dev/null
+++ b/src/img/symbols/DDS/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/DDS/C.svg b/src/img/symbols/DDS/C.svg
new file mode 100644
index 00000000..10071eca
--- /dev/null
+++ b/src/img/symbols/DDS/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/DDS/M.svg b/src/img/symbols/DDS/M.svg
new file mode 100644
index 00000000..ce73f86b
--- /dev/null
+++ b/src/img/symbols/DDS/M.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/DDS/R.svg b/src/img/symbols/DDS/R.svg
new file mode 100644
index 00000000..3e14619b
--- /dev/null
+++ b/src/img/symbols/DDS/R.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/DDS/T.svg b/src/img/symbols/DDS/T.svg
new file mode 100644
index 00000000..7db39f8a
--- /dev/null
+++ b/src/img/symbols/DDS/T.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/DDS/U.svg b/src/img/symbols/DDS/U.svg
new file mode 100644
index 00000000..a0d41d0f
--- /dev/null
+++ b/src/img/symbols/DDS/U.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/DDS/WM.svg b/src/img/symbols/DDS/WM.svg
new file mode 100644
index 00000000..2f05eac7
--- /dev/null
+++ b/src/img/symbols/DDS/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DDT/80.svg b/src/img/symbols/DDT/80.svg
new file mode 100644
index 00000000..578f0429
--- /dev/null
+++ b/src/img/symbols/DDT/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DDT/C.svg b/src/img/symbols/DDT/C.svg
new file mode 100644
index 00000000..25d9db71
--- /dev/null
+++ b/src/img/symbols/DDT/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/DDT/M.svg b/src/img/symbols/DDT/M.svg
new file mode 100644
index 00000000..ded75be7
--- /dev/null
+++ b/src/img/symbols/DDT/M.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DDT/R.svg b/src/img/symbols/DDT/R.svg
new file mode 100644
index 00000000..40cc91fd
--- /dev/null
+++ b/src/img/symbols/DDT/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DDT/T.svg b/src/img/symbols/DDT/T.svg
new file mode 100644
index 00000000..0a93efe3
--- /dev/null
+++ b/src/img/symbols/DDT/T.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DDT/U.svg b/src/img/symbols/DDT/U.svg
new file mode 100644
index 00000000..a0ad782a
--- /dev/null
+++ b/src/img/symbols/DDT/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DDT/WM.svg b/src/img/symbols/DDT/WM.svg
new file mode 100644
index 00000000..3c028e9c
--- /dev/null
+++ b/src/img/symbols/DDT/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DDU/80.svg b/src/img/symbols/DDU/80.svg
new file mode 100644
index 00000000..41203b3c
--- /dev/null
+++ b/src/img/symbols/DDU/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/DDU/C.svg b/src/img/symbols/DDU/C.svg
new file mode 100644
index 00000000..8f8c963b
--- /dev/null
+++ b/src/img/symbols/DDU/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/DDU/M.svg b/src/img/symbols/DDU/M.svg
new file mode 100644
index 00000000..b22ce94f
--- /dev/null
+++ b/src/img/symbols/DDU/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDU/R.svg b/src/img/symbols/DDU/R.svg
new file mode 100644
index 00000000..f5110d65
--- /dev/null
+++ b/src/img/symbols/DDU/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDU/T.svg b/src/img/symbols/DDU/T.svg
new file mode 100644
index 00000000..ded28be2
--- /dev/null
+++ b/src/img/symbols/DDU/T.svg
@@ -0,0 +1,79 @@
+
+
diff --git a/src/img/symbols/DDU/U.svg b/src/img/symbols/DDU/U.svg
new file mode 100644
index 00000000..503fb096
--- /dev/null
+++ b/src/img/symbols/DDU/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DDU/WM.svg b/src/img/symbols/DDU/WM.svg
new file mode 100644
index 00000000..df781066
--- /dev/null
+++ b/src/img/symbols/DDU/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DGM/80.svg b/src/img/symbols/DGM/80.svg
new file mode 100644
index 00000000..33ed284f
--- /dev/null
+++ b/src/img/symbols/DGM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DGM/C.svg b/src/img/symbols/DGM/C.svg
new file mode 100644
index 00000000..0cbca6c7
--- /dev/null
+++ b/src/img/symbols/DGM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DGM/M.svg b/src/img/symbols/DGM/M.svg
new file mode 100644
index 00000000..58757baa
--- /dev/null
+++ b/src/img/symbols/DGM/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DGM/R.svg b/src/img/symbols/DGM/R.svg
new file mode 100644
index 00000000..4148f744
--- /dev/null
+++ b/src/img/symbols/DGM/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DGM/T.svg b/src/img/symbols/DGM/T.svg
new file mode 100644
index 00000000..18dad0a9
--- /dev/null
+++ b/src/img/symbols/DGM/T.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DGM/U.svg b/src/img/symbols/DGM/U.svg
new file mode 100644
index 00000000..cfa42783
--- /dev/null
+++ b/src/img/symbols/DGM/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/DGM/WM.svg b/src/img/symbols/DGM/WM.svg
new file mode 100644
index 00000000..13cfd8ae
--- /dev/null
+++ b/src/img/symbols/DGM/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DIS/80.svg b/src/img/symbols/DIS/80.svg
new file mode 100644
index 00000000..a30a87f1
--- /dev/null
+++ b/src/img/symbols/DIS/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DIS/C.svg b/src/img/symbols/DIS/C.svg
new file mode 100644
index 00000000..ed4ba981
--- /dev/null
+++ b/src/img/symbols/DIS/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DIS/M.svg b/src/img/symbols/DIS/M.svg
new file mode 100644
index 00000000..7729eb38
--- /dev/null
+++ b/src/img/symbols/DIS/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DIS/R.svg b/src/img/symbols/DIS/R.svg
new file mode 100644
index 00000000..0b185913
--- /dev/null
+++ b/src/img/symbols/DIS/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DIS/T.svg b/src/img/symbols/DIS/T.svg
new file mode 100644
index 00000000..461deb95
--- /dev/null
+++ b/src/img/symbols/DIS/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DIS/U.svg b/src/img/symbols/DIS/U.svg
new file mode 100644
index 00000000..4311324e
--- /dev/null
+++ b/src/img/symbols/DIS/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DIS/WM.svg b/src/img/symbols/DIS/WM.svg
new file mode 100644
index 00000000..ade539b4
--- /dev/null
+++ b/src/img/symbols/DIS/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DKA/80.svg b/src/img/symbols/DKA/80.svg
new file mode 100644
index 00000000..99e781e6
--- /dev/null
+++ b/src/img/symbols/DKA/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DKA/C.svg b/src/img/symbols/DKA/C.svg
new file mode 100644
index 00000000..daaa61a9
--- /dev/null
+++ b/src/img/symbols/DKA/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DKA/M.svg b/src/img/symbols/DKA/M.svg
new file mode 100644
index 00000000..211d5cb4
--- /dev/null
+++ b/src/img/symbols/DKA/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DKA/R.svg b/src/img/symbols/DKA/R.svg
new file mode 100644
index 00000000..4ddca3c2
--- /dev/null
+++ b/src/img/symbols/DKA/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DKA/T.svg b/src/img/symbols/DKA/T.svg
new file mode 100644
index 00000000..27a502ac
--- /dev/null
+++ b/src/img/symbols/DKA/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DKA/U.svg b/src/img/symbols/DKA/U.svg
new file mode 100644
index 00000000..bd4cd1ae
--- /dev/null
+++ b/src/img/symbols/DKA/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DKA/Watermark - M25.svg b/src/img/symbols/DKA/Watermark - M25.svg
new file mode 100644
index 00000000..6df7b5cc
--- /dev/null
+++ b/src/img/symbols/DKA/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/DKM/80.svg b/src/img/symbols/DKM/80.svg
new file mode 100644
index 00000000..7037549c
--- /dev/null
+++ b/src/img/symbols/DKM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DKM/C.svg b/src/img/symbols/DKM/C.svg
new file mode 100644
index 00000000..d2836108
--- /dev/null
+++ b/src/img/symbols/DKM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DKM/M.svg b/src/img/symbols/DKM/M.svg
new file mode 100644
index 00000000..27ff638b
--- /dev/null
+++ b/src/img/symbols/DKM/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DKM/R.svg b/src/img/symbols/DKM/R.svg
new file mode 100644
index 00000000..84bff960
--- /dev/null
+++ b/src/img/symbols/DKM/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DKM/T.svg b/src/img/symbols/DKM/T.svg
new file mode 100644
index 00000000..60bfe10b
--- /dev/null
+++ b/src/img/symbols/DKM/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DKM/U.svg b/src/img/symbols/DKM/U.svg
new file mode 100644
index 00000000..3b575b47
--- /dev/null
+++ b/src/img/symbols/DKM/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DKM/WM.svg b/src/img/symbols/DKM/WM.svg
new file mode 100644
index 00000000..232b328b
--- /dev/null
+++ b/src/img/symbols/DKM/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DMC/80.svg b/src/img/symbols/DMC/80.svg
new file mode 100644
index 00000000..8283ee13
--- /dev/null
+++ b/src/img/symbols/DMC/80.svg
@@ -0,0 +1,38 @@
+
+
+
+
diff --git a/src/img/symbols/DMC/C.svg b/src/img/symbols/DMC/C.svg
new file mode 100644
index 00000000..2deff22b
--- /dev/null
+++ b/src/img/symbols/DMC/C.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/DMC/M.svg b/src/img/symbols/DMC/M.svg
new file mode 100644
index 00000000..70538608
--- /dev/null
+++ b/src/img/symbols/DMC/M.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/DMC/R.svg b/src/img/symbols/DMC/R.svg
new file mode 100644
index 00000000..830235fc
--- /dev/null
+++ b/src/img/symbols/DMC/R.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/DMC/T.svg b/src/img/symbols/DMC/T.svg
new file mode 100644
index 00000000..bafb4de8
--- /dev/null
+++ b/src/img/symbols/DMC/T.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/DMC/U.svg b/src/img/symbols/DMC/U.svg
new file mode 100644
index 00000000..f42f225d
--- /dev/null
+++ b/src/img/symbols/DMC/U.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/DMC/WM.svg b/src/img/symbols/DMC/WM.svg
new file mode 100644
index 00000000..07467c26
--- /dev/null
+++ b/src/img/symbols/DMC/WM.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/DMR/80.svg b/src/img/symbols/DMR/80.svg
new file mode 100644
index 00000000..fd0e85b2
--- /dev/null
+++ b/src/img/symbols/DMR/80.svg
@@ -0,0 +1,34 @@
+
+
+
+
diff --git a/src/img/symbols/DMR/C.svg b/src/img/symbols/DMR/C.svg
new file mode 100644
index 00000000..1ee4a91b
--- /dev/null
+++ b/src/img/symbols/DMR/C.svg
@@ -0,0 +1,34 @@
+
+
+
+
diff --git a/src/img/symbols/DMR/M.svg b/src/img/symbols/DMR/M.svg
new file mode 100644
index 00000000..fbfe88a8
--- /dev/null
+++ b/src/img/symbols/DMR/M.svg
@@ -0,0 +1,122 @@
+
+
+
+
diff --git a/src/img/symbols/DMR/R.svg b/src/img/symbols/DMR/R.svg
new file mode 100644
index 00000000..b7474d78
--- /dev/null
+++ b/src/img/symbols/DMR/R.svg
@@ -0,0 +1,114 @@
+
+
+
+
diff --git a/src/img/symbols/DMR/U.svg b/src/img/symbols/DMR/U.svg
new file mode 100644
index 00000000..d5761b0e
--- /dev/null
+++ b/src/img/symbols/DMR/U.svg
@@ -0,0 +1,122 @@
+
+
+
+
diff --git a/src/img/symbols/DMR/WM.svg b/src/img/symbols/DMR/WM.svg
new file mode 100644
index 00000000..f01fa5ff
--- /dev/null
+++ b/src/img/symbols/DMR/WM.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/80.svg b/src/img/symbols/DMU/80.svg
new file mode 100644
index 00000000..22c78cb9
--- /dev/null
+++ b/src/img/symbols/DMU/80.svg
@@ -0,0 +1,34 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/C.svg b/src/img/symbols/DMU/C.svg
new file mode 100644
index 00000000..facf4da1
--- /dev/null
+++ b/src/img/symbols/DMU/C.svg
@@ -0,0 +1,33 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/M.svg b/src/img/symbols/DMU/M.svg
new file mode 100644
index 00000000..53b8e3cb
--- /dev/null
+++ b/src/img/symbols/DMU/M.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/R.svg b/src/img/symbols/DMU/R.svg
new file mode 100644
index 00000000..66cf49a9
--- /dev/null
+++ b/src/img/symbols/DMU/R.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/T.svg b/src/img/symbols/DMU/T.svg
new file mode 100644
index 00000000..6e9c9439
--- /dev/null
+++ b/src/img/symbols/DMU/T.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/U.svg b/src/img/symbols/DMU/U.svg
new file mode 100644
index 00000000..857f4642
--- /dev/null
+++ b/src/img/symbols/DMU/U.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/DMU/WM.svg b/src/img/symbols/DMU/WM.svg
new file mode 100644
index 00000000..3cb7c676
--- /dev/null
+++ b/src/img/symbols/DMU/WM.svg
@@ -0,0 +1,27 @@
+
+
+
+
diff --git a/src/img/symbols/DNDFR/C.svg b/src/img/symbols/DNDFR/C.svg
new file mode 100644
index 00000000..72f0ff1a
--- /dev/null
+++ b/src/img/symbols/DNDFR/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/DNDFR/M.svg b/src/img/symbols/DNDFR/M.svg
new file mode 100644
index 00000000..92425db5
--- /dev/null
+++ b/src/img/symbols/DNDFR/M.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/DNDFR/R.svg b/src/img/symbols/DNDFR/R.svg
new file mode 100644
index 00000000..d0f68f30
--- /dev/null
+++ b/src/img/symbols/DNDFR/R.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/DNDFR/U.svg b/src/img/symbols/DNDFR/U.svg
new file mode 100644
index 00000000..213034c6
--- /dev/null
+++ b/src/img/symbols/DNDFR/U.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/DOM/80.svg b/src/img/symbols/DOM/80.svg
new file mode 100644
index 00000000..b359c125
--- /dev/null
+++ b/src/img/symbols/DOM/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DOM/C.svg b/src/img/symbols/DOM/C.svg
new file mode 100644
index 00000000..69f6ada5
--- /dev/null
+++ b/src/img/symbols/DOM/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/DOM/M.svg b/src/img/symbols/DOM/M.svg
new file mode 100644
index 00000000..0f1c9fa2
--- /dev/null
+++ b/src/img/symbols/DOM/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DOM/R.svg b/src/img/symbols/DOM/R.svg
new file mode 100644
index 00000000..1c95f46c
--- /dev/null
+++ b/src/img/symbols/DOM/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DOM/T.svg b/src/img/symbols/DOM/T.svg
new file mode 100644
index 00000000..b2b44c45
--- /dev/null
+++ b/src/img/symbols/DOM/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DOM/U.svg b/src/img/symbols/DOM/U.svg
new file mode 100644
index 00000000..1eb66bf2
--- /dev/null
+++ b/src/img/symbols/DOM/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DOM/WM.svg b/src/img/symbols/DOM/WM.svg
new file mode 100644
index 00000000..df02678d
--- /dev/null
+++ b/src/img/symbols/DOM/WM.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/DPA/80.svg b/src/img/symbols/DPA/80.svg
new file mode 100644
index 00000000..4095a9b1
--- /dev/null
+++ b/src/img/symbols/DPA/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DPA/C.svg b/src/img/symbols/DPA/C.svg
new file mode 100644
index 00000000..74374e18
--- /dev/null
+++ b/src/img/symbols/DPA/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DPA/M.svg b/src/img/symbols/DPA/M.svg
new file mode 100644
index 00000000..9a090eeb
--- /dev/null
+++ b/src/img/symbols/DPA/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DPA/R.svg b/src/img/symbols/DPA/R.svg
new file mode 100644
index 00000000..299fe768
--- /dev/null
+++ b/src/img/symbols/DPA/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DPA/T.svg b/src/img/symbols/DPA/T.svg
new file mode 100644
index 00000000..eab1cbdd
--- /dev/null
+++ b/src/img/symbols/DPA/T.svg
@@ -0,0 +1,98 @@
+
+
diff --git a/src/img/symbols/DPA/U.svg b/src/img/symbols/DPA/U.svg
new file mode 100644
index 00000000..b4c950f7
--- /dev/null
+++ b/src/img/symbols/DPA/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DPA/WM.svg b/src/img/symbols/DPA/WM.svg
new file mode 100644
index 00000000..9d308571
--- /dev/null
+++ b/src/img/symbols/DPA/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/80.svg b/src/img/symbols/DPA_ALT1/80.svg
new file mode 100644
index 00000000..2269b7a0
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/C.svg b/src/img/symbols/DPA_ALT1/C.svg
new file mode 100644
index 00000000..1e2f5958
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/M.svg b/src/img/symbols/DPA_ALT1/M.svg
new file mode 100644
index 00000000..ce50978b
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/R.svg b/src/img/symbols/DPA_ALT1/R.svg
new file mode 100644
index 00000000..1a5d16a9
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/T.svg b/src/img/symbols/DPA_ALT1/T.svg
new file mode 100644
index 00000000..b6cc2f04
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/U.svg b/src/img/symbols/DPA_ALT1/U.svg
new file mode 100644
index 00000000..57e19f5a
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/DPA_ALT1/WM.svg b/src/img/symbols/DPA_ALT1/WM.svg
new file mode 100644
index 00000000..f661f80d
--- /dev/null
+++ b/src/img/symbols/DPA_ALT1/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/80.svg b/src/img/symbols/DPA_ALT2/80.svg
new file mode 100644
index 00000000..912a9c2e
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/80.svg
@@ -0,0 +1,45 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/C.svg b/src/img/symbols/DPA_ALT2/C.svg
new file mode 100644
index 00000000..8e263cba
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/C.svg
@@ -0,0 +1,45 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/M.svg b/src/img/symbols/DPA_ALT2/M.svg
new file mode 100644
index 00000000..34075b98
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/M.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/R.svg b/src/img/symbols/DPA_ALT2/R.svg
new file mode 100644
index 00000000..1fc6377e
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/R.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/T.svg b/src/img/symbols/DPA_ALT2/T.svg
new file mode 100644
index 00000000..09610597
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/T.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/U.svg b/src/img/symbols/DPA_ALT2/U.svg
new file mode 100644
index 00000000..aa501442
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/U.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/DPA_ALT2/WM.svg b/src/img/symbols/DPA_ALT2/WM.svg
new file mode 100644
index 00000000..251f7120
--- /dev/null
+++ b/src/img/symbols/DPA_ALT2/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/DRB/80.svg b/src/img/symbols/DRB/80.svg
new file mode 100644
index 00000000..20f4797f
--- /dev/null
+++ b/src/img/symbols/DRB/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DRB/C.svg b/src/img/symbols/DRB/C.svg
new file mode 100644
index 00000000..ca02d452
--- /dev/null
+++ b/src/img/symbols/DRB/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DRB/M.svg b/src/img/symbols/DRB/M.svg
new file mode 100644
index 00000000..f6adc557
--- /dev/null
+++ b/src/img/symbols/DRB/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/DRB/R.svg b/src/img/symbols/DRB/R.svg
new file mode 100644
index 00000000..1c2d9dad
--- /dev/null
+++ b/src/img/symbols/DRB/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DRB/T.svg b/src/img/symbols/DRB/T.svg
new file mode 100644
index 00000000..ecb44686
--- /dev/null
+++ b/src/img/symbols/DRB/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DRB/U.svg b/src/img/symbols/DRB/U.svg
new file mode 100644
index 00000000..54ccf6b7
--- /dev/null
+++ b/src/img/symbols/DRB/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DRB/WM.svg b/src/img/symbols/DRB/WM.svg
new file mode 100644
index 00000000..655575dc
--- /dev/null
+++ b/src/img/symbols/DRB/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DRK/80.svg b/src/img/symbols/DRK/80.svg
new file mode 100644
index 00000000..53bbada5
--- /dev/null
+++ b/src/img/symbols/DRK/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DRK/C - Original.svg b/src/img/symbols/DRK/C - Original.svg
new file mode 100644
index 00000000..0898e63f
--- /dev/null
+++ b/src/img/symbols/DRK/C - Original.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DRK/C.svg b/src/img/symbols/DRK/C.svg
new file mode 100644
index 00000000..16e06426
--- /dev/null
+++ b/src/img/symbols/DRK/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DRK/M.svg b/src/img/symbols/DRK/M.svg
new file mode 100644
index 00000000..95db5e17
--- /dev/null
+++ b/src/img/symbols/DRK/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DRK/R.svg b/src/img/symbols/DRK/R.svg
new file mode 100644
index 00000000..1830be21
--- /dev/null
+++ b/src/img/symbols/DRK/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DRK/T.svg b/src/img/symbols/DRK/T.svg
new file mode 100644
index 00000000..7ebc42ef
--- /dev/null
+++ b/src/img/symbols/DRK/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DRK/U.svg b/src/img/symbols/DRK/U.svg
new file mode 100644
index 00000000..4e8cf9fd
--- /dev/null
+++ b/src/img/symbols/DRK/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DRK/WM.svg b/src/img/symbols/DRK/WM.svg
new file mode 100644
index 00000000..08b4ff0c
--- /dev/null
+++ b/src/img/symbols/DRK/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DST/80.svg b/src/img/symbols/DST/80.svg
new file mode 100644
index 00000000..a54a2721
--- /dev/null
+++ b/src/img/symbols/DST/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DST/C.svg b/src/img/symbols/DST/C.svg
new file mode 100644
index 00000000..d4a1a643
--- /dev/null
+++ b/src/img/symbols/DST/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/DST/M.svg b/src/img/symbols/DST/M.svg
new file mode 100644
index 00000000..5a0793b7
--- /dev/null
+++ b/src/img/symbols/DST/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DST/R.svg b/src/img/symbols/DST/R.svg
new file mode 100644
index 00000000..4423bf6e
--- /dev/null
+++ b/src/img/symbols/DST/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DST/T.svg b/src/img/symbols/DST/T.svg
new file mode 100644
index 00000000..c908fcf5
--- /dev/null
+++ b/src/img/symbols/DST/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DST/U.svg b/src/img/symbols/DST/U.svg
new file mode 100644
index 00000000..3aa9a7d0
--- /dev/null
+++ b/src/img/symbols/DST/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/DST/WM.svg b/src/img/symbols/DST/WM.svg
new file mode 100644
index 00000000..a6e70f83
--- /dev/null
+++ b/src/img/symbols/DST/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DST/Watermark - M25.svg b/src/img/symbols/DST/Watermark - M25.svg
new file mode 100644
index 00000000..18e3dd84
--- /dev/null
+++ b/src/img/symbols/DST/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/DTK/80.svg b/src/img/symbols/DTK/80.svg
new file mode 100644
index 00000000..3daafdae
--- /dev/null
+++ b/src/img/symbols/DTK/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DTK/C.svg b/src/img/symbols/DTK/C.svg
new file mode 100644
index 00000000..8175c617
--- /dev/null
+++ b/src/img/symbols/DTK/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/DTK/M.svg b/src/img/symbols/DTK/M.svg
new file mode 100644
index 00000000..b24b30ad
--- /dev/null
+++ b/src/img/symbols/DTK/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DTK/R.svg b/src/img/symbols/DTK/R.svg
new file mode 100644
index 00000000..733c4cdd
--- /dev/null
+++ b/src/img/symbols/DTK/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DTK/T.svg b/src/img/symbols/DTK/T.svg
new file mode 100644
index 00000000..c06cc6ef
--- /dev/null
+++ b/src/img/symbols/DTK/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DTK/U.svg b/src/img/symbols/DTK/U.svg
new file mode 100644
index 00000000..39cea6c5
--- /dev/null
+++ b/src/img/symbols/DTK/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/DTK/WM.svg b/src/img/symbols/DTK/WM.svg
new file mode 100644
index 00000000..80d39f73
--- /dev/null
+++ b/src/img/symbols/DTK/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/E01/80.svg b/src/img/symbols/E01/80.svg
new file mode 100644
index 00000000..928d45df
--- /dev/null
+++ b/src/img/symbols/E01/80.svg
@@ -0,0 +1,41 @@
+
+
diff --git a/src/img/symbols/E01/C.svg b/src/img/symbols/E01/C.svg
new file mode 100644
index 00000000..84040961
--- /dev/null
+++ b/src/img/symbols/E01/C.svg
@@ -0,0 +1,41 @@
+
+
diff --git a/src/img/symbols/E01/M.svg b/src/img/symbols/E01/M.svg
new file mode 100644
index 00000000..a1686761
--- /dev/null
+++ b/src/img/symbols/E01/M.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/E01/R.svg b/src/img/symbols/E01/R.svg
new file mode 100644
index 00000000..b50eb3bd
--- /dev/null
+++ b/src/img/symbols/E01/R.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/E01/T.svg b/src/img/symbols/E01/T.svg
new file mode 100644
index 00000000..71c0f161
--- /dev/null
+++ b/src/img/symbols/E01/T.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/E01/U.svg b/src/img/symbols/E01/U.svg
new file mode 100644
index 00000000..f2eb44d9
--- /dev/null
+++ b/src/img/symbols/E01/U.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/E01/WM.svg b/src/img/symbols/E01/WM.svg
new file mode 100644
index 00000000..3ee7b387
--- /dev/null
+++ b/src/img/symbols/E01/WM.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/E02/80.svg b/src/img/symbols/E02/80.svg
new file mode 100644
index 00000000..ddfecb93
--- /dev/null
+++ b/src/img/symbols/E02/80.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/E02/C.svg b/src/img/symbols/E02/C.svg
new file mode 100644
index 00000000..c0380242
--- /dev/null
+++ b/src/img/symbols/E02/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/E02/M.svg b/src/img/symbols/E02/M.svg
new file mode 100644
index 00000000..b144193e
--- /dev/null
+++ b/src/img/symbols/E02/M.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/E02/R.svg b/src/img/symbols/E02/R.svg
new file mode 100644
index 00000000..a65947a7
--- /dev/null
+++ b/src/img/symbols/E02/R.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/E02/T.svg b/src/img/symbols/E02/T.svg
new file mode 100644
index 00000000..4f973ed7
--- /dev/null
+++ b/src/img/symbols/E02/T.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/E02/U.svg b/src/img/symbols/E02/U.svg
new file mode 100644
index 00000000..fad3a4a9
--- /dev/null
+++ b/src/img/symbols/E02/U.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/E02/WM.svg b/src/img/symbols/E02/WM.svg
new file mode 100644
index 00000000..68481c70
--- /dev/null
+++ b/src/img/symbols/E02/WM.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/ELD/80.svg b/src/img/symbols/ELD/80.svg
new file mode 100644
index 00000000..7895d40a
--- /dev/null
+++ b/src/img/symbols/ELD/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/ELD/C.svg b/src/img/symbols/ELD/C.svg
new file mode 100644
index 00000000..1af0953f
--- /dev/null
+++ b/src/img/symbols/ELD/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/ELD/M.svg b/src/img/symbols/ELD/M.svg
new file mode 100644
index 00000000..003ef0c8
--- /dev/null
+++ b/src/img/symbols/ELD/M.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/ELD/R.svg b/src/img/symbols/ELD/R.svg
new file mode 100644
index 00000000..e014222d
--- /dev/null
+++ b/src/img/symbols/ELD/R.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/ELD/T.svg b/src/img/symbols/ELD/T.svg
new file mode 100644
index 00000000..4f9d9a89
--- /dev/null
+++ b/src/img/symbols/ELD/T.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/ELD/U.svg b/src/img/symbols/ELD/U.svg
new file mode 100644
index 00000000..7ee261d3
--- /dev/null
+++ b/src/img/symbols/ELD/U.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/ELD/WM.svg b/src/img/symbols/ELD/WM.svg
new file mode 100644
index 00000000..6d0d5643
--- /dev/null
+++ b/src/img/symbols/ELD/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EMA/80.svg b/src/img/symbols/EMA/80.svg
new file mode 100644
index 00000000..9d265c23
--- /dev/null
+++ b/src/img/symbols/EMA/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EMA/C.svg b/src/img/symbols/EMA/C.svg
new file mode 100644
index 00000000..e7d81af6
--- /dev/null
+++ b/src/img/symbols/EMA/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EMA/M.svg b/src/img/symbols/EMA/M.svg
new file mode 100644
index 00000000..d35320ae
--- /dev/null
+++ b/src/img/symbols/EMA/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EMA/R.svg b/src/img/symbols/EMA/R.svg
new file mode 100644
index 00000000..e2023c1a
--- /dev/null
+++ b/src/img/symbols/EMA/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EMA/T.svg b/src/img/symbols/EMA/T.svg
new file mode 100644
index 00000000..4759c210
--- /dev/null
+++ b/src/img/symbols/EMA/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EMA/U.svg b/src/img/symbols/EMA/U.svg
new file mode 100644
index 00000000..58741a43
--- /dev/null
+++ b/src/img/symbols/EMA/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EMA/WM.svg b/src/img/symbols/EMA/WM.svg
new file mode 100644
index 00000000..5eb6a70f
--- /dev/null
+++ b/src/img/symbols/EMA/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EMN/80.svg b/src/img/symbols/EMN/80.svg
new file mode 100644
index 00000000..58585558
--- /dev/null
+++ b/src/img/symbols/EMN/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/EMN/C.svg b/src/img/symbols/EMN/C.svg
new file mode 100644
index 00000000..cdb3436d
--- /dev/null
+++ b/src/img/symbols/EMN/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/EMN/M.svg b/src/img/symbols/EMN/M.svg
new file mode 100644
index 00000000..c1196483
--- /dev/null
+++ b/src/img/symbols/EMN/M.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/EMN/R.svg b/src/img/symbols/EMN/R.svg
new file mode 100644
index 00000000..99ce74ee
--- /dev/null
+++ b/src/img/symbols/EMN/R.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/EMN/T.svg b/src/img/symbols/EMN/T.svg
new file mode 100644
index 00000000..29386591
--- /dev/null
+++ b/src/img/symbols/EMN/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/EMN/U.svg b/src/img/symbols/EMN/U.svg
new file mode 100644
index 00000000..94b55d72
--- /dev/null
+++ b/src/img/symbols/EMN/U.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/EMN/WM.svg b/src/img/symbols/EMN/WM.svg
new file mode 100644
index 00000000..d3c0d52e
--- /dev/null
+++ b/src/img/symbols/EMN/WM.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/EVE/80.svg b/src/img/symbols/EVE/80.svg
new file mode 100644
index 00000000..cbc44f12
--- /dev/null
+++ b/src/img/symbols/EVE/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EVE/C.svg b/src/img/symbols/EVE/C.svg
new file mode 100644
index 00000000..d9b85203
--- /dev/null
+++ b/src/img/symbols/EVE/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EVE/M.svg b/src/img/symbols/EVE/M.svg
new file mode 100644
index 00000000..4300e19a
--- /dev/null
+++ b/src/img/symbols/EVE/M.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/EVE/R.svg b/src/img/symbols/EVE/R.svg
new file mode 100644
index 00000000..64679fa0
--- /dev/null
+++ b/src/img/symbols/EVE/R.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/EVE/T.svg b/src/img/symbols/EVE/T.svg
new file mode 100644
index 00000000..224f1535
--- /dev/null
+++ b/src/img/symbols/EVE/T.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/EVE/U.svg b/src/img/symbols/EVE/U.svg
new file mode 100644
index 00000000..e9aeef43
--- /dev/null
+++ b/src/img/symbols/EVE/U.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/EVE/WM.svg b/src/img/symbols/EVE/WM.svg
new file mode 100644
index 00000000..b4a93a1f
--- /dev/null
+++ b/src/img/symbols/EVE/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/EXO/80.svg b/src/img/symbols/EXO/80.svg
new file mode 100644
index 00000000..b2d4a19e
--- /dev/null
+++ b/src/img/symbols/EXO/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EXO/C - Original.svg b/src/img/symbols/EXO/C - Original.svg
new file mode 100644
index 00000000..35060391
--- /dev/null
+++ b/src/img/symbols/EXO/C - Original.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EXO/C.svg b/src/img/symbols/EXO/C.svg
new file mode 100644
index 00000000..b50745bb
--- /dev/null
+++ b/src/img/symbols/EXO/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/EXO/M.svg b/src/img/symbols/EXO/M.svg
new file mode 100644
index 00000000..368ba622
--- /dev/null
+++ b/src/img/symbols/EXO/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EXO/R.svg b/src/img/symbols/EXO/R.svg
new file mode 100644
index 00000000..06c9c861
--- /dev/null
+++ b/src/img/symbols/EXO/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EXO/T.svg b/src/img/symbols/EXO/T.svg
new file mode 100644
index 00000000..af8e65c2
--- /dev/null
+++ b/src/img/symbols/EXO/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EXO/U.svg b/src/img/symbols/EXO/U.svg
new file mode 100644
index 00000000..a0d5ecd7
--- /dev/null
+++ b/src/img/symbols/EXO/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/EXO/WM.svg b/src/img/symbols/EXO/WM.svg
new file mode 100644
index 00000000..3a080124
--- /dev/null
+++ b/src/img/symbols/EXO/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/EXP/80.svg b/src/img/symbols/EXP/80.svg
new file mode 100644
index 00000000..027d2c99
--- /dev/null
+++ b/src/img/symbols/EXP/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/EXP/C.svg b/src/img/symbols/EXP/C.svg
new file mode 100644
index 00000000..164df00a
--- /dev/null
+++ b/src/img/symbols/EXP/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/EXP/M.svg b/src/img/symbols/EXP/M.svg
new file mode 100644
index 00000000..1e19a99b
--- /dev/null
+++ b/src/img/symbols/EXP/M.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/src/img/symbols/EXP/R.svg b/src/img/symbols/EXP/R.svg
new file mode 100644
index 00000000..725da53e
--- /dev/null
+++ b/src/img/symbols/EXP/R.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/src/img/symbols/EXP/T.svg b/src/img/symbols/EXP/T.svg
new file mode 100644
index 00000000..45e786b3
--- /dev/null
+++ b/src/img/symbols/EXP/T.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/src/img/symbols/EXP/U.svg b/src/img/symbols/EXP/U.svg
new file mode 100644
index 00000000..bb02c549
--- /dev/null
+++ b/src/img/symbols/EXP/U.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/src/img/symbols/EXP/WM.svg b/src/img/symbols/EXP/WM.svg
new file mode 100644
index 00000000..467af2d1
--- /dev/null
+++ b/src/img/symbols/EXP/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/FEM/80.svg b/src/img/symbols/FEM/80.svg
new file mode 100644
index 00000000..636ecce7
--- /dev/null
+++ b/src/img/symbols/FEM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/FEM/C.svg b/src/img/symbols/FEM/C.svg
new file mode 100644
index 00000000..a15c8b90
--- /dev/null
+++ b/src/img/symbols/FEM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/FEM/M.svg b/src/img/symbols/FEM/M.svg
new file mode 100644
index 00000000..c1e75d50
--- /dev/null
+++ b/src/img/symbols/FEM/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FEM/R.svg b/src/img/symbols/FEM/R.svg
new file mode 100644
index 00000000..78fe5729
--- /dev/null
+++ b/src/img/symbols/FEM/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FEM/T.svg b/src/img/symbols/FEM/T.svg
new file mode 100644
index 00000000..2a7f81cd
--- /dev/null
+++ b/src/img/symbols/FEM/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FEM/U.svg b/src/img/symbols/FEM/U.svg
new file mode 100644
index 00000000..2d9351a6
--- /dev/null
+++ b/src/img/symbols/FEM/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FEM/WM.svg b/src/img/symbols/FEM/WM.svg
new file mode 100644
index 00000000..54bf068b
--- /dev/null
+++ b/src/img/symbols/FEM/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/FNM/R.svg b/src/img/symbols/FNM/R.svg
new file mode 100644
index 00000000..cf3c1ca1
--- /dev/null
+++ b/src/img/symbols/FNM/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/FRF/80.svg b/src/img/symbols/FRF/80.svg
new file mode 100644
index 00000000..2d16ce5a
--- /dev/null
+++ b/src/img/symbols/FRF/80.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/FRF/C.svg b/src/img/symbols/FRF/C.svg
new file mode 100644
index 00000000..4fc6426d
--- /dev/null
+++ b/src/img/symbols/FRF/C.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/FRF/M.svg b/src/img/symbols/FRF/M.svg
new file mode 100644
index 00000000..077425a3
--- /dev/null
+++ b/src/img/symbols/FRF/M.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/FRF/R.svg b/src/img/symbols/FRF/R.svg
new file mode 100644
index 00000000..9934acd0
--- /dev/null
+++ b/src/img/symbols/FRF/R.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/FRF/T.svg b/src/img/symbols/FRF/T.svg
new file mode 100644
index 00000000..427727fb
--- /dev/null
+++ b/src/img/symbols/FRF/T.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/FRF/U.svg b/src/img/symbols/FRF/U.svg
new file mode 100644
index 00000000..e6408daa
--- /dev/null
+++ b/src/img/symbols/FRF/U.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/FRF/WM.svg b/src/img/symbols/FRF/WM.svg
new file mode 100644
index 00000000..6bd4109a
--- /dev/null
+++ b/src/img/symbols/FRF/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/FUT/80.svg b/src/img/symbols/FUT/80.svg
new file mode 100644
index 00000000..11bb3fd9
--- /dev/null
+++ b/src/img/symbols/FUT/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/FUT/C.svg b/src/img/symbols/FUT/C.svg
new file mode 100644
index 00000000..935d1b92
--- /dev/null
+++ b/src/img/symbols/FUT/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/FUT/M.svg b/src/img/symbols/FUT/M.svg
new file mode 100644
index 00000000..a42471a5
--- /dev/null
+++ b/src/img/symbols/FUT/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FUT/R.svg b/src/img/symbols/FUT/R.svg
new file mode 100644
index 00000000..2e0d98b1
--- /dev/null
+++ b/src/img/symbols/FUT/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FUT/T.svg b/src/img/symbols/FUT/T.svg
new file mode 100644
index 00000000..25c7895b
--- /dev/null
+++ b/src/img/symbols/FUT/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FUT/U.svg b/src/img/symbols/FUT/U.svg
new file mode 100644
index 00000000..c9f732df
--- /dev/null
+++ b/src/img/symbols/FUT/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/FUT/WM.svg b/src/img/symbols/FUT/WM.svg
new file mode 100644
index 00000000..a53c53fe
--- /dev/null
+++ b/src/img/symbols/FUT/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/GAME/80.svg b/src/img/symbols/GAME/80.svg
new file mode 100644
index 00000000..1052a057
--- /dev/null
+++ b/src/img/symbols/GAME/80.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GAME/C.svg b/src/img/symbols/GAME/C.svg
new file mode 100644
index 00000000..b2f0df82
--- /dev/null
+++ b/src/img/symbols/GAME/C.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GAME/M.svg b/src/img/symbols/GAME/M.svg
new file mode 100644
index 00000000..eeb9d855
--- /dev/null
+++ b/src/img/symbols/GAME/M.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/GAME/R.svg b/src/img/symbols/GAME/R.svg
new file mode 100644
index 00000000..afe947b7
--- /dev/null
+++ b/src/img/symbols/GAME/R.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/GAME/T.svg b/src/img/symbols/GAME/T.svg
new file mode 100644
index 00000000..65cd122e
--- /dev/null
+++ b/src/img/symbols/GAME/T.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/GAME/U.svg b/src/img/symbols/GAME/U.svg
new file mode 100644
index 00000000..72cab92f
--- /dev/null
+++ b/src/img/symbols/GAME/U.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/GAME/WM.svg b/src/img/symbols/GAME/WM.svg
new file mode 100644
index 00000000..90e26c23
--- /dev/null
+++ b/src/img/symbols/GAME/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/GK1/GK1-Boros_C.svg b/src/img/symbols/GK1/GK1-Boros_C.svg
new file mode 100644
index 00000000..18257578
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Boros_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Boros_M.svg b/src/img/symbols/GK1/GK1-Boros_M.svg
new file mode 100644
index 00000000..158a7491
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Boros_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Boros_R.svg b/src/img/symbols/GK1/GK1-Boros_R.svg
new file mode 100644
index 00000000..fbb69026
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Boros_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Boros_U.svg b/src/img/symbols/GK1/GK1-Boros_U.svg
new file mode 100644
index 00000000..0fe5b5bd
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Boros_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Dimir_C.svg b/src/img/symbols/GK1/GK1-Dimir_C.svg
new file mode 100644
index 00000000..832c2a20
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Dimir_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Dimir_M.svg b/src/img/symbols/GK1/GK1-Dimir_M.svg
new file mode 100644
index 00000000..47b11826
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Dimir_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Dimir_R.svg b/src/img/symbols/GK1/GK1-Dimir_R.svg
new file mode 100644
index 00000000..02a12d18
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Dimir_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Dimir_U.svg b/src/img/symbols/GK1/GK1-Dimir_U.svg
new file mode 100644
index 00000000..a80de58d
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Dimir_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Golgari_C.svg b/src/img/symbols/GK1/GK1-Golgari_C.svg
new file mode 100644
index 00000000..338be522
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Golgari_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Golgari_M.svg b/src/img/symbols/GK1/GK1-Golgari_M.svg
new file mode 100644
index 00000000..e4f8ccb7
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Golgari_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Golgari_R.svg b/src/img/symbols/GK1/GK1-Golgari_R.svg
new file mode 100644
index 00000000..dd6df6af
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Golgari_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Golgari_U.svg b/src/img/symbols/GK1/GK1-Golgari_U.svg
new file mode 100644
index 00000000..a10a7494
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Golgari_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Izzet_C.svg b/src/img/symbols/GK1/GK1-Izzet_C.svg
new file mode 100644
index 00000000..a7718d49
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Izzet_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Izzet_M.svg b/src/img/symbols/GK1/GK1-Izzet_M.svg
new file mode 100644
index 00000000..016f5993
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Izzet_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Izzet_R.svg b/src/img/symbols/GK1/GK1-Izzet_R.svg
new file mode 100644
index 00000000..b0b5d9a2
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Izzet_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Izzet_U.svg b/src/img/symbols/GK1/GK1-Izzet_U.svg
new file mode 100644
index 00000000..8eca56a8
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Izzet_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Selesnya_C.svg b/src/img/symbols/GK1/GK1-Selesnya_C.svg
new file mode 100644
index 00000000..fd4a8008
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Selesnya_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Selesnya_M.svg b/src/img/symbols/GK1/GK1-Selesnya_M.svg
new file mode 100644
index 00000000..c94c2c0b
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Selesnya_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Selesnya_R.svg b/src/img/symbols/GK1/GK1-Selesnya_R.svg
new file mode 100644
index 00000000..d29b12e7
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Selesnya_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK1/GK1-Selesnya_U.svg b/src/img/symbols/GK1/GK1-Selesnya_U.svg
new file mode 100644
index 00000000..a326b32e
--- /dev/null
+++ b/src/img/symbols/GK1/GK1-Selesnya_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Azorius_C.svg b/src/img/symbols/GK2/GK2-Azorius_C.svg
new file mode 100644
index 00000000..1bda85c9
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Azorius_C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GK2/GK2-Azorius_M.svg b/src/img/symbols/GK2/GK2-Azorius_M.svg
new file mode 100644
index 00000000..1003a6e8
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Azorius_M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GK2/GK2-Azorius_R.svg b/src/img/symbols/GK2/GK2-Azorius_R.svg
new file mode 100644
index 00000000..ca965816
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Azorius_R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GK2/GK2-Azorius_U.svg b/src/img/symbols/GK2/GK2-Azorius_U.svg
new file mode 100644
index 00000000..d6f2d5eb
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Azorius_U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GK2/GK2-Gruul_C.svg b/src/img/symbols/GK2/GK2-Gruul_C.svg
new file mode 100644
index 00000000..8e378222
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Gruul_C.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Gruul_M.svg b/src/img/symbols/GK2/GK2-Gruul_M.svg
new file mode 100644
index 00000000..a57c4c2d
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Gruul_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Gruul_R.svg b/src/img/symbols/GK2/GK2-Gruul_R.svg
new file mode 100644
index 00000000..46b67335
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Gruul_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Gruul_U.svg b/src/img/symbols/GK2/GK2-Gruul_U.svg
new file mode 100644
index 00000000..3e19864e
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Gruul_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Orzhov_C.svg b/src/img/symbols/GK2/GK2-Orzhov_C.svg
new file mode 100644
index 00000000..e1253a41
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Orzhov_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Orzhov_M.svg b/src/img/symbols/GK2/GK2-Orzhov_M.svg
new file mode 100644
index 00000000..ccd30b4a
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Orzhov_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Orzhov_R.svg b/src/img/symbols/GK2/GK2-Orzhov_R.svg
new file mode 100644
index 00000000..9b52c221
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Orzhov_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Orzhov_U.svg b/src/img/symbols/GK2/GK2-Orzhov_U.svg
new file mode 100644
index 00000000..190a43ea
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Orzhov_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Simic_C.svg b/src/img/symbols/GK2/GK2-Simic_C.svg
new file mode 100644
index 00000000..973c594a
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Simic_C.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Simic_M.svg b/src/img/symbols/GK2/GK2-Simic_M.svg
new file mode 100644
index 00000000..62a2250e
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Simic_M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Simic_R.svg b/src/img/symbols/GK2/GK2-Simic_R.svg
new file mode 100644
index 00000000..f69433f0
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Simic_R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/GK2-Simic_U.svg b/src/img/symbols/GK2/GK2-Simic_U.svg
new file mode 100644
index 00000000..b716ce63
--- /dev/null
+++ b/src/img/symbols/GK2/GK2-Simic_U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/GK2/Inaccurate.txt b/src/img/symbols/GK2/Inaccurate.txt
new file mode 100644
index 00000000..270aceef
--- /dev/null
+++ b/src/img/symbols/GK2/Inaccurate.txt
@@ -0,0 +1 @@
+Gruul and Simic
\ No newline at end of file
diff --git a/src/img/symbols/GN2/80.svg b/src/img/symbols/GN2/80.svg
new file mode 100644
index 00000000..c2e8ab14
--- /dev/null
+++ b/src/img/symbols/GN2/80.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GN2/C.svg b/src/img/symbols/GN2/C.svg
new file mode 100644
index 00000000..ba959adc
--- /dev/null
+++ b/src/img/symbols/GN2/C.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GN2/M.svg b/src/img/symbols/GN2/M.svg
new file mode 100644
index 00000000..d610863d
--- /dev/null
+++ b/src/img/symbols/GN2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GN2/R.svg b/src/img/symbols/GN2/R.svg
new file mode 100644
index 00000000..8b45698b
--- /dev/null
+++ b/src/img/symbols/GN2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GN2/T.svg b/src/img/symbols/GN2/T.svg
new file mode 100644
index 00000000..fc685a2d
--- /dev/null
+++ b/src/img/symbols/GN2/T.svg
@@ -0,0 +1,72 @@
+
+
diff --git a/src/img/symbols/GN2/U.svg b/src/img/symbols/GN2/U.svg
new file mode 100644
index 00000000..6c34a65b
--- /dev/null
+++ b/src/img/symbols/GN2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GN2/WM.svg b/src/img/symbols/GN2/WM.svg
new file mode 100644
index 00000000..038f9010
--- /dev/null
+++ b/src/img/symbols/GN2/WM.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GN3/80.svg b/src/img/symbols/GN3/80.svg
new file mode 100644
index 00000000..d9600079
--- /dev/null
+++ b/src/img/symbols/GN3/80.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/img/symbols/GN3/C.svg b/src/img/symbols/GN3/C.svg
new file mode 100644
index 00000000..142b4f88
--- /dev/null
+++ b/src/img/symbols/GN3/C.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/GN3/M.svg b/src/img/symbols/GN3/M.svg
new file mode 100644
index 00000000..31fbf39f
--- /dev/null
+++ b/src/img/symbols/GN3/M.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/GN3/R.svg b/src/img/symbols/GN3/R.svg
new file mode 100644
index 00000000..7057c8bb
--- /dev/null
+++ b/src/img/symbols/GN3/R.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/GN3/T.svg b/src/img/symbols/GN3/T.svg
new file mode 100644
index 00000000..22353b12
--- /dev/null
+++ b/src/img/symbols/GN3/T.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/GN3/U.svg b/src/img/symbols/GN3/U.svg
new file mode 100644
index 00000000..bd4c571b
--- /dev/null
+++ b/src/img/symbols/GN3/U.svg
@@ -0,0 +1,52 @@
+
+
+
+
diff --git a/src/img/symbols/GN3/WM.svg b/src/img/symbols/GN3/WM.svg
new file mode 100644
index 00000000..135f21ff
--- /dev/null
+++ b/src/img/symbols/GN3/WM.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/src/img/symbols/GNT/80.svg b/src/img/symbols/GNT/80.svg
new file mode 100644
index 00000000..3b3e464f
--- /dev/null
+++ b/src/img/symbols/GNT/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GNT/C.svg b/src/img/symbols/GNT/C.svg
new file mode 100644
index 00000000..986b0673
--- /dev/null
+++ b/src/img/symbols/GNT/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GNT/M.svg b/src/img/symbols/GNT/M.svg
new file mode 100644
index 00000000..4a0ad355
--- /dev/null
+++ b/src/img/symbols/GNT/M.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GNT/R.svg b/src/img/symbols/GNT/R.svg
new file mode 100644
index 00000000..ddb2b87f
--- /dev/null
+++ b/src/img/symbols/GNT/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GNT/T.svg b/src/img/symbols/GNT/T.svg
new file mode 100644
index 00000000..3386d0db
--- /dev/null
+++ b/src/img/symbols/GNT/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/GNT/U.svg b/src/img/symbols/GNT/U.svg
new file mode 100644
index 00000000..802cfa93
--- /dev/null
+++ b/src/img/symbols/GNT/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GNT/WM.svg b/src/img/symbols/GNT/WM.svg
new file mode 100644
index 00000000..27d1b10d
--- /dev/null
+++ b/src/img/symbols/GNT/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/GPT/80.svg b/src/img/symbols/GPT/80.svg
new file mode 100644
index 00000000..06d0d738
--- /dev/null
+++ b/src/img/symbols/GPT/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GPT/C.svg b/src/img/symbols/GPT/C.svg
new file mode 100644
index 00000000..65b7db25
--- /dev/null
+++ b/src/img/symbols/GPT/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GPT/M.svg b/src/img/symbols/GPT/M.svg
new file mode 100644
index 00000000..457c1742
--- /dev/null
+++ b/src/img/symbols/GPT/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GPT/R.svg b/src/img/symbols/GPT/R.svg
new file mode 100644
index 00000000..2376963b
--- /dev/null
+++ b/src/img/symbols/GPT/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GPT/T.svg b/src/img/symbols/GPT/T.svg
new file mode 100644
index 00000000..7d9a10d5
--- /dev/null
+++ b/src/img/symbols/GPT/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GPT/U.svg b/src/img/symbols/GPT/U.svg
new file mode 100644
index 00000000..3e12e0bf
--- /dev/null
+++ b/src/img/symbols/GPT/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GPT/WM.svg b/src/img/symbols/GPT/WM.svg
new file mode 100644
index 00000000..a0df8be5
--- /dev/null
+++ b/src/img/symbols/GPT/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/GRN/80.svg b/src/img/symbols/GRN/80.svg
new file mode 100644
index 00000000..e6991180
--- /dev/null
+++ b/src/img/symbols/GRN/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GRN/C.svg b/src/img/symbols/GRN/C.svg
new file mode 100644
index 00000000..f22c7154
--- /dev/null
+++ b/src/img/symbols/GRN/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/GRN/M.svg b/src/img/symbols/GRN/M.svg
new file mode 100644
index 00000000..5a2ce290
--- /dev/null
+++ b/src/img/symbols/GRN/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GRN/R.svg b/src/img/symbols/GRN/R.svg
new file mode 100644
index 00000000..1b98a1ef
--- /dev/null
+++ b/src/img/symbols/GRN/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GRN/T.svg b/src/img/symbols/GRN/T.svg
new file mode 100644
index 00000000..9a49ad99
--- /dev/null
+++ b/src/img/symbols/GRN/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GRN/U.svg b/src/img/symbols/GRN/U.svg
new file mode 100644
index 00000000..4aa95bd5
--- /dev/null
+++ b/src/img/symbols/GRN/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/GRN/WM.svg b/src/img/symbols/GRN/WM.svg
new file mode 100644
index 00000000..91c18caf
--- /dev/null
+++ b/src/img/symbols/GRN/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/GS1/80.svg b/src/img/symbols/GS1/80.svg
new file mode 100644
index 00000000..bfb7e3da
--- /dev/null
+++ b/src/img/symbols/GS1/80.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GS1/C.svg b/src/img/symbols/GS1/C.svg
new file mode 100644
index 00000000..6568a858
--- /dev/null
+++ b/src/img/symbols/GS1/C.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/GS1/M.svg b/src/img/symbols/GS1/M.svg
new file mode 100644
index 00000000..c7990d56
--- /dev/null
+++ b/src/img/symbols/GS1/M.svg
@@ -0,0 +1,46 @@
+
+
diff --git a/src/img/symbols/GS1/R.svg b/src/img/symbols/GS1/R.svg
new file mode 100644
index 00000000..c07fcbb8
--- /dev/null
+++ b/src/img/symbols/GS1/R.svg
@@ -0,0 +1,46 @@
+
+
diff --git a/src/img/symbols/GS1/T.svg b/src/img/symbols/GS1/T.svg
new file mode 100644
index 00000000..77fc12ad
--- /dev/null
+++ b/src/img/symbols/GS1/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/GS1/U.svg b/src/img/symbols/GS1/U.svg
new file mode 100644
index 00000000..a6e96a96
--- /dev/null
+++ b/src/img/symbols/GS1/U.svg
@@ -0,0 +1,46 @@
+
+
diff --git a/src/img/symbols/GS1/WM.svg b/src/img/symbols/GS1/WM.svg
new file mode 100644
index 00000000..14db4a5d
--- /dev/null
+++ b/src/img/symbols/GS1/WM.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GTC/80.svg b/src/img/symbols/GTC/80.svg
new file mode 100644
index 00000000..db8962f6
--- /dev/null
+++ b/src/img/symbols/GTC/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GTC/C.svg b/src/img/symbols/GTC/C.svg
new file mode 100644
index 00000000..81e9981a
--- /dev/null
+++ b/src/img/symbols/GTC/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GTC/M.svg b/src/img/symbols/GTC/M.svg
new file mode 100644
index 00000000..dd9e0684
--- /dev/null
+++ b/src/img/symbols/GTC/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/GTC/R.svg b/src/img/symbols/GTC/R.svg
new file mode 100644
index 00000000..2c4702eb
--- /dev/null
+++ b/src/img/symbols/GTC/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GTC/T.svg b/src/img/symbols/GTC/T.svg
new file mode 100644
index 00000000..dacd0bcb
--- /dev/null
+++ b/src/img/symbols/GTC/T.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GTC/U.svg b/src/img/symbols/GTC/U.svg
new file mode 100644
index 00000000..b4301f84
--- /dev/null
+++ b/src/img/symbols/GTC/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/GTC/WM.svg b/src/img/symbols/GTC/WM.svg
new file mode 100644
index 00000000..72c2a965
--- /dev/null
+++ b/src/img/symbols/GTC/WM.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/GUR/GUR_C.png b/src/img/symbols/GUR/GUR_C.png
new file mode 100644
index 00000000..12af19bd
Binary files /dev/null and b/src/img/symbols/GUR/GUR_C.png differ
diff --git a/src/img/symbols/GUR/GUR_C.svg b/src/img/symbols/GUR/GUR_C.svg
new file mode 100644
index 00000000..c6d28cfd
--- /dev/null
+++ b/src/img/symbols/GUR/GUR_C.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/src/img/symbols/GUR/GUR_R.png b/src/img/symbols/GUR/GUR_R.png
new file mode 100644
index 00000000..e7397102
Binary files /dev/null and b/src/img/symbols/GUR/GUR_R.png differ
diff --git a/src/img/symbols/H09/80.svg b/src/img/symbols/H09/80.svg
new file mode 100644
index 00000000..2f955782
--- /dev/null
+++ b/src/img/symbols/H09/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/H09/C.svg b/src/img/symbols/H09/C.svg
new file mode 100644
index 00000000..9b50c102
--- /dev/null
+++ b/src/img/symbols/H09/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/H09/M.svg b/src/img/symbols/H09/M.svg
new file mode 100644
index 00000000..f02e0ea0
--- /dev/null
+++ b/src/img/symbols/H09/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/H09/R.svg b/src/img/symbols/H09/R.svg
new file mode 100644
index 00000000..ee027467
--- /dev/null
+++ b/src/img/symbols/H09/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/H09/T.svg b/src/img/symbols/H09/T.svg
new file mode 100644
index 00000000..17808f9f
--- /dev/null
+++ b/src/img/symbols/H09/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/H09/U.svg b/src/img/symbols/H09/U.svg
new file mode 100644
index 00000000..171dad7b
--- /dev/null
+++ b/src/img/symbols/H09/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/H09/WM.svg b/src/img/symbols/H09/WM.svg
new file mode 100644
index 00000000..4c28ec15
--- /dev/null
+++ b/src/img/symbols/H09/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/H17/80.svg b/src/img/symbols/H17/80.svg
new file mode 100644
index 00000000..ef9427b5
--- /dev/null
+++ b/src/img/symbols/H17/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/H17/C.svg b/src/img/symbols/H17/C.svg
new file mode 100644
index 00000000..0cf9af76
--- /dev/null
+++ b/src/img/symbols/H17/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/H17/M.svg b/src/img/symbols/H17/M.svg
new file mode 100644
index 00000000..caf93f1b
--- /dev/null
+++ b/src/img/symbols/H17/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/H17/R.svg b/src/img/symbols/H17/R.svg
new file mode 100644
index 00000000..6ac49726
--- /dev/null
+++ b/src/img/symbols/H17/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/H17/T.svg b/src/img/symbols/H17/T.svg
new file mode 100644
index 00000000..c114edce
--- /dev/null
+++ b/src/img/symbols/H17/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/H17/U.svg b/src/img/symbols/H17/U.svg
new file mode 100644
index 00000000..1a4ebe13
--- /dev/null
+++ b/src/img/symbols/H17/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/H17/WM.svg b/src/img/symbols/H17/WM.svg
new file mode 100644
index 00000000..ab9e6900
--- /dev/null
+++ b/src/img/symbols/H17/WM.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/HGB/80.svg b/src/img/symbols/HGB/80.svg
new file mode 100644
index 00000000..96247a8b
--- /dev/null
+++ b/src/img/symbols/HGB/80.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/C.svg b/src/img/symbols/HGB/C.svg
new file mode 100644
index 00000000..5659193a
--- /dev/null
+++ b/src/img/symbols/HGB/C.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/M.svg b/src/img/symbols/HGB/M.svg
new file mode 100644
index 00000000..c1d4b823
--- /dev/null
+++ b/src/img/symbols/HGB/M.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/R.svg b/src/img/symbols/HGB/R.svg
new file mode 100644
index 00000000..6d9fbc5b
--- /dev/null
+++ b/src/img/symbols/HGB/R.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/T.svg b/src/img/symbols/HGB/T.svg
new file mode 100644
index 00000000..ccb44bc5
--- /dev/null
+++ b/src/img/symbols/HGB/T.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/TS.svg b/src/img/symbols/HGB/TS.svg
new file mode 100644
index 00000000..5eaaba3d
--- /dev/null
+++ b/src/img/symbols/HGB/TS.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/U.svg b/src/img/symbols/HGB/U.svg
new file mode 100644
index 00000000..f0c574b0
--- /dev/null
+++ b/src/img/symbols/HGB/U.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/img/symbols/HGB/WM.svg b/src/img/symbols/HGB/WM.svg
new file mode 100644
index 00000000..891a5d3d
--- /dev/null
+++ b/src/img/symbols/HGB/WM.svg
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/src/img/symbols/HML/80.svg b/src/img/symbols/HML/80.svg
new file mode 100644
index 00000000..a217d52c
--- /dev/null
+++ b/src/img/symbols/HML/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/HML/C.svg b/src/img/symbols/HML/C.svg
new file mode 100644
index 00000000..cf93a481
--- /dev/null
+++ b/src/img/symbols/HML/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/HML/M.svg b/src/img/symbols/HML/M.svg
new file mode 100644
index 00000000..77e89e07
--- /dev/null
+++ b/src/img/symbols/HML/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/HML/R.svg b/src/img/symbols/HML/R.svg
new file mode 100644
index 00000000..205e2bc8
--- /dev/null
+++ b/src/img/symbols/HML/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/HML/T.svg b/src/img/symbols/HML/T.svg
new file mode 100644
index 00000000..d47f8b64
--- /dev/null
+++ b/src/img/symbols/HML/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/HML/U.svg b/src/img/symbols/HML/U.svg
new file mode 100644
index 00000000..9d98f9c6
--- /dev/null
+++ b/src/img/symbols/HML/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/HML/WM.svg b/src/img/symbols/HML/WM.svg
new file mode 100644
index 00000000..6c0f57c9
--- /dev/null
+++ b/src/img/symbols/HML/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/HOP/80.svg b/src/img/symbols/HOP/80.svg
new file mode 100644
index 00000000..74b06db0
--- /dev/null
+++ b/src/img/symbols/HOP/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/HOP/C.svg b/src/img/symbols/HOP/C.svg
new file mode 100644
index 00000000..562c7d6d
--- /dev/null
+++ b/src/img/symbols/HOP/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/HOP/M.svg b/src/img/symbols/HOP/M.svg
new file mode 100644
index 00000000..df9b960c
--- /dev/null
+++ b/src/img/symbols/HOP/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/HOP/R.svg b/src/img/symbols/HOP/R.svg
new file mode 100644
index 00000000..86be21ca
--- /dev/null
+++ b/src/img/symbols/HOP/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/HOP/T.svg b/src/img/symbols/HOP/T.svg
new file mode 100644
index 00000000..060fac0e
--- /dev/null
+++ b/src/img/symbols/HOP/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/HOP/U.svg b/src/img/symbols/HOP/U.svg
new file mode 100644
index 00000000..cd88718a
--- /dev/null
+++ b/src/img/symbols/HOP/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/HOP/WM.svg b/src/img/symbols/HOP/WM.svg
new file mode 100644
index 00000000..7dff67b2
--- /dev/null
+++ b/src/img/symbols/HOP/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/HOU/80.svg b/src/img/symbols/HOU/80.svg
new file mode 100644
index 00000000..f5b49d10
--- /dev/null
+++ b/src/img/symbols/HOU/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/HOU/C.svg b/src/img/symbols/HOU/C.svg
new file mode 100644
index 00000000..6b5a8b5f
--- /dev/null
+++ b/src/img/symbols/HOU/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/HOU/M.svg b/src/img/symbols/HOU/M.svg
new file mode 100644
index 00000000..8e7c5df4
--- /dev/null
+++ b/src/img/symbols/HOU/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/HOU/R.svg b/src/img/symbols/HOU/R.svg
new file mode 100644
index 00000000..c3ca5198
--- /dev/null
+++ b/src/img/symbols/HOU/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/HOU/T.svg b/src/img/symbols/HOU/T.svg
new file mode 100644
index 00000000..e859c336
--- /dev/null
+++ b/src/img/symbols/HOU/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/HOU/U.svg b/src/img/symbols/HOU/U.svg
new file mode 100644
index 00000000..47001ddd
--- /dev/null
+++ b/src/img/symbols/HOU/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/HOU/WM.svg b/src/img/symbols/HOU/WM.svg
new file mode 100644
index 00000000..719ada72
--- /dev/null
+++ b/src/img/symbols/HOU/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ICE/80.svg b/src/img/symbols/ICE/80.svg
new file mode 100644
index 00000000..2b556fc3
--- /dev/null
+++ b/src/img/symbols/ICE/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ICE/C - Original.svg b/src/img/symbols/ICE/C - Original.svg
new file mode 100644
index 00000000..aed6b46c
--- /dev/null
+++ b/src/img/symbols/ICE/C - Original.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/ICE/C.svg b/src/img/symbols/ICE/C.svg
new file mode 100644
index 00000000..3c5e147e
--- /dev/null
+++ b/src/img/symbols/ICE/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ICE/M.svg b/src/img/symbols/ICE/M.svg
new file mode 100644
index 00000000..a97b4187
--- /dev/null
+++ b/src/img/symbols/ICE/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ICE/R.svg b/src/img/symbols/ICE/R.svg
new file mode 100644
index 00000000..be705ef9
--- /dev/null
+++ b/src/img/symbols/ICE/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ICE/T.svg b/src/img/symbols/ICE/T.svg
new file mode 100644
index 00000000..c71d8f4b
--- /dev/null
+++ b/src/img/symbols/ICE/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ICE/U.svg b/src/img/symbols/ICE/U.svg
new file mode 100644
index 00000000..69484dcb
--- /dev/null
+++ b/src/img/symbols/ICE/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ICE/WM.svg b/src/img/symbols/ICE/WM.svg
new file mode 100644
index 00000000..c1c652d6
--- /dev/null
+++ b/src/img/symbols/ICE/WM.svg
@@ -0,0 +1,3 @@
+
+
diff --git a/src/img/symbols/IDW/80.svg b/src/img/symbols/IDW/80.svg
new file mode 100644
index 00000000..6a88e99c
--- /dev/null
+++ b/src/img/symbols/IDW/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/IDW/C.svg b/src/img/symbols/IDW/C.svg
new file mode 100644
index 00000000..270bb5f3
--- /dev/null
+++ b/src/img/symbols/IDW/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/IDW/M.svg b/src/img/symbols/IDW/M.svg
new file mode 100644
index 00000000..646559a9
--- /dev/null
+++ b/src/img/symbols/IDW/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/IDW/R.svg b/src/img/symbols/IDW/R.svg
new file mode 100644
index 00000000..e9f6f273
--- /dev/null
+++ b/src/img/symbols/IDW/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/IDW/T.svg b/src/img/symbols/IDW/T.svg
new file mode 100644
index 00000000..18d1da25
--- /dev/null
+++ b/src/img/symbols/IDW/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/IDW/U.svg b/src/img/symbols/IDW/U.svg
new file mode 100644
index 00000000..13fd016b
--- /dev/null
+++ b/src/img/symbols/IDW/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/IDW/WM.svg b/src/img/symbols/IDW/WM.svg
new file mode 100644
index 00000000..98f39259
--- /dev/null
+++ b/src/img/symbols/IDW/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/IKO/80.svg b/src/img/symbols/IKO/80.svg
new file mode 100644
index 00000000..0f17a198
--- /dev/null
+++ b/src/img/symbols/IKO/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/IKO/C.svg b/src/img/symbols/IKO/C.svg
new file mode 100644
index 00000000..6ab5d61e
--- /dev/null
+++ b/src/img/symbols/IKO/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/IKO/M2.svg b/src/img/symbols/IKO/M2.svg
new file mode 100644
index 00000000..9927476c
--- /dev/null
+++ b/src/img/symbols/IKO/M2.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/IKO/R2.svg b/src/img/symbols/IKO/R2.svg
new file mode 100644
index 00000000..2305b52d
--- /dev/null
+++ b/src/img/symbols/IKO/R2.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/IKO/T2.svg b/src/img/symbols/IKO/T2.svg
new file mode 100644
index 00000000..bb4a268b
--- /dev/null
+++ b/src/img/symbols/IKO/T2.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/IKO/U2.svg b/src/img/symbols/IKO/U2.svg
new file mode 100644
index 00000000..b60741c3
--- /dev/null
+++ b/src/img/symbols/IKO/U2.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/IKO/WM.svg b/src/img/symbols/IKO/WM.svg
new file mode 100644
index 00000000..43b24750
--- /dev/null
+++ b/src/img/symbols/IKO/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/IMA/80.svg b/src/img/symbols/IMA/80.svg
new file mode 100644
index 00000000..4173551b
--- /dev/null
+++ b/src/img/symbols/IMA/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/IMA/C.svg b/src/img/symbols/IMA/C.svg
new file mode 100644
index 00000000..84222a34
--- /dev/null
+++ b/src/img/symbols/IMA/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/IMA/M.svg b/src/img/symbols/IMA/M.svg
new file mode 100644
index 00000000..dc246638
--- /dev/null
+++ b/src/img/symbols/IMA/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/IMA/R.svg b/src/img/symbols/IMA/R.svg
new file mode 100644
index 00000000..d43e12b4
--- /dev/null
+++ b/src/img/symbols/IMA/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/IMA/T.svg b/src/img/symbols/IMA/T.svg
new file mode 100644
index 00000000..85a97676
--- /dev/null
+++ b/src/img/symbols/IMA/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/IMA/U.svg b/src/img/symbols/IMA/U.svg
new file mode 100644
index 00000000..857eaf6f
--- /dev/null
+++ b/src/img/symbols/IMA/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/IMA/WM.svg b/src/img/symbols/IMA/WM.svg
new file mode 100644
index 00000000..ddca667d
--- /dev/null
+++ b/src/img/symbols/IMA/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/INV/80.svg b/src/img/symbols/INV/80.svg
new file mode 100644
index 00000000..ca44f277
--- /dev/null
+++ b/src/img/symbols/INV/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/INV/C.svg b/src/img/symbols/INV/C.svg
new file mode 100644
index 00000000..c97149a7
--- /dev/null
+++ b/src/img/symbols/INV/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/INV/M.svg b/src/img/symbols/INV/M.svg
new file mode 100644
index 00000000..ae09398f
--- /dev/null
+++ b/src/img/symbols/INV/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/INV/R.svg b/src/img/symbols/INV/R.svg
new file mode 100644
index 00000000..14bd19a7
--- /dev/null
+++ b/src/img/symbols/INV/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/INV/T.svg b/src/img/symbols/INV/T.svg
new file mode 100644
index 00000000..c7169a15
--- /dev/null
+++ b/src/img/symbols/INV/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/INV/U.svg b/src/img/symbols/INV/U.svg
new file mode 100644
index 00000000..835bc102
--- /dev/null
+++ b/src/img/symbols/INV/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/INV/WM.svg b/src/img/symbols/INV/WM.svg
new file mode 100644
index 00000000..f477ec97
--- /dev/null
+++ b/src/img/symbols/INV/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ISD/80.svg b/src/img/symbols/ISD/80.svg
new file mode 100644
index 00000000..036c99c8
--- /dev/null
+++ b/src/img/symbols/ISD/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ISD/C.svg b/src/img/symbols/ISD/C.svg
new file mode 100644
index 00000000..7c65ad78
--- /dev/null
+++ b/src/img/symbols/ISD/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ISD/M.svg b/src/img/symbols/ISD/M.svg
new file mode 100644
index 00000000..aebd7e8e
--- /dev/null
+++ b/src/img/symbols/ISD/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/ISD/R.svg b/src/img/symbols/ISD/R.svg
new file mode 100644
index 00000000..04f172e9
--- /dev/null
+++ b/src/img/symbols/ISD/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ISD/T.svg b/src/img/symbols/ISD/T.svg
new file mode 100644
index 00000000..f650583b
--- /dev/null
+++ b/src/img/symbols/ISD/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ISD/U.svg b/src/img/symbols/ISD/U.svg
new file mode 100644
index 00000000..269863f0
--- /dev/null
+++ b/src/img/symbols/ISD/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ISD/WM.svg b/src/img/symbols/ISD/WM.svg
new file mode 100644
index 00000000..4ad96610
--- /dev/null
+++ b/src/img/symbols/ISD/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/ISV/C.svg b/src/img/symbols/ISV/C.svg
new file mode 100644
index 00000000..410378de
--- /dev/null
+++ b/src/img/symbols/ISV/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/ISV/M.svg b/src/img/symbols/ISV/M.svg
new file mode 100644
index 00000000..41d71535
--- /dev/null
+++ b/src/img/symbols/ISV/M.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/ISV/R.svg b/src/img/symbols/ISV/R.svg
new file mode 100644
index 00000000..2274c882
--- /dev/null
+++ b/src/img/symbols/ISV/R.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/ISV/U.svg b/src/img/symbols/ISV/U.svg
new file mode 100644
index 00000000..df01f6f8
--- /dev/null
+++ b/src/img/symbols/ISV/U.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/ISW/C.svg b/src/img/symbols/ISW/C.svg
new file mode 100644
index 00000000..b2ecf62e
--- /dev/null
+++ b/src/img/symbols/ISW/C.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/ISW/M.svg b/src/img/symbols/ISW/M.svg
new file mode 100644
index 00000000..15e78be6
--- /dev/null
+++ b/src/img/symbols/ISW/M.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/ISW/R.svg b/src/img/symbols/ISW/R.svg
new file mode 100644
index 00000000..596c42fc
--- /dev/null
+++ b/src/img/symbols/ISW/R.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/ISW/U.svg b/src/img/symbols/ISW/U.svg
new file mode 100644
index 00000000..7c5c2d2e
--- /dev/null
+++ b/src/img/symbols/ISW/U.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/J22/80.svg b/src/img/symbols/J22/80.svg
new file mode 100644
index 00000000..24480125
--- /dev/null
+++ b/src/img/symbols/J22/80.svg
@@ -0,0 +1,34 @@
+
+
+
+
diff --git a/src/img/symbols/J22/C.svg b/src/img/symbols/J22/C.svg
new file mode 100644
index 00000000..d1e518ba
--- /dev/null
+++ b/src/img/symbols/J22/C.svg
@@ -0,0 +1,34 @@
+
+
+
+
diff --git a/src/img/symbols/J22/M.svg b/src/img/symbols/J22/M.svg
new file mode 100644
index 00000000..bade71e2
--- /dev/null
+++ b/src/img/symbols/J22/M.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/J22/R.svg b/src/img/symbols/J22/R.svg
new file mode 100644
index 00000000..b0d822f4
--- /dev/null
+++ b/src/img/symbols/J22/R.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/J22/T.svg b/src/img/symbols/J22/T.svg
new file mode 100644
index 00000000..6aa00afb
--- /dev/null
+++ b/src/img/symbols/J22/T.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/J22/U.svg b/src/img/symbols/J22/U.svg
new file mode 100644
index 00000000..7d5c3faa
--- /dev/null
+++ b/src/img/symbols/J22/U.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/J22/WM.svg b/src/img/symbols/J22/WM.svg
new file mode 100644
index 00000000..21087c1f
--- /dev/null
+++ b/src/img/symbols/J22/WM.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/80.svg b/src/img/symbols/JGP/80.svg
new file mode 100644
index 00000000..cf989c6e
--- /dev/null
+++ b/src/img/symbols/JGP/80.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/C.svg b/src/img/symbols/JGP/C.svg
new file mode 100644
index 00000000..c1989182
--- /dev/null
+++ b/src/img/symbols/JGP/C.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/M.svg b/src/img/symbols/JGP/M.svg
new file mode 100644
index 00000000..9cf882b2
--- /dev/null
+++ b/src/img/symbols/JGP/M.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/R.svg b/src/img/symbols/JGP/R.svg
new file mode 100644
index 00000000..adc69ee3
--- /dev/null
+++ b/src/img/symbols/JGP/R.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/T.svg b/src/img/symbols/JGP/T.svg
new file mode 100644
index 00000000..a8ca1bb5
--- /dev/null
+++ b/src/img/symbols/JGP/T.svg
@@ -0,0 +1,71 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/U.svg b/src/img/symbols/JGP/U.svg
new file mode 100644
index 00000000..a1f31a6d
--- /dev/null
+++ b/src/img/symbols/JGP/U.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/JGP/WM.svg b/src/img/symbols/JGP/WM.svg
new file mode 100644
index 00000000..1f6424e3
--- /dev/null
+++ b/src/img/symbols/JGP/WM.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/80.svg b/src/img/symbols/JHH/80.svg
new file mode 100644
index 00000000..fbafc13e
--- /dev/null
+++ b/src/img/symbols/JHH/80.svg
@@ -0,0 +1,36 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/C.svg b/src/img/symbols/JHH/C.svg
new file mode 100644
index 00000000..f2eee802
--- /dev/null
+++ b/src/img/symbols/JHH/C.svg
@@ -0,0 +1,36 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/M.svg b/src/img/symbols/JHH/M.svg
new file mode 100644
index 00000000..0d8f6cc7
--- /dev/null
+++ b/src/img/symbols/JHH/M.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/R.svg b/src/img/symbols/JHH/R.svg
new file mode 100644
index 00000000..020199c2
--- /dev/null
+++ b/src/img/symbols/JHH/R.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/T.svg b/src/img/symbols/JHH/T.svg
new file mode 100644
index 00000000..d0514969
--- /dev/null
+++ b/src/img/symbols/JHH/T.svg
@@ -0,0 +1,83 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/U.svg b/src/img/symbols/JHH/U.svg
new file mode 100644
index 00000000..c34b2a6c
--- /dev/null
+++ b/src/img/symbols/JHH/U.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/img/symbols/JHH/WM.svg b/src/img/symbols/JHH/WM.svg
new file mode 100644
index 00000000..97211c25
--- /dev/null
+++ b/src/img/symbols/JHH/WM.svg
@@ -0,0 +1,51 @@
+
+
+
+
diff --git a/src/img/symbols/JMP/C.svg b/src/img/symbols/JMP/C.svg
new file mode 100644
index 00000000..d88aab80
--- /dev/null
+++ b/src/img/symbols/JMP/C.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/src/img/symbols/JMP/M.svg b/src/img/symbols/JMP/M.svg
new file mode 100644
index 00000000..e7ae951e
--- /dev/null
+++ b/src/img/symbols/JMP/M.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/src/img/symbols/JMP/R.svg b/src/img/symbols/JMP/R.svg
new file mode 100644
index 00000000..8797ae0d
--- /dev/null
+++ b/src/img/symbols/JMP/R.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/src/img/symbols/JMP/U.svg b/src/img/symbols/JMP/U.svg
new file mode 100644
index 00000000..f3fb3d13
--- /dev/null
+++ b/src/img/symbols/JMP/U.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/src/img/symbols/JOU/80.svg b/src/img/symbols/JOU/80.svg
new file mode 100644
index 00000000..931770d1
--- /dev/null
+++ b/src/img/symbols/JOU/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/JOU/C.svg b/src/img/symbols/JOU/C.svg
new file mode 100644
index 00000000..e3fa440e
--- /dev/null
+++ b/src/img/symbols/JOU/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/JOU/M.svg b/src/img/symbols/JOU/M.svg
new file mode 100644
index 00000000..b24590f4
--- /dev/null
+++ b/src/img/symbols/JOU/M.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/JOU/R.svg b/src/img/symbols/JOU/R.svg
new file mode 100644
index 00000000..384b52d9
--- /dev/null
+++ b/src/img/symbols/JOU/R.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/JOU/T.svg b/src/img/symbols/JOU/T.svg
new file mode 100644
index 00000000..88fd2bf5
--- /dev/null
+++ b/src/img/symbols/JOU/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/JOU/U.svg b/src/img/symbols/JOU/U.svg
new file mode 100644
index 00000000..76bf6d4b
--- /dev/null
+++ b/src/img/symbols/JOU/U.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/JOU/WM.svg b/src/img/symbols/JOU/WM.svg
new file mode 100644
index 00000000..f918baf8
--- /dev/null
+++ b/src/img/symbols/JOU/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/JUD/80.svg b/src/img/symbols/JUD/80.svg
new file mode 100644
index 00000000..b035bc72
--- /dev/null
+++ b/src/img/symbols/JUD/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/JUD/C.svg b/src/img/symbols/JUD/C.svg
new file mode 100644
index 00000000..5202cd47
--- /dev/null
+++ b/src/img/symbols/JUD/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/JUD/M.svg b/src/img/symbols/JUD/M.svg
new file mode 100644
index 00000000..56bb7387
--- /dev/null
+++ b/src/img/symbols/JUD/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/JUD/R.svg b/src/img/symbols/JUD/R.svg
new file mode 100644
index 00000000..235073fa
--- /dev/null
+++ b/src/img/symbols/JUD/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/JUD/T.svg b/src/img/symbols/JUD/T.svg
new file mode 100644
index 00000000..ec489ca1
--- /dev/null
+++ b/src/img/symbols/JUD/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/JUD/U.svg b/src/img/symbols/JUD/U.svg
new file mode 100644
index 00000000..5f7daecb
--- /dev/null
+++ b/src/img/symbols/JUD/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/JUD/WM.svg b/src/img/symbols/JUD/WM.svg
new file mode 100644
index 00000000..39dad90a
--- /dev/null
+++ b/src/img/symbols/JUD/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/KHC/80.svg b/src/img/symbols/KHC/80.svg
new file mode 100644
index 00000000..49278b4e
--- /dev/null
+++ b/src/img/symbols/KHC/80.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/src/img/symbols/KHC/C.svg b/src/img/symbols/KHC/C.svg
new file mode 100644
index 00000000..86034a29
--- /dev/null
+++ b/src/img/symbols/KHC/C.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/src/img/symbols/KHC/M.svg b/src/img/symbols/KHC/M.svg
new file mode 100644
index 00000000..ffda1953
--- /dev/null
+++ b/src/img/symbols/KHC/M.svg
@@ -0,0 +1,97 @@
+
+
diff --git a/src/img/symbols/KHC/R.svg b/src/img/symbols/KHC/R.svg
new file mode 100644
index 00000000..df7bc781
--- /dev/null
+++ b/src/img/symbols/KHC/R.svg
@@ -0,0 +1,97 @@
+
+
diff --git a/src/img/symbols/KHC/T.svg b/src/img/symbols/KHC/T.svg
new file mode 100644
index 00000000..73c31899
--- /dev/null
+++ b/src/img/symbols/KHC/T.svg
@@ -0,0 +1,112 @@
+
+
diff --git a/src/img/symbols/KHC/U.svg b/src/img/symbols/KHC/U.svg
new file mode 100644
index 00000000..82ce6a44
--- /dev/null
+++ b/src/img/symbols/KHC/U.svg
@@ -0,0 +1,97 @@
+
+
diff --git a/src/img/symbols/KHC/WM.svg b/src/img/symbols/KHC/WM.svg
new file mode 100644
index 00000000..46bec644
--- /dev/null
+++ b/src/img/symbols/KHC/WM.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/src/img/symbols/KHM/C.svg b/src/img/symbols/KHM/C.svg
new file mode 100644
index 00000000..1ad2b6ae
--- /dev/null
+++ b/src/img/symbols/KHM/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/KHM/M.svg b/src/img/symbols/KHM/M.svg
new file mode 100644
index 00000000..f9a79f92
--- /dev/null
+++ b/src/img/symbols/KHM/M.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/KHM/R.svg b/src/img/symbols/KHM/R.svg
new file mode 100644
index 00000000..099ac844
--- /dev/null
+++ b/src/img/symbols/KHM/R.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/KHM/U.svg b/src/img/symbols/KHM/U.svg
new file mode 100644
index 00000000..ffb842a5
--- /dev/null
+++ b/src/img/symbols/KHM/U.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/KLD/80.svg b/src/img/symbols/KLD/80.svg
new file mode 100644
index 00000000..4104a820
--- /dev/null
+++ b/src/img/symbols/KLD/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/KLD/C.svg b/src/img/symbols/KLD/C.svg
new file mode 100644
index 00000000..2bf58352
--- /dev/null
+++ b/src/img/symbols/KLD/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/KLD/M.svg b/src/img/symbols/KLD/M.svg
new file mode 100644
index 00000000..e220c531
--- /dev/null
+++ b/src/img/symbols/KLD/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/KLD/R.svg b/src/img/symbols/KLD/R.svg
new file mode 100644
index 00000000..1206e3d7
--- /dev/null
+++ b/src/img/symbols/KLD/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/KLD/T.svg b/src/img/symbols/KLD/T.svg
new file mode 100644
index 00000000..46a67732
--- /dev/null
+++ b/src/img/symbols/KLD/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/KLD/U.svg b/src/img/symbols/KLD/U.svg
new file mode 100644
index 00000000..efae7ffc
--- /dev/null
+++ b/src/img/symbols/KLD/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/KLD/WM.svg b/src/img/symbols/KLD/WM.svg
new file mode 100644
index 00000000..20876940
--- /dev/null
+++ b/src/img/symbols/KLD/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/KTK/80.svg b/src/img/symbols/KTK/80.svg
new file mode 100644
index 00000000..f5a4a8e8
--- /dev/null
+++ b/src/img/symbols/KTK/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/KTK/C.svg b/src/img/symbols/KTK/C.svg
new file mode 100644
index 00000000..7955363e
--- /dev/null
+++ b/src/img/symbols/KTK/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/KTK/M.svg b/src/img/symbols/KTK/M.svg
new file mode 100644
index 00000000..3b0cd60d
--- /dev/null
+++ b/src/img/symbols/KTK/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/KTK/R.svg b/src/img/symbols/KTK/R.svg
new file mode 100644
index 00000000..2155f0ae
--- /dev/null
+++ b/src/img/symbols/KTK/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/KTK/T.svg b/src/img/symbols/KTK/T.svg
new file mode 100644
index 00000000..02561087
--- /dev/null
+++ b/src/img/symbols/KTK/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/KTK/U.svg b/src/img/symbols/KTK/U.svg
new file mode 100644
index 00000000..40910cbc
--- /dev/null
+++ b/src/img/symbols/KTK/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/KTK/WM.svg b/src/img/symbols/KTK/WM.svg
new file mode 100644
index 00000000..f8e11ceb
--- /dev/null
+++ b/src/img/symbols/KTK/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/LEA/80.svg b/src/img/symbols/LEA/80.svg
new file mode 100644
index 00000000..e75f2ad1
--- /dev/null
+++ b/src/img/symbols/LEA/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/LEA/C.svg b/src/img/symbols/LEA/C.svg
new file mode 100644
index 00000000..774d3b69
--- /dev/null
+++ b/src/img/symbols/LEA/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/LEA/M.svg b/src/img/symbols/LEA/M.svg
new file mode 100644
index 00000000..2c41eb2e
--- /dev/null
+++ b/src/img/symbols/LEA/M.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/LEA/R.svg b/src/img/symbols/LEA/R.svg
new file mode 100644
index 00000000..7bde0e78
--- /dev/null
+++ b/src/img/symbols/LEA/R.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/LEA/T.svg b/src/img/symbols/LEA/T.svg
new file mode 100644
index 00000000..75bc1830
--- /dev/null
+++ b/src/img/symbols/LEA/T.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/LEA/U.svg b/src/img/symbols/LEA/U.svg
new file mode 100644
index 00000000..5ef52ee9
--- /dev/null
+++ b/src/img/symbols/LEA/U.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/LEA/WM.svg b/src/img/symbols/LEA/WM.svg
new file mode 100644
index 00000000..c1c4e859
--- /dev/null
+++ b/src/img/symbols/LEA/WM.svg
@@ -0,0 +1,3 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/80.svg b/src/img/symbols/LEA_ALT1/80.svg
new file mode 100644
index 00000000..dd7f2080
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/C.svg b/src/img/symbols/LEA_ALT1/C.svg
new file mode 100644
index 00000000..a153bd21
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/M.svg b/src/img/symbols/LEA_ALT1/M.svg
new file mode 100644
index 00000000..5259733d
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/R.svg b/src/img/symbols/LEA_ALT1/R.svg
new file mode 100644
index 00000000..7421fc45
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/T.svg b/src/img/symbols/LEA_ALT1/T.svg
new file mode 100644
index 00000000..5a63752d
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/T.svg
@@ -0,0 +1,85 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/U.svg b/src/img/symbols/LEA_ALT1/U.svg
new file mode 100644
index 00000000..d81968e9
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LEA_ALT1/WM.svg b/src/img/symbols/LEA_ALT1/WM.svg
new file mode 100644
index 00000000..430ef3a7
--- /dev/null
+++ b/src/img/symbols/LEA_ALT1/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/LEB/80.svg b/src/img/symbols/LEB/80.svg
new file mode 100644
index 00000000..9b80b120
--- /dev/null
+++ b/src/img/symbols/LEB/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/LEB/C.svg b/src/img/symbols/LEB/C.svg
new file mode 100644
index 00000000..ded3ddf9
--- /dev/null
+++ b/src/img/symbols/LEB/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/LEB/M.svg b/src/img/symbols/LEB/M.svg
new file mode 100644
index 00000000..4bc5a8ca
--- /dev/null
+++ b/src/img/symbols/LEB/M.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/LEB/R.svg b/src/img/symbols/LEB/R.svg
new file mode 100644
index 00000000..0274394a
--- /dev/null
+++ b/src/img/symbols/LEB/R.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/LEB/T.svg b/src/img/symbols/LEB/T.svg
new file mode 100644
index 00000000..1e6129ae
--- /dev/null
+++ b/src/img/symbols/LEB/T.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/LEB/U.svg b/src/img/symbols/LEB/U.svg
new file mode 100644
index 00000000..3e83cde1
--- /dev/null
+++ b/src/img/symbols/LEB/U.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/LEB/WM.svg b/src/img/symbols/LEB/WM.svg
new file mode 100644
index 00000000..c8505379
--- /dev/null
+++ b/src/img/symbols/LEB/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/80.svg b/src/img/symbols/LEB_ALT1/80.svg
new file mode 100644
index 00000000..7c296677
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/C.svg b/src/img/symbols/LEB_ALT1/C.svg
new file mode 100644
index 00000000..556ec71c
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/M.svg b/src/img/symbols/LEB_ALT1/M.svg
new file mode 100644
index 00000000..188bcf5b
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/R.svg b/src/img/symbols/LEB_ALT1/R.svg
new file mode 100644
index 00000000..883e001e
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/T.svg b/src/img/symbols/LEB_ALT1/T.svg
new file mode 100644
index 00000000..91657494
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/T.svg
@@ -0,0 +1,85 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/U.svg b/src/img/symbols/LEB_ALT1/U.svg
new file mode 100644
index 00000000..ef3fd454
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LEB_ALT1/WM.svg b/src/img/symbols/LEB_ALT1/WM.svg
new file mode 100644
index 00000000..01a00231
--- /dev/null
+++ b/src/img/symbols/LEB_ALT1/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/LEG/80.svg b/src/img/symbols/LEG/80.svg
new file mode 100644
index 00000000..8f743e02
--- /dev/null
+++ b/src/img/symbols/LEG/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/LEG/C - Original.svg b/src/img/symbols/LEG/C - Original.svg
new file mode 100644
index 00000000..0fbe8b08
--- /dev/null
+++ b/src/img/symbols/LEG/C - Original.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/LEG/C.svg b/src/img/symbols/LEG/C.svg
new file mode 100644
index 00000000..83acb8ae
--- /dev/null
+++ b/src/img/symbols/LEG/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/LEG/M.svg b/src/img/symbols/LEG/M.svg
new file mode 100644
index 00000000..4d669401
--- /dev/null
+++ b/src/img/symbols/LEG/M.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/LEG/R.svg b/src/img/symbols/LEG/R.svg
new file mode 100644
index 00000000..a3ce6c44
--- /dev/null
+++ b/src/img/symbols/LEG/R.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/LEG/T.svg b/src/img/symbols/LEG/T.svg
new file mode 100644
index 00000000..0648ead2
--- /dev/null
+++ b/src/img/symbols/LEG/T.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/LEG/U.svg b/src/img/symbols/LEG/U.svg
new file mode 100644
index 00000000..2ce9face
--- /dev/null
+++ b/src/img/symbols/LEG/U.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/LEG/WM.svg b/src/img/symbols/LEG/WM.svg
new file mode 100644
index 00000000..1e9554c3
--- /dev/null
+++ b/src/img/symbols/LEG/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/LGN/80.svg b/src/img/symbols/LGN/80.svg
new file mode 100644
index 00000000..e7010ebf
--- /dev/null
+++ b/src/img/symbols/LGN/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/LGN/C.svg b/src/img/symbols/LGN/C.svg
new file mode 100644
index 00000000..88e45436
--- /dev/null
+++ b/src/img/symbols/LGN/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/LGN/M.svg b/src/img/symbols/LGN/M.svg
new file mode 100644
index 00000000..577dd212
--- /dev/null
+++ b/src/img/symbols/LGN/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LGN/R.svg b/src/img/symbols/LGN/R.svg
new file mode 100644
index 00000000..1e384d96
--- /dev/null
+++ b/src/img/symbols/LGN/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LGN/T.svg b/src/img/symbols/LGN/T.svg
new file mode 100644
index 00000000..5e098ca7
--- /dev/null
+++ b/src/img/symbols/LGN/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LGN/U.svg b/src/img/symbols/LGN/U.svg
new file mode 100644
index 00000000..70458406
--- /dev/null
+++ b/src/img/symbols/LGN/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LGN/WM.svg b/src/img/symbols/LGN/WM.svg
new file mode 100644
index 00000000..299385a8
--- /dev/null
+++ b/src/img/symbols/LGN/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/LRW/80.svg b/src/img/symbols/LRW/80.svg
new file mode 100644
index 00000000..4d2672d8
--- /dev/null
+++ b/src/img/symbols/LRW/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/LRW/C.svg b/src/img/symbols/LRW/C.svg
new file mode 100644
index 00000000..436b5c13
--- /dev/null
+++ b/src/img/symbols/LRW/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/LRW/M.svg b/src/img/symbols/LRW/M.svg
new file mode 100644
index 00000000..97da22e1
--- /dev/null
+++ b/src/img/symbols/LRW/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LRW/R.svg b/src/img/symbols/LRW/R.svg
new file mode 100644
index 00000000..f9a791ae
--- /dev/null
+++ b/src/img/symbols/LRW/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LRW/T.svg b/src/img/symbols/LRW/T.svg
new file mode 100644
index 00000000..6e495e8a
--- /dev/null
+++ b/src/img/symbols/LRW/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LRW/U.svg b/src/img/symbols/LRW/U.svg
new file mode 100644
index 00000000..0df10548
--- /dev/null
+++ b/src/img/symbols/LRW/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/LRW/WM.svg b/src/img/symbols/LRW/WM.svg
new file mode 100644
index 00000000..c555850d
--- /dev/null
+++ b/src/img/symbols/LRW/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/M10/80.svg b/src/img/symbols/M10/80.svg
new file mode 100644
index 00000000..2585c0de
--- /dev/null
+++ b/src/img/symbols/M10/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M10/C.svg b/src/img/symbols/M10/C.svg
new file mode 100644
index 00000000..0d9c6dac
--- /dev/null
+++ b/src/img/symbols/M10/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M10/M.svg b/src/img/symbols/M10/M.svg
new file mode 100644
index 00000000..9cf420d2
--- /dev/null
+++ b/src/img/symbols/M10/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M10/R.svg b/src/img/symbols/M10/R.svg
new file mode 100644
index 00000000..01b250ca
--- /dev/null
+++ b/src/img/symbols/M10/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M10/T.svg b/src/img/symbols/M10/T.svg
new file mode 100644
index 00000000..a40c6419
--- /dev/null
+++ b/src/img/symbols/M10/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M10/U.svg b/src/img/symbols/M10/U.svg
new file mode 100644
index 00000000..1431532c
--- /dev/null
+++ b/src/img/symbols/M10/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M10/Watermark - M25.svg b/src/img/symbols/M10/Watermark - M25.svg
new file mode 100644
index 00000000..54208792
--- /dev/null
+++ b/src/img/symbols/M10/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/M11/80.svg b/src/img/symbols/M11/80.svg
new file mode 100644
index 00000000..94ee0809
--- /dev/null
+++ b/src/img/symbols/M11/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M11/C.svg b/src/img/symbols/M11/C.svg
new file mode 100644
index 00000000..d702b4db
--- /dev/null
+++ b/src/img/symbols/M11/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M11/M.svg b/src/img/symbols/M11/M.svg
new file mode 100644
index 00000000..e34812c6
--- /dev/null
+++ b/src/img/symbols/M11/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M11/R.svg b/src/img/symbols/M11/R.svg
new file mode 100644
index 00000000..dac065fd
--- /dev/null
+++ b/src/img/symbols/M11/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M11/T.svg b/src/img/symbols/M11/T.svg
new file mode 100644
index 00000000..cd1436ec
--- /dev/null
+++ b/src/img/symbols/M11/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M11/U.svg b/src/img/symbols/M11/U.svg
new file mode 100644
index 00000000..01472482
--- /dev/null
+++ b/src/img/symbols/M11/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M11/Watermark - M25.svg b/src/img/symbols/M11/Watermark - M25.svg
new file mode 100644
index 00000000..77541756
--- /dev/null
+++ b/src/img/symbols/M11/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
+
diff --git a/src/img/symbols/M12/80.svg b/src/img/symbols/M12/80.svg
new file mode 100644
index 00000000..634d26b1
--- /dev/null
+++ b/src/img/symbols/M12/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M12/C.svg b/src/img/symbols/M12/C.svg
new file mode 100644
index 00000000..37a29a4b
--- /dev/null
+++ b/src/img/symbols/M12/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M12/M.svg b/src/img/symbols/M12/M.svg
new file mode 100644
index 00000000..daded625
--- /dev/null
+++ b/src/img/symbols/M12/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M12/R.svg b/src/img/symbols/M12/R.svg
new file mode 100644
index 00000000..8917c7e9
--- /dev/null
+++ b/src/img/symbols/M12/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M12/T.svg b/src/img/symbols/M12/T.svg
new file mode 100644
index 00000000..a4457da1
--- /dev/null
+++ b/src/img/symbols/M12/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M12/U.svg b/src/img/symbols/M12/U.svg
new file mode 100644
index 00000000..fd465650
--- /dev/null
+++ b/src/img/symbols/M12/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M12/Watermark - M25.svg b/src/img/symbols/M12/Watermark - M25.svg
new file mode 100644
index 00000000..000d6d63
--- /dev/null
+++ b/src/img/symbols/M12/Watermark - M25.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M13/80.svg b/src/img/symbols/M13/80.svg
new file mode 100644
index 00000000..0a60e7db
--- /dev/null
+++ b/src/img/symbols/M13/80.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/M13/C.svg b/src/img/symbols/M13/C.svg
new file mode 100644
index 00000000..b057533d
--- /dev/null
+++ b/src/img/symbols/M13/C.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/M13/M.svg b/src/img/symbols/M13/M.svg
new file mode 100644
index 00000000..a0f92ddb
--- /dev/null
+++ b/src/img/symbols/M13/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/M13/R.svg b/src/img/symbols/M13/R.svg
new file mode 100644
index 00000000..2fbdd318
--- /dev/null
+++ b/src/img/symbols/M13/R.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/M13/T.svg b/src/img/symbols/M13/T.svg
new file mode 100644
index 00000000..b5a18c25
--- /dev/null
+++ b/src/img/symbols/M13/T.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/M13/U.svg b/src/img/symbols/M13/U.svg
new file mode 100644
index 00000000..1412180c
--- /dev/null
+++ b/src/img/symbols/M13/U.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/M13/Watermark - M25.svg b/src/img/symbols/M13/Watermark - M25.svg
new file mode 100644
index 00000000..bf9003a4
--- /dev/null
+++ b/src/img/symbols/M13/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/M14/80.svg b/src/img/symbols/M14/80.svg
new file mode 100644
index 00000000..fbba9403
--- /dev/null
+++ b/src/img/symbols/M14/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/M14/C.svg b/src/img/symbols/M14/C.svg
new file mode 100644
index 00000000..93b3e502
--- /dev/null
+++ b/src/img/symbols/M14/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/M14/M.svg b/src/img/symbols/M14/M.svg
new file mode 100644
index 00000000..626f0c1d
--- /dev/null
+++ b/src/img/symbols/M14/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M14/R.svg b/src/img/symbols/M14/R.svg
new file mode 100644
index 00000000..cf01e3f4
--- /dev/null
+++ b/src/img/symbols/M14/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/M14/T.svg b/src/img/symbols/M14/T.svg
new file mode 100644
index 00000000..d8fa8f1c
--- /dev/null
+++ b/src/img/symbols/M14/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/M14/U.svg b/src/img/symbols/M14/U.svg
new file mode 100644
index 00000000..e6ef31c5
--- /dev/null
+++ b/src/img/symbols/M14/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/M14/Watermark - M25.svg b/src/img/symbols/M14/Watermark - M25.svg
new file mode 100644
index 00000000..8b230507
--- /dev/null
+++ b/src/img/symbols/M14/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/M15/80.svg b/src/img/symbols/M15/80.svg
new file mode 100644
index 00000000..b8449b26
--- /dev/null
+++ b/src/img/symbols/M15/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/M15/C.svg b/src/img/symbols/M15/C.svg
new file mode 100644
index 00000000..4d420c85
--- /dev/null
+++ b/src/img/symbols/M15/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/M15/M.svg b/src/img/symbols/M15/M.svg
new file mode 100644
index 00000000..b39665ff
--- /dev/null
+++ b/src/img/symbols/M15/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M15/R.svg b/src/img/symbols/M15/R.svg
new file mode 100644
index 00000000..de3ad1e4
--- /dev/null
+++ b/src/img/symbols/M15/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M15/S.svg b/src/img/symbols/M15/S.svg
new file mode 100644
index 00000000..6113bfcc
--- /dev/null
+++ b/src/img/symbols/M15/S.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/M15/T.svg b/src/img/symbols/M15/T.svg
new file mode 100644
index 00000000..a2ffa3ad
--- /dev/null
+++ b/src/img/symbols/M15/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M15/U.svg b/src/img/symbols/M15/U.svg
new file mode 100644
index 00000000..6438012b
--- /dev/null
+++ b/src/img/symbols/M15/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M15/Watermark - M25.svg b/src/img/symbols/M15/Watermark - M25.svg
new file mode 100644
index 00000000..8d3be58e
--- /dev/null
+++ b/src/img/symbols/M15/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/M19/80.svg b/src/img/symbols/M19/80.svg
new file mode 100644
index 00000000..9ace2594
--- /dev/null
+++ b/src/img/symbols/M19/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/M19/C.svg b/src/img/symbols/M19/C.svg
new file mode 100644
index 00000000..e7e1bfe7
--- /dev/null
+++ b/src/img/symbols/M19/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/M19/M.svg b/src/img/symbols/M19/M.svg
new file mode 100644
index 00000000..3aa262ce
--- /dev/null
+++ b/src/img/symbols/M19/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M19/R.svg b/src/img/symbols/M19/R.svg
new file mode 100644
index 00000000..3efa80d9
--- /dev/null
+++ b/src/img/symbols/M19/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M19/T.svg b/src/img/symbols/M19/T.svg
new file mode 100644
index 00000000..3568b291
--- /dev/null
+++ b/src/img/symbols/M19/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M19/U.svg b/src/img/symbols/M19/U.svg
new file mode 100644
index 00000000..36dbcafb
--- /dev/null
+++ b/src/img/symbols/M19/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/M19/WM.svg b/src/img/symbols/M19/WM.svg
new file mode 100644
index 00000000..79c4c83d
--- /dev/null
+++ b/src/img/symbols/M19/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/M20/80.svg b/src/img/symbols/M20/80.svg
new file mode 100644
index 00000000..5fdaf6a7
--- /dev/null
+++ b/src/img/symbols/M20/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M20/C.svg b/src/img/symbols/M20/C.svg
new file mode 100644
index 00000000..74bcdd52
--- /dev/null
+++ b/src/img/symbols/M20/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/M20/M.svg b/src/img/symbols/M20/M.svg
new file mode 100644
index 00000000..227dfe93
--- /dev/null
+++ b/src/img/symbols/M20/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M20/R.svg b/src/img/symbols/M20/R.svg
new file mode 100644
index 00000000..ef4e926e
--- /dev/null
+++ b/src/img/symbols/M20/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M20/T.svg b/src/img/symbols/M20/T.svg
new file mode 100644
index 00000000..66de302a
--- /dev/null
+++ b/src/img/symbols/M20/T.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/M20/U.svg b/src/img/symbols/M20/U.svg
new file mode 100644
index 00000000..a49d38f0
--- /dev/null
+++ b/src/img/symbols/M20/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/M20/WM.svg b/src/img/symbols/M20/WM.svg
new file mode 100644
index 00000000..cadb15f0
--- /dev/null
+++ b/src/img/symbols/M20/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/M21/C.svg b/src/img/symbols/M21/C.svg
new file mode 100644
index 00000000..736437c9
--- /dev/null
+++ b/src/img/symbols/M21/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/M21/M.svg b/src/img/symbols/M21/M.svg
new file mode 100644
index 00000000..88e08182
--- /dev/null
+++ b/src/img/symbols/M21/M.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/M21/R.svg b/src/img/symbols/M21/R.svg
new file mode 100644
index 00000000..00d56767
--- /dev/null
+++ b/src/img/symbols/M21/R.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/M21/U.svg b/src/img/symbols/M21/U.svg
new file mode 100644
index 00000000..2eb3fbd1
--- /dev/null
+++ b/src/img/symbols/M21/U.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/MAT/80.svg b/src/img/symbols/MAT/80.svg
new file mode 100644
index 00000000..519cd575
--- /dev/null
+++ b/src/img/symbols/MAT/80.svg
@@ -0,0 +1,28 @@
+
+
+
+
diff --git a/src/img/symbols/MAT/C.svg b/src/img/symbols/MAT/C.svg
new file mode 100644
index 00000000..ff69ef78
--- /dev/null
+++ b/src/img/symbols/MAT/C.svg
@@ -0,0 +1,28 @@
+
+
+
+
diff --git a/src/img/symbols/MAT/M.svg b/src/img/symbols/MAT/M.svg
new file mode 100644
index 00000000..66d71a17
--- /dev/null
+++ b/src/img/symbols/MAT/M.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/src/img/symbols/MAT/R.svg b/src/img/symbols/MAT/R.svg
new file mode 100644
index 00000000..95ba7e19
--- /dev/null
+++ b/src/img/symbols/MAT/R.svg
@@ -0,0 +1,46 @@
+
+
+
+
diff --git a/src/img/symbols/MAT/T.svg b/src/img/symbols/MAT/T.svg
new file mode 100644
index 00000000..1cf8369a
--- /dev/null
+++ b/src/img/symbols/MAT/T.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/MAT/U.svg b/src/img/symbols/MAT/U.svg
new file mode 100644
index 00000000..6f21d70a
--- /dev/null
+++ b/src/img/symbols/MAT/U.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/MAT/WM.svg b/src/img/symbols/MAT/WM.svg
new file mode 100644
index 00000000..c7236aac
--- /dev/null
+++ b/src/img/symbols/MAT/WM.svg
@@ -0,0 +1,27 @@
+
+
+
+
diff --git a/src/img/symbols/MBS/80.svg b/src/img/symbols/MBS/80.svg
new file mode 100644
index 00000000..812a3915
--- /dev/null
+++ b/src/img/symbols/MBS/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MBS/C.svg b/src/img/symbols/MBS/C.svg
new file mode 100644
index 00000000..1334298b
--- /dev/null
+++ b/src/img/symbols/MBS/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MBS/M.svg b/src/img/symbols/MBS/M.svg
new file mode 100644
index 00000000..e26cd52e
--- /dev/null
+++ b/src/img/symbols/MBS/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MBS/R.svg b/src/img/symbols/MBS/R.svg
new file mode 100644
index 00000000..c57231c7
--- /dev/null
+++ b/src/img/symbols/MBS/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MBS/T.svg b/src/img/symbols/MBS/T.svg
new file mode 100644
index 00000000..53119d4a
--- /dev/null
+++ b/src/img/symbols/MBS/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MBS/U.svg b/src/img/symbols/MBS/U.svg
new file mode 100644
index 00000000..df16e844
--- /dev/null
+++ b/src/img/symbols/MBS/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MBS/WM (2).svg b/src/img/symbols/MBS/WM (2).svg
new file mode 100644
index 00000000..c3cbd03f
--- /dev/null
+++ b/src/img/symbols/MBS/WM (2).svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MD1/80.svg b/src/img/symbols/MD1/80.svg
new file mode 100644
index 00000000..b1e26979
--- /dev/null
+++ b/src/img/symbols/MD1/80.svg
@@ -0,0 +1,54 @@
+
+
diff --git a/src/img/symbols/MD1/C.svg b/src/img/symbols/MD1/C.svg
new file mode 100644
index 00000000..cf553c1e
--- /dev/null
+++ b/src/img/symbols/MD1/C.svg
@@ -0,0 +1,54 @@
+
+
diff --git a/src/img/symbols/MD1/M.svg b/src/img/symbols/MD1/M.svg
new file mode 100644
index 00000000..3f55999b
--- /dev/null
+++ b/src/img/symbols/MD1/M.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/src/img/symbols/MD1/R.svg b/src/img/symbols/MD1/R.svg
new file mode 100644
index 00000000..92528626
--- /dev/null
+++ b/src/img/symbols/MD1/R.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/src/img/symbols/MD1/T.svg b/src/img/symbols/MD1/T.svg
new file mode 100644
index 00000000..5c0693ca
--- /dev/null
+++ b/src/img/symbols/MD1/T.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/src/img/symbols/MD1/U.svg b/src/img/symbols/MD1/U.svg
new file mode 100644
index 00000000..0a453d53
--- /dev/null
+++ b/src/img/symbols/MD1/U.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/src/img/symbols/MD1/WM.svg b/src/img/symbols/MD1/WM.svg
new file mode 100644
index 00000000..cb3379b1
--- /dev/null
+++ b/src/img/symbols/MD1/WM.svg
@@ -0,0 +1,50 @@
+
+
diff --git a/src/img/symbols/ME1/80.svg b/src/img/symbols/ME1/80.svg
new file mode 100644
index 00000000..fdb4916c
--- /dev/null
+++ b/src/img/symbols/ME1/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME1/C.svg b/src/img/symbols/ME1/C.svg
new file mode 100644
index 00000000..66c97ac5
--- /dev/null
+++ b/src/img/symbols/ME1/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME1/M.svg b/src/img/symbols/ME1/M.svg
new file mode 100644
index 00000000..40e74503
--- /dev/null
+++ b/src/img/symbols/ME1/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME1/R.svg b/src/img/symbols/ME1/R.svg
new file mode 100644
index 00000000..f2de1808
--- /dev/null
+++ b/src/img/symbols/ME1/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME1/T.svg b/src/img/symbols/ME1/T.svg
new file mode 100644
index 00000000..eeb2d812
--- /dev/null
+++ b/src/img/symbols/ME1/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME1/U.svg b/src/img/symbols/ME1/U.svg
new file mode 100644
index 00000000..7c6c0b9d
--- /dev/null
+++ b/src/img/symbols/ME1/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME1/WM.svg b/src/img/symbols/ME1/WM.svg
new file mode 100644
index 00000000..4257018a
--- /dev/null
+++ b/src/img/symbols/ME1/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ME2/80.svg b/src/img/symbols/ME2/80.svg
new file mode 100644
index 00000000..f2a4c2fb
--- /dev/null
+++ b/src/img/symbols/ME2/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME2/C.svg b/src/img/symbols/ME2/C.svg
new file mode 100644
index 00000000..7cc9380d
--- /dev/null
+++ b/src/img/symbols/ME2/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME2/M.svg b/src/img/symbols/ME2/M.svg
new file mode 100644
index 00000000..c71f92ba
--- /dev/null
+++ b/src/img/symbols/ME2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME2/R.svg b/src/img/symbols/ME2/R.svg
new file mode 100644
index 00000000..a9de620c
--- /dev/null
+++ b/src/img/symbols/ME2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME2/T.svg b/src/img/symbols/ME2/T.svg
new file mode 100644
index 00000000..0ad21df9
--- /dev/null
+++ b/src/img/symbols/ME2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME2/U.svg b/src/img/symbols/ME2/U.svg
new file mode 100644
index 00000000..ced0a051
--- /dev/null
+++ b/src/img/symbols/ME2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME2/WM.svg b/src/img/symbols/ME2/WM.svg
new file mode 100644
index 00000000..c942d2ad
--- /dev/null
+++ b/src/img/symbols/ME2/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ME3/80.svg b/src/img/symbols/ME3/80.svg
new file mode 100644
index 00000000..e60aa3b0
--- /dev/null
+++ b/src/img/symbols/ME3/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME3/C.svg b/src/img/symbols/ME3/C.svg
new file mode 100644
index 00000000..a02c453b
--- /dev/null
+++ b/src/img/symbols/ME3/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME3/M.svg b/src/img/symbols/ME3/M.svg
new file mode 100644
index 00000000..f5bb282f
--- /dev/null
+++ b/src/img/symbols/ME3/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME3/R.svg b/src/img/symbols/ME3/R.svg
new file mode 100644
index 00000000..a2ccd022
--- /dev/null
+++ b/src/img/symbols/ME3/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME3/T.svg b/src/img/symbols/ME3/T.svg
new file mode 100644
index 00000000..f8b095c6
--- /dev/null
+++ b/src/img/symbols/ME3/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME3/U.svg b/src/img/symbols/ME3/U.svg
new file mode 100644
index 00000000..a25cea9b
--- /dev/null
+++ b/src/img/symbols/ME3/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ME3/WM.svg b/src/img/symbols/ME3/WM.svg
new file mode 100644
index 00000000..0658d214
--- /dev/null
+++ b/src/img/symbols/ME3/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ME4/80.svg b/src/img/symbols/ME4/80.svg
new file mode 100644
index 00000000..19804fbb
--- /dev/null
+++ b/src/img/symbols/ME4/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME4/C.svg b/src/img/symbols/ME4/C.svg
new file mode 100644
index 00000000..25727257
--- /dev/null
+++ b/src/img/symbols/ME4/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ME4/M.svg b/src/img/symbols/ME4/M.svg
new file mode 100644
index 00000000..c437ac27
--- /dev/null
+++ b/src/img/symbols/ME4/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ME4/R.svg b/src/img/symbols/ME4/R.svg
new file mode 100644
index 00000000..39a7dfe6
--- /dev/null
+++ b/src/img/symbols/ME4/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ME4/T.svg b/src/img/symbols/ME4/T.svg
new file mode 100644
index 00000000..dca93dfd
--- /dev/null
+++ b/src/img/symbols/ME4/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ME4/U.svg b/src/img/symbols/ME4/U.svg
new file mode 100644
index 00000000..f2e824d5
--- /dev/null
+++ b/src/img/symbols/ME4/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ME4/WM.svg b/src/img/symbols/ME4/WM.svg
new file mode 100644
index 00000000..9c648269
--- /dev/null
+++ b/src/img/symbols/ME4/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MED/M.svg b/src/img/symbols/MED/M.svg
new file mode 100644
index 00000000..cbd7bd54
--- /dev/null
+++ b/src/img/symbols/MED/M.svg
@@ -0,0 +1,94 @@
+
+
+
+
diff --git a/src/img/symbols/MH1/80.svg b/src/img/symbols/MH1/80.svg
new file mode 100644
index 00000000..b218fcd8
--- /dev/null
+++ b/src/img/symbols/MH1/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/MH1/C.svg b/src/img/symbols/MH1/C.svg
new file mode 100644
index 00000000..8d7a8012
--- /dev/null
+++ b/src/img/symbols/MH1/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/MH1/M.svg b/src/img/symbols/MH1/M.svg
new file mode 100644
index 00000000..f34b95d6
--- /dev/null
+++ b/src/img/symbols/MH1/M.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/MH1/R.svg b/src/img/symbols/MH1/R.svg
new file mode 100644
index 00000000..8cac8139
--- /dev/null
+++ b/src/img/symbols/MH1/R.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/src/img/symbols/MH1/T.svg b/src/img/symbols/MH1/T.svg
new file mode 100644
index 00000000..3881a9f0
--- /dev/null
+++ b/src/img/symbols/MH1/T.svg
@@ -0,0 +1,110 @@
+
+
diff --git a/src/img/symbols/MH1/U.svg b/src/img/symbols/MH1/U.svg
new file mode 100644
index 00000000..0d9a52d6
--- /dev/null
+++ b/src/img/symbols/MH1/U.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/MH2/80.svg b/src/img/symbols/MH2/80.svg
new file mode 100644
index 00000000..a3a0503c
--- /dev/null
+++ b/src/img/symbols/MH2/80.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/MH2/C.svg b/src/img/symbols/MH2/C.svg
new file mode 100644
index 00000000..62568a51
--- /dev/null
+++ b/src/img/symbols/MH2/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/MH2/M.svg b/src/img/symbols/MH2/M.svg
new file mode 100644
index 00000000..36f247d5
--- /dev/null
+++ b/src/img/symbols/MH2/M.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/MH2/R.svg b/src/img/symbols/MH2/R.svg
new file mode 100644
index 00000000..fe4421ad
--- /dev/null
+++ b/src/img/symbols/MH2/R.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/MH2/T.svg b/src/img/symbols/MH2/T.svg
new file mode 100644
index 00000000..48bf7240
--- /dev/null
+++ b/src/img/symbols/MH2/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/MH2/U.svg b/src/img/symbols/MH2/U.svg
new file mode 100644
index 00000000..66bad961
--- /dev/null
+++ b/src/img/symbols/MH2/U.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/MH2/WM.svg b/src/img/symbols/MH2/WM.svg
new file mode 100644
index 00000000..9ee81d59
--- /dev/null
+++ b/src/img/symbols/MH2/WM.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/MIC/80.svg b/src/img/symbols/MIC/80.svg
new file mode 100644
index 00000000..a55c5cd7
--- /dev/null
+++ b/src/img/symbols/MIC/80.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/MIC/C.svg b/src/img/symbols/MIC/C.svg
new file mode 100644
index 00000000..c9e0ebd7
--- /dev/null
+++ b/src/img/symbols/MIC/C.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/src/img/symbols/MIC/M.svg b/src/img/symbols/MIC/M.svg
new file mode 100644
index 00000000..244d0c3f
--- /dev/null
+++ b/src/img/symbols/MIC/M.svg
@@ -0,0 +1,99 @@
+
+
diff --git a/src/img/symbols/MIC/R.svg b/src/img/symbols/MIC/R.svg
new file mode 100644
index 00000000..bf128787
--- /dev/null
+++ b/src/img/symbols/MIC/R.svg
@@ -0,0 +1,99 @@
+
+
diff --git a/src/img/symbols/MIC/T.svg b/src/img/symbols/MIC/T.svg
new file mode 100644
index 00000000..e3de1afd
--- /dev/null
+++ b/src/img/symbols/MIC/T.svg
@@ -0,0 +1,100 @@
+
+
diff --git a/src/img/symbols/MIC/U.svg b/src/img/symbols/MIC/U.svg
new file mode 100644
index 00000000..c9adb948
--- /dev/null
+++ b/src/img/symbols/MIC/U.svg
@@ -0,0 +1,99 @@
+
+
diff --git a/src/img/symbols/MIC/WM.svg b/src/img/symbols/MIC/WM.svg
new file mode 100644
index 00000000..6319f15b
--- /dev/null
+++ b/src/img/symbols/MIC/WM.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/src/img/symbols/MID/80.svg b/src/img/symbols/MID/80.svg
new file mode 100644
index 00000000..5901d2fe
--- /dev/null
+++ b/src/img/symbols/MID/80.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/MID/C.svg b/src/img/symbols/MID/C.svg
new file mode 100644
index 00000000..e35f50cf
--- /dev/null
+++ b/src/img/symbols/MID/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/MID/M.svg b/src/img/symbols/MID/M.svg
new file mode 100644
index 00000000..c604001c
--- /dev/null
+++ b/src/img/symbols/MID/M.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/MID/R.svg b/src/img/symbols/MID/R.svg
new file mode 100644
index 00000000..49bd5962
--- /dev/null
+++ b/src/img/symbols/MID/R.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/MID/T.svg b/src/img/symbols/MID/T.svg
new file mode 100644
index 00000000..1aac99c2
--- /dev/null
+++ b/src/img/symbols/MID/T.svg
@@ -0,0 +1,79 @@
+
+
diff --git a/src/img/symbols/MID/U.svg b/src/img/symbols/MID/U.svg
new file mode 100644
index 00000000..b15a672b
--- /dev/null
+++ b/src/img/symbols/MID/U.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/src/img/symbols/MID/WM.svg b/src/img/symbols/MID/WM.svg
new file mode 100644
index 00000000..16d75f4b
--- /dev/null
+++ b/src/img/symbols/MID/WM.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/MIR/80.svg b/src/img/symbols/MIR/80.svg
new file mode 100644
index 00000000..21b2fe13
--- /dev/null
+++ b/src/img/symbols/MIR/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MIR/C.svg b/src/img/symbols/MIR/C.svg
new file mode 100644
index 00000000..3d51b344
--- /dev/null
+++ b/src/img/symbols/MIR/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MIR/M.svg b/src/img/symbols/MIR/M.svg
new file mode 100644
index 00000000..02e2ee31
--- /dev/null
+++ b/src/img/symbols/MIR/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MIR/R.svg b/src/img/symbols/MIR/R.svg
new file mode 100644
index 00000000..d5db2520
--- /dev/null
+++ b/src/img/symbols/MIR/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MIR/T.svg b/src/img/symbols/MIR/T.svg
new file mode 100644
index 00000000..4a5098cd
--- /dev/null
+++ b/src/img/symbols/MIR/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MIR/U.svg b/src/img/symbols/MIR/U.svg
new file mode 100644
index 00000000..d27a2ddc
--- /dev/null
+++ b/src/img/symbols/MIR/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MIR/WM.svg b/src/img/symbols/MIR/WM.svg
new file mode 100644
index 00000000..eedc1d71
--- /dev/null
+++ b/src/img/symbols/MIR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MIR/Watermark - M25.svg b/src/img/symbols/MIR/Watermark - M25.svg
new file mode 100644
index 00000000..98230695
--- /dev/null
+++ b/src/img/symbols/MIR/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MM2/80.svg b/src/img/symbols/MM2/80.svg
new file mode 100644
index 00000000..2a566119
--- /dev/null
+++ b/src/img/symbols/MM2/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MM2/C.svg b/src/img/symbols/MM2/C.svg
new file mode 100644
index 00000000..515898f5
--- /dev/null
+++ b/src/img/symbols/MM2/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MM2/M.svg b/src/img/symbols/MM2/M.svg
new file mode 100644
index 00000000..01b785fe
--- /dev/null
+++ b/src/img/symbols/MM2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MM2/R.svg b/src/img/symbols/MM2/R.svg
new file mode 100644
index 00000000..10625880
--- /dev/null
+++ b/src/img/symbols/MM2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MM2/T.svg b/src/img/symbols/MM2/T.svg
new file mode 100644
index 00000000..a599f30e
--- /dev/null
+++ b/src/img/symbols/MM2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MM2/U.svg b/src/img/symbols/MM2/U.svg
new file mode 100644
index 00000000..91ad3fb5
--- /dev/null
+++ b/src/img/symbols/MM2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MM2/WM.svg b/src/img/symbols/MM2/WM.svg
new file mode 100644
index 00000000..6698f89c
--- /dev/null
+++ b/src/img/symbols/MM2/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MM3/80.svg b/src/img/symbols/MM3/80.svg
new file mode 100644
index 00000000..86694a96
--- /dev/null
+++ b/src/img/symbols/MM3/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MM3/C.svg b/src/img/symbols/MM3/C.svg
new file mode 100644
index 00000000..b8dad60a
--- /dev/null
+++ b/src/img/symbols/MM3/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MM3/M.svg b/src/img/symbols/MM3/M.svg
new file mode 100644
index 00000000..b95fed22
--- /dev/null
+++ b/src/img/symbols/MM3/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/MM3/R.svg b/src/img/symbols/MM3/R.svg
new file mode 100644
index 00000000..f236d0a3
--- /dev/null
+++ b/src/img/symbols/MM3/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/MM3/T.svg b/src/img/symbols/MM3/T.svg
new file mode 100644
index 00000000..4f69cf53
--- /dev/null
+++ b/src/img/symbols/MM3/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/MM3/U.svg b/src/img/symbols/MM3/U.svg
new file mode 100644
index 00000000..c39dd823
--- /dev/null
+++ b/src/img/symbols/MM3/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/MM3/WM.svg b/src/img/symbols/MM3/WM.svg
new file mode 100644
index 00000000..6b4c070c
--- /dev/null
+++ b/src/img/symbols/MM3/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/MMA/80.svg b/src/img/symbols/MMA/80.svg
new file mode 100644
index 00000000..206d5489
--- /dev/null
+++ b/src/img/symbols/MMA/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MMA/C.svg b/src/img/symbols/MMA/C.svg
new file mode 100644
index 00000000..5f9f6873
--- /dev/null
+++ b/src/img/symbols/MMA/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MMA/M.svg b/src/img/symbols/MMA/M.svg
new file mode 100644
index 00000000..9d026849
--- /dev/null
+++ b/src/img/symbols/MMA/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/MMA/R.svg b/src/img/symbols/MMA/R.svg
new file mode 100644
index 00000000..3e3ea650
--- /dev/null
+++ b/src/img/symbols/MMA/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/MMA/T.svg b/src/img/symbols/MMA/T.svg
new file mode 100644
index 00000000..b2de26f9
--- /dev/null
+++ b/src/img/symbols/MMA/T.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/MMA/U.svg b/src/img/symbols/MMA/U.svg
new file mode 100644
index 00000000..ae93639c
--- /dev/null
+++ b/src/img/symbols/MMA/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/MMA/WM.svg b/src/img/symbols/MMA/WM.svg
new file mode 100644
index 00000000..1cc6e030
--- /dev/null
+++ b/src/img/symbols/MMA/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/MMQ/80.svg b/src/img/symbols/MMQ/80.svg
new file mode 100644
index 00000000..85f4b574
--- /dev/null
+++ b/src/img/symbols/MMQ/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MMQ/C.svg b/src/img/symbols/MMQ/C.svg
new file mode 100644
index 00000000..32087a9c
--- /dev/null
+++ b/src/img/symbols/MMQ/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MMQ/M.svg b/src/img/symbols/MMQ/M.svg
new file mode 100644
index 00000000..52f34473
--- /dev/null
+++ b/src/img/symbols/MMQ/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MMQ/R.svg b/src/img/symbols/MMQ/R.svg
new file mode 100644
index 00000000..d3014f99
--- /dev/null
+++ b/src/img/symbols/MMQ/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MMQ/T.svg b/src/img/symbols/MMQ/T.svg
new file mode 100644
index 00000000..e035aab6
--- /dev/null
+++ b/src/img/symbols/MMQ/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MMQ/U.svg b/src/img/symbols/MMQ/U.svg
new file mode 100644
index 00000000..b088c79c
--- /dev/null
+++ b/src/img/symbols/MMQ/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/MMQ/WM.svg b/src/img/symbols/MMQ/WM.svg
new file mode 100644
index 00000000..16499762
--- /dev/null
+++ b/src/img/symbols/MMQ/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MOC/80.svg b/src/img/symbols/MOC/80.svg
new file mode 100644
index 00000000..b1c88083
--- /dev/null
+++ b/src/img/symbols/MOC/80.svg
@@ -0,0 +1,42 @@
+
+
+
+
diff --git a/src/img/symbols/MOC/C.svg b/src/img/symbols/MOC/C.svg
new file mode 100644
index 00000000..39f6ee5c
--- /dev/null
+++ b/src/img/symbols/MOC/C.svg
@@ -0,0 +1,86 @@
+
+
+
+
diff --git a/src/img/symbols/MOC/M.svg b/src/img/symbols/MOC/M.svg
new file mode 100644
index 00000000..ca6a436a
--- /dev/null
+++ b/src/img/symbols/MOC/M.svg
@@ -0,0 +1,62 @@
+
+
+
+
diff --git a/src/img/symbols/MOC/R.svg b/src/img/symbols/MOC/R.svg
new file mode 100644
index 00000000..2d67bae5
--- /dev/null
+++ b/src/img/symbols/MOC/R.svg
@@ -0,0 +1,60 @@
+
+
+
+
diff --git a/src/img/symbols/MOC/T.svg b/src/img/symbols/MOC/T.svg
new file mode 100644
index 00000000..dba1afd1
--- /dev/null
+++ b/src/img/symbols/MOC/T.svg
@@ -0,0 +1,62 @@
+
+
+
+
diff --git a/src/img/symbols/MOC/U.svg b/src/img/symbols/MOC/U.svg
new file mode 100644
index 00000000..c6900f0c
--- /dev/null
+++ b/src/img/symbols/MOC/U.svg
@@ -0,0 +1,62 @@
+
+
+
+
diff --git a/src/img/symbols/MOC/WM.svg b/src/img/symbols/MOC/WM.svg
new file mode 100644
index 00000000..db209260
--- /dev/null
+++ b/src/img/symbols/MOC/WM.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/80.svg b/src/img/symbols/MOM/80.svg
new file mode 100644
index 00000000..0fba49a1
--- /dev/null
+++ b/src/img/symbols/MOM/80.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/C.svg b/src/img/symbols/MOM/C.svg
new file mode 100644
index 00000000..1493fbd0
--- /dev/null
+++ b/src/img/symbols/MOM/C.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/M.svg b/src/img/symbols/MOM/M.svg
new file mode 100644
index 00000000..ba87b997
--- /dev/null
+++ b/src/img/symbols/MOM/M.svg
@@ -0,0 +1,65 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/R.svg b/src/img/symbols/MOM/R.svg
new file mode 100644
index 00000000..1c189445
--- /dev/null
+++ b/src/img/symbols/MOM/R.svg
@@ -0,0 +1,63 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/T.svg b/src/img/symbols/MOM/T.svg
new file mode 100644
index 00000000..15996337
--- /dev/null
+++ b/src/img/symbols/MOM/T.svg
@@ -0,0 +1,67 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/U.svg b/src/img/symbols/MOM/U.svg
new file mode 100644
index 00000000..fe89fde6
--- /dev/null
+++ b/src/img/symbols/MOM/U.svg
@@ -0,0 +1,63 @@
+
+
+
+
diff --git a/src/img/symbols/MOM/WM.svg b/src/img/symbols/MOM/WM.svg
new file mode 100644
index 00000000..da4e809a
--- /dev/null
+++ b/src/img/symbols/MOM/WM.svg
@@ -0,0 +1,31 @@
+
+
+
+
diff --git a/src/img/symbols/MOR/80.svg b/src/img/symbols/MOR/80.svg
new file mode 100644
index 00000000..10d0f416
--- /dev/null
+++ b/src/img/symbols/MOR/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MOR/C.svg b/src/img/symbols/MOR/C.svg
new file mode 100644
index 00000000..17444af0
--- /dev/null
+++ b/src/img/symbols/MOR/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MOR/M.svg b/src/img/symbols/MOR/M.svg
new file mode 100644
index 00000000..c7bb3ed2
--- /dev/null
+++ b/src/img/symbols/MOR/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MOR/R.svg b/src/img/symbols/MOR/R.svg
new file mode 100644
index 00000000..653c1822
--- /dev/null
+++ b/src/img/symbols/MOR/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MOR/T.svg b/src/img/symbols/MOR/T.svg
new file mode 100644
index 00000000..8c3af7cf
--- /dev/null
+++ b/src/img/symbols/MOR/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MOR/U.svg b/src/img/symbols/MOR/U.svg
new file mode 100644
index 00000000..5282ef98
--- /dev/null
+++ b/src/img/symbols/MOR/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MOR/WM.svg b/src/img/symbols/MOR/WM.svg
new file mode 100644
index 00000000..f5e0e6e7
--- /dev/null
+++ b/src/img/symbols/MOR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MP2/80.svg b/src/img/symbols/MP2/80.svg
new file mode 100644
index 00000000..aeb9fdee
--- /dev/null
+++ b/src/img/symbols/MP2/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/MP2/C.svg b/src/img/symbols/MP2/C.svg
new file mode 100644
index 00000000..cc07d67f
--- /dev/null
+++ b/src/img/symbols/MP2/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/MP2/M.svg b/src/img/symbols/MP2/M.svg
new file mode 100644
index 00000000..dd7f338c
--- /dev/null
+++ b/src/img/symbols/MP2/M.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/MP2/R.svg b/src/img/symbols/MP2/R.svg
new file mode 100644
index 00000000..656e5087
--- /dev/null
+++ b/src/img/symbols/MP2/R.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/MP2/T.svg b/src/img/symbols/MP2/T.svg
new file mode 100644
index 00000000..19d10b79
--- /dev/null
+++ b/src/img/symbols/MP2/T.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/MP2/U.svg b/src/img/symbols/MP2/U.svg
new file mode 100644
index 00000000..bee1dc21
--- /dev/null
+++ b/src/img/symbols/MP2/U.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/MP2/WM.svg b/src/img/symbols/MP2/WM.svg
new file mode 100644
index 00000000..8ad197b9
--- /dev/null
+++ b/src/img/symbols/MP2/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MPS/80.svg b/src/img/symbols/MPS/80.svg
new file mode 100644
index 00000000..0242e9db
--- /dev/null
+++ b/src/img/symbols/MPS/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MPS/C.svg b/src/img/symbols/MPS/C.svg
new file mode 100644
index 00000000..aed95221
--- /dev/null
+++ b/src/img/symbols/MPS/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/MPS/M.svg b/src/img/symbols/MPS/M.svg
new file mode 100644
index 00000000..c0adce01
--- /dev/null
+++ b/src/img/symbols/MPS/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MPS/R.svg b/src/img/symbols/MPS/R.svg
new file mode 100644
index 00000000..b8773470
--- /dev/null
+++ b/src/img/symbols/MPS/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MPS/T.svg b/src/img/symbols/MPS/T.svg
new file mode 100644
index 00000000..766d412a
--- /dev/null
+++ b/src/img/symbols/MPS/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MPS/U.svg b/src/img/symbols/MPS/U.svg
new file mode 100644
index 00000000..20620d12
--- /dev/null
+++ b/src/img/symbols/MPS/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MPS/WM.svg b/src/img/symbols/MPS/WM.svg
new file mode 100644
index 00000000..4f47e55a
--- /dev/null
+++ b/src/img/symbols/MPS/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/MRD/80.svg b/src/img/symbols/MRD/80.svg
new file mode 100644
index 00000000..261dee9b
--- /dev/null
+++ b/src/img/symbols/MRD/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MRD/C.svg b/src/img/symbols/MRD/C.svg
new file mode 100644
index 00000000..281769f0
--- /dev/null
+++ b/src/img/symbols/MRD/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/MRD/M.svg b/src/img/symbols/MRD/M.svg
new file mode 100644
index 00000000..316f1915
--- /dev/null
+++ b/src/img/symbols/MRD/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MRD/R.svg b/src/img/symbols/MRD/R.svg
new file mode 100644
index 00000000..bd31dc22
--- /dev/null
+++ b/src/img/symbols/MRD/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MRD/T.svg b/src/img/symbols/MRD/T.svg
new file mode 100644
index 00000000..cd1a5703
--- /dev/null
+++ b/src/img/symbols/MRD/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MRD/U.svg b/src/img/symbols/MRD/U.svg
new file mode 100644
index 00000000..4793ef0e
--- /dev/null
+++ b/src/img/symbols/MRD/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/MRD/WM.svg b/src/img/symbols/MRD/WM.svg
new file mode 100644
index 00000000..2be8e68a
--- /dev/null
+++ b/src/img/symbols/MRD/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/MUL/80.svg b/src/img/symbols/MUL/80.svg
new file mode 100644
index 00000000..9e8ee89a
--- /dev/null
+++ b/src/img/symbols/MUL/80.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/MUL/C.svg b/src/img/symbols/MUL/C.svg
new file mode 100644
index 00000000..263f7844
--- /dev/null
+++ b/src/img/symbols/MUL/C.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/MUL/M.svg b/src/img/symbols/MUL/M.svg
new file mode 100644
index 00000000..dee189d0
--- /dev/null
+++ b/src/img/symbols/MUL/M.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/MUL/R.svg b/src/img/symbols/MUL/R.svg
new file mode 100644
index 00000000..147c2a32
--- /dev/null
+++ b/src/img/symbols/MUL/R.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/MUL/T.svg b/src/img/symbols/MUL/T.svg
new file mode 100644
index 00000000..cbcbb153
--- /dev/null
+++ b/src/img/symbols/MUL/T.svg
@@ -0,0 +1,59 @@
+
+
+
+
diff --git a/src/img/symbols/MUL/U.svg b/src/img/symbols/MUL/U.svg
new file mode 100644
index 00000000..5378b956
--- /dev/null
+++ b/src/img/symbols/MUL/U.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/MUL/WM.svg b/src/img/symbols/MUL/WM.svg
new file mode 100644
index 00000000..b1c53e0a
--- /dev/null
+++ b/src/img/symbols/MUL/WM.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/src/img/symbols/Media Insert/80.svg b/src/img/symbols/Media Insert/80.svg
new file mode 100644
index 00000000..e139fda8
--- /dev/null
+++ b/src/img/symbols/Media Insert/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/Media Insert/C.svg b/src/img/symbols/Media Insert/C.svg
new file mode 100644
index 00000000..552577c1
--- /dev/null
+++ b/src/img/symbols/Media Insert/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/Media Insert/M.svg b/src/img/symbols/Media Insert/M.svg
new file mode 100644
index 00000000..b38cf9dd
--- /dev/null
+++ b/src/img/symbols/Media Insert/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/Media Insert/R.svg b/src/img/symbols/Media Insert/R.svg
new file mode 100644
index 00000000..5656a654
--- /dev/null
+++ b/src/img/symbols/Media Insert/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/Media Insert/S.svg b/src/img/symbols/Media Insert/S.svg
new file mode 100644
index 00000000..fdfb218a
--- /dev/null
+++ b/src/img/symbols/Media Insert/S.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/Media Insert/T.svg b/src/img/symbols/Media Insert/T.svg
new file mode 100644
index 00000000..80ac0501
--- /dev/null
+++ b/src/img/symbols/Media Insert/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/Media Insert/U.svg b/src/img/symbols/Media Insert/U.svg
new file mode 100644
index 00000000..80234bf9
--- /dev/null
+++ b/src/img/symbols/Media Insert/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/Media Insert/WM.svg b/src/img/symbols/Media Insert/WM.svg
new file mode 100644
index 00000000..aa7d28d5
--- /dev/null
+++ b/src/img/symbols/Media Insert/WM.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/NCC/80.svg b/src/img/symbols/NCC/80.svg
new file mode 100644
index 00000000..eaa4de5e
--- /dev/null
+++ b/src/img/symbols/NCC/80.svg
@@ -0,0 +1,52 @@
+
+
+
+
diff --git a/src/img/symbols/NCC/C.svg b/src/img/symbols/NCC/C.svg
new file mode 100644
index 00000000..263d3145
--- /dev/null
+++ b/src/img/symbols/NCC/C.svg
@@ -0,0 +1,52 @@
+
+
+
+
diff --git a/src/img/symbols/NCC/M.svg b/src/img/symbols/NCC/M.svg
new file mode 100644
index 00000000..4a8cdfa2
--- /dev/null
+++ b/src/img/symbols/NCC/M.svg
@@ -0,0 +1,134 @@
+
+
+
+
diff --git a/src/img/symbols/NCC/R.svg b/src/img/symbols/NCC/R.svg
new file mode 100644
index 00000000..2ca9c0a7
--- /dev/null
+++ b/src/img/symbols/NCC/R.svg
@@ -0,0 +1,126 @@
+
+
+
+
diff --git a/src/img/symbols/NCC/T.svg b/src/img/symbols/NCC/T.svg
new file mode 100644
index 00000000..4dda1e00
--- /dev/null
+++ b/src/img/symbols/NCC/T.svg
@@ -0,0 +1,131 @@
+
+
+
+
diff --git a/src/img/symbols/NCC/U.svg b/src/img/symbols/NCC/U.svg
new file mode 100644
index 00000000..def7aeb4
--- /dev/null
+++ b/src/img/symbols/NCC/U.svg
@@ -0,0 +1,134 @@
+
+
+
+
diff --git a/src/img/symbols/NCC/WM.svg b/src/img/symbols/NCC/WM.svg
new file mode 100644
index 00000000..fd26dfc6
--- /dev/null
+++ b/src/img/symbols/NCC/WM.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/NEC/80.svg b/src/img/symbols/NEC/80.svg
new file mode 100644
index 00000000..8f4e728c
--- /dev/null
+++ b/src/img/symbols/NEC/80.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/NEC/C.svg b/src/img/symbols/NEC/C.svg
new file mode 100644
index 00000000..ee9b931d
--- /dev/null
+++ b/src/img/symbols/NEC/C.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/NEC/M.svg b/src/img/symbols/NEC/M.svg
new file mode 100644
index 00000000..e5895b6e
--- /dev/null
+++ b/src/img/symbols/NEC/M.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/NEC/R.svg b/src/img/symbols/NEC/R.svg
new file mode 100644
index 00000000..c5649a40
--- /dev/null
+++ b/src/img/symbols/NEC/R.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/NEC/T.SVG b/src/img/symbols/NEC/T.SVG
new file mode 100644
index 00000000..0f498173
--- /dev/null
+++ b/src/img/symbols/NEC/T.SVG
@@ -0,0 +1,134 @@
+
+
diff --git a/src/img/symbols/NEC/U.svg b/src/img/symbols/NEC/U.svg
new file mode 100644
index 00000000..492e28a1
--- /dev/null
+++ b/src/img/symbols/NEC/U.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/NEC/WM.svg b/src/img/symbols/NEC/WM.svg
new file mode 100644
index 00000000..e07f8614
--- /dev/null
+++ b/src/img/symbols/NEC/WM.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/NEM/80.svg b/src/img/symbols/NEM/80.svg
new file mode 100644
index 00000000..835fc949
--- /dev/null
+++ b/src/img/symbols/NEM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/NEM/C.svg b/src/img/symbols/NEM/C.svg
new file mode 100644
index 00000000..07e5178d
--- /dev/null
+++ b/src/img/symbols/NEM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/NEM/M.svg b/src/img/symbols/NEM/M.svg
new file mode 100644
index 00000000..f5f5c5c2
--- /dev/null
+++ b/src/img/symbols/NEM/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/NEM/R.svg b/src/img/symbols/NEM/R.svg
new file mode 100644
index 00000000..e3b7818b
--- /dev/null
+++ b/src/img/symbols/NEM/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/NEM/T.svg b/src/img/symbols/NEM/T.svg
new file mode 100644
index 00000000..18e85df2
--- /dev/null
+++ b/src/img/symbols/NEM/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/NEM/U.svg b/src/img/symbols/NEM/U.svg
new file mode 100644
index 00000000..99638960
--- /dev/null
+++ b/src/img/symbols/NEM/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/NEM/WM.svg b/src/img/symbols/NEM/WM.svg
new file mode 100644
index 00000000..31c44e00
--- /dev/null
+++ b/src/img/symbols/NEM/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/NEM/Watermark - M25.svg b/src/img/symbols/NEM/Watermark - M25.svg
new file mode 100644
index 00000000..2c76f41c
--- /dev/null
+++ b/src/img/symbols/NEM/Watermark - M25.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/NEO/C.svg b/src/img/symbols/NEO/C.svg
new file mode 100644
index 00000000..8b6f4834
--- /dev/null
+++ b/src/img/symbols/NEO/C.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/NEO/M.svg b/src/img/symbols/NEO/M.svg
new file mode 100644
index 00000000..1169ccfb
--- /dev/null
+++ b/src/img/symbols/NEO/M.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/NEO/R.svg b/src/img/symbols/NEO/R.svg
new file mode 100644
index 00000000..c394659b
--- /dev/null
+++ b/src/img/symbols/NEO/R.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/NEO/U.svg b/src/img/symbols/NEO/U.svg
new file mode 100644
index 00000000..e4815dc6
--- /dev/null
+++ b/src/img/symbols/NEO/U.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/src/img/symbols/NPH/80.svg b/src/img/symbols/NPH/80.svg
new file mode 100644
index 00000000..b23e1dcb
--- /dev/null
+++ b/src/img/symbols/NPH/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/NPH/C.svg b/src/img/symbols/NPH/C.svg
new file mode 100644
index 00000000..6d883446
--- /dev/null
+++ b/src/img/symbols/NPH/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/NPH/M.svg b/src/img/symbols/NPH/M.svg
new file mode 100644
index 00000000..d88ecdfc
--- /dev/null
+++ b/src/img/symbols/NPH/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/NPH/R.svg b/src/img/symbols/NPH/R.svg
new file mode 100644
index 00000000..bcfa3a26
--- /dev/null
+++ b/src/img/symbols/NPH/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/NPH/T.svg b/src/img/symbols/NPH/T.svg
new file mode 100644
index 00000000..7314d971
--- /dev/null
+++ b/src/img/symbols/NPH/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/NPH/U.svg b/src/img/symbols/NPH/U.svg
new file mode 100644
index 00000000..4ff8c0d4
--- /dev/null
+++ b/src/img/symbols/NPH/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/NPH/WM.svg b/src/img/symbols/NPH/WM.svg
new file mode 100644
index 00000000..ba9b1d0e
--- /dev/null
+++ b/src/img/symbols/NPH/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/ODY/80.svg b/src/img/symbols/ODY/80.svg
new file mode 100644
index 00000000..4bd87993
--- /dev/null
+++ b/src/img/symbols/ODY/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ODY/C.svg b/src/img/symbols/ODY/C.svg
new file mode 100644
index 00000000..dab2c93e
--- /dev/null
+++ b/src/img/symbols/ODY/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ODY/M.svg b/src/img/symbols/ODY/M.svg
new file mode 100644
index 00000000..f0d30b05
--- /dev/null
+++ b/src/img/symbols/ODY/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ODY/R.svg b/src/img/symbols/ODY/R.svg
new file mode 100644
index 00000000..72ff2635
--- /dev/null
+++ b/src/img/symbols/ODY/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ODY/T.svg b/src/img/symbols/ODY/T.svg
new file mode 100644
index 00000000..1aefbf41
--- /dev/null
+++ b/src/img/symbols/ODY/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ODY/U.svg b/src/img/symbols/ODY/U.svg
new file mode 100644
index 00000000..c98ca378
--- /dev/null
+++ b/src/img/symbols/ODY/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ODY/WM.svg b/src/img/symbols/ODY/WM.svg
new file mode 100644
index 00000000..7d04d8a8
--- /dev/null
+++ b/src/img/symbols/ODY/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/OGW/80.svg b/src/img/symbols/OGW/80.svg
new file mode 100644
index 00000000..6e436191
--- /dev/null
+++ b/src/img/symbols/OGW/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/OGW/C.svg b/src/img/symbols/OGW/C.svg
new file mode 100644
index 00000000..7fa2d031
--- /dev/null
+++ b/src/img/symbols/OGW/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/OGW/M.svg b/src/img/symbols/OGW/M.svg
new file mode 100644
index 00000000..a9af1174
--- /dev/null
+++ b/src/img/symbols/OGW/M.svg
@@ -0,0 +1,32 @@
+
+
diff --git a/src/img/symbols/OGW/R.svg b/src/img/symbols/OGW/R.svg
new file mode 100644
index 00000000..bd6217dc
--- /dev/null
+++ b/src/img/symbols/OGW/R.svg
@@ -0,0 +1,32 @@
+
+
diff --git a/src/img/symbols/OGW/T.svg b/src/img/symbols/OGW/T.svg
new file mode 100644
index 00000000..cc33e8db
--- /dev/null
+++ b/src/img/symbols/OGW/T.svg
@@ -0,0 +1,32 @@
+
+
diff --git a/src/img/symbols/OGW/U.svg b/src/img/symbols/OGW/U.svg
new file mode 100644
index 00000000..0fdd9202
--- /dev/null
+++ b/src/img/symbols/OGW/U.svg
@@ -0,0 +1,32 @@
+
+
diff --git a/src/img/symbols/OGW/WM.svg b/src/img/symbols/OGW/WM.svg
new file mode 100644
index 00000000..dc0f64b6
--- /dev/null
+++ b/src/img/symbols/OGW/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ONC/80.svg b/src/img/symbols/ONC/80.svg
new file mode 100644
index 00000000..aadbcbea
--- /dev/null
+++ b/src/img/symbols/ONC/80.svg
@@ -0,0 +1,33 @@
+
+
+
+
diff --git a/src/img/symbols/ONC/C.svg b/src/img/symbols/ONC/C.svg
new file mode 100644
index 00000000..80656481
--- /dev/null
+++ b/src/img/symbols/ONC/C.svg
@@ -0,0 +1,32 @@
+
+
+
+
diff --git a/src/img/symbols/ONC/M.svg b/src/img/symbols/ONC/M.svg
new file mode 100644
index 00000000..cdc2d1e6
--- /dev/null
+++ b/src/img/symbols/ONC/M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/ONC/R.svg b/src/img/symbols/ONC/R.svg
new file mode 100644
index 00000000..a406381a
--- /dev/null
+++ b/src/img/symbols/ONC/R.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/ONC/T.svg b/src/img/symbols/ONC/T.svg
new file mode 100644
index 00000000..3956b3b0
--- /dev/null
+++ b/src/img/symbols/ONC/T.svg
@@ -0,0 +1,53 @@
+
+
+
+
diff --git a/src/img/symbols/ONC/U.svg b/src/img/symbols/ONC/U.svg
new file mode 100644
index 00000000..432c6085
--- /dev/null
+++ b/src/img/symbols/ONC/U.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/ONC/WM.svg b/src/img/symbols/ONC/WM.svg
new file mode 100644
index 00000000..6553df6a
--- /dev/null
+++ b/src/img/symbols/ONC/WM.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/80.svg b/src/img/symbols/ONE/80.svg
new file mode 100644
index 00000000..0cd4326d
--- /dev/null
+++ b/src/img/symbols/ONE/80.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/C.svg b/src/img/symbols/ONE/C.svg
new file mode 100644
index 00000000..50028b80
--- /dev/null
+++ b/src/img/symbols/ONE/C.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/M.svg b/src/img/symbols/ONE/M.svg
new file mode 100644
index 00000000..244fc165
--- /dev/null
+++ b/src/img/symbols/ONE/M.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/R.svg b/src/img/symbols/ONE/R.svg
new file mode 100644
index 00000000..bfd4f4f4
--- /dev/null
+++ b/src/img/symbols/ONE/R.svg
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/T.svg b/src/img/symbols/ONE/T.svg
new file mode 100644
index 00000000..ac45ba9c
--- /dev/null
+++ b/src/img/symbols/ONE/T.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/U.svg b/src/img/symbols/ONE/U.svg
new file mode 100644
index 00000000..cbd9ed0f
--- /dev/null
+++ b/src/img/symbols/ONE/U.svg
@@ -0,0 +1,47 @@
+
+
+
+
diff --git a/src/img/symbols/ONE/WM.svg b/src/img/symbols/ONE/WM.svg
new file mode 100644
index 00000000..e65423da
--- /dev/null
+++ b/src/img/symbols/ONE/WM.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/src/img/symbols/ONS/80.svg b/src/img/symbols/ONS/80.svg
new file mode 100644
index 00000000..9dea1058
--- /dev/null
+++ b/src/img/symbols/ONS/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ONS/C.svg b/src/img/symbols/ONS/C.svg
new file mode 100644
index 00000000..0e0a96b3
--- /dev/null
+++ b/src/img/symbols/ONS/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ONS/M.svg b/src/img/symbols/ONS/M.svg
new file mode 100644
index 00000000..888ac82e
--- /dev/null
+++ b/src/img/symbols/ONS/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ONS/R.svg b/src/img/symbols/ONS/R.svg
new file mode 100644
index 00000000..6fa2025d
--- /dev/null
+++ b/src/img/symbols/ONS/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ONS/T.svg b/src/img/symbols/ONS/T.svg
new file mode 100644
index 00000000..57eb794e
--- /dev/null
+++ b/src/img/symbols/ONS/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ONS/U.svg b/src/img/symbols/ONS/U.svg
new file mode 100644
index 00000000..e1f54b5b
--- /dev/null
+++ b/src/img/symbols/ONS/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ONS/WM.svg b/src/img/symbols/ONS/WM.svg
new file mode 100644
index 00000000..8e6cf6c5
--- /dev/null
+++ b/src/img/symbols/ONS/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ORI/80.svg b/src/img/symbols/ORI/80.svg
new file mode 100644
index 00000000..26a489be
--- /dev/null
+++ b/src/img/symbols/ORI/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ORI/C.svg b/src/img/symbols/ORI/C.svg
new file mode 100644
index 00000000..ecfe4957
--- /dev/null
+++ b/src/img/symbols/ORI/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ORI/M.svg b/src/img/symbols/ORI/M.svg
new file mode 100644
index 00000000..4ef0772b
--- /dev/null
+++ b/src/img/symbols/ORI/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ORI/R.svg b/src/img/symbols/ORI/R.svg
new file mode 100644
index 00000000..963df376
--- /dev/null
+++ b/src/img/symbols/ORI/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ORI/S.svg b/src/img/symbols/ORI/S.svg
new file mode 100644
index 00000000..58938737
--- /dev/null
+++ b/src/img/symbols/ORI/S.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ORI/T.svg b/src/img/symbols/ORI/T.svg
new file mode 100644
index 00000000..7721e7b6
--- /dev/null
+++ b/src/img/symbols/ORI/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ORI/U.svg b/src/img/symbols/ORI/U.svg
new file mode 100644
index 00000000..8801f202
--- /dev/null
+++ b/src/img/symbols/ORI/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ORI/WM.svg b/src/img/symbols/ORI/WM.svg
new file mode 100644
index 00000000..b50b9c1d
--- /dev/null
+++ b/src/img/symbols/ORI/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/P02/80.svg b/src/img/symbols/P02/80.svg
new file mode 100644
index 00000000..d3afe0fe
--- /dev/null
+++ b/src/img/symbols/P02/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/P02/C.svg b/src/img/symbols/P02/C.svg
new file mode 100644
index 00000000..b3dc6589
--- /dev/null
+++ b/src/img/symbols/P02/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/P02/M.svg b/src/img/symbols/P02/M.svg
new file mode 100644
index 00000000..1987b215
--- /dev/null
+++ b/src/img/symbols/P02/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/P02/R.svg b/src/img/symbols/P02/R.svg
new file mode 100644
index 00000000..e78c6a32
--- /dev/null
+++ b/src/img/symbols/P02/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/P02/T.svg b/src/img/symbols/P02/T.svg
new file mode 100644
index 00000000..6ae27cde
--- /dev/null
+++ b/src/img/symbols/P02/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/P02/U.svg b/src/img/symbols/P02/U.svg
new file mode 100644
index 00000000..b5f6bcdf
--- /dev/null
+++ b/src/img/symbols/P02/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/P02/WM.svg b/src/img/symbols/P02/WM.svg
new file mode 100644
index 00000000..46451f7d
--- /dev/null
+++ b/src/img/symbols/P02/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/PC2/80.svg b/src/img/symbols/PC2/80.svg
new file mode 100644
index 00000000..6ca16e16
--- /dev/null
+++ b/src/img/symbols/PC2/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/PC2/C.svg b/src/img/symbols/PC2/C.svg
new file mode 100644
index 00000000..9e6faa28
--- /dev/null
+++ b/src/img/symbols/PC2/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/PC2/M.svg b/src/img/symbols/PC2/M.svg
new file mode 100644
index 00000000..768c61a0
--- /dev/null
+++ b/src/img/symbols/PC2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PC2/R.svg b/src/img/symbols/PC2/R.svg
new file mode 100644
index 00000000..e7e1fa7e
--- /dev/null
+++ b/src/img/symbols/PC2/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/PC2/T.svg b/src/img/symbols/PC2/T.svg
new file mode 100644
index 00000000..7e21b50c
--- /dev/null
+++ b/src/img/symbols/PC2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PC2/U.svg b/src/img/symbols/PC2/U.svg
new file mode 100644
index 00000000..6a9e16b8
--- /dev/null
+++ b/src/img/symbols/PC2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PC2/WM.svg b/src/img/symbols/PC2/WM.svg
new file mode 100644
index 00000000..77b3b10f
--- /dev/null
+++ b/src/img/symbols/PC2/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/PCA/80.svg b/src/img/symbols/PCA/80.svg
new file mode 100644
index 00000000..63667ed5
--- /dev/null
+++ b/src/img/symbols/PCA/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/PCA/C.svg b/src/img/symbols/PCA/C.svg
new file mode 100644
index 00000000..56232f78
--- /dev/null
+++ b/src/img/symbols/PCA/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/PCA/M.svg b/src/img/symbols/PCA/M.svg
new file mode 100644
index 00000000..066ed3f0
--- /dev/null
+++ b/src/img/symbols/PCA/M.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/PCA/R.svg b/src/img/symbols/PCA/R.svg
new file mode 100644
index 00000000..4d1bba8f
--- /dev/null
+++ b/src/img/symbols/PCA/R.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/PCA/T.svg b/src/img/symbols/PCA/T.svg
new file mode 100644
index 00000000..ed57fc96
--- /dev/null
+++ b/src/img/symbols/PCA/T.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/PCA/U.svg b/src/img/symbols/PCA/U.svg
new file mode 100644
index 00000000..e47c8f65
--- /dev/null
+++ b/src/img/symbols/PCA/U.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/PCA/WM.svg b/src/img/symbols/PCA/WM.svg
new file mode 100644
index 00000000..a2e1aede
--- /dev/null
+++ b/src/img/symbols/PCA/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PCEL/80.svg b/src/img/symbols/PCEL/80.svg
new file mode 100644
index 00000000..3111abf2
--- /dev/null
+++ b/src/img/symbols/PCEL/80.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/img/symbols/PCEL/C.svg b/src/img/symbols/PCEL/C.svg
new file mode 100644
index 00000000..7ecc85ac
--- /dev/null
+++ b/src/img/symbols/PCEL/C.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/img/symbols/PCEL/M.svg b/src/img/symbols/PCEL/M.svg
new file mode 100644
index 00000000..6ba5a8d6
--- /dev/null
+++ b/src/img/symbols/PCEL/M.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/PCEL/R.svg b/src/img/symbols/PCEL/R.svg
new file mode 100644
index 00000000..56447562
--- /dev/null
+++ b/src/img/symbols/PCEL/R.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/PCEL/T.svg b/src/img/symbols/PCEL/T.svg
new file mode 100644
index 00000000..672b4c8a
--- /dev/null
+++ b/src/img/symbols/PCEL/T.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/PCEL/U.svg b/src/img/symbols/PCEL/U.svg
new file mode 100644
index 00000000..275a27a2
--- /dev/null
+++ b/src/img/symbols/PCEL/U.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/PCEL/WM.svg b/src/img/symbols/PCEL/WM.svg
new file mode 100644
index 00000000..d0bd649b
--- /dev/null
+++ b/src/img/symbols/PCEL/WM.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/PCY/80.svg b/src/img/symbols/PCY/80.svg
new file mode 100644
index 00000000..dda3c819
--- /dev/null
+++ b/src/img/symbols/PCY/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PCY/C.svg b/src/img/symbols/PCY/C.svg
new file mode 100644
index 00000000..84d775dc
--- /dev/null
+++ b/src/img/symbols/PCY/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PCY/M.svg b/src/img/symbols/PCY/M.svg
new file mode 100644
index 00000000..efc41204
--- /dev/null
+++ b/src/img/symbols/PCY/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PCY/R.svg b/src/img/symbols/PCY/R.svg
new file mode 100644
index 00000000..189ed6b9
--- /dev/null
+++ b/src/img/symbols/PCY/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PCY/T.svg b/src/img/symbols/PCY/T.svg
new file mode 100644
index 00000000..149a2fa8
--- /dev/null
+++ b/src/img/symbols/PCY/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PCY/U.svg b/src/img/symbols/PCY/U.svg
new file mode 100644
index 00000000..ceee82d0
--- /dev/null
+++ b/src/img/symbols/PCY/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PCY/WM.svg b/src/img/symbols/PCY/WM.svg
new file mode 100644
index 00000000..52a418b3
--- /dev/null
+++ b/src/img/symbols/PCY/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/PD2/80.svg b/src/img/symbols/PD2/80.svg
new file mode 100644
index 00000000..b82ab3c6
--- /dev/null
+++ b/src/img/symbols/PD2/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PD2/C.svg b/src/img/symbols/PD2/C.svg
new file mode 100644
index 00000000..50739922
--- /dev/null
+++ b/src/img/symbols/PD2/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PD2/M.svg b/src/img/symbols/PD2/M.svg
new file mode 100644
index 00000000..118e7246
--- /dev/null
+++ b/src/img/symbols/PD2/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/PD2/R.svg b/src/img/symbols/PD2/R.svg
new file mode 100644
index 00000000..26b2f17d
--- /dev/null
+++ b/src/img/symbols/PD2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PD2/T.svg b/src/img/symbols/PD2/T.svg
new file mode 100644
index 00000000..ddd8a9b0
--- /dev/null
+++ b/src/img/symbols/PD2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PD2/U.svg b/src/img/symbols/PD2/U.svg
new file mode 100644
index 00000000..694d4658
--- /dev/null
+++ b/src/img/symbols/PD2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PD2/WM.svg b/src/img/symbols/PD2/WM.svg
new file mode 100644
index 00000000..18f86567
--- /dev/null
+++ b/src/img/symbols/PD2/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/PD3/80.svg b/src/img/symbols/PD3/80.svg
new file mode 100644
index 00000000..6aa8109c
--- /dev/null
+++ b/src/img/symbols/PD3/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/PD3/C.svg b/src/img/symbols/PD3/C.svg
new file mode 100644
index 00000000..239f8dd5
--- /dev/null
+++ b/src/img/symbols/PD3/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/PD3/M.svg b/src/img/symbols/PD3/M.svg
new file mode 100644
index 00000000..b44063c2
--- /dev/null
+++ b/src/img/symbols/PD3/M.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/PD3/R.svg b/src/img/symbols/PD3/R.svg
new file mode 100644
index 00000000..c22971f6
--- /dev/null
+++ b/src/img/symbols/PD3/R.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/PD3/T.svg b/src/img/symbols/PD3/T.svg
new file mode 100644
index 00000000..96f14eb9
--- /dev/null
+++ b/src/img/symbols/PD3/T.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/PD3/U.svg b/src/img/symbols/PD3/U.svg
new file mode 100644
index 00000000..bc7f90fc
--- /dev/null
+++ b/src/img/symbols/PD3/U.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/PD3/WM.svg b/src/img/symbols/PD3/WM.svg
new file mode 100644
index 00000000..3b20de9f
--- /dev/null
+++ b/src/img/symbols/PD3/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/PLC/80.svg b/src/img/symbols/PLC/80.svg
new file mode 100644
index 00000000..338f75e4
--- /dev/null
+++ b/src/img/symbols/PLC/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PLC/C.svg b/src/img/symbols/PLC/C.svg
new file mode 100644
index 00000000..d3add19c
--- /dev/null
+++ b/src/img/symbols/PLC/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PLC/M.svg b/src/img/symbols/PLC/M.svg
new file mode 100644
index 00000000..3ce58d9d
--- /dev/null
+++ b/src/img/symbols/PLC/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLC/R.svg b/src/img/symbols/PLC/R.svg
new file mode 100644
index 00000000..39ceac3c
--- /dev/null
+++ b/src/img/symbols/PLC/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLC/T.svg b/src/img/symbols/PLC/T.svg
new file mode 100644
index 00000000..60a22589
--- /dev/null
+++ b/src/img/symbols/PLC/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLC/U.svg b/src/img/symbols/PLC/U.svg
new file mode 100644
index 00000000..7178f897
--- /dev/null
+++ b/src/img/symbols/PLC/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLC/WM.svg b/src/img/symbols/PLC/WM.svg
new file mode 100644
index 00000000..e5349e5f
--- /dev/null
+++ b/src/img/symbols/PLC/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/PLS/80.svg b/src/img/symbols/PLS/80.svg
new file mode 100644
index 00000000..643468c7
--- /dev/null
+++ b/src/img/symbols/PLS/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PLS/C.svg b/src/img/symbols/PLS/C.svg
new file mode 100644
index 00000000..2aa35c76
--- /dev/null
+++ b/src/img/symbols/PLS/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PLS/M.svg b/src/img/symbols/PLS/M.svg
new file mode 100644
index 00000000..7dc26565
--- /dev/null
+++ b/src/img/symbols/PLS/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLS/R.svg b/src/img/symbols/PLS/R.svg
new file mode 100644
index 00000000..a1a5c3f7
--- /dev/null
+++ b/src/img/symbols/PLS/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLS/T.svg b/src/img/symbols/PLS/T.svg
new file mode 100644
index 00000000..e501acb4
--- /dev/null
+++ b/src/img/symbols/PLS/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLS/U.svg b/src/img/symbols/PLS/U.svg
new file mode 100644
index 00000000..53860ce9
--- /dev/null
+++ b/src/img/symbols/PLS/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PLS/WM.svg b/src/img/symbols/PLS/WM.svg
new file mode 100644
index 00000000..29a84671
--- /dev/null
+++ b/src/img/symbols/PLS/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/POR/80.svg b/src/img/symbols/POR/80.svg
new file mode 100644
index 00000000..3cd22106
--- /dev/null
+++ b/src/img/symbols/POR/80.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/POR/C.svg b/src/img/symbols/POR/C.svg
new file mode 100644
index 00000000..2ae0b6ff
--- /dev/null
+++ b/src/img/symbols/POR/C.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/POR/M.svg b/src/img/symbols/POR/M.svg
new file mode 100644
index 00000000..6a76d2c9
--- /dev/null
+++ b/src/img/symbols/POR/M.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/POR/R.svg b/src/img/symbols/POR/R.svg
new file mode 100644
index 00000000..b8c10587
--- /dev/null
+++ b/src/img/symbols/POR/R.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/POR/T.svg b/src/img/symbols/POR/T.svg
new file mode 100644
index 00000000..15e38643
--- /dev/null
+++ b/src/img/symbols/POR/T.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/POR/U.svg b/src/img/symbols/POR/U.svg
new file mode 100644
index 00000000..d286e106
--- /dev/null
+++ b/src/img/symbols/POR/U.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/POR_ALT1/80.svg b/src/img/symbols/POR_ALT1/80.svg
new file mode 100644
index 00000000..5b40cbef
--- /dev/null
+++ b/src/img/symbols/POR_ALT1/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/POR_ALT1/C.svg b/src/img/symbols/POR_ALT1/C.svg
new file mode 100644
index 00000000..dabadadc
--- /dev/null
+++ b/src/img/symbols/POR_ALT1/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/POR_ALT1/M.svg b/src/img/symbols/POR_ALT1/M.svg
new file mode 100644
index 00000000..1f288049
--- /dev/null
+++ b/src/img/symbols/POR_ALT1/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/POR_ALT1/R.svg b/src/img/symbols/POR_ALT1/R.svg
new file mode 100644
index 00000000..a40410b9
--- /dev/null
+++ b/src/img/symbols/POR_ALT1/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/POR_ALT1/T.svg b/src/img/symbols/POR_ALT1/T.svg
new file mode 100644
index 00000000..2e636283
--- /dev/null
+++ b/src/img/symbols/POR_ALT1/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/POR_ALT1/U.svg b/src/img/symbols/POR_ALT1/U.svg
new file mode 100644
index 00000000..a6cc04c3
--- /dev/null
+++ b/src/img/symbols/POR_ALT1/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/POR_ALT2/80.svg b/src/img/symbols/POR_ALT2/80.svg
new file mode 100644
index 00000000..5284050b
--- /dev/null
+++ b/src/img/symbols/POR_ALT2/80.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/POR_ALT2/C.svg b/src/img/symbols/POR_ALT2/C.svg
new file mode 100644
index 00000000..b034131f
--- /dev/null
+++ b/src/img/symbols/POR_ALT2/C.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/POR_ALT2/M.svg b/src/img/symbols/POR_ALT2/M.svg
new file mode 100644
index 00000000..c8037d03
--- /dev/null
+++ b/src/img/symbols/POR_ALT2/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/POR_ALT2/R.svg b/src/img/symbols/POR_ALT2/R.svg
new file mode 100644
index 00000000..564ca3c4
--- /dev/null
+++ b/src/img/symbols/POR_ALT2/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/POR_ALT2/T.svg b/src/img/symbols/POR_ALT2/T.svg
new file mode 100644
index 00000000..26c59e40
--- /dev/null
+++ b/src/img/symbols/POR_ALT2/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/POR_ALT2/U.svg b/src/img/symbols/POR_ALT2/U.svg
new file mode 100644
index 00000000..575356fb
--- /dev/null
+++ b/src/img/symbols/POR_ALT2/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/PRM/80.svg b/src/img/symbols/PRM/80.svg
new file mode 100644
index 00000000..01957cb4
--- /dev/null
+++ b/src/img/symbols/PRM/80.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/img/symbols/PRM/C.svg b/src/img/symbols/PRM/C.svg
new file mode 100644
index 00000000..e1a844e0
--- /dev/null
+++ b/src/img/symbols/PRM/C.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/img/symbols/PRM/M.svg b/src/img/symbols/PRM/M.svg
new file mode 100644
index 00000000..2f2eaecd
--- /dev/null
+++ b/src/img/symbols/PRM/M.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/img/symbols/PRM/R.svg b/src/img/symbols/PRM/R.svg
new file mode 100644
index 00000000..ee1cb521
--- /dev/null
+++ b/src/img/symbols/PRM/R.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/img/symbols/PRM/T.svg b/src/img/symbols/PRM/T.svg
new file mode 100644
index 00000000..e92a17df
--- /dev/null
+++ b/src/img/symbols/PRM/T.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/img/symbols/PRM/U.svg b/src/img/symbols/PRM/U.svg
new file mode 100644
index 00000000..dd174e84
--- /dev/null
+++ b/src/img/symbols/PRM/U.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/img/symbols/PS11/80.svg b/src/img/symbols/PS11/80.svg
new file mode 100644
index 00000000..204efc3f
--- /dev/null
+++ b/src/img/symbols/PS11/80.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/PS11/C.svg b/src/img/symbols/PS11/C.svg
new file mode 100644
index 00000000..0a561553
--- /dev/null
+++ b/src/img/symbols/PS11/C.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/PS11/M.svg b/src/img/symbols/PS11/M.svg
new file mode 100644
index 00000000..2df23626
--- /dev/null
+++ b/src/img/symbols/PS11/M.svg
@@ -0,0 +1,90 @@
+
+
diff --git a/src/img/symbols/PS11/R.svg b/src/img/symbols/PS11/R.svg
new file mode 100644
index 00000000..8e2d7f1d
--- /dev/null
+++ b/src/img/symbols/PS11/R.svg
@@ -0,0 +1,90 @@
+
+
diff --git a/src/img/symbols/PS11/T.svg b/src/img/symbols/PS11/T.svg
new file mode 100644
index 00000000..af4f712f
--- /dev/null
+++ b/src/img/symbols/PS11/T.svg
@@ -0,0 +1,93 @@
+
+
diff --git a/src/img/symbols/PS11/U.svg b/src/img/symbols/PS11/U.svg
new file mode 100644
index 00000000..6ad98531
--- /dev/null
+++ b/src/img/symbols/PS11/U.svg
@@ -0,0 +1,90 @@
+
+
diff --git a/src/img/symbols/PS11/WM.svg b/src/img/symbols/PS11/WM.svg
new file mode 100644
index 00000000..79865d68
--- /dev/null
+++ b/src/img/symbols/PS11/WM.svg
@@ -0,0 +1,80 @@
+
+
diff --git a/src/img/symbols/PSAL/80.svg b/src/img/symbols/PSAL/80.svg
new file mode 100644
index 00000000..fabad47e
--- /dev/null
+++ b/src/img/symbols/PSAL/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/PSAL/C.svg b/src/img/symbols/PSAL/C.svg
new file mode 100644
index 00000000..25915777
--- /dev/null
+++ b/src/img/symbols/PSAL/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/PSAL/M.svg b/src/img/symbols/PSAL/M.svg
new file mode 100644
index 00000000..ce5ecb54
--- /dev/null
+++ b/src/img/symbols/PSAL/M.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/PSAL/R.svg b/src/img/symbols/PSAL/R.svg
new file mode 100644
index 00000000..10a64cab
--- /dev/null
+++ b/src/img/symbols/PSAL/R.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/PSAL/T.svg b/src/img/symbols/PSAL/T.svg
new file mode 100644
index 00000000..56604587
--- /dev/null
+++ b/src/img/symbols/PSAL/T.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/src/img/symbols/PSAL/U.svg b/src/img/symbols/PSAL/U.svg
new file mode 100644
index 00000000..588489a3
--- /dev/null
+++ b/src/img/symbols/PSAL/U.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/PSAL/WM.svg b/src/img/symbols/PSAL/WM.svg
new file mode 100644
index 00000000..58a3d2df
--- /dev/null
+++ b/src/img/symbols/PSAL/WM.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/img/symbols/PTK/80.svg b/src/img/symbols/PTK/80.svg
new file mode 100644
index 00000000..6f84168f
--- /dev/null
+++ b/src/img/symbols/PTK/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PTK/C.svg b/src/img/symbols/PTK/C.svg
new file mode 100644
index 00000000..8bc70486
--- /dev/null
+++ b/src/img/symbols/PTK/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PTK/M.svg b/src/img/symbols/PTK/M.svg
new file mode 100644
index 00000000..c0acfa7c
--- /dev/null
+++ b/src/img/symbols/PTK/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PTK/R.svg b/src/img/symbols/PTK/R.svg
new file mode 100644
index 00000000..8fcc4820
--- /dev/null
+++ b/src/img/symbols/PTK/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PTK/T.svg b/src/img/symbols/PTK/T.svg
new file mode 100644
index 00000000..0fe8c629
--- /dev/null
+++ b/src/img/symbols/PTK/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PTK/U.svg b/src/img/symbols/PTK/U.svg
new file mode 100644
index 00000000..4dd74347
--- /dev/null
+++ b/src/img/symbols/PTK/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/PTK/Watermark - M25.svg b/src/img/symbols/PTK/Watermark - M25.svg
new file mode 100644
index 00000000..e1d33fe6
--- /dev/null
+++ b/src/img/symbols/PTK/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/PZ1/80.svg b/src/img/symbols/PZ1/80.svg
new file mode 100644
index 00000000..ee146339
--- /dev/null
+++ b/src/img/symbols/PZ1/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PZ1/C.svg b/src/img/symbols/PZ1/C.svg
new file mode 100644
index 00000000..46a491f3
--- /dev/null
+++ b/src/img/symbols/PZ1/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PZ1/M.svg b/src/img/symbols/PZ1/M.svg
new file mode 100644
index 00000000..55228b8a
--- /dev/null
+++ b/src/img/symbols/PZ1/M.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/PZ1/R.svg b/src/img/symbols/PZ1/R.svg
new file mode 100644
index 00000000..3fb66a9f
--- /dev/null
+++ b/src/img/symbols/PZ1/R.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/PZ1/T.svg b/src/img/symbols/PZ1/T.svg
new file mode 100644
index 00000000..b27b06c6
--- /dev/null
+++ b/src/img/symbols/PZ1/T.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/PZ1/U.svg b/src/img/symbols/PZ1/U.svg
new file mode 100644
index 00000000..6a992f83
--- /dev/null
+++ b/src/img/symbols/PZ1/U.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/PZ1/WM.svg b/src/img/symbols/PZ1/WM.svg
new file mode 100644
index 00000000..3111498b
--- /dev/null
+++ b/src/img/symbols/PZ1/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/PZ2/C.svg b/src/img/symbols/PZ2/C.svg
new file mode 100644
index 00000000..5862559e
--- /dev/null
+++ b/src/img/symbols/PZ2/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/PZ2/WM.svg b/src/img/symbols/PZ2/WM.svg
new file mode 100644
index 00000000..572dc020
--- /dev/null
+++ b/src/img/symbols/PZ2/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/RAV/80.svg b/src/img/symbols/RAV/80.svg
new file mode 100644
index 00000000..c834c5c2
--- /dev/null
+++ b/src/img/symbols/RAV/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/RAV/C.svg b/src/img/symbols/RAV/C.svg
new file mode 100644
index 00000000..7eb98d1e
--- /dev/null
+++ b/src/img/symbols/RAV/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/RAV/M.svg b/src/img/symbols/RAV/M.svg
new file mode 100644
index 00000000..5309d6df
--- /dev/null
+++ b/src/img/symbols/RAV/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/RAV/R.svg b/src/img/symbols/RAV/R.svg
new file mode 100644
index 00000000..1df1d209
--- /dev/null
+++ b/src/img/symbols/RAV/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/RAV/T.svg b/src/img/symbols/RAV/T.svg
new file mode 100644
index 00000000..925befe6
--- /dev/null
+++ b/src/img/symbols/RAV/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/RAV/U.svg b/src/img/symbols/RAV/U.svg
new file mode 100644
index 00000000..92ada826
--- /dev/null
+++ b/src/img/symbols/RAV/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/RAV/WM.svg b/src/img/symbols/RAV/WM.svg
new file mode 100644
index 00000000..1332daa8
--- /dev/null
+++ b/src/img/symbols/RAV/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/RIX/80.svg b/src/img/symbols/RIX/80.svg
new file mode 100644
index 00000000..296a6c0c
--- /dev/null
+++ b/src/img/symbols/RIX/80.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/RIX/C.svg b/src/img/symbols/RIX/C.svg
new file mode 100644
index 00000000..f1fcb230
--- /dev/null
+++ b/src/img/symbols/RIX/C.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/RIX/M.svg b/src/img/symbols/RIX/M.svg
new file mode 100644
index 00000000..36e54293
--- /dev/null
+++ b/src/img/symbols/RIX/M.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/RIX/R.svg b/src/img/symbols/RIX/R.svg
new file mode 100644
index 00000000..23f0e388
--- /dev/null
+++ b/src/img/symbols/RIX/R.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/RIX/T.svg b/src/img/symbols/RIX/T.svg
new file mode 100644
index 00000000..fd686c11
--- /dev/null
+++ b/src/img/symbols/RIX/T.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/RIX/U.svg b/src/img/symbols/RIX/U.svg
new file mode 100644
index 00000000..4ba1986b
--- /dev/null
+++ b/src/img/symbols/RIX/U.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/RIX/WM.svg b/src/img/symbols/RIX/WM.svg
new file mode 100644
index 00000000..378a5a81
--- /dev/null
+++ b/src/img/symbols/RIX/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/RNA/80.svg b/src/img/symbols/RNA/80.svg
new file mode 100644
index 00000000..1c1a9335
--- /dev/null
+++ b/src/img/symbols/RNA/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/RNA/C.svg b/src/img/symbols/RNA/C.svg
new file mode 100644
index 00000000..0f0951bb
--- /dev/null
+++ b/src/img/symbols/RNA/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/RNA/M.svg b/src/img/symbols/RNA/M.svg
new file mode 100644
index 00000000..30329f3a
--- /dev/null
+++ b/src/img/symbols/RNA/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/RNA/R.svg b/src/img/symbols/RNA/R.svg
new file mode 100644
index 00000000..b3635416
--- /dev/null
+++ b/src/img/symbols/RNA/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/RNA/T.svg b/src/img/symbols/RNA/T.svg
new file mode 100644
index 00000000..7edd0c3b
--- /dev/null
+++ b/src/img/symbols/RNA/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/RNA/U.svg b/src/img/symbols/RNA/U.svg
new file mode 100644
index 00000000..f8421347
--- /dev/null
+++ b/src/img/symbols/RNA/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/RNA/WM.svg b/src/img/symbols/RNA/WM.svg
new file mode 100644
index 00000000..088bd8b1
--- /dev/null
+++ b/src/img/symbols/RNA/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ROE/80.svg b/src/img/symbols/ROE/80.svg
new file mode 100644
index 00000000..333979f2
--- /dev/null
+++ b/src/img/symbols/ROE/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ROE/C.svg b/src/img/symbols/ROE/C.svg
new file mode 100644
index 00000000..366a8023
--- /dev/null
+++ b/src/img/symbols/ROE/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ROE/M.svg b/src/img/symbols/ROE/M.svg
new file mode 100644
index 00000000..69df17a0
--- /dev/null
+++ b/src/img/symbols/ROE/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/ROE/R.svg b/src/img/symbols/ROE/R.svg
new file mode 100644
index 00000000..477b591d
--- /dev/null
+++ b/src/img/symbols/ROE/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ROE/T.svg b/src/img/symbols/ROE/T.svg
new file mode 100644
index 00000000..84f7c6c2
--- /dev/null
+++ b/src/img/symbols/ROE/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ROE/U.svg b/src/img/symbols/ROE/U.svg
new file mode 100644
index 00000000..3225cc4f
--- /dev/null
+++ b/src/img/symbols/ROE/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ROE/Watermark - M25.svg b/src/img/symbols/ROE/Watermark - M25.svg
new file mode 100644
index 00000000..52a03651
--- /dev/null
+++ b/src/img/symbols/ROE/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/RTR/80.svg b/src/img/symbols/RTR/80.svg
new file mode 100644
index 00000000..4baef767
--- /dev/null
+++ b/src/img/symbols/RTR/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/RTR/C.svg b/src/img/symbols/RTR/C.svg
new file mode 100644
index 00000000..c22a7af2
--- /dev/null
+++ b/src/img/symbols/RTR/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/RTR/M.svg b/src/img/symbols/RTR/M.svg
new file mode 100644
index 00000000..67fad3d2
--- /dev/null
+++ b/src/img/symbols/RTR/M.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/RTR/R.svg b/src/img/symbols/RTR/R.svg
new file mode 100644
index 00000000..523c8829
--- /dev/null
+++ b/src/img/symbols/RTR/R.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/RTR/T.svg b/src/img/symbols/RTR/T.svg
new file mode 100644
index 00000000..a855f933
--- /dev/null
+++ b/src/img/symbols/RTR/T.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/RTR/U.svg b/src/img/symbols/RTR/U.svg
new file mode 100644
index 00000000..ddc1fab1
--- /dev/null
+++ b/src/img/symbols/RTR/U.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/RTR/Watermark - M25.svg b/src/img/symbols/RTR/Watermark - M25.svg
new file mode 100644
index 00000000..e9d4783f
--- /dev/null
+++ b/src/img/symbols/RTR/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/S00/80.svg b/src/img/symbols/S00/80.svg
new file mode 100644
index 00000000..9c3144c4
--- /dev/null
+++ b/src/img/symbols/S00/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/S00/C.svg b/src/img/symbols/S00/C.svg
new file mode 100644
index 00000000..b444e86d
--- /dev/null
+++ b/src/img/symbols/S00/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/S00/M.svg b/src/img/symbols/S00/M.svg
new file mode 100644
index 00000000..b49fbe45
--- /dev/null
+++ b/src/img/symbols/S00/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/S00/R.svg b/src/img/symbols/S00/R.svg
new file mode 100644
index 00000000..985cec16
--- /dev/null
+++ b/src/img/symbols/S00/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/S00/T.svg b/src/img/symbols/S00/T.svg
new file mode 100644
index 00000000..b0c6a7de
--- /dev/null
+++ b/src/img/symbols/S00/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/S00/U.svg b/src/img/symbols/S00/U.svg
new file mode 100644
index 00000000..bf66c016
--- /dev/null
+++ b/src/img/symbols/S00/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/S00/WM.svg b/src/img/symbols/S00/WM.svg
new file mode 100644
index 00000000..8a6d0b45
--- /dev/null
+++ b/src/img/symbols/S00/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/S99/80.svg b/src/img/symbols/S99/80.svg
new file mode 100644
index 00000000..8ae14290
--- /dev/null
+++ b/src/img/symbols/S99/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/S99/C.svg b/src/img/symbols/S99/C.svg
new file mode 100644
index 00000000..c19f5949
--- /dev/null
+++ b/src/img/symbols/S99/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/S99/M.svg b/src/img/symbols/S99/M.svg
new file mode 100644
index 00000000..b4f57d29
--- /dev/null
+++ b/src/img/symbols/S99/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/S99/R.svg b/src/img/symbols/S99/R.svg
new file mode 100644
index 00000000..303727f6
--- /dev/null
+++ b/src/img/symbols/S99/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/S99/T.svg b/src/img/symbols/S99/T.svg
new file mode 100644
index 00000000..0a4b2f1a
--- /dev/null
+++ b/src/img/symbols/S99/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/S99/U.svg b/src/img/symbols/S99/U.svg
new file mode 100644
index 00000000..78c4bf59
--- /dev/null
+++ b/src/img/symbols/S99/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/S99/Watermark - M25.svg b/src/img/symbols/S99/Watermark - M25.svg
new file mode 100644
index 00000000..bcf95abe
--- /dev/null
+++ b/src/img/symbols/S99/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/SCD/80.svg b/src/img/symbols/SCD/80.svg
new file mode 100644
index 00000000..8d3f0b91
--- /dev/null
+++ b/src/img/symbols/SCD/80.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/src/img/symbols/SCD/C.svg b/src/img/symbols/SCD/C.svg
new file mode 100644
index 00000000..b5a12b73
--- /dev/null
+++ b/src/img/symbols/SCD/C.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/SCD/M.svg b/src/img/symbols/SCD/M.svg
new file mode 100644
index 00000000..ac28eab6
--- /dev/null
+++ b/src/img/symbols/SCD/M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/SCD/R.svg b/src/img/symbols/SCD/R.svg
new file mode 100644
index 00000000..b6e23ae1
--- /dev/null
+++ b/src/img/symbols/SCD/R.svg
@@ -0,0 +1,56 @@
+
+
+
+
diff --git a/src/img/symbols/SCD/T.svg b/src/img/symbols/SCD/T.svg
new file mode 100644
index 00000000..e5fb8cb4
--- /dev/null
+++ b/src/img/symbols/SCD/T.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/SCD/U.svg b/src/img/symbols/SCD/U.svg
new file mode 100644
index 00000000..62275733
--- /dev/null
+++ b/src/img/symbols/SCD/U.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/SCD/WM.svg b/src/img/symbols/SCD/WM.svg
new file mode 100644
index 00000000..354599c5
--- /dev/null
+++ b/src/img/symbols/SCD/WM.svg
@@ -0,0 +1,28 @@
+
+
+
+
diff --git a/src/img/symbols/SCG/80.svg b/src/img/symbols/SCG/80.svg
new file mode 100644
index 00000000..1e875afd
--- /dev/null
+++ b/src/img/symbols/SCG/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SCG/C.svg b/src/img/symbols/SCG/C.svg
new file mode 100644
index 00000000..ed6ed719
--- /dev/null
+++ b/src/img/symbols/SCG/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SCG/M.svg b/src/img/symbols/SCG/M.svg
new file mode 100644
index 00000000..f7d6fa1e
--- /dev/null
+++ b/src/img/symbols/SCG/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/SCG/R.svg b/src/img/symbols/SCG/R.svg
new file mode 100644
index 00000000..29dfe789
--- /dev/null
+++ b/src/img/symbols/SCG/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/SCG/T.svg b/src/img/symbols/SCG/T.svg
new file mode 100644
index 00000000..462c9570
--- /dev/null
+++ b/src/img/symbols/SCG/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/SCG/U.svg b/src/img/symbols/SCG/U.svg
new file mode 100644
index 00000000..8c0c5846
--- /dev/null
+++ b/src/img/symbols/SCG/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/SCG/WM.svg b/src/img/symbols/SCG/WM.svg
new file mode 100644
index 00000000..f11e5a4b
--- /dev/null
+++ b/src/img/symbols/SCG/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/SHM/80.svg b/src/img/symbols/SHM/80.svg
new file mode 100644
index 00000000..a41cc682
--- /dev/null
+++ b/src/img/symbols/SHM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SHM/C.svg b/src/img/symbols/SHM/C.svg
new file mode 100644
index 00000000..447a02db
--- /dev/null
+++ b/src/img/symbols/SHM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SHM/M.svg b/src/img/symbols/SHM/M.svg
new file mode 100644
index 00000000..0bdec9c9
--- /dev/null
+++ b/src/img/symbols/SHM/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SHM/R.svg b/src/img/symbols/SHM/R.svg
new file mode 100644
index 00000000..1a015fd8
--- /dev/null
+++ b/src/img/symbols/SHM/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SHM/T.svg b/src/img/symbols/SHM/T.svg
new file mode 100644
index 00000000..7699c959
--- /dev/null
+++ b/src/img/symbols/SHM/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SHM/U.svg b/src/img/symbols/SHM/U.svg
new file mode 100644
index 00000000..7944643e
--- /dev/null
+++ b/src/img/symbols/SHM/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SHM/Watermark - M25.svg b/src/img/symbols/SHM/Watermark - M25.svg
new file mode 100644
index 00000000..8bd4d701
--- /dev/null
+++ b/src/img/symbols/SHM/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/SLD/80.svg b/src/img/symbols/SLD/80.svg
new file mode 100644
index 00000000..e139fda8
--- /dev/null
+++ b/src/img/symbols/SLD/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/SLD/C.svg b/src/img/symbols/SLD/C.svg
new file mode 100644
index 00000000..552577c1
--- /dev/null
+++ b/src/img/symbols/SLD/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/SLD/M.svg b/src/img/symbols/SLD/M.svg
new file mode 100644
index 00000000..b38cf9dd
--- /dev/null
+++ b/src/img/symbols/SLD/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SLD/R.svg b/src/img/symbols/SLD/R.svg
new file mode 100644
index 00000000..5656a654
--- /dev/null
+++ b/src/img/symbols/SLD/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SLD/S.svg b/src/img/symbols/SLD/S.svg
new file mode 100644
index 00000000..fdfb218a
--- /dev/null
+++ b/src/img/symbols/SLD/S.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/SLD/T.svg b/src/img/symbols/SLD/T.svg
new file mode 100644
index 00000000..80ac0501
--- /dev/null
+++ b/src/img/symbols/SLD/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SLD/U.svg b/src/img/symbols/SLD/U.svg
new file mode 100644
index 00000000..80234bf9
--- /dev/null
+++ b/src/img/symbols/SLD/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SLD/WM.svg b/src/img/symbols/SLD/WM.svg
new file mode 100644
index 00000000..aa7d28d5
--- /dev/null
+++ b/src/img/symbols/SLD/WM.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/SNC/C.svg b/src/img/symbols/SNC/C.svg
new file mode 100644
index 00000000..c06adbd1
--- /dev/null
+++ b/src/img/symbols/SNC/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SNC/M.svg b/src/img/symbols/SNC/M.svg
new file mode 100644
index 00000000..44d92364
--- /dev/null
+++ b/src/img/symbols/SNC/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/SNC/R.svg b/src/img/symbols/SNC/R.svg
new file mode 100644
index 00000000..7c3c2f30
--- /dev/null
+++ b/src/img/symbols/SNC/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/SNC/U.svg b/src/img/symbols/SNC/U.svg
new file mode 100644
index 00000000..3d61087d
--- /dev/null
+++ b/src/img/symbols/SNC/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/SOI/80.svg b/src/img/symbols/SOI/80.svg
new file mode 100644
index 00000000..4167d9dd
--- /dev/null
+++ b/src/img/symbols/SOI/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/SOI/C.svg b/src/img/symbols/SOI/C.svg
new file mode 100644
index 00000000..f43eff56
--- /dev/null
+++ b/src/img/symbols/SOI/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/SOI/M.svg b/src/img/symbols/SOI/M.svg
new file mode 100644
index 00000000..7366b9d8
--- /dev/null
+++ b/src/img/symbols/SOI/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOI/R.svg b/src/img/symbols/SOI/R.svg
new file mode 100644
index 00000000..4210e259
--- /dev/null
+++ b/src/img/symbols/SOI/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOI/T.svg b/src/img/symbols/SOI/T.svg
new file mode 100644
index 00000000..eb8cf6ce
--- /dev/null
+++ b/src/img/symbols/SOI/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOI/U.svg b/src/img/symbols/SOI/U.svg
new file mode 100644
index 00000000..79be23d1
--- /dev/null
+++ b/src/img/symbols/SOI/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOI/WM.svg b/src/img/symbols/SOI/WM.svg
new file mode 100644
index 00000000..5e59122c
--- /dev/null
+++ b/src/img/symbols/SOI/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/SOK/80.svg b/src/img/symbols/SOK/80.svg
new file mode 100644
index 00000000..0bf714fd
--- /dev/null
+++ b/src/img/symbols/SOK/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SOK/C.svg b/src/img/symbols/SOK/C.svg
new file mode 100644
index 00000000..f555d769
--- /dev/null
+++ b/src/img/symbols/SOK/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SOK/M.svg b/src/img/symbols/SOK/M.svg
new file mode 100644
index 00000000..2b4fe239
--- /dev/null
+++ b/src/img/symbols/SOK/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/SOK/R.svg b/src/img/symbols/SOK/R.svg
new file mode 100644
index 00000000..1f38ef7f
--- /dev/null
+++ b/src/img/symbols/SOK/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/SOK/T.svg b/src/img/symbols/SOK/T.svg
new file mode 100644
index 00000000..ab7cf17f
--- /dev/null
+++ b/src/img/symbols/SOK/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/SOK/U.svg b/src/img/symbols/SOK/U.svg
new file mode 100644
index 00000000..c2176ca5
--- /dev/null
+++ b/src/img/symbols/SOK/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/SOK/WM.svg b/src/img/symbols/SOK/WM.svg
new file mode 100644
index 00000000..7f13ea7d
--- /dev/null
+++ b/src/img/symbols/SOK/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/SOM/80.svg b/src/img/symbols/SOM/80.svg
new file mode 100644
index 00000000..cc81d785
--- /dev/null
+++ b/src/img/symbols/SOM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SOM/C.svg b/src/img/symbols/SOM/C.svg
new file mode 100644
index 00000000..55455e95
--- /dev/null
+++ b/src/img/symbols/SOM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/SOM/M.svg b/src/img/symbols/SOM/M.svg
new file mode 100644
index 00000000..11a1d9b3
--- /dev/null
+++ b/src/img/symbols/SOM/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/SOM/R.svg b/src/img/symbols/SOM/R.svg
new file mode 100644
index 00000000..0c6ada18
--- /dev/null
+++ b/src/img/symbols/SOM/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOM/T.svg b/src/img/symbols/SOM/T.svg
new file mode 100644
index 00000000..e16fa6fa
--- /dev/null
+++ b/src/img/symbols/SOM/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOM/U.svg b/src/img/symbols/SOM/U.svg
new file mode 100644
index 00000000..c58cb1eb
--- /dev/null
+++ b/src/img/symbols/SOM/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/SOM/WM.svg b/src/img/symbols/SOM/WM.svg
new file mode 100644
index 00000000..6fe33208
--- /dev/null
+++ b/src/img/symbols/SOM/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/SS1/M.svg b/src/img/symbols/SS1/M.svg
new file mode 100644
index 00000000..2f2fbb8a
--- /dev/null
+++ b/src/img/symbols/SS1/M.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/SS1/R.svg b/src/img/symbols/SS1/R.svg
new file mode 100644
index 00000000..e7349902
--- /dev/null
+++ b/src/img/symbols/SS1/R.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/src/img/symbols/SS2/80.svg b/src/img/symbols/SS2/80.svg
new file mode 100644
index 00000000..b298f500
--- /dev/null
+++ b/src/img/symbols/SS2/80.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/SS2/C.svg b/src/img/symbols/SS2/C.svg
new file mode 100644
index 00000000..62160e18
--- /dev/null
+++ b/src/img/symbols/SS2/C.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/img/symbols/SS2/M.svg b/src/img/symbols/SS2/M.svg
new file mode 100644
index 00000000..12971faf
--- /dev/null
+++ b/src/img/symbols/SS2/M.svg
@@ -0,0 +1,89 @@
+
+
diff --git a/src/img/symbols/SS2/R.svg b/src/img/symbols/SS2/R.svg
new file mode 100644
index 00000000..07f383bc
--- /dev/null
+++ b/src/img/symbols/SS2/R.svg
@@ -0,0 +1,89 @@
+
+
diff --git a/src/img/symbols/SS2/T.svg b/src/img/symbols/SS2/T.svg
new file mode 100644
index 00000000..1c8f223c
--- /dev/null
+++ b/src/img/symbols/SS2/T.svg
@@ -0,0 +1,89 @@
+
+
diff --git a/src/img/symbols/SS2/U.svg b/src/img/symbols/SS2/U.svg
new file mode 100644
index 00000000..eb6ef226
--- /dev/null
+++ b/src/img/symbols/SS2/U.svg
@@ -0,0 +1,89 @@
+
+
diff --git a/src/img/symbols/SS2/WM.svg b/src/img/symbols/SS2/WM.svg
new file mode 100644
index 00000000..cc61bc80
--- /dev/null
+++ b/src/img/symbols/SS2/WM.svg
@@ -0,0 +1,38 @@
+
+
diff --git a/src/img/symbols/SS3/80.svg b/src/img/symbols/SS3/80.svg
new file mode 100644
index 00000000..3941fa8e
--- /dev/null
+++ b/src/img/symbols/SS3/80.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/SS3/C.svg b/src/img/symbols/SS3/C.svg
new file mode 100644
index 00000000..3081bfe0
--- /dev/null
+++ b/src/img/symbols/SS3/C.svg
@@ -0,0 +1,34 @@
+
+
diff --git a/src/img/symbols/SS3/R.svg b/src/img/symbols/SS3/R.svg
new file mode 100644
index 00000000..cfd6735f
--- /dev/null
+++ b/src/img/symbols/SS3/R.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/SS3/SS3.svg b/src/img/symbols/SS3/SS3.svg
new file mode 100644
index 00000000..6d0b5f03
--- /dev/null
+++ b/src/img/symbols/SS3/SS3.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/SS3/T.svg b/src/img/symbols/SS3/T.svg
new file mode 100644
index 00000000..71a850e8
--- /dev/null
+++ b/src/img/symbols/SS3/T.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/SS3/U.svg b/src/img/symbols/SS3/U.svg
new file mode 100644
index 00000000..2e727bf8
--- /dev/null
+++ b/src/img/symbols/SS3/U.svg
@@ -0,0 +1,87 @@
+
+
diff --git a/src/img/symbols/SS3/WM.svg b/src/img/symbols/SS3/WM.svg
new file mode 100644
index 00000000..7be6d45a
--- /dev/null
+++ b/src/img/symbols/SS3/WM.svg
@@ -0,0 +1,29 @@
+
+
diff --git a/src/img/symbols/STA/C.svg b/src/img/symbols/STA/C.svg
new file mode 100644
index 00000000..7fe913f4
--- /dev/null
+++ b/src/img/symbols/STA/C.svg
@@ -0,0 +1,67 @@
+
+
diff --git a/src/img/symbols/STA/M.svg b/src/img/symbols/STA/M.svg
new file mode 100644
index 00000000..1bbf0224
--- /dev/null
+++ b/src/img/symbols/STA/M.svg
@@ -0,0 +1,102 @@
+
+
diff --git a/src/img/symbols/STA/R.svg b/src/img/symbols/STA/R.svg
new file mode 100644
index 00000000..ae54148b
--- /dev/null
+++ b/src/img/symbols/STA/R.svg
@@ -0,0 +1,102 @@
+
+
diff --git a/src/img/symbols/STA/U.svg b/src/img/symbols/STA/U.svg
new file mode 100644
index 00000000..d905234e
--- /dev/null
+++ b/src/img/symbols/STA/U.svg
@@ -0,0 +1,102 @@
+
+
diff --git a/src/img/symbols/STH/80.svg b/src/img/symbols/STH/80.svg
new file mode 100644
index 00000000..b4d29d4c
--- /dev/null
+++ b/src/img/symbols/STH/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/STH/C.svg b/src/img/symbols/STH/C.svg
new file mode 100644
index 00000000..15ee1c86
--- /dev/null
+++ b/src/img/symbols/STH/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/STH/M.svg b/src/img/symbols/STH/M.svg
new file mode 100644
index 00000000..d13cc8b5
--- /dev/null
+++ b/src/img/symbols/STH/M.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/STH/R.svg b/src/img/symbols/STH/R.svg
new file mode 100644
index 00000000..719052dd
--- /dev/null
+++ b/src/img/symbols/STH/R.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/STH/T.svg b/src/img/symbols/STH/T.svg
new file mode 100644
index 00000000..4edab709
--- /dev/null
+++ b/src/img/symbols/STH/T.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/STH/U.svg b/src/img/symbols/STH/U.svg
new file mode 100644
index 00000000..2f9c42ef
--- /dev/null
+++ b/src/img/symbols/STH/U.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/STH/Watermark - M25.svg b/src/img/symbols/STH/Watermark - M25.svg
new file mode 100644
index 00000000..7f0f274a
--- /dev/null
+++ b/src/img/symbols/STH/Watermark - M25.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/STX/C.svg b/src/img/symbols/STX/C.svg
new file mode 100644
index 00000000..ae211e07
--- /dev/null
+++ b/src/img/symbols/STX/C.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/img/symbols/STX/M.svg b/src/img/symbols/STX/M.svg
new file mode 100644
index 00000000..6414e8ee
--- /dev/null
+++ b/src/img/symbols/STX/M.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/STX/R.svg b/src/img/symbols/STX/R.svg
new file mode 100644
index 00000000..4d2f9c9d
--- /dev/null
+++ b/src/img/symbols/STX/R.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/STX/U.svg b/src/img/symbols/STX/U.svg
new file mode 100644
index 00000000..9ee5b405
--- /dev/null
+++ b/src/img/symbols/STX/U.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/src/img/symbols/TD0/80.svg b/src/img/symbols/TD0/80.svg
new file mode 100644
index 00000000..433dd9f8
--- /dev/null
+++ b/src/img/symbols/TD0/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/TD0/C.svg b/src/img/symbols/TD0/C.svg
new file mode 100644
index 00000000..c72fa480
--- /dev/null
+++ b/src/img/symbols/TD0/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/TD0/M.svg b/src/img/symbols/TD0/M.svg
new file mode 100644
index 00000000..16461247
--- /dev/null
+++ b/src/img/symbols/TD0/M.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/TD0/R.svg b/src/img/symbols/TD0/R.svg
new file mode 100644
index 00000000..a8a90164
--- /dev/null
+++ b/src/img/symbols/TD0/R.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/TD0/T.svg b/src/img/symbols/TD0/T.svg
new file mode 100644
index 00000000..7a76c38a
--- /dev/null
+++ b/src/img/symbols/TD0/T.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/TD0/U.svg b/src/img/symbols/TD0/U.svg
new file mode 100644
index 00000000..d2d3f3a3
--- /dev/null
+++ b/src/img/symbols/TD0/U.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/src/img/symbols/TD0/WM.svg b/src/img/symbols/TD0/WM.svg
new file mode 100644
index 00000000..b40d7a5b
--- /dev/null
+++ b/src/img/symbols/TD0/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/TD2/80.svg b/src/img/symbols/TD2/80.svg
new file mode 100644
index 00000000..9ee75063
--- /dev/null
+++ b/src/img/symbols/TD2/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/TD2/C.svg b/src/img/symbols/TD2/C.svg
new file mode 100644
index 00000000..bc9c04ee
--- /dev/null
+++ b/src/img/symbols/TD2/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/TD2/M.svg b/src/img/symbols/TD2/M.svg
new file mode 100644
index 00000000..8f44588d
--- /dev/null
+++ b/src/img/symbols/TD2/M.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/TD2/R.svg b/src/img/symbols/TD2/R.svg
new file mode 100644
index 00000000..9c064837
--- /dev/null
+++ b/src/img/symbols/TD2/R.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/TD2/T.svg b/src/img/symbols/TD2/T.svg
new file mode 100644
index 00000000..32997c77
--- /dev/null
+++ b/src/img/symbols/TD2/T.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/TD2/U.svg b/src/img/symbols/TD2/U.svg
new file mode 100644
index 00000000..d491b79f
--- /dev/null
+++ b/src/img/symbols/TD2/U.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/TD2/WM.svg b/src/img/symbols/TD2/WM.svg
new file mode 100644
index 00000000..bc9c04ee
--- /dev/null
+++ b/src/img/symbols/TD2/WM.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/THB/80.svg b/src/img/symbols/THB/80.svg
new file mode 100644
index 00000000..48d0ec8e
--- /dev/null
+++ b/src/img/symbols/THB/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/THB/C.svg b/src/img/symbols/THB/C.svg
new file mode 100644
index 00000000..b855af6e
--- /dev/null
+++ b/src/img/symbols/THB/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/THB/M.svg b/src/img/symbols/THB/M.svg
new file mode 100644
index 00000000..c24339a1
--- /dev/null
+++ b/src/img/symbols/THB/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/THB/R.svg b/src/img/symbols/THB/R.svg
new file mode 100644
index 00000000..81f3d7e5
--- /dev/null
+++ b/src/img/symbols/THB/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/THB/T.svg b/src/img/symbols/THB/T.svg
new file mode 100644
index 00000000..2359006c
--- /dev/null
+++ b/src/img/symbols/THB/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/THB/U.svg b/src/img/symbols/THB/U.svg
new file mode 100644
index 00000000..48d54f89
--- /dev/null
+++ b/src/img/symbols/THB/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/THB/WM.svg b/src/img/symbols/THB/WM.svg
new file mode 100644
index 00000000..a94f0f70
--- /dev/null
+++ b/src/img/symbols/THB/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/THS/80.svg b/src/img/symbols/THS/80.svg
new file mode 100644
index 00000000..93e1ab72
--- /dev/null
+++ b/src/img/symbols/THS/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/THS/C.svg b/src/img/symbols/THS/C.svg
new file mode 100644
index 00000000..d9f4f19c
--- /dev/null
+++ b/src/img/symbols/THS/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/THS/M.svg b/src/img/symbols/THS/M.svg
new file mode 100644
index 00000000..addeaa45
--- /dev/null
+++ b/src/img/symbols/THS/M.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/THS/R.svg b/src/img/symbols/THS/R.svg
new file mode 100644
index 00000000..69277ecb
--- /dev/null
+++ b/src/img/symbols/THS/R.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/THS/T.svg b/src/img/symbols/THS/T.svg
new file mode 100644
index 00000000..06096dd5
--- /dev/null
+++ b/src/img/symbols/THS/T.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/src/img/symbols/THS/U.svg b/src/img/symbols/THS/U.svg
new file mode 100644
index 00000000..608bcd6a
--- /dev/null
+++ b/src/img/symbols/THS/U.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/THS/WM.svg b/src/img/symbols/THS/WM.svg
new file mode 100644
index 00000000..55f483a1
--- /dev/null
+++ b/src/img/symbols/THS/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/TMP/80.svg b/src/img/symbols/TMP/80.svg
new file mode 100644
index 00000000..fee83c01
--- /dev/null
+++ b/src/img/symbols/TMP/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/TMP/C.svg b/src/img/symbols/TMP/C.svg
new file mode 100644
index 00000000..e7101435
--- /dev/null
+++ b/src/img/symbols/TMP/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/TMP/M.svg b/src/img/symbols/TMP/M.svg
new file mode 100644
index 00000000..9c8eb0ed
--- /dev/null
+++ b/src/img/symbols/TMP/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/TMP/R.svg b/src/img/symbols/TMP/R.svg
new file mode 100644
index 00000000..66d8cda3
--- /dev/null
+++ b/src/img/symbols/TMP/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/TMP/T.svg b/src/img/symbols/TMP/T.svg
new file mode 100644
index 00000000..df38b4a0
--- /dev/null
+++ b/src/img/symbols/TMP/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/TMP/U.svg b/src/img/symbols/TMP/U.svg
new file mode 100644
index 00000000..35b54208
--- /dev/null
+++ b/src/img/symbols/TMP/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/TMP/Watermark - M25.svg b/src/img/symbols/TMP/Watermark - M25.svg
new file mode 100644
index 00000000..3bbb43a6
--- /dev/null
+++ b/src/img/symbols/TMP/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/TOR/80.svg b/src/img/symbols/TOR/80.svg
new file mode 100644
index 00000000..656eb5c0
--- /dev/null
+++ b/src/img/symbols/TOR/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/TOR/C.svg b/src/img/symbols/TOR/C.svg
new file mode 100644
index 00000000..a68f1079
--- /dev/null
+++ b/src/img/symbols/TOR/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/TOR/M.svg b/src/img/symbols/TOR/M.svg
new file mode 100644
index 00000000..a3c31495
--- /dev/null
+++ b/src/img/symbols/TOR/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TOR/R.svg b/src/img/symbols/TOR/R.svg
new file mode 100644
index 00000000..17342782
--- /dev/null
+++ b/src/img/symbols/TOR/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TOR/T.svg b/src/img/symbols/TOR/T.svg
new file mode 100644
index 00000000..0202c7d9
--- /dev/null
+++ b/src/img/symbols/TOR/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TOR/U.svg b/src/img/symbols/TOR/U.svg
new file mode 100644
index 00000000..1f804acb
--- /dev/null
+++ b/src/img/symbols/TOR/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TOR/WM.svg b/src/img/symbols/TOR/WM.svg
new file mode 100644
index 00000000..7d357c65
--- /dev/null
+++ b/src/img/symbols/TOR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/TPR/80.svg b/src/img/symbols/TPR/80.svg
new file mode 100644
index 00000000..2acbb729
--- /dev/null
+++ b/src/img/symbols/TPR/80.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TPR/C.svg b/src/img/symbols/TPR/C.svg
new file mode 100644
index 00000000..977fe7ac
--- /dev/null
+++ b/src/img/symbols/TPR/C.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TPR/M.svg b/src/img/symbols/TPR/M.svg
new file mode 100644
index 00000000..cdc7cc15
--- /dev/null
+++ b/src/img/symbols/TPR/M.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/TPR/R.svg b/src/img/symbols/TPR/R.svg
new file mode 100644
index 00000000..4abd7eef
--- /dev/null
+++ b/src/img/symbols/TPR/R.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/TPR/T.svg b/src/img/symbols/TPR/T.svg
new file mode 100644
index 00000000..a7b1dddf
--- /dev/null
+++ b/src/img/symbols/TPR/T.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/TPR/U.svg b/src/img/symbols/TPR/U.svg
new file mode 100644
index 00000000..b48ebf02
--- /dev/null
+++ b/src/img/symbols/TPR/U.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/src/img/symbols/TPR/WM.svg b/src/img/symbols/TPR/WM.svg
new file mode 100644
index 00000000..f0ac1581
--- /dev/null
+++ b/src/img/symbols/TPR/WM.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/TSP/80.svg b/src/img/symbols/TSP/80.svg
new file mode 100644
index 00000000..a5fc2cfb
--- /dev/null
+++ b/src/img/symbols/TSP/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/TSP/C.svg b/src/img/symbols/TSP/C.svg
new file mode 100644
index 00000000..3aea73e9
--- /dev/null
+++ b/src/img/symbols/TSP/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/TSP/M.svg b/src/img/symbols/TSP/M.svg
new file mode 100644
index 00000000..b79e6f27
--- /dev/null
+++ b/src/img/symbols/TSP/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TSP/R.svg b/src/img/symbols/TSP/R.svg
new file mode 100644
index 00000000..1c25719f
--- /dev/null
+++ b/src/img/symbols/TSP/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TSP/T.svg b/src/img/symbols/TSP/T.svg
new file mode 100644
index 00000000..4025380f
--- /dev/null
+++ b/src/img/symbols/TSP/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TSP/U.svg b/src/img/symbols/TSP/U.svg
new file mode 100644
index 00000000..e403a170
--- /dev/null
+++ b/src/img/symbols/TSP/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/TSP/WM.svg b/src/img/symbols/TSP/WM.svg
new file mode 100644
index 00000000..8c78f791
--- /dev/null
+++ b/src/img/symbols/TSP/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/TSR/80.svg b/src/img/symbols/TSR/80.svg
new file mode 100644
index 00000000..3d1eed3b
--- /dev/null
+++ b/src/img/symbols/TSR/80.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/TSR/C.svg b/src/img/symbols/TSR/C.svg
new file mode 100644
index 00000000..47c1a543
--- /dev/null
+++ b/src/img/symbols/TSR/C.svg
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/src/img/symbols/TSR/M.svg b/src/img/symbols/TSR/M.svg
new file mode 100644
index 00000000..be60c18b
--- /dev/null
+++ b/src/img/symbols/TSR/M.svg
@@ -0,0 +1,56 @@
+
+
+
+
diff --git a/src/img/symbols/TSR/R.svg b/src/img/symbols/TSR/R.svg
new file mode 100644
index 00000000..b64b11a3
--- /dev/null
+++ b/src/img/symbols/TSR/R.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/src/img/symbols/TSR/T.svg b/src/img/symbols/TSR/T.svg
new file mode 100644
index 00000000..5a0cff40
--- /dev/null
+++ b/src/img/symbols/TSR/T.svg
@@ -0,0 +1,56 @@
+
+
+
+
diff --git a/src/img/symbols/TSR/U.svg b/src/img/symbols/TSR/U.svg
new file mode 100644
index 00000000..26a80da8
--- /dev/null
+++ b/src/img/symbols/TSR/U.svg
@@ -0,0 +1,56 @@
+
+
+
+
diff --git a/src/img/symbols/TSR/WM.svg b/src/img/symbols/TSR/WM.svg
new file mode 100644
index 00000000..39054cbc
--- /dev/null
+++ b/src/img/symbols/TSR/WM.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/src/img/symbols/UDS/80.svg b/src/img/symbols/UDS/80.svg
new file mode 100644
index 00000000..6e91ae74
--- /dev/null
+++ b/src/img/symbols/UDS/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/UDS/C.svg b/src/img/symbols/UDS/C.svg
new file mode 100644
index 00000000..b596f2b3
--- /dev/null
+++ b/src/img/symbols/UDS/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/UDS/M.svg b/src/img/symbols/UDS/M.svg
new file mode 100644
index 00000000..543c3431
--- /dev/null
+++ b/src/img/symbols/UDS/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UDS/R.svg b/src/img/symbols/UDS/R.svg
new file mode 100644
index 00000000..e1733ab7
--- /dev/null
+++ b/src/img/symbols/UDS/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UDS/T.svg b/src/img/symbols/UDS/T.svg
new file mode 100644
index 00000000..9b753796
--- /dev/null
+++ b/src/img/symbols/UDS/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UDS/U.svg b/src/img/symbols/UDS/U.svg
new file mode 100644
index 00000000..e065efb2
--- /dev/null
+++ b/src/img/symbols/UDS/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UDS/WM.svg b/src/img/symbols/UDS/WM.svg
new file mode 100644
index 00000000..e5c45f9f
--- /dev/null
+++ b/src/img/symbols/UDS/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/UGL/80.svg b/src/img/symbols/UGL/80.svg
new file mode 100644
index 00000000..afbc0f3c
--- /dev/null
+++ b/src/img/symbols/UGL/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/UGL/C.svg b/src/img/symbols/UGL/C.svg
new file mode 100644
index 00000000..36a74f64
--- /dev/null
+++ b/src/img/symbols/UGL/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/UGL/M.svg b/src/img/symbols/UGL/M.svg
new file mode 100644
index 00000000..c6178942
--- /dev/null
+++ b/src/img/symbols/UGL/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UGL/R.svg b/src/img/symbols/UGL/R.svg
new file mode 100644
index 00000000..a7df3598
--- /dev/null
+++ b/src/img/symbols/UGL/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UGL/T.svg b/src/img/symbols/UGL/T.svg
new file mode 100644
index 00000000..905c11fe
--- /dev/null
+++ b/src/img/symbols/UGL/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UGL/U.svg b/src/img/symbols/UGL/U.svg
new file mode 100644
index 00000000..245ef637
--- /dev/null
+++ b/src/img/symbols/UGL/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UGL/WM.svg b/src/img/symbols/UGL/WM.svg
new file mode 100644
index 00000000..31559ca9
--- /dev/null
+++ b/src/img/symbols/UGL/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ULG/80.svg b/src/img/symbols/ULG/80.svg
new file mode 100644
index 00000000..3f58000f
--- /dev/null
+++ b/src/img/symbols/ULG/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ULG/C.svg b/src/img/symbols/ULG/C.svg
new file mode 100644
index 00000000..05226bd6
--- /dev/null
+++ b/src/img/symbols/ULG/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ULG/M.svg b/src/img/symbols/ULG/M.svg
new file mode 100644
index 00000000..bb5a35b9
--- /dev/null
+++ b/src/img/symbols/ULG/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ULG/R.svg b/src/img/symbols/ULG/R.svg
new file mode 100644
index 00000000..d18ca663
--- /dev/null
+++ b/src/img/symbols/ULG/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/ULG/T.svg b/src/img/symbols/ULG/T.svg
new file mode 100644
index 00000000..54043fe6
--- /dev/null
+++ b/src/img/symbols/ULG/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ULG/U.svg b/src/img/symbols/ULG/U.svg
new file mode 100644
index 00000000..cb71e493
--- /dev/null
+++ b/src/img/symbols/ULG/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/ULG/WM.svg b/src/img/symbols/ULG/WM.svg
new file mode 100644
index 00000000..240f72f7
--- /dev/null
+++ b/src/img/symbols/ULG/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/UMA/80.svg b/src/img/symbols/UMA/80.svg
new file mode 100644
index 00000000..8be7ba89
--- /dev/null
+++ b/src/img/symbols/UMA/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/UMA/C.svg b/src/img/symbols/UMA/C.svg
new file mode 100644
index 00000000..d9da95e8
--- /dev/null
+++ b/src/img/symbols/UMA/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/UMA/M.svg b/src/img/symbols/UMA/M.svg
new file mode 100644
index 00000000..3734fa56
--- /dev/null
+++ b/src/img/symbols/UMA/M.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/UMA/R.svg b/src/img/symbols/UMA/R.svg
new file mode 100644
index 00000000..8d80232d
--- /dev/null
+++ b/src/img/symbols/UMA/R.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/UMA/T.svg b/src/img/symbols/UMA/T.svg
new file mode 100644
index 00000000..63fb4ed9
--- /dev/null
+++ b/src/img/symbols/UMA/T.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/UMA/U.svg b/src/img/symbols/UMA/U.svg
new file mode 100644
index 00000000..8e59e4ca
--- /dev/null
+++ b/src/img/symbols/UMA/U.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/UMA/UMA_C.svg b/src/img/symbols/UMA/UMA_C.svg
new file mode 100644
index 00000000..13b95445
--- /dev/null
+++ b/src/img/symbols/UMA/UMA_C.svg
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/src/img/symbols/UMA/UMA_M.svg b/src/img/symbols/UMA/UMA_M.svg
new file mode 100644
index 00000000..3343cba9
--- /dev/null
+++ b/src/img/symbols/UMA/UMA_M.svg
@@ -0,0 +1,66 @@
+
+
+
+
diff --git a/src/img/symbols/UMA/UMA_R.svg b/src/img/symbols/UMA/UMA_R.svg
new file mode 100644
index 00000000..36d5ecef
--- /dev/null
+++ b/src/img/symbols/UMA/UMA_R.svg
@@ -0,0 +1,66 @@
+
+
+
+
diff --git a/src/img/symbols/UMA/UMA_U.svg b/src/img/symbols/UMA/UMA_U.svg
new file mode 100644
index 00000000..34098c4d
--- /dev/null
+++ b/src/img/symbols/UMA/UMA_U.svg
@@ -0,0 +1,66 @@
+
+
+
+
diff --git a/src/img/symbols/UMA/WM.svg b/src/img/symbols/UMA/WM.svg
new file mode 100644
index 00000000..d1484842
--- /dev/null
+++ b/src/img/symbols/UMA/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/UNF/80.svg b/src/img/symbols/UNF/80.svg
new file mode 100644
index 00000000..8e27e359
--- /dev/null
+++ b/src/img/symbols/UNF/80.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/UNF/C.svg b/src/img/symbols/UNF/C.svg
new file mode 100644
index 00000000..e3d49178
--- /dev/null
+++ b/src/img/symbols/UNF/C.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/UNF/M.svg b/src/img/symbols/UNF/M.svg
new file mode 100644
index 00000000..dfe65e95
--- /dev/null
+++ b/src/img/symbols/UNF/M.svg
@@ -0,0 +1,24 @@
+
+
diff --git a/src/img/symbols/UNF/R.svg b/src/img/symbols/UNF/R.svg
new file mode 100644
index 00000000..262cc624
--- /dev/null
+++ b/src/img/symbols/UNF/R.svg
@@ -0,0 +1,24 @@
+
+
diff --git a/src/img/symbols/UNF/T.svg b/src/img/symbols/UNF/T.svg
new file mode 100644
index 00000000..509416c7
--- /dev/null
+++ b/src/img/symbols/UNF/T.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/src/img/symbols/UNF/U.svg b/src/img/symbols/UNF/U.svg
new file mode 100644
index 00000000..f84cf58e
--- /dev/null
+++ b/src/img/symbols/UNF/U.svg
@@ -0,0 +1,24 @@
+
+
diff --git a/src/img/symbols/UNF/WM.svg b/src/img/symbols/UNF/WM.svg
new file mode 100644
index 00000000..02fefb51
--- /dev/null
+++ b/src/img/symbols/UNF/WM.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/UNH/80.svg b/src/img/symbols/UNH/80.svg
new file mode 100644
index 00000000..2b71f320
--- /dev/null
+++ b/src/img/symbols/UNH/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/UNH/C.svg b/src/img/symbols/UNH/C.svg
new file mode 100644
index 00000000..9f7feb90
--- /dev/null
+++ b/src/img/symbols/UNH/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/UNH/M.svg b/src/img/symbols/UNH/M.svg
new file mode 100644
index 00000000..ae5b6672
--- /dev/null
+++ b/src/img/symbols/UNH/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/UNH/R.svg b/src/img/symbols/UNH/R.svg
new file mode 100644
index 00000000..9711aa2c
--- /dev/null
+++ b/src/img/symbols/UNH/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/UNH/R_half.svg b/src/img/symbols/UNH/R_half.svg
new file mode 100644
index 00000000..504ba4a6
--- /dev/null
+++ b/src/img/symbols/UNH/R_half.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/UNH/T.svg b/src/img/symbols/UNH/T.svg
new file mode 100644
index 00000000..3eef1d43
--- /dev/null
+++ b/src/img/symbols/UNH/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/UNH/U.svg b/src/img/symbols/UNH/U.svg
new file mode 100644
index 00000000..d637ee9a
--- /dev/null
+++ b/src/img/symbols/UNH/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/UNH/WM.svg b/src/img/symbols/UNH/WM.svg
new file mode 100644
index 00000000..f83a2b8c
--- /dev/null
+++ b/src/img/symbols/UNH/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/USG/80.svg b/src/img/symbols/USG/80.svg
new file mode 100644
index 00000000..b3c2820b
--- /dev/null
+++ b/src/img/symbols/USG/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/USG/C.svg b/src/img/symbols/USG/C.svg
new file mode 100644
index 00000000..51f91b2c
--- /dev/null
+++ b/src/img/symbols/USG/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/USG/M.svg b/src/img/symbols/USG/M.svg
new file mode 100644
index 00000000..02c4ab98
--- /dev/null
+++ b/src/img/symbols/USG/M.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/USG/R.svg b/src/img/symbols/USG/R.svg
new file mode 100644
index 00000000..ddbe1428
--- /dev/null
+++ b/src/img/symbols/USG/R.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/USG/T.svg b/src/img/symbols/USG/T.svg
new file mode 100644
index 00000000..1e179476
--- /dev/null
+++ b/src/img/symbols/USG/T.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/USG/U.svg b/src/img/symbols/USG/U.svg
new file mode 100644
index 00000000..48921821
--- /dev/null
+++ b/src/img/symbols/USG/U.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/USG/WM.svg b/src/img/symbols/USG/WM.svg
new file mode 100644
index 00000000..cbc79c05
--- /dev/null
+++ b/src/img/symbols/USG/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/UST/80.svg b/src/img/symbols/UST/80.svg
new file mode 100644
index 00000000..d5390f20
--- /dev/null
+++ b/src/img/symbols/UST/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/UST/C.svg b/src/img/symbols/UST/C.svg
new file mode 100644
index 00000000..601b0a6e
--- /dev/null
+++ b/src/img/symbols/UST/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/UST/M.svg b/src/img/symbols/UST/M.svg
new file mode 100644
index 00000000..9f933c4d
--- /dev/null
+++ b/src/img/symbols/UST/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/UST/R.svg b/src/img/symbols/UST/R.svg
new file mode 100644
index 00000000..e5679fd4
--- /dev/null
+++ b/src/img/symbols/UST/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/UST/T.svg b/src/img/symbols/UST/T.svg
new file mode 100644
index 00000000..d7cf708b
--- /dev/null
+++ b/src/img/symbols/UST/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/UST/U.svg b/src/img/symbols/UST/U.svg
new file mode 100644
index 00000000..122e1092
--- /dev/null
+++ b/src/img/symbols/UST/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/UST/WM.svg b/src/img/symbols/UST/WM.svg
new file mode 100644
index 00000000..fc048bdd
--- /dev/null
+++ b/src/img/symbols/UST/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/V09/80.svg b/src/img/symbols/V09/80.svg
new file mode 100644
index 00000000..49e89bc4
--- /dev/null
+++ b/src/img/symbols/V09/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/V09/C.svg b/src/img/symbols/V09/C.svg
new file mode 100644
index 00000000..31af0bb3
--- /dev/null
+++ b/src/img/symbols/V09/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/V09/M.svg b/src/img/symbols/V09/M.svg
new file mode 100644
index 00000000..b25b5adc
--- /dev/null
+++ b/src/img/symbols/V09/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V09/R.svg b/src/img/symbols/V09/R.svg
new file mode 100644
index 00000000..189888c1
--- /dev/null
+++ b/src/img/symbols/V09/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/V09/T.svg b/src/img/symbols/V09/T.svg
new file mode 100644
index 00000000..36b52465
--- /dev/null
+++ b/src/img/symbols/V09/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/V09/U.svg b/src/img/symbols/V09/U.svg
new file mode 100644
index 00000000..e45c5007
--- /dev/null
+++ b/src/img/symbols/V09/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/V09/WM.svg b/src/img/symbols/V09/WM.svg
new file mode 100644
index 00000000..b06e1da2
--- /dev/null
+++ b/src/img/symbols/V09/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/V10/80.svg b/src/img/symbols/V10/80.svg
new file mode 100644
index 00000000..8ef4a621
--- /dev/null
+++ b/src/img/symbols/V10/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V10/C.svg b/src/img/symbols/V10/C.svg
new file mode 100644
index 00000000..822b9032
--- /dev/null
+++ b/src/img/symbols/V10/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V10/M.svg b/src/img/symbols/V10/M.svg
new file mode 100644
index 00000000..1b7569c3
--- /dev/null
+++ b/src/img/symbols/V10/M.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/src/img/symbols/V10/R.svg b/src/img/symbols/V10/R.svg
new file mode 100644
index 00000000..f12b2ca7
--- /dev/null
+++ b/src/img/symbols/V10/R.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/V10/T.svg b/src/img/symbols/V10/T.svg
new file mode 100644
index 00000000..2daf3df3
--- /dev/null
+++ b/src/img/symbols/V10/T.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/V10/U.svg b/src/img/symbols/V10/U.svg
new file mode 100644
index 00000000..8edc4024
--- /dev/null
+++ b/src/img/symbols/V10/U.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/src/img/symbols/V10/WM.svg b/src/img/symbols/V10/WM.svg
new file mode 100644
index 00000000..cd126d2b
--- /dev/null
+++ b/src/img/symbols/V10/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/V11/80.svg b/src/img/symbols/V11/80.svg
new file mode 100644
index 00000000..4350e98c
--- /dev/null
+++ b/src/img/symbols/V11/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V11/C.svg b/src/img/symbols/V11/C.svg
new file mode 100644
index 00000000..f89f75d9
--- /dev/null
+++ b/src/img/symbols/V11/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V11/M.svg b/src/img/symbols/V11/M.svg
new file mode 100644
index 00000000..0b4d4129
--- /dev/null
+++ b/src/img/symbols/V11/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/V11/R.svg b/src/img/symbols/V11/R.svg
new file mode 100644
index 00000000..afbcf3ec
--- /dev/null
+++ b/src/img/symbols/V11/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/V11/T.svg b/src/img/symbols/V11/T.svg
new file mode 100644
index 00000000..43376b3b
--- /dev/null
+++ b/src/img/symbols/V11/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/V11/U.svg b/src/img/symbols/V11/U.svg
new file mode 100644
index 00000000..9e1c729d
--- /dev/null
+++ b/src/img/symbols/V11/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/V11/WM.svg b/src/img/symbols/V11/WM.svg
new file mode 100644
index 00000000..57535a49
--- /dev/null
+++ b/src/img/symbols/V11/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/V12/80.svg b/src/img/symbols/V12/80.svg
new file mode 100644
index 00000000..7ae8c48c
--- /dev/null
+++ b/src/img/symbols/V12/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/V12/C.svg b/src/img/symbols/V12/C.svg
new file mode 100644
index 00000000..410d08ba
--- /dev/null
+++ b/src/img/symbols/V12/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/V12/M.svg b/src/img/symbols/V12/M.svg
new file mode 100644
index 00000000..6c98058a
--- /dev/null
+++ b/src/img/symbols/V12/M.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/src/img/symbols/V12/R.svg b/src/img/symbols/V12/R.svg
new file mode 100644
index 00000000..83404450
--- /dev/null
+++ b/src/img/symbols/V12/R.svg
@@ -0,0 +1,26 @@
+
+
diff --git a/src/img/symbols/V12/T.svg b/src/img/symbols/V12/T.svg
new file mode 100644
index 00000000..8c9d3902
--- /dev/null
+++ b/src/img/symbols/V12/T.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/V12/U.svg b/src/img/symbols/V12/U.svg
new file mode 100644
index 00000000..89bf904d
--- /dev/null
+++ b/src/img/symbols/V12/U.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/img/symbols/V12/WM.svg b/src/img/symbols/V12/WM.svg
new file mode 100644
index 00000000..a10d129d
--- /dev/null
+++ b/src/img/symbols/V12/WM.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/V13/80.svg b/src/img/symbols/V13/80.svg
new file mode 100644
index 00000000..bf2f0367
--- /dev/null
+++ b/src/img/symbols/V13/80.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/V13/C.svg b/src/img/symbols/V13/C.svg
new file mode 100644
index 00000000..fb83a557
--- /dev/null
+++ b/src/img/symbols/V13/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/V13/M.svg b/src/img/symbols/V13/M.svg
new file mode 100644
index 00000000..333d784f
--- /dev/null
+++ b/src/img/symbols/V13/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V13/R.svg b/src/img/symbols/V13/R.svg
new file mode 100644
index 00000000..5af86e4c
--- /dev/null
+++ b/src/img/symbols/V13/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V13/T.svg b/src/img/symbols/V13/T.svg
new file mode 100644
index 00000000..89412707
--- /dev/null
+++ b/src/img/symbols/V13/T.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V13/U.svg b/src/img/symbols/V13/U.svg
new file mode 100644
index 00000000..95e4c5ec
--- /dev/null
+++ b/src/img/symbols/V13/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V13/WM.svg b/src/img/symbols/V13/WM.svg
new file mode 100644
index 00000000..cebe98b4
--- /dev/null
+++ b/src/img/symbols/V13/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/V14/80.svg b/src/img/symbols/V14/80.svg
new file mode 100644
index 00000000..9638b8b3
--- /dev/null
+++ b/src/img/symbols/V14/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/V14/C.svg b/src/img/symbols/V14/C.svg
new file mode 100644
index 00000000..0059fe88
--- /dev/null
+++ b/src/img/symbols/V14/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/V14/M.svg b/src/img/symbols/V14/M.svg
new file mode 100644
index 00000000..7a41a731
--- /dev/null
+++ b/src/img/symbols/V14/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/V14/R.svg b/src/img/symbols/V14/R.svg
new file mode 100644
index 00000000..e0b3c62c
--- /dev/null
+++ b/src/img/symbols/V14/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/V14/T.svg b/src/img/symbols/V14/T.svg
new file mode 100644
index 00000000..7b693ccd
--- /dev/null
+++ b/src/img/symbols/V14/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/V14/U.svg b/src/img/symbols/V14/U.svg
new file mode 100644
index 00000000..caf8dd87
--- /dev/null
+++ b/src/img/symbols/V14/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/V14/WM.svg b/src/img/symbols/V14/WM.svg
new file mode 100644
index 00000000..14f0c9fa
--- /dev/null
+++ b/src/img/symbols/V14/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/V15/80.svg b/src/img/symbols/V15/80.svg
new file mode 100644
index 00000000..20404b99
--- /dev/null
+++ b/src/img/symbols/V15/80.svg
@@ -0,0 +1,68 @@
+
+
diff --git a/src/img/symbols/V15/C.svg b/src/img/symbols/V15/C.svg
new file mode 100644
index 00000000..456e7142
--- /dev/null
+++ b/src/img/symbols/V15/C.svg
@@ -0,0 +1,68 @@
+
+
diff --git a/src/img/symbols/V15/M.svg b/src/img/symbols/V15/M.svg
new file mode 100644
index 00000000..d18c9eaf
--- /dev/null
+++ b/src/img/symbols/V15/M.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/V15/R.svg b/src/img/symbols/V15/R.svg
new file mode 100644
index 00000000..457a063f
--- /dev/null
+++ b/src/img/symbols/V15/R.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/V15/T.svg b/src/img/symbols/V15/T.svg
new file mode 100644
index 00000000..3dee4e92
--- /dev/null
+++ b/src/img/symbols/V15/T.svg
@@ -0,0 +1,74 @@
+
+
diff --git a/src/img/symbols/V15/U.svg b/src/img/symbols/V15/U.svg
new file mode 100644
index 00000000..03673232
--- /dev/null
+++ b/src/img/symbols/V15/U.svg
@@ -0,0 +1,73 @@
+
+
diff --git a/src/img/symbols/V15/WM.svg b/src/img/symbols/V15/WM.svg
new file mode 100644
index 00000000..e794f344
--- /dev/null
+++ b/src/img/symbols/V15/WM.svg
@@ -0,0 +1,60 @@
+
+
diff --git a/src/img/symbols/V16/80.svg b/src/img/symbols/V16/80.svg
new file mode 100644
index 00000000..50697e2b
--- /dev/null
+++ b/src/img/symbols/V16/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/V16/C.svg b/src/img/symbols/V16/C.svg
new file mode 100644
index 00000000..959c2207
--- /dev/null
+++ b/src/img/symbols/V16/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/V16/M.svg b/src/img/symbols/V16/M.svg
new file mode 100644
index 00000000..6b564294
--- /dev/null
+++ b/src/img/symbols/V16/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/V16/R.svg b/src/img/symbols/V16/R.svg
new file mode 100644
index 00000000..9d5ffcfa
--- /dev/null
+++ b/src/img/symbols/V16/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/V16/T.svg b/src/img/symbols/V16/T.svg
new file mode 100644
index 00000000..74d2dba0
--- /dev/null
+++ b/src/img/symbols/V16/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/V16/U.svg b/src/img/symbols/V16/U.svg
new file mode 100644
index 00000000..dbf5a297
--- /dev/null
+++ b/src/img/symbols/V16/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/V16/WM.svg b/src/img/symbols/V16/WM.svg
new file mode 100644
index 00000000..4f4657ce
--- /dev/null
+++ b/src/img/symbols/V16/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/V17 - Back/80.svg b/src/img/symbols/V17 - Back/80.svg
new file mode 100644
index 00000000..6a67320b
--- /dev/null
+++ b/src/img/symbols/V17 - Back/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V17 - Back/C.svg b/src/img/symbols/V17 - Back/C.svg
new file mode 100644
index 00000000..39753196
--- /dev/null
+++ b/src/img/symbols/V17 - Back/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V17 - Back/M.svg b/src/img/symbols/V17 - Back/M.svg
new file mode 100644
index 00000000..11ff64dd
--- /dev/null
+++ b/src/img/symbols/V17 - Back/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V17 - Back/R.svg b/src/img/symbols/V17 - Back/R.svg
new file mode 100644
index 00000000..5f6b0697
--- /dev/null
+++ b/src/img/symbols/V17 - Back/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V17 - Back/T.svg b/src/img/symbols/V17 - Back/T.svg
new file mode 100644
index 00000000..be2a06e6
--- /dev/null
+++ b/src/img/symbols/V17 - Back/T.svg
@@ -0,0 +1,71 @@
+
+
diff --git a/src/img/symbols/V17 - Back/U.svg b/src/img/symbols/V17 - Back/U.svg
new file mode 100644
index 00000000..14f4032a
--- /dev/null
+++ b/src/img/symbols/V17 - Back/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V17 - Back/WM.svg b/src/img/symbols/V17 - Back/WM.svg
new file mode 100644
index 00000000..c73bfcd5
--- /dev/null
+++ b/src/img/symbols/V17 - Back/WM.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/src/img/symbols/V17 - Front/80.svg b/src/img/symbols/V17 - Front/80.svg
new file mode 100644
index 00000000..450ae743
--- /dev/null
+++ b/src/img/symbols/V17 - Front/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V17 - Front/C.svg b/src/img/symbols/V17 - Front/C.svg
new file mode 100644
index 00000000..9fd29944
--- /dev/null
+++ b/src/img/symbols/V17 - Front/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/V17 - Front/M.svg b/src/img/symbols/V17 - Front/M.svg
new file mode 100644
index 00000000..8e8b54eb
--- /dev/null
+++ b/src/img/symbols/V17 - Front/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V17 - Front/R.svg b/src/img/symbols/V17 - Front/R.svg
new file mode 100644
index 00000000..7e76f8bb
--- /dev/null
+++ b/src/img/symbols/V17 - Front/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V17 - Front/T.svg b/src/img/symbols/V17 - Front/T.svg
new file mode 100644
index 00000000..0b2bbc37
--- /dev/null
+++ b/src/img/symbols/V17 - Front/T.svg
@@ -0,0 +1,71 @@
+
+
diff --git a/src/img/symbols/V17 - Front/U.svg b/src/img/symbols/V17 - Front/U.svg
new file mode 100644
index 00000000..6f8a0a67
--- /dev/null
+++ b/src/img/symbols/V17 - Front/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/V17 - Front/WM.svg b/src/img/symbols/V17 - Front/WM.svg
new file mode 100644
index 00000000..1d83b451
--- /dev/null
+++ b/src/img/symbols/V17 - Front/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/VIS/80.svg b/src/img/symbols/VIS/80.svg
new file mode 100644
index 00000000..c7ba8d22
--- /dev/null
+++ b/src/img/symbols/VIS/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/VIS/C - Original.svg b/src/img/symbols/VIS/C - Original.svg
new file mode 100644
index 00000000..957ef4fe
--- /dev/null
+++ b/src/img/symbols/VIS/C - Original.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/VIS/C.svg b/src/img/symbols/VIS/C.svg
new file mode 100644
index 00000000..01a0bf76
--- /dev/null
+++ b/src/img/symbols/VIS/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/VIS/M.svg b/src/img/symbols/VIS/M.svg
new file mode 100644
index 00000000..1ca367cb
--- /dev/null
+++ b/src/img/symbols/VIS/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/VIS/R.svg b/src/img/symbols/VIS/R.svg
new file mode 100644
index 00000000..94945c5e
--- /dev/null
+++ b/src/img/symbols/VIS/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/VIS/T.svg b/src/img/symbols/VIS/T.svg
new file mode 100644
index 00000000..34899545
--- /dev/null
+++ b/src/img/symbols/VIS/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/VIS/U.svg b/src/img/symbols/VIS/U.svg
new file mode 100644
index 00000000..6f349e8a
--- /dev/null
+++ b/src/img/symbols/VIS/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/VIS/WM.svg b/src/img/symbols/VIS/WM.svg
new file mode 100644
index 00000000..74425e73
--- /dev/null
+++ b/src/img/symbols/VIS/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/VMA/80.svg b/src/img/symbols/VMA/80.svg
new file mode 100644
index 00000000..5f6ae74c
--- /dev/null
+++ b/src/img/symbols/VMA/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/VMA/C.svg b/src/img/symbols/VMA/C.svg
new file mode 100644
index 00000000..263f89a4
--- /dev/null
+++ b/src/img/symbols/VMA/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/VMA/M.svg b/src/img/symbols/VMA/M.svg
new file mode 100644
index 00000000..2f56b4cd
--- /dev/null
+++ b/src/img/symbols/VMA/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/VMA/R.svg b/src/img/symbols/VMA/R.svg
new file mode 100644
index 00000000..9ea6197a
--- /dev/null
+++ b/src/img/symbols/VMA/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/VMA/S.svg b/src/img/symbols/VMA/S.svg
new file mode 100644
index 00000000..fd399feb
--- /dev/null
+++ b/src/img/symbols/VMA/S.svg
@@ -0,0 +1,32 @@
+
+
diff --git a/src/img/symbols/VMA/T.svg b/src/img/symbols/VMA/T.svg
new file mode 100644
index 00000000..ef42a161
--- /dev/null
+++ b/src/img/symbols/VMA/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/VMA/U.svg b/src/img/symbols/VMA/U.svg
new file mode 100644
index 00000000..ce185fb4
--- /dev/null
+++ b/src/img/symbols/VMA/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/VMA/WM.svg b/src/img/symbols/VMA/WM.svg
new file mode 100644
index 00000000..6d749b66
--- /dev/null
+++ b/src/img/symbols/VMA/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/VOC/80.svg b/src/img/symbols/VOC/80.svg
new file mode 100644
index 00000000..aee10e3e
--- /dev/null
+++ b/src/img/symbols/VOC/80.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/src/img/symbols/VOC/C.svg b/src/img/symbols/VOC/C.svg
new file mode 100644
index 00000000..e7b750b9
--- /dev/null
+++ b/src/img/symbols/VOC/C.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/src/img/symbols/VOC/M.svg b/src/img/symbols/VOC/M.svg
new file mode 100644
index 00000000..ab7d797a
--- /dev/null
+++ b/src/img/symbols/VOC/M.svg
@@ -0,0 +1,110 @@
+
+
+
+
diff --git a/src/img/symbols/VOC/R.svg b/src/img/symbols/VOC/R.svg
new file mode 100644
index 00000000..eadf4a3e
--- /dev/null
+++ b/src/img/symbols/VOC/R.svg
@@ -0,0 +1,110 @@
+
+
+
+
diff --git a/src/img/symbols/VOC/T.svg b/src/img/symbols/VOC/T.svg
new file mode 100644
index 00000000..1f900b42
--- /dev/null
+++ b/src/img/symbols/VOC/T.svg
@@ -0,0 +1,111 @@
+
+
+
+
diff --git a/src/img/symbols/VOC/U.svg b/src/img/symbols/VOC/U.svg
new file mode 100644
index 00000000..5a1c1c44
--- /dev/null
+++ b/src/img/symbols/VOC/U.svg
@@ -0,0 +1,110 @@
+
+
+
+
diff --git a/src/img/symbols/VOC/WM.svg b/src/img/symbols/VOC/WM.svg
new file mode 100644
index 00000000..636e41cc
--- /dev/null
+++ b/src/img/symbols/VOC/WM.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/src/img/symbols/Vanguard/C.svg b/src/img/symbols/Vanguard/C.svg
new file mode 100644
index 00000000..57f08b77
--- /dev/null
+++ b/src/img/symbols/Vanguard/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/Vanguard/WM.svg b/src/img/symbols/Vanguard/WM.svg
new file mode 100644
index 00000000..a3a92555
--- /dev/null
+++ b/src/img/symbols/Vanguard/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/Vintage Championship/Vintage Championship 1.svg b/src/img/symbols/Vintage Championship/Vintage Championship 1.svg
new file mode 100644
index 00000000..df2941dd
--- /dev/null
+++ b/src/img/symbols/Vintage Championship/Vintage Championship 1.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/Vintage Championship/Vintage Championship 2.svg b/src/img/symbols/Vintage Championship/Vintage Championship 2.svg
new file mode 100644
index 00000000..eaa7f2ed
--- /dev/null
+++ b/src/img/symbols/Vintage Championship/Vintage Championship 2.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/Vintage Championship/Z0102 - Vintage Championship 2-1.svg b/src/img/symbols/Vintage Championship/Z0102 - Vintage Championship 2-1.svg
new file mode 100644
index 00000000..ae485fc5
--- /dev/null
+++ b/src/img/symbols/Vintage Championship/Z0102 - Vintage Championship 2-1.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/Vintage Championship/Z0102 - Vintage Championship 2.svg b/src/img/symbols/Vintage Championship/Z0102 - Vintage Championship 2.svg
new file mode 100644
index 00000000..5010f616
--- /dev/null
+++ b/src/img/symbols/Vintage Championship/Z0102 - Vintage Championship 2.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/W16/80.svg b/src/img/symbols/W16/80.svg
new file mode 100644
index 00000000..28499ee9
--- /dev/null
+++ b/src/img/symbols/W16/80.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/W16/C.svg b/src/img/symbols/W16/C.svg
new file mode 100644
index 00000000..02671524
--- /dev/null
+++ b/src/img/symbols/W16/C.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/W16/M.svg b/src/img/symbols/W16/M.svg
new file mode 100644
index 00000000..66aeabf0
--- /dev/null
+++ b/src/img/symbols/W16/M.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/W16/R.svg b/src/img/symbols/W16/R.svg
new file mode 100644
index 00000000..22ffecbb
--- /dev/null
+++ b/src/img/symbols/W16/R.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/W16/T.svg b/src/img/symbols/W16/T.svg
new file mode 100644
index 00000000..1a347703
--- /dev/null
+++ b/src/img/symbols/W16/T.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/W16/U.svg b/src/img/symbols/W16/U.svg
new file mode 100644
index 00000000..4155fcae
--- /dev/null
+++ b/src/img/symbols/W16/U.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/img/symbols/W16/WM.svg b/src/img/symbols/W16/WM.svg
new file mode 100644
index 00000000..eee9cbc9
--- /dev/null
+++ b/src/img/symbols/W16/WM.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/W17/80.svg b/src/img/symbols/W17/80.svg
new file mode 100644
index 00000000..ffe2d2c9
--- /dev/null
+++ b/src/img/symbols/W17/80.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/W17/C.svg b/src/img/symbols/W17/C.svg
new file mode 100644
index 00000000..84963196
--- /dev/null
+++ b/src/img/symbols/W17/C.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/src/img/symbols/W17/M.svg b/src/img/symbols/W17/M.svg
new file mode 100644
index 00000000..f7385df4
--- /dev/null
+++ b/src/img/symbols/W17/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/W17/R.svg b/src/img/symbols/W17/R.svg
new file mode 100644
index 00000000..93c4553e
--- /dev/null
+++ b/src/img/symbols/W17/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/W17/T.svg b/src/img/symbols/W17/T.svg
new file mode 100644
index 00000000..325379ba
--- /dev/null
+++ b/src/img/symbols/W17/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/W17/U.svg b/src/img/symbols/W17/U.svg
new file mode 100644
index 00000000..3a391daf
--- /dev/null
+++ b/src/img/symbols/W17/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/W17/WM.svg b/src/img/symbols/W17/WM.svg
new file mode 100644
index 00000000..f3f493d6
--- /dev/null
+++ b/src/img/symbols/W17/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/WAR/80.svg b/src/img/symbols/WAR/80.svg
new file mode 100644
index 00000000..328da6c6
--- /dev/null
+++ b/src/img/symbols/WAR/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/WAR/C.svg b/src/img/symbols/WAR/C.svg
new file mode 100644
index 00000000..3ac64c3b
--- /dev/null
+++ b/src/img/symbols/WAR/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/WAR/M.svg b/src/img/symbols/WAR/M.svg
new file mode 100644
index 00000000..b0ed3445
--- /dev/null
+++ b/src/img/symbols/WAR/M.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/WAR/R.svg b/src/img/symbols/WAR/R.svg
new file mode 100644
index 00000000..e4569367
--- /dev/null
+++ b/src/img/symbols/WAR/R.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/WAR/T.svg b/src/img/symbols/WAR/T.svg
new file mode 100644
index 00000000..381af42c
--- /dev/null
+++ b/src/img/symbols/WAR/T.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/WAR/U.svg b/src/img/symbols/WAR/U.svg
new file mode 100644
index 00000000..61a066cd
--- /dev/null
+++ b/src/img/symbols/WAR/U.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/src/img/symbols/WAR/WM.svg b/src/img/symbols/WAR/WM.svg
new file mode 100644
index 00000000..20d2325d
--- /dev/null
+++ b/src/img/symbols/WAR/WM.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/WTH/80.svg b/src/img/symbols/WTH/80.svg
new file mode 100644
index 00000000..76b3e77c
--- /dev/null
+++ b/src/img/symbols/WTH/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/WTH/C.svg b/src/img/symbols/WTH/C.svg
new file mode 100644
index 00000000..58e6eea2
--- /dev/null
+++ b/src/img/symbols/WTH/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/WTH/M.svg b/src/img/symbols/WTH/M.svg
new file mode 100644
index 00000000..a050e90a
--- /dev/null
+++ b/src/img/symbols/WTH/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WTH/R.svg b/src/img/symbols/WTH/R.svg
new file mode 100644
index 00000000..7df52ec0
--- /dev/null
+++ b/src/img/symbols/WTH/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WTH/T.svg b/src/img/symbols/WTH/T.svg
new file mode 100644
index 00000000..65db135e
--- /dev/null
+++ b/src/img/symbols/WTH/T.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/WTH/U.svg b/src/img/symbols/WTH/U.svg
new file mode 100644
index 00000000..18a1ac13
--- /dev/null
+++ b/src/img/symbols/WTH/U.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/WTH/Watermark - M25.svg b/src/img/symbols/WTH/Watermark - M25.svg
new file mode 100644
index 00000000..838da0a5
--- /dev/null
+++ b/src/img/symbols/WTH/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/WTH_ALT1/80.svg b/src/img/symbols/WTH_ALT1/80.svg
new file mode 100644
index 00000000..10e4c720
--- /dev/null
+++ b/src/img/symbols/WTH_ALT1/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/WTH_ALT1/M.svg b/src/img/symbols/WTH_ALT1/M.svg
new file mode 100644
index 00000000..e344ff62
--- /dev/null
+++ b/src/img/symbols/WTH_ALT1/M.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WTH_ALT1/R.svg b/src/img/symbols/WTH_ALT1/R.svg
new file mode 100644
index 00000000..4e20746f
--- /dev/null
+++ b/src/img/symbols/WTH_ALT1/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WTH_ALT1/T.svg b/src/img/symbols/WTH_ALT1/T.svg
new file mode 100644
index 00000000..98b6ea0a
--- /dev/null
+++ b/src/img/symbols/WTH_ALT1/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WTH_ALT1/U.svg b/src/img/symbols/WTH_ALT1/U.svg
new file mode 100644
index 00000000..524fd3b9
--- /dev/null
+++ b/src/img/symbols/WTH_ALT1/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WTH_ALT2/M.svg b/src/img/symbols/WTH_ALT2/M.svg
new file mode 100644
index 00000000..1c137cc0
--- /dev/null
+++ b/src/img/symbols/WTH_ALT2/M.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/WTH_ALT2/R.svg b/src/img/symbols/WTH_ALT2/R.svg
new file mode 100644
index 00000000..8eaeb187
--- /dev/null
+++ b/src/img/symbols/WTH_ALT2/R.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/WTH_ALT2/T.svg b/src/img/symbols/WTH_ALT2/T.svg
new file mode 100644
index 00000000..9716b212
--- /dev/null
+++ b/src/img/symbols/WTH_ALT2/T.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/WTH_ALT2/U.svg b/src/img/symbols/WTH_ALT2/U.svg
new file mode 100644
index 00000000..c90a463a
--- /dev/null
+++ b/src/img/symbols/WTH_ALT2/U.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/src/img/symbols/WWK/80.svg b/src/img/symbols/WWK/80.svg
new file mode 100644
index 00000000..8d65e52a
--- /dev/null
+++ b/src/img/symbols/WWK/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/WWK/C.svg b/src/img/symbols/WWK/C.svg
new file mode 100644
index 00000000..829ea3fc
--- /dev/null
+++ b/src/img/symbols/WWK/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/WWK/M.svg b/src/img/symbols/WWK/M.svg
new file mode 100644
index 00000000..817d7434
--- /dev/null
+++ b/src/img/symbols/WWK/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/WWK/R.svg b/src/img/symbols/WWK/R.svg
new file mode 100644
index 00000000..090fff48
--- /dev/null
+++ b/src/img/symbols/WWK/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WWK/T.svg b/src/img/symbols/WWK/T.svg
new file mode 100644
index 00000000..fffabe97
--- /dev/null
+++ b/src/img/symbols/WWK/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WWK/U.svg b/src/img/symbols/WWK/U.svg
new file mode 100644
index 00000000..c33f8c3a
--- /dev/null
+++ b/src/img/symbols/WWK/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/WWK/Watermark - M25.svg b/src/img/symbols/WWK/Watermark - M25.svg
new file mode 100644
index 00000000..f843029d
--- /dev/null
+++ b/src/img/symbols/WWK/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/XDUELS/C.svg b/src/img/symbols/XDUELS/C.svg
new file mode 100644
index 00000000..b4d423cc
--- /dev/null
+++ b/src/img/symbols/XDUELS/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/XDUELS/WM.svg b/src/img/symbols/XDUELS/WM.svg
new file mode 100644
index 00000000..c445807c
--- /dev/null
+++ b/src/img/symbols/XDUELS/WM.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/XLN/80.svg b/src/img/symbols/XLN/80.svg
new file mode 100644
index 00000000..240a3f51
--- /dev/null
+++ b/src/img/symbols/XLN/80.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/XLN/C.svg b/src/img/symbols/XLN/C.svg
new file mode 100644
index 00000000..783605b9
--- /dev/null
+++ b/src/img/symbols/XLN/C.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/src/img/symbols/XLN/M.svg b/src/img/symbols/XLN/M.svg
new file mode 100644
index 00000000..cebb9ad4
--- /dev/null
+++ b/src/img/symbols/XLN/M.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/XLN/R.svg b/src/img/symbols/XLN/R.svg
new file mode 100644
index 00000000..36dcacf2
--- /dev/null
+++ b/src/img/symbols/XLN/R.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/XLN/T.svg b/src/img/symbols/XLN/T.svg
new file mode 100644
index 00000000..7e12b1dc
--- /dev/null
+++ b/src/img/symbols/XLN/T.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/XLN/U.svg b/src/img/symbols/XLN/U.svg
new file mode 100644
index 00000000..ca906f71
--- /dev/null
+++ b/src/img/symbols/XLN/U.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/src/img/symbols/XLN/WM.svg b/src/img/symbols/XLN/WM.svg
new file mode 100644
index 00000000..aaa7da2c
--- /dev/null
+++ b/src/img/symbols/XLN/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/ZEN/80.svg b/src/img/symbols/ZEN/80.svg
new file mode 100644
index 00000000..2a718c34
--- /dev/null
+++ b/src/img/symbols/ZEN/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ZEN/C.svg b/src/img/symbols/ZEN/C.svg
new file mode 100644
index 00000000..fd408ae0
--- /dev/null
+++ b/src/img/symbols/ZEN/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/ZEN/M.svg b/src/img/symbols/ZEN/M.svg
new file mode 100644
index 00000000..048e1e5b
--- /dev/null
+++ b/src/img/symbols/ZEN/M.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/ZEN/R.svg b/src/img/symbols/ZEN/R.svg
new file mode 100644
index 00000000..8202abf2
--- /dev/null
+++ b/src/img/symbols/ZEN/R.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ZEN/T.svg b/src/img/symbols/ZEN/T.svg
new file mode 100644
index 00000000..ea8ecf4e
--- /dev/null
+++ b/src/img/symbols/ZEN/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ZEN/U.svg b/src/img/symbols/ZEN/U.svg
new file mode 100644
index 00000000..7320a34b
--- /dev/null
+++ b/src/img/symbols/ZEN/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/ZEN/Watermark - M25.svg b/src/img/symbols/ZEN/Watermark - M25.svg
new file mode 100644
index 00000000..4449a697
--- /dev/null
+++ b/src/img/symbols/ZEN/Watermark - M25.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/img/symbols/ZNC/C.svg b/src/img/symbols/ZNC/C.svg
new file mode 100644
index 00000000..d4939986
--- /dev/null
+++ b/src/img/symbols/ZNC/C.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/src/img/symbols/ZNC/M.svg b/src/img/symbols/ZNC/M.svg
new file mode 100644
index 00000000..80c7a28f
--- /dev/null
+++ b/src/img/symbols/ZNC/M.svg
@@ -0,0 +1,106 @@
+
+
diff --git a/src/img/symbols/ZNC/R.svg b/src/img/symbols/ZNC/R.svg
new file mode 100644
index 00000000..5230d087
--- /dev/null
+++ b/src/img/symbols/ZNC/R.svg
@@ -0,0 +1,106 @@
+
+
diff --git a/src/img/symbols/ZNC/U.svg b/src/img/symbols/ZNC/U.svg
new file mode 100644
index 00000000..c34ad58e
--- /dev/null
+++ b/src/img/symbols/ZNC/U.svg
@@ -0,0 +1,106 @@
+
+
diff --git a/src/img/symbols/ZNR/80.svg b/src/img/symbols/ZNR/80.svg
new file mode 100644
index 00000000..24e07c16
--- /dev/null
+++ b/src/img/symbols/ZNR/80.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ZNR/C.svg b/src/img/symbols/ZNR/C.svg
new file mode 100644
index 00000000..62746001
--- /dev/null
+++ b/src/img/symbols/ZNR/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/ZNR/M.svg b/src/img/symbols/ZNR/M.svg
new file mode 100644
index 00000000..e65f054f
--- /dev/null
+++ b/src/img/symbols/ZNR/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ZNR/R.svg b/src/img/symbols/ZNR/R.svg
new file mode 100644
index 00000000..45e44c6b
--- /dev/null
+++ b/src/img/symbols/ZNR/R.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ZNR/T.svg b/src/img/symbols/ZNR/T.svg
new file mode 100644
index 00000000..627cb6ac
--- /dev/null
+++ b/src/img/symbols/ZNR/T.svg
@@ -0,0 +1,81 @@
+
+
diff --git a/src/img/symbols/ZNR/U.svg b/src/img/symbols/ZNR/U.svg
new file mode 100644
index 00000000..4e299cd4
--- /dev/null
+++ b/src/img/symbols/ZNR/U.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/ZNR/WM.svg b/src/img/symbols/ZNR/WM.svg
new file mode 100644
index 00000000..9d15f130
--- /dev/null
+++ b/src/img/symbols/ZNR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/pDRC/C.svg b/src/img/symbols/pDRC/C.svg
new file mode 100644
index 00000000..1a6f4e62
--- /dev/null
+++ b/src/img/symbols/pDRC/C.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/img/symbols/pDRC/WM.svg b/src/img/symbols/pDRC/WM.svg
new file mode 100644
index 00000000..8270aa51
--- /dev/null
+++ b/src/img/symbols/pDRC/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/pGRU/C.svg b/src/img/symbols/pGRU/C.svg
new file mode 100644
index 00000000..80921076
--- /dev/null
+++ b/src/img/symbols/pGRU/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/pHPR/80.svg b/src/img/symbols/pHPR/80.svg
new file mode 100644
index 00000000..2dd1ba29
--- /dev/null
+++ b/src/img/symbols/pHPR/80.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/pHPR/C.svg b/src/img/symbols/pHPR/C.svg
new file mode 100644
index 00000000..b008fa63
--- /dev/null
+++ b/src/img/symbols/pHPR/C.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/img/symbols/pHPR/M.svg b/src/img/symbols/pHPR/M.svg
new file mode 100644
index 00000000..32fad87f
--- /dev/null
+++ b/src/img/symbols/pHPR/M.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/src/img/symbols/pHPR/R.svg b/src/img/symbols/pHPR/R.svg
new file mode 100644
index 00000000..b80e0593
--- /dev/null
+++ b/src/img/symbols/pHPR/R.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/pHPR/T.svg b/src/img/symbols/pHPR/T.svg
new file mode 100644
index 00000000..e78cd30d
--- /dev/null
+++ b/src/img/symbols/pHPR/T.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/pHPR/U.svg b/src/img/symbols/pHPR/U.svg
new file mode 100644
index 00000000..53211851
--- /dev/null
+++ b/src/img/symbols/pHPR/U.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/symbols/pHPR/WM.svg b/src/img/symbols/pHPR/WM.svg
new file mode 100644
index 00000000..29f3edbe
--- /dev/null
+++ b/src/img/symbols/pHPR/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/pINV/C.svg b/src/img/symbols/pINV/C.svg
new file mode 100644
index 00000000..21020d9b
--- /dev/null
+++ b/src/img/symbols/pINV/C.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/src/img/symbols/pINV/WM.svg b/src/img/symbols/pINV/WM.svg
new file mode 100644
index 00000000..a5252d9a
--- /dev/null
+++ b/src/img/symbols/pINV/WM.svg
@@ -0,0 +1,49 @@
+
+
diff --git a/src/img/symbols/pLEAF/80.svg b/src/img/symbols/pLEAF/80.svg
new file mode 100644
index 00000000..577243ce
--- /dev/null
+++ b/src/img/symbols/pLEAF/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/pLEAF/C.svg b/src/img/symbols/pLEAF/C.svg
new file mode 100644
index 00000000..0a2986b5
--- /dev/null
+++ b/src/img/symbols/pLEAF/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/pLEAF/M.svg b/src/img/symbols/pLEAF/M.svg
new file mode 100644
index 00000000..d0dff650
--- /dev/null
+++ b/src/img/symbols/pLEAF/M.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/pLEAF/R.svg b/src/img/symbols/pLEAF/R.svg
new file mode 100644
index 00000000..3e8097c4
--- /dev/null
+++ b/src/img/symbols/pLEAF/R.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/pLEAF/T.svg b/src/img/symbols/pLEAF/T.svg
new file mode 100644
index 00000000..b847c412
--- /dev/null
+++ b/src/img/symbols/pLEAF/T.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/pLEAF/U.svg b/src/img/symbols/pLEAF/U.svg
new file mode 100644
index 00000000..e1c9b6aa
--- /dev/null
+++ b/src/img/symbols/pLEAF/U.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/img/symbols/pLEAF/WM.svg b/src/img/symbols/pLEAF/WM.svg
new file mode 100644
index 00000000..5d046c18
--- /dev/null
+++ b/src/img/symbols/pLEAF/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/src/img/symbols/pMPS/C.svg b/src/img/symbols/pMPS/C.svg
new file mode 100644
index 00000000..5116bcad
--- /dev/null
+++ b/src/img/symbols/pMPS/C.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/img/symbols/pSUM/80.svg b/src/img/symbols/pSUM/80.svg
new file mode 100644
index 00000000..0ce0ea7d
--- /dev/null
+++ b/src/img/symbols/pSUM/80.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/pSUM/C.svg b/src/img/symbols/pSUM/C.svg
new file mode 100644
index 00000000..d1aee980
--- /dev/null
+++ b/src/img/symbols/pSUM/C.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/symbols/pSUM/M.svg b/src/img/symbols/pSUM/M.svg
new file mode 100644
index 00000000..6379362f
--- /dev/null
+++ b/src/img/symbols/pSUM/M.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/pSUM/R.svg b/src/img/symbols/pSUM/R.svg
new file mode 100644
index 00000000..c875b069
--- /dev/null
+++ b/src/img/symbols/pSUM/R.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/symbols/pSUM/T.svg b/src/img/symbols/pSUM/T.svg
new file mode 100644
index 00000000..2a4fd233
--- /dev/null
+++ b/src/img/symbols/pSUM/T.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/pSUM/U.svg b/src/img/symbols/pSUM/U.svg
new file mode 100644
index 00000000..4b74bb94
--- /dev/null
+++ b/src/img/symbols/pSUM/U.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/img/symbols/pSUM/WM.svg b/src/img/symbols/pSUM/WM.svg
new file mode 100644
index 00000000..31a20be6
--- /dev/null
+++ b/src/img/symbols/pSUM/WM.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/proxyshop/img/test-fa.png b/src/img/test-fa.png
similarity index 100%
rename from proxyshop/img/test-fa.png
rename to src/img/test-fa.png
diff --git a/proxyshop/img/test.png b/src/img/test.png
similarity index 100%
rename from proxyshop/img/test.png
rename to src/img/test.png
diff --git a/src/img/watermarks/abzan.svg b/src/img/watermarks/abzan.svg
new file mode 100644
index 00000000..e227013f
--- /dev/null
+++ b/src/img/watermarks/abzan.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/agentsofsneak.svg b/src/img/watermarks/agentsofsneak.svg
new file mode 100644
index 00000000..e0451a3d
--- /dev/null
+++ b/src/img/watermarks/agentsofsneak.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/watermarks/atarka.svg b/src/img/watermarks/atarka.svg
new file mode 100644
index 00000000..6d66f405
--- /dev/null
+++ b/src/img/watermarks/atarka.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/azorius.svg b/src/img/watermarks/azorius.svg
new file mode 100644
index 00000000..c3ca3ed2
--- /dev/null
+++ b/src/img/watermarks/azorius.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/basics/b.svg b/src/img/watermarks/basics/b.svg
new file mode 100644
index 00000000..c3d48459
--- /dev/null
+++ b/src/img/watermarks/basics/b.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/basics/g.svg b/src/img/watermarks/basics/g.svg
new file mode 100644
index 00000000..01c84f6c
--- /dev/null
+++ b/src/img/watermarks/basics/g.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/basics/r.svg b/src/img/watermarks/basics/r.svg
new file mode 100644
index 00000000..224a7271
--- /dev/null
+++ b/src/img/watermarks/basics/r.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/basics/u.svg b/src/img/watermarks/basics/u.svg
new file mode 100644
index 00000000..2a473cca
--- /dev/null
+++ b/src/img/watermarks/basics/u.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/basics/w.svg b/src/img/watermarks/basics/w.svg
new file mode 100644
index 00000000..6bd30f08
--- /dev/null
+++ b/src/img/watermarks/basics/w.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/boros.svg b/src/img/watermarks/boros.svg
new file mode 100644
index 00000000..dd32a89a
--- /dev/null
+++ b/src/img/watermarks/boros.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/brokers.svg b/src/img/watermarks/brokers.svg
new file mode 100644
index 00000000..afcbbd80
--- /dev/null
+++ b/src/img/watermarks/brokers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/cabaretti.svg b/src/img/watermarks/cabaretti.svg
new file mode 100644
index 00000000..90d6b152
--- /dev/null
+++ b/src/img/watermarks/cabaretti.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/crossbreedlabs.svg b/src/img/watermarks/crossbreedlabs.svg
new file mode 100644
index 00000000..b5561662
--- /dev/null
+++ b/src/img/watermarks/crossbreedlabs.svg
@@ -0,0 +1,33 @@
+
+
diff --git a/src/img/watermarks/dci.svg b/src/img/watermarks/dci.svg
new file mode 100644
index 00000000..2e397bd4
--- /dev/null
+++ b/src/img/watermarks/dci.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/img/watermarks/dimir.svg b/src/img/watermarks/dimir.svg
new file mode 100644
index 00000000..c8898765
--- /dev/null
+++ b/src/img/watermarks/dimir.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/dromoka.svg b/src/img/watermarks/dromoka.svg
new file mode 100644
index 00000000..809f1ea8
--- /dev/null
+++ b/src/img/watermarks/dromoka.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/foretell.svg b/src/img/watermarks/foretell.svg
new file mode 100644
index 00000000..7407ff2c
--- /dev/null
+++ b/src/img/watermarks/foretell.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/goblinexplosioneers.svg b/src/img/watermarks/goblinexplosioneers.svg
new file mode 100644
index 00000000..b6afb060
--- /dev/null
+++ b/src/img/watermarks/goblinexplosioneers.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/watermarks/golgari.svg b/src/img/watermarks/golgari.svg
new file mode 100644
index 00000000..d8285123
--- /dev/null
+++ b/src/img/watermarks/golgari.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/gruul.svg b/src/img/watermarks/gruul.svg
new file mode 100644
index 00000000..d6aef7df
--- /dev/null
+++ b/src/img/watermarks/gruul.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/izzet.svg b/src/img/watermarks/izzet.svg
new file mode 100644
index 00000000..1fad892c
--- /dev/null
+++ b/src/img/watermarks/izzet.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/jeskai.svg b/src/img/watermarks/jeskai.svg
new file mode 100644
index 00000000..8d9b13e8
--- /dev/null
+++ b/src/img/watermarks/jeskai.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/kolaghan.svg b/src/img/watermarks/kolaghan.svg
new file mode 100644
index 00000000..15928849
--- /dev/null
+++ b/src/img/watermarks/kolaghan.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/leagueofdastardlydoom.svg b/src/img/watermarks/leagueofdastardlydoom.svg
new file mode 100644
index 00000000..515b761a
--- /dev/null
+++ b/src/img/watermarks/leagueofdastardlydoom.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/img/watermarks/lorehold.svg b/src/img/watermarks/lorehold.svg
new file mode 100644
index 00000000..01fa2f55
--- /dev/null
+++ b/src/img/watermarks/lorehold.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/maestros.svg b/src/img/watermarks/maestros.svg
new file mode 100644
index 00000000..78e67ee5
--- /dev/null
+++ b/src/img/watermarks/maestros.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/mardu.svg b/src/img/watermarks/mardu.svg
new file mode 100644
index 00000000..9ab86561
--- /dev/null
+++ b/src/img/watermarks/mardu.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/mirran.svg b/src/img/watermarks/mirran.svg
new file mode 100644
index 00000000..3bd81094
--- /dev/null
+++ b/src/img/watermarks/mirran.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/img/watermarks/obscura.svg b/src/img/watermarks/obscura.svg
new file mode 100644
index 00000000..331a0d6f
--- /dev/null
+++ b/src/img/watermarks/obscura.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/ojutai.svg b/src/img/watermarks/ojutai.svg
new file mode 100644
index 00000000..8cf0ee60
--- /dev/null
+++ b/src/img/watermarks/ojutai.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/orderofthewidget.svg b/src/img/watermarks/orderofthewidget.svg
new file mode 100644
index 00000000..60c6ca27
--- /dev/null
+++ b/src/img/watermarks/orderofthewidget.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/src/img/watermarks/orzhov.svg b/src/img/watermarks/orzhov.svg
new file mode 100644
index 00000000..d2c5bed8
--- /dev/null
+++ b/src/img/watermarks/orzhov.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/phyrexian.svg b/src/img/watermarks/phyrexian.svg
new file mode 100644
index 00000000..8497151b
--- /dev/null
+++ b/src/img/watermarks/phyrexian.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/planeswalker.svg b/src/img/watermarks/planeswalker.svg
new file mode 100644
index 00000000..656a6bbb
--- /dev/null
+++ b/src/img/watermarks/planeswalker.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/polis/polis-akros.svg b/src/img/watermarks/polis/polis-akros.svg
new file mode 100644
index 00000000..5994987f
--- /dev/null
+++ b/src/img/watermarks/polis/polis-akros.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/polis/polis-meletis.svg b/src/img/watermarks/polis/polis-meletis.svg
new file mode 100644
index 00000000..6fd87473
--- /dev/null
+++ b/src/img/watermarks/polis/polis-meletis.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/polis/polis-setessa.svg b/src/img/watermarks/polis/polis-setessa.svg
new file mode 100644
index 00000000..92b6a030
--- /dev/null
+++ b/src/img/watermarks/polis/polis-setessa.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/prismari.svg b/src/img/watermarks/prismari.svg
new file mode 100644
index 00000000..1343f240
--- /dev/null
+++ b/src/img/watermarks/prismari.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/purple.svg b/src/img/watermarks/purple.svg
new file mode 100644
index 00000000..4041d196
--- /dev/null
+++ b/src/img/watermarks/purple.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/img/watermarks/quandrix.svg b/src/img/watermarks/quandrix.svg
new file mode 100644
index 00000000..d431b324
--- /dev/null
+++ b/src/img/watermarks/quandrix.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/rakdos.svg b/src/img/watermarks/rakdos.svg
new file mode 100644
index 00000000..1f717137
--- /dev/null
+++ b/src/img/watermarks/rakdos.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/riveteers.svg b/src/img/watermarks/riveteers.svg
new file mode 100644
index 00000000..7d8d3a3c
--- /dev/null
+++ b/src/img/watermarks/riveteers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/img/watermarks/selesnya.svg b/src/img/watermarks/selesnya.svg
new file mode 100644
index 00000000..4a82f48a
--- /dev/null
+++ b/src/img/watermarks/selesnya.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/silumgar.svg b/src/img/watermarks/silumgar.svg
new file mode 100644
index 00000000..35d23a4a
--- /dev/null
+++ b/src/img/watermarks/silumgar.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/silverquill.svg b/src/img/watermarks/silverquill.svg
new file mode 100644
index 00000000..463592c4
--- /dev/null
+++ b/src/img/watermarks/silverquill.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/simic.svg b/src/img/watermarks/simic.svg
new file mode 100644
index 00000000..a6bf149f
--- /dev/null
+++ b/src/img/watermarks/simic.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/sultai.svg b/src/img/watermarks/sultai.svg
new file mode 100644
index 00000000..8c42d07b
--- /dev/null
+++ b/src/img/watermarks/sultai.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/temur.svg b/src/img/watermarks/temur.svg
new file mode 100644
index 00000000..e648c635
--- /dev/null
+++ b/src/img/watermarks/temur.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/witherbloom.svg b/src/img/watermarks/witherbloom.svg
new file mode 100644
index 00000000..a4169009
--- /dev/null
+++ b/src/img/watermarks/witherbloom.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/img/watermarks/wotc.svg b/src/img/watermarks/wotc.svg
new file mode 100644
index 00000000..710ffd71
--- /dev/null
+++ b/src/img/watermarks/wotc.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/proxyshop/kv/console.kv b/src/kv/console.kv
similarity index 98%
rename from proxyshop/kv/console.kv
rename to src/kv/console.kv
index 4ca97892..42c7eb84 100644
--- a/proxyshop/kv/console.kv
+++ b/src/kv/console.kv
@@ -1,4 +1,4 @@
-#:import HoverButton proxyshop.gui.utils.HoverButton
+#:import HoverButton src.gui.utils.HoverButton
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import ScrollView kivy.uix.scrollview.ScrollView
#:import ak asynckivy
diff --git a/proxyshop/kv/creator.kv b/src/kv/creator.kv
similarity index 93%
rename from proxyshop/kv/creator.kv
rename to src/kv/creator.kv
index 38d9ecc2..ade4e310 100644
--- a/proxyshop/kv/creator.kv
+++ b/src/kv/creator.kv
@@ -1,6 +1,6 @@
#:import get_color_from_hex kivy.utils.get_color_from_hex
-#:import get_font proxyshop.gui.utils.get_font
-#:import HoverButton proxyshop.gui.utils.HoverButton
+#:import get_font src.gui.utils.get_font
+#:import HoverButton src.gui.utils.HoverButton
#:import Thread threading.Thread
:
@@ -28,7 +28,7 @@
id: mana_cost
hint_text: "{1}{W}{U}{B}{R}{G}"
multiline: False
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
padding: [6, self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 6, 0]
InputItem:
id: color_identity
@@ -36,7 +36,7 @@
size_hint_x: .5
multiline: False
halign: "center"
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
padding: [6, self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 6, 0]
BoxLayout:
orientation: "horizontal"
@@ -44,7 +44,7 @@
InputItem:
id: oracle_text
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "Rules text"
BoxLayout:
orientation: "horizontal"
@@ -52,7 +52,7 @@
InputItem:
id: flavor_text
font_size: 20
- font_name: get_font("MPlantin-Italic.ttf", "Roboto-Italic")
+ font_name: get_font("PlantinMTProRgIt.ttf", "Roboto-Italic")
hint_text: "Flavor text"
BoxLayout:
size_hint_y: .75
@@ -157,7 +157,7 @@
id: mana_cost
hint_text: "{1}{W}{U}{B}{R}{G}"
multiline: False
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
padding: [6, self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 6, 0]
InputItem:
id: color_identity
@@ -165,7 +165,7 @@
size_hint_x: .5
multiline: False
halign: "center"
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
padding: [6, self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 6, 0]
BoxLayout:
orientation: "horizontal"
@@ -173,7 +173,7 @@
NoEnterInputItem:
id: line_1
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "This is a static ability."
BoxLayout:
orientation: "horizontal"
@@ -182,7 +182,7 @@
NoEnterInputItem:
id: line_2
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "+1: This ability increases loyalty."
BoxLayout:
orientation: "horizontal"
@@ -190,7 +190,7 @@
NoEnterInputItem:
id: line_3
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "-1: This ability decreases loyalty."
BoxLayout:
orientation: "horizontal"
@@ -199,7 +199,7 @@
NoEnterInputItem:
id: line_4
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "0: Planeswalkers need at least 2 ability lines."
BoxLayout:
size_hint_y: .75
@@ -294,7 +294,7 @@
id: mana_cost
hint_text: "{1}{W}{U}{B}{R}{G}"
multiline: False
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
padding: [6, self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 6, 0]
InputItem:
id: color_identity
@@ -302,7 +302,7 @@
size_hint_x: .5
multiline: False
halign: "center"
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
padding: [6, self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 6, 0]
BoxLayout:
orientation: "horizontal"
@@ -310,7 +310,7 @@
NoEnterInputItem:
id: line_1
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "First line"
BoxLayout:
orientation: "horizontal"
@@ -319,7 +319,7 @@
NoEnterInputItem:
id: line_2
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "Second line"
BoxLayout:
orientation: "horizontal"
@@ -327,7 +327,7 @@
NoEnterInputItem:
id: line_3
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "Third line [optional]"
BoxLayout:
orientation: "horizontal"
@@ -336,7 +336,7 @@
NoEnterInputItem:
id: line_4
font_size: 20
- font_name: get_font("MPlantin.ttf")
+ font_name: get_font("PlantinMTProRg.ttf")
hint_text: "Fourth line [optional]"
BoxLayout:
size_hint_y: .75
diff --git a/proxyshop/kv/dev.kv b/src/kv/dev.kv
similarity index 100%
rename from proxyshop/kv/dev.kv
rename to src/kv/dev.kv
diff --git a/proxyshop/kv/proxyshop.kv b/src/kv/proxyshop.kv
similarity index 95%
rename from proxyshop/kv/proxyshop.kv
rename to src/kv/proxyshop.kv
index a08f9ea4..cde669b7 100644
--- a/proxyshop/kv/proxyshop.kv
+++ b/src/kv/proxyshop.kv
@@ -1,7 +1,7 @@
#:import get_color_from_hex kivy.utils.get_color_from_hex
-#:import HoverButton proxyshop.gui.utils.HoverButton
+#:import HoverButton src.gui.utils.HoverButton
#:import Thread threading.Thread
-#:import cfg proxyshop.settings.cfg
+#:import cfg src.settings.cfg
#:import ak asynckivy
#:import ScrollEffect kivy.effects.scroll.ScrollEffect
@@ -95,14 +95,14 @@
width: 0.735294117*preview_image.height if preview_image.height <=612 else 450
background_color: get_color_from_hex("#303030")
Image:
- source: 'proxyshop/img/NotFound.jpg'
+ source: 'src/img/NotFound.jpg'
id: preview_image
mipmap: True
keep_ratio: True
nocache: True
canvas:
Rectangle:
- source: "proxyshop/img/Overlay.png"
+ source: "src/img/Overlay.png"
size: preview_image.size
pos: preview_image.pos
BoxLayout:
diff --git a/proxyshop/kv/updater.kv b/src/kv/updater.kv
similarity index 96%
rename from proxyshop/kv/updater.kv
rename to src/kv/updater.kv
index ae14b988..1300e6fb 100644
--- a/proxyshop/kv/updater.kv
+++ b/src/kv/updater.kv
@@ -1,4 +1,4 @@
-#:import HoverButton proxyshop.gui.utils.HoverButton
+#:import HoverButton src.gui.utils.HoverButton
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import ScrollView kivy.uix.scrollview.ScrollView
#:import ak asynckivy
@@ -48,7 +48,7 @@
Image:
id: loading
mipmap: True
- source: "proxyshop/img/loading.gif"
+ source: "src/img/loading.gif"
allow_stretch: True
size_hint: 1, None
height: 180
diff --git a/proxyshop/layouts.py b/src/layouts.py
similarity index 77%
rename from proxyshop/layouts.py
rename to src/layouts.py
index a5bc6615..634ef99d 100644
--- a/proxyshop/layouts.py
+++ b/src/layouts.py
@@ -3,13 +3,13 @@
"""
import re
from functools import cached_property
-from typing import Optional, Match
+from typing import Optional, Match, Union, Type
-from proxyshop.constants import con
-from proxyshop.settings import cfg
-from proxyshop import scryfall as scry
-from proxyshop.frame_logic import select_frame_layers, FrameDetails
-from proxyshop.utils import normalize_str
+from src.constants import con
+from src.settings import cfg
+from src import scryfall as scry
+from src.frame_logic import select_frame_layers, FrameDetails
+from src.utils.strings import normalize_str
# Regex
leveler_regex = re.compile(
@@ -24,12 +24,17 @@ class NormalLayout:
"""
def __init__(self, scryfall: dict, file: dict):
- # Scryfall data
+ # settable properties
self.file = file
self.scryfall = scryfall
-
- # Settable properties
self.filename = self.file['filename']
+ self._template_path = ''
+
+ # Cache mtgset early
+ if self.mtgset:
+ print(f"{self.name}: Valid set data has been generated.")
+ else:
+ print(f"{self.name}: No set data was available.")
def __str__(self):
return "{} [{}]".format(self.name, self.set)
@@ -46,6 +51,14 @@ def filename(self) -> str:
def filename(self, value):
self._filename = value
+ @property
+ def template_path(self) -> str:
+ return self._template_path
+
+ @template_path.setter
+ def template_path(self, value: str):
+ self._template_path = value
+
"""
GAMEPLAY ITEMS
"""
@@ -65,14 +78,6 @@ def card(self) -> dict:
self.scryfall['front'] = True
return self.scryfall
- @cached_property
- def other_face(self) -> dict:
- if 'card_faces' in self.scryfall:
- if self.scryfall['card_faces'][0]['name'] == self.name_raw:
- return self.scryfall['card_faces'][1]
- return self.scryfall['card_faces'][0]
- return {}
-
@cached_property
def frame_effects(self) -> list:
return self.scryfall.get('frame_effects', [])
@@ -100,9 +105,9 @@ def oracle_text(self) -> str:
# Alt lang?
if self.lang != 'EN' and 'printed_text' in self.card:
return self.card['printed_text'].replace(
- "\u2212", "-") if 'Planeswalker' in self.type_line else self.card['printed_text']
+ "\u2212", "-") if 'Planeswalker' in self.type_line_raw else self.card['printed_text']
return self.card['oracle_text'].replace(
- "\u2212", "-") if 'Planeswalker' in self.type_line else self.card['oracle_text']
+ "\u2212", "-") if 'Planeswalker' in self.type_line_raw else self.card['oracle_text']
@cached_property
def oracle_text_raw(self) -> str:
@@ -138,10 +143,6 @@ def color_identity(self) -> list:
def color_indicator(self) -> str:
return self.card.get('color_indicator', None)
- @cached_property
- def transform_icon(self) -> Optional[str]:
- return
-
@cached_property
def loyalty(self) -> str:
return self.card.get('loyalty', None)
@@ -159,14 +160,20 @@ def scryfall_scan(self) -> Optional[str]:
@cached_property
def mtgset(self) -> dict:
- return scry.set_info(self.set.lower()) or {}
+ return scry.get_mtg_set(self.set) or {}
@cached_property
def set(self) -> str:
return self.scryfall['set'].upper()
@cached_property
- def rarity(self) -> str:
+ def rarity(self):
+ if self.rarity_raw not in ['common', 'uncommon', 'rare', 'mythic']:
+ return 'mythic'
+ return self.rarity_raw
+
+ @cached_property
+ def rarity_raw(self) -> str:
return self.scryfall['rarity']
@cached_property
@@ -181,23 +188,22 @@ def lang(self) -> str:
@cached_property
def card_count(self) -> Optional[str]:
- if 'printed_size' in self.scryfall and int(self.scryfall['printed_size']) >= int(self.collector_number):
- cc = self.scryfall['printed_size']
- elif 'baseSetSize' in self.mtgset and int(self.mtgset['baseSetSize']) >= int(self.collector_number):
- cc = self.mtgset['baseSetSize']
- elif 'totalSetSize' in self.mtgset and int(self.mtgset['totalSetSize']) >= int(self.collector_number):
- cc = self.mtgset['totalSetSize']
- elif 'card_count' in self.scryfall and int(self.scryfall['card_count']) >= int(self.collector_number):
- cc = self.scryfall['card_count']
- else:
+ # Get the lowest number
+ least = min(
+ int(self.mtgset.get('printed_size', 999999)),
+ int(self.mtgset.get('baseSetSize', 999999)),
+ int(self.mtgset.get('totalSetSize', 999999)),
+ int(self.mtgset.get('card_count', 999999))
+ )
+ if least < int(self.collector_number):
return
# Ensure formatting of count
- if len(str(cc)) == 2:
- return f"0{cc}"
- elif len(str(cc)) == 1:
- return f"00{cc}"
- return cc
+ if len(str(least)) == 2:
+ return f"0{least}"
+ elif len(str(least)) == 1:
+ return f"00{least}"
+ return str(least)
@cached_property
def collector_number(self) -> str:
@@ -240,19 +246,23 @@ def creator(self) -> str:
@cached_property
def symbol(self) -> str:
# Automatic set symbol enabled?
- if cfg.auto_symbol and self.set in con.set_symbols:
+ if not cfg.symbol_force_default and self.set in con.set_symbols:
sym = con.set_symbols[self.set]
# Check if this is a reference to another symbol
if isinstance(sym, str) and len(sym) > 1 and sym in con.set_symbols:
return con.set_symbols[sym]
return sym
- elif cfg.auto_symbol and self.set[1:] in con.set_symbols:
+ elif not cfg.symbol_force_default and self.set[1:] in con.set_symbols:
sym = con.set_symbols[self.set[1:]]
# Check if this is a reference to another symbol
if isinstance(sym, str) and len(sym) > 1 and sym in con.set_symbols:
return con.set_symbols[sym]
return sym
- return cfg.symbol_char
+ return con.set_symbols.get(cfg.symbol_default, con.set_symbols['MTG'])
+
+ @cached_property
+ def watermark(self) -> str:
+ return self.card.get('watermark')
"""
BOOL
@@ -282,6 +292,14 @@ def is_companion(self) -> bool:
def is_colorless(self) -> bool:
return self.frame['is_colorless']
+ @cached_property
+ def is_transform(self) -> bool:
+ return False
+
+ @cached_property
+ def is_mdfc(self) -> bool:
+ return False
+
"""
FRAME PROPERTIES
"""
@@ -302,12 +320,69 @@ def pinlines(self) -> str:
def background(self) -> str:
return self.frame['background']
+ """
+ DOUBLE FACE PROPERTIES
+ """
+
+ @cached_property
+ def other_face(self) -> dict:
+ if 'card_faces' in self.scryfall:
+ if self.scryfall['card_faces'][0]['name'] == self.name_raw:
+ return self.scryfall['card_faces'][1]
+ return self.scryfall['card_faces'][0]
+ return {}
+
+ @cached_property
+ def other_face_twins(self) -> Optional[str]:
+ if self.other_face:
+ return select_frame_layers(self.other_face)['twins']
+ return
+
+ @cached_property
+ def transform_icon(self) -> Optional[str]:
+ return
+
+ @cached_property
+ def other_face_power(self) -> Optional[str]:
+ return self.other_face.get('power', None)
+
+ @cached_property
+ def other_face_toughness(self) -> Optional[str]:
+ return self.other_face.get('toughness', None)
+
+ @cached_property
+ def other_face_left(self) -> Optional[str]:
+ if not self.other_face:
+ return
+ if self.lang != "EN" and 'printed_type_line' in self.other_face:
+ return self.other_face['printed_type_line'].split(" ")[-1]
+ return self.other_face['type_line'].split(" ")[-1]
+
+ @cached_property
+ def other_face_right(self) -> Optional[str]:
+ # Has another face?
+ if not self.other_face:
+ return
+
+ # Other face is not a land
+ if 'Land' not in self.other_face['type_line']:
+ return self.other_face.get('mana_cost')
+
+ # Other face is a land, find the mana tap ability
+ other_face_oracle_text_split = self.other_face.get('oracle_text', '').split("\n")
+ if len(other_face_oracle_text_split) > 1:
+ # Find what color mana this land adds
+ for line in other_face_oracle_text_split:
+ if line[0:3] == "{T}":
+ return line.split(".")[0] + "."
+ return self.other_face.get('oracle_text', '')
+
"""
TEMPLATE CLASS
"""
@cached_property
- def card_class(self) -> Optional[str]:
+ def card_class(self) -> str:
"""
Set the card's class (finer grained than layout). Used when selecting a template.
"""
@@ -331,12 +406,15 @@ class TransformLayout (NormalLayout):
"""
@cached_property
- def card_class(self):
+ def card_class(self) -> str:
# Planeswalker transform
if 'Planeswalker' in self.card['type_line']:
if self.card['front']:
return con.pw_tf_front_class
return con.pw_tf_back_class
+ # Saga transform
+ if 'Saga' in self.card['type_line']:
+ return con.saga_class
# Normal transform
if not self.card['front']:
# Is back face an Ixalan land?
@@ -346,16 +424,16 @@ def card_class(self):
return con.transform_front_class
"""
- Overwrite Properties
+ BOOL PROPERTIES
"""
@cached_property
- def other_face_power(self) -> Optional[str]:
- return self.other_face.get('power', None)
+ def is_transform(self) -> bool:
+ return True
- @cached_property
- def other_face_toughness(self) -> Optional[str]:
- return self.other_face.get('toughness', None)
+ """
+ OVERWRITE
+ """
@cached_property
def transform_icon(self) -> str:
@@ -363,7 +441,33 @@ def transform_icon(self) -> str:
if 'frame_effects' in self.scryfall:
if self.scryfall['frame_effects'][0] != "legendary":
return self.scryfall['frame_effects'][0]
- return 'land' if 'Land' in self.type_line else 'sunmoondfc'
+ return 'land' if 'Land' in self.type_line_raw else 'sunmoondfc'
+
+ """
+ SAGA
+ """
+
+ @cached_property
+ def saga_lines(self) -> list:
+ # Not a saga?
+ if 'Saga' not in self.type_line_raw:
+ return []
+ # Unpack oracle text into saga lines
+ abilities: list[dict] = []
+ for i, line in enumerate(self.oracle_text.split("\n")[1:]):
+ icons, text = line.split(" \u2014 ", 1)
+ abilities.append({
+ "text": text,
+ "icons": icons.split(", ")
+ })
+ return abilities
+
+ @cached_property
+ def saga_description(self) -> str:
+ # Not a saga?
+ if 'Saga' not in self.type_line_raw:
+ return ''
+ return self.oracle_text.split("\n")[0]
class MeldLayout (NormalLayout):
@@ -384,7 +488,15 @@ def card_class(self) -> str:
return con.transform_back_class
"""
- Overwrite Properties
+ BOOL PROPERTIES
+ """
+
+ @cached_property
+ def is_transform(self) -> bool:
+ return True
+
+ """
+ OVERWRITE
"""
@cached_property
@@ -403,19 +515,7 @@ def other_face(self) -> Optional[dict]:
for face in self.scryfall['faces']:
if face['component'] == 'meld_result':
return face
- return
-
- @cached_property
- def other_face_power(self) -> Optional[str]:
- if self.other_face:
- return self.other_face['power']
- return
-
- @cached_property
- def other_face_toughness(self) -> Optional[str]:
- if self.other_face:
- return self.other_face['toughness']
- return
+ return {}
@cached_property
def transform_icon(self) -> str:
@@ -444,7 +544,15 @@ def card_class(self) -> str:
return con.mdfc_back_class
"""
- Overwrite Properties
+ BOOL PROPERTIES
+ """
+
+ @cached_property
+ def is_mdfc(self) -> bool:
+ return True
+
+ """
+ OVERWRITE
"""
@cached_property
@@ -462,35 +570,7 @@ def oracle_text(self) -> Optional[str]:
text = self.card['oracle_text']
# Planeswalker?
- return text.replace("\u2212", "-") if 'Planeswalker' in self.type_line else text
-
- @cached_property
- def other_face_twins(self) -> str:
- return select_frame_layers(self.other_face)['twins']
-
- @cached_property
- def other_face_left(self) -> str:
- if self.lang != "EN" and 'printed_type_line' in self.other_face:
- return self.other_face['printed_type_line'].split(" ")[-1]
- return self.other_face['type_line'].split(" ")[-1]
-
- @cached_property
- def other_face_right(self) -> str:
- # Opposite card land info
- if 'Land' in self.other_face['type_line']:
- # other face is a land - right MDFC banner text should say what color of mana the land taps for
- other_face_oracle_text_split = self.other_face['oracle_text'].split("\n")
- other_face_mana_text = self.other_face['oracle_text']
- if len(other_face_oracle_text_split) > 1:
- # iterate over rules text lines until the line that adds mana is identified
- for i in other_face_oracle_text_split:
- if i[0:3] == "{T}":
- other_face_mana_text = i
- break
-
- # Truncate anything in the mana text after the first sentence
- return other_face_mana_text.split(".")[0] + "."
- return self.other_face['mana_cost']
+ return text.replace("\u2212", "-") if 'Planeswalker' in self.type_line_raw else text
@cached_property
def transform_icon(self) -> str:
@@ -644,16 +724,10 @@ class BasicLandLayout (NormalLayout):
"""
No special data entry, just a basic land
"""
- def __init__(self, file):
- # Imitate Scryfall data
- scryfall = {
- 'name': file['name'],
- 'artist': file['artist'] or "Unknown",
- 'set': file['set'].upper() or "MTG",
- 'rarity': 'common',
- 'collector_number': None,
- 'printed_count': None
- }
+ def __init__(self, scryfall: dict, file: dict):
+ # Add artist to Scryfall data
+ scryfall['artist'] = file['artist'] or 'Unknown'
+ scryfall['creator'] = file['creator'] or None
super().__init__(scryfall, file)
@property
@@ -706,8 +780,22 @@ def filename(self, value):
self._filename = value
+# Types
+CardLayout = Union[
+ NormalLayout,
+ TransformLayout,
+ ModalDoubleFacedLayout,
+ AdventureLayout,
+ LevelerLayout,
+ SagaLayout,
+ ClassLayout,
+ PlanarLayout,
+ MeldLayout,
+ BasicLandLayout
+]
+
# LAYOUT MAP
-layout_map = {
+layout_map: dict[str, Type[CardLayout]] = {
"normal": NormalLayout,
"transform": TransformLayout,
"modal_dfc": ModalDoubleFacedLayout,
@@ -716,5 +804,6 @@ def filename(self, value):
"saga": SagaLayout,
"class": ClassLayout,
"planar": PlanarLayout,
- "meld": MeldLayout
+ "meld": MeldLayout,
+ 'basic': BasicLandLayout
}
diff --git a/src/scryfall.py b/src/scryfall.py
new file mode 100644
index 00000000..a03ce9d8
--- /dev/null
+++ b/src/scryfall.py
@@ -0,0 +1,258 @@
+"""
+FUNCTIONS THAT INTERACT WITH SCRYFALL
+"""
+import os
+import time
+import json
+from shutil import copyfileobj
+
+import requests
+from typing import Optional, Union
+from urllib import parse
+
+from src.settings import cfg
+from src.constants import con
+from src.__console__ import console
+from src.utils.strings import msg_warn, normalize_str
+
+
+def card_info(
+ card_name: str,
+ card_set: Optional[str] = None
+) -> Union[dict, Exception, None]:
+ """
+ Fetch card data from Scryfall API.
+ @param card_name: Name of the card.
+ @param card_set: Set code of the card.
+ @return: Scryfall dict or Exception.
+ """
+ # Enforce Basic Land template?
+ if normalize_str(card_name, True) in con.basic_land_names and cfg.render_basic:
+ return basic_land_info(card_name, card_set)
+
+ # Alternate language
+ if cfg.lang != "en":
+ card = get_card_search(card_name, set_code=card_set, language=cfg.lang)
+ if isinstance(card, dict):
+ # Process card data
+ return process_scryfall_data(card)
+ elif not cfg.dev_mode:
+ # Language couldn't be found
+ console.update(msg_warn(f"Reverting to English: [b]{card_name}[/b]"))
+
+ # Query the card in English
+ card = get_card_search(card_name, set_code=card_set)
+ if isinstance(card, dict):
+ # Process card data
+ return process_scryfall_data(card)
+ return card
+
+
+def get_card_search(
+ name: str,
+ set_code: Optional[str] = None,
+ language: Optional[str] = None
+) -> Union[dict, Exception, None]:
+ """
+ Get card using cards/search scryfall API.
+ @param name: Name of the card, ex: Damnation
+ @param set_code: Set code to look for, ex: MH2
+ @param language: Lang code to look for, ex: en
+ @return: Card dict or exception
+ """
+ # Order, language, set code
+ order = "&order=released&dir=asc" if cfg.scry_ascending else ""
+ lang = f" lang:{language}" if language else ""
+ code = f"+set%3A{set_code}" if set_code else ""
+
+ # Query Scryfall, 3 retries
+ url = f'https://api.scryfall.com/cards/search?unique=prints' \
+ f'{order}&q=!"{parse.quote(name)}"{code} include:extras{lang}'
+ err = None
+ for i in range(3):
+ try:
+ card = requests.get(url, headers=con.http_header).json()
+ # Find the first playable result
+ for c in card['data']:
+ if check_playable_card(c):
+ return c
+ # No playable results
+ raise Exception("Could not find a playable card with this name!")
+ except Exception as e:
+ err = e
+ # Scryfall rate limit, 3 Retries
+ # https://scryfall.com/docs/api
+ time.sleep(0.5)
+ return err
+
+
+def get_mtg_set_mtgjson(set_code: str) -> dict:
+ """
+ Grab available set data from MTG Json.
+ @param set_code: The set to look for, ex: MH2
+ @return: MTGJson set dict or empty dict.
+ """
+ err = None
+ for i in range(3):
+ try:
+ # Grab from MTG JSON
+ source = requests.get(
+ f"https://mtgjson.com/api/v5/{set_code.upper()}.json",
+ headers=con.http_header
+ ).text
+ j = json.loads(source)['data']
+
+ # Minimize data stored
+ j.pop('cards', None)
+ j.pop('tokens', None)
+ j.pop('booster', None)
+ j.pop('sealedProduct', None)
+
+ # Return data if valid
+ return j if j.get('name') else {}
+ except Exception as e:
+ # Remote disconnected / invalid data
+ err = e
+ # Scryfall rate limit, 3 Retries
+ # https://scryfall.com/docs/api
+ time.sleep(0.05)
+ # Remote disconnected
+ console.log_exception(err)
+ return {}
+
+
+def get_mtg_set_scryfall(set_code: str) -> dict:
+ """
+ Grab available set data from MTG Json.
+ @param set_code: The set to look for, ex: MH2
+ @return: Scryfall set dict or empty dict.
+ """
+ err = None
+ for i in range(3):
+ try:
+ # Grab from MTG JSON
+ source = requests.get(
+ f"https://api.scryfall.com/sets/{set_code.upper()}",
+ headers=con.http_header
+ ).text
+ j = json.loads(source)
+
+ # Return data if valid
+ j['scryfall'] = True
+ return j if j.get('name') else {}
+ except Exception as e:
+ # Remote disconnected / invalid data
+ err = e
+ # Scryfall rate limit, 3 Retries
+ # https://scryfall.com/docs/api
+ time.sleep(0.05)
+ # Remote disconnected
+ console.log_exception(err)
+ return {}
+
+
+def get_mtg_set(set_code: str) -> Optional[dict]:
+ """
+ Grab available set data.
+ @param set_code: The set to look for, ex: MH2
+ @return: MTG set dict or empty dict.
+ """
+ # Has this set been logged?
+ filepath = os.path.join(con.path_data_sets, f"SET-{set_code.upper()}.json")
+ try:
+ if os.path.exists(filepath):
+ with open(filepath, "r", encoding="utf-8") as f:
+ loaded = json.load(f)
+ # Load if it has Scryfall data
+ if loaded.get('scryfall'):
+ return loaded
+ except Exception as e:
+ # Object couldn't be loaded
+ console.log_exception(e)
+
+ # Get set data
+ data_scry = get_mtg_set_scryfall(set_code)
+ data_mtg = get_mtg_set_mtgjson(set_code)
+ try:
+ # Save the data if both lookups were valid, or 'printed_size' is present
+ data_scry.update(data_mtg)
+ if (data_mtg and data_scry) or 'printed_size' in data_scry:
+ with open(filepath, "w", encoding="utf-8") as f:
+ json.dump(data_scry, f, sort_keys=True, ensure_ascii=False)
+ return data_scry
+ except Exception as e:
+ # Invalid data
+ console.log_exception(e)
+ return {}
+
+
+def card_scan(img_url: str) -> Optional[str]:
+ """
+ Downloads scryfall art from URL
+ @param img_url: Scryfall URI for image.
+ @return: Filename of the saved image, None if unsuccessful.
+ """
+ try:
+ r = requests.get(img_url, stream=True)
+ with open(con.scryfall_scan_path, 'wb') as f:
+ copyfileobj(r.raw, f)
+ return f.name
+ except Exception as e:
+ # HTTP request failed
+ print(e, "\nCouldn't retrieve scryfall image scan! Continuing without it.")
+ return
+
+
+def basic_land_info(card_name: str, set_code: Optional[str]) -> dict:
+ """
+ Generate fake Scryfall data from basic land.
+ @param card_name: Name of the basic land card.
+ @param set_code: Desired set code for the basic land.
+ @return: Fake scryfall data.
+ """
+ return {
+ 'name': card_name,
+ 'set': (set_code or 'MTG').upper(),
+ 'layout': 'basic',
+ 'rarity': 'common',
+ 'collector_number': None,
+ 'printed_count': None
+ }
+
+
+"""
+UTILITIES
+"""
+
+
+def check_playable_card(card_json: dict) -> bool:
+ """
+ Checks if this card object is a playable game piece.
+ @param card_json: Scryfall data for this card.
+ @return: Valid scryfall data if check passed, else None.
+ """
+ if card_json.get('set_type') != "memorabilia" or 'Championship' in card_json['set_name']:
+ return True
+ return False
+
+
+def process_scryfall_data(card_json: dict) -> dict:
+ """
+ Process any additional required data before sending it to the layout object.
+ @param card_json: Unprocessed scryfall data.
+ @return: Processed scryfall data.
+ """
+ # Lookup faces for Meld card
+ if card_json['layout'] == "meld":
+ # Add list of faces to the JSON data
+ card_json['faces'] = []
+ for part in card_json['all_parts']:
+ # Ignore tokens and other objects
+ if part['component'] in ('meld_part', 'meld_result'):
+ # Grab the card face data, add component type, insert it
+ data = requests.get(part["uri"], headers=con.http_header).json()
+ data['component'] = part['component']
+ card_json["faces"].append(data)
+
+ # Return updated data
+ return card_json
diff --git a/proxyshop/settings.py b/src/settings.py
similarity index 70%
rename from proxyshop/settings.py
rename to src/settings.py
index 90598653..073cfed2 100644
--- a/proxyshop/settings.py
+++ b/src/settings.py
@@ -1,12 +1,13 @@
"""
Process config file into global settings.
"""
-import configparser
import os
from typing import Optional
+from configparser import ConfigParser
-from proxyshop.constants import con
-from proxyshop.core import TemplateDetails
+from src.constants import con
+from src.core import TemplateDetails
+from src.utils.files import verify_config_fields
# For object permanence
@@ -47,12 +48,13 @@ def update_definitions(self):
self.flavor_divider = self.file.getboolean('TEXT', 'Flavor.Divider')
# SYMBOLS section
- self.symbol_char = self.file['SYMBOLS']['Default.Symbol']
- self.auto_symbol = self.file.getboolean('SYMBOLS', 'Auto.Set.Symbol')
- self.auto_symbol_size = self.file.getboolean('SYMBOLS', 'Auto.Symbol.Size')
+ self.symbol_mode = self.file['SYMBOLS']['Symbol.Mode']
+ self.symbol_default = self.file['SYMBOLS']['Default.Symbol']
+ self.symbol_force_default = self.file.getboolean('SYMBOLS', 'Force.Default.Symbol')
self.symbol_stroke = self.file['SYMBOLS']['Symbol.Stroke.Size']
- self.fill_symbol = self.file.getboolean('SYMBOLS', 'Fill.Symbol.Background')
- self.classic_expansion_symbol = self.file.getboolean('SYMBOLS', 'Classic.Symbol.Rendering')
+
+ # WATERMARKS section
+ self.enable_watermark = self.file.getboolean('WATERMARK', 'Enable.Watermark')
# APP section
self.exit_early = self.file.getboolean('APP', 'Manual.Edit')
@@ -64,6 +66,7 @@ def update_definitions(self):
# TEMPLATES section
self.render_snow = self.file.getboolean('TEMPLATES', 'Render.Snow')
self.render_miracle = self.file.getboolean('TEMPLATES', 'Render.Miracle')
+ self.render_basic = self.file.getboolean('TEMPLATES', 'Render.Basic')
def get_setting(self, section: str, key: str, default: Optional[str] = None, is_bool: bool = True):
"""
@@ -89,13 +92,21 @@ def load(self, template: Optional[TemplateDetails] = None):
if hasattr(self, 'file'):
del self.file
- # Choose the file
- conf = os.path.join(con.cwd, "config.ini")
- if template and os.path.exists(template['config_path'].replace('json', 'ini')):
- conf = template['config_path'].replace('json', 'ini')
+ # Check if we're using a template ini file
+ template_ini = template['config_path'].replace('json', 'ini').replace('Back', 'Front') if template else None
+ template_json = template['config_path'].replace('Back', 'Front') if template else None
+ if template_ini and os.path.exists(template_ini) and not self.dev_mode:
+ conf = template_ini
+ else:
+ conf = os.path.join(con.cwd, "config.ini")
+
+ # Validate the ini file's contents
+ verify_config_fields(conf, con.path_config_json)
+ if template_ini and os.path.exists(template_ini) and not self.dev_mode:
+ verify_config_fields(conf, template_json)
# Load necessary file
- self.file = configparser.ConfigParser(allow_no_value=True)
+ self.file = ConfigParser(allow_no_value=True)
self.file.optionxform = str
with open(conf, encoding="utf-8") as f:
self.file.read_file(f)
diff --git a/proxyshop/templates.py b/src/templates.py
similarity index 72%
rename from proxyshop/templates.py
rename to src/templates.py
index 1e4d6cd9..cca26d31 100644
--- a/proxyshop/templates.py
+++ b/src/templates.py
@@ -1,23 +1,26 @@
"""
CORE TEMPLATES
"""
-import os
import re
+import os.path as osp
from functools import cached_property
from typing import Optional, Callable
from PIL import Image
+from photoshop.api import PhotoshopPythonAPIError
from photoshop.api.application import ArtLayer, Photoshop
from photoshop.api._layerSet import LayerSet
-
-from proxyshop.frame_logic import format_expansion_symbol_info
-import proxyshop.text_layers as text_classes
-import proxyshop.format_text as ft
-from proxyshop.constants import con
-from proxyshop.settings import cfg
-import proxyshop.helpers as psd
from photoshop import api as ps
-from proxyshop.__console__ import console
+
+from src.frame_logic import format_expansion_symbol_info
+import src.text_layers as text_classes
+import src.format_text as ft
+from src.constants import con
+from src.layouts import CardLayout
+from src.settings import cfg
+import src.helpers as psd
+from src.__console__ import console
+from src.utils.enums_photoshop import Alignment
class BaseTemplate:
@@ -27,12 +30,11 @@ class BaseTemplate:
template_file_name = ""
template_suffix = ""
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
# Setup manual properties
self.layout = layout
self.tx_layers = []
- self.exp_sym = None
# Load PSD file
try:
@@ -51,6 +53,10 @@ def __init__(self, layout):
if cfg.remove_reminder:
self.layout.oracle_text = ft.strip_reminder_text(layout.oracle_text)
+ def invalidate(self, prop: str):
+ # Invalidates a cached property, so it will be computed at next use
+ self.__dict__.pop(prop, None)
+
"""
BOOL
"""
@@ -90,14 +96,24 @@ def is_front(self) -> bool:
# Which side influences mdfc and transform
return self.layout.card['front']
+ @property
+ def is_transform(self) -> bool:
+ # Is this a transform card?
+ return self.layout.is_transform
+
+ @property
+ def is_mdfc(self) -> bool:
+ # Is this a transform card?
+ return self.layout.is_mdfc
+
@property
def name_shifted(self) -> bool:
# Use right shifted name?
- return bool(self.layout.transform_icon)
+ return bool(self.is_transform or self.is_mdfc)
@property
def type_line_shifted(self) -> bool:
- # Use right shifted typeline? Also governs color indicator input
+ # Use right shifted Type line?
return bool(self.layout.color_indicator)
@cached_property
@@ -112,7 +128,7 @@ def is_centered(self) -> bool:
@cached_property
def other_face_is_creature(self) -> bool:
# Governs transform cards other side creature P/T
- return self.layout.other_face_power and self.layout.other_face_toughness
+ return bool(self.layout.other_face_power and self.layout.other_face_toughness)
"""
DOCUMENT PROPERTIES
@@ -124,17 +140,10 @@ def app(self) -> Photoshop:
@cached_property
def template_file(self) -> str:
- # Get from callable
- if callable(self.template_file_name):
- fn = self.template_file_name()
- if fn[-4:] not in (".psd", ".psb"):
- return f"{fn}.psd"
- return fn
- # Get from attribute
- fn = self.template_file_name
- if fn[-4:] not in (".psd", ".psb"):
- return f"{fn}.psd"
- return fn
+ # Add extension if missing
+ if self.template_file_name[-4:] not in (".psd", ".psb"):
+ return f"{self.template_file_name}.psd"
+ return self.template_file_name
@cached_property
def docref(self):
@@ -176,22 +185,22 @@ def art_reference_layer(self) -> ArtLayer:
layer = self.art_reference
else:
# Art reference given as a string
- layer = psd.getLayer(self.art_reference)
- if not layer:
- psd.getLayer(con.layers.ART_FRAME)
+ layer = psd.getLayer(self.art_reference) or psd.getLayer(con.layers.ART_FRAME)
- # Check if we can change to fullart reference
+ # Is the reference already Full Art?
if not any(map(str(layer.name).__contains__, ["Full Art", "Fullart"])):
- # Auto detect full art image
+ # Check if we have a Full Art image
with Image.open(self.layout.filename) as image:
width, height = image.size
if height > (width * 1.2):
# Use "Full Art" frame if available
- fa_frame = psd.getLayer(con.layers.FULL_ART_FRAME)
- if fa_frame:
- return fa_frame
+ return psd.getLayer(con.layers.FULL_ART_FRAME) or layer
return layer
+ @cached_property
+ def border_color(self) -> str:
+ return cfg.get_setting('TEMPLATES', 'Border.Color', default='black', is_bool=False)
+
"""
LIST OF FORMATTED TEXT OBJECTS
"""
@@ -207,23 +216,37 @@ def text(self, value):
self.tx_layers = value
"""
- TEXT LAYERS
+ LAYER GROUPS
"""
@cached_property
- def legal_layer(self) -> Optional[LayerSet]:
+ def legal_group(self) -> Optional[LayerSet]:
# Legal group
- return psd.getLayerSet(con.layers.LEGAL)
+ return self.docref.layerSets.getByName(con.layers.LEGAL)
@cached_property
- def creator_layer(self) -> Optional[ArtLayer]:
- # Creator name layer
- return psd.getLayer("Creator", self.legal_layer)
+ def border_group(self) -> Optional[LayerSet]:
+ # Border group
+ return self.docref.layerSets.getByName(con.layers.BORDER)
@cached_property
def text_layers(self) -> Optional[LayerSet]:
# Text and icon group
- return psd.getLayerSet(con.layers.TEXT_AND_ICONS)
+ return self.docref.layerSets.getByName(con.layers.TEXT_AND_ICONS)
+
+ @cached_property
+ def dfc_group(self) -> Optional[LayerSet]:
+ # Double face layer group
+ return psd.getLayerSet(self.face_type, self.text_layers)
+
+ """
+ TEXT LAYERS
+ """
+
+ @cached_property
+ def text_layer_creator(self) -> Optional[ArtLayer]:
+ # Creator name layer
+ return psd.getLayer("Creator", self.legal_group)
@cached_property
def text_layer_name(self) -> Optional[ArtLayer]:
@@ -267,18 +290,22 @@ def text_layer_pt(self) -> Optional[ArtLayer]:
# CARD POWER/TOUGHNESS
return psd.getLayer(con.layers.POWER_TOUGHNESS, self.text_layers)
+ @cached_property
+ def divider_layer(self) -> Optional[ArtLayer]:
+ # Shorter flavor divider if flipside P/T is present
+ if self.is_transform and self.is_front and self.other_face_is_creature:
+ if TF_DIVIDER := psd.getLayer('Divider TF', self.text_layers):
+ return TF_DIVIDER
+ return psd.getLayer(con.layers.DIVIDER, self.text_layers)
+
"""
- FRAME LAYERS
+ FRAME DETAILS
"""
- @cached_property
- def symbol(self) -> str:
- # Expansion symbol
- return self.layout.symbol
-
@cached_property
def twins(self) -> str:
# Name of the Twins layer
+ # Also corresponds to PT Box typically
return self.layout.twins
@cached_property
@@ -291,6 +318,24 @@ def background(self) -> str:
# Name of the Background layer
return self.layout.background
+ @cached_property
+ def face_type(self) -> Optional[str]:
+ # MDFC face type
+ if self.is_mdfc:
+ if self.is_front:
+ return con.layers.MDFC_FRONT
+ return con.layers.MDFC_BACK
+ # Transform face type
+ if self.is_transform:
+ if self.is_front:
+ return con.layers.TF_FRONT
+ return con.layers.TF_BACK
+ return
+
+ """
+ FRAME LAYERS
+ """
+
@cached_property
def twins_layer(self) -> Optional[ArtLayer]:
# Twins
@@ -315,6 +360,10 @@ def color_indicator_layer(self) -> Optional[ArtLayer]:
# Color Indicator
return psd.getLayer(self.pinlines, con.layers.COLOR_INDICATOR)
+ @cached_property
+ def transform_icon(self) -> Optional[ArtLayer]:
+ return psd.getLayer(self.layout.transform_icon, self.dfc_group)
+
@cached_property
def crown_layer(self) -> Optional[ArtLayer]:
# Legendary Crown
@@ -330,14 +379,40 @@ def companion_layer(self) -> Optional[ArtLayer]:
# Companion inner crown
return psd.getLayer(self.pinlines, con.layers.COMPANION)
+ """
+ REFERENCE LAYERS
+ """
+
+ @cached_property
+ def textbox_reference(self) -> Optional[ArtLayer]:
+ return psd.getLayer(con.layers.TEXTBOX_REFERENCE, self.text_layers)
+
+ """
+ EXPANSION SYMBOL PROPERTIES
+ """
+
+ @property
+ def expansion_symbol_anchor(self) -> ps.AnchorPosition:
+ return ps.AnchorPosition.MiddleRight
+
@property
- def expansion_symbol(self) -> Optional[ArtLayer]:
- # CARD EXPANSION SYMBOL
- return self.exp_sym
+ def expansion_symbol_alignments(self) -> list[Alignment]:
+ return [Alignment.CenterVertical, Alignment.Right]
- @expansion_symbol.setter
- def expansion_symbol(self, value):
- self.exp_sym = value
+ @cached_property
+ def expansion_gradient_layer(self):
+ # Expansion symbol rarity gradient layer
+ return psd.getLayer(self.layout.rarity, self.text_layers)
+
+ @cached_property
+ def expansion_reference_layer(self):
+ # Expansion symbol reference layer
+ return psd.getLayer(con.layers.EXPANSION_REFERENCE, self.text_layers)
+
+ @cached_property
+ def expansion_symbol_layer(self) -> Optional[ArtLayer]:
+ # Expansion symbol layer
+ return psd.getLayer(con.layers.EXPANSION_SYMBOL, self.text_layers)
"""
METHODS
@@ -348,111 +423,134 @@ def collector_info(self) -> None:
Format and add the collector info at the bottom.
"""
# Ignore this step if legal layer not present
- if not self.legal_layer:
+ if not self.legal_group:
return
# If creator is specified add the text
- if self.layout.creator and self.creator_layer:
- self.creator_layer.textItem.contents = self.layout.creator
+ if self.layout.creator and self.text_layer_creator:
+ self.text_layer_creator.textItem.contents = self.layout.creator
# Use realistic collector information?
if all([self.layout.collector_number, self.layout.rarity, cfg.real_collector]):
-
- # Reveal collector group, hide classic layers
- collector_group = psd.getLayerSet(con.layers.COLLECTOR, con.layers.LEGAL)
- collector_group.visible = True
- psd.getLayer("Artist", self.legal_layer).visible = False
- psd.getLayer("Set", self.legal_layer).visible = False
- if pen_layer := psd.getLayer("Pen", self.legal_layer):
- pen_layer.visible = False
-
- # Get the collector layers
- collector_top = psd.getLayer(con.layers.TOP_LINE, collector_group).textItem
- collector_bottom = psd.getLayer(con.layers.BOTTOM_LINE, collector_group)
-
- # Fill in language if needed
- if self.layout.lang != "en":
- psd.replace_text(collector_bottom, "EN", self.layout.lang.upper())
-
- # Apply the collector info
- collector_top.contents = self.layout.collector_info_top
- psd.replace_text(collector_bottom, "SET", self.layout.set)
- psd.replace_text(collector_bottom, "Artist", self.layout.artist)
-
+ self.collector_info_authentic()
else:
+ self.collector_info_basic()
- # Layers we need
- set_layer = psd.getLayer("Set", self.legal_layer)
- artist_layer = psd.getLayer(con.layers.ARTIST, self.legal_layer)
-
- # Fill in language if needed
- if self.layout.lang != "en":
- psd.replace_text(set_layer, "EN", self.layout.lang.upper())
-
- # Fill set info / artist info
- set_layer.textItem.contents = self.layout.set + set_layer.textItem.contents
- psd.replace_text(artist_layer, "Artist", self.layout.artist)
-
- # Generate the expansion symbol
- if cfg.classic_expansion_symbol:
- self.create_expansion_symbol_classic()
- else:
- self.create_expansion_symbol()
-
- @property
- def expansion_symbol_anchor(self) -> ps.AnchorPosition:
- return ps.AnchorPosition.MiddleRight
-
- def create_expansion_symbol(self, centered: bool = False) -> None:
+ def collector_info_basic(self):
+ """
+ Called to generate basic collector info.
+ """
+ # Layers we need
+ set_layer = psd.getLayer("Set", self.legal_group)
+ artist_layer = psd.getLayer(con.layers.ARTIST, self.legal_group)
+ if self.border_color != 'black':
+ set_layer.textItem.color = psd.rgb_black()
+ artist_layer.textItem.color = psd.rgb_black()
+
+ # Fill in language if needed
+ if self.layout.lang != "en":
+ psd.replace_text(set_layer, "EN", self.layout.lang.upper())
+
+ # Fill set info / artist info
+ set_layer.textItem.contents = self.layout.set + set_layer.textItem.contents
+ psd.replace_text(artist_layer, "Artist", self.layout.artist)
+
+ def collector_info_authentic(self):
"""
- Builds the expansion symbol
- @param centered: Center the symbol within its reference.
+ Called to generate realistic collector info.
"""
- # Starting symbol, reference, and rarity layers
- symbol_layer = psd.getLayer(con.layers.EXPANSION_SYMBOL, self.text_layers)
- ref_layer = psd.getLayer(con.layers.EXPANSION_REFERENCE, self.text_layers)
- psd.clear_layer_style(symbol_layer)
- current_layer = symbol_layer
+ # Reveal collector group, hide classic layers
+ collector_group = psd.getLayerSet(con.layers.COLLECTOR, con.layers.LEGAL)
+ collector_group.visible = True
+ psd.getLayer("Artist", self.legal_group).visible = False
+ psd.getLayer("Set", self.legal_group).visible = False
+ if pen_layer := psd.getLayer("Pen", self.legal_group):
+ pen_layer.visible = False
+
+ # Get the collector layers
+ collector_top = psd.getLayer(con.layers.TOP_LINE, collector_group).textItem
+ collector_bottom = psd.getLayer(con.layers.BOTTOM_LINE, collector_group)
+ if self.border_color != 'black':
+ collector_top.color = psd.rgb_black()
+ collector_bottom.textItem.color = psd.rgb_black()
+
+ # Fill in language if needed
+ if self.layout.lang != "en":
+ psd.replace_text(collector_bottom, "EN", self.layout.lang.upper())
+
+ # Apply the collector info
+ collector_top.contents = self.layout.collector_info_top
+ psd.replace_text(collector_bottom, "SET", self.layout.set)
+ psd.replace_text(collector_bottom, "Artist", self.layout.artist)
+
+ def expansion_symbol(self) -> None:
+ """
+ Builds the user's preferred type of expansion symbol.
+ """
+ if cfg.symbol_mode not in ['default', 'classic', 'svg']:
+ self.expansion_symbol_layer.textItem.contents = ''
+ return
- # Put everything in a group
+ # Create a group for generated layers, clear style
group = self.app.activeDocument.layerSets.add()
- group.move(current_layer, ps.ElementPlacement.PlaceAfter)
- symbol_layer.move(group, ps.ElementPlacement.PlaceInside)
-
+ group.move(self.expansion_symbol_layer, ps.ElementPlacement.PlaceAfter)
+ psd.clear_layer_style(self.expansion_symbol_layer)
+
+ # Call the necessary creator
+ if cfg.symbol_mode == 'default':
+ self.create_expansion_symbol(group)
+ elif cfg.symbol_mode == 'classic':
+ self.create_expansion_symbol_classic(group)
+ elif cfg.symbol_mode == 'svg':
+ self.create_expansion_symbol_svg(group)
+
+ # Merge and refresh cache
+ group.merge().name = "Expansion Symbol"
+ self.expansion_symbol_layer.name = "Expansion Symbol Old"
+ self.expansion_symbol_layer.opacity = 0
+ self.invalidate('expansion_symbol_layer')
+
+ def create_expansion_symbol(self, group: LayerSet) -> None:
+ """
+ Builds the expansion symbol using the newer layer effects methodology.
+ @param group: The LayerSet to add generated layers to.
+ """
# Set the starting character and format our layer array
- if self.layout.rarity not in ['common', 'uncommon', 'rare', 'mythic']:
- self.layout.rarity = 'mythic'
- symbol_layer.textItem.contents, symbols = psd.process_expansion_symbol_info(
+ self.expansion_symbol_layer.textItem.contents, symbols = psd.process_expansion_symbol_info(
self.layout.symbol, self.layout.rarity.lower()
)
- # Size to fit reference?
- if cfg.auto_symbol_size:
- psd.frame_layer(symbol_layer, ref_layer, self.expansion_symbol_anchor, True, centered)
+ # Size to fit reference
+ psd.frame_layer(
+ self.expansion_symbol_layer,
+ self.expansion_reference_layer,
+ smallest=True,
+ anchor=self.expansion_symbol_anchor,
+ alignments=self.expansion_symbol_alignments
+ )
# Create each symbol layer
for i, lay in enumerate(symbols):
# Establish new current layer
- current_layer = symbol_layer.duplicate(current_layer, ps.ElementPlacement.PlaceAfter)
+ current_layer = self.expansion_symbol_layer.duplicate(group, ps.ElementPlacement.PlaceAtEnd)
current_layer.textItem.contents = lay['char']
self.active_layer = current_layer
- layer_fx = []
- fill_layer = None
+ layer_fx, fill_layer = [], None
# Change font color
- if 'color' in lay:
+ if lay.get('color'):
current_layer.textItem.color = lay['color']
# Stroke fx
- if 'stroke' in lay:
+ if lay.get('stroke'):
layer_fx.append(lay['stroke'])
# Rarity gradient overlay fx
- if lay.get('rarity') and 'gradient' in lay:
+ if lay.get('rarity') and lay.get('gradient'):
layer_fx.append(lay['gradient'])
# Drop shadow fx
- if 'drop-shadow' in lay:
+ if lay.get('drop-shadow'):
layer_fx.append(lay['drop-shadow'])
# Apply layer FX
@@ -460,12 +558,12 @@ def create_expansion_symbol(self, centered: bool = False) -> None:
psd.apply_fx(current_layer, layer_fx)
# Rarity background fill
- if lay.get('fill') == 'rarity' and 'gradient' in lay:
+ if lay.get('fill') == 'rarity' and lay.get('gradient'):
# Apply fill before rarity
psd.rasterize_layer_style(current_layer)
fill_layer = psd.fill_expansion_symbol(current_layer, psd.rgb_black())
psd.apply_fx(fill_layer, [lay['gradient']])
- elif 'fill' in lay:
+ elif lay.get('fill'):
psd.rasterize_layer_style(current_layer)
fill_layer = psd.fill_expansion_symbol(current_layer, lay['fill'])
@@ -474,59 +572,41 @@ def create_expansion_symbol(self, centered: bool = False) -> None:
current_layer = psd.merge_layers([current_layer, fill_layer])
# Scale factor
- if 'scale' in lay:
- current_layer.resize(lay['scale']*100, lay['scale']*100, ps.AnchorPosition.MiddleRight)
-
- # Merge all
- symbol_layer.move(group, ps.ElementPlacement.PlaceBefore)
- symbol_layer.name = "Expansion Symbol Old"
- symbol_layer.opacity = 0
- self.expansion_symbol = group.merge()
- self.expansion_symbol.name = "Expansion Symbol"
+ if lay.get('scale'):
+ current_layer.resize(lay['scale']*100, lay['scale']*100, self.expansion_symbol_anchor)
- def create_expansion_symbol_classic(self, centered: bool = False) -> None:
+ def create_expansion_symbol_classic(self, group: LayerSet) -> None:
"""
- Builds the expansion symbol
- NOTE: Will be deprecated in the future!
- @param centered: Center the symbol within its reference.
+ Builds the expansion symbol using the classic method that uses gradient layers.
+ Falls back on default mode if gradient layers aren't present.
+ @param group: The LayerSet to add generated layers to.
"""
- # Colors to use for given settings
- colors = {
- "black": psd.rgb_black(),
- "white": psd.rgb_white(),
- "rarity": psd.rgb_black(),
- }
-
- # Starting rarity layer
- rarity = self.layout.rarity
- if self.layout.rarity in (con.rarity_bonus, con.rarity_special):
- rarity = con.rarity_mythic
-
- # Starting symbol, reference, and rarity layers
- symbol_layer = psd.getLayer(con.layers.EXPANSION_SYMBOL, self.text_layers)
- ref_layer = psd.getLayer(con.layers.EXPANSION_REFERENCE, self.text_layers)
- rarity_layer = psd.getLayer(rarity, self.text_layers)
- current_layer = symbol_layer
-
- # Put everything in a group
- group = self.app.activeDocument.layerSets.add()
- group.move(current_layer, ps.ElementPlacement.PlaceAfter)
- symbol_layer.move(group, ps.ElementPlacement.PlaceInside)
+ # Check if the gradient layer is available
+ if not self.expansion_gradient_layer and self.layout.rarity != 'common':
+ self.create_expansion_symbol(group)
+ return
# Set the starting character and format our layer array
- symbol_layer.textItem.contents, symbols = format_expansion_symbol_info(self.layout.symbol)
+ self.expansion_symbol_layer.textItem.contents, symbols = format_expansion_symbol_info(
+ self.layout.symbol, self.layout.rarity
+ )
- # Size to fit reference?
- if cfg.auto_symbol_size:
- psd.frame_layer(symbol_layer, ref_layer, self.expansion_symbol_anchor, True, centered)
+ # Size to fit reference
+ psd.frame_layer(
+ self.expansion_symbol_layer,
+ self.expansion_reference_layer,
+ smallest=True,
+ anchor=self.expansion_symbol_anchor,
+ alignments=self.expansion_symbol_alignments
+ )
def apply_rarity(layer) -> ArtLayer:
# Apply rarity gradient to this layer
- mask_layer = rarity_layer.duplicate(layer, ps.ElementPlacement.PlaceBefore)
+ mask_layer = self.expansion_gradient_layer.duplicate(layer, ps.ElementPlacement.PlaceBefore)
mask_layer.grouped = True
mask_layer.visible = True
psd.select_layer_bounds(layer)
- self.app.activeDocument.activeLayer = mask_layer
+ self.activeLayer = mask_layer
psd.align_horizontal()
psd.align_vertical()
psd.clear_selection()
@@ -536,86 +616,127 @@ def apply_rarity(layer) -> ArtLayer:
def apply_fill(layer, color=psd.rgb_black()):
# Make active and fill background
self.app.activeDocument.activeLayer = layer
- return psd.fill_expansion_symbol(ref_layer, color)
-
- def get_color_choice(color):
- # Figure out what color to use
- if isinstance(color, str) and color in colors:
- return colors[color]
- if isinstance(color, list) and len(color) == 3:
- return psd.get_rgb(color[0], color[1], color[2])
- if isinstance(color, list) and len(color) == 4:
- return psd.get_cmyk(color[0], color[1], color[2], color[3])
- return colors['black']
+ return psd.fill_expansion_symbol(self.expansion_reference_layer, color)
# Create each symbol layer
for i, lay in enumerate(symbols):
# Establish new current layer
- current_layer = symbol_layer.duplicate(current_layer, ps.ElementPlacement.PlaceAfter)
+ current_layer = self.expansion_symbol_layer.duplicate(group, ps.ElementPlacement.PlaceAtEnd)
current_layer.textItem.contents = lay['char']
- # Non-common or Common traits
- if rarity != con.rarity_common:
- # Color replace
- if lay['color']:
- current_layer.textItem.color = get_color_choice(lay['color'])
+ # Color replace
+ if lay.get('color'):
+ current_layer.textItem.color = psd.get_color(lay['color'])
- # Stroke
- if lay['stroke']:
- psd.apply_stroke(current_layer, lay['stroke'][1], get_color_choice(lay['stroke'][0]))
- else:
- psd.clear_layer_style(current_layer)
-
- # Apply background fill
- if lay['fill'] == 'rarity':
- # Apply fill before rarity
- psd.rasterize_layer_style(current_layer)
- fill_layer = apply_fill(current_layer, get_color_choice(lay['fill']))
- fill_layer = apply_rarity(fill_layer)
- current_layer = psd.merge_layers([current_layer, fill_layer])
- else:
- # Apply fill after rarity
- if lay['rarity']:
- current_layer = apply_rarity(current_layer)
- psd.rasterize_layer_style(current_layer)
- if lay['fill']:
- fill_layer = apply_fill(current_layer, get_color_choice(lay['fill']))
- current_layer = psd.merge_layers([current_layer, fill_layer])
+ # Stroke
+ if lay.get('stroke'):
+ psd.apply_fx(current_layer, [psd.format_symbol_fx_stroke(lay['stroke'])])
+ # Apply background fill
+ if lay.get('rarity') and lay.get('fill') == 'rarity':
+ # Apply fill before rarity
+ psd.rasterize_layer_style(current_layer)
+ fill_layer = apply_fill(current_layer, psd.rgb_black())
+ fill_layer = apply_rarity(fill_layer)
+ current_layer = psd.merge_layers([current_layer, fill_layer])
else:
- # Common color
- if lay['common-color']:
- current_layer.textItem.color = get_color_choice(lay['common-color'])
-
- # Common stroke
- if lay['common-stroke']:
- psd.apply_stroke(current_layer, lay['common-stroke'][1], get_color_choice(lay['common-stroke'][0]))
- else:
- psd.clear_layer_style(current_layer)
-
- # Common fill
+ # Apply fill after rarity
+ if lay.get('rarity'):
+ current_layer = apply_rarity(current_layer)
psd.rasterize_layer_style(current_layer)
- if lay['common-fill']:
- fill_layer = apply_fill(current_layer, get_color_choice(lay['common-fill']))
+ if lay.get('fill'):
+ fill_layer = apply_fill(current_layer, psd.get_color(lay['fill']))
current_layer = psd.merge_layers([current_layer, fill_layer])
# Scale factor
- if lay['scale-factor'] != 1:
- current_layer.resize(lay['scale-factor']*100, lay['scale-factor']*100, ps.AnchorPosition.MiddleRight)
+ if lay.get('scale', 1) != 1:
+ current_layer.resize(lay['factor']*100, lay['scale']*100, self.expansion_symbol_anchor)
+
+ def create_expansion_symbol_svg(self, group: LayerSet) -> None:
+ """
+ Creates an expansion symbol using SVG library. Falls back on default mode if SVG not available.
+ @param group: The LayerSet to add generated layers to.
+ """
+ # Check if the SVG exists
+ svg_path = osp.join(con.path_img, f'symbols/{self.layout.set}/{self.layout.rarity.upper()[0]}.svg')
+ if not osp.exists(svg_path):
+ self.create_expansion_symbol(group)
+
+ # Import the SVG and place it correctly
+ svg = psd.import_svg(svg_path)
+ svg.move(group, ps.ElementPlacement.PlaceInside)
+
+ # Size to fit reference?
+ psd.frame_layer(
+ svg,
+ self.expansion_reference_layer,
+ smallest=True,
+ anchor=self.expansion_symbol_anchor,
+ alignments=self.expansion_symbol_alignments
+ )
+
+ # Adjust size up slightly to account for missing outline
+ svg.resize(108, 108, ps.AnchorPosition.MiddleCenter)
- # Merge all
- symbol_layer.move(group, ps.ElementPlacement.PlaceBefore)
- symbol_layer.name = "Expansion Symbol Old"
- symbol_layer.opacity = 0
- self.expansion_symbol = group.merge()
- self.expansion_symbol.name = "Expansion Symbol"
+ def create_watermark(self) -> None:
+ """
+ Builds the watermark.
+ """
+ # Is the watermark from Scryfall supported?
+ wm_path = osp.join(con.path_img, f"watermarks/{self.layout.watermark}.svg")
+ if not self.layout.watermark or not osp.exists(wm_path):
+ return
+
+ # Decide what colors to use
+ colors = []
+ if len(self.pinlines) == 2:
+ colors.extend([con.watermark_colors[c] for c in self.pinlines if c in con.watermark_colors])
+ elif self.pinlines in con.watermark_colors:
+ colors.append(con.watermark_colors[self.pinlines])
+
+ # Check for valid reference, valid colors, valid text layers group for placement
+ if not self.textbox_reference or not colors or not self.text_layers:
+ return
+
+ # Get watermark custom settings if available
+ wm_details = con.watermarks.get(self.layout.watermark, {})
+
+ # Generate the watermark
+ wm = psd.import_svg(wm_path)
+ psd.frame_layer(wm, self.textbox_reference, True)
+ wm.resize(
+ wm_details.get('scale', 80),
+ wm_details.get('scale', 80),
+ ps.AnchorPosition.MiddleCenter)
+ wm.move(self.text_layers, ps.ElementPlacement.PlaceAfter)
+ wm.blendMode = ps.BlendMode.ColorBurn
+ wm.opacity = wm_details.get('opacity', 40)
+
+ # Add the colors
+ fx = []
+ if len(colors) == 1:
+ fx.append({
+ 'type': 'color-overlay',
+ 'opacity': 100,
+ 'color': psd.get_color(colors[0])
+ })
+ elif len(colors) == 2:
+ fx.append({
+ 'type': 'gradient-overlay',
+ 'rotation': 0,
+ 'colors': [
+ {'color': colors[0], 'location': 0, 'midpoint': 50},
+ {'color': colors[1], 'location': 4096, 'midpoint': 50}
+ ]
+ })
+ psd.apply_fx(wm, fx)
def load_template(self) -> None:
"""
Opens the template's PSD file in Photoshop.
"""
# Create our full path and load it, set our document reference
- self.app.load(os.path.join(con.cwd, f"templates\\{self.template_file}"))
+ self.app.load(osp.join(self.layout.template_path, f"{self.template_file}"))
def load_artwork(self) -> None:
"""
@@ -627,7 +748,7 @@ def load_artwork(self) -> None:
dims = psd.get_layer_dimensions(self.art_reference_layer)
if (dims['width'] * 1.2) < dims['height']:
# Use fullart test image
- self.layout.filename = os.path.join(con.cwd, "proxyshop/img/test-fa.png")
+ self.layout.filename = osp.join(con.path_img, "test-fa.png")
# Paste the file into the art
self.active_layer = self.art_layer
@@ -653,7 +774,7 @@ def get_file_name(self) -> str:
# Check if name already exists
if not cfg.overwrite_duplicate:
num = 0
- while os.path.exists(os.path.join(con.cwd, f"out/{name}.{cfg.output_filetype}")):
+ while osp.exists(osp.join(con.cwd, f"out/{name}.{cfg.output_filetype}")):
num += 1
if ")" not in name:
name = f'{name} (1)'
@@ -717,7 +838,7 @@ def reset(self) -> None:
"""
Reset the document, purge the cache, end await.
"""
- psd.reset_document(self.template_file)
+ psd.reset_document()
self.app.purge(4)
console.end_await()
@@ -735,6 +856,22 @@ def raise_error(self, message: str, error: Exception) -> bool:
self.reset()
return result
+ def color_border(self) -> None:
+ """
+ Color this card's border based on given setting.
+ """
+ # Change to a recognized color that isn't the default
+ if self.border_color != 'black' and self.border_color in con.colors:
+ try:
+ self.collector_info_authentic()
+ border = self.docref.layers.getByName('Border')
+ psd.apply_fx(border, [{
+ 'type': 'color-overlay',
+ 'color': psd.get_color(self.border_color)
+ }])
+ except PhotoshopPythonAPIError:
+ pass
+
"""
HOOKS
"""
@@ -770,6 +907,19 @@ def execute(self) -> bool:
except Exception as e:
return self.raise_error("Unable to insert collector info!", e)
+ # Add expansion symbol
+ try:
+ self.expansion_symbol()
+ except Exception as e:
+ return self.raise_error("Unable to generate expansion symbol!", e)
+
+ # Add watermark
+ try:
+ if cfg.enable_watermark:
+ self.create_watermark()
+ except Exception as e:
+ return self.raise_error("Unable to generate watermark!", e)
+
# Add text layers
try:
self.basic_text_layers()
@@ -780,6 +930,7 @@ def execute(self) -> bool:
# Enable the layers we need
try:
self.enable_frame_layers()
+ self.color_border()
except Exception as e:
return self.raise_error("Enabling layers failed!", e)
@@ -879,10 +1030,35 @@ def basic_text_layers(self) -> None:
text_classes.ScaledTextField(
layer = self.text_layer_type,
contents = self.layout.type_line,
- reference = self.expansion_symbol
+ reference = self.expansion_symbol_layer
)
])
+ """
+ UTILITY METHODS
+ """
+
+ def create_dual_layer(self, colors: str, group: LayerSet, mask: Optional[ArtLayer] = None):
+ """
+ Create a dual color layer using a gradient mask.
+ @param colors: Colors to use.
+ @param group: Group to look for the layers within.
+ @param mask: Layer containing the gradient mask.
+ """
+ # Was mask provided?
+ if not mask or not isinstance(mask, ArtLayer):
+ mask = self.docref.artLayers.getByName("Mask")
+
+ # Change layer visibility
+ top = psd.getLayer(colors[0], group)
+ bottom = psd.getLayer(colors[1], group)
+ bottom.move(top, ps.ElementPlacement.PlaceAfter)
+ top.visible = True
+ bottom.visible = True
+
+ # add the mask
+ psd.copy_layer_mask(mask, top)
+
class NormalTemplate (StarterTemplate):
"""
@@ -915,8 +1091,8 @@ def rules_text_and_pt_layers(self) -> None:
layer = self.text_layer_rules,
contents = self.layout.oracle_text,
flavor = self.layout.flavor_text,
- reference = psd.getLayer(con.layers.TEXTBOX_REFERENCE, self.text_layers),
- divider = psd.getLayer(con.layers.DIVIDER, self.text_layers),
+ reference = self.textbox_reference,
+ divider = self.divider_layer,
pt_reference = psd.getLayer(con.layers.PT_REFERENCE, self.text_layers),
pt_top_reference = psd.getLayer(con.layers.PT_TOP_REFERENCE, self.text_layers),
centered = self.is_centered
@@ -930,8 +1106,8 @@ def rules_text_and_pt_layers(self) -> None:
layer = self.text_layer_rules,
contents = self.layout.oracle_text,
flavor = self.layout.flavor_text,
- reference = psd.getLayer(con.layers.TEXTBOX_REFERENCE, self.text_layers),
- divider = psd.getLayer(con.layers.DIVIDER, self.text_layers),
+ reference = self.textbox_reference,
+ divider = self.divider_layer,
centered = self.is_centered
)
)
@@ -996,7 +1172,7 @@ class NormalClassicTemplate (StarterTemplate):
"""
template_file_name = "normal-classic"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
cfg.real_collector = False
super().__init__(layout)
@@ -1022,18 +1198,19 @@ def template_suffix(self) -> str:
return "Promo Classic"
return "Classic"
- def rules_text_and_pt_layers(self):
- # Move mana layer down for hybrid mana
- if len(self.background) == 2:
- self.text_layer_mana.translate(0, -5)
-
- # Text reference and rules text
- reference_layer = psd.getLayer(
+ @cached_property
+ def textbox_reference(self) -> Optional[ArtLayer]:
+ return psd.getLayer(
con.layers.TEXTBOX_REFERENCE_LAND if self.is_land
else con.layers.TEXTBOX_REFERENCE,
self.text_layers
)
+ def rules_text_and_pt_layers(self):
+ # Move mana layer down for hybrid mana
+ if len(self.background) == 2:
+ self.text_layer_mana.translate(0, -5)
+
# Add rules text
self.text.append(
text_classes.FormattedTextArea(
@@ -1041,7 +1218,7 @@ def rules_text_and_pt_layers(self):
contents = self.layout.oracle_text,
flavor = self.layout.flavor_text,
centered = self.is_centered,
- reference = reference_layer,
+ reference = self.textbox_reference,
divider = psd.getLayer(con.layers.DIVIDER, self.text_layers)
)
)
@@ -1074,10 +1251,226 @@ def enable_frame_layers(self):
"""
+class UniversesBeyondTemplate (NormalTemplate):
+ """
+ Template used for crossover sets like WH40K, Transformers, Street Fighter, etc.
+ This template is built using the Silvan style of creating vector shapes and applying the colors
+ and textures in the form of clipping masks. It's a little more involved, but it demonstrates
+ an alternative way to build a highly complex template which can work for multiple card types.
+ Credit to Kyle of Card Conjurer, WarpDandy, and MrTeferi.
+ """
+ template_file_name = "universes-beyond"
+ template_suffix = "Universes Beyond"
+
+ @property
+ def is_nyx(self) -> bool:
+ # Disable Nyx
+ return False
+
+ """
+ LAYERS
+ """
+
+ @cached_property
+ def mask_layer(self) -> ArtLayer:
+ # This layer contains the gradient mask for creating dual colors
+ return self.docref.artLayers.getByName("Mask")
+
+ @cached_property
+ def pinlines_layer(self) -> Optional[ArtLayer]:
+ return self.pinlines_group.artLayers.getByName(self.pinlines)
+
+ @cached_property
+ def textbox_layer(self) -> Optional[ArtLayer]:
+ return self.textbox_group.artLayers.getByName(self.pinlines)
+
+ @cached_property
+ def pt_layer(self) -> Optional[ArtLayer]:
+ # Support Vehicle, regular layers, and back side darkened layers
+ if self.background == 'Vehicle':
+ return psd.getLayer(self.background, con.layers.PT_BOX)
+ if self.is_front:
+ return psd.getLayer(self.twins, con.layers.PT_BOX)
+ return psd.getLayer(f'{self.twins} Back', con.layers.PT_BOX)
+
+ """
+ TEXT LAYERS
+ """
+
+ @cached_property
+ def text_layer_rules(self) -> Optional[ArtLayer]:
+ # Is this a creature?
+ if self.is_creature:
+ # Flipside P/T?
+ if self.other_face_is_creature and self.layout.transform_icon:
+ return psd.getLayer(con.layers.RULES_TEXT_CREATURE_FLIP, self.text_layers)
+ return psd.getLayer(con.layers.RULES_TEXT_CREATURE, self.text_layers)
+ self.text_layer_pt.visible = False
+
+ # Not a creature, Flipside P/T?
+ if self.other_face_is_creature and self.layout.transform_icon:
+ return psd.getLayer(con.layers.RULES_TEXT_NONCREATURE_FLIP, self.text_layers)
+ return psd.getLayer(con.layers.RULES_TEXT_NONCREATURE, self.text_layers)
+
+ """
+ GROUPS
+ """
+
+ @cached_property
+ def twins_group(self) -> LayerSet:
+ return self.docref.layerSets.getByName(con.layers.TWINS)
+
+ @cached_property
+ def pinlines_group(self) -> LayerSet:
+ return self.docref.layerSets.getByName(con.layers.PINLINES)
+
+ @cached_property
+ def textbox_group(self) -> LayerSet:
+ return self.docref.layerSets.getByName(con.layers.TEXTBOX)
+
+ @cached_property
+ def background_group(self) -> LayerSet:
+ return self.docref.layerSets.getByName(con.layers.BACKGROUND)
+
+ @cached_property
+ def crown_group(self) -> LayerSet:
+ return self.docref.layerSets.getByName(con.layers.LEGENDARY_CROWN)
+
+ """
+ SHAPES
+ """
+
+ @cached_property
+ def pinlines_shape_group(self) -> Optional[LayerSet]:
+ return psd.getLayerSet("Shape", self.pinlines_group)
+
+ @cached_property
+ def textbox_shape_group(self) -> Optional[LayerSet]:
+ return psd.getLayerSet("Shape", self.textbox_group)
+
+ @cached_property
+ def twins_shape_group(self) -> Optional[LayerSet]:
+ return psd.getLayerSet("Shape", self.twins_group)
+
+ """
+ METHODS
+ """
+
+ def enable_frame_layers(self) -> None:
+
+ # Twins
+ if self.twins_layer:
+ self.twins_layer.visible = True
+ if self.twins == "Colorless":
+ psd.set_fill_opacity(60, self.twins_group)
+
+ # PT Box
+ if self.is_creature and self.pt_layer:
+ self.pt_layer.parent.visible = True
+ self.pt_layer.visible = True
+
+ # Color Indicator
+ if self.type_line_shifted and self.color_indicator_layer:
+ self.color_indicator_layer.visible = True
+
+ # Pinlines
+ if len(self.pinlines) != 2 and self.pinlines_layer and self.textbox_layer:
+ self.textbox_layer.visible = True
+ self.pinlines_layer.visible = True
+ if self.pinlines == "Colorless":
+ psd.set_fill_opacity(60, self.textbox_group)
+ else:
+ # Generate dual color layers
+ self.create_dual_layer(self.pinlines, self.pinlines_group, self.mask_layer)
+ self.create_dual_layer(self.pinlines, self.textbox_group, self.mask_layer)
+
+ # Background layer
+ if len(self.background) != 2 and self.background_layer:
+ self.background_layer.visible = True
+ else:
+ # Generate dual color layer
+ self.create_dual_layer(self.background, self.background_group, self.mask_layer)
+
+ # Legendary crown
+ if self.is_legendary:
+ self.enable_crown()
+
+ # Transform alterations
+ if self.is_transform:
+ self.enable_transform_layers()
+ else:
+ # Add normal mask to Pinlines
+ psd.copy_layer_mask(psd.getLayer('Normal Mask', self.pinlines_group), self.pinlines_group)
+
+ def enable_transform_layers(self):
+ """
+ Make any changes that are required by Transform cards.
+ """
+ # Enable transform icon
+ psd.getLayer('Circle', self.text_layers).visible = True
+ self.transform_icon.visible = True
+
+ # Add transform mask to Textbox
+ if self.is_front:
+ # Use TF Front mask, TF Front/Transform shapes
+ psd.copy_layer_mask(psd.getLayer('TF Front Mask', self.pinlines_group), self.pinlines_group)
+ psd.getLayer('TF Front', self.pinlines_shape_group).visible = True
+ psd.getLayer('TF Front', self.textbox_shape_group).visible = True
+ psd.getLayer('Transform', self.twins_shape_group).visible = True
+ psd.getLayer('Normal', self.pinlines_shape_group).visible = False
+ psd.getLayer('Normal', self.textbox_shape_group).visible = False
+ psd.getLayer('Normal', self.twins_shape_group).visible = False
+
+ # Add flipside PT if needed
+ if self.other_face_is_creature:
+ self.text.append(
+ text_classes.TextField(
+ layer=psd.getLayer(con.layers.FLIPSIDE_POWER_TOUGHNESS, self.text_layers),
+ contents=str(self.layout.other_face_power) + "/" + str(self.layout.other_face_toughness)
+ )
+ )
+ else:
+ # Use Normal mask, TF Back/Transform shapes, and back side darker colors
+ psd.copy_layer_mask(psd.getLayer('Normal Mask', self.pinlines_group), self.pinlines_group)
+ psd.getLayer('TF Back', self.pinlines_shape_group).visible = True
+ psd.getLayer('Transform', self.twins_shape_group).visible = True
+ psd.getLayer('Normal', self.pinlines_shape_group).visible = False
+ psd.getLayer('Normal', self.twins_shape_group).visible = False
+
+ # Change Name, Type, and PT to white with shadow for non-Eldrazi backs
+ if self.layout.transform_icon != con.layers.MOON_ELDRAZI_DFC:
+ psd.enable_layer_fx(self.text_layer_name)
+ psd.enable_layer_fx(self.text_layer_type)
+ psd.enable_layer_fx(self.text_layer_pt)
+ self.text_layer_name.textItem.color = psd.rgb_white()
+ self.text_layer_type.textItem.color = psd.rgb_white()
+ self.text_layer_pt.textItem.color = psd.rgb_white()
+ psd.getLayerSet('Back', self.twins_group).visible = True
+ psd.getLayer('Back', self.textbox_group).visible = True
+
+ def enable_crown(self) -> None:
+ # Enable Legendary Crown group
+ self.crown_group.visible = True
+
+ # Crown layer
+ if len(self.pinlines) != 2 and self.crown_layer:
+ self.crown_layer.visible = True
+ else:
+ # Generate dual color layer
+ self.create_dual_layer(self.pinlines, self.crown_group, self.mask_layer)
+
+ # Change border
+ psd.getLayer(con.layers.NORMAL_BORDER, self.border_group).visible = False
+ psd.getLayer(con.layers.LEGENDARY_BORDER, self.border_group).visible = True
+
+ # Enable Legendary pinline connector
+ psd.getLayer("Legendary Pinlines", self.pinlines_shape_group).visible = True
+
+
class NormalExtendedTemplate (NormalTemplate):
"""
- An extended-art version of the normal template. The layer structure of this template and
- NormalTemplate are identical.
+ An extended-art version of the normal template. The layer structure of this template and
+ NormalTemplate are identical.
"""
template_file_name = "normal-extended"
template_suffix = "Extended"
@@ -1258,13 +1651,6 @@ class TransformBackTemplate (NormalTemplate):
Template for the back faces of transform cards.
"""
template_file_name = "tf-back"
- dfc_layer_group = con.layers.TF_BACK
-
- @cached_property
- def transform_icon(self) -> Optional[ArtLayer]:
- return psd.getLayer(self.layout.transform_icon, psd.getLayerSet(
- self.dfc_layer_group, self.text_layers)
- )
def enable_frame_layers(self):
# set transform icon
@@ -1285,7 +1671,6 @@ class TransformFrontTemplate (TransformBackTemplate):
Template for the front faces of transform cards.
"""
template_file_name = "tf-front.psd"
- dfc_layer_group = con.layers.TF_FRONT
@cached_property
def text_layer_rules(self) -> Optional[ArtLayer]:
@@ -1322,6 +1707,7 @@ class IxalanTemplate (NormalTemplate):
@property
def is_creature(self) -> bool:
+ # Only lands for this one
return False
@property
@@ -1333,6 +1719,10 @@ def name_shifted(self) -> bool:
def expansion_symbol_anchor(self) -> ps.AnchorPosition:
return ps.AnchorPosition.MiddleCenter
+ @property
+ def expansion_symbol_alignments(self) -> list[Alignment]:
+ return [Alignment.CenterVertical, Alignment.CenterHorizontal]
+
def basic_text_layers(self):
# Add to text layers
@@ -1350,31 +1740,20 @@ def basic_text_layers(self):
def enable_frame_layers(self):
self.background_layer.visible = True
- def create_expansion_symbol(self, centered=False):
- super().create_expansion_symbol(True)
-
- def create_expansion_symbol_classic(self, centered: bool = False):
- super().create_expansion_symbol_classic(True)
-
class MDFCBackTemplate (NormalTemplate):
"""
Template for the back faces of modal double faced cards.
"""
template_file_name = "mdfc-back"
- dfc_layer_group = con.layers.MDFC_BACK
-
- @cached_property
- def mdfc_group(self) -> Optional[LayerSet]:
- return psd.getLayerSet(self.dfc_layer_group, self.text_layers)
@cached_property
def text_layer_mdfc_left(self) -> Optional[ArtLayer]:
- return psd.getLayer(con.layers.LEFT, self.mdfc_group)
+ return psd.getLayer(con.layers.LEFT, self.dfc_group)
@cached_property
def text_layer_mdfc_right(self) -> Optional[ArtLayer]:
- return psd.getLayer(con.layers.RIGHT, self.mdfc_group)
+ return psd.getLayer(con.layers.RIGHT, self.dfc_group)
def basic_text_layers(self):
super().basic_text_layers()
@@ -1394,9 +1773,9 @@ def basic_text_layers(self):
def enable_frame_layers(self):
psd.getLayer(self.twins,
- psd.getLayerSet(con.layers.TOP, self.mdfc_group)).visible = True
+ psd.getLayerSet(con.layers.TOP, self.dfc_group)).visible = True
psd.getLayer(self.layout.other_face_twins,
- psd.getLayerSet(con.layers.BOTTOM, self.mdfc_group)).visible = True
+ psd.getLayerSet(con.layers.BOTTOM, self.dfc_group)).visible = True
super().enable_frame_layers()
@@ -1405,7 +1784,6 @@ class MDFCFrontTemplate (MDFCBackTemplate):
Template for the front faces of modal double faced cards.
"""
template_file_name = "mdfc-front"
- dfc_layer_group = con.layers.MDFC_FRONT
"""
@@ -1422,31 +1800,35 @@ class MutateTemplate (NormalTemplate):
"""
template_file_name = "mutate.psd"
- def __init__(self, layout):
+ """
+ MUTATE TEXT
+ """
- # Split self.oracle_text between mutate text and actual text before calling super()
- split_rules_text = layout.oracle_text.split("\n")
- layout.mutate_text = split_rules_text[0]
- layout.oracle_text = "\n".join(split_rules_text[1:])
- super().__init__(layout)
+ @cached_property
+ def mutate_text(self) -> str:
+ split_rules_text = self.layout.oracle_text.split("\n")
+ self.layout.oracle_text = "\n".join(split_rules_text[1:])
+ return split_rules_text[0]
@cached_property
def text_layer_mutate(self) -> Optional[ArtLayer]:
return psd.getLayer(con.layers.MUTATE, self.text_layers)
def basic_text_layers(self):
- super().basic_text_layers()
# Add mutate text
self.text.append(
text_classes.FormattedTextArea(
layer = self.text_layer_mutate,
- contents = self.layout.mutate_text,
+ contents = self.mutate_text,
flavor = self.layout.flavor_text,
reference = psd.getLayer(con.layers.MUTATE_REFERENCE, self.text_layers),
)
)
+ # Continue with text
+ super().basic_text_layers()
+
class PrototypeTemplate (NormalTemplate):
"""
@@ -1456,7 +1838,7 @@ class PrototypeTemplate (NormalTemplate):
"""
template_file_name = "prototype.psd"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
# Split self.oracle_text between prototype text and rules text
split_rules_text = layout.oracle_text.split("\n")
@@ -1588,7 +1970,7 @@ class LevelerTemplate (NormalTemplate):
"""
template_file_name = "leveler"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
cfg.exit_early = True
super().__init__(layout)
@@ -1655,11 +2037,15 @@ class SagaTemplate (NormalTemplate):
"""
template_file_name = "saga"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
self._abilities = []
self._icons = []
super().__init__(layout)
+ """
+ BOOL PROPERTIES
+ """
+
@property
def is_legendary(self) -> bool:
return False
@@ -1676,6 +2062,10 @@ def is_nyx(self) -> bool:
def is_companion(self) -> bool:
return False
+ """
+ LAYER PROPERTIES
+ """
+
@cached_property
def pinlines_layer(self) -> Optional[ArtLayer]:
return psd.getLayer(self.background, con.layers.TEXTBOX)
@@ -1700,14 +2090,22 @@ def icon_layers(self, value):
def saga_group(self):
return psd.getLayerSet("Saga", self.text_layers)
- @cached_property
- def ref(self):
- return psd.getLayer(con.layers.TEXTBOX_REFERENCE, self.text_layers)
-
@cached_property
def ability_divider(self) -> ArtLayer:
return psd.getLayer(con.layers.DIVIDER, self.saga_group)
+ """
+ TRANSFORM PROPERTIES
+ """
+
+ @cached_property
+ def transform_icon(self) -> Optional[ArtLayer]:
+ return psd.getLayer(self.layout.transform_icon, [self.text_layers, 'tf-front'])
+
+ """
+ METHODS
+ """
+
def enable_frame_layers(self):
super().enable_frame_layers()
@@ -1718,6 +2116,16 @@ def enable_frame_layers(self):
# Saga stripe
psd.getLayer(self.pinlines, con.layers.PINLINES_AND_SAGA_STRIPE).visible = True
+ # Is this transform?
+ if self.layout.other_face:
+ # Icon
+ psd.getLayerSet('Circle', self.text_layers).visible = True
+ self.transform_icon.visible = True
+
+ # Nameplate
+ psd.enable_mask(self.twins_layer.parent)
+ psd.getLayer(self.background, 'TF Twins').visible = True
+
def rules_text_and_pt_layers(self):
# Add description text with reminder
@@ -1747,7 +2155,7 @@ def post_text_layers(self) -> None:
spacing = 80 * self.app.activeDocument.width / 3264
spaces = len(self.ability_layers) - 1
spacing_total = (spaces * 1.5) + 2
- ref_height = psd.get_layer_dimensions(self.ref)['height']
+ ref_height = psd.get_layer_dimensions(self.textbox_reference)['height']
total_height = ref_height - (((spacing * 1.5) * spaces) + (spacing * 2))
# Resize text items till they fit in the available space
@@ -1759,7 +2167,7 @@ def post_text_layers(self) -> None:
inside_gap = (ref_height - layer_heights) * (1.5 / spacing_total)
# Space Saga lines evenly apart
- psd.spread_layers_over_reference(self.ability_layers, self.ref, gap, inside_gap)
+ psd.spread_layers_over_reference(self.ability_layers, self.textbox_reference, gap, inside_gap)
# Align icons to respective text layers
for i, ref_layer in enumerate(self.ability_layers):
@@ -1796,11 +2204,15 @@ class ClassTemplate (NormalTemplate):
"""
template_file_name = "class"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
self._line_layers: list[ArtLayer] = []
self._stage_layers: list[LayerSet] = []
super().__init__(layout)
+ """
+ BOOL PROPERTIES
+ """
+
@property
def is_legendary(self) -> bool:
return False
@@ -1825,10 +2237,6 @@ def is_companion(self) -> bool:
LAYERS
"""
- @cached_property
- def ref(self):
- return psd.getLayer(con.layers.TEXTBOX_REFERENCE, self.text_layers)
-
@cached_property
def class_group(self) -> LayerSet:
return psd.getLayerSet("Class", con.layers.TEXT_AND_ICONS)
@@ -1898,7 +2306,7 @@ def post_text_layers(self) -> None:
spacing = 80 * self.app.activeDocument.width / 3264
spaces = len(self.line_layers) - 1
divider_height = psd.get_layer_dimensions(self.stage_layers[0])['height']
- ref_height = psd.get_layer_dimensions(self.ref)['height']
+ ref_height = psd.get_layer_dimensions(self.textbox_reference)['height']
spacing_total = (spaces * (spacing + divider_height)) + (spacing * 2)
total_height = ref_height - spacing_total
@@ -1911,7 +2319,7 @@ def post_text_layers(self) -> None:
inside_gap = (ref_height - layer_heights) * ((spacing + divider_height) / spacing_total)
# Space Class lines evenly apart
- psd.spread_layers_over_reference(self.line_layers, self.ref, gap, inside_gap)
+ psd.spread_layers_over_reference(self.line_layers, self.textbox_reference, gap, inside_gap)
# Position divider lines
self.position_divider_lines()
@@ -1934,7 +2342,7 @@ class PlaneswalkerTemplate (StarterTemplate):
"""
template_file_name = "pw.psd"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
# Settable Properties
self._ability_layers = []
@@ -1966,10 +2374,6 @@ def art_reference(self):
def text_layers(self) -> LayerSet:
return psd.getLayerSet(con.layers.TEXT_AND_ICONS, self.group)
- @cached_property
- def ref(self) -> ArtLayer:
- return psd.getLayer(con.layers.TEXTBOX_REFERENCE, self.text_layers)
-
@cached_property
def top_ref(self) -> ArtLayer:
return psd.getLayer(con.layers.PW_TOP_REFERENCE, self.text_layers)
@@ -2109,7 +2513,7 @@ def post_text_layers(self):
# Core vars
spacing = 80 * self.app.activeDocument.width / 3264
spaces = len(self.ability_layers) + 1
- ref_height = psd.get_layer_dimensions(self.ref)['height']
+ ref_height = psd.get_layer_dimensions(self.textbox_reference)['height']
total_height = ref_height - (spacing * spaces)
# Resize text items till they fit in the available space
@@ -2120,10 +2524,12 @@ def post_text_layers(self):
gap = (ref_height - layer_heights) / spaces
# Space Planeswalker text evenly apart
- psd.spread_layers_over_reference(self.ability_layers, self.ref, gap)
+ psd.spread_layers_over_reference(self.ability_layers, self.textbox_reference, gap)
# Check the top reference of loyalty badge
- ft.vertically_nudge_pw_text(self.ability_layers, spacing, gap, self.ref, self.adj_ref, self.top_ref)
+ ft.vertically_nudge_pw_text(
+ self.ability_layers, spacing, gap, self.textbox_reference, self.adj_ref, self.top_ref
+ )
# Align colons and shields to respective text layers
for i, ref_layer in enumerate(self.ability_layers):
@@ -2249,19 +2655,14 @@ class PlaneswalkerMDFCBackTemplate (PlaneswalkerTemplate):
Need to enable MDFC layers and add MDFC text.
"""
template_file_name = "pw-mdfc-back"
- dfc_layer_group = con.layers.MDFC_BACK
-
- @cached_property
- def mdfc_group(self) -> Optional[LayerSet]:
- return psd.getLayerSet(self.dfc_layer_group, self.text_layers)
@cached_property
def text_layer_mdfc_left(self) -> Optional[ArtLayer]:
- return psd.getLayer(con.layers.LEFT, self.mdfc_group)
+ return psd.getLayer(con.layers.LEFT, self.dfc_group)
@cached_property
def text_layer_mdfc_right(self) -> Optional[ArtLayer]:
- return psd.getLayer(con.layers.RIGHT, self.mdfc_group)
+ return psd.getLayer(con.layers.RIGHT, self.dfc_group)
@cached_property
def text_layer_name(self) -> Optional[ArtLayer]:
@@ -2289,9 +2690,9 @@ def enable_frame_layers(self):
# Add special MDFC layers
psd.getLayer(self.twins,
- psd.getLayerSet(con.layers.TOP, self.mdfc_group)).visible = True
+ psd.getLayerSet(con.layers.TOP, self.dfc_group)).visible = True
psd.getLayer(self.layout.other_face_twins,
- psd.getLayerSet(con.layers.BOTTOM, self.mdfc_group)).visible = True
+ psd.getLayerSet(con.layers.BOTTOM, self.dfc_group)).visible = True
class PlaneswalkerMDFCFrontTemplate (PlaneswalkerMDFCBackTemplate):
@@ -2299,7 +2700,6 @@ class PlaneswalkerMDFCFrontTemplate (PlaneswalkerMDFCBackTemplate):
Template for the front faces of modal double faced Planeswalker cards.
"""
template_file_name = "pw-mdfc-front"
- dfc_layer_group = con.layers.MDFC_FRONT
class PlaneswalkerMDFCBackExtendedTemplate (PlaneswalkerMDFCBackTemplate):
@@ -2341,7 +2741,6 @@ class PlaneswalkerTransformBackTemplate (PlaneswalkerTemplate):
Template for the back faces of transform cards.
"""
template_file_name = "pw-tf-back"
- dfc_layer_group = con.layers.TF_BACK
@cached_property
def text_layer_name(self) -> Optional[ArtLayer]:
@@ -2355,7 +2754,7 @@ def text_layer_type(self) -> Optional[ArtLayer]:
@cached_property
def transform_icon(self) -> Optional[ArtLayer]:
- return psd.getLayer(self.layout.transform_icon, [self.text_layers, self.dfc_layer_group])
+ return psd.getLayer(self.layout.transform_icon, self.dfc_group)
def enable_frame_layers(self):
# Add the transform icon
@@ -2368,7 +2767,6 @@ class PlaneswalkerTransformFrontTemplate (PlaneswalkerTransformBackTemplate):
Template for the back faces of transform cards.
"""
template_file_name = "pw-tf-front"
- dfc_layer_group = con.layers.TF_FRONT
class PlaneswalkerTransformBackExtendedTemplate (PlaneswalkerTransformBackTemplate):
@@ -2416,7 +2814,7 @@ class PlanarTemplate (StarterTemplate):
"""
template_file_name = "planar"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
cfg.exit_early = True
super().__init__(layout)
@@ -2439,7 +2837,7 @@ def basic_text_layers(self):
text_classes.ScaledTextField(
layer = self.text_layer_type,
contents = self.layout.type_line,
- reference = self.expansion_symbol
+ reference = self.expansion_symbol_layer
)
])
@@ -2492,7 +2890,7 @@ class BasicLandTemplate (BaseTemplate):
"""
template_file_name = "basic"
- def __init__(self, layout):
+ def __init__(self, layout: CardLayout):
cfg.save_artist_name = True
cfg.real_collector = False
super().__init__(layout)
@@ -2517,7 +2915,7 @@ class BasicLandUnstableTemplate (BasicLandTemplate):
template_file_name = "basic-unstable"
template_suffix = "Unstable"
- def create_expansion_symbol(self, centered=False):
+ def expansion_symbol(self):
pass
def basic_text_layers(self):
diff --git a/proxyshop/tests/expansion_symbol.py b/src/tests/expansion_symbol.py
similarity index 55%
rename from proxyshop/tests/expansion_symbol.py
rename to src/tests/expansion_symbol.py
index 9b7ee000..a22277bd 100644
--- a/proxyshop/tests/expansion_symbol.py
+++ b/src/tests/expansion_symbol.py
@@ -3,23 +3,29 @@
"""
# Change to root directory
import os
-os.chdir(os.path.abspath(os.path.join(os.getcwd(), '..', '..')))
+
+from src.utils.enums_photoshop import Alignment
+
+# Use this to force a working directory if IDE doesn't support it
+# os.chdir(os.path.abspath(os.path.join(os.getcwd(), '..', '..')))
from functools import cached_property
from pathlib import Path
from typing import Optional
+from photoshop.api._layerSet import LayerSet
+from photoshop.api.application import ArtLayer
import photoshop.api as ps
-from proxyshop.constants import con
+from src.constants import con
con.headless = True
-from proxyshop import helpers as psd
-from proxyshop.settings import cfg
+from src import helpers as psd
+from src.settings import cfg
# Generate rarity folders if they don't exist
-Path(os.path.join(con.cwd, "proxyshop/tests/symbols/common")).mkdir(mode=511, parents=True, exist_ok=True)
-Path(os.path.join(con.cwd, "proxyshop/tests/symbols/uncommon")).mkdir(mode=511, parents=True, exist_ok=True)
-Path(os.path.join(con.cwd, "proxyshop/tests/symbols/rare")).mkdir(mode=511, parents=True, exist_ok=True)
-Path(os.path.join(con.cwd, "proxyshop/tests/symbols/mythic")).mkdir(mode=511, parents=True, exist_ok=True)
+Path(os.path.join(con.path_tests, "symbols/common")).mkdir(mode=511, parents=True, exist_ok=True)
+Path(os.path.join(con.path_tests, "symbols/uncommon")).mkdir(mode=511, parents=True, exist_ok=True)
+Path(os.path.join(con.path_tests, "symbols/rare")).mkdir(mode=511, parents=True, exist_ok=True)
+Path(os.path.join(con.path_tests, "symbols/mythic")).mkdir(mode=511, parents=True, exist_ok=True)
"""
TEST CLASSES
@@ -39,19 +45,19 @@ def __init__(self, set_code: str, rarity: str = 'r'):
@cached_property
def symbol(self) -> str:
# Automatic set symbol enabled?
- if cfg.auto_symbol and self.set in con.set_symbols:
+ if not cfg.symbol_force_default and self.set in con.set_symbols:
sym = con.set_symbols[self.set]
# Check if this is a reference to another symbol
if isinstance(sym, str) and len(sym) > 1 and sym in con.set_symbols:
return con.set_symbols[sym]
return sym
- elif cfg.auto_symbol and self.set[1:] in con.set_symbols:
+ elif not cfg.symbol_force_default and self.set[1:] in con.set_symbols:
sym = con.set_symbols[self.set[1:]]
# Check if this is a reference to another symbol
if isinstance(sym, str) and len(sym) > 1 and sym in con.set_symbols:
return con.set_symbols[sym]
return sym
- return cfg.symbol_char
+ return con.set_symbols.get(cfg.symbol_default, con.set_symbols['MTG'])
class TestTemplate:
@@ -63,7 +69,7 @@ class TestTemplate:
def __init__(self, layout: TestLayout):
self.layout = layout
self._expansion_symbol = psd.getLayer('Expansion Symbol', self.text_layers)
- self.create_expansion_symbol()
+ self.expansion_symbol()
@cached_property
def app(self):
@@ -73,76 +79,88 @@ def app(self):
def text_layers(self):
return psd.getLayerSet('Text')
- @cached_property
- def expansion_symbol_anchor(self):
- return ps.AnchorPosition.MiddleCenter
+ """
+ EXPANSION SYMBOL PROPERTIES
+ """
@property
- def active_layer(self):
- return self.app.activeDocument.activeLayer
-
- @active_layer.setter
- def active_layer(self, value):
- self.app.activeDocument.activeLayer = value
+ def expansion_symbol_anchor(self) -> ps.AnchorPosition:
+ return ps.AnchorPosition.MiddleRight
@property
- def expansion_symbol(self):
- return self._expansion_symbol
+ def expansion_symbol_alignments(self) -> list[Alignment]:
+ return [Alignment.CenterVertical, Alignment.CenterHorizontal]
+
+ @cached_property
+ def expansion_reference_layer(self):
+ # Expansion symbol reference layer
+ return psd.getLayer(con.layers.EXPANSION_REFERENCE, self.text_layers)
- @expansion_symbol.setter
- def expansion_symbol(self, value):
- self._expansion_symbol = value
+ @cached_property
+ def expansion_symbol_layer(self) -> Optional[ArtLayer]:
+ # Expansion symbol layer
+ return psd.getLayer(con.layers.EXPANSION_SYMBOL, self.text_layers)
- def create_expansion_symbol(self, centered: bool = False) -> None:
+ def expansion_symbol(self) -> None:
"""
- Builds the expansion symbol
- @param centered: Center the symbol within its reference.
+ Builds the user's preferred type of expansion symbol.
"""
- # Starting symbol, reference, and rarity layers
- symbol_layer = psd.getLayer(con.layers.EXPANSION_SYMBOL, self.text_layers)
- ref_layer = psd.getLayer(con.layers.EXPANSION_REFERENCE, self.text_layers)
- psd.clear_layer_style(symbol_layer)
- current_layer = symbol_layer
+ if cfg.symbol_mode not in ['default', 'classic', 'svg']:
+ self.expansion_symbol_layer.textItem.contents = ''
+ return
- # Put everything in a group
+ # Create a group for generated layers, clear style
group = self.app.activeDocument.layerSets.add()
- group.move(current_layer, ps.ElementPlacement.PlaceAfter)
- symbol_layer.move(group, ps.ElementPlacement.PlaceInside)
+ group.move(self.expansion_symbol_layer, ps.ElementPlacement.PlaceAfter)
+ psd.clear_layer_style(self.expansion_symbol_layer)
+ self.create_expansion_symbol(group)
+ # Merge and refresh cache
+ group.merge().name = "Expansion Symbol"
+ self.expansion_symbol_layer.name = "Expansion Symbol Old"
+ self.expansion_symbol_layer.opacity = 0
+
+ def create_expansion_symbol(self, group: LayerSet) -> None:
+ """
+ Builds the expansion symbol using the newer layer effects methodology.
+ @param group: The LayerSet to add generated layers to.
+ """
# Set the starting character and format our layer array
- if self.layout.rarity not in ['common', 'uncommon', 'rare', 'mythic']:
- self.layout.rarity = 'mythic'
- symbol_layer.textItem.contents, symbols = psd.process_expansion_symbol_info(
+ self.expansion_symbol_layer.textItem.contents, symbols = psd.process_expansion_symbol_info(
self.layout.symbol, self.layout.rarity.lower()
)
- # Size to fit reference?
- if cfg.auto_symbol_size:
- psd.frame_layer(symbol_layer, ref_layer, self.expansion_symbol_anchor, True, centered)
+ # Size to fit reference
+ psd.frame_layer(
+ self.expansion_symbol_layer,
+ self.expansion_reference_layer,
+ smallest=True,
+ anchor=self.expansion_symbol_anchor,
+ alignments=self.expansion_symbol_alignments
+ )
# Create each symbol layer
for i, lay in enumerate(symbols):
# Establish new current layer
- current_layer = symbol_layer.duplicate(current_layer, ps.ElementPlacement.PlaceAfter)
+ current_layer = self.expansion_symbol_layer.duplicate(group, ps.ElementPlacement.PlaceAtEnd)
current_layer.textItem.contents = lay['char']
self.active_layer = current_layer
- layer_fx = []
- fill_layer = None
+ layer_fx, fill_layer = [], None
# Change font color
- if 'color' in lay:
+ if lay.get('color'):
current_layer.textItem.color = lay['color']
# Stroke fx
- if 'stroke' in lay:
+ if lay.get('stroke'):
layer_fx.append(lay['stroke'])
# Rarity gradient overlay fx
- if lay.get('rarity') and 'gradient' in lay:
+ if lay.get('rarity') and lay.get('gradient'):
layer_fx.append(lay['gradient'])
# Drop shadow fx
- if 'drop-shadow' in lay:
+ if lay.get('drop-shadow'):
layer_fx.append(lay['drop-shadow'])
# Apply layer FX
@@ -150,12 +168,12 @@ def create_expansion_symbol(self, centered: bool = False) -> None:
psd.apply_fx(current_layer, layer_fx)
# Rarity background fill
- if lay.get('fill') == 'rarity' and 'gradient' in lay:
+ if lay.get('fill') == 'rarity' and lay.get('gradient'):
# Apply fill before rarity
psd.rasterize_layer_style(current_layer)
fill_layer = psd.fill_expansion_symbol(current_layer, psd.rgb_black())
psd.apply_fx(fill_layer, [lay['gradient']])
- elif 'fill' in lay:
+ elif lay.get('fill'):
psd.rasterize_layer_style(current_layer)
fill_layer = psd.fill_expansion_symbol(current_layer, lay['fill'])
@@ -164,22 +182,15 @@ def create_expansion_symbol(self, centered: bool = False) -> None:
current_layer = psd.merge_layers([current_layer, fill_layer])
# Scale factor
- if 'scale' in lay:
- current_layer.resize(lay['scale'] * 100, lay['scale'] * 100, ps.AnchorPosition.MiddleRight)
-
- # Merge all
- symbol_layer.move(group, ps.ElementPlacement.PlaceBefore)
- symbol_layer.name = "Expansion Symbol Old"
- symbol_layer.opacity = 0
- self.expansion_symbol = group.merge()
- self.expansion_symbol.name = "Expansion Symbol"
+ if lay.get('scale'):
+ current_layer.resize(lay['scale'] * 100, lay['scale'] * 100, self.expansion_symbol_anchor)
-def test_symbol(code: str, rarity: str, directory='proxyshop/tests/symbols'):
+def test_symbol(code: str, rarity: str, directory='src/tests/symbols'):
print(code, rarity.title())
TestTemplate(TestLayout(code, rarity.lower()))
psd.save_document_jpeg(f"{code}-{rarity[0].lower()}", directory=directory)
- psd.reset_document('expansion_symbol_test.psd')
+ psd.reset_document()
def test_target_symbol(code: str, rarities: list = None):
@@ -212,7 +223,7 @@ def big_symbol_test(number: int = 260, rarities: Optional[list] = None):
codes = list(con.set_symbols.keys())[-number:]
for i, code in enumerate(codes):
for rarity in rarities:
- test_symbol(code, rarity, directory=f'proxyshop/tests/symbols/{rarity}')
+ test_symbol(code, rarity, directory=f'src/tests/symbols/{rarity}')
"""
@@ -221,7 +232,7 @@ def big_symbol_test(number: int = 260, rarities: Optional[list] = None):
# Open the document
app = ps.Application()
-app.open(os.path.join(con.cwd, 'proxyshop/tests/expansion_symbol_test.psd'))
+app.open(os.path.join(con.path_tests, 'expansion_symbol_test.psd'))
# TEST ONE SYMBOL
test_target_symbol('ONC', rarities=['common', 'uncommon', 'rare', 'mythic'])
diff --git a/proxyshop/tests/expansion_symbol_test.psd b/src/tests/expansion_symbol_test.psd
similarity index 100%
rename from proxyshop/tests/expansion_symbol_test.psd
rename to src/tests/expansion_symbol_test.psd
diff --git a/src/tests/frame_data.py b/src/tests/frame_data.py
new file mode 100644
index 00000000..cab22ac4
--- /dev/null
+++ b/src/tests/frame_data.py
@@ -0,0 +1,893 @@
+"""
+FRAME LOGIC TESTS
+Credit to Chilli
+https://tinyurl.com/chilli-frame-logic-tests
+"""
+# Change to root directory
+import os
+import time
+from os import path as osp
+os.chdir(osp.abspath(osp.join(os.getcwd(), '..', '..')))
+
+# Run headless
+from src.constants import con
+con.headless = True
+
+# Additional imports
+from src.layouts import TransformLayout, MeldLayout, ModalDoubleFacedLayout, layout_map
+from src.layouts import NormalLayout
+from src.scryfall import card_info
+
+# TODO: Implement actual pytest assertions
+test_cases = {
+ # Basic test cases - mono colored, normal 'frame' cards
+ "Healing Salve": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WHITE, con.layers.WHITE, con.layers.WHITE, False, False]
+ }, "Ancestral Recall": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, False, False]
+ }, "Dark Ritual": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLACK, con.layers.BLACK, con.layers.BLACK, False, False]
+ }, "Lightning Bolt": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RED, con.layers.RED, con.layers.RED, False, False]
+ }, "Giant Growth": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GREEN, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Mono colored cards with 2/C in their cost
+ "Spectral Procession": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WHITE, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Advice from the Fae": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Beseech the Queen": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLACK, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Flame Javelin": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RED, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Tower Above": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GREEN, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Pacts
+ "Intervention Pact": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WHITE, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Pact of Negation": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Slaughter Pact": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLACK, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Pact of the Titan": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RED, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Summoner's Pact": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GREEN, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Enchantment creatures
+ "Heliod, God of the Sun": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WHITE, con.layers.WHITE, con.layers.WHITE, True, False]
+ },
+ "Thassa, God of the Sea": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, True, False]
+ },
+ "Erebos, God of the Dead": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLACK, con.layers.BLACK, con.layers.BLACK, True, False]
+ },
+ "Purphoros, God of the Forge": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RED, con.layers.RED, con.layers.RED, True, False]
+ },
+ "Nylea, God of the Hunt": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GREEN, con.layers.GREEN, con.layers.GREEN, True, False]
+ },
+
+ # Suspend cards with no mana cost
+ "Restore Balance": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WHITE, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Ancestral Vision": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Living End": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BLACK, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Wheel of Fate": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RED, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Hypergenesis": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GREEN, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+ "Lotus Bloom": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+
+ # Two colored, normal frame cards
+ "Azorius Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.WU, con.layers.GOLD, False, False]
+ },
+ "Dimir Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.UB, con.layers.GOLD, False, False]
+ },
+ "Rakdos Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.BR, con.layers.GOLD, False, False]
+ },
+ "Gruul Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.RG, con.layers.GOLD, False, False]
+ },
+ "Selesnya Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GW, con.layers.GOLD, False, False]
+ },
+ "Orzhov Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.WB, con.layers.GOLD, False, False]
+ },
+ "Golgari Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.BG, con.layers.GOLD, False, False]
+ },
+ "Simic Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GU, con.layers.GOLD, False, False]
+ },
+ "Izzet Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.UR, con.layers.GOLD, False, False]
+ },
+ "Boros Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.RW, con.layers.GOLD, False, False]
+ },
+
+ # Two colored, hybrid frame cards
+ "Godhead of Awe": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WU, con.layers.WU, con.layers.LAND, False, False]
+ },
+ "Ghastlord of Fugue": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.UB, con.layers.UB, con.layers.LAND, False, False]
+ },
+ "Demigod of Revenge": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BR, con.layers.BR, con.layers.LAND, False, False]
+ },
+ "Deus of Calamity": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RG, con.layers.RG, con.layers.LAND, False, False]
+ },
+ "Oversoul of Dusk": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GW, con.layers.GW, con.layers.LAND, False, False]
+ },
+ "Divinity of Pride": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.WB, con.layers.WB, con.layers.LAND, False, False]
+ },
+ "Deity of Scars": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BG, con.layers.BG, con.layers.LAND, False, False]
+ },
+ "Overbeing of Myth": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GU, con.layers.GU, con.layers.LAND, False, False]
+ },
+ "Dominus of Fealty": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.UR, con.layers.UR, con.layers.LAND, False, False]
+ },
+ "Nobilis of War": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.RW, con.layers.RW, con.layers.LAND, False, False]
+ },
+
+ # Two color hybrid frame, no mana cost
+ "Asmoranomardicadaistinaculdacar": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BR, con.layers.BR, con.layers.LAND, False, False]
+ },
+
+ # Double faced cards
+ "Insectile Aberration": {
+ 'layout': TransformLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Ravager of the Fells": {
+ 'layout': TransformLayout,
+ 'frame': [con.layers.GOLD, con.layers.RG, con.layers.GOLD, False, False]
+ },
+ "Brisela, Voice of Nightmares": {
+ 'layout': MeldLayout,
+ 'frame': [con.layers.COLORLESS, con.layers.COLORLESS, con.layers.COLORLESS, False, True]
+ },
+ "Archangel Avacyn": {
+ 'layout': TransformLayout,
+ 'frame': [con.layers.WHITE, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Avacyn, the Purifier": {
+ 'layout': TransformLayout,
+ 'frame': [con.layers.RED, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Curious Homunculus": {
+ 'layout': TransformLayout,
+ 'frame': [con.layers.BLUE, con.layers.BLUE, con.layers.BLUE, False, False]},
+ "Voracious Reader": {
+ 'layout': TransformLayout,
+ 'frame': [con.layers.COLORLESS, con.layers.COLORLESS, con.layers.COLORLESS, False, True]},
+ "Barkchannel Pathway": {
+ 'layout': ModalDoubleFacedLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]},
+ "Tidechannel Pathway": {
+ 'layout': ModalDoubleFacedLayout,
+ 'frame': [con.layers.LAND, con.layers.BLUE, con.layers.BLUE, False, False]},
+ "Blex, Vexing Pest": {
+ 'layout': ModalDoubleFacedLayout,
+ 'frame': [con.layers.GREEN, con.layers.GREEN, con.layers.GREEN, False, False]},
+ "Search for Blex": {
+ 'layout': ModalDoubleFacedLayout,
+ 'frame': [con.layers.BLACK, con.layers.BLACK, con.layers.BLACK, False, False]},
+ "Extus, Oriq Overlord": {
+ 'layout': ModalDoubleFacedLayout,
+ 'frame': [con.layers.GOLD, con.layers.WB, con.layers.GOLD, False, False]
+ },
+ "Awaken the Blood Avatar": {
+ 'layout': ModalDoubleFacedLayout,
+ 'frame': [con.layers.GOLD, con.layers.BR, con.layers.GOLD, False, False]
+ },
+
+ # Tri colored, normal frame cards
+ "Esper Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Grixis Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Jund Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Naya Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Bant Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Abzan Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Jeskai Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Sultai Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Mardu Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Temur Charm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.GOLD, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+
+ # Eldrazi
+ "Emrakul, the Aeons Torn": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.COLORLESS, con.layers.COLORLESS, con.layers.COLORLESS, False, True]
+ },
+ "Scion of Ugin": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.COLORLESS, con.layers.COLORLESS, con.layers.COLORLESS, False, True]
+ },
+
+ # Colorless artifacts
+ "Herald's Horn": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+ "Black Lotus": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+ "Mox Pearl": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+ "Mox Sapphire": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+ "Mox Jet": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+ "Mox Ruby": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+ "Mox Emerald": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.ARTIFACT, con.layers.ARTIFACT, False, False]
+ },
+
+ # Mono colored artifacts
+ "The Circle of Loyalty": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "The Magic Mirror": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "The Cauldron of Eternity": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Embercleave": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.RED, con.layers.RED, False, False]
+ },
+ "The Great Henge": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Two colored artifacts
+ "Filigree Angel": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.WU, con.layers.GOLD, False, False]
+ },
+ "Time Sieve": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.UB, con.layers.GOLD, False, False]
+ },
+ "Demonspine Whip": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.BR, con.layers.GOLD, False, False]
+ },
+ "Mage Slayer": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.RG, con.layers.GOLD, False, False]
+ },
+ "Behemoth Sledge": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GW, con.layers.GOLD, False, False]
+ },
+ "Tainted Sigil": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.WB, con.layers.GOLD, False, False]
+ },
+ "Shardless Agent": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GU, con.layers.GOLD, False, False]
+ },
+ "Etherium-Horn Sorcerer": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.UR, con.layers.GOLD, False, False]
+ },
+
+ # Tri colored artifacts
+ "Sphinx of the Steel Wind": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Thopter Foundry": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+
+ # Five color artifacts
+ "Sphinx of the Guildpact": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Reaper King": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.ARTIFACT, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+
+ # Colorless lands with varying rules texts
+ "Vesuva": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Evolving Wilds": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Karn's Bastion": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Hall of Heliod's Generosity": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Academy Ruins": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Volrath's Stronghold": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Gemstone Caverns": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Glacial Chasm": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Ash Barrens": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Crumbling Vestige": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Blighted Steppe": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Blighted Cataract": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Blighted Fen": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Blighted Gorge": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Blighted Woodland": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Maze's End": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Inventors' Fair": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Myriad Landscape": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Crystal Quarry": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+
+ # Panoramas
+ "Esper Panorama": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Grixis Panorama": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Jund Panorama": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Naya Panorama": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+ "Bant Panorama": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.LAND, con.layers.LAND, False, False]
+ },
+
+ # Mono colored lands that specifically add their color of mana
+ "Castle Ardenvale": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Castle Vantress": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Castle Locthwain": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Castle Embereth": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Castle Garenbrig": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+ "Serra's Sanctum": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Tolarian Academy": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Cabal Coffers": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Gaea's Cradle": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Mono colored lands with basic lands subtype
+ "Idyllic Grange": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Mystic Sanctuary": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Witch's Cottage": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Dwarven Mine": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Gingerbread Cabin": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Mono colored lands with a multicolor activated ability
+ "Axgard Armory": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Surtland Frostpyre": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Skemfar Elderhall": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Mono colored lands that make all lands X basic land type
+ "Urborg, Tomb of Yawgmoth": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Yavimaya, Cradle of Growth": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Vivid lands
+ "Vivid Meadow": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WHITE, con.layers.WHITE, False, False]
+ },
+ "Vivid Creek": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLUE, con.layers.BLUE, False, False]
+ },
+ "Vivid Marsh": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BLACK, con.layers.BLACK, False, False]
+ },
+ "Vivid Crag": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RED, con.layers.RED, False, False]
+ },
+ "Vivid Grove": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Two colored lands that specifically add their colors of mana
+ "Celestial Colonnade": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WU, con.layers.LAND, False, False]
+ },
+ "Creeping Tar Pit": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.UB, con.layers.LAND, False, False]
+ },
+ "Lavaclaw Reaches": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BR, con.layers.LAND, False, False]
+ },
+ "Raging Ravine": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RG, con.layers.LAND, False, False]
+ },
+ "Stirring Wildwood": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GW, con.layers.LAND, False, False]
+ },
+ "Shambling Vent": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WB, con.layers.LAND, False, False]
+ },
+ "Hissing Quagmire": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BG, con.layers.LAND, False, False]
+ },
+ "Lumbering Falls": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GU, con.layers.LAND, False, False]
+ },
+ "Wandering Fumarole": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.UR, con.layers.LAND, False, False]
+ },
+ "Needle Spires": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RW, con.layers.LAND, False, False]
+ },
+
+ # Two colored lands with basic land subtypes
+ "Hallowed Fountain": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WU, con.layers.LAND, False, False]
+ },
+ "Watery Grave": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.UB, con.layers.LAND, False, False]
+ },
+ "Blood Crypt": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BR, con.layers.LAND, False, False]
+ },
+ "Stomping Ground": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RG, con.layers.LAND, False, False]
+ },
+ "Temple Garden": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GW, con.layers.LAND, False, False]
+ },
+ "Godless Shrine": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WB, con.layers.LAND, False, False]
+ },
+ "Overgrown Tomb": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BG, con.layers.LAND, False, False]
+ },
+ "Breeding Pool": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GU, con.layers.LAND, False, False]
+ },
+ "Steam Vents": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.UR, con.layers.LAND, False, False]
+ },
+ "Sacred Foundry": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RW, con.layers.LAND, False, False]
+ },
+
+ # Onslaught/Zendikar fetchlands
+ "Flooded Strand": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WU, con.layers.LAND, False, False]
+ },
+ "Polluted Delta": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.UB, con.layers.LAND, False, False]
+ },
+ "Bloodstained Mire": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BR, con.layers.LAND, False, False]
+ },
+ "Wooded Foothills": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RG, con.layers.LAND, False, False]
+ },
+ "Windswept Heath": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GW, con.layers.LAND, False, False]
+ },
+ "Marsh Flats": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.WB, con.layers.LAND, False, False]
+ },
+ "Verdant Catacombs": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.BG, con.layers.LAND, False, False]
+ },
+ "Misty Rainforest": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GU, con.layers.LAND, False, False]
+ },
+ "Scalding Tarn": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.UR, con.layers.LAND, False, False]
+ },
+ "Arid Mesa": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.RW, con.layers.LAND, False, False]
+ },
+
+ # Other wildcards
+ "Krosan Verge": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GW, con.layers.LAND, False, False]
+ },
+ "Murmuring Bosk": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GREEN, False, False]
+ },
+ "Dryad Arbor": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GREEN, con.layers.GREEN, False, False]
+ },
+
+ # Tri color lands
+ "Arcane Sanctum": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Crumbling Necropolis": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Savage Lands": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Jungle Shrine": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Seaside Citadel": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Sandsteppe Citadel": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Mystic Monastery": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Opulent Palace": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Nomad Outpost": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Frontier Bivouac": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+
+ # Gold lands with varying rules text
+ "Prismatic Vista": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Fabled Passage": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Aether Hub": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "City of Brass": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Mana Confluence": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Ally Encampment": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+ "Command Tower": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.LAND, con.layers.GOLD, con.layers.GOLD, False, False]
+ },
+}
+
+# Singular test
+"""
+test_cases = {
+ "Asmoranomardicadaistinaculdacar": {
+ 'layout': NormalLayout,
+ 'frame': [con.layers.BR, con.layers.BR, con.layers.LAND, False, False]
+ }
+}
+"""
+
+# Test each card
+failed = []
+for card, correct_result in test_cases.items():
+ # Retrieve scryfall for the card
+ scryfall = card_info(card)
+ mock_file_info = {
+ 'name': card,
+ 'artist': '',
+ 'set_code': '',
+ 'creator': '',
+ 'filename': ''
+ }
+ try:
+ layout = layout_map[scryfall['layout']](scryfall, mock_file_info)
+ actual_result = {
+ 'layout': layout_map[scryfall['layout']],
+ 'frame': [layout.background, layout.pinlines, layout.twins, layout.is_nyx, layout.is_colorless]
+ }
+ except Exception as e:
+ print(e)
+ print('Error at:', card)
+ continue
+
+ # Do the results match?
+ if not actual_result == correct_result:
+ print(card)
+ print('Result:', actual_result)
+ print('Desired Result:', correct_result)
+ failed.append({'name': card, 'expected': correct_result, 'actual': actual_result})
+ print("==================================")
+
+ # Scryfall rate limit
+ time.sleep(0.05)
+
+# Look over any failures
+print(failed if failed else "ALL SUCCESSFUL!")
diff --git a/src/tests/utility.py b/src/tests/utility.py
new file mode 100644
index 00000000..87def142
--- /dev/null
+++ b/src/tests/utility.py
@@ -0,0 +1,155 @@
+"""
+TESTING UTILITY
+For contributors and plugin development.
+"""
+# CORE MODULES
+import os
+
+os.chdir(os.path.abspath(os.path.join(os.getcwd())))
+import colorama
+from colorama import Fore
+from operator import itemgetter
+from time import perf_counter
+from typing import Optional, Union, Callable
+
+import photoshop.api as ps
+
+from src.constants import con
+con.headless = True
+import src.helpers as psd
+
+app = ps.Application()
+cID = app.charIDToTypeID
+sID = app.stringIDToTypeID
+
+
+"""
+TEMPLATE TESTING UTILITIES
+"""
+
+
+def test_new_color(new: str, old: Optional[str] = None, ignore: Optional[list[str]] = None):
+ """
+ Enables given color in all necessary groups. Optionally disable a color in those groups.
+ @param new: Color to enable.
+ @param old: Color to disable.
+ @param ignore: Groups to ignore.
+ @return:
+ """
+ if ignore is None:
+ ignore = ["Pinlines & Textbox"]
+ groups = ["Name & Title Boxes", "Legendary Crown", "Pinlines & Textbox", "Background", "PT Box"]
+ for r in ignore:
+ groups.remove(r)
+ for g in groups:
+ # Enable new color
+ psd.getLayer(new, g).visible = True
+ # Disable old color
+ if old:
+ psd.getLayer(old, g).visible = False
+
+
+def make_duals(
+ name="Pinlines & Textbox",
+ mask_top: Optional[str] = "MASK",
+ mask_bottom: Optional[str] = None
+):
+ """
+ Creates dual color layers for a given group.
+ @param name: Name of the group.
+ @param mask_top: Mask to place on top color.
+ @param mask_bottom: Mask to place on bottom color.
+ @return:
+ """
+ duals = ["WU", "WB", "RW", "GW", "UB", "UR", "GU", "BR", "BG", "RG"]
+ group = psd.getLayerSet(name)
+ mask_top = psd.getLayer(mask_top, group) if mask_top else None
+ mask_bottom = psd.getLayer(mask_bottom, group) if mask_bottom else None
+ ref = psd.getLayer("W", group)
+
+ # Loop through each dual
+ for dual in duals:
+ # Change layer visibility
+ top = psd.getLayer(dual[0], group).duplicate(ref, ps.ElementPlacement.PlaceBefore)
+ bottom = psd.getLayer(dual[1], group).duplicate(top, ps.ElementPlacement.PlaceAfter)
+ top.visible = True
+ bottom.visible = True
+
+ # Enable masks
+ if mask_top:
+ psd.copy_layer_mask(mask_top, top)
+ if mask_bottom:
+ psd.copy_layer_mask(mask_bottom, bottom)
+
+ # Merge the layers and rename
+ new_layer = psd.merge_layers([top, bottom])
+ new_layer.name = dual
+
+
+"""
+EXECUTION TIME TESTING
+"""
+
+
+def test_execution_time(
+ new_func: Callable,
+ old_func: Callable,
+ iterations=1000,
+ args_new=None,
+ args_old=None,
+ check_result=True
+) -> None:
+ """
+ Test the execution time of a new function against an older function.
+ @param new_func: New callable function to test.
+ @param old_func: Older callable function to compare against.
+ @param iterations: How many times to run these functions, higher means better sample size.
+ @param args_new: Args to pass to the newer function.
+ @param args_old: Args to pass to the older function.
+ """
+ # Test configuration
+ if not args_new:
+ args_new = []
+ if not args_old:
+ args_old = []
+ colorama.init(autoreset=True)
+ results: list[dict[str, Union[None, int, float, str, list]]] = [
+ {
+ 'value': None,
+ 'average': 0,
+ 'times': [],
+ 'type': 'Newer'
+ },
+ {
+ 'value': None,
+ 'average': 0,
+ 'times': [],
+ 'type': 'Older'
+ }
+ ]
+
+ # Test new functionality
+ for i in range(iterations):
+ s = perf_counter()
+ results[0]['value'] = new_func(*args_new)
+ results[0]['times'].append(perf_counter()-s)
+ results[0]['average'] = sum(results[0]['times'])/len(results[0]['times'])
+
+ # Test old functionality
+ for i in range(iterations):
+ s = perf_counter()
+ results[1]['value'] = old_func(*args_old)
+ results[1]['times'].append(perf_counter()-s)
+ results[1]['average'] = sum(results[1]['times'])/len(results[1]['times'])
+
+ # Report results
+ for i, res in enumerate(results):
+ print(f"{res['type']} method: {res['average']}")
+
+ # Compare results
+ final = sorted(results, key=itemgetter('average'))
+ print(f"{Fore.GREEN}The {final[0]['type']} method is faster by {final[1]['average']-final[0]['average']} seconds!")
+ if check_result:
+ print(f"Results check: {Fore.GREEN+'SUCCESS' if final[0]['value'] == final[1]['value'] else Fore.RED+'FAILED'}")
+ print(final[0]['value'])
+ print(final[1]['value'])
diff --git a/proxyshop/text_layers.py b/src/text_layers.py
similarity index 99%
rename from proxyshop/text_layers.py
rename to src/text_layers.py
index 691d7e65..625aaf01 100644
--- a/proxyshop/text_layers.py
+++ b/src/text_layers.py
@@ -7,10 +7,10 @@
import photoshop.api as ps
from photoshop.api._artlayer import ArtLayer
-import proxyshop.helpers as psd
-from proxyshop.constants import con
-from proxyshop.settings import cfg
-from proxyshop import format_text as ft
+import src.helpers as psd
+from src.constants import con
+from src.settings import cfg
+from src import format_text as ft
# QOL Definitions
app = ps.Application()
diff --git a/proxyshop/update.py b/src/update.py
similarity index 89%
rename from proxyshop/update.py
rename to src/update.py
index 154caf02..9e248ac1 100644
--- a/proxyshop/update.py
+++ b/src/update.py
@@ -15,7 +15,7 @@
from typing import Callable, Optional
import requests
-from proxyshop.constants import con
+from src.constants import con
CHUNK_SIZE = 1024 * 1024 # 1 MB
@@ -89,10 +89,7 @@ def download_google(
header = con.http_header.copy()
# Cookies
- cache_dir = osp.join(con.cwd, "tmp")
- if not osp.exists(cache_dir):
- os.makedirs(cache_dir)
- cookies_file = osp.join(cache_dir, "cookies.json")
+ cookies_file = osp.join(con.path_logs, "cookies.json")
if osp.exists(cookies_file) and use_cookies:
with open(cookies_file) as f:
cookies = json.load(f)
@@ -102,7 +99,6 @@ def download_google(
# Get file resource
while True:
res = sess.get(url, headers=header, stream=True, verify=True)
- print(res.headers)
# Save cookies
with open(cookies_file, "w") as f:
@@ -204,7 +200,14 @@ def get_temp_file(
path: str,
url: str,
) -> dict:
- # Check for existing Temp file, or setup new one
+ """
+ Check for an existing temporary file or create a new one.
+ @param res: Planned download request.
+ @param sess: Current download session.
+ @param path: Planned path name to the completed download.
+ @param url: If resumable, url to generate a new download request.
+ @return: Dict containing temp file path, new download request, and total bytes downloaded.
+ """
existing_tmp_files = []
header = con.http_header.copy()
file_name = osp.basename(path)
@@ -243,6 +246,15 @@ def download_file(
path: Optional[str] = None,
callback: Optional[Callable] = None
) -> bool:
+ """
+ Download file as a temporary file, then rename to its correct filename.
+ @param file: File path to download to.
+ @param res: Download request.
+ @param sess: Download session.
+ @param path: Final path to save the completed temporary file.
+ @param callback: Callback to update download progress.
+ @return: True if download completed without error, otherwise False.
+ """
# Try to download the file
total = int(res.headers.get("Content-Length") or 1)
current = int(os.path.getsize(file))
diff --git a/src/utils/enums_photoshop.py b/src/utils/enums_photoshop.py
new file mode 100644
index 00000000..a1cd6294
--- /dev/null
+++ b/src/utils/enums_photoshop.py
@@ -0,0 +1,56 @@
+"""
+Enums for Photoshop Actions
+"""
+from enum import Enum
+from typing import Literal, Union
+
+import photoshop.api as ps
+app = ps.Application()
+cID = app.charIDToTypeID
+sID = app.stringIDToTypeID
+
+
+class Alignment(Enum):
+ """
+ Layer alignment descriptors.
+ """
+ Top: int = int(sID('ADSTops'))
+ Bottom: int = int(sID('ADSBottoms'))
+ Left: int = int(sID('ADSLefts'))
+ Right: int = int(sID('ADSRights'))
+ CenterHorizontal: int = int(sID('ADSCentersH'))
+ CenterVertical: int = int(sID('ADSCentersV'))
+
+
+class Stroke(Enum):
+ """
+ Stroke effect descriptors.
+ """
+ Inside: int = int(sID('insetFrame'))
+ Outside: int = int(sID('outsetFrame'))
+ Center: int = int(sID('centeredFrame'))
+
+ @staticmethod
+ def position(
+ pos: Literal[
+ 'in', 'insetFrame',
+ 'out', 'outsetFrame',
+ 'center', 'centeredFrame'
+ ]
+ ) -> Union[
+ 'Stroke.Inside.value',
+ 'Stroke.Outside.value',
+ 'Stroke.Center.value'
+ ]:
+ """
+ Get the proper stroke action enum from canonical user input.
+ @param pos: "in", "out", or "center"
+ @return: Proper action descriptor ID.
+ """
+ if pos in ['in', 'insetFrame']:
+ return Stroke.Inside.value
+ elif pos in ['out', 'outsetFrame']:
+ return Stroke.Outside.value
+ elif pos in ['center', 'centeredFrame']:
+ return Stroke.Center.value
+ return Stroke.Outside.value
diff --git a/src/utils/files.py b/src/utils/files.py
new file mode 100644
index 00000000..9fdddc9a
--- /dev/null
+++ b/src/utils/files.py
@@ -0,0 +1,80 @@
+"""
+File Utilities
+"""
+import json
+from configparser import ConfigParser
+from os import path as osp
+
+
+def verify_config_fields(ini_file: str, json_file: str):
+ """
+ Validate that all settings fields present in a given json data are present in config file.
+ If any are missing, add them and return
+ @param ini_file: Config file to verify contains the proper fields.
+ @param json_file: Json file containing config fields to check for.
+ """
+ # Track data
+ data = {}
+ changed = False
+
+ # Load the json
+ if not osp.exists(json_file):
+ return
+ with open(json_file, "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ # Load the config
+ conf_file = ConfigParser(allow_no_value=True)
+ conf_file.optionxform = str
+ if not osp.exists(ini_file):
+ # Create a blank file if it doesn't exist
+ with open(ini_file, "w", encoding="utf-8") as f:
+ conf_file.write(f)
+ with open(ini_file, "r", encoding="utf-8") as f:
+ conf_file.read_file(f)
+
+ # Build a dictionary of the necessary values
+ for row in raw:
+ # Add row if it's not a title
+ if row['type'] == 'title':
+ continue
+ data.setdefault(row['section'], []).append({
+ 'key': row.get('key', ''),
+ 'value': row.get('default', 0)
+ })
+
+ # Add the data to ini where missing
+ for section, settings in data.items():
+ # Check if the section exists
+ if not conf_file.has_section(section):
+ conf_file.add_section(section)
+ changed = True
+ # Check if each setting exists
+ for setting in settings:
+ if not conf_file.has_option(section, setting['key']):
+ conf_file.set(section, setting['key'], str(setting['value']))
+ changed = True
+
+ # If ini has changed, write changes
+ if changed:
+ with open(ini_file, "w", encoding="utf-8") as f:
+ conf_file.write(f)
+
+
+def get_valid_config_json(json_file: str):
+ """
+ Return valid JSON data for use with settings panel.
+ @param json_file: Path to json file.
+ @return: Json string dump of validated data.
+ """
+ # Load the json
+ with open(json_file, "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ # Remove unsupported keys
+ for row in raw:
+ if 'default' in row:
+ row.pop('default')
+
+ # Return json data
+ return json.dumps(raw)
diff --git a/src/utils/fonts.py b/src/utils/fonts.py
new file mode 100644
index 00000000..1514e79b
--- /dev/null
+++ b/src/utils/fonts.py
@@ -0,0 +1,87 @@
+import ctypes
+from ctypes import wintypes
+import os.path as osp
+from typing import Union
+
+from photoshop.api.enumerations import LayerKind
+from photoshop.api._layerSet import LayerSet
+from photoshop.api._document import Document
+import photoshop.api as ps
+from _ctypes import COMError
+
+app = ps.Application()
+
+
+def register_font(font_path: str) -> bool:
+ """
+ Add FontResource using given font file, refresh Photoshop fonts.
+ @param font_path: Path to compatible font file.
+ @return: True if succeeded, False if failed.
+ """
+ result = ctypes.windll.gdi32.AddFontResourceW(osp.abspath(font_path))
+ if result != 0:
+ # Font Resource added successfully
+ try:
+ # Notify all programs
+ print(f"{osp.basename(font_path)} added to font cache!")
+ hwnd_broadcast = wintypes.HWND(-1)
+ ctypes.windll.user32.SendMessageW(
+ hwnd_broadcast, wintypes.UINT(0x001D), wintypes.WPARAM(0), wintypes.LPARAM(0)
+ )
+ app.refreshFonts()
+ except Exception as e:
+ print(e)
+ return True
+ return False
+
+
+def unregister_font(font_path: str) -> bool:
+ """
+ Remove FontResource using given font file, refresh Photoshop fonts.
+ @param font_path: Path to compatible font file.
+ @return: True if succeeded, False if failed.
+ """
+ result = ctypes.windll.gdi32.RemoveFontResourceW(osp.abspath(font_path))
+ if result != 0:
+ # Font Resource removed successfully
+ try:
+ # Notify all programs
+ print(f"{osp.basename(font_path)} removed from font cache!")
+ hwnd_broadcast = wintypes.HWND(-1)
+ ctypes.windll.user32.SendMessageW(
+ hwnd_broadcast, wintypes.UINT(0x001D), wintypes.WPARAM(0), wintypes.LPARAM(0)
+ )
+ app.refreshFonts()
+ except Exception as e:
+ print(e)
+ return True
+ return False
+
+
+def get_all_fonts(container: Union[Document, LayerSet]) -> set:
+ """
+ Get a list of all fonts used in a given Photoshop Document or LayerSet.
+ @param container: Photoshop Document or LayerSet object.
+ @return: Unique list of font names.
+ """
+ fonts = set()
+ for layer in container.artLayers:
+ if layer.kind == LayerKind.TextLayer:
+ fonts.add(layer.textItem.font)
+ for group in container.layerSets:
+ fonts |= get_all_fonts(group)
+ return fonts
+
+
+def check_fonts(fonts: list) -> list:
+ """
+ Check the name and postScriptName of every installed font against a given font list.
+ @return: Array of missing fonts or []
+ """
+ for f in app.fonts:
+ try:
+ if f.postScriptName in fonts:
+ fonts.remove(f.postScriptName)
+ except COMError:
+ continue
+ return fonts
diff --git a/src/utils/strings.py b/src/utils/strings.py
new file mode 100644
index 00000000..d4331cb2
--- /dev/null
+++ b/src/utils/strings.py
@@ -0,0 +1,71 @@
+"""
+Utility Helpers Module
+"""
+import unicodedata
+import string
+
+import photoshop.api as ps
+from packaging.version import parse
+
+from src.constants import con
+
+"""
+STRING UTILITIES
+"""
+
+
+def normalize_str(st: str, no_space: bool = False) -> str:
+ """
+ Normalizes a string for safe comparison.
+ @param st: String to normalize.
+ @param no_space: Remove spaces.
+ @return: Normalized string.
+ """
+ # Ignore accents and unusual characters, all lowercase
+ st = unicodedata.normalize("NFD", st).encode("ascii", "ignore").decode("utf8").lower()
+
+ # Remove spaces?
+ if no_space:
+ st = st.replace(' ', '')
+
+ # Remove punctuation
+ return st.translate(str.maketrans("", "", string.punctuation))
+
+
+def ps_version_check(check_version: str) -> bool:
+ """
+ Checks that current Photoshop version matches or exceeds given value.
+ @param check_version: Version to meet or exceed.
+ @return: True or False
+ """
+ current_version = ps.Application().version
+ if parse(current_version) >= parse(check_version):
+ return True
+ return False
+
+
+def msg_error(msg: str) -> str:
+ """
+ Adds unified error color tag to Proxyshop console message.
+ @param msg: String to add tag to.
+ @return: Formatted string.
+ """
+ return f'[color={con.console_message_error}]{msg}[/color]'
+
+
+def msg_warn(msg: str) -> str:
+ """
+ Adds unified warning color tag to Proxyshop console message.
+ @param msg: String to add tag to.
+ @return: Formatted string.
+ """
+ return f'[color={con.console_message_warning}]{msg}[/color]'
+
+
+def msg_success(msg: str) -> str:
+ """
+ Adds unified success color tag to Proxyshop console message.
+ @param msg: String to add tag to.
+ @return: Formatted string.
+ """
+ return f'[color={con.console_message_success}]{msg}[/color]'
diff --git a/src/utils/types_photoshop.py b/src/utils/types_photoshop.py
new file mode 100644
index 00000000..7c8b4b8b
--- /dev/null
+++ b/src/utils/types_photoshop.py
@@ -0,0 +1,71 @@
+"""
+Types for Photoshop Actions
+"""
+from typing import TypedDict, Literal, Union
+
+from photoshop.api import SolidColor
+from typing_extensions import NotRequired
+
+"""
+LAYER EFFECTS
+"""
+
+
+class EffectStroke(TypedDict):
+ """
+ Layer Effect - Stroke
+ """
+ type: Literal['stroke']
+ weight: NotRequired[int]
+ color: SolidColor
+ opacity: NotRequired[int]
+ style: Literal[
+ 'in', 'insetFrame',
+ 'out', 'outsetFrame',
+ 'center', 'centeredFrame'
+ ]
+
+
+class EffectDropShadow(TypedDict):
+ """
+ Layer Effect - Drop Shadow
+ """
+ type: Literal['drop-shadow']
+ opacity: NotRequired[int]
+ rotation: NotRequired[int]
+ distance: NotRequired[int]
+ spread: NotRequired[int]
+ size: NotRequired[int]
+
+
+class EffectGradientColor(TypedDict):
+ """
+ An individual color within a Gradient Layer Effect.
+ """
+ color: SolidColor
+ location: NotRequired[int]
+ midpoint: NotRequired[int]
+
+
+class EffectGradientOverlay(TypedDict):
+ """
+ Layer Effect - Drop Shadow
+ """
+ type: Literal['gradient-overlay']
+ size: NotRequired[int]
+ scale: NotRequired[int]
+ rotation: NotRequired[int]
+ opacity: NotRequired[int]
+ colors: list[EffectGradientColor]
+
+
+class EffectColorOverlay(TypedDict):
+ """
+ Layer Effect - Color Overlay
+ """
+ type: Literal['color-overlay']
+ opacity: NotRequired[int]
+ color: SolidColor
+
+
+LayerEffects = Union[EffectStroke, EffectDropShadow, EffectGradientOverlay, EffectColorOverlay]