Merge pull request #10 from gaseous-project/develop

Develop
This commit is contained in:
Michael Green
2023-07-11 00:51:03 +10:00
committed by GitHub
119 changed files with 13449 additions and 224 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

16
Dockerfile Normal file
View File

@@ -0,0 +1,16 @@
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
WORKDIR /App
EXPOSE 80
# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore "gaseous-server/gaseous-server.csproj"
# Build and publish a release
RUN dotnet publish "gaseous-server/gaseous-server.csproj" -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "gaseous-server.dll"]

View File

@@ -15,7 +15,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-tools", "gaseous-to
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-server", "gaseous-server\gaseous-server.csproj", "{A01D2EFF-C82E-473B-84D7-7C25E736F5D2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-server", "gaseous-server\gaseous-server.csproj", "{A01D2EFF-C82E-473B-84D7-7C25E736F5D2}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{B07A4655-A003-416B-A790-ADAA5B548E1A}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{17FA6F12-8532-420C-9489-CB8FDE42137C}"
ProjectSection(SolutionItems) = preProject
docker-compose.yml = docker-compose.yml
Dockerfile = Dockerfile
README.MD = README.MD
LICENSE = LICENSE
EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

97
README.MD Normal file
View File

@@ -0,0 +1,97 @@
# Gaseous Server
This is the server for the Gaseous system. All your games and metadata are stored within.
## Requirements
* MySQL Server 8+
* Internet Game Database API Key. See: https://api-docs.igdb.com/#account-creation
## Third Party Projects
The following projects are used by Gaseous
* https://dotnet.microsoft.com/en-us/apps/aspnet
* https://github.com/JamesNK/Newtonsoft.Json
* https://www.nuget.org/packages/MySql.Data/8.0.32.1
* https://github.com/kamranayub/igdb-dotnet
## Configuration File
When Gaseous-Server is started for the first time, it creates a configuration file at ~/.gaseous-server/config.json if it doesn't exist. Some values can be filled in using environment variables (such as in the case of using docker).
### DatabaseConfiguration
| Attribute | Environment Variable |
| --------- | -------------------- |
| HostName | dbhost |
| UserName | dbuser |
| Password | dbpass |
### IGDBConfiguration
| Attribute | Environment Variable |
| --------- | -------------------- |
| ClientId | igdbclientid |
| Secret. | igdbclientsecret |
### config.json
```json
{
"DatabaseConfiguration": {
"HostName": "localhost",
"UserName": "gaseous",
"Password": "gaseous",
"DatabaseName": "gaseous",
"Port": 3306
},
"IGDBConfiguration": {
"ClientId": "<clientid>",
"Secret": "<secret>"
},
"LoggingConfiguration": {
"DebugLogging": false,
"LogFormat": "text"
}
}
```
## Deploy with Docker
Dockerfile and docker-compose.yml files have been provided to make deployment of the server as easy as possible.
1. Clone the repo with "git clone https://github.com/gaseous-project/gaseous-server.git"
2. Change into the gaseous-server directory
3. Open the docker-compose.yml file and edit the igdbclientid and igdbclientsecret to the values retrieved from your IGDB account
4. Run the command "docker-compose up -d"
5. Connect to the host on port 5198
## Adding Content
While games can be added to the server without them, it is recommended adding some signature DAT files beforehand to allow for better matching of ROM to game.
These signature DAT files contain a list of titles with hashes for many of the ROM images that have been found by the community.
Currently only TOSEC is supported, though more will be added.
### Adding signature DAT files
1. Download the DAT files from the source website. For example; from https://www.tosecdev.org/downloads/category/56-2023-01-23
2. Extract the archive
3. Copy the DAT files to ~/.gaseous-server/Data/Signatures/TOSEC/
### Adding game image files
1. Ensure your game image file is unzipped, and clearly named. Attempting a search for the game name on https://www.igdb.com can help with file naming. If a hash search is unsuccessful, Gaseous will fall back to attempting to search by the file name.
2. Copy the file to ~/.gaseous-server/Data/Import
Image to game matching follows the following order of operations, stopping the process at the first match:
### Get the file signature
1. Attempt a hash search
2. Attempt to search the signature database for a rom matching the file name - sometimes the hash can not be matched as a highscore table for example was saved to the image
3. Attempt to parse the file name - clues such as the extension being used to define which platform the file belongs to are used to create a search criteria
### Create a list of search candidates
Before beginning, remove any version numbers.
1. Add the full name of the image
2. Add the name of the image with any " - " replaced by ": "
3. Add the name of the image with text after a " - " removed
4. Add the name of the image with text after a ": " removed
### Search IGDB for a game match
Loop through each of the search candidates searching using:
1. "where" - exact match as the search candidate
2. "wherefuzzy" - partial match using wildcards
3. "search" - uses a more flexible search method
Note: that if more than one result is found, the image will be set as "Unknown" as there is no way for Gaseous to know which title is the correct one.

39
docker-compose.yml Normal file
View File

@@ -0,0 +1,39 @@
version: '2'
services:
gaseous-server:
container_name: gaseous-server
build:
context: ./
restart: unless-stopped
networks:
- gaseous
depends_on:
- gsdb
ports:
- 5198:80
volumes:
- gs:/root/.gaseous-server
environment:
- dbhost=gsdb
- dbuser=root
- dbpass=gaseous
- igdbclientid=<clientid>
- igdbclientsecret=<clientsecret>
gsdb:
container_name: gsdb
image: mysql:8
restart: unless-stopped
networks:
- gaseous
volumes:
- gsdb:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=gaseous
- MYSQL_USER=gaseous
- MYSQL_PASSWORD=gaseous
networks:
gaseous:
driver: bridge
volumes:
gs:
gsdb:

View File

@@ -72,6 +72,14 @@ namespace gaseous_romsignatureobject
public string? RomTypeMedia { get; set; } public string? RomTypeMedia { get; set; }
public string? MediaLabel { get; set; } public string? MediaLabel { get; set; }
public SignatureSourceType SignatureSource { get; set; }
public enum SignatureSourceType
{
None = 0,
TOSEC = 1
}
public enum RomTypes public enum RomTypes
{ {
/// <summary> /// <summary>

BIN
gaseous-server/.DS_Store vendored Normal file

Binary file not shown.

BIN
gaseous-server/Assets/.DS_Store vendored Normal file

Binary file not shown.

BIN
gaseous-server/Assets/Ratings/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
<path d="M 191.70234,175.91171 C 191.70234,184.38715 184.75204,190.93635 176.2572,190.93635 L 24.122669,190.93635 C 16.013959,190.93635 9.0636492,184.38715 9.0636492,175.91171 L 9.0636492,24.124519 C 9.0636492,16.034357 16.013959,9.0999218 24.122669,9.0999218 L 176.2572,9.0999218 C 184.75204,9.0999218 191.70234,16.034357 191.70234,24.124519 L 191.70234,175.91171 z" fill="none" stroke="#fff" stroke-width="18.1273"/>
<path d="M 190.98805,175.92545 C 190.98805,184.40244 184.0643,190.95282 175.60192,190.95282 L 24.048621,190.95282 C 15.970885,190.95282 9.0471341,184.40244 9.0471341,175.92545 L 9.0471341,24.110631 C 9.0471341,16.018998 15.970885,9.0832994 24.048621,9.0832994 L 175.60192,9.0832994 C 184.0643,9.0832994 190.98805,16.018998 190.98805,24.110631 L 190.98805,175.92545 z" fill="#33a02c" stroke-width="18.0943"/>
<path d="M 115.9807,132.38466 C 111.36484,137.3938 105.97972,138.93505 99.82527,138.93505 C 93.286167,138.93505 88.285658,137.00844 84.054486,132.76997 C 78.28468,126.99021 78.28468,119.6692 78.28468,109.65096 C 78.28468,99.632729 78.28468,92.311719 84.054486,86.531956 C 88.285658,82.293484 93.286167,79.98157 99.82527,79.98157 C 113.28812,79.98157 119.82722,88.84387 121.36586,98.862105 L 110.2109,98.862105 C 108.6723,93.082343 105.59508,90.385117 99.82527,90.385117 C 96.748043,90.385117 94.055464,91.541095 92.516871,93.467654 C 90.20894,95.779568 89.824292,98.476793 89.824292,109.65096 C 89.824292,120.82514 90.20894,123.52236 92.516871,125.83427 C 94.055464,127.76088 96.748043,128.91681 99.82527,128.91681 C 102.9025,128.91681 105.97972,127.76088 107.90296,125.83427 C 109.4416,123.52236 110.2109,121.21049 110.2109,118.12795 L 110.2109,115.81604 L 99.82527,115.81604 L 99.82527,106.56843 L 121.36586,106.56843 L 121.36586,115.04541 C 121.36586,123.13705 120.21187,128.14619 115.9807,132.38466 z" fill="#fff"/>
<path d="M 99.82527,48.770929 C 102.9025,53.780025 153.29203,138.93505 156.36926,144.3295 C 150.21481,144.3295 49.820382,144.3295 43.665928,144.3295 C 46.743155,138.93505 97.132691,53.780025 99.82527,48.770929 z M 98.286677,44.147102 L 37.126826,148.18266 L 162.90836,148.18266 L 99.82527,41.449877 L 98.286677,44.147102 z" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200" id="svg2">
<defs id="defs4"/>
<g id="g2613">
<path d="M 191.70254,175.91169 C 191.70254,184.38714 184.75223,190.93633 176.25738,190.93633 L 24.122712,190.93633 C 16.013988,190.93633 9.0636773,184.38714 9.0636773,175.91169 L 9.0636773,24.124507 C 9.0636773,16.034343 16.013988,9.0999058 24.122712,9.0999058 L 176.25738,9.0999058 C 184.75223,9.0999058 191.70254,16.034343 191.70254,24.124507 L 191.70254,175.91169 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 18.1273;" id="path3596"/>
<path d="M 191.50948,175.91169 C 191.50948,184.0019 184.94529,190.93633 176.45044,190.93633 L 24.315773,190.93633 C 16.207092,190.93633 9.2567391,184.0019 9.2567391,175.91169 L 9.2567391,24.124465 C 9.2567391,15.64906 16.207092,9.0998638 24.315773,9.0998638 L 176.45044,9.0998638 C 184.94529,9.0998638 191.50948,15.64906 191.50948,24.124465 L 191.50948,175.91169 z " style="fill: rgb(0, 160, 198); fill-opacity: 1; stroke: none; stroke-width: 4.314; stroke-miterlimit: 4; stroke-dasharray: none;" id="path4000"/>
<path d="M 191.50948,175.91169 C 191.50948,184.0019 184.94529,190.93633 176.45044,190.93633 L 24.315773,190.93633 C 16.207092,190.93633 9.2567391,184.0019 9.2567391,175.91169 L 9.2567391,24.124465 C 9.2567391,15.64906 16.207092,9.0998638 24.315773,9.0998638 L 176.45044,9.0998638 C 184.94529,9.0998638 191.50948,15.64906 191.50948,24.124465 L 191.50948,175.91169 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 1.15706;" id="path5000"/>
<path d="M 116.98664,132.37881 L 116.98664,95.009892 L 104.63051,119.28042 L 96.135706,119.28042 L 83.779579,95.009892 L 83.779579,132.37881 L 71.423453,132.37881 L 71.423453,68.427867 L 83.779579,68.427867 L 100.38311,103.10006 L 116.98664,68.427867 L 129.34276,68.427867 L 129.34276,132.37881 L 116.98664,132.37881 z " style="fill: rgb(255, 255, 255);" id="path6000"/>
<path d="M 51.730892,100.01808 C 51.730892,73.050812 73.740237,51.476973 100.38311,51.476973 C 127.4121,51.476973 149.03532,73.050812 149.03532,100.01808 C 149.03532,126.6001 127.4121,148.55918 100.38311,148.55918 C 73.740237,148.55918 51.730892,126.6001 51.730892,100.01808 z M 47.483489,100.01808 C 47.483489,128.9116 71.423453,152.79689 100.38311,152.79689 C 129.72889,152.79689 153.28273,128.9116 153.28273,100.01808 C 153.28273,70.739318 129.72889,47.239271 100.38311,47.239271 C 71.423453,47.239271 47.483489,70.739318 47.483489,100.01808 z " style="fill: rgb(255, 255, 255);" id="path7000"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200" id="svg2">
<defs id="defs4"/>
<g id="g2844">
<path d="M 191.70229,175.91125 C 191.70229,184.38669 184.75199,190.93589 176.25715,190.93589 L 24.122622,190.93589 C 16.013906,190.93589 9.0636022,184.38669 9.0636022,175.91125 L 9.0636022,24.124059 C 9.0636022,16.033897 16.013906,9.0994615 24.122622,9.0994615 L 176.25715,9.0994615 C 184.75199,9.0994615 191.70229,16.033897 191.70229,24.124059 L 191.70229,175.91125 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 18.1273;" id="path3606"/>
<path d="M 191.70225,176.10391 C 191.70225,184.19407 184.75194,191.12851 176.25715,191.12851 L 24.508746,191.12851 C 16.013906,191.12851 9.0636022,184.19407 9.0636022,176.10391 L 9.0636022,24.316722 C 9.0636022,15.841277 16.013906,8.9068406 24.508746,8.9068406 L 176.25715,8.9068406 C 184.75194,8.9068406 191.70225,15.841277 191.70225,24.316722 L 191.70225,176.10391 z " style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: none; stroke-width: 4.31371;" id="path3607"/>
<path d="M 191.70225,176.10391 C 191.70225,184.19407 184.75194,191.12851 176.25715,191.12851 L 24.508746,191.12851 C 16.013906,191.12851 9.0636022,184.19407 9.0636022,176.10391 L 9.0636022,24.316722 C 9.0636022,15.841277 16.013906,8.9068406 24.508746,8.9068406 L 176.25715,8.9068406 C 184.75194,8.9068406 191.70225,15.841277 191.70225,24.316722 L 191.70225,176.10391 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 1.15706;" id="path3608"/>
<path d="M 9.0636022,150.67762 L 9.0636022,176.10391 C 9.0636022,184.19407 16.013906,191.12851 24.122622,191.12851 L 176.25715,191.12851 C 184.75194,191.12851 191.31613,184.19407 191.31613,176.10391 L 191.31613,150.67762 L 9.0636022,150.67762 z " style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0); stroke-width: 1.15706;" id="path3609"/>
<path d="M 30.300638,161.46452 L 25.667116,161.46452 L 25.667116,168.01371 L 30.300638,168.01371 C 32.61742,168.01371 33.775789,166.85798 33.775789,164.93173 C 33.775789,162.62028 32.61742,161.46452 30.300638,161.46452 z M 34.161955,179.57113 L 29.528391,170.71044 L 25.667116,170.71044 L 25.667116,179.57113 L 22.578087,179.57113 L 22.578087,158.76778 L 30.686803,158.76778 C 34.548078,158.76778 37.250941,161.07927 37.250941,164.93173 C 37.250941,168.01371 35.320325,169.55472 33.003543,170.3252 L 37.637107,179.57113 L 34.161955,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3621"/>
<path d="M 41.112259,179.57113 L 41.112259,158.76778 L 54.626744,158.76778 L 54.626744,161.46452 L 44.201288,161.46452 L 44.201288,167.62847 L 53.082208,167.62847 L 53.082208,170.3252 L 44.201288,170.3252 L 44.201288,176.8744 L 54.626744,176.8744 L 54.626744,179.57113 L 41.112259,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3610"/>
<path d="M 63.507664,179.95637 C 60.418678,179.95637 58.101895,179.18589 56.171237,177.25964 L 58.488019,174.94815 C 60.032512,176.48915 61.577047,176.8744 63.893829,176.8744 C 66.596693,176.8744 68.141228,175.71867 68.141228,173.79242 C 68.141228,173.02194 67.755105,172.25145 67.368981,171.48093 C 66.596693,171.09569 66.210569,170.71044 65.052199,170.71044 L 62.349294,170.3252 C 60.804801,170.3252 59.260265,169.55472 58.488019,168.78423 C 57.329649,167.62847 56.943483,166.47274 56.943483,164.54649 C 56.943483,161.07927 59.646389,158.38254 63.893829,158.38254 C 66.596693,158.38254 68.527351,159.15306 70.45801,161.07927 L 68.527351,163.00552 C 66.982858,161.84976 65.824446,161.46452 63.893829,161.46452 C 61.577047,161.46452 60.032512,162.62028 60.032512,164.54649 C 60.032512,165.31698 60.418678,166.0875 60.804801,166.47274 C 61.190924,166.85798 62.349294,167.24323 63.121541,167.62847 L 65.438323,168.01371 C 67.368981,168.01371 68.527351,168.78423 69.685721,169.55472 C 70.45801,170.3252 71.230257,171.86617 71.230257,173.79242 C 71.230257,177.64488 68.141228,179.95637 63.507664,179.95637 z " style="fill: rgb(255, 255, 255);" id="path3611"/>
<path d="M 82.041836,161.46452 L 82.041836,179.57113 L 78.566684,179.57113 L 78.566684,161.46452 L 72.77475,161.46452 L 72.77475,158.76778 L 87.447647,158.76778 L 87.447647,161.46452 L 82.041836,161.46452 z " style="fill: rgb(255, 255, 255);" id="path3612"/>
<path d="M 98.259226,161.46452 L 93.625704,161.46452 L 93.625704,168.01371 L 98.259226,168.01371 C 100.57601,168.01371 102.1205,166.85798 102.1205,164.93173 C 102.1205,162.62028 100.57601,161.46452 98.259226,161.46452 z M 102.1205,179.57113 L 97.873103,170.71044 L 93.625704,170.71044 L 93.625704,179.57113 L 90.536675,179.57113 L 90.536675,158.76778 L 98.645349,158.76778 C 102.50662,158.76778 105.20953,161.07927 105.20953,164.93173 C 105.20953,168.01371 103.27887,169.55472 100.96213,170.3252 L 105.98178,179.57113 L 102.1205,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3640"/>
<path d="M 109.07081,179.57113 L 112.15983,179.57113 L 112.15983,158.76778 L 109.07081,158.76778 L 109.07081,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3613"/>
<path d="M 123.7437,179.95637 C 121.81304,179.95637 119.88243,179.18589 118.33789,177.64488 C 116.40723,175.71867 116.40723,173.40718 116.40723,169.16948 C 116.40723,165.31698 116.40723,163.00552 118.33789,160.69403 C 119.88243,159.15306 121.81304,158.38254 123.7437,158.38254 C 127.60498,158.38254 130.69401,160.69403 131.46625,164.93173 L 127.9911,164.93173 C 127.60498,163.00552 126.06044,161.46452 123.7437,161.46452 C 122.58529,161.46452 121.42692,161.84976 120.65467,162.62028 C 119.88243,163.77601 119.49626,164.93173 119.49626,169.16948 C 119.49626,173.40718 119.88243,174.5629 120.65467,175.71867 C 121.42692,176.48915 122.58529,176.8744 123.7437,176.8744 C 126.06044,176.8744 127.60498,175.33343 127.9911,173.40718 L 131.46625,173.40718 C 130.69401,177.64488 127.60498,179.95637 123.7437,179.95637 z " style="fill: rgb(255, 255, 255);" id="path3614"/>
<path d="M 141.50559,161.46452 L 141.50559,179.57113 L 138.03043,179.57113 L 138.03043,161.46452 L 132.2385,161.46452 L 132.2385,158.76778 L 147.29752,158.76778 L 147.29752,161.46452 L 141.50559,161.46452 z " style="fill: rgb(255, 255, 255);" id="path3615"/>
<path d="M 150.00042,179.57113 L 150.00042,158.76778 L 163.51491,158.76778 L 163.51491,161.46452 L 153.08945,161.46452 L 153.08945,167.62847 L 161.97037,167.62847 L 161.97037,170.3252 L 153.08945,170.3252 L 153.08945,176.8744 L 163.51491,176.8744 L 163.51491,179.57113 L 150.00042,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3616"/>
<path d="M 177.80164,163.00552 C 176.64327,161.84976 175.48486,161.46452 173.94037,161.46452 L 170.07909,161.46452 L 170.07909,176.8744 L 173.94037,176.8744 C 175.48486,176.8744 176.64327,176.48915 177.80164,175.33343 C 178.96001,174.17766 178.96001,171.86617 178.96001,169.16948 C 178.96001,166.0875 178.96001,164.16125 177.80164,163.00552 z M 179.7323,177.64488 C 178.57389,179.18589 176.64327,179.57113 174.32649,179.57113 L 166.99006,179.57113 L 166.99006,158.76778 L 174.32649,158.76778 C 176.64327,158.76778 178.57389,159.53831 179.7323,160.69403 C 182.04904,163.00552 182.04904,166.0875 182.04904,169.16948 C 182.04904,172.25145 182.04904,175.33343 179.7323,177.64488 z " style="fill: rgb(255, 255, 255);" id="path3617"/>
<path d="M 136.87206,93.661123 L 136.87206,67.079105 L 131.08013,72.08729 L 131.08013,68.620072 L 136.87206,63.611887 L 139.96109,63.611887 L 139.96109,93.661123 L 136.87206,93.661123 z " style="fill: rgb(255, 255, 255);" id="path3618"/>
<path d="M 159.26747,91.734872 C 157.72298,92.890597 155.79232,94.046365 153.08945,94.046365 C 150.38655,94.046365 148.45589,92.890597 146.9114,91.734872 C 145.75298,90.579147 144.98074,88.652896 144.98074,86.341403 L 148.06977,86.341403 C 148.45589,89.423379 150.00042,91.34963 153.08945,91.34963 C 154.63395,91.34963 155.79232,90.579147 156.95073,89.808663 C 158.49522,88.267654 158.49522,85.956161 158.49522,83.644711 C 158.49522,80.177493 157.72298,76.324991 153.47558,76.324991 C 150.77267,76.324991 148.84201,77.480758 148.45589,79.406967 L 145.75298,79.406967 L 145.75298,63.611887 L 160.812,63.611887 L 160.812,66.308579 L 148.45589,66.308579 L 148.45589,75.939749 C 149.6143,74.398782 151.54492,73.628299 153.8617,73.628299 C 156.17848,73.628299 157.72298,74.398782 158.88135,75.554508 C 161.19813,77.866 161.58425,80.947976 161.58425,83.644711 C 161.58425,86.726687 161.19813,89.423379 159.26747,91.734872 z " style="fill: rgb(255, 255, 255);" id="path3619"/>
<path d="M 175.87098,83.644711 L 175.87098,91.34963 L 172.782,91.34963 L 172.782,83.644711 L 165.44553,83.644711 L 165.44553,80.947976 L 172.782,80.947976 L 172.782,73.628299 L 175.87098,73.628299 L 175.87098,80.947976 L 183.20745,80.947976 L 183.20745,83.644711 L 175.87098,83.644711 z " style="fill: rgb(255, 255, 255);" id="path3645"/>
<path d="M 65.052199,99.825075 L 65.052199,76.710275 L 57.715772,91.734872 L 52.309961,91.734872 L 44.587411,76.710275 L 44.587411,99.825075 L 36.864818,99.825075 L 36.864818,60.52991 L 44.587411,60.52991 L 55.012867,81.71846 L 65.438323,60.52991 L 72.77475,60.52991 L 72.77475,99.825075 L 65.052199,99.825075 z " style="fill: rgb(255, 255, 255);" id="path3620"/>
<path d="M 92.853415,72.08729 L 87.83377,86.341403 L 97.873103,86.341403 L 92.853415,72.08729 z M 102.1205,99.825075 L 99.803719,92.890597 L 85.903111,92.890597 L 83.200206,99.825075 L 75.091532,99.825075 L 89.764387,60.52991 L 95.942444,60.52991 L 110.22922,99.825075 L 102.1205,99.825075 z " style="fill: rgb(255, 255, 255);" id="path3671"/>
<path d="M 100.18988,41.26757 C 100.96213,42.423295 123.35758,78.636484 124.12983,79.792251 C 123.35758,80.947976 100.96213,117.16117 100.18988,118.31689 C 99.031473,118.31689 46.518027,118.31689 44.973534,118.31689 C 44.587411,117.16117 22.191964,80.947976 21.033594,79.792251 C 22.191964,78.636484 44.587411,42.423295 44.973534,41.26757 C 46.518027,41.26757 99.031473,41.26757 100.18988,41.26757 z M 100.96213,38.956077 L 43.815122,38.956077 L 18.330688,79.792251 L 43.815122,120.62838 L 101.73438,120.62838 L 127.21885,79.792251 L 101.73438,38.956077 L 100.96213,38.956077 z " style="fill: rgb(255, 255, 255);" id="path3622"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="200" height="200" id="svg2">
<defs id="defs4"/>
<g id="g2419">
<path d="M 191.30964,175.90856 C 191.30964,184.38568 184.37363,190.93617 175.89627,190.93617 L 24.074649,190.93617 C 15.98261,190.93617 9.0466018,184.38568 9.0466018,175.90856 L 9.0466018,24.09143 C 9.0466018,15.999673 15.98261,9.0638694 24.074649,9.0638694 L 175.89627,9.0638694 C 184.37363,9.0638694 191.30964,15.999673 191.30964,24.09143 L 191.30964,175.90856 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 18.1104;" id="path3490"/>
<path d="M 191.11694,175.90861 C 191.11694,184.00036 184.56626,190.93617 176.08893,190.93617 L 24.267313,190.93617 C 16.175275,190.93617 9.2392663,184.00036 9.2392663,175.90861 L 9.2392663,24.091472 C 9.2392663,15.614356 16.175275,9.0638694 24.267313,9.0638694 L 176.08893,9.0638694 C 184.56626,9.0638694 191.11694,15.614356 191.11694,24.091472 L 191.11694,175.90861 z " style="fill: rgb(255, 255, 0); fill-opacity: 1; stroke: none; stroke-width: 4.31371;" id="61587352"/>
<path d="M 191.11694,175.90861 C 191.11694,184.00036 184.56626,190.93617 176.08893,190.93617 L 24.267313,190.93617 C 16.175275,190.93617 9.2392663,184.00036 9.2392663,175.90861 L 9.2392663,24.091472 C 9.2392663,15.614356 16.175275,9.0638694 24.267313,9.0638694 L 176.08893,9.0638694 C 184.56626,9.0638694 191.11694,15.614356 191.11694,24.091472 L 191.11694,175.90861 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 1.15599;" id="61587264"/>
<path d="M 73.975404,78.42195 L 61.644703,78.42195 L 61.644703,96.917455 L 73.975404,96.917455 C 79.755383,96.917455 83.608758,93.064235 83.608758,87.669702 C 83.608758,82.27517 79.755383,78.42195 73.975404,78.42195 z M 74.746062,108.86243 L 61.644703,108.86243 L 61.644703,134.29374 L 48.543344,134.29374 L 48.543344,66.862291 L 74.746062,66.862291 C 88.618079,66.862291 96.710117,76.495361 96.710117,87.669702 C 96.710117,99.229361 88.618079,108.86243 74.746062,108.86243 z " style="fill: rgb(0, 0, 0);" id="61587176"/>
<path d="M 145.64751,126.97262 C 140.25286,132.75247 133.70218,134.67906 126.76617,134.67906 C 119.05946,134.67906 113.27948,131.98179 108.27012,127.35794 C 101.71944,120.42213 101.71944,111.94502 101.71944,100.38536 C 101.71944,88.825656 101.71944,80.348581 108.27012,73.412777 C 113.27948,68.78888 119.05946,66.091613 126.76617,66.091613 C 142.1795,66.091613 150.27154,76.495361 151.81286,87.669702 L 138.7115,87.669702 C 137.17018,81.504534 133.31685,78.036632 126.76617,78.036632 C 122.91279,78.036632 120.21549,79.192585 118.2888,81.504534 C 115.59146,84.2018 114.8208,87.669702 114.8208,100.38536 C 114.8208,113.48633 115.59146,116.56891 118.2888,119.26618 C 120.21549,121.57809 122.91279,122.73408 126.76617,122.73408 C 130.6195,122.73408 133.70218,121.57809 136.01415,119.26618 C 138.32617,116.56891 139.09683,113.48633 139.09683,110.01843 L 139.09683,107.70648 L 126.76617,107.70648 L 126.76617,96.532137 L 152.19819,96.532137 L 152.19819,106.55053 C 152.19819,116.1836 150.27154,121.9634 145.64751,126.97262 z " style="fill: rgb(0, 0, 0);" id="61587088"/>
<path d="M 165.29955,53.376001 C 165.29955,57.614538 165.29955,142.38554 165.29955,146.23876 C 161.06088,146.23876 39.680647,146.23876 35.441985,146.23876 C 35.441985,142.38554 35.441985,57.614538 35.441985,53.376001 C 39.680647,53.376001 161.06088,53.376001 165.29955,53.376001 z M 167.22623,49.137421 L 31.203322,49.137421 L 31.203322,150.86261 L 169.53825,150.86261 L 169.53825,49.137421 L 167.22623,49.137421 z " style="fill: rgb(0, 0, 0);" id="61587000"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="200" height="200" id="svg2">
<defs id="defs4"/>
<g transform="matrix(4.20705, 0, 0, 4.19748, -880.123, -1468.19)" id="g3683">
<path d="M 254.77082,391.6872 C 254.77082,393.70639 253.11876,395.26667 251.09957,395.26667 L 214.93779,395.26667 C 213.01038,395.26667 211.35832,393.70639 211.35832,391.6872 L 211.35832,355.52542 C 211.35832,353.59802 213.01038,351.94596 214.93779,351.94596 L 251.09957,351.94596 C 253.11876,351.94596 254.77082,353.59802 254.77082,355.52542 L 254.77082,391.6872 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 4.31371;" id="path3608"/>
<path d="M 254.77081,391.64131 C 254.77081,393.6605 253.11875,395.31256 251.19135,395.31256 L 215.02957,395.31256 C 213.01038,395.31256 211.4501,393.6605 211.4501,391.64131 L 211.4501,355.47953 C 211.4501,353.55213 213.01038,351.90007 215.02957,351.90007 L 251.19135,351.90007 C 253.11875,351.90007 254.77081,353.55213 254.77081,355.47953 L 254.77081,391.64131 z " style="fill: rgb(0, 0, 0); stroke: none; stroke-width: 4.31371;" id="61575584"/>
<path d="M 254.77081,391.64131 C 254.77081,393.6605 253.11875,395.31256 251.19135,395.31256 L 215.02957,395.31256 C 213.01038,395.31256 211.4501,393.6605 211.4501,391.64131 L 211.4501,355.47953 C 211.4501,353.55213 213.01038,351.90007 215.02957,351.90007 L 251.19135,351.90007 C 253.11875,351.90007 254.77081,353.55213 254.77081,355.47953 L 254.77081,391.64131 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 0.275344;" id="61575496"/>
<path d="M 211.35832,385.58376 L 211.35832,391.64131 C 211.35832,393.6605 213.01038,395.31256 215.02957,395.31256 L 251.09957,395.31256 C 253.11875,395.31256 254.77081,393.6605 254.77081,391.64131 L 254.77081,385.58376 L 211.35832,385.58376 z " style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0); stroke-width: 0.275344;" id="61575408"/>
<path d="M 216.40628,388.24541 L 215.30491,388.24541 L 215.30491,389.80569 L 216.40628,389.80569 C 216.95697,389.80569 217.3241,389.53035 217.3241,388.97966 C 217.3241,388.52075 216.95697,388.24541 216.40628,388.24541 z M 217.3241,392.55913 L 216.22272,390.44816 L 215.30491,390.44816 L 215.30491,392.55913 L 214.57066,392.55913 L 214.57066,387.51116 L 216.49807,387.51116 C 217.41588,387.51116 218.05835,388.15363 218.05835,388.97966 C 218.05835,389.71391 217.59944,390.17282 217.04875,390.35638 L 218.24191,392.55913 L 217.3241,392.55913 z " style="fill: rgb(255, 255, 255);" id="61575320"/>
<path d="M 218.97616,392.55913 L 218.97616,387.51116 L 222.1885,387.51116 L 222.1885,388.24541 L 219.71041,388.24541 L 219.71041,389.71391 L 221.82137,389.71391 L 221.82137,390.35638 L 219.71041,390.35638 L 219.71041,391.82488 L 222.1885,391.82488 L 222.1885,392.55913 L 218.97616,392.55913 z " style="fill: rgb(255, 255, 255);" id="61575232"/>
<path d="M 224.39125,392.55913 C 223.56522,392.55913 223.10631,392.37556 222.55562,391.91666 L 223.10631,391.45775 C 223.47343,391.82488 223.84056,391.91666 224.39125,391.91666 C 225.03371,391.91666 225.40084,391.64131 225.40084,391.18241 C 225.40084,390.90706 225.30906,390.7235 225.21728,390.63172 C 225.1255,390.53994 224.94193,390.44816 224.66659,390.44816 L 224.1159,390.35638 C 223.657,390.2646 223.38165,390.17282 223.10631,389.89747 C 222.92275,389.71391 222.73919,389.34678 222.73919,388.97966 C 222.73919,388.06185 223.38165,387.51116 224.39125,387.51116 C 225.1255,387.51116 225.5844,387.69472 225.95153,388.06185 L 225.49262,388.52075 C 225.21728,388.24541 224.85015,388.15363 224.39125,388.15363 C 223.84056,388.15363 223.47343,388.52075 223.47343,388.97966 C 223.47343,389.16322 223.56522,389.255 223.657,389.43857 C 223.84056,389.53035 224.02412,389.62213 224.20768,389.62213 L 224.85015,389.71391 C 225.30906,389.80569 225.49262,389.89747 225.76796,390.08103 C 226.04331,390.35638 226.13509,390.7235 226.13509,391.09063 C 226.13509,392.00844 225.40084,392.55913 224.39125,392.55913 z " style="fill: rgb(255, 255, 255);" id="61575144"/>
<path d="M 228.70496,388.24541 L 228.70496,392.55913 L 227.97071,392.55913 L 227.97071,388.24541 L 226.59399,388.24541 L 226.59399,387.51116 L 230.08168,387.51116 L 230.08168,388.24541 L 228.70496,388.24541 z " style="fill: rgb(255, 255, 255);" id="61575056"/>
<path d="M 232.65155,388.24541 L 231.4584,388.24541 L 231.4584,389.80569 L 232.65155,389.80569 C 233.11046,389.80569 233.47758,389.53035 233.47758,388.97966 C 233.47758,388.52075 233.11046,388.24541 232.65155,388.24541 z M 233.47758,392.55913 L 232.46799,390.44816 L 231.4584,390.44816 L 231.4584,392.55913 L 230.72415,392.55913 L 230.72415,387.51116 L 232.65155,387.51116 C 233.66114,387.51116 234.21183,388.15363 234.21183,388.97966 C 234.21183,389.71391 233.75293,390.17282 233.20224,390.35638 L 234.39539,392.55913 L 233.47758,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574968"/>
<path d="M 235.12964,392.55913 L 235.95567,392.55913 L 235.95567,387.51116 L 235.12964,387.51116 L 235.12964,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574880"/>
<path d="M 238.61733,392.55913 C 238.15842,392.55913 237.69952,392.37556 237.33239,392.00844 C 236.87349,391.54953 236.87349,390.99885 236.87349,390.08103 C 236.87349,389.07144 236.87349,388.52075 237.33239,388.06185 C 237.69952,387.69472 238.15842,387.51116 238.61733,387.51116 C 239.53514,387.51116 240.26939,388.06185 240.45295,389.07144 L 239.62692,389.07144 C 239.53514,388.52075 239.16801,388.15363 238.61733,388.15363 C 238.34198,388.15363 238.06664,388.33719 237.88308,388.52075 C 237.69952,388.7961 237.60773,389.07144 237.60773,390.08103 C 237.60773,391.09063 237.69952,391.36597 237.88308,391.64131 C 238.06664,391.82488 238.34198,391.91666 238.61733,391.91666 C 239.16801,391.91666 239.53514,391.54953 239.7187,391.09063 L 240.45295,391.09063 C 240.26939,392.00844 239.53514,392.55913 238.61733,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574792"/>
<path d="M 242.83926,388.24541 L 242.83926,392.55913 L 242.10501,392.55913 L 242.10501,388.24541 L 240.72829,388.24541 L 240.72829,387.51116 L 244.21598,387.51116 L 244.21598,388.24541 L 242.83926,388.24541 z " style="fill: rgb(255, 255, 255);" id="61574704"/>
<path d="M 244.85845,392.55913 L 244.85845,387.51116 L 248.07079,387.51116 L 248.07079,388.24541 L 245.68448,388.24541 L 245.68448,389.71391 L 247.70366,389.71391 L 247.70366,390.35638 L 245.68448,390.35638 L 245.68448,391.82488 L 248.07079,391.82488 L 248.07079,392.55913 L 244.85845,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574616"/>
<path d="M 251.46669,388.61254 C 251.28313,388.33719 251.00779,388.24541 250.64066,388.24541 L 249.72285,388.24541 L 249.72285,391.82488 L 250.64066,391.82488 C 251.00779,391.82488 251.28313,391.73309 251.46669,391.54953 C 251.74203,391.27419 251.74203,390.7235 251.74203,389.98925 C 251.74203,389.34678 251.74203,388.88788 251.46669,388.61254 z M 252.01738,392.10022 C 251.65025,392.37556 251.19135,392.55913 250.73244,392.55913 L 248.89682,392.55913 L 248.89682,387.51116 L 250.73244,387.51116 C 251.19135,387.51116 251.65025,387.69472 252.01738,388.06185 C 252.47628,388.52075 252.47628,389.255 252.47628,389.98925 C 252.47628,390.7235 252.47628,391.54953 252.01738,392.10022 z " style="fill: rgb(255, 255, 255);" id="61574528"/>
<path d="M 211.35832,385.58376 L 254.77081,385.58376" style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 0.550687;" id="61574440"/>
<path d="M 239.44336,373.74399 L 239.44336,366.30971 L 237.88308,367.68643 L 237.88308,366.67684 L 239.44336,365.30012 L 240.36117,365.30012 L 240.36117,373.74399 L 239.44336,373.74399 z " style="fill: rgb(255, 255, 255);" id="61574176"/>
<path d="M 244.03242,366.03437 C 243.20639,366.03437 242.56392,366.67684 242.56392,367.50287 C 242.56392,368.42068 243.20639,369.06315 244.03242,369.06315 C 244.95023,369.06315 245.50092,368.42068 245.50092,367.50287 C 245.50092,366.67684 244.95023,366.03437 244.03242,366.03437 z M 244.03242,369.7974 C 243.1146,369.7974 242.38036,370.53164 242.38036,371.44946 C 242.38036,372.36727 243.1146,373.10152 244.03242,373.10152 C 244.95023,373.10152 245.68448,372.36727 245.68448,371.44946 C 245.68448,370.53164 244.95023,369.7974 244.03242,369.7974 z M 244.03242,373.83577 C 242.6557,373.83577 241.55432,372.91796 241.55432,371.44946 C 241.55432,370.43986 242.10501,369.7974 242.83926,369.43027 C 242.19679,368.97136 241.73789,368.42068 241.73789,367.50287 C 241.73789,366.21793 242.74748,365.20834 244.03242,365.20834 C 245.40913,365.20834 246.41873,366.21793 246.41873,367.50287 C 246.41873,368.42068 245.95982,368.97136 245.31735,369.43027 C 246.0516,369.7974 246.60229,370.43986 246.60229,371.44946 C 246.60229,372.91796 245.50092,373.83577 244.03242,373.83577 z " style="fill: rgb(255, 255, 255);" id="61574088"/>
<path d="M 250.64066,370.99055 L 250.64066,373.10152 L 249.90641,373.10152 L 249.90641,370.99055 L 247.79544,370.99055 L 247.79544,370.16452 L 249.90641,370.16452 L 249.90641,368.14533 L 250.64066,368.14533 L 250.64066,370.16452 L 252.75163,370.16452 L 252.75163,370.99055 L 250.64066,370.99055 z " style="fill: rgb(255, 255, 255);" id="61574000"/>
<path d="M 225.49262,366.40149 L 223.38165,366.40149 L 223.38165,369.43027 L 225.49262,369.43027 C 226.50221,369.43027 227.14468,368.7878 227.14468,367.86999 C 227.14468,367.04396 226.50221,366.40149 225.49262,366.40149 z M 227.23646,375.85495 L 225.03371,371.26589 L 223.38165,371.26589 L 223.38165,375.85495 L 221.17891,375.85495 L 221.17891,364.38231 L 225.67618,364.38231 C 227.97071,364.38231 229.43921,365.94259 229.43921,367.86999 C 229.43921,369.52205 228.42962,370.53164 227.32824,370.89877 L 229.89812,375.85495 L 227.23646,375.85495 z " style="fill: rgb(255, 255, 255);" id="61573912"/>
<path d="M 225.30906,359.15078 C 225.76796,359.70147 235.68033,369.52205 236.13924,370.07274 C 235.68033,370.53164 225.76796,380.44401 225.30906,380.90292 C 224.85015,380.44401 214.93779,370.53164 214.3871,370.07274 C 214.93779,369.52205 224.85015,359.70147 225.30906,359.15078 z M 225.03371,358.41653 L 213.37751,370.07274 L 225.30906,382.00429 L 237.24061,370.07274 L 225.30906,358.14119 L 225.03371,358.41653 z " style="fill: rgb(255, 255, 255);" id="62507824"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="svg2" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="200px" height="200px"
viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
<g id="g3724" transform="matrix(4.19056, 0, 0, 4.19056, -873.402, -1803.31)">
<path id="path3610" fill="none" stroke="#FFFFFF" stroke-width="4.3137" d="M253.991,472.317c0,2.019-1.652,3.579-3.671,3.579
h-36.162c-1.927,0-3.579-1.56-3.579-3.579v-36.162c0-1.927,1.652-3.579,3.579-3.579h36.162c2.019,0,3.671,1.652,3.671,3.579
V472.317z"/>
<path id="_x36_2499816" fill="#FFFFFF" d="M254.037,472.317c0,2.019-1.652,3.579-3.579,3.579h-36.162
c-2.019,0-3.579-1.56-3.579-3.579v-36.162c0-1.927,1.56-3.579,3.579-3.579h36.162c1.927,0,3.579,1.652,3.579,3.579V472.317z"/>
<path id="_x36_2499728" fill="none" stroke="#000000" stroke-width="0.2753" d="M254.037,472.317c0,2.019-1.652,3.579-3.579,3.579
h-36.162c-2.019,0-3.579-1.56-3.579-3.579v-36.162c0-1.927,1.56-3.579,3.579-3.579h36.162c1.927,0,3.579,1.652,3.579,3.579V472.317
z"/>
<path id="_x36_2636256" fill="none" stroke="#000000" stroke-width="0.5507" d="M210.716,466.259h43.321"/>
<g>
<path d="M212.86,469.748h0.333v2.374h-0.333V469.748z M213.005,470.802h0.809c0.063,0,0.119-0.015,0.168-0.046
c0.049-0.031,0.087-0.074,0.113-0.13c0.027-0.056,0.04-0.12,0.04-0.193s-0.013-0.137-0.04-0.193
c-0.027-0.056-0.064-0.099-0.113-0.13c-0.048-0.031-0.105-0.046-0.169-0.046h-0.809v-0.316h0.796c0.137,0,0.258,0.028,0.361,0.085
c0.104,0.057,0.184,0.137,0.241,0.241c0.057,0.104,0.086,0.224,0.086,0.36s-0.029,0.256-0.086,0.36
c-0.058,0.104-0.138,0.184-0.242,0.241c-0.104,0.057-0.224,0.085-0.36,0.085h-0.796V470.802z M213.651,471.045l0.331-0.075
l0.607,1.152h-0.395L213.651,471.045z"/>
<path d="M215.004,469.75h0.333v2.372h-0.333V469.75z M215.166,469.75h1.362v0.316h-1.362V469.75z M215.166,470.786h1.183v0.316
h-1.183V470.786z M215.166,471.805h1.362v0.316h-1.362V471.805z"/>
<path d="M216.967,469.75h0.333v2.372h-0.333V469.75z M217.131,469.75h1.329v0.316h-1.329V469.75z M217.131,470.807h1.15v0.316
h-1.15V470.807z"/>
<path d="M219.152,472.042c-0.125-0.069-0.219-0.17-0.285-0.302c-0.065-0.132-0.098-0.291-0.098-0.477v-1.514h0.333v1.525
c0,0.173,0.043,0.307,0.13,0.401s0.21,0.142,0.369,0.142c0.16,0,0.284-0.047,0.371-0.142c0.087-0.095,0.131-0.228,0.131-0.401
v-1.525h0.333v1.514c0,0.186-0.033,0.345-0.098,0.477c-0.065,0.132-0.16,0.233-0.285,0.302c-0.125,0.069-0.276,0.104-0.452,0.104
C219.426,472.146,219.276,472.112,219.152,472.042z"/>
<path d="M221.434,472.146c0,0-0.051-0.011-0.153-0.033c-0.102-0.022-0.198-0.054-0.286-0.098s-0.172-0.098-0.249-0.163
l0.207-0.254c0.09,0.078,0.19,0.137,0.299,0.176c0.109,0.039,0.227,0.059,0.354,0.059c0.172,0,0.305-0.032,0.4-0.095
c0.095-0.064,0.142-0.154,0.142-0.27v-0.002c0-0.083-0.021-0.148-0.064-0.197c-0.043-0.048-0.098-0.084-0.166-0.108
c-0.068-0.023-0.156-0.045-0.263-0.064c-0.003-0.001-0.007-0.002-0.011-0.002s-0.007,0-0.011-0.002l-0.024-0.005
c-0.159-0.027-0.288-0.058-0.387-0.092c-0.1-0.034-0.185-0.097-0.255-0.188c-0.071-0.091-0.106-0.22-0.106-0.387v-0.002
c0-0.147,0.033-0.272,0.099-0.376c0.066-0.104,0.162-0.183,0.288-0.237s0.278-0.082,0.455-0.082c0.085,0,0.168,0.009,0.25,0.028
c0.082,0.018,0.163,0.046,0.243,0.083c0.08,0.036,0.158,0.082,0.236,0.138l-0.189,0.264c-0.09-0.066-0.18-0.116-0.27-0.149
c-0.09-0.033-0.18-0.05-0.27-0.05c-0.162,0-0.288,0.032-0.378,0.097c-0.09,0.065-0.135,0.156-0.135,0.275v0.002
c0,0.082,0.023,0.146,0.069,0.193c0.046,0.047,0.104,0.081,0.173,0.103c0.069,0.022,0.165,0.045,0.288,0.069
c0.004,0.001,0.008,0.002,0.012,0.002c0.004,0.001,0.008,0.001,0.012,0.003c0.005,0.001,0.011,0.002,0.018,0.003
c0.007,0.001,0.012,0.002,0.018,0.003c0.144,0.029,0.263,0.064,0.36,0.104c0.096,0.04,0.177,0.105,0.241,0.195
c0.065,0.089,0.097,0.212,0.097,0.368v0.003c0,0.145-0.034,0.268-0.103,0.371c-0.069,0.103-0.168,0.181-0.298,0.235
c-0.13,0.054-0.287,0.081-0.471,0.081C221.491,472.146,221.434,472.146,221.434,472.146z"/>
<path d="M222.883,469.75h0.333v2.372h-0.333V469.75z M223.045,469.75h1.362v0.316h-1.362V469.75z M223.045,470.786h1.183v0.316
h-1.183V470.786z M223.045,471.805h1.362v0.316h-1.362V471.805z"/>
<path d="M224.847,469.75h0.333v2.372h-0.333V469.75z M225.072,471.805h0.537c0.175,0,0.311-0.045,0.407-0.136
c0.096-0.091,0.144-0.219,0.144-0.384v-0.698c0-0.165-0.048-0.293-0.144-0.384c-0.096-0.091-0.232-0.136-0.407-0.136h-0.537
v-0.316h0.527c0.19,0,0.353,0.033,0.488,0.1c0.135,0.066,0.238,0.163,0.308,0.29c0.071,0.127,0.106,0.281,0.106,0.46v0.672
c0,0.179-0.035,0.333-0.106,0.46c-0.071,0.127-0.174,0.224-0.309,0.29s-0.298,0.1-0.489,0.1h-0.525V471.805z"/>
<path d="M228.399,472.146c0,0-0.062-0.036-0.187-0.109c-0.125-0.073-0.221-0.176-0.29-0.31s-0.103-0.289-0.103-0.465v-0.651
c0-0.176,0.034-0.331,0.103-0.465c0.069-0.134,0.165-0.237,0.29-0.311c0.125-0.074,0.269-0.11,0.433-0.11
c0.136,0,0.261,0.029,0.375,0.087c0.114,0.058,0.21,0.141,0.286,0.247c0.077,0.106,0.129,0.23,0.156,0.37h-0.341
c-0.021-0.074-0.055-0.14-0.104-0.198c-0.048-0.058-0.105-0.103-0.17-0.134s-0.133-0.047-0.202-0.047
c-0.097,0-0.182,0.023-0.254,0.07c-0.073,0.047-0.129,0.112-0.17,0.196c-0.04,0.084-0.06,0.182-0.06,0.295v0.651
c0,0.111,0.02,0.209,0.06,0.294c0.04,0.085,0.097,0.15,0.17,0.196c0.073,0.046,0.158,0.069,0.254,0.069
c0.071,0,0.138-0.015,0.203-0.044s0.121-0.073,0.17-0.13c0.048-0.058,0.083-0.126,0.104-0.206h0.341
c-0.027,0.14-0.079,0.264-0.157,0.37c-0.077,0.106-0.173,0.189-0.287,0.247c-0.114,0.058-0.239,0.087-0.374,0.087
C228.482,472.146,228.399,472.146,228.399,472.146z"/>
<path d="M229.87,469.75h0.333v2.372h-0.333V469.75z M230.037,471.805h1.357v0.316h-1.357V471.805z"/>
<path d="M232.43,469.75h0.284l0.874,2.372h-0.359l-0.657-1.913l-0.658,1.913h-0.359L232.43,469.75z M231.959,471.285h1.248v0.316
h-1.248V471.285z"/>
<path d="M234.325,472.146c0,0-0.051-0.011-0.153-0.033c-0.102-0.022-0.198-0.054-0.286-0.098
c-0.089-0.044-0.172-0.098-0.249-0.163l0.207-0.254c0.09,0.078,0.19,0.137,0.298,0.176c0.109,0.039,0.227,0.059,0.354,0.059
c0.172,0,0.305-0.032,0.399-0.095c0.095-0.064,0.142-0.154,0.142-0.27v-0.002c0-0.083-0.021-0.148-0.064-0.197
c-0.043-0.048-0.099-0.084-0.166-0.108c-0.068-0.023-0.156-0.045-0.264-0.064c-0.003-0.001-0.007-0.002-0.01-0.002
c-0.004,0-0.007,0-0.011-0.002l-0.025-0.005c-0.158-0.027-0.288-0.058-0.387-0.092c-0.099-0.034-0.185-0.097-0.255-0.188
c-0.07-0.091-0.106-0.22-0.106-0.387v-0.002c0-0.147,0.033-0.272,0.099-0.376c0.066-0.104,0.162-0.183,0.288-0.237
c0.126-0.054,0.278-0.082,0.455-0.082c0.085,0,0.168,0.009,0.25,0.028c0.082,0.018,0.163,0.046,0.243,0.083
c0.08,0.036,0.158,0.082,0.235,0.138l-0.189,0.264c-0.09-0.066-0.18-0.116-0.27-0.149c-0.089-0.033-0.179-0.05-0.27-0.05
c-0.162,0-0.288,0.032-0.378,0.097c-0.09,0.065-0.135,0.156-0.135,0.275v0.002c0,0.082,0.023,0.146,0.069,0.193
c0.046,0.047,0.103,0.081,0.173,0.103c0.069,0.022,0.165,0.045,0.288,0.069c0.005,0.001,0.008,0.002,0.013,0.002
c0.004,0.001,0.008,0.001,0.012,0.003c0.006,0.001,0.011,0.002,0.018,0.003c0.007,0.001,0.013,0.002,0.018,0.003
c0.144,0.029,0.263,0.064,0.36,0.104c0.096,0.04,0.177,0.105,0.241,0.195c0.064,0.089,0.097,0.212,0.097,0.368v0.003
c0,0.145-0.034,0.268-0.103,0.371c-0.069,0.103-0.168,0.181-0.297,0.235c-0.13,0.054-0.287,0.081-0.471,0.081
C234.382,472.146,234.325,472.146,234.325,472.146z"/>
<path d="M236.283,472.146c0,0-0.051-0.011-0.153-0.033c-0.102-0.022-0.198-0.054-0.286-0.098s-0.172-0.098-0.249-0.163
l0.207-0.254c0.09,0.078,0.19,0.137,0.298,0.176s0.227,0.059,0.354,0.059c0.172,0,0.305-0.032,0.399-0.095
c0.095-0.064,0.142-0.154,0.142-0.27v-0.002c0-0.083-0.021-0.148-0.065-0.197c-0.043-0.048-0.098-0.084-0.166-0.108
c-0.068-0.023-0.156-0.045-0.263-0.064c-0.003-0.001-0.007-0.002-0.011-0.002c-0.004,0-0.007,0-0.01-0.002l-0.025-0.005
c-0.159-0.027-0.288-0.058-0.387-0.092c-0.1-0.034-0.185-0.097-0.255-0.188c-0.071-0.091-0.106-0.22-0.106-0.387v-0.002
c0-0.147,0.033-0.272,0.098-0.376c0.066-0.104,0.162-0.183,0.288-0.237c0.126-0.054,0.278-0.082,0.455-0.082
c0.085,0,0.168,0.009,0.25,0.028c0.082,0.018,0.163,0.046,0.243,0.083c0.08,0.036,0.158,0.082,0.236,0.138l-0.189,0.264
c-0.09-0.066-0.18-0.116-0.27-0.149c-0.09-0.033-0.18-0.05-0.27-0.05c-0.162,0-0.288,0.032-0.378,0.097
c-0.089,0.065-0.134,0.156-0.134,0.275v0.002c0,0.082,0.023,0.146,0.069,0.193c0.047,0.047,0.104,0.081,0.173,0.103
c0.069,0.022,0.165,0.045,0.288,0.069c0.004,0.001,0.008,0.002,0.012,0.002c0.004,0.001,0.008,0.001,0.013,0.003
c0.005,0.001,0.011,0.002,0.018,0.003c0.007,0.001,0.013,0.002,0.018,0.003c0.144,0.029,0.263,0.064,0.359,0.104
c0.096,0.04,0.177,0.105,0.241,0.195c0.065,0.089,0.097,0.212,0.097,0.368v0.003c0,0.145-0.034,0.268-0.103,0.371
c-0.069,0.103-0.168,0.181-0.298,0.235c-0.13,0.054-0.287,0.081-0.47,0.081C236.341,472.146,236.283,472.146,236.283,472.146z"/>
<path d="M238.066,472.122h-0.333v-2.372h0.333V472.122z"/>
<path d="M238.619,469.75h0.333v2.372h-0.333V469.75z M238.783,469.75h1.33v0.316h-1.33V469.75z M238.783,470.807h1.15v0.316h-1.15
V470.807z"/>
<path d="M240.819,472.122h-0.333v-2.372h0.333V472.122z"/>
<path d="M241.903,472.146c0,0-0.062-0.036-0.187-0.109s-0.221-0.176-0.289-0.31c-0.069-0.134-0.103-0.289-0.103-0.465v-0.651
c0-0.176,0.034-0.331,0.103-0.465c0.069-0.134,0.165-0.237,0.289-0.311c0.124-0.074,0.269-0.11,0.433-0.11
c0.136,0,0.261,0.029,0.375,0.087c0.114,0.058,0.21,0.141,0.287,0.247c0.076,0.106,0.129,0.23,0.156,0.37h-0.341
c-0.021-0.074-0.055-0.14-0.103-0.198c-0.048-0.058-0.105-0.103-0.171-0.134c-0.065-0.031-0.132-0.047-0.202-0.047
c-0.096,0-0.181,0.023-0.254,0.07c-0.073,0.047-0.129,0.112-0.17,0.196c-0.04,0.084-0.06,0.182-0.06,0.295v0.651
c0,0.111,0.02,0.209,0.06,0.294c0.041,0.085,0.097,0.15,0.17,0.196c0.073,0.046,0.158,0.069,0.254,0.069
c0.071,0,0.138-0.015,0.203-0.044c0.065-0.029,0.121-0.073,0.17-0.13s0.083-0.126,0.103-0.206h0.341
c-0.027,0.14-0.079,0.264-0.157,0.37c-0.077,0.106-0.173,0.189-0.287,0.247c-0.114,0.058-0.239,0.087-0.374,0.087
C241.985,472.146,241.903,472.146,241.903,472.146z"/>
<path d="M243.955,469.75h0.284l0.874,2.372h-0.359l-0.657-1.913l-0.658,1.913h-0.359L243.955,469.75z M243.483,471.285h1.248
v0.316h-1.248V471.285z"/>
<path d="M245.047,469.75h1.674v0.316h-1.674V469.75z M245.717,469.944h0.333v2.178h-0.333V469.944z"/>
<path d="M247.346,472.122h-0.333v-2.372h0.333V472.122z"/>
<path d="M248.248,472.038c-0.126-0.072-0.224-0.175-0.293-0.307c-0.069-0.132-0.104-0.285-0.104-0.459V470.6
c0-0.174,0.034-0.327,0.104-0.459c0.069-0.132,0.166-0.234,0.293-0.307c0.126-0.072,0.272-0.108,0.437-0.108
s0.311,0.036,0.437,0.108c0.126,0.072,0.224,0.175,0.293,0.307c0.069,0.132,0.103,0.285,0.103,0.459v0.672
c0,0.174-0.034,0.327-0.103,0.459c-0.069,0.132-0.166,0.234-0.293,0.307c-0.126,0.072-0.272,0.108-0.437,0.108
S248.374,472.11,248.248,472.038z M248.943,471.752c0.074-0.044,0.132-0.107,0.173-0.187c0.041-0.081,0.061-0.175,0.061-0.281
v-0.695c0-0.106-0.021-0.2-0.061-0.281c-0.041-0.081-0.099-0.144-0.173-0.187c-0.075-0.044-0.161-0.066-0.259-0.066
c-0.098,0-0.184,0.022-0.259,0.066c-0.075,0.044-0.132,0.107-0.173,0.187c-0.041,0.081-0.061,0.175-0.061,0.281v0.695
c0,0.106,0.021,0.2,0.061,0.281c0.041,0.081,0.098,0.144,0.173,0.187c0.075,0.044,0.161,0.066,0.259,0.066
C248.783,471.818,248.869,471.796,248.943,471.752z"/>
<path d="M249.991,469.75h0.302l1.16,1.834l-0.039,0.042v-1.876h0.33v2.37h-0.305l-1.156-1.806l0.039-0.042v1.848h-0.33V469.75z"/>
</g>
<path fill="#EC1F25" d="M232.284,437.05c-7.009,0-12.711,5.702-12.711,12.711c0,7.009,5.702,12.712,12.711,12.712
s12.711-5.702,12.711-12.712C244.995,442.753,239.293,437.05,232.284,437.05z M232.284,439.215c2.303,0,4.434,0.744,6.171,2.002
l-14.716,14.716c-1.258-1.736-2.002-3.868-2.002-6.171C221.738,443.946,226.469,439.215,232.284,439.215z M232.284,460.309
c-2.739,0-5.238-1.051-7.115-2.769l14.893-14.893c1.718,1.877,2.769,4.375,2.769,7.114
C242.831,455.577,238.1,460.309,232.284,460.309z"/>
<g>
<path d="M230.347,450.011c0.471-0.256,0.843-0.625,1.104-1.097c0.259-0.466,0.39-1.007,0.39-1.609c0-0.602-0.13-1.143-0.386-1.608
c-0.259-0.472-0.63-0.841-1.102-1.098c-0.465-0.253-1.008-0.382-1.614-0.382h-4.131v10.261h1.952v-4.085h1.535l2.061,4.085h2.286
l-2.3-4.365C230.212,450.081,230.28,450.048,230.347,450.011z M229.669,446.646c0.089,0.187,0.134,0.409,0.134,0.659
s-0.045,0.472-0.134,0.659c-0.084,0.177-0.199,0.309-0.35,0.403c-0.152,0.095-0.325,0.141-0.527,0.141h-2.232v-2.406h2.232
c0.206,0,0.379,0.046,0.529,0.14C229.471,446.336,229.584,446.468,229.669,446.646z"/>
<path d="M238.56,451.335c-0.073,0.278-0.194,0.521-0.362,0.72c-0.167,0.199-0.364,0.351-0.586,0.452
c-0.223,0.101-0.46,0.153-0.703,0.153c-0.34,0-0.626-0.077-0.877-0.236c-0.25-0.159-0.44-0.38-0.581-0.676
c-0.144-0.303-0.217-0.663-0.217-1.068v-2.65c0-0.409,0.073-0.77,0.217-1.071c0.141-0.295,0.331-0.516,0.583-0.678
c0.25-0.16,0.536-0.238,0.875-0.238c0.237,0,0.47,0.055,0.694,0.163c0.226,0.11,0.426,0.268,0.595,0.47
c0.169,0.203,0.292,0.438,0.364,0.697l0.061,0.218h1.976l-0.069-0.355c-0.118-0.611-0.349-1.158-0.685-1.625
c-0.339-0.471-0.767-0.84-1.272-1.098c-0.505-0.257-1.065-0.388-1.663-0.388c-0.72,0-1.364,0.165-1.915,0.49
c-0.554,0.327-0.989,0.793-1.293,1.386c-0.3,0.585-0.452,1.267-0.452,2.029v2.65c0,0.762,0.152,1.444,0.452,2.029
c0.304,0.594,0.739,1.059,1.294,1.383c0,0,0.485,0.27,0.813,0.363c0.261,0.074,0.511,0.123,1.101,0.123
c0.594,0,1.151-0.131,1.656-0.388c0.505-0.257,0.934-0.626,1.275-1.097c0.338-0.467,0.57-1.014,0.689-1.626l0.069-0.355h-1.98
L238.56,451.335z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,496 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="200"
height="246"
id="svg6913">
<defs
id="defs6915">
<clipPath
id="clipPath3136">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3138" />
</clipPath>
<clipPath
id="clipPath3142">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3144" />
</clipPath>
<clipPath
id="clipPath3154">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3156" />
</clipPath>
<clipPath
id="clipPath3160">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3162" />
</clipPath>
<clipPath
id="clipPath3172">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3174" />
</clipPath>
<clipPath
id="clipPath3178">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3180" />
</clipPath>
<clipPath
id="clipPath3190">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3192" />
</clipPath>
<clipPath
id="clipPath3196">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3198" />
</clipPath>
<clipPath
id="clipPath3208">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3210" />
</clipPath>
<clipPath
id="clipPath3214">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3216" />
</clipPath>
<clipPath
id="clipPath3226">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3228" />
</clipPath>
<clipPath
id="clipPath3232">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3234" />
</clipPath>
<clipPath
id="clipPath3244">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3246" />
</clipPath>
<clipPath
id="clipPath3250">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3252" />
</clipPath>
<clipPath
id="clipPath3262">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3264" />
</clipPath>
<clipPath
id="clipPath3268">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3270" />
</clipPath>
<clipPath
id="clipPath3280">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3282" />
</clipPath>
<clipPath
id="clipPath3286">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3288" />
</clipPath>
<clipPath
id="clipPath3298">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3300" />
</clipPath>
<clipPath
id="clipPath3304">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3306" />
</clipPath>
<clipPath
id="clipPath3316">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3318" />
</clipPath>
<clipPath
id="clipPath3322">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3324" />
</clipPath>
<clipPath
id="clipPath3334">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3336" />
</clipPath>
<clipPath
id="clipPath3340">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3342" />
</clipPath>
<clipPath
id="clipPath3352">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3354" />
</clipPath>
<clipPath
id="clipPath3358">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3360" />
</clipPath>
<clipPath
id="clipPath3370">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3372" />
</clipPath>
<clipPath
id="clipPath3376">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3378" />
</clipPath>
<clipPath
id="clipPath3388">
<path
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
id="path3390" />
</clipPath>
<clipPath
id="clipPath3394">
<path
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
id="path3396" />
</clipPath>
</defs>
<g
transform="matrix(1,0,0,0.99937161,0,-805.70088)"
id="layer1">
<g
transform="matrix(6.9323129,0,0,-6.9323129,-90.094419,5359.8196)"
id="g6536">
<g
transform="matrix(0.78291452,0,0,0.78291452,428.50626,507.41319)"
id="g4664-4"
style="stroke:none">
<path
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
id="path4666-0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<g
transform="translate(1.4756001e-7,4.72536e-6)"
id="g4863">
<g
id="g3132">
<g
clip-path="url(#clipPath3136)"
id="g3134">
<g
clip-path="url(#clipPath3142)"
id="g3140">
<g
transform="translate(395.365,294.87)"
id="g3146">
<path
d="m -356.25,357 c 0,1.174 -0.953,2.126 -2.125,2.126 l -19.136,0 c -1.173,0 -2.126,-0.952 -2.126,-2.126 l 0,-22.645 23.387,0 0,22.645 z"
id="path3148"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3150">
<g
clip-path="url(#clipPath3154)"
id="g3152">
<g
clip-path="url(#clipPath3160)"
id="g3158">
<g
transform="translate(395.365,269.358)"
id="g3164">
<path
d="m -356.25,357 c 0,-1.174 -0.953,-2.127 -2.125,-2.127 l -19.136,0 c -1.173,0 -2.126,0.953 -2.126,2.127 l 0,25.512 c 0,1.174 0.953,2.126 2.126,2.126 l 19.136,0 c 1.172,0 2.125,-0.952 2.125,-2.126 l 0,-25.512 z"
id="path3166"
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3168">
<g
clip-path="url(#clipPath3172)"
id="g3170">
<g
clip-path="url(#clipPath3178)"
id="g3176">
<g
transform="translate(377.81,294.901)"
id="g3182">
<path
d="m -356.25,357 c -0.424,0.285 -0.926,0.449 -1.445,0.449 -1.186,0 -1.525,-0.951 -1.525,-1.998 0,-1.197 0.581,-2.166 1.871,-2.166 0.675,0 1.289,0.252 1.869,0.563 l -0.433,-1.264 c -0.562,-0.155 -1.141,-0.208 -1.722,-0.208 -0.882,0 -1.628,0.15 -2.32,0.744 -0.668,0.564 -1.022,1.378 -1.022,2.261 0,0.797 0.338,1.636 0.944,2.175 0.658,0.561 1.567,0.768 2.415,0.768 l 1.308,-0.112 0.06,-1.212 z"
id="path3184"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3186">
<g
clip-path="url(#clipPath3190)"
id="g3188">
<g
clip-path="url(#clipPath3196)"
id="g3194">
<g
transform="translate(380.711,291.352)"
id="g3200">
<path
d="m -356.25,357 c 0.286,-0.115 0.606,-0.131 0.909,-0.131 0.484,0 0.935,0.079 1.264,0.477 l 0.044,0 -0.348,-1.307 -3.834,0 0,0.027 c 0.423,0.266 0.363,0.753 0.363,1.201 l 0,3.24 c 0,0.45 0.06,0.943 -0.363,1.201 l 0,0.027 3.03,0 c 0.13,0 0.269,0 0.363,0.045 l 0.026,0 0,-1.256 -0.026,0 c -0.233,0.408 -0.727,0.363 -1.151,0.363 l -0.277,0 0,-1.402 0.804,0 c 0.123,0 0.243,0.007 0.321,0.043 l 0.045,0 0,-1.212 -0.045,0 c -0.122,0.346 -0.519,0.311 -0.839,0.311 l -0.286,0 0,-1.627 z"
id="path3202"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3204">
<g
clip-path="url(#clipPath3208)"
id="g3206">
<g
clip-path="url(#clipPath3214)"
id="g3212">
<g
transform="translate(385.126,295.247)"
id="g3218">
<path
d="m -356.25,357 c 0.172,0 0.356,-0.016 0.502,-0.119 0.235,-0.166 0.348,-0.459 0.348,-0.739 0,-0.545 -0.4,-1.002 -0.936,-1.097 l 0,1.955 0.086,0 m -0.086,-2.416 1.004,-1.886 c 0.301,-0.536 0.58,-0.615 1.16,-0.583 l 1.196,0.079 c -0.348,0.286 -0.599,0.651 -0.832,1.04 l -1.031,1.723 c 0.573,0.244 1.031,0.718 1.031,1.368 0,0.581 -0.26,1.038 -0.772,1.317 -0.388,0.207 -0.734,0.198 -1.158,0.198 l -2.563,0 0,-0.027 c 0.423,-0.266 0.364,-0.758 0.364,-1.21 l 0,-3.22 c 0,-0.452 0.059,-0.946 -0.364,-1.212 l 0,-0.027 2.329,0 0,0.027 c -0.426,0.266 -0.364,0.76 -0.364,1.212 l 0,1.201 z"
id="path3220"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3222">
<g
clip-path="url(#clipPath3226)"
id="g3224">
<g
clip-path="url(#clipPath3232)"
id="g3230">
<g
transform="translate(389.616,293.491)"
id="g3236">
<path
d="m -356.25,357 c 0,0.891 0.45,1.869 1.471,1.869 1.187,0 1.574,-1.41 1.574,-2.399 0,-0.423 -0.059,-0.865 -0.32,-1.212 -0.277,-0.371 -0.691,-0.606 -1.15,-0.606 -0.492,0 -0.928,0.33 -1.168,0.746 -0.244,0.433 -0.407,1.1 -0.407,1.602 m -1.682,-0.234 c 0,-1.829 1.378,-2.98 3.153,-2.98 1.758,0 3.255,1.101 3.255,2.987 0,1.905 -1.333,2.961 -3.151,2.961 -1.758,0 -3.257,-1.126 -3.257,-2.968"
id="path3238"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3240">
<g
clip-path="url(#clipPath3244)"
id="g3242">
<g
clip-path="url(#clipPath3250)"
id="g3248">
<g
transform="translate(386.23,276.558)"
id="g3254">
<path
d="m -356.25,357 0.557,-1.712 3.909,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
id="path3256"
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3258">
<g
clip-path="url(#clipPath3262)"
id="g3260">
<g
clip-path="url(#clipPath3268)"
id="g3266">
<g
transform="translate(386.23,276.558)"
id="g3272">
<path
d="m -356.25,357 0.557,-1.712 3.909,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
id="path3274"
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3276">
<g
clip-path="url(#clipPath3280)"
id="g3278">
<g
clip-path="url(#clipPath3286)"
id="g3284">
<g
transform="translate(386.23,276.558)"
id="g3290">
<path
d="m -356.25,357 0.557,-1.712 3.909,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
id="path3292"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3294">
<g
clip-path="url(#clipPath3298)"
id="g3296">
<g
clip-path="url(#clipPath3304)"
id="g3302">
<g
transform="translate(385.976,276.558)"
id="g3308">
<path
d="m -356.25,357 0.558,-1.712 3.908,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
id="path3310"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3312">
<g
clip-path="url(#clipPath3316)"
id="g3314">
<g
clip-path="url(#clipPath3322)"
id="g3320">
<g
transform="translate(376.708,270.369)"
id="g3326">
<path
d="m -356.25,357 0,0.009 c -0.41,0.255 -0.785,0.569 -1.104,0.94 -0.402,-0.474 -0.717,-0.718 -1.076,-0.94 l 0,-0.009 2.18,0 m -2.332,-0.091 c -0.191,-0.112 -0.335,-0.18 -0.486,-0.248 l -0.203,0.407 c 0.621,0.219 1.311,0.718 1.698,1.232 l 0.446,0 c 0.391,-0.502 0.953,-0.969 1.722,-1.224 l -0.223,-0.406 c -0.124,0.052 -0.243,0.099 -0.479,0.239 l 0,-0.304 -1.032,0 0,-0.538 1.26,0 0,-0.362 -1.26,0 0,-0.649 1.614,0 0,-0.412 -3.659,0 0,0.412 1.619,0 0,0.649 -1.252,0 0,0.362 1.252,0 0,0.538 -1.017,0 0,0.304 z"
id="path3328"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3330">
<g
clip-path="url(#clipPath3334)"
id="g3332">
<g
clip-path="url(#clipPath3340)"
id="g3338">
<g
transform="translate(379.615,270.847)"
id="g3344">
<path
d="m -356.25,357 0,-0.542 -1.311,0 0,-1.112 -0.602,0 0,-0.402 1.913,0 0,-0.897 0.423,0 0,0.897 1.455,0 0,0.402 -1.455,0 0,0.722 1.172,0 0,0.39 -1.172,0 0,0.542 1.299,0 0,0.404 -2.443,0 c 0.056,0.115 0.087,0.207 0.12,0.299 l -0.463,0.111 c -0.156,-0.542 -0.466,-0.953 -0.897,-1.276 l 0.283,-0.355 c 0.16,0.128 0.434,0.348 0.742,0.817 l 0.936,0 m 0,-1.654 -0.881,0 0,0.722 0.881,0 0,-0.722 z"
id="path3346"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3348">
<g
clip-path="url(#clipPath3352)"
id="g3350">
<g
clip-path="url(#clipPath3358)"
id="g3356">
<g
transform="translate(383.156,270.298)"
id="g3362">
<path
d="m -356.25,357 c -0.032,-0.215 -0.036,-0.236 -0.083,-0.471 l 0.227,-0.052 c 0.04,0.168 0.064,0.319 0.088,0.479 L -356.25,357 m -0.901,-0.044 c 0.012,-0.052 0.068,-0.267 0.076,-0.479 l 0.251,0.048 c -0.024,0.207 -0.036,0.275 -0.08,0.475 l -0.247,-0.044 m 1.643,-0.479 0,-0.37 0.251,0 0,-1.511 0.378,0 0,1.511 0.431,0 0,-0.742 c 0,-0.068 -0.045,-0.068 -0.099,-0.068 l -0.224,0 0.056,-0.41 0.331,0 c 0.175,0 0.315,0.056 0.315,0.334 l 0,1.256 -1.439,0 m 0.33,0.71 c 0.037,0.048 0.212,0.315 0.367,0.705 0.136,-0.318 0.295,-0.546 0.423,-0.705 l -0.79,0 m -1.634,-1.097 c -0.111,-0.182 -0.275,-0.362 -0.438,-0.509 l 0,0.509 0.438,0 m 0.849,0 0,-0.469 c -0.187,0.167 -0.326,0.366 -0.394,0.469 l 0.394,0 m 0.534,0.774 c 0.064,0.068 0.084,0.088 0.116,0.14 l 0.008,0 0,-0.192 1.072,0 0,0.195 c 0.052,-0.051 0.08,-0.075 0.164,-0.143 l 0.203,0.419 c -0.336,0.266 -0.618,0.622 -0.773,1.06 l -0.395,0 c -0.116,-0.455 -0.347,-0.809 -0.53,-1.005 l 0,0.144 -0.793,0 0,0.263 0.749,0 0,0.335 -0.749,0 0,0.263 -0.371,0 0,-0.861 -0.399,0 0,0.689 -0.37,0 0,-0.689 -0.212,0 0,-0.359 2.109,0 0.171,-0.259 m -1.821,-0.458 0,0.55 -0.347,0 0,-2.36 0.347,0 0,0.163 1.287,0 0,-0.163 0.355,0 0,2.36 -0.355,0 0,-0.55 -0.478,0 0,0.594 -0.311,0 0,-0.594 -0.498,0 m 0.809,-0.59 0.008,0 c 0.04,-0.088 0.151,-0.295 0.339,-0.534 l 0.123,0.235 0.008,0 0,-0.407 -1.287,0 0,0.471 0.007,0 0.14,-0.284 c 0.084,0.088 0.211,0.215 0.343,0.475 l 0.008,0 0,-0.522 0.311,0 0,0.566 z"
id="path3364"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3366">
<g
clip-path="url(#clipPath3370)"
id="g3368">
<g
clip-path="url(#clipPath3376)"
id="g3374">
<g
transform="translate(387.546,269.939)"
id="g3380">
<path
d="m -356.25,357 c 0.199,-0.311 0.383,-0.71 0.502,-1.056 l 0.406,0.199 c -0.238,0.61 -0.41,0.885 -0.529,1.06 L -356.25,357 m -1.761,0.112 c 0.142,-0.112 0.406,-0.311 0.749,-0.694 -0.316,-0.582 -0.726,-0.889 -0.893,-1.016 l 0.286,-0.368 c 0.279,0.228 0.635,0.546 0.901,1.037 0.224,-0.283 0.351,-0.495 0.435,-0.633 l 0.335,0.266 c -0.147,0.284 -0.391,0.575 -0.574,0.782 0.204,0.522 0.283,0.964 0.323,1.2 l 0.23,0 0,0.406 -0.693,0 0,0.605 -0.422,0 0,-0.605 -0.75,0 0,-0.406 1.208,0 c -0.024,-0.196 -0.063,-0.487 -0.203,-0.873 -0.319,0.322 -0.518,0.486 -0.63,0.578 l -0.302,-0.279 m 2.877,1.585 0,-0.737 -0.964,0 0,-0.426 0.964,0 0,-2.069 c 0,-0.084 -0.008,-0.096 -0.135,-0.096 l -0.617,0 0.103,-0.41 0.605,0 c 0.307,0 0.471,0.056 0.471,0.362 l 0,2.213 0.33,0 0,0.426 -0.33,0 0,0.737 -0.427,0 z"
id="path3382"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3384">
<g
clip-path="url(#clipPath3388)"
id="g3386">
<g
clip-path="url(#clipPath3394)"
id="g3392">
<path
d="m 36.538,627.162 -1.043,0 0,0.371 1.043,0 0,-0.371 z m -2.382,0.685 c 0.175,0.1 0.298,0.184 0.382,0.251 l 1.153,0 c -0.076,-0.087 -0.156,-0.163 -0.26,-0.251 l -1.275,0 m -0.551,-2.328 c 0.785,0.164 1.26,0.375 1.527,0.531 0.024,-0.052 0.035,-0.087 0.052,-0.139 -0.247,-0.144 -0.817,-0.407 -1.758,-0.574 l 0.132,-0.351 c 0.873,0.203 1.41,0.442 1.685,0.602 0.008,-0.236 -0.011,-0.299 -0.243,-0.299 l -0.35,0 0.092,-0.395 0.362,0 c 0.216,0 0.534,0 0.534,0.582 0,0.076 -0.012,0.59 -0.287,0.925 -0.075,0.087 -0.131,0.143 -0.167,0.175 0.171,0.076 0.311,0.164 0.477,0.268 0.201,-1.224 0.774,-1.584 1.325,-1.85 l 0.255,0.362 c -0.136,0.069 -0.491,0.243 -0.769,0.519 0.254,0.143 0.441,0.291 0.637,0.458 l -0.326,0.283 c -0.157,-0.167 -0.352,-0.299 -0.543,-0.427 -0.055,0.104 -0.143,0.339 -0.2,0.655 l 0.894,0 0,1.003 -0.921,0 c 0.168,0.161 0.191,0.184 0.247,0.251 l 0,0.32 -1.384,0 c 0.045,0.051 0.065,0.075 0.12,0.151 l -0.426,0.088 c -0.443,-0.538 -0.996,-0.686 -1.192,-0.737 l 0.168,-0.351 c 0.1,0.035 0.123,0.047 0.179,0.071 l 0,-0.796 1.319,0 c -0.474,-0.224 -0.996,-0.324 -1.51,-0.412 l 0.135,-0.326 c 0.223,0.039 0.658,0.119 1.172,0.319 0.056,-0.048 0.088,-0.081 0.115,-0.112 -0.458,-0.243 -0.961,-0.379 -1.474,-0.442 l 0.123,-0.352 m 1.508,1.643 -1.001,0 0,0.371 1.001,0 0,-0.371 z"
id="path3398"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,557 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="200"
height="246"
id="svg8030">
<defs
id="defs8032">
<clipPath
id="clipPath3404">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3406" />
</clipPath>
<clipPath
id="clipPath3410">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3412" />
</clipPath>
<clipPath
id="clipPath3422">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3424" />
</clipPath>
<clipPath
id="clipPath3428">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3430" />
</clipPath>
<clipPath
id="clipPath3440">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3442" />
</clipPath>
<clipPath
id="clipPath3446">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3448" />
</clipPath>
<clipPath
id="clipPath3458">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3460" />
</clipPath>
<clipPath
id="clipPath3464">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3466" />
</clipPath>
<clipPath
id="clipPath3476">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3478" />
</clipPath>
<clipPath
id="clipPath3482">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3484" />
</clipPath>
<clipPath
id="clipPath3494">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3496" />
</clipPath>
<clipPath
id="clipPath3500">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3502" />
</clipPath>
<clipPath
id="clipPath3512">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3514" />
</clipPath>
<clipPath
id="clipPath3518">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3520" />
</clipPath>
<clipPath
id="clipPath3530">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3532" />
</clipPath>
<clipPath
id="clipPath3536">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3538" />
</clipPath>
<clipPath
id="clipPath3548">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3550" />
</clipPath>
<clipPath
id="clipPath3554">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3556" />
</clipPath>
<clipPath
id="clipPath3566">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3568" />
</clipPath>
<clipPath
id="clipPath3572">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3574" />
</clipPath>
<clipPath
id="clipPath3584">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3586" />
</clipPath>
<clipPath
id="clipPath3590">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3592" />
</clipPath>
<clipPath
id="clipPath3602">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3604" />
</clipPath>
<clipPath
id="clipPath3608">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3610" />
</clipPath>
<clipPath
id="clipPath3620">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3622" />
</clipPath>
<clipPath
id="clipPath3626">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3628" />
</clipPath>
<clipPath
id="clipPath3638">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3640" />
</clipPath>
<clipPath
id="clipPath3644">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3646" />
</clipPath>
<clipPath
id="clipPath3656">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3658" />
</clipPath>
<clipPath
id="clipPath3662">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3664" />
</clipPath>
<clipPath
id="clipPath3674">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3676" />
</clipPath>
<clipPath
id="clipPath3680">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3682" />
</clipPath>
<clipPath
id="clipPath3692">
<path
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
id="path3694" />
</clipPath>
<clipPath
id="clipPath3698">
<path
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
id="path3700" />
</clipPath>
</defs>
<g
transform="translate(0,-806.36218)"
id="layer1">
<g
transform="matrix(6.9323129,0,0,-6.9279567,-355.65746,5357.1129)"
id="g6447">
<g
transform="matrix(0.78291452,0,0,0.78291452,466.81426,507.41319)"
id="g4664-48"
style="stroke:none">
<path
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
id="path4666-8"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<g
id="g4939">
<g
id="g3400">
<g
clip-path="url(#clipPath3404)"
id="g3402">
<g
clip-path="url(#clipPath3410)"
id="g3408">
<g
transform="translate(433.672,294.87)"
id="g3414">
<path
d="m -356.25,357 c 0,1.174 -0.951,2.126 -2.125,2.126 l -19.135,0 c -1.174,0 -2.125,-0.952 -2.125,-2.126 l 0,-22.645 23.385,0 0,22.645 z"
id="path3416"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3418">
<g
clip-path="url(#clipPath3422)"
id="g3420">
<g
clip-path="url(#clipPath3428)"
id="g3426">
<g
transform="translate(433.672,269.358)"
id="g3432">
<path
d="m -356.25,357 c 0,-1.174 -0.951,-2.127 -2.125,-2.127 l -19.135,0 c -1.174,0 -2.125,0.953 -2.125,2.127 l 0,25.512 c 0,1.174 0.951,2.126 2.125,2.126 l 19.135,0 c 1.174,0 2.125,-0.952 2.125,-2.126 l 0,-25.512 z"
id="path3434"
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3436">
<g
clip-path="url(#clipPath3440)"
id="g3438">
<g
clip-path="url(#clipPath3446)"
id="g3444">
<g
transform="translate(416.118,294.901)"
id="g3450">
<path
d="m -356.25,357 c -0.425,0.285 -0.927,0.448 -1.445,0.448 -1.187,0 -1.525,-0.95 -1.525,-1.998 0,-1.196 0.581,-2.165 1.872,-2.165 0.673,0 1.288,0.252 1.869,0.563 l -0.434,-1.264 c -0.562,-0.155 -1.142,-0.208 -1.723,-0.208 -0.881,0 -1.627,0.15 -2.319,0.744 -0.667,0.564 -1.022,1.378 -1.022,2.26 0,0.798 0.338,1.637 0.944,2.176 0.658,0.56 1.567,0.768 2.415,0.768 l 1.309,-0.112 0.059,-1.212 z"
id="path3452"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3454">
<g
clip-path="url(#clipPath3458)"
id="g3456">
<g
clip-path="url(#clipPath3464)"
id="g3462">
<g
transform="translate(419.019,291.352)"
id="g3468">
<path
d="m -356.25,357 c 0.286,-0.116 0.606,-0.131 0.909,-0.131 0.484,0 0.935,0.079 1.263,0.477 l 0.044,0 -0.346,-1.307 -3.834,0 0,0.027 c 0.422,0.266 0.363,0.753 0.363,1.201 l 0,3.24 c 0,0.449 0.059,0.943 -0.363,1.201 l 0,0.027 3.029,0 c 0.129,0 0.27,0 0.363,0.045 l 0.026,0 0,-1.257 -0.026,0 c -0.234,0.408 -0.726,0.363 -1.151,0.363 l -0.277,0 0,-1.401 0.804,0 c 0.122,0 0.243,0.007 0.322,0.042 l 0.043,0 0,-1.211 -0.043,0 c -0.124,0.346 -0.52,0.311 -0.84,0.311 l -0.286,0 0,-1.627 z"
id="path3470"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3472">
<g
clip-path="url(#clipPath3476)"
id="g3474">
<g
clip-path="url(#clipPath3482)"
id="g3480">
<g
transform="translate(423.434,295.247)"
id="g3486">
<path
d="m -356.25,357 c 0.171,0 0.355,-0.017 0.503,-0.12 0.233,-0.165 0.346,-0.458 0.346,-0.739 0,-0.544 -0.4,-1.002 -0.933,-1.096 l 0,1.955 0.084,0 m -0.084,-2.416 1.002,-1.886 c 0.301,-0.536 0.58,-0.615 1.16,-0.583 l 1.195,0.079 c -0.347,0.285 -0.598,0.651 -0.832,1.04 l -1.029,1.723 c 0.572,0.244 1.029,0.718 1.029,1.368 0,0.581 -0.26,1.038 -0.77,1.317 -0.39,0.207 -0.736,0.198 -1.16,0.198 l -2.562,0 0,-0.027 c 0.424,-0.267 0.364,-0.759 0.364,-1.21 l 0,-3.221 c 0,-0.452 0.06,-0.945 -0.364,-1.211 l 0,-0.027 2.329,0 0,0.027 c -0.426,0.266 -0.362,0.759 -0.362,1.211 l 0,1.202 z"
id="path3488"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3490">
<g
clip-path="url(#clipPath3494)"
id="g3492">
<g
clip-path="url(#clipPath3500)"
id="g3498">
<g
transform="translate(427.924,293.49)"
id="g3504">
<path
d="m -356.25,357 c 0,0.892 0.449,1.87 1.471,1.87 1.187,0 1.575,-1.411 1.575,-2.399 0,-0.424 -0.06,-0.865 -0.322,-1.212 -0.276,-0.372 -0.691,-0.606 -1.15,-0.606 -0.492,0 -0.928,0.33 -1.168,0.746 -0.244,0.433 -0.406,1.099 -0.406,1.601 m -1.682,-0.233 c 0,-1.829 1.377,-2.98 3.153,-2.98 1.757,0 3.255,1.1 3.255,2.986 0,1.906 -1.334,2.962 -3.152,2.962 -1.757,0 -3.256,-1.126 -3.256,-2.968"
id="path3506"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3508">
<g
clip-path="url(#clipPath3512)"
id="g3510">
<g
clip-path="url(#clipPath3518)"
id="g3516">
<g
transform="translate(420.109,280.326)"
id="g3522">
<path
d="m -356.25,357 2.948,0 c 0.925,0 1.693,-0.299 1.693,-1.304 0,-1.036 -0.838,-1.46 -1.693,-1.46 l -2.948,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.291,1.382 4.291,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.68,0.392 -1.274,0.534 0.454,0.141 0.733,0.251 1.082,0.533 0.471,0.377 0.959,1.053 0.959,2.073 0,1.979 -1.639,3.313 -4.099,3.313 l -8.026,0 0,-12.875 8.358,0 m -4.397,10.143 3.106,0 c 0.889,0 1.063,-0.754 1.063,-1.115 0,-0.801 -0.47,-1.35 -1.063,-1.35 l -3.106,0 0,2.465 z"
id="path3524"
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3526">
<g
clip-path="url(#clipPath3530)"
id="g3528">
<g
clip-path="url(#clipPath3536)"
id="g3534">
<g
transform="translate(420.109,280.326)"
id="g3540">
<path
d="m -356.25,357 2.948,0 c 0.925,0 1.693,-0.299 1.693,-1.304 0,-1.036 -0.838,-1.46 -1.693,-1.46 l -2.948,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.291,1.382 4.291,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.68,0.392 -1.274,0.534 0.454,0.141 0.733,0.251 1.082,0.533 0.471,0.377 0.959,1.053 0.959,2.073 0,1.979 -1.639,3.313 -4.099,3.313 l -8.026,0 0,-12.875 8.358,0 m -4.397,10.143 3.106,0 c 0.889,0 1.063,-0.754 1.063,-1.115 0,-0.801 -0.47,-1.35 -1.063,-1.35 l -3.106,0 0,2.465 z"
id="path3542"
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3544">
<g
clip-path="url(#clipPath3548)"
id="g3546">
<g
clip-path="url(#clipPath3554)"
id="g3552">
<g
transform="translate(420.109,280.326)"
id="g3558">
<path
d="m -356.25,357 2.948,0 c 0.925,0 1.693,-0.299 1.693,-1.304 0,-1.036 -0.838,-1.46 -1.693,-1.46 l -2.948,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.291,1.382 4.291,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.68,0.392 -1.274,0.534 0.454,0.141 0.733,0.251 1.082,0.533 0.471,0.377 0.959,1.053 0.959,2.073 0,1.979 -1.639,3.313 -4.099,3.313 l -8.026,0 0,-12.875 8.358,0 m -4.397,10.143 3.106,0 c 0.889,0 1.063,-0.754 1.063,-1.115 0,-0.801 -0.47,-1.35 -1.063,-1.35 l -3.106,0 0,2.465 z"
id="path3560"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3562">
<g
clip-path="url(#clipPath3566)"
id="g3564">
<g
clip-path="url(#clipPath3572)"
id="g3570">
<g
transform="translate(419.855,280.326)"
id="g3576">
<path
d="m -356.25,357 2.95,0 c 0.924,0 1.691,-0.299 1.691,-1.304 0,-1.036 -0.837,-1.46 -1.691,-1.46 l -2.95,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.292,1.382 4.292,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.681,0.392 -1.274,0.534 0.455,0.141 0.734,0.251 1.082,0.533 0.471,0.377 0.96,1.053 0.96,2.073 0,1.979 -1.64,3.313 -4.1,3.313 l -8.025,0 0,-12.875 8.356,0 m -4.397,10.143 3.106,0 c 0.891,0 1.064,-0.754 1.064,-1.115 0,-0.801 -0.47,-1.35 -1.064,-1.35 l -3.106,0 0,2.465 z"
id="path3578"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3580">
<g
clip-path="url(#clipPath3584)"
id="g3582">
<g
clip-path="url(#clipPath3590)"
id="g3588">
<g
transform="translate(411.528,271.394)"
id="g3594">
<path
d="m -356.25,357 0,-0.429 0.507,0 0,-2.711 0.397,0 0,3.14 -0.904,0 z"
id="path3596"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3598">
<g
clip-path="url(#clipPath3602)"
id="g3600">
<g
clip-path="url(#clipPath3608)"
id="g3606">
<g
transform="translate(414.34,269.374)"
id="g3612">
<path
d="m -356.25,357 c -0.166,-0.032 -0.301,-0.08 -0.363,-0.255 -0.031,-0.084 -0.047,-0.268 -0.047,-0.347 l 0,-0.088 1.736,0 0,-0.43 -2.13,0 0,0.346 c 0,0.494 0.032,1.069 0.668,1.184 l 0.649,0.12 c 0.292,0.056 0.433,0.148 0.433,0.538 0,0.391 -0.155,0.554 -0.641,0.554 -0.553,0 -0.672,-0.159 -0.676,-0.653 l -0.39,0 c 0.007,0.677 0.169,1.084 1.042,1.084 0.5,0 1.056,-0.076 1.056,-0.985 0,-0.398 -0.1,-0.61 -0.288,-0.758 -0.063,-0.048 -0.205,-0.155 -0.42,-0.195 L -356.25,357 z"
id="path3614"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3616">
<g
clip-path="url(#clipPath3620)"
id="g3618">
<g
clip-path="url(#clipPath3626)"
id="g3624">
<g
transform="translate(416.123,268.6)"
id="g3630">
<path
d="m -356.25,357 c 0.294,0.08 0.82,0.232 1.462,0.582 l 0,-0.749 c 0,-0.088 -0.003,-0.124 -0.109,-0.124 l -0.542,0 0.052,-0.414 0.655,0 c 0.192,0 0.304,0.119 0.304,0.315 l 0,1.187 c 0.441,0.291 0.668,0.595 0.801,0.766 l -0.287,0.267 c -0.08,-0.116 -0.203,-0.295 -0.514,-0.546 l 0,0.681 1.125,0 0,0.407 -1.125,0 0,0.662 -0.36,0 0,-0.662 -1.591,0 0,-0.407 1.591,0 0,-0.936 c -0.291,-0.171 -0.751,-0.443 -1.591,-0.622 L -356.25,357 z"
id="path3632"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3634">
<g
clip-path="url(#clipPath3638)"
id="g3636">
<g
clip-path="url(#clipPath3644)"
id="g3642">
<g
transform="translate(420.309,271.168)"
id="g3648">
<path
d="m -356.25,357 c 0.297,-0.408 0.417,-0.603 0.632,-1.08 l 0.317,0.266 c -0.238,0.471 -0.387,0.718 -0.682,1.057 L -356.25,357 m -0.95,-2.95 c 0.44,0.164 1.182,0.514 1.565,0.733 l -0.07,0.379 c -0.356,-0.188 -0.885,-0.419 -0.885,-0.419 l 0,2.651 -0.362,0 0,-2.799 c -0.166,-0.067 -0.221,-0.083 -0.31,-0.115 l 0.062,-0.43 m 2.77,3.316 -0.371,0 0,-0.686 c 0,-0.988 -0.096,-2.156 -1.443,-2.543 l 0.186,-0.41 c 0.225,0.079 0.737,0.267 1.138,0.873 0.212,-0.303 0.377,-0.55 0.506,-0.861 l 0.294,0.362 c -0.171,0.299 -0.31,0.479 -0.609,0.85 0.195,0.45 0.299,1.124 0.299,1.702 l 0,0.713 z"
id="path3650"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3652">
<g
clip-path="url(#clipPath3656)"
id="g3654">
<g
clip-path="url(#clipPath3662)"
id="g3660">
<g
transform="translate(424.26,271.634)"
id="g3666">
<path
d="m -356.25,357 0,-1.204 1.241,0 0,-0.426 -1.241,0 0,-1.555 1.453,0 0,-0.419 -3.13,0 0,0.419 1.313,0 0,3.185 0.364,0 z"
id="path3668"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3670">
<g
clip-path="url(#clipPath3674)"
id="g3672">
<g
clip-path="url(#clipPath3680)"
id="g3678">
<g
transform="translate(427.758,270.143)"
id="g3684">
<path
d="m -356.25,357 c 0.099,-0.175 0.242,-0.45 0.44,-1.06 l -0.337,-0.199 c -0.099,0.346 -0.252,0.745 -0.418,1.056 l 0.315,0.203 m 0.967,1.494 0,-0.737 0.274,0 0,-0.426 -0.274,0 0,-2.213 c 0,-0.306 -0.136,-0.362 -0.391,-0.362 l -0.503,0 -0.086,0.41 0.513,0 c 0.105,0 0.113,0.012 0.113,0.096 l 0,2.069 -0.801,0 0,0.426 0.801,0 0,0.737 0.354,0 m -2.493,-1.306 c 0.094,-0.092 0.259,-0.256 0.524,-0.578 0.115,0.386 0.148,0.677 0.168,0.873 l -1.002,0 0,0.406 0.622,0 0,0.605 0.351,0 0,-0.605 0.576,0 0,-0.406 -0.193,0 c -0.032,-0.236 -0.098,-0.678 -0.267,-1.2 0.151,-0.207 0.354,-0.499 0.475,-0.782 l -0.277,-0.266 c -0.069,0.138 -0.176,0.35 -0.36,0.633 -0.222,-0.491 -0.517,-0.809 -0.748,-1.037 l -0.239,0.368 c 0.14,0.127 0.48,0.434 0.742,1.016 -0.286,0.383 -0.503,0.582 -0.623,0.694 l 0.251,0.279 z"
id="path3686"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3688">
<g
clip-path="url(#clipPath3692)"
id="g3690">
<g
clip-path="url(#clipPath3698)"
id="g3696">
<path
d="m 75.546,627.163 -0.867,0 0,0.371 0.867,0 0,-0.371 z m -1.979,0.685 c 0.146,0.1 0.248,0.184 0.318,0.251 l 0.956,0 c -0.063,-0.087 -0.129,-0.163 -0.215,-0.251 l -1.059,0 M 73.11,625.52 c 0.652,0.164 1.046,0.375 1.268,0.531 0.019,-0.052 0.03,-0.087 0.043,-0.14 -0.205,-0.143 -0.679,-0.406 -1.459,-0.573 l 0.108,-0.351 c 0.725,0.203 1.172,0.442 1.401,0.602 0.006,-0.236 -0.01,-0.299 -0.202,-0.299 l -0.291,0 0.076,-0.395 0.3,0 c 0.179,0 0.444,0 0.444,0.582 0,0.075 -0.01,0.59 -0.238,0.925 -0.063,0.087 -0.109,0.144 -0.139,0.175 0.142,0.076 0.258,0.164 0.397,0.267 0.165,-1.223 0.641,-1.583 1.098,-1.849 l 0.212,0.362 c -0.112,0.069 -0.407,0.243 -0.639,0.519 0.212,0.143 0.367,0.291 0.53,0.458 l -0.271,0.283 c -0.129,-0.167 -0.291,-0.299 -0.451,-0.427 -0.046,0.104 -0.119,0.339 -0.164,0.654 l 0.74,0 0,1.004 -0.764,0 c 0.139,0.161 0.159,0.184 0.205,0.251 l 0,0.32 -1.148,0 c 0.037,0.051 0.053,0.076 0.1,0.151 l -0.355,0.088 c -0.367,-0.538 -0.827,-0.686 -0.989,-0.737 l 0.139,-0.351 c 0.083,0.035 0.103,0.048 0.149,0.071 l 0,-0.797 1.095,0 c -0.394,-0.223 -0.826,-0.323 -1.254,-0.411 l 0.113,-0.326 c 0.185,0.039 0.545,0.119 0.973,0.319 0.046,-0.048 0.072,-0.081 0.095,-0.112 -0.38,-0.243 -0.797,-0.379 -1.224,-0.442 l 0.102,-0.352 m 1.251,1.643 -0.83,0 0,0.371 0.83,0 0,-0.371 z"
id="path3702"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,558 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="200"
height="246"
id="svg9038">
<defs
id="defs9040">
<clipPath
id="clipPath3708">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3710" />
</clipPath>
<clipPath
id="clipPath3714">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3716" />
</clipPath>
<clipPath
id="clipPath3726">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3728" />
</clipPath>
<clipPath
id="clipPath3732">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3734" />
</clipPath>
<clipPath
id="clipPath3744">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3746" />
</clipPath>
<clipPath
id="clipPath3750">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3752" />
</clipPath>
<clipPath
id="clipPath3762">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3764" />
</clipPath>
<clipPath
id="clipPath3768">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3770" />
</clipPath>
<clipPath
id="clipPath3780">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3782" />
</clipPath>
<clipPath
id="clipPath3786">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3788" />
</clipPath>
<clipPath
id="clipPath3798">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3800" />
</clipPath>
<clipPath
id="clipPath3804">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3806" />
</clipPath>
<clipPath
id="clipPath3816">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3818" />
</clipPath>
<clipPath
id="clipPath3822">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3824" />
</clipPath>
<clipPath
id="clipPath3834">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3836" />
</clipPath>
<clipPath
id="clipPath3840">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3842" />
</clipPath>
<clipPath
id="clipPath3852">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3854" />
</clipPath>
<clipPath
id="clipPath3858">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3860" />
</clipPath>
<clipPath
id="clipPath3870">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3872" />
</clipPath>
<clipPath
id="clipPath3876">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3878" />
</clipPath>
<clipPath
id="clipPath3888">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3890" />
</clipPath>
<clipPath
id="clipPath3894">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3896" />
</clipPath>
<clipPath
id="clipPath3906">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3908" />
</clipPath>
<clipPath
id="clipPath3912">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3914" />
</clipPath>
<clipPath
id="clipPath3924">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3926" />
</clipPath>
<clipPath
id="clipPath3930">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3932" />
</clipPath>
<clipPath
id="clipPath3942">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3944" />
</clipPath>
<clipPath
id="clipPath3948">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3950" />
</clipPath>
<clipPath
id="clipPath3960">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3962" />
</clipPath>
<clipPath
id="clipPath3966">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3968" />
</clipPath>
<clipPath
id="clipPath3978">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3980" />
</clipPath>
<clipPath
id="clipPath3984">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path3986" />
</clipPath>
<clipPath
id="clipPath3996">
<path
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path3998" />
</clipPath>
<clipPath
id="clipPath4002">
<path
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4004" />
</clipPath>
</defs>
<g
transform="translate(0,-806.36218)"
id="layer1">
<g
transform="matrix(6.9323129,0,0,-6.9279567,-621.27943,5357.1129)"
id="g6358">
<g
transform="matrix(0.78291452,0,0,0.78291452,505.13076,507.41319)"
id="g4664-45"
style="stroke:none">
<path
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
id="path4666-5"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<g
transform="translate(1.4756004e-7,4.72536e-6)"
id="g5025">
<g
id="g3704">
<g
clip-path="url(#clipPath3708)"
id="g3706">
<g
clip-path="url(#clipPath3714)"
id="g3712">
<g
transform="translate(471.989,294.87)"
id="g3718">
<path
d="m -356.25,357 c 0,1.174 -0.952,2.126 -2.126,2.126 l -19.135,0 c -1.173,0 -2.125,-0.952 -2.125,-2.126 l 0,-22.645 23.386,0 0,22.645 z"
id="path3720"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3722">
<g
clip-path="url(#clipPath3726)"
id="g3724">
<g
clip-path="url(#clipPath3732)"
id="g3730">
<g
transform="translate(471.989,269.358)"
id="g3736">
<path
d="m -356.25,357 c 0,-1.174 -0.952,-2.127 -2.126,-2.127 l -19.135,0 c -1.173,0 -2.125,0.953 -2.125,2.127 l 0,25.512 c 0,1.174 0.952,2.126 2.125,2.126 l 19.135,0 c 1.174,0 2.126,-0.952 2.126,-2.126 l 0,-25.512 z"
id="path3738"
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3740">
<g
clip-path="url(#clipPath3744)"
id="g3742">
<g
clip-path="url(#clipPath3750)"
id="g3748">
<g
transform="translate(454.434,294.901)"
id="g3754">
<path
d="m -356.25,357 c -0.424,0.285 -0.926,0.448 -1.445,0.448 -1.185,0 -1.524,-0.95 -1.524,-1.998 0,-1.196 0.58,-2.165 1.871,-2.165 0.674,0 1.288,0.252 1.869,0.563 l -0.434,-1.264 c -0.562,-0.155 -1.14,-0.208 -1.722,-0.208 -0.882,0 -1.627,0.15 -2.319,0.744 -0.668,0.564 -1.023,1.378 -1.023,2.26 0,0.798 0.338,1.637 0.944,2.176 0.659,0.56 1.568,0.768 2.415,0.768 l 1.309,-0.112 0.059,-1.212 z"
id="path3756"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3758">
<g
clip-path="url(#clipPath3762)"
id="g3760">
<g
clip-path="url(#clipPath3768)"
id="g3766">
<g
transform="translate(457.335,291.352)"
id="g3772">
<path
d="m -356.25,357 c 0.286,-0.116 0.606,-0.131 0.909,-0.131 0.484,0 0.936,0.079 1.264,0.477 l 0.044,0 -0.347,-1.307 -3.834,0 0,0.027 c 0.423,0.266 0.363,0.753 0.363,1.201 l 0,3.24 c 0,0.449 0.06,0.943 -0.363,1.201 l 0,0.027 3.029,0 c 0.13,0 0.27,0 0.364,0.045 l 0.025,0 0,-1.257 -0.025,0 c -0.234,0.408 -0.727,0.363 -1.152,0.363 l -0.277,0 0,-1.401 0.805,0 c 0.122,0 0.243,0.007 0.321,0.042 l 0.045,0 0,-1.211 -0.045,0 c -0.123,0.346 -0.52,0.311 -0.84,0.311 l -0.286,0 0,-1.627 z"
id="path3774"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3776">
<g
clip-path="url(#clipPath3780)"
id="g3778">
<g
clip-path="url(#clipPath3786)"
id="g3784">
<g
transform="translate(461.75,295.247)"
id="g3790">
<path
d="m -356.25,357 c 0.173,0 0.355,-0.017 0.503,-0.12 0.233,-0.165 0.346,-0.458 0.346,-0.739 0,-0.544 -0.4,-1.002 -0.934,-1.096 l 0,1.955 0.085,0 m -0.085,-2.416 1.003,-1.886 c 0.303,-0.536 0.58,-0.615 1.16,-0.583 l 1.195,0.079 c -0.346,0.285 -0.597,0.651 -0.832,1.04 l -1.029,1.723 c 0.572,0.244 1.029,0.718 1.029,1.368 0,0.581 -0.259,1.038 -0.769,1.317 -0.391,0.207 -0.737,0.198 -1.159,0.198 l -2.564,0 0,-0.027 c 0.424,-0.267 0.365,-0.759 0.365,-1.21 l 0,-3.221 c 0,-0.452 0.059,-0.945 -0.365,-1.211 l 0,-0.027 2.329,0 0,0.027 c -0.426,0.266 -0.363,0.759 -0.363,1.211 l 0,1.202 z"
id="path3792"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3794">
<g
clip-path="url(#clipPath3798)"
id="g3796">
<g
clip-path="url(#clipPath3804)"
id="g3802">
<g
transform="translate(466.24,293.49)"
id="g3808">
<path
d="m -356.25,357 c 0,0.892 0.449,1.87 1.472,1.87 1.186,0 1.575,-1.411 1.575,-2.399 0,-0.424 -0.061,-0.865 -0.321,-1.212 -0.277,-0.372 -0.692,-0.606 -1.152,-0.606 -0.492,0 -0.927,0.33 -1.168,0.746 -0.243,0.433 -0.406,1.099 -0.406,1.601 m -1.682,-0.233 c 0,-1.829 1.378,-2.98 3.154,-2.98 1.758,0 3.255,1.1 3.255,2.986 0,1.906 -1.333,2.962 -3.153,2.962 -1.756,0 -3.256,-1.126 -3.256,-2.968"
id="path3810"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3812">
<g
clip-path="url(#clipPath3816)"
id="g3814">
<g
clip-path="url(#clipPath3822)"
id="g3820">
<g
transform="translate(462.975,282.838)"
id="g3826">
<path
d="m -356.25,357 c -0.157,1.963 -1.343,2.167 -2.459,2.167 -0.873,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.576,-2.497 0.523,-0.737 1.099,-1.005 2.075,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.366,1.413 l 3.926,0 c -0.052,-0.707 -0.175,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.64,-1.68 1.308,-1.273 1.536,-2.937 1.605,-3.533 l -3.856,0 z"
id="path3828"
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3830">
<g
clip-path="url(#clipPath3834)"
id="g3832">
<g
clip-path="url(#clipPath3840)"
id="g3838">
<g
transform="translate(462.975,282.838)"
id="g3844">
<path
d="m -356.25,357 c -0.157,1.963 -1.343,2.167 -2.459,2.167 -0.873,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.576,-2.497 0.523,-0.737 1.099,-1.005 2.075,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.366,1.413 l 3.926,0 c -0.052,-0.707 -0.175,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.64,-1.68 1.308,-1.273 1.536,-2.937 1.605,-3.533 l -3.856,0 z"
id="path3846"
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g3848">
<g
clip-path="url(#clipPath3852)"
id="g3850">
<g
clip-path="url(#clipPath3858)"
id="g3856">
<g
transform="translate(462.975,282.838)"
id="g3862">
<path
d="m -356.25,357 c -0.157,1.963 -1.343,2.167 -2.459,2.167 -0.873,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.576,-2.497 0.523,-0.737 1.099,-1.005 2.075,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.366,1.413 l 3.926,0 c -0.052,-0.707 -0.175,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.64,-1.68 1.308,-1.273 1.536,-2.937 1.605,-3.533 l -3.856,0 z"
id="path3864"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3866">
<g
clip-path="url(#clipPath3870)"
id="g3868">
<g
clip-path="url(#clipPath3876)"
id="g3874">
<g
transform="translate(462.723,282.838)"
id="g3880">
<path
d="m -356.25,357 c -0.158,1.963 -1.344,2.167 -2.46,2.167 -0.872,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.575,-2.497 0.524,-0.737 1.1,-1.005 2.076,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.367,1.413 l 3.925,0 c -0.052,-0.707 -0.174,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.641,-1.68 1.307,-1.273 1.535,-2.937 1.604,-3.533 l -3.855,0 z"
id="path3882"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3884">
<g
clip-path="url(#clipPath3888)"
id="g3886">
<g
clip-path="url(#clipPath3894)"
id="g3892">
<g
transform="translate(450.748,271.394)"
id="g3898">
<path
d="m -356.25,357 0,-3.14 -0.397,0 0,2.711 -0.505,0 0,0.429 0.902,0 z"
id="path3900"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3902">
<g
clip-path="url(#clipPath3906)"
id="g3904">
<g
clip-path="url(#clipPath3912)"
id="g3910">
<g
transform="translate(451.969,271.394)"
id="g3916">
<path
d="m -356.25,357 -0.031,-1.761 0.362,0 c 0.049,0.139 0.132,0.307 0.668,0.307 0.619,0 0.641,-0.311 0.641,-0.685 0,-0.487 -0.191,-0.603 -0.694,-0.603 -0.655,0 -0.658,0.295 -0.658,0.578 l -0.394,0 c 0.013,-0.765 0.314,-1.009 1.069,-1.009 0.85,0 1.068,0.36 1.068,1.097 0,0.869 -0.424,1.044 -0.949,1.044 -0.496,0 -0.639,-0.143 -0.739,-0.243 l 0.021,0.846 1.564,0 0,0.429 -1.928,0 z"
id="path3918"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3920">
<g
clip-path="url(#clipPath3924)"
id="g3922">
<g
clip-path="url(#clipPath3930)"
id="g3928">
<g
transform="translate(454.439,268.6)"
id="g3934">
<path
d="m -356.25,357 c 0.295,0.08 0.821,0.232 1.462,0.582 l 0,-0.749 c 0,-0.088 -0.003,-0.124 -0.108,-0.124 l -0.543,0 0.053,-0.414 0.655,0 c 0.192,0 0.305,0.119 0.305,0.315 l 0,1.187 c 0.439,0.291 0.668,0.595 0.8,0.766 l -0.288,0.267 c -0.079,-0.116 -0.202,-0.295 -0.512,-0.546 l 0,0.681 1.125,0 0,0.407 -1.125,0 0,0.662 -0.362,0 0,-0.662 -1.591,0 0,-0.407 1.591,0 0,-0.936 c -0.291,-0.171 -0.751,-0.443 -1.591,-0.622 L -356.25,357 z"
id="path3936"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3938">
<g
clip-path="url(#clipPath3942)"
id="g3940">
<g
clip-path="url(#clipPath3948)"
id="g3946">
<g
transform="translate(458.626,271.168)"
id="g3952">
<path
d="m -356.25,357 c 0.298,-0.408 0.417,-0.603 0.632,-1.08 l 0.317,0.266 c -0.238,0.471 -0.387,0.718 -0.682,1.057 L -356.25,357 m 1.819,0.366 -0.37,0 0,-0.686 c 0,-0.988 -0.097,-2.156 -1.442,-2.543 l 0.184,-0.41 c 0.226,0.079 0.739,0.267 1.139,0.873 0.212,-0.303 0.377,-0.55 0.506,-0.861 l 0.295,0.362 c -0.173,0.299 -0.312,0.479 -0.61,0.85 0.196,0.45 0.298,1.124 0.298,1.702 l 0,0.713 m -2.769,-3.316 c 0.44,0.164 1.181,0.514 1.565,0.733 l -0.069,0.379 c -0.358,-0.188 -0.887,-0.419 -0.887,-0.419 l 0,2.651 -0.361,0 0,-2.799 c -0.165,-0.067 -0.221,-0.083 -0.311,-0.115 l 0.063,-0.43 z"
id="path3954"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3956">
<g
clip-path="url(#clipPath3960)"
id="g3958">
<g
clip-path="url(#clipPath3966)"
id="g3964">
<g
transform="translate(462.213,271.634)"
id="g3970">
<path
d="m -356.25,357 0,-3.185 -1.314,0 0,-0.419 3.13,0 0,0.419 -1.452,0 0,1.555 1.24,0 0,0.426 -1.24,0 0,1.204 -0.364,0 z"
id="path3972"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3974">
<g
clip-path="url(#clipPath3978)"
id="g3976">
<g
clip-path="url(#clipPath3984)"
id="g3982">
<g
transform="translate(466.075,270.143)"
id="g3988">
<path
d="m -356.25,357 c 0.1,-0.175 0.241,-0.45 0.441,-1.06 l -0.338,-0.199 c -0.1,0.346 -0.251,0.745 -0.417,1.056 l 0.314,0.203 m 0.966,1.494 0,-0.737 0.274,0 0,-0.426 -0.274,0 0,-2.213 c 0,-0.306 -0.136,-0.362 -0.391,-0.362 l -0.502,0 -0.087,0.41 0.514,0 c 0.106,0 0.112,0.012 0.112,0.096 l 0,2.069 -0.8,0 0,0.426 0.8,0 0,0.737 0.354,0 m -2.491,-1.306 c 0.092,-0.092 0.257,-0.256 0.522,-0.578 0.116,0.386 0.15,0.677 0.169,0.873 l -1.002,0 0,0.406 0.622,0 0,0.605 0.351,0 0,-0.605 0.575,0 0,-0.406 -0.191,0 c -0.034,-0.236 -0.1,-0.678 -0.269,-1.2 0.152,-0.207 0.355,-0.499 0.477,-0.782 l -0.278,-0.266 c -0.07,0.138 -0.176,0.35 -0.361,0.633 -0.222,-0.491 -0.516,-0.809 -0.747,-1.037 l -0.238,0.368 c 0.138,0.127 0.479,0.434 0.741,1.016 -0.285,0.383 -0.503,0.582 -0.622,0.694 l 0.251,0.279 z"
id="path3990"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g3992">
<g
clip-path="url(#clipPath3996)"
id="g3994">
<g
clip-path="url(#clipPath4002)"
id="g4000">
<path
d="m 113.862,627.163 -0.866,0 0,0.371 0.866,0 0,-0.371 z m -1.184,0 -0.83,0 0,0.371 0.83,0 0,-0.371 z m -1.25,-1.643 c 0.651,0.164 1.045,0.375 1.266,0.531 0.021,-0.052 0.03,-0.087 0.043,-0.14 -0.205,-0.143 -0.678,-0.406 -1.459,-0.573 l 0.11,-0.351 c 0.724,0.203 1.17,0.442 1.399,0.602 0.007,-0.236 -0.01,-0.299 -0.201,-0.299 l -0.292,0 0.076,-0.395 0.302,0 c 0.178,0 0.443,0 0.443,0.582 0,0.075 -0.011,0.59 -0.238,0.925 -0.064,0.087 -0.11,0.144 -0.14,0.175 0.143,0.076 0.259,0.164 0.398,0.267 0.165,-1.223 0.641,-1.583 1.098,-1.849 l 0.212,0.362 c -0.113,0.069 -0.407,0.243 -0.638,0.519 0.21,0.143 0.367,0.291 0.529,0.458 l -0.272,0.283 c -0.129,-0.167 -0.291,-0.299 -0.45,-0.427 -0.046,0.104 -0.119,0.339 -0.165,0.654 l 0.741,0 0,1.004 -0.764,0 c 0.138,0.161 0.159,0.184 0.205,0.251 l 0,0.32 -1.149,0 c 0.037,0.051 0.054,0.076 0.1,0.151 l -0.354,0.088 c -0.367,-0.538 -0.827,-0.686 -0.989,-0.737 l 0.139,-0.351 c 0.083,0.035 0.102,0.048 0.148,0.071 l 0,-0.797 1.096,0 c -0.394,-0.223 -0.827,-0.323 -1.254,-0.411 l 0.112,-0.326 c 0.186,0.039 0.546,0.119 0.973,0.319 0.046,-0.048 0.073,-0.081 0.096,-0.112 -0.38,-0.243 -0.797,-0.379 -1.224,-0.442 l 0.103,-0.352 m 0.456,2.328 c 0.145,0.1 0.248,0.184 0.318,0.251 l 0.956,0 c -0.063,-0.087 -0.129,-0.163 -0.216,-0.251 l -1.058,0 z"
id="path4006"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,290 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="200"
height="246.15468"
id="svg3911">
<defs
id="defs3913">
<clipPath
id="clipPath4012">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4014" />
</clipPath>
<clipPath
id="clipPath4018">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4020" />
</clipPath>
<clipPath
id="clipPath4030">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4032" />
</clipPath>
<clipPath
id="clipPath4036">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4038" />
</clipPath>
<clipPath
id="clipPath4048">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4050" />
</clipPath>
<clipPath
id="clipPath4054">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4056" />
</clipPath>
<clipPath
id="clipPath4066">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4068" />
</clipPath>
<clipPath
id="clipPath4072">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4074" />
</clipPath>
<clipPath
id="clipPath4084">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4086" />
</clipPath>
<clipPath
id="clipPath4090">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4092" />
</clipPath>
<clipPath
id="clipPath4102">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4104" />
</clipPath>
<clipPath
id="clipPath4108">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4110" />
</clipPath>
<clipPath
id="clipPath4120">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4122" />
</clipPath>
<clipPath
id="clipPath4126">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4128" />
</clipPath>
<clipPath
id="clipPath4138">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4140" />
</clipPath>
<clipPath
id="clipPath4144">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4146" />
</clipPath>
<clipPath
id="clipPath4156">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4158" />
</clipPath>
<clipPath
id="clipPath4162">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4164" />
</clipPath>
<clipPath
id="clipPath4174">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4176" />
</clipPath>
<clipPath
id="clipPath4180">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4182" />
</clipPath>
<clipPath
id="clipPath4192">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4194" />
</clipPath>
<clipPath
id="clipPath4198">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4200" />
</clipPath>
<clipPath
id="clipPath4210">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4212" />
</clipPath>
<clipPath
id="clipPath4216">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4218" />
</clipPath>
<clipPath
id="clipPath4228">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4230" />
</clipPath>
<clipPath
id="clipPath4234">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4236" />
</clipPath>
<clipPath
id="clipPath4246">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4248" />
</clipPath>
<clipPath
id="clipPath4252">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4254" />
</clipPath>
<clipPath
id="clipPath4264">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4266" />
</clipPath>
<clipPath
id="clipPath4270">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4272" />
</clipPath>
<clipPath
id="clipPath4282">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4284" />
</clipPath>
<clipPath
id="clipPath4288">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4290" />
</clipPath>
<clipPath
id="clipPath4300">
<path
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
id="path4302" />
</clipPath>
<clipPath
id="clipPath4306">
<path
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
id="path4308" />
</clipPath>
</defs>
<path
d="m 200,232.30934 c 0,7.64185 -6.19272,13.84533 -13.84527,13.84533 l -172.30935,0 C 6.19272,246.15467 0,239.95119 0,232.30934 L 0,13.845326 C 0,6.192663 6.19272,0 13.84538,0 L 186.15473,0 C 193.80728,0 200,6.192663 200,13.845326 l 0,218.464014"
id="path4666-1"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 181.05953,34.645315 c 0,-8.138535 -6.59956,-14.738097 -14.73116,-14.738097 l -132.64981,0 c -8.1316,0 -14.73809,6.599562 -14.73809,14.738097 l 0,156.982225 162.11906,0 0,-156.982225 z"
id="path4024"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 181.05953,211.50248 c 0,8.13853 -6.59956,14.74503 -14.73116,14.74503 l -132.64981,0 c -8.1316,0 -14.73809,-6.6065 -14.73809,-14.74503 l 0,-176.857165 c 0,-8.138535 6.60649,-14.738097 14.73809,-14.738097 l 132.64981,0 c 8.1316,0 14.73116,6.599562 14.73116,14.738097 l 0,176.857165 z"
id="path4042"
style="fill:none;stroke:#000000;stroke-width:3.90289235;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 59.36971,34.430414 c -2.94623,-1.975709 -6.42625,-3.105677 -10.02412,-3.105677 -8.21479,0 -10.56485,6.585698 -10.56485,13.850762 0,8.291046 4.02768,15.008457 12.97036,15.008457 4.67238,0 8.92882,-1.746943 12.9565,-3.902892 l -3.0017,8.762443 c -3.90289,1.074509 -7.9167,1.441922 -11.94437,1.441922 -6.1143,0 -11.28581,-1.039847 -16.07604,-5.157641 -4.63078,-3.909825 -7.08482,-9.552727 -7.08482,-15.667027 0,-5.531986 2.33619,-11.348197 6.53717,-15.084713 4.5684,-3.882096 10.86294,-5.324017 16.74847,-5.324017 l 9.06053,0.776419 0.42315,8.401964 z"
id="path4060"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 79.47342,59.033192 c 1.98264,0.804148 4.20792,0.908133 6.30841,0.908133 3.35524,0 6.47478,-0.54793 8.75551,-3.306713 l 0.30502,0 -2.40551,9.060533 -26.58542,0 0,-0.186895 c 2.9393,-1.843996 2.51643,-5.220032 2.51643,-8.325708 l 0,-22.460694 c 0,-3.112608 0.42314,-6.537171 -2.51643,-8.325708 l 0,-0.186895 21.0049,0 c 0.90121,0 1.8648,0 2.52337,-0.312231 l 0.18024,0 0,8.713917 -0.18024,0 c -1.62216,-2.828384 -5.04673,-2.516429 -7.98603,-2.516429 l -1.92025,0 0,9.71217 5.58051,0 c 0.85268,0 1.67762,-0.04991 2.22528,-0.291157 l 0.30502,0 0,8.395031 -0.30502,0 c -0.84575,-2.398581 -3.59787,-2.15595 -5.82315,-2.15595 l -1.98264,0 0,11.278873 z"
id="path4078"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 110.07958,32.031833 c 1.19929,0 2.47484,0.117572 3.48696,0.831878 1.62216,1.143832 2.40551,3.174999 2.40551,5.122979 0,3.771178 -2.77293,6.946178 -6.48171,7.597815 l 0,-13.552672 0.58924,0 m -0.58924,16.748468 6.96004,13.074342 c 2.08662,3.71572 4.02074,4.263373 8.04148,4.041539 l 8.29105,-0.547376 c -2.41245,-1.975709 -4.15246,-4.512935 -5.77462,-7.209605 l -7.14028,-11.944375 c 3.96528,-1.691484 7.14028,-4.977401 7.14028,-9.483404 0,-4.027674 -1.8024,-7.195741 -5.34481,-9.129856 -2.69667,-1.434989 -5.08832,-1.372598 -8.02762,-1.372598 l -17.77445,0 0,0.186895 c 2.93237,1.850928 2.53029,5.261626 2.53029,8.388099 l 0,22.328979 c 0,3.133406 0.40208,6.551036 -2.53029,8.395031 l 0,0.186896 16.14536,0 0,-0.186896 c -2.94624,-1.843995 -2.51643,-5.261625 -2.51643,-8.395031 l 0,-8.33264 z"
id="path4096"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 141.19874,44.211907 c 0,-6.183623 3.12647,-12.963425 10.21129,-12.963425 8.22866,0 10.91146,9.781494 10.91146,16.630619 0,2.9393 -0.40928,5.99645 -2.21834,8.401963 -1.92025,2.57882 -4.79023,4.200982 -7.97909,4.200982 -3.41763,0 -6.42625,-2.287664 -8.09001,-5.171506 -1.69842,-3.001691 -2.83531,-7.618612 -2.83531,-11.098633 m -11.65322,1.615229 c 0,12.6792 9.55966,20.658293 21.86451,20.658293 12.18701,0 22.56468,-7.625545 22.56468,-20.699887 0,-13.212988 -9.24077,-20.533511 -21.85065,-20.533511 -12.18007,0 -22.57854,7.805785 -22.57854,20.575105"
id="path4114"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 58.10803,173.56886 c 12.89876,0 17.11111,0 38.69617,0 7.50077,0 26.61315,-0.76255 37.1364,-10.88373 10.14891,-9.69137 11.84733,-23.40349 11.84733,-32.76904 0,-5.76769 -0.96359,-25.1435 -12.45044,-34.169366 -6.90458,-5.4488 -15.8542,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45196,-68.79627 14.39148,0 c 12.21474,0 17.53182,10.99465 17.53182,23.72931 0,10.02412 -3.38297,24.60277 -17.53182,24.60277 l -14.39148,0 0,-48.33208 z"
id="path4132"
style="fill:none;stroke:#ffffff;stroke-width:21.13662148;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 58.10803,173.56886 38.69617,0 c 7.50077,0 26.61315,-0.76255 37.1364,-10.88373 10.14891,-9.69137 11.84733,-23.40349 11.84733,-32.76904 0,-5.76769 -0.96359,-25.1435 -12.45044,-34.169366 -6.90458,-5.4488 -15.8542,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45196,-68.79627 14.39148,0 c 12.21474,0 17.53182,10.99465 17.53182,23.72931 0,10.02412 -3.38297,24.60277 -17.53182,24.60277 l -14.39148,0 0,-48.33208 z"
id="path4150"
style="fill:none;stroke:#000000;stroke-width:10.56484509;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 58.10803,173.56886 38.69617,0 c 7.50077,0 26.61315,-0.76255 37.1364,-10.88373 10.14891,-9.69137 11.84733,-23.40349 11.84733,-32.76904 0,-5.76769 -0.96359,-25.1435 -12.45044,-34.169366 -6.90458,-5.4488 -15.8542,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45196,-68.79627 14.39148,0 c 12.21474,0 17.53182,10.99465 17.53182,23.72931 0,10.02412 -3.38297,24.60277 -17.53182,24.60277 l -14.39148,0 0,-48.33208 z"
id="path4168"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 56.34723,173.56886 38.69617,0 c 7.50076,0 26.61315,-0.76255 37.1364,-10.88373 10.1489,-9.69137 11.85425,-23.40349 11.85425,-32.76904 0,-5.76769 -0.97052,-25.1435 -12.45736,-34.169366 -6.89766,-5.4488 -15.84727,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45195,-68.79627 14.39149,0 c 12.21473,0 17.53875,10.99465 17.53875,23.72931 0,10.02412 -3.3899,24.60277 -17.53875,24.60277 l -14.39149,0 0,-48.33208 z"
id="path4186"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 27.55733,197.38829 0,2.97396 3.50775,0 0,18.7935 2.7452,0 0,-21.76746 -6.25295,0 z"
id="path4204"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 56.4928,197.38829 0,3.06408 -8.83176,18.70338 -3.29978,0 9.2685,-18.7935 -12.13155,0 0,-2.97396 14.99459,0 z"
id="path4222"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 58.51011,213.93572 c 5.81621,-1.24088 9.00507,-3.12647 11.02237,-4.3119 l 0,-6.48864 -11.02237,0 0,-2.82146 11.02237,0 0,-4.58919 2.5095,0 0,4.58919 7.79885,0 0,2.82146 -7.79885,0 0,4.7209 c 2.14902,-1.74001 3.00169,-2.98089 3.54935,-3.78504 l 2.00343,1.85093 c -0.92199,1.18542 -2.50949,3.29284 -5.55278,5.31015 l 0,8.22865 c 0,1.35874 -0.78335,2.18368 -2.11435,2.18368 l -4.54067,0 -0.36713,-2.86998 3.76424,0 c 0.73483,0 0.74869,-0.24956 0.74869,-0.8596 l 0,-5.1923 c -4.44361,2.4263 -8.09001,3.48002 -10.12811,4.0346 l -0.89427,-2.82145 z"
id="path4240"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 90.2809,197.27044 c 2.04503,2.35005 3.07101,4.06233 4.7209,7.32745 l -2.19754,1.844 c -1.49045,-3.30671 -2.31539,-4.65851 -4.38122,-7.4869 l 1.85786,-1.68455 m -8.8803,19.15398 c 0.62391,-0.22183 1.01212,-0.33275 2.15595,-0.79722 l 0,-19.40354 2.50257,0 0,18.37756 c 0,0 3.67412,-1.60136 6.14896,-2.90464 l 0.47805,2.62735 c -2.65507,1.51818 -7.79885,3.94449 -10.84907,5.08138 l -0.43701,-2.98089 m 19.63231,-15.06392 c 0,4.00688 -0.7071,8.67926 -2.0589,11.7988 2.0589,2.57189 3.02249,3.81971 4.22178,5.89247 l -2.04503,2.50949 c -0.89427,-2.15595 -2.0381,-3.86823 -3.50775,-5.96872 -2.77293,4.20098 -6.3292,5.50426 -7.89591,6.05191 l -1.27554,-2.84225 c 9.33089,-2.6828 9.99639,-10.77974 9.99639,-17.62887 l 0,-4.75556 2.56496,0 0,4.94273 z"
id="path4258"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 115.81261,195.72453 0,8.34651 8.59606,0 0,2.95316 -8.59606,0 0,10.77975 10.06571,0 0,2.90464 -21.6912,0 0,-2.90464 9.10212,0 0,-22.07942 2.52337,0 z"
id="path4276"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 144.31134,195.70374 0,5.10911 -5.55278,0 0,2.95317 5.55278,0 0,14.34295 c 0,0.58232 -0.0499,0.6655 -0.78335,0.6655 l -3.55627,0 0.60311,2.84225 3.47309,0 c 1.76774,0 2.71053,-0.38821 2.71053,-2.50949 l 0,-15.34121 1.90639,0 0,-2.95317 -1.90639,0 0,-5.10911 -2.44711,0 m -16.56129,10.98771 c 0.82494,0.77642 2.33619,2.15595 4.3119,4.81103 -1.81627,4.0346 -4.18019,6.16282 -5.13685,7.04323 l 1.64989,2.55109 c 1.6083,-1.58057 3.63947,-3.78504 5.17844,-7.18881 1.28941,1.96185 2.0173,3.4315 2.50257,4.38815 l 1.92718,-1.84399 c -0.84574,-1.96185 -2.24607,-3.98608 -3.30671,-5.42107 1.17156,-3.61867 1.63602,-6.68275 1.86479,-8.31877 l 1.32407,0 0,-2.81452 -3.98608,0 0,-4.19405 -2.43324,0 0,4.19405 -4.3119,0 0,2.81452 6.94618,0 c -0.13144,1.35873 -0.36048,3.37603 -1.17156,6.0519 -1.83013,-2.2322 -2.97397,-3.3691 -3.61867,-4.00687 l -1.74001,1.93411 m 10.13504,0.77642 c 1.15076,2.15595 2.19754,4.92194 2.89077,7.32052 l 2.34313,-1.37953 c -1.37953,-4.22871 -2.36392,-6.13509 -3.05715,-7.34825 l -2.17675,1.40726 z"
id="path4294"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 168.04758,205.92197 -6.00338,0 0,-2.57189 6.00338,0 0,2.57189 z m -13.71211,-4.74864 c 1.00518,-0.69323 1.71921,-1.27554 2.20447,-1.74001 l 6.6273,0 c -0.43702,0.60311 -0.89427,1.12997 -1.49738,1.74001 l -7.33439,0 m -3.16114,16.13843 c 4.51294,-1.1369 7.24427,-2.59962 8.77631,-3.68106 0.14586,0.36048 0.21463,0.60311 0.29781,0.97052 -1.42112,0.99132 -4.69317,2.81452 -10.11424,3.97222 l 0.76255,2.43324 c 5.019,-1.40726 8.11774,-3.06408 9.69831,-4.17325 0.0499,1.63602 -0.0693,2.07276 -1.3934,2.07276 l -2.02423,0 0.52686,2.73826 2.09355,0 c 1.24089,0 3.07107,0 3.07107,-4.0346 0,-0.51965 -0.0693,-4.09007 -1.64994,-6.41239 -0.43702,-0.60311 -0.75562,-0.99826 -0.97047,-1.21316 0.99132,-0.52685 1.79547,-1.1369 2.75906,-1.85093 1.14378,8.47822 4.44356,10.97386 7.61168,12.81785 l 1.46965,-2.5095 c -0.78335,-0.4786 -2.82145,-1.68455 -4.42282,-3.59787 1.46272,-0.99132 2.54416,-2.0173 3.6672,-3.175 l -1.87866,-1.96184 c -0.89427,1.1577 -2.0173,2.07276 -3.12647,2.9601 -0.31889,-0.72096 -0.82495,-2.35006 -1.14383,-4.53374 l 5.14377,0 0,-6.96004 -5.30322,0 c 0.96359,-1.1161 1.10224,-1.27554 1.42113,-1.74001 l 0,-2.21834 -7.9583,0 c 0.25622,-0.35382 0.36714,-0.52685 0.6863,-1.04678 l -2.44711,-0.61004 c -2.55109,3.72958 -5.73995,4.75556 -6.86299,5.10911 l 0.9636,2.43324 c 0.57538,-0.24235 0.71402,-0.33275 1.02598,-0.49247 l 0,5.52506 7.59781,0 c -2.7244,1.5459 -5.73302,2.23913 -8.69312,2.84918 l 0.78335,2.25993 c 1.28248,-0.27008 3.77812,-0.82494 6.73821,-2.21141 0.31889,0.33275 0.50634,0.56152 0.6655,0.77642 -2.63427,1.68455 -5.52505,2.62735 -8.48515,3.06408 l 0.71403,2.44018 m 8.66539,-11.38979 -5.75382,0 0,-2.57189 5.75382,0 0,2.57189 z"
id="path4310"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,619 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="200"
height="246"
id="svg9739">
<defs
id="defs9741">
<clipPath
id="clipPath4316">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4318" />
</clipPath>
<clipPath
id="clipPath4322">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4324" />
</clipPath>
<clipPath
id="clipPath4334">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4336" />
</clipPath>
<clipPath
id="clipPath4340">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4342" />
</clipPath>
<clipPath
id="clipPath4352">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4354" />
</clipPath>
<clipPath
id="clipPath4358">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4360" />
</clipPath>
<clipPath
id="clipPath4370">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4372" />
</clipPath>
<clipPath
id="clipPath4376">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4378" />
</clipPath>
<clipPath
id="clipPath4388">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4390" />
</clipPath>
<clipPath
id="clipPath4394">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4396" />
</clipPath>
<clipPath
id="clipPath4406">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4408" />
</clipPath>
<clipPath
id="clipPath4412">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4414" />
</clipPath>
<clipPath
id="clipPath4424">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4426" />
</clipPath>
<clipPath
id="clipPath4430">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4432" />
</clipPath>
<clipPath
id="clipPath4442">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4444" />
</clipPath>
<clipPath
id="clipPath4448">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4450" />
</clipPath>
<clipPath
id="clipPath4460">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4462" />
</clipPath>
<clipPath
id="clipPath4466">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4468" />
</clipPath>
<clipPath
id="clipPath4478">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4480" />
</clipPath>
<clipPath
id="clipPath4484">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4486" />
</clipPath>
<clipPath
id="clipPath4496">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4498" />
</clipPath>
<clipPath
id="clipPath4502">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4504" />
</clipPath>
<clipPath
id="clipPath4514">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4516" />
</clipPath>
<clipPath
id="clipPath4520">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4522" />
</clipPath>
<clipPath
id="clipPath4532">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4534" />
</clipPath>
<clipPath
id="clipPath4538">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4540" />
</clipPath>
<clipPath
id="clipPath4550">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4552" />
</clipPath>
<clipPath
id="clipPath4556">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4558" />
</clipPath>
<clipPath
id="clipPath4568">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4570" />
</clipPath>
<clipPath
id="clipPath4574">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4576" />
</clipPath>
<clipPath
id="clipPath4586">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4588" />
</clipPath>
<clipPath
id="clipPath4592">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4594" />
</clipPath>
<clipPath
id="clipPath4604">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4606" />
</clipPath>
<clipPath
id="clipPath4610">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4612" />
</clipPath>
<clipPath
id="clipPath4622">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4624" />
</clipPath>
<clipPath
id="clipPath4628">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4630" />
</clipPath>
<clipPath
id="clipPath4640">
<path
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
id="path4642" />
</clipPath>
<clipPath
id="clipPath4646">
<path
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
id="path4648" />
</clipPath>
</defs>
<g
transform="translate(0,-806.36218)"
id="layer1">
<g
transform="matrix(6.9323129,0,0,-6.9279567,-1151.8509,5357.1129)"
id="g6170">
<g
transform="matrix(0.78291452,0,0,0.78291452,581.66676,507.41319)"
id="g4664-2"
style="stroke:none">
<path
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
id="path4666-7"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<g
id="g5197">
<g
id="g4312">
<g
clip-path="url(#clipPath4316)"
id="g4314">
<g
clip-path="url(#clipPath4322)"
id="g4320">
<g
transform="translate(548.525,294.87)"
id="g4326">
<path
d="m -356.25,357 c 0,1.174 -0.952,2.126 -2.125,2.126 l -19.135,0 c -1.174,0 -2.126,-0.952 -2.126,-2.126 l 0,-22.645 23.386,0 0,22.645 z"
id="path4328"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4330">
<g
clip-path="url(#clipPath4334)"
id="g4332">
<g
clip-path="url(#clipPath4340)"
id="g4338">
<g
transform="translate(548.525,269.358)"
id="g4344">
<path
d="m -356.25,357 c 0,-1.174 -0.952,-2.127 -2.125,-2.127 l -19.135,0 c -1.174,0 -2.126,0.953 -2.126,2.127 l 0,25.512 c 0,1.174 0.952,2.126 2.126,2.126 l 19.135,0 c 1.173,0 2.125,-0.952 2.125,-2.126 l 0,-25.512 z"
id="path4346"
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g4348">
<g
clip-path="url(#clipPath4352)"
id="g4350">
<g
clip-path="url(#clipPath4358)"
id="g4356">
<g
transform="translate(530.97,294.901)"
id="g4362">
<path
d="m -356.25,357 c -0.424,0.285 -0.926,0.448 -1.444,0.448 -1.187,0 -1.526,-0.95 -1.526,-1.998 0,-1.196 0.581,-2.165 1.872,-2.165 0.674,0 1.288,0.252 1.869,0.563 l -0.433,-1.264 c -0.563,-0.155 -1.142,-0.208 -1.723,-0.208 -0.883,0 -1.628,0.15 -2.319,0.744 -0.668,0.564 -1.023,1.378 -1.023,2.26 0,0.798 0.338,1.637 0.945,2.176 0.658,0.56 1.566,0.768 2.415,0.768 l 1.307,-0.112 0.06,-1.212 z"
id="path4364"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4366">
<g
clip-path="url(#clipPath4370)"
id="g4368">
<g
clip-path="url(#clipPath4376)"
id="g4374">
<g
transform="translate(533.87,291.352)"
id="g4380">
<path
d="m -356.25,357 c 0.287,-0.116 0.608,-0.131 0.91,-0.131 0.485,0 0.935,0.079 1.264,0.477 l 0.044,0 -0.348,-1.307 -3.834,0 0,0.027 c 0.423,0.266 0.364,0.753 0.364,1.201 l 0,3.24 c 0,0.449 0.059,0.943 -0.364,1.201 l 0,0.027 3.031,0 c 0.129,0 0.268,0 0.363,0.045 l 0.025,0 0,-1.257 -0.025,0 c -0.234,0.408 -0.728,0.363 -1.151,0.363 l -0.279,0 0,-1.401 0.806,0 c 0.122,0 0.242,0.007 0.32,0.042 l 0.045,0 0,-1.211 -0.045,0 c -0.122,0.346 -0.518,0.311 -0.839,0.311 l -0.287,0 0,-1.627 z"
id="path4382"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4384">
<g
clip-path="url(#clipPath4388)"
id="g4386">
<g
clip-path="url(#clipPath4394)"
id="g4392">
<g
transform="translate(538.286,295.247)"
id="g4398">
<path
d="m -356.25,357 c 0.172,0 0.356,-0.017 0.503,-0.12 0.234,-0.165 0.347,-0.458 0.347,-0.739 0,-0.544 -0.401,-1.002 -0.936,-1.096 l 0,1.955 0.086,0 m -0.086,-2.416 1.004,-1.886 c 0.302,-0.536 0.58,-0.615 1.16,-0.583 l 1.196,0.079 c -0.348,0.285 -0.599,0.651 -0.832,1.04 l -1.03,1.723 c 0.572,0.244 1.03,0.718 1.03,1.368 0,0.581 -0.26,1.038 -0.771,1.317 -0.389,0.207 -0.735,0.198 -1.159,0.198 l -2.563,0 0,-0.027 c 0.423,-0.267 0.365,-0.759 0.365,-1.21 l 0,-3.221 c 0,-0.452 0.058,-0.945 -0.365,-1.211 l 0,-0.027 2.329,0 0,0.027 c -0.425,0.266 -0.364,0.759 -0.364,1.211 l 0,1.202 z"
id="path4400"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4402">
<g
clip-path="url(#clipPath4406)"
id="g4404">
<g
clip-path="url(#clipPath4412)"
id="g4410">
<g
transform="translate(542.776,293.49)"
id="g4416">
<path
d="m -356.25,357 c 0,0.892 0.45,1.87 1.471,1.87 1.188,0 1.575,-1.411 1.575,-2.399 0,-0.424 -0.059,-0.865 -0.321,-1.212 -0.276,-0.372 -0.691,-0.606 -1.15,-0.606 -0.492,0 -0.928,0.33 -1.168,0.746 -0.244,0.433 -0.407,1.099 -0.407,1.601 m -1.682,-0.233 c 0,-1.829 1.378,-2.98 3.153,-2.98 1.758,0 3.256,1.1 3.256,2.986 0,1.906 -1.334,2.962 -3.152,2.962 -1.757,0 -3.257,-1.126 -3.257,-2.968"
id="path4418"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4420">
<g
clip-path="url(#clipPath4424)"
id="g4422">
<g
clip-path="url(#clipPath4430)"
id="g4428">
<g
transform="translate(536.084,277.782)"
id="g4434">
<path
d="m -356.25,357 6.943,0 0,-2.952 -12.229,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
id="path4436"
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g4438">
<g
clip-path="url(#clipPath4442)"
id="g4440">
<g
clip-path="url(#clipPath4448)"
id="g4446">
<g
transform="translate(536.084,277.782)"
id="g4452">
<path
d="m -356.25,357 6.943,0 0,-2.952 -12.229,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
id="path4454"
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</g>
</g>
<g
id="g4456">
<g
clip-path="url(#clipPath4460)"
id="g4458">
<g
clip-path="url(#clipPath4466)"
id="g4464">
<g
transform="translate(536.084,277.782)"
id="g4470">
<path
d="m -356.25,357 6.943,0 0,-2.952 -12.229,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
id="path4472"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4474">
<g
clip-path="url(#clipPath4478)"
id="g4476">
<g
clip-path="url(#clipPath4484)"
id="g4482">
<g
transform="translate(535.83,277.782)"
id="g4488">
<path
d="m -356.25,357 6.944,0 0,-2.952 -12.23,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
id="path4490"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4492">
<g
clip-path="url(#clipPath4496)"
id="g4494">
<g
clip-path="url(#clipPath4502)"
id="g4500">
<g
transform="translate(527.119,271.394)"
id="g4506">
<path
d="m -356.25,357 0,-3.14 -0.301,0 0,2.711 -0.384,0 0,0.429 0.685,0 z"
id="path4508"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4510">
<g
clip-path="url(#clipPath4514)"
id="g4512">
<g
clip-path="url(#clipPath4520)"
id="g4518">
<g
transform="translate(528.776,269.688)"
id="g4524">
<path
d="m -356.25,357 c 0.307,0 0.538,-0.059 0.538,-0.51 0,-0.39 -0.098,-0.534 -0.538,-0.534 -0.439,0 -0.532,0.156 -0.532,0.515 0,0.387 0.118,0.529 0.532,0.529 m -0.509,0.204 c -0.061,-0.028 -0.141,-0.064 -0.211,-0.223 -0.088,-0.203 -0.103,-0.431 -0.103,-0.562 0,-0.773 0.422,-0.886 0.826,-0.886 0.467,0 0.827,0.157 0.827,0.898 0,0.159 -0.021,0.362 -0.104,0.55 -0.072,0.163 -0.155,0.199 -0.208,0.223 0.238,0.135 0.269,0.535 0.269,0.682 0,0.829 -0.523,0.853 -0.784,0.853 -0.289,0 -0.781,-0.044 -0.781,-0.849 0,-0.148 0.028,-0.551 0.269,-0.686 m 0.512,1.12 c 0.336,0 0.49,-0.104 0.49,-0.438 0,-0.355 -0.093,-0.503 -0.475,-0.503 -0.281,0 -0.505,0.04 -0.505,0.471 0,0.306 0.075,0.47 0.49,0.47"
id="path4526"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4528">
<g
clip-path="url(#clipPath4532)"
id="g4530">
<g
clip-path="url(#clipPath4538)"
id="g4536">
<g
transform="translate(529.823,269.007)"
id="g4542">
<path
d="m -356.25,357 c 0.638,0.179 0.987,0.451 1.208,0.622 l 0,0.936 -1.208,0 0,0.407 1.208,0 0,0.662 0.274,0 0,-0.662 0.853,0 0,-0.407 -0.853,0 0,-0.681 c 0.236,0.251 0.329,0.43 0.389,0.546 l 0.218,-0.267 c -0.1,-0.171 -0.273,-0.475 -0.607,-0.766 l 0,-1.187 c 0,-0.196 -0.085,-0.315 -0.232,-0.315 l -0.497,0 -0.04,0.414 0.412,0 c 0.08,0 0.083,0.036 0.083,0.124 l 0,0.749 c -0.487,-0.35 -0.886,-0.502 -1.11,-0.582 L -356.25,357 z"
id="path4544"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4546">
<g
clip-path="url(#clipPath4550)"
id="g4548">
<g
clip-path="url(#clipPath4556)"
id="g4554">
<g
transform="translate(533.099,271.168)"
id="g4560">
<path
d="m -356.25,357 c 0.225,-0.408 0.316,-0.603 0.479,-1.08 l 0.241,0.266 c -0.18,0.471 -0.293,0.718 -0.517,1.057 L -356.25,357 m -0.721,-2.95 c 0.334,0.164 0.897,0.514 1.188,0.733 l -0.053,0.379 c -0.272,-0.188 -0.673,-0.419 -0.673,-0.419 l 0,2.651 -0.273,0 0,-2.799 c -0.126,-0.067 -0.169,-0.083 -0.237,-0.115 l 0.048,-0.43 m 2.102,3.316 -0.282,0 0,-0.686 c 0,-0.988 -0.072,-2.156 -1.094,-2.543 l 0.14,-0.41 c 0.171,0.079 0.561,0.267 0.865,0.873 0.16,-0.303 0.286,-0.55 0.383,-0.861 l 0.224,0.362 c -0.131,0.299 -0.236,0.479 -0.462,0.85 0.148,0.45 0.226,1.124 0.226,1.702 l 0,0.713 z"
id="path4562"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4564">
<g
clip-path="url(#clipPath4568)"
id="g4566">
<g
clip-path="url(#clipPath4574)"
id="g4572">
<g
transform="translate(535.821,271.634)"
id="g4578">
<path
d="m -356.25,357 0,-3.185 -0.997,0 0,-0.419 2.376,0 0,0.419 -1.102,0 0,1.555 0.941,0 0,0.426 -0.941,0 0,1.204 -0.277,0 z"
id="path4580"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4582">
<g
clip-path="url(#clipPath4586)"
id="g4584">
<g
clip-path="url(#clipPath4592)"
id="g4590">
<g
transform="translate(538.522,268.082)"
id="g4596">
<path
d="m -356.25,357 c 0.261,0.02 1.153,0.095 1.153,1.678 0,0.658 -0.222,1.563 -1.053,1.563 -0.745,0 -1.173,-0.81 -1.173,-1.77 0,-0.558 0.166,-1.156 0.495,-1.156 0.608,0 0.711,1.758 0.756,2.507 0.531,-0.052 0.66,-0.634 0.66,-1.1 0,-1.236 -0.61,-1.279 -0.911,-1.299 L -356.25,357 m -0.108,2.803 c -0.02,-0.447 -0.065,-1.176 -0.209,-1.683 -0.027,-0.095 -0.105,-0.366 -0.251,-0.366 -0.128,0 -0.23,0.235 -0.23,0.657 0,0.351 0.09,1.225 0.69,1.392"
id="path4598"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4600">
<g
clip-path="url(#clipPath4604)"
id="g4602">
<g
clip-path="url(#clipPath4610)"
id="g4608">
<g
transform="translate(540.795,269.741)"
id="g4614">
<path
d="m -356.25,357 c -0.042,-0.275 -0.155,-1.009 -0.394,-1.009 -0.083,0 -0.153,0.092 -0.153,0.295 0,0.136 0.048,0.661 0.547,0.714 m 0.915,1.04 c -0.006,-0.203 -0.016,-0.463 -0.06,-0.854 -0.242,0.113 -0.373,0.148 -0.533,0.176 0.018,0.152 0.045,0.403 0.06,0.638 0.035,0.534 0.038,0.594 0.043,0.658 l -1.075,0 0,-0.415 0.763,0 c -0.017,-0.371 -0.025,-0.55 -0.062,-0.869 -0.545,-0.027 -0.86,-0.546 -0.86,-1.068 0,-0.291 0.109,-0.722 0.411,-0.722 0.421,0 0.597,0.877 0.67,1.376 0.233,-0.044 0.457,-0.155 0.525,-0.188 -0.073,-0.434 -0.153,-0.861 -0.618,-1.096 l 0.168,-0.347 c 0.463,0.268 0.615,0.754 0.714,1.28 0.123,-0.088 0.188,-0.143 0.288,-0.227 l 0.095,0.442 c -0.075,0.068 -0.102,0.092 -0.318,0.223 0.04,0.344 0.06,0.591 0.082,0.945 l -0.293,0.048 z"
id="path4616"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4618">
<g
clip-path="url(#clipPath4622)"
id="g4620">
<g
clip-path="url(#clipPath4628)"
id="g4626">
<g
transform="translate(544.292,271.637)"
id="g4632">
<path
d="m -356.25,357 0,-0.737 -0.607,0 0,-0.426 0.607,0 0,-2.069 c 0,-0.084 -0.005,-0.096 -0.086,-0.096 l -0.388,0 0.065,-0.41 0.382,0 c 0.193,0 0.296,0.056 0.296,0.362 l 0,2.213 0.208,0 0,0.426 -0.208,0 0,0.737 -0.269,0 m -1.813,-1.585 c 0.09,-0.112 0.256,-0.311 0.472,-0.694 -0.198,-0.582 -0.457,-0.889 -0.562,-1.016 l 0.18,-0.368 c 0.176,0.228 0.4,0.546 0.568,1.037 0.14,-0.283 0.221,-0.495 0.273,-0.633 l 0.211,0.266 c -0.093,0.283 -0.246,0.575 -0.361,0.782 0.128,0.522 0.179,0.964 0.203,1.2 l 0.146,0 0,0.406 -0.437,0 0,0.605 -0.267,0 0,-0.605 -0.471,0 0,-0.406 0.76,0 c -0.014,-0.196 -0.04,-0.487 -0.127,-0.873 -0.202,0.322 -0.327,0.486 -0.397,0.578 l -0.191,-0.279 m 1.11,-0.112 c 0.125,-0.311 0.241,-0.71 0.316,-1.056 l 0.256,0.199 c -0.15,0.61 -0.259,0.885 -0.334,1.06 l -0.238,-0.203 z"
id="path4634"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
<g
id="g4636">
<g
clip-path="url(#clipPath4640)"
id="g4638">
<g
clip-path="url(#clipPath4646)"
id="g4644">
<path
d="m 190.642,627.163 -0.658,0 0,0.371 0.658,0 0,-0.371 z m -0.899,0 -0.631,0 0,0.371 0.631,0 0,-0.371 z m -0.949,-1.643 c 0.494,0.164 0.793,0.375 0.961,0.531 0.016,-0.052 0.023,-0.087 0.033,-0.14 -0.156,-0.143 -0.514,-0.406 -1.107,-0.573 l 0.083,-0.351 c 0.55,0.203 0.888,0.442 1.061,0.602 0.006,-0.236 -0.007,-0.299 -0.152,-0.299 l -0.222,0 0.058,-0.395 0.228,0 c 0.136,0 0.337,0 0.337,0.582 0,0.075 -0.007,0.59 -0.18,0.925 -0.048,0.087 -0.083,0.144 -0.106,0.175 0.108,0.076 0.196,0.164 0.301,0.267 0.126,-1.223 0.487,-1.583 0.834,-1.849 l 0.161,0.362 c -0.086,0.069 -0.309,0.243 -0.485,0.519 0.161,0.143 0.279,0.291 0.402,0.458 l -0.206,0.283 c -0.098,-0.167 -0.221,-0.299 -0.342,-0.427 -0.035,0.104 -0.09,0.339 -0.125,0.654 l 0.563,0 0,1.004 -0.58,0 c 0.105,0.161 0.12,0.184 0.155,0.251 l 0,0.32 -0.871,0 c 0.027,0.051 0.04,0.076 0.075,0.151 l -0.269,0.088 c -0.279,-0.538 -0.627,-0.686 -0.75,-0.737 l 0.105,-0.351 c 0.062,0.035 0.078,0.048 0.113,0.071 l 0,-0.797 0.831,0 c -0.299,-0.223 -0.628,-0.323 -0.952,-0.411 l 0.086,-0.326 c 0.141,0.039 0.414,0.119 0.738,0.319 0.036,-0.048 0.055,-0.081 0.073,-0.112 -0.288,-0.243 -0.605,-0.379 -0.929,-0.442 l 0.078,-0.352 m 0.346,2.328 c 0.111,0.1 0.188,0.184 0.241,0.251 l 0.726,0 c -0.047,-0.087 -0.098,-0.163 -0.164,-0.251 l -0.803,0 z"
id="path4650"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="400"
height="400"
id="svg3220">
<defs
id="defs3222" />
<g
transform="translate(0,-652.36218)"
id="layer1">
<g
transform="matrix(0.2951006,0,0,0.2951006,-4086.5531,-2336.2691)"
id="g3176"
style="fill-rule:evenodd">
<rect
width="1355.47"
height="1355.47"
rx="116.97"
ry="116.97"
x="13848"
y="10127.5"
id="rect62"
style="fill:#000000;fill-opacity:1" />
<g
id="text82"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 14296.49,10455.472 114.205,0 0,673.428 -130.25,0 0,-500.706 c -11.326,11.642 -23.596,21.709 -36.809,30.203 -13.214,8.495 -27.686,15.574 -43.417,21.237 l 0,-120.812 c 23.281,-13.213 43.023,-28.472 59.226,-45.776 16.202,-17.303 28.551,-36.494 37.045,-57.574 z"
id="path2904"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
<g
id="text84"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 14651.326,10909.458 0,64.653 c -10e-4,34.293 2.674,56.709 8.022,67.248 5.348,10.54 14.944,15.81 28.787,15.81 13.528,0 22.967,-5.899 28.315,-17.697 5.349,-11.798 8.023,-33.585 8.023,-65.361 l 0,-64.653 c 0,-33.978 -2.596,-56.158 -7.787,-66.54 -5.191,-10.382 -14.708,-15.574 -28.551,-15.574 -13.843,0 -23.439,5.585 -28.787,16.753 -5.348,11.169 -8.023,32.956 -8.022,65.361 z m 2.831,-299.668 0,33.978 c 0,34.922 2.438,57.496 7.315,67.72 4.876,10.225 13.764,15.338 26.663,15.337 12.27,10e-4 20.764,-5.584 25.484,-16.753 4.719,-11.168 7.078,-33.27 7.079,-66.304 l 0,-33.978 c 0,-33.663 -2.439,-55.922 -7.315,-66.777 -4.877,-10.854 -13.607,-16.281 -26.192,-16.281 -12.27,0 -20.843,5.663 -25.719,16.989 -4.877,11.327 -7.315,33.349 -7.315,66.069 z m -42.473,164.227 c -28.315,-8.179 -50.574,-23.359 -66.776,-45.54 -16.203,-22.18 -24.304,-48.843 -24.304,-79.99 l 0,-38.697 c 0,-58.203 13.135,-100.283 39.405,-126.239 26.27,-25.955 68.979,-38.932 128.126,-38.933 58.833,0 101.227,12.9 127.182,38.697 25.956,25.799 38.933,67.957 38.934,126.475 l 0,38.697 c 0,31.147 -7.945,57.889 -23.832,80.226 -15.888,22.338 -37.99,37.439 -66.305,45.304 30.517,8.81 53.799,25.012 69.844,48.608 16.045,23.596 24.068,53.484 24.068,89.665 l 0,62.765 c 0,58.203 -13.529,100.361 -40.585,126.474 -27.057,26.113 -70.473,39.169 -130.25,39.169 -60.091,0 -103.35,-12.899 -129.777,-38.697 -26.428,-25.798 -39.642,-68.114 -39.641,-126.946 l 0,-62.765 c -10e-4,-36.495 7.943,-66.462 23.831,-89.901 15.888,-23.438 39.248,-39.562 70.08,-48.372 z"
id="path2901"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="400"
height="400"
id="svg3105">
<defs
id="defs3107" />
<g
transform="translate(0,-652.36218)"
id="layer1">
<g
transform="matrix(0.2951006,0,0,0.2951006,-3138.8375,-2336.2691)"
id="g3115"
style="fill-rule:evenodd">
<rect
width="1355.47"
height="1355.47"
rx="116.97"
ry="116.97"
x="10636.5"
y="10127.5"
id="rect58"
style="fill:#ff6600;fill-opacity:1" />
<g
id="text70"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 11074.291,10448.072 114.205,0 0,673.428 -130.25,0 0,-500.706 c -11.326,11.641 -23.596,21.709 -36.81,30.203 -13.214,8.495 -27.686,15.574 -43.416,21.236 l 0,-120.811 c 23.281,-13.213 43.023,-28.472 59.226,-45.776 16.202,-17.303 28.551,-36.495 37.045,-57.574 z"
id="path2892"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
<g
id="text72"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 11464.892,10546.231 -86.362,327.04 87.305,0 7.551,-327.04 z m -59.934,-98.159 184.52,0 0,425.199 81.17,0 0,100.518 -81.17,0 0,147.711 -127.89,0 0,-147.711 -182.632,0 0,-115.148 z"
id="path2889"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="354pt"
height="354pt"
viewBox="0 0 354 354"
version="1.1"
id="svg2"
inkscape:version="0.47 r22583"
sodipodi:docname="simbolo_L.svg">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 221.25 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="442.5 : 221.25 : 1"
inkscape:persp3d-origin="221.25 : 147.5 : 1"
id="perspective16" />
<inkscape:perspective
id="perspective5685"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2830"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2837"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="706"
id="namedview10"
showgrid="false"
inkscape:zoom="1.4142136"
inkscape:cx="42.076033"
inkscape:cy="175.40561"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
fill="#ffffff"
d=" M 0.00 0.00 L 354.00 0.00 L 354.00 354.00 L 0.00 354.00 L 0.00 0.00 Z"
id="path4"
style="fill:none" />
<path
fill="#00ff01"
d=" M 24.04 1.33 C 28.26 0.34 32.63 0.68 36.92 0.69 C 129.93 0.64 222.94 0.69 315.94 0.67 C 321.14 0.81 326.48 0.10 331.53 1.71 C 341.18 4.45 349.38 12.30 352.10 22.02 C 353.96 27.50 353.27 33.37 353.33 39.05 C 353.31 133.68 353.36 228.32 353.33 322.96 C 353.99 336.73 343.41 349.64 330.16 352.70 C 324.85 353.91 319.38 353.10 314.00 353.34 C 219.03 353.29 124.07 353.37 29.10 353.30 C 13.52 353.01 -0.07 338.60 0.63 323.03 C 0.73 225.05 0.62 127.07 0.66 29.09 C 1.12 16.00 11.23 4.03 24.04 1.33 Z"
id="path6"
style="font-size:115.20000000000000000;fill:#00af51;fill-opacity:1" />
<path
sodipodi:type="star"
style="fill:#000000;fill-opacity:0;stroke:#e5a795;stroke-width:0.30704767;stroke-miterlimit:60;stroke-opacity:0.11372549;stroke-dasharray:none;stroke-dashoffset:0"
id="path2833"
sodipodi:sides="6"
sodipodi:cx="-235.3125"
sodipodi:cy="199.6875"
sodipodi:r1="248.7345"
sodipodi:r2="121.61405"
sodipodi:arg1="0.31817488"
sodipodi:arg2="0.84177366"
inkscape:flatsided="true"
inkscape:rounded="0.21"
inkscape:randomized="0.047"
d="M -5.1364516,281.44995 C -24.575715,330.89015 -128.92949,424.60631 -179.55867,439.06353 c -50.62919,14.45723 -205.46046,-30.38142 -237.64156,-71.34481 -32.1811,-40.96339 -62.82664,-195.89571 -47.08516,-245.29738 15.74147,-49.401666 132.44989,-160.73297 182.11886,-172.794056 49.66898,-12.061087 208.235183,35.98315 242.799921,73.898616 34.5647381,37.915467 53.669421,208.48385 34.2301574,257.92405 z"
transform="scale(0.8,0.8)" />
<path
style="fill:none;stroke:#e5a795;stroke-width:0.03838096;stroke-miterlimit:60;stroke-opacity:0.11372549;stroke-dasharray:none;stroke-dashoffset:0"
d="m -80.129648,421.69337 0,-47.875 40.433378,0 40.4333757,0 0.0392813,17.53125 c 0.0390425,17.42523 0.0409388,17.54032 0.3135874,19.03125 1.18576,6.4841 3.47284,11.61964 7.4934638,16.82628 1.3294087,1.72156 4.6348698,5.07131 6.3470728,6.43211 2.921248,2.32172 7.064167,4.69583 10.230696,5.86273 2.936586,1.08216 6.151469,1.80702 9.122204,2.0568 1.118575,0.0941 22.847278,0.13458 72.156249,0.13458 l 70.55569,0 0,13.9375 0,13.9375 -128.562498,0 -128.5625,0 0,-47.875 z"
id="path2841"
transform="scale(0.8,0.8)" />
<path
style="fill:none;stroke:#e5a795;stroke-width:0.03838096;stroke-miterlimit:60;stroke-opacity:0.11372549;stroke-dasharray:none;stroke-dashoffset:0"
d="m 329.99196,455.62441 0,-13.94395 38.71875,0.016 c 41.80885,0.0173 39.7712,0.0463 43.21875,-0.61555 4.69148,-0.90068 9.86536,-3.21683 14.125,-6.32324 7.50298,-5.47166 12.92846,-13.58455 14.86809,-22.23274 0.77966,-3.47628 0.74042,-2.40988 0.78602,-21.36282 l 0.0417,-17.34375 72.68333,0 72.68334,0 0,47.875 0,47.875 -128.5625,0 -128.5625,0 0,-13.94396 z"
id="path2843"
transform="scale(0.8,0.8)" />
<path
style="fill:#ffffff"
d="m 128.92667,98.96268 c 14.42,-0.25 28.86,-0.04 43.29,-0.09 0.38,42.24 0.11,84.49999 0.13,126.73999 23.22,0.12 46.44001,-0.18 69.65001,0.15 0.29,10.04 0.12,20.1 0.08,30.15 -37.72001,0.14 -75.44001,0.03 -113.16001,0.04 -0.07,-52.33 -0.09,-104.65999 0.01,-156.98999 z"
id="path8" />
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="400"
height="400"
id="svg3166">
<defs
id="defs3168" />
<g
transform="translate(0,-652.36218)"
id="layer1">
<g
transform="matrix(0.2951006,0,0,0.2951006,-3612.71,-2336.2691)"
id="g3159"
style="fill-rule:evenodd">
<rect
width="1355.47"
height="1355.47"
rx="116.97"
ry="116.97"
x="12242.3"
y="10127.5"
id="rect60"
style="fill:#fe0000;fill-opacity:1" />
<g
id="text78"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 12688.49,10448.072 114.205,0 0,673.428 -130.25,0 0,-500.706 c -11.326,11.641 -23.596,21.709 -36.809,30.203 -13.214,8.495 -27.686,15.574 -43.417,21.236 l 0,-120.811 c 23.281,-13.213 43.023,-28.472 59.226,-45.776 16.202,-17.303 28.551,-36.495 37.045,-57.574 z"
id="path2898"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
<g
id="text80"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 13111.542,10873.271 c 0,-34.607 -2.281,-57.102 -6.843,-67.485 -4.562,-10.382 -12.821,-15.573 -24.776,-15.573 -11.955,0 -20.292,5.899 -25.011,17.697 -4.72,11.798 -7.079,33.585 -7.079,65.361 l 0,93.44 c 0,34.607 2.281,57.102 6.843,67.484 4.561,10.382 12.977,15.573 25.247,15.573 11.641,0 19.821,-5.663 24.54,-16.989 4.719,-11.326 7.079,-33.349 7.079,-66.068 z m 136.384,-270.882 0,7.079 -136.384,0 0,-7.079 c 0,-34.607 -2.281,-57.101 -6.843,-67.484 -4.562,-10.382 -12.821,-15.573 -24.776,-15.574 -11.955,0 -20.292,5.979 -25.011,17.933 -4.72,11.956 -7.079,33.664 -7.079,65.125 l 0,136.385 c 11.955,-15.73 25.405,-27.371 40.349,-34.922 14.944,-7.551 32.169,-11.326 51.675,-11.326 37.753,0 65.36,12.034 82.822,36.101 17.46,24.069 26.191,62.53 26.191,115.385 l 0,72.675 c 0,82.114 -12.349,138.744 -37.045,169.891 -24.698,31.147 -68.35,46.72 -130.958,46.72 -62.923,0 -106.732,-15.495 -131.429,-46.484 -24.697,-30.989 -37.046,-87.698 -37.046,-170.127 l 0,-263.803 c 0,-82.113 12.349,-138.586 37.046,-169.418 24.697,-30.832 68.506,-46.248 131.429,-46.248 63.237,0 106.889,11.72 130.958,35.157 24.067,23.44 36.101,66.778 36.101,130.014 z"
id="path2895"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="400"
height="400"
id="svg2997">
<defs
id="defs2999" />
<g
transform="translate(0,-652.36218)"
id="layer1">
<g
transform="matrix(0.2951006,0,0,0.2951006,-2143.7583,-2336.2691)"
id="g3007"
style="fill-rule:evenodd">
<rect
width="1355.47"
height="1355.47"
rx="116.97"
ry="116.97"
x="7264.5"
y="10127.5"
id="rect54"
style="fill:#00ccff;fill-opacity:1" />
<g
id="text66"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 7731.4606,10475.171 114.2044,0 0,673.429 -130.2496,0 0,-500.706 c -11.3262,11.641 -23.5961,21.708 -36.8097,30.202 -13.2138,8.495 -27.686,15.574 -43.4165,21.237 l 0,-120.811 c 23.2812,-13.214 43.0231,-28.472 59.2258,-45.777 16.2024,-17.303 28.5509,-36.494 37.0456,-57.574 z"
id="path2871"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
<g
id="text68"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 8292.9562,10679.984 0,263.803 c -3e-4,81.799 -12.5062,138.351 -37.5175,169.655 -25.012,31.304 -69.1364,46.956 -132.3733,46.956 -63.8665,0 -108.2268,-15.574 -133.0811,-46.72 -24.8545,-31.147 -37.2817,-87.777 -37.2816,-169.891 l 0,-263.803 c -1e-4,-82.113 12.4271,-138.586 37.2816,-169.419 24.8543,-30.831 69.2146,-46.247 133.0811,-46.248 63.5515,0 107.7545,15.417 132.6092,46.248 24.8541,30.833 37.2813,87.306 37.2816,169.419 z m -136.3845,-50.495 c -3e-4,-33.663 -2.4385,-55.922 -7.3148,-66.777 -4.8767,-10.853 -13.6072,-16.28 -26.1915,-16.281 -12.5847,0 -21.3938,5.9 -26.4274,17.697 -5.034,11.799 -7.5509,33.585 -7.5507,65.361 l 0,364.321 c -2e-4,34.922 2.438,57.496 7.3147,67.721 4.8763,10.225 13.7641,15.337 26.6634,15.337 12.2697,0 20.9215,-5.742 25.9556,-17.225 5.0335,-11.483 7.5504,-33.428 7.5507,-65.833 z"
id="path2868"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="400"
height="400"
id="svg3051">
<defs
id="defs3053" />
<g
transform="translate(0,-652.36218)"
id="layer1">
<g
transform="matrix(0.2951006,0,0,0.2951006,-2641.3037,-2336.2691)"
id="g3061"
style="fill-rule:evenodd">
<rect
width="1355.47"
height="1355.47"
rx="116.97"
ry="116.97"
x="8950.5195"
y="10127.5"
id="rect56"
style="fill:#ffcc00;fill-opacity:1" />
<g
id="text74"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 9402.1311,10473.972 114.2043,0 0,673.428 -130.2496,0 0,-500.706 c -11.3262,11.642 -23.5961,21.709 -36.8097,30.203 -13.2138,8.495 -27.686,15.574 -43.4165,21.237 l 0,-120.812 c 23.2812,-13.213 43.0231,-28.472 59.2258,-45.776 16.2024,-17.303 28.551,-36.494 37.0457,-57.574 z"
id="path2886"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
<g
id="text76"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
<path
d="m 9961.739,10645.751 0,9.91 c -4e-4,31.147 -4.5623,60.17 -13.6857,87.069 -9.1241,26.9 -24.5401,55.765 -46.248,86.597 l -151.9579,215.667 223.2176,0 0,102.406 -361.018,0 0,-125.53 157.149,-229.353 c 18.2474,-26.112 32.169,-50.888 41.7649,-74.327 9.5954,-23.438 14.3933,-44.281 14.3935,-62.529 l 0,-27.371 c -2e-4,-33.663 -2.4385,-55.922 -7.3147,-66.777 -4.8768,-10.854 -13.7646,-16.281 -26.6635,-16.281 -11.9554,0 -20.3713,5.663 -25.2476,16.989 -4.8767,11.327 -7.3149,33.349 -7.3148,66.069 l 0,27.371 -136.3845,0 0,-9.91 c -10e-5,-68.9 12.4271,-116.564 37.2816,-142.992 24.8542,-26.427 69.2146,-39.64 133.0811,-39.641 63.5515,0 107.5972,13.057 132.1373,39.169 24.5394,26.114 36.8093,73.935 36.8097,143.464 z"
id="path2883"
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="60.42" height="90.628" viewBox="0 0 60.42 90.628"><g id="Group_404" data-name="Group 404" transform="translate(-960 -867)"><g id="Group_275" data-name="Group 275" transform="translate(960 867)"><path id="Path_243" data-name="Path 243" d="M217.98,513.479H157.561v90.628H217.98V513.479Z" transform="translate(-157.561 -513.479)" fill="#fff"></path><g id="Group_257" data-name="Group 257" transform="translate(0.878 0.972)"><g id="Group_254" data-name="Group 254"><path id="Path_244" data-name="Path 244" d="M216.8,514.118V602.8H158.138V514.118H216.8" transform="translate(-158.138 -514.118)" fill="#1a1818"></path></g><rect id="Rectangle_182" data-name="Rectangle 182" width="52.336" height="14.704" transform="translate(2.952 3.152)" fill="#fff"></rect><rect id="Rectangle_183" data-name="Rectangle 183" width="52.366" height="54.062" transform="translate(2.928 21.065)" fill="#fff"></rect><g id="Group_255" data-name="Group 255" transform="translate(2.939 78.13)"><path id="Path_245" data-name="Path 245" d="M160.068,572.732v-7.178h10.513v1.68h-6.29v1.026h5.323v1.674h-5.323v1.124h6.534v1.674Z" transform="translate(-160.068 -565.375)" fill="#fff"></path><path id="Path_246" data-name="Path 246" d="M175.532,567.706a.794.794,0,0,0-.609-.486,3.842,3.842,0,0,0-1.092-.132c-.929,0-1.344.151-1.344.419,0,1.061,7.414.4,7.414,3.007,0,1.661-2.494,2.474-6.034,2.474-3.4,0-5.621-1.107-5.711-2.4H172.2a1.033,1.033,0,0,0,.7.566,3.823,3.823,0,0,0,1.2.181c1.055,0,1.758-.187,1.758-.527,0-1.088-7.419-.342-7.419-3.078,0-1.524,2.364-2.29,5.589-2.29,3.576,0,5.208,1.015,5.516,2.27Z" transform="translate(-155.842 -565.436)" fill="#fff"></path><path id="Path_247" data-name="Path 247" d="M181.473,568.667h1.661c1.308,0,2.01-.19,2.01-.685s-.716-.749-1.7-.749h-1.969Zm0,1.564v2.5H177.25v-7.178h6.088c4.29,0,5.708.656,5.708,2.051,0,.83-.661,1.519-2.165,1.761,1.36.273,2.185.443,2.185,1.891,0,.933-.055,1.258.446,1.258v.218h-4.283a2.793,2.793,0,0,1-.212-1.256c0-.942-.286-1.245-2.255-1.245Z" transform="translate(-151.092 -565.374)" fill="#fff"></path><path id="Path_248" data-name="Path 248" d="M190.925,567.233v1.2h1.76c.842,0,1.452-.216,1.452-.627,0-.562-.833-.574-1.72-.574Zm0,2.5v1.323h1.842c1.047,0,1.833-.122,1.833-.658,0-.627-.982-.665-2.332-.665Zm-4.222,3v-7.178h6.161c2.9,0,5.211.39,5.211,1.81,0,.74-.863,1.279-1.684,1.559,1.395.2,2.144.874,2.144,1.644,0,1.6-2.2,2.165-5.551,2.165Z" transform="translate(-146.153 -565.374)" fill="#fff"></path></g><path id="Path_249" data-name="Path 249" d="M162.932,540.039l40.512-10.1,3.116,10.8-13.017,3.244,8.729,30.336-14.484,3.613-8.735-30.336-13.01,3.247Z" transform="translate(-155.634 -505.854)" fill="#1a1818"></path><g id="Group_256" data-name="Group 256" transform="translate(4.406 6.337)"><path id="Path_250" data-name="Path 250" d="M186.381,518.28h3.44l3.991,4.544-.138-1.9V518.28h3.518v8.32h-3.436l-4-4.532.067,1.964.074,2.568h-3.518Z" transform="translate(-147.788 -518.28)" fill="#1a1818"></path><path id="Path_251" data-name="Path 251" d="M178.241,518.28h9.123v1.933h-5.458v1.2h4.618v1.942h-4.618v1.3h5.675V526.6h-9.34Z" transform="translate(-152.04 -518.28)" fill="#1a1818"></path><path id="Path_252" data-name="Path 252" d="M169.818,518.28h9.125v1.933h-5.458v1.2H178.1v1.942h-4.616v1.3h5.679V526.6h-9.346Z" transform="translate(-156.441 -518.28)" fill="#1a1818"></path><path id="Path_253" data-name="Path 253" d="M161.032,518.28h10.26v2.183H168V526.6h-3.675v-6.137h-3.294Z" transform="translate(-161.032 -518.28)" fill="#1a1818"></path></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
<g>
<rect x="21.597" y="23.875" fill="#44A342" width="660.169" height="695.359"/>
<path fill="#FFFFFF" d="M556.866,674.714L477.189,82.148H212.076l-75.761,592.965l177.216-1.126v-43.874h63.717v44.602H556.866z
M318.292,515.422l26.333-249.205l26.349,249.205H318.292z"/>
<polygon fill="#9CA3AB" points="491.938,553.652 491.938,407.103 409.107,407.103 409.107,557.535 409.107,617.369
494.723,617.369 536.54,617.369 536.54,553.652 "/>
<polygon fill="#FFFFFF" points="638.487,553.652 638.487,407.103 549.284,407.103 549.284,557.535 549.284,617.369
636.736,617.369 683.089,617.369 683.089,553.652 "/>
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.532,0,51.365v731.96c0,24.821,26.333,51.365,50.973,51.365h618.053
c24.631,0,50.973-26.544,50.973-51.365V51.365C720,26.532,693.658,0,669.027,0 M675.314,627.412
c0,21.267-17.121,38.528-38.23,38.528H82.913c-21.116,0-38.236-17.261-38.236-38.528V81.65c0-21.274,17.121-38.523,38.236-38.523
h554.171c21.109,0,38.23,17.248,38.23,38.523V627.412z"/>
<path fill="#FFFFFF" d="M142.401,708.177v9.769h-21.485c0,8.544,2.893,15.967,8.677,22.245c4.607,4.928,10.833,9.01,18.707,12.196
l-7.461,7.784c-5.784-2.29-11.138-4.934-16.032-7.958c-5.339-3.311-9.389-6.627-12.13-9.95c-2.601,3.261-6.568,6.577-11.916,9.95
c-4.894,3.024-10.162,5.668-15.808,7.958l-6.676-7.784c7.715-3.067,13.77-7.131,18.147-12.196
c5.345-6.147,8.014-13.57,8.014-22.245H84.07v-9.769H142.401z M105.88,782.69h66.909v9.769h-68.794
c-5.271,0-9.057-0.753-11.356-2.272c-2.153-1.487-3.23-3.938-3.23-7.311v-18.456h16.471V782.69z M172.011,769.86h-16.477v-32.842
h-18.148v-9.844h18.148v-20.802h16.477V769.86z"/>
<path fill="#FFFFFF" d="M212.997,714.412v-8.506h16.471v8.506h15.584v9.682h-15.584v14c0,10.441,1.929,19.501,5.784,27.236
c3.204,6.446,7.576,11.617,13.145,15.462l-10.13,6.241c-4.231-2.949-7.684-6.322-10.354-10.124c-3.338-4.592-5.6-9.918-6.792-16.01
c-1.409,6.142-3.824,11.512-7.233,16.091c-2.969,3.864-6.714,7.199-11.244,10.043l-9.016-6.241
c5.784-3.802,10.307-8.917,13.583-15.376c3.855-7.535,5.787-16.638,5.787-27.322v-14h-15.363v-9.682H212.997z M237.049,749.494
v-9.483h13.462v-33.638h16.471v86.995h-16.471v-43.874H237.049z M292.036,793.368H275.56v-86.995h16.477V793.368z"/>
<path fill="#FFFFFF" d="M371.098,717.847c5.046,7.292,7.57,16.589,7.57,27.851c0,11.935-2.523,21.66-7.57,29.121
c-5.348,8.133-12.84,12.214-22.488,12.214c-9.723,0-17.292-4.082-22.714-12.214c-4.969-7.461-7.455-17.186-7.455-29.121
c0-11.263,2.486-20.559,7.455-27.851c5.491-7.952,13.066-11.94,22.714-11.94C358.18,705.906,365.681,709.895,371.098,717.847
M338.256,724.362c-2.153,5.482-3.229,12.569-3.229,21.255c0,9.408,1.076,16.968,3.229,22.687
c2.371,6.147,5.787,9.234,10.239,9.234c4.377,0,7.756-3.086,10.134-9.234c2.221-5.719,3.338-13.279,3.338-22.687
c0-8.687-1.117-15.774-3.338-21.255c-2.455-5.973-5.831-8.948-10.134-8.948C344.117,715.414,340.705,718.389,338.256,724.362
M408.721,793.368h-16.477v-86.995h16.477V793.368z"/>
<path fill="#FFFFFF" d="M443.582,731.231c-2.153-2.29-3.223-4.741-3.223-7.312c0-5.021,3.562-9.196,10.684-12.594
c7.862-3.609,18.664-5.42,32.394-5.42c13.655,0,24.456,1.811,32.393,5.42c7.202,3.397,10.802,7.573,10.802,12.594
c0,2.57-1.117,5.022-3.339,7.312c-2.377,2.352-5.718,4.399-10.024,6.147v9.321h18.375v9.85h-96.409v-9.85h18.148v-9.321
C449.073,735.63,445.813,733.583,443.582,731.231 M514.492,766.96c6.978,3.186,10.469,7.131,10.469,11.841
c0,4.58-3.49,8.462-10.469,11.673c-7.722,3.547-18.101,5.327-31.165,5.327c-13.138,0-23.568-1.78-31.283-5.327
c-6.901-3.211-10.348-7.093-10.348-11.673c0-4.71,3.447-8.655,10.348-11.841c7.715-3.566,18.145-5.345,31.283-5.345
C496.391,761.615,506.77,763.394,514.492,766.96 M463.845,718.301c-4.309,1.45-6.456,3.304-6.456,5.619
c0,2.215,2.147,4.051,6.456,5.501c4.676,1.581,11.131,2.352,19.37,2.352s14.731-0.772,19.482-2.352
c4.296-1.45,6.449-3.285,6.449-5.501c0-2.314-2.153-4.169-6.449-5.619c-4.751-1.506-11.244-2.265-19.482-2.265
S468.521,716.796,463.845,718.301 M464.399,773.836c-4.157,1.307-6.226,2.943-6.226,4.878c0,1.929,2.069,3.554,6.226,4.891
c4.676,1.493,11.022,2.24,19.037,2.24c7.793,0,13.988-0.747,18.592-2.24c4.225-1.337,6.34-2.962,6.34-4.891
c0-1.935-2.115-3.571-6.34-4.878c-4.604-1.45-10.799-2.178-18.592-2.178C475.421,771.658,469.075,772.386,464.399,773.836
M496.798,746.7v-5.6c-1.938,0.231-4.054,0.442-6.353,0.616c-2.078,0.137-4.409,0.187-7.009,0.187c-2.67,0-5.053-0.05-7.122-0.187
c-2.377-0.174-4.533-0.385-6.462-0.616v5.6H496.798z"/>
<path fill="#FFFFFF" d="M606.915,708.177v26.949c0,12.893-4.16,23.726-12.47,32.456c-7.715,8.026-19.183,14.492-34.4,19.451
l-6.562-7.411c11.132-3.87,19.771-8.786,25.931-14.753c7.424-7.174,11.138-15.817,11.138-25.941v-20.901h-34.4v-9.85H606.915z
M643.872,706.373v35.262h11.247v9.962h-11.247v41.771h-16.477v-86.995H643.872z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
<g>
<rect x="21.604" y="23.875" fill="#A31639" width="660.165" height="695.353"/>
<path fill="#9CA3AB" d="M322.006,88.519c-69.814,89.204-161.395,95.183-174.138,95.42v81.295c0,0,7.977,0.131,65.011,0.298
c37.446,0.1,36.936,37.285,36.936,37.285v371.897h127.06h312.586V612.31V448.04V158.676V88.519H322.006z"/>
<path fill="#FFFFFF" d="M567.727,121.815c-104.262,0-181.381,38.665-181.381,150.848c0,75.981,18.922,97.168,47.134,117.229
c-24.342,18.573-58.384,53.313-58.384,159.33c0,112.189,19.519,119.12,60.17,138.236h172.042c26.022,0,69.411,7.367,82.154,1.947
v-281.99V149.249C663.974,132.779,628.395,121.815,567.727,121.815 M593.886,610.879c0,19.812-10.927,35.853-25.487,35.853
c-14.561,0-25.487-16.041-25.487-35.853V494.241c0-19.806,10.926-35.853,25.487-35.853c14.56,0,25.487,16.048,25.487,35.853
V610.879z M593.886,321.95c0,19.806-10.927,35.853-25.487,35.853c-14.561,0-25.487-16.048-25.487-35.853v-71.694
c0-19.806,10.926-35.853,25.487-35.853c14.56,0,25.487,16.048,25.487,35.853V321.95z"/>
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.538,0,51.365v731.96c0,24.815,26.333,51.365,50.973,51.365h618.053
c24.634,0,50.973-26.551,50.973-51.365V51.365C720,26.538,693.661,0,669.027,0 M675.317,627.412
c0,21.267-17.13,38.523-38.236,38.523H82.913c-21.113,0-38.236-17.255-38.236-38.523V81.65c0-21.274,17.124-38.523,38.236-38.523
h554.169c21.106,0,38.236,17.248,38.236,38.523V627.412z"/>
<path fill="#FFFFFF" d="M71.321,708.955v-7.467h13.428v7.467h18.132v10.161H84.748c0,6.011,2.016,11.543,6.061,16.589
c3.746,4.698,8.917,8.569,15.512,11.624l-5.992,7.834c-4.828-1.936-9.358-4.605-13.596-8.027
c-4.231-3.491-7.224-6.938-8.978-10.379c-1.867,3.441-4.96,6.888-9.247,10.379c-4.349,3.541-8.979,6.253-13.876,8.139l-4.984-7.759
c6.223-3.099,11.269-7.006,15.139-11.73c4.349-5.232,6.534-10.783,6.534-16.67H53.183v-10.161H71.321z M119.282,764.191
c5.818,3.721,8.711,8.326,8.711,13.752c-0.062,5.357-3.006,9.881-8.792,13.565c-6.471,4.131-15.3,6.203-26.482,6.203
c-11.132,0-19.924-2.072-26.389-6.203c-5.737-3.684-8.612-8.207-8.612-13.565c0-5.426,2.875-10.031,8.612-13.752
c6.527-4.143,15.326-6.203,26.389-6.203C103.963,757.987,112.811,760.047,119.282,764.191 M76.585,771.353
c-3.516,1.742-5.264,3.908-5.264,6.484c0,2.52,1.748,4.648,5.264,6.397c3.913,2.01,9.29,3.018,16.134,3.018
c6.944,0,12.426-1.008,16.408-3.018c3.559-1.749,5.357-3.877,5.357-6.397c0-2.576-1.798-4.742-5.357-6.484
c-3.982-1.941-9.464-2.906-16.408-2.906C85.875,768.447,80.499,769.412,76.585,771.353 M126.724,755.163h-13.421v-18.3H97.971
v-10.18h15.332V701.98h13.421V755.163z"/>
<path fill="#FFFFFF" d="M198.076,733.073c5.37,6.203,13.266,11.119,23.67,14.722l-5.992,8.257
c-8.463-3.049-15.413-6.471-20.858-10.273c-5.675-4.026-10.186-8.724-13.502-14.137c-3.093,5.413-7.473,10.111-13.154,14.137
c-5.438,3.802-12.457,7.224-21.032,10.273l-5.357-8.257c9.919-3.603,17.56-8.562,22.955-14.815
c6.695-7.809,10.049-17.889,10.049-30.228h13.341C188.195,715.284,191.493,725.389,198.076,733.073 M174.854,778.229v-25.866
h13.341v25.866h32.723v10.174h-78.514v-10.174H174.854z"/>
<path fill="#FFFFFF" d="M294.28,736.95h-24.665v-10.553h24.665v-7.286h-24.211v-10.46h24.211v-6.671h13.421v67.432H294.28v-14.137
h-48.796c-3.261,0-5.675-1.014-7.249-3.018c-1.45-1.792-2.171-4.393-2.171-7.753v-41.752h13.415v42.15h44.801V736.95z
M253.822,783.76h54.514v10.46h-56.045c-4.3,0-7.367-0.815-9.246-2.433c-1.761-1.605-2.639-4.231-2.639-7.834v-19.762h13.416
V783.76z"/>
<path fill="#FFFFFF" d="M367.542,714.276c4.094,7.821,6.16,17.777,6.16,29.842c0,12.793-2.066,23.203-6.16,31.198
c-4.362,8.724-10.472,13.086-18.319,13.086c-7.933,0-14.1-4.362-18.512-13.086c-4.038-7.995-6.066-18.405-6.066-31.198
c0-12.065,2.029-22.021,6.066-29.842c4.468-8.525,10.641-12.787,18.512-12.787C357.007,701.488,363.111,705.751,367.542,714.276
M340.786,721.244c-1.767,5.893-2.632,13.477-2.632,22.786c0,10.074,0.865,18.182,2.632,24.31c1.929,6.59,4.716,9.888,8.338,9.888
c3.566,0,6.322-3.298,8.251-9.888c1.817-6.129,2.726-14.237,2.726-24.31c0-9.309-0.909-16.894-2.726-22.786
c-2.003-6.384-4.748-9.576-8.251-9.576C345.552,711.668,342.777,714.861,340.786,721.244 M398.187,795.191h-13.416V701.98h13.416
V795.191z"/>
<path fill="#FFFFFF" d="M420.656,728.624c-1.743-2.458-2.62-5.078-2.62-7.846c0-5.37,2.9-9.85,8.705-13.472
c6.409-3.877,15.195-5.818,26.383-5.818c11.131,0,19.93,1.941,26.395,5.818c5.862,3.622,8.786,8.102,8.786,13.472
c0,2.768-0.902,5.389-2.712,7.846c-1.948,2.514-4.661,4.717-8.164,6.583v9.987h14.959v10.553h-78.526v-10.553h14.778v-9.987
C425.129,733.341,422.472,731.138,420.656,728.624 M478.424,766.892c5.687,3.422,8.525,7.653,8.525,12.687
c0,4.916-2.838,9.078-8.525,12.507c-6.285,3.808-14.747,5.712-25.387,5.712c-10.696,0-19.19-1.904-25.487-5.712
c-5.606-3.429-8.432-7.591-8.432-12.507c0-5.034,2.825-9.265,8.432-12.687c6.297-3.815,14.791-5.719,25.487-5.719
C463.677,761.173,472.139,763.077,478.424,766.892 M437.164,714.767c-3.498,1.556-5.246,3.547-5.246,6.011
c0,2.37,1.748,4.349,5.246,5.905c3.814,1.693,9.072,2.52,15.779,2.52c6.714,0,12.009-0.827,15.874-2.52
c3.497-1.555,5.257-3.534,5.257-5.905c0-2.464-1.76-4.455-5.257-6.011c-3.864-1.618-9.159-2.426-15.874-2.426
C446.236,712.341,440.978,713.149,437.164,714.767 M437.624,774.259c-3.391,1.413-5.083,3.155-5.083,5.227
c0,2.066,1.692,3.815,5.083,5.246c3.808,1.599,8.973,2.414,15.5,2.414c6.347,0,11.393-0.815,15.138-2.414
c3.441-1.431,5.171-3.18,5.171-5.246c0-2.072-1.73-3.814-5.171-5.227c-3.746-1.549-8.792-2.327-15.138-2.327
C446.596,771.932,441.432,772.71,437.624,774.259 M464,745.194v-6.005c-1.562,0.243-3.292,0.473-5.152,0.672
c-1.705,0.131-3.609,0.193-5.724,0.193c-2.166,0-4.101-0.062-5.799-0.193c-1.929-0.199-3.683-0.43-5.264-0.672v6.005H464z"/>
<path fill="#FFFFFF" d="M582.878,748.106h-32.475v6.59h28.032v24.69H522.21v4.268h56.941v10.566h-58.111
c-4.001,0-7.05-0.933-9.172-2.818c-2.047-1.799-3.074-4.387-3.074-7.747V768.92h56.225v-3.764h-56.225v-10.46h28.199v-6.59h-32.649
v-10.385h78.532V748.106z M522.21,702.752v4.467h42.81v-4.467h13.416v31.591h-57.395c-4.3,0-7.442-0.877-9.445-2.626
c-1.867-1.736-2.8-4.424-2.8-8.033v-20.932H522.21z M522.21,723.877h42.816v-6.304H522.21V723.877z"/>
<path fill="#FFFFFF" d="M638.282,703.922v28.871c0,13.814-3.391,25.419-10.167,34.783c-6.291,8.587-15.637,15.531-28.025,20.826
l-5.332-7.94c9.066-4.144,16.103-9.402,21.125-15.799c6.042-7.685,9.066-16.956,9.066-27.802v-22.388h-28.032v-10.553H638.282z
M668.373,701.98v37.788h9.153v10.666h-9.153v44.757h-13.428V701.98H668.373z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 720 834.694" enable-background="new 0 0 720 834.694" xml:space="preserve">
<g>
<rect x="21.604" y="23.875" fill="#F9B846" width="660.172" height="695.356"/>
<path fill="#9CA3AB" d="M322.011,88.52c-69.815,89.204-161.396,95.184-174.139,95.42v81.295c0,0,7.971,0.131,65.012,0.298
c37.44,0.1,36.936,37.285,36.936,37.285v371.899H376.88h312.587v-62.404v-164.27V158.677V88.52H322.011z"/>
<path fill="#FFFFFF" d="M702.21,235.069V126.75H389.996v318.585h146.549v-31.89c0-17.734,13.453-32.101,28.673-32.101
c15.22,0,28.673,14.368,28.673,32.101v199.041c0,17.734-13.453,32.107-28.673,32.107c-15.22,0-28.673-14.373-28.673-32.107V600.49
v-91.438H389.996v30.433c0,136.606,5.14,162.242,130.819,161.95c0,0,168.72,16.085,168.72-98.817l2.47-172.379
c1.73-119.525-4.306-146.393-66.144-146.393c-47.302,0-70.201,18.306-89.316,39.717v-88.495H702.21z"/>
<path fill="#231F20" d="M669.026,0H50.974C26.339,0,0,26.538,0,51.366v731.963c0,24.815,26.339,51.366,50.974,51.366h618.053
c24.641,0,50.974-26.551,50.974-51.366V51.366C720,26.538,693.667,0,669.026,0 M675.317,627.414
c0,21.268-17.124,38.523-38.23,38.523H82.913c-21.109,0-38.23-17.255-38.23-38.523V81.65c0-21.274,17.121-38.523,38.23-38.523
h554.174c21.106,0,38.23,17.248,38.23,38.523V627.414z"/>
<path fill="#FFFFFF" d="M105.432,708.099v78.67H89.739v-48.926c0-2.408-0.127-4.212-0.395-5.426
c-0.261-1.207-0.79-2.109-1.611-2.719c-1.046-0.772-2.43-1.313-4.182-1.624c-1.739-0.292-4.461-0.442-8.176-0.442h-2.343v-7.057
c5.582-0.902,10.289-2.383,14.131-4.436c3.873-2.042,7.314-4.735,10.367-8.04H105.432z"/>
<path fill="#FFFFFF" d="M175.362,708v9.676h-37.179v21.436c3.631-4.349,9.461-6.514,17.485-6.514
c16.252,0,24.37,6.969,24.37,20.895v8.941c0,8.456-2.001,14.89-6.002,19.302c-4.014,4.437-11.061,6.633-21.162,6.565
c-19.292-0.181-28.94-7.237-28.94-21.162v-3.261h15.248v3.901c0,3.006,1.008,5.495,3.008,7.449
c2.013,1.973,5.339,2.949,10.025,2.949c4.53,0,7.747-1.12,9.682-3.336c1.92-2.24,2.893-5.861,2.893-10.864v-9.944
c0-4.156-1.095-7.199-3.273-9.091c-2.2-1.904-5.526-2.844-9.968-2.844c-3.345,0-6.229,0.939-8.696,2.794
c-2.439,1.879-3.671,3.764-3.671,5.706h-14.8V708H175.362z"/>
<path fill="#FFFFFF" d="M228.377,705.381v29.121c0,10.179,2.047,19.582,6.117,28.218c3.64,7.641,8.03,13.054,13.142,16.178
l-10.248,6.421c-3.855-2.776-7.308-6.353-10.354-10.765c-3.255-4.754-5.631-9.85-7.115-15.282
c-1.416,5.432-3.793,10.528-7.125,15.282c-3.115,4.412-6.683,7.99-10.693,10.765l-9.461-6.421
c4.754-3.379,8.948-8.761,12.578-16.178c4.461-8.861,6.677-18.269,6.677-28.218v-29.121H228.377z M267.677,704.659v86.995h-16.253
v-44.309h-11.813v-10.23h11.813v-32.456H267.677z M292.044,791.654h-16.247v-86.995h16.247V791.654z"/>
<path fill="#FFFFFF" d="M371.106,716.139c5.04,7.299,7.573,16.589,7.573,27.851c0,11.934-2.533,21.654-7.573,29.114
c-5.348,8.139-12.834,12.215-22.481,12.215c-9.722,0-17.292-4.076-22.721-12.215c-4.956-7.461-7.448-17.18-7.448-29.114
c0-11.263,2.492-20.553,7.448-27.851c5.507-7.959,13.07-11.941,22.721-11.941C358.194,704.198,365.689,708.18,371.106,716.139
M338.276,722.647c-2.159,5.489-3.229,12.576-3.229,21.262c0,9.401,1.07,16.962,3.229,22.68c2.365,6.154,5.781,9.234,10.227,9.234
c4.39,0,7.756-3.08,10.139-9.234c2.222-5.718,3.332-13.279,3.332-22.68c0-8.687-1.111-15.774-3.332-21.262
c-2.448-5.967-5.824-8.941-10.139-8.941C344.132,713.706,340.718,716.68,338.276,722.647 M408.726,791.654h-16.477v-86.995h16.477
V791.654z"/>
<path fill="#FFFFFF" d="M443.596,729.523c-2.152-2.289-3.216-4.741-3.216-7.317c0-5.015,3.559-9.191,10.677-12.575
c7.865-3.622,18.661-5.432,32.394-5.432c13.652,0,24.46,1.811,32.4,5.432c7.199,3.385,10.795,7.56,10.795,12.575
c0,2.576-1.114,5.028-3.348,7.317c-2.365,2.352-5.712,4.4-10.012,6.148v9.321h18.375v9.85h-96.409v-9.85h18.144v-9.321
C449.09,733.923,445.824,731.875,443.596,729.523 M514.512,765.246c6.981,3.192,10.466,7.143,10.466,11.841
c0,4.586-3.485,8.469-10.466,11.673c-7.716,3.553-18.101,5.327-31.162,5.327c-13.135,0-23.577-1.774-31.298-5.327
c-6.894-3.204-10.348-7.087-10.348-11.673c0-4.698,3.453-8.649,10.348-11.841c7.722-3.566,18.163-5.345,31.298-5.345
C496.412,759.901,506.797,761.68,514.512,765.246 M463.862,716.593c-4.306,1.457-6.465,3.311-6.465,5.613
c0,2.215,2.159,4.057,6.465,5.507c4.673,1.58,11.132,2.352,19.37,2.352c8.239,0,14.735-0.772,19.488-2.352
c4.288-1.45,6.434-3.292,6.434-5.507c0-2.302-2.147-4.156-6.434-5.613c-4.754-1.512-11.25-2.258-19.488-2.258
C474.994,714.335,468.535,715.081,463.862,716.593 M464.422,772.122c-4.156,1.313-6.228,2.943-6.228,4.878
c0,1.929,2.072,3.559,6.228,4.891c4.679,1.494,11.02,2.252,19.028,2.252c7.797,0,14-0.759,18.599-2.252
c4.225-1.332,6.34-2.962,6.34-4.891c0-1.935-2.115-3.566-6.34-4.878c-4.599-1.45-10.802-2.172-18.599-2.172
C475.442,769.95,469.102,770.672,464.422,772.122 M496.816,744.992v-5.607c-1.935,0.23-4.051,0.448-6.347,0.628
c-2.078,0.125-4.418,0.18-7.019,0.18c-2.669,0-5.046-0.055-7.119-0.18c-2.377-0.18-4.523-0.398-6.465-0.628v5.607H496.816z"/>
<path fill="#FFFFFF" d="M606.933,706.47v26.949c0,12.893-4.163,23.726-12.469,32.462c-7.722,8.014-19.19,14.492-34.403,19.439
l-6.571-7.411c11.132-3.864,19.781-8.774,25.948-14.747c7.423-7.174,11.138-15.817,11.138-25.947V716.32h-34.416v-9.85H606.933z
M643.894,704.659v35.269h11.231v9.949h-11.231v41.777h-16.483v-86.995H643.894z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
<g>
<rect x="21.592" y="23.875" fill="#F68120" width="660.178" height="695.353"/>
<polygon fill="#FFFFFF" points="542.912,94.891 96.895,94.891 96.895,247.811 211.585,247.811 211.585,674.714 428.222,674.714
428.222,247.811 542.912,247.811 "/>
<path fill="#FFFFFF" d="M510.749,506.013c-12.669-10.105-28.019-17.833-28.019-34.758c0-6.508,1.892-11.356,7.66-11.356
c6.577,0,8.425,8.444,8.425,15.767l-0.081,1.525h50.55v-13.963c0-15.706-2.987-28.268-14.779-37.322
c-11.592-8.942-19.924-13.447-48.105-13.447c-23.048,0-53.313,19.806-55.734,52.1c-1.53,20.328,0.809,43.332,19.115,61.8
c11.039,11.157,51.216,29.332,49.088,57.588c-0.84,11.001-1.083,16.582-6.894,16.582c-6.484,0-7.815-13.801-7.815-28.473
l0.112-18.406h-54.414l-0.958,19.837c0,24.391,1.288,37.745,13.185,48.621c10.491,9.607,22.874,16.271,48.802,16.271
c35.897,0,61.296-12.114,61.296-60.574C552.183,540.585,531.538,522.572,510.749,506.013"/>
<polygon fill="#FFFFFF" points="562.028,413.475 562.028,451.705 593.886,451.705 593.886,630.112 657.603,630.112
657.603,451.705 683.089,451.705 683.089,413.475 "/>
<polygon fill="#9CA3AB" points="370.877,585.51 370.877,540.909 402.736,540.909 402.736,496.307 370.877,496.307 370.877,451.705
415.479,451.705 415.479,413.475 319.904,413.475 319.904,630.112 415.479,630.112 415.479,585.51 "/>
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.538,0,51.365v731.96c0,24.815,26.333,51.365,50.973,51.365h618.053
c24.634,0,50.973-26.551,50.973-51.365V51.365C720,26.538,693.661,0,669.027,0 M675.317,627.412
c0,21.267-17.13,38.523-38.236,38.523H82.913c-21.113,0-38.236-17.255-38.236-38.523V81.65c0-21.274,17.124-38.523,38.236-38.523
h554.169c21.106,0,38.236,17.248,38.236,38.523V627.412z"/>
<path fill="#FFFFFF" d="M136.998,705.421v9.85h-6.888v25.424h15.245v9.77H75.44v-9.77h9.122v-25.424h-9.01v-9.85H136.998z
M158.925,762.119c7.062,3.428,10.59,7.653,10.59,12.662c-0.081,4.946-3.683,9.103-10.808,12.476
c-7.859,3.796-18.449,5.706-31.721,5.706c-13.652,0-24.46-1.91-32.394-5.706c-7.124-3.373-10.696-7.529-10.696-12.476
c0-5.009,3.572-9.234,10.696-12.662c7.933-3.802,18.742-5.694,32.394-5.694C140.42,756.426,151.066,758.317,158.925,762.119
M107.161,768.901c-4.306,1.568-6.446,3.528-6.446,5.88c0,2.233,2.14,4.125,6.446,5.699c4.822,1.811,11.437,2.719,19.824,2.719
c8.164,0,14.654-0.908,19.476-2.719c4.386-1.574,6.57-3.466,6.57-5.699c0-2.352-2.184-4.312-6.57-5.88
c-4.823-1.755-11.312-2.626-19.476-2.626C118.598,766.276,111.984,767.147,107.161,768.901 M101.038,740.695h12.694v-25.424
h-12.694V740.695z M152.149,736.8h-13.484v-9.769h13.484v-5.513h-13.378v-9.863h13.378v-8.039h16.464v49.636h-16.464V736.8z"/>
<path fill="#FFFFFF" d="M361.437,705.421v26.949c0,12.892-4.156,23.732-12.476,32.462c-7.71,8.021-19.171,14.498-34.385,19.445
l-6.565-7.411c11.12-3.87,19.769-8.78,25.935-14.747c7.417-7.175,11.131-15.818,11.131-25.947v-20.901h-34.403v-9.85H361.437z
M398.405,703.617v35.262h11.231v9.956h-11.231v41.777h-16.483v-86.994H398.405z"/>
<path fill="#FFFFFF" d="M560.708,728.481c-2.147-2.29-3.217-4.742-3.217-7.318c0-5.015,3.566-9.196,10.684-12.581
c7.871-3.615,18.661-5.426,32.381-5.426c13.677,0,24.473,1.811,32.412,5.426c7.181,3.385,10.803,7.566,10.803,12.581
c0,2.576-1.12,5.028-3.342,7.318c-2.383,2.352-5.712,4.399-10.03,6.141v9.327h18.375v9.85H552.37v-9.85h18.138v-9.327
C566.209,732.88,562.942,730.833,560.708,728.481 M631.637,764.204c6.962,3.186,10.465,7.137,10.465,11.841
c0,4.586-3.503,8.462-10.465,11.667c-7.741,3.559-18.12,5.332-31.181,5.332c-13.142,0-23.564-1.774-31.28-5.332
c-6.901-3.205-10.354-7.081-10.354-11.667c0-4.704,3.453-8.655,10.354-11.841c7.716-3.566,18.138-5.345,31.28-5.345
C613.517,758.858,623.896,760.638,631.637,764.204 M580.968,715.551c-4.306,1.456-6.453,3.31-6.453,5.612
c0,2.215,2.147,4.057,6.453,5.501c4.691,1.58,11.144,2.352,19.376,2.352c8.239,0,14.734-0.772,19.482-2.352
c4.306-1.444,6.453-3.285,6.453-5.501c0-2.302-2.147-4.156-6.453-5.612c-4.748-1.512-11.243-2.259-19.482-2.259
C592.112,713.293,585.659,714.039,580.968,715.551 M581.528,771.079c-4.151,1.313-6.223,2.943-6.223,4.878
c0,1.923,2.072,3.553,6.223,4.891c4.667,1.494,11.02,2.259,19.028,2.259c7.809,0,13.994-0.765,18.611-2.259
c4.225-1.338,6.341-2.968,6.341-4.891c0-1.935-2.115-3.565-6.341-4.878c-4.617-1.45-10.802-2.178-18.611-2.178
C592.548,768.901,586.195,769.63,581.528,771.079 M613.934,743.95v-5.606c-1.929,0.23-4.05,0.442-6.347,0.628
c-2.084,0.125-4.411,0.181-7.031,0.181c-2.651,0-5.034-0.056-7.112-0.181c-2.37-0.187-4.523-0.398-6.459-0.628v5.606H613.934z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
<g>
<rect x="21.598" y="23.875" fill="#4369B1" width="660.169" height="695.359"/>
<path fill="#9CA3AB" d="M315.551,82.148c-69.815,95.575-161.311,101.555-174.055,101.785v81.301c0,0,7.971,0.124,65.008,0.298
c37.443,0.1,36.939,37.291,36.939,37.291v378.262h126.973h312.673v-68.77V448.04V158.67V82.148H315.551z"/>
<path fill="#FFFFFF" d="M683.089,158.67c-38.23-30.24-69.98-37.651-127.624-37.651c-71.448,0-130.501,26.787-151.246,66.212
c-22.643,43.021-26.971,68.259-26.971,138.236v17.92h152.92v-53.4c0-22.936,4.402-65.26,36.152-65.26
c32.963,0,34.745,29.09,29.79,66.729c-3.021,22.873-24.824,66.324-38.557,88.762c-16.561,27.011-122.959,198.679-173.933,273.092
v27.777h296.442l-8.864-42.206L569.5,636.11c31.165-48.957,100.846-157.612,113.589-188.07V158.67z"/>
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.532,0,51.365v731.96c0,24.821,26.333,51.365,50.973,51.365h618.053
c24.631,0,50.973-26.544,50.973-51.365V51.365C720,26.532,693.658,0,669.027,0 M675.314,627.412
c0,21.267-17.121,38.528-38.23,38.528H82.913c-21.116,0-38.236-17.261-38.236-38.528V81.65c0-21.274,17.121-38.523,38.236-38.523
h554.171c21.109,0,38.23,17.248,38.23,38.523V627.412z"/>
<path fill="#FFFFFF" d="M105.916,709.808v78.675H90.224v-48.932c0-2.408-0.134-4.207-0.389-5.426
c-0.268-1.201-0.803-2.103-1.618-2.719c-1.039-0.765-2.436-1.313-4.182-1.624c-1.745-0.292-4.467-0.442-8.183-0.442h-2.337v-7.056
c5.569-0.896,10.283-2.383,14.137-4.437c3.861-2.034,7.314-4.735,10.354-8.039H105.916z"/>
<path fill="#FFFFFF" d="M178.41,778.359v10.123H125.2v-11.312c4.309-5.613,9.131-11.132,14.47-16.595
c5.339-5.445,9.725-9.682,13.138-12.657c3.416-2.993,6.359-6.135,8.845-9.457c2.492-3.304,3.733-6.378,3.733-9.222
c0-4.026-0.98-6.901-2.949-8.587c-1.97-1.686-5.326-2.52-10.074-2.52c-4.231,0-7.296,0.915-9.187,2.732
c-1.889,1.848-2.837,4.58-2.837,8.195v7.517H125.2v-3.074c0-8.145,1.994-14.386,6.007-18.723c4.01-4.344,10.759-6.521,20.263-6.521
c9.278,0,16.452,1.892,21.542,5.656c5.087,3.771,7.623,8.736,7.623,14.884c0,4.032-1.039,7.828-3.118,11.399
c-2.069,3.541-4.561,6.652-7.461,9.296c-2.893,2.663-7.271,6.745-13.132,12.258c-5.861,5.513-11.284,11.045-16.246,16.608H178.41z"
/>
<path fill="#FFFFFF" d="M228.854,707.095v29.12c0,10.174,2.041,19.576,6.123,28.218c3.64,7.635,8.017,13.049,13.138,16.172
l-10.245,6.428c-3.861-2.781-7.308-6.359-10.354-10.771c-3.26-4.754-5.638-9.844-7.115-15.276
c-1.416,5.432-3.787,10.522-7.131,15.276c-3.117,4.412-6.676,7.989-10.687,10.771l-9.461-6.428
c4.748-3.373,8.939-8.761,12.579-16.172c4.452-8.867,6.676-18.275,6.676-28.218v-29.12H228.854z M268.155,706.373v86.995h-16.259
v-44.316h-11.801v-10.223h11.801v-32.456H268.155z M292.534,793.368h-16.253v-86.995h16.253V793.368z"/>
<path fill="#FFFFFF" d="M371.589,717.847c5.046,7.292,7.576,16.589,7.576,27.851c0,11.935-2.53,21.66-7.576,29.121
c-5.342,8.139-12.833,12.214-22.481,12.214c-9.722,0-17.298-4.075-22.715-12.214c-4.968-7.461-7.46-17.186-7.46-29.121
c0-11.263,2.492-20.559,7.46-27.851c5.492-7.952,13.064-11.94,22.715-11.94C358.672,705.906,366.172,709.895,371.589,717.847
M338.754,724.356c-2.153,5.488-3.236,12.575-3.236,21.262c0,9.408,1.083,16.968,3.236,22.687
c2.371,6.147,5.787,9.234,10.232,9.234c4.384,0,7.763-3.086,10.134-9.234c2.228-5.719,3.338-13.279,3.338-22.687
c0-8.687-1.111-15.774-3.338-21.262c-2.449-5.967-5.824-8.941-10.134-8.941C344.615,715.414,341.202,718.389,338.754,724.356
M409.212,793.368h-16.477v-86.995h16.477V793.368z"/>
<path fill="#FFFFFF" d="M444.083,731.231c-2.153-2.29-3.223-4.741-3.223-7.312c0-5.021,3.562-9.196,10.684-12.582
c7.861-3.615,18.664-5.432,32.393-5.432c13.655,0,24.457,1.817,32.394,5.432c7.203,3.385,10.802,7.561,10.802,12.582
c0,2.57-1.123,5.022-3.345,7.312c-2.37,2.352-5.712,4.399-10.018,6.147v9.321h18.368v9.85h-96.403v-9.85h18.147v-9.321
C449.567,735.63,446.313,733.583,444.083,731.231 M514.992,766.954c6.978,3.192,10.469,7.143,10.469,11.848
c0,4.58-3.49,8.462-10.469,11.667c-7.716,3.553-18.101,5.332-31.165,5.332c-13.135,0-23.567-1.78-31.282-5.332
c-6.901-3.205-10.348-7.087-10.348-11.667c0-4.704,3.447-8.655,10.348-11.848c7.715-3.559,18.147-5.338,31.282-5.338
C496.891,761.615,507.276,763.394,514.992,766.954 M464.339,718.301c-4.303,1.45-6.45,3.31-6.45,5.619
c0,2.203,2.147,4.051,6.45,5.501c4.682,1.581,11.138,2.352,19.376,2.352c8.238,0,14.731-0.772,19.476-2.352
c4.303-1.45,6.456-3.298,6.456-5.501c0-2.308-2.153-4.169-6.456-5.619c-4.744-1.506-11.238-2.265-19.476-2.265
C475.477,716.036,469.021,716.796,464.339,718.301 M464.899,773.836c-4.153,1.307-6.232,2.937-6.232,4.872
c0,1.929,2.078,3.559,6.232,4.897c4.676,1.493,11.023,2.247,19.037,2.247c7.794,0,13.988-0.753,18.593-2.247
c4.225-1.337,6.34-2.968,6.34-4.897c0-1.935-2.115-3.566-6.34-4.872c-4.605-1.45-10.799-2.178-18.593-2.178
C475.922,771.658,469.575,772.386,464.899,773.836 M497.299,746.7v-5.6c-1.938,0.231-4.054,0.442-6.347,0.622
c-2.084,0.124-4.415,0.18-7.016,0.18c-2.675,0-5.052-0.056-7.121-0.18c-2.377-0.18-4.53-0.392-6.462-0.622v5.6H497.299z"/>
<path fill="#FFFFFF" d="M607.407,708.177v26.949c0,12.893-4.154,23.726-12.461,32.462c-7.725,8.02-19.193,14.492-34.403,19.444
l-6.568-7.411c11.138-3.87,19.778-8.78,25.938-14.753c7.424-7.174,11.132-15.817,11.132-25.941v-20.901h-34.4v-9.85H607.407z
M644.37,706.373v35.262h11.241v9.956H644.37v41.777h-16.477v-86.995H644.37z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="425.292px" height="519.372px" viewBox="0 0 425.292 519.372" enable-background="new 0 0 425.292 519.372"
xml:space="preserve">
<g>
<defs>
<rect id="SVGID_1_" y="-3.624" width="426.082" height="536.12"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect clip-path="url(#SVGID_2_)" fill="#E2011A" width="425.717" height="425.712"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M149.866,365.25H83.451V134.503H40.028V95.337
c29.805,0.422,49.39-11.93,60.031-40.876h49.807V365.25z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M211.162,276.699c0-30.657,6.812-52.361,31.923-71.524
c-20.86-20.86-28.52-39.17-28.52-67.264c0-48.963,31.079-83.45,82.166-83.45c51.086,0,82.166,34.487,82.166,83.45
c0,28.093-7.66,46.403-28.521,67.264c25.126,19.164,31.923,40.867,31.923,71.524c0,55.765-17.438,93.67-85.568,93.67
C228.619,370.369,211.162,332.464,211.162,276.699 M296.731,233.273c-15.329,0-19.164,10.641-19.164,39.597
c0,29.368,3.835,39.587,19.164,39.587c15.319,0,19.163-10.219,19.163-39.587C315.894,243.914,312.05,233.273,296.731,233.273
M296.731,110.662c-14.045,0-17.457,6.811-17.457,36.194c0,29.368,3.412,36.184,17.457,36.184c14.044,0,17.457-6.816,17.457-36.184
C314.188,117.473,310.775,110.662,296.731,110.662"/>
<path clip-path="url(#SVGID_2_)" d="M0,519.372h425.717V0H0 M417.205,417.189H8.522V8.508h408.682V417.189z"/>
<path clip-path="url(#SVGID_2_)" d="M381.254,17.03v3.159h-6.739v21.33h-3.959v-21.33h-6.729V17.03H381.254z M408.691,41.519
h-3.959V22.231h-0.115l-6.787,19.288h-3.23l-6.451-19.288h-0.115v19.288h-3.96V17.03h6.289l6.106,18.219h0.115l5.935-18.219h6.173
V41.519z"/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.039,487.449 34.262,487.449 40.901,455.162 41.049,455.162
47.976,487.449 54.763,487.449 64.114,447.924 57.639,447.924 51.522,480.24 51.364,480.24 44.807,447.924 37.512,447.924
30.796,480.24 30.653,480.24 24.312,447.924 17.821,447.924 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.837,487.449 82.061,487.449 88.694,455.162 88.853,455.162
95.784,487.449 102.547,487.449 111.922,447.924 105.432,447.924 99.316,480.24 99.163,480.24 92.596,447.924 85.301,447.924
78.595,480.24 78.446,480.24 72.105,447.924 65.62,447.924 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.625,487.449 129.854,487.449 136.488,455.162 136.636,455.162
143.577,487.449 150.35,487.449 159.716,447.924 153.235,447.924 147.109,480.24 146.961,480.24 140.394,447.924 133.104,447.924
126.388,480.24 126.24,480.24 119.898,447.924 113.398,447.924 "/>
<rect x="163.21" y="479.646" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.321,467.701
c0-9.012,1.112-15.492,7.971-15.492c5.752,0,7.228,6.059,7.228,14.744c0,10.181-1.476,16.221-7.228,16.221
C186.659,483.174,185.321,475.36,185.321,467.701 M179.502,500.429h6.183v-17.466h0.158c1.404,3.384,4.721,5.521,8.254,5.521
c10.248,0,12.908-12.539,12.908-21.531c0-11.715-3.542-20.055-12.908-20.055c-4.28,0-7.736,2.962-8.551,5.905h-0.144v-4.88h-5.9
V500.429z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.032,463.56v-1.477
c0-2.339,0.738-10.314,7.229-10.314c5.455,0,6.864,5.225,6.864,9.653v2.138H219.032z M239.605,468.43v-2.502
c0-8.484-1.112-19.029-13.201-19.029c-12.16,0-14.087,11.427-14.087,21.32c0,13.564,4.055,20.266,13.723,20.266
c10.766,0,13.259-9.807,13.259-14.006h-6.174c0,2.943-0.824,9.146-6.721,9.146c-7.587,0-7.587-9.146-7.587-15.194H239.605z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.625,452.209
c6.634,0,7.957,7.813,7.957,15.492c0,8.091-1.323,14.446-8.034,14.446c-6.174,0-7.151-8.043-7.151-14.446
C251.396,458.268,252.873,452.209,258.625,452.209 M272.41,447.924h-5.886v5.033h-0.163c-0.806-3.106-4.267-6.059-8.552-6.059
c-10.018,0-12.894,10.104-12.894,20.803c0,5.234,0.729,19.748,12.232,19.748c3.911,0,7.593-1.994,8.935-5.302h0.153v5.167
c0,2.723,0.288,8.839-7.688,8.839c-3.24,0-6.049-1.399-6.327-5.004h-6.192c1.016,9.874,10.535,9.874,12.951,9.874
c7.967,0,13.431-4.275,13.431-16.076V447.924z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.913,487.449h6.184v-39.516
h-6.184V487.449z M280.913,441.895h6.184V434.8h-6.184V441.895z"/>
<rect x="296.97" y="479.646" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.641,487.449h6.203v-39.516
h-6.203V487.449z M313.641,441.895h6.203V434.8h-6.203V441.895z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.318,487.449h6.174v-27.273c0-5.752,4.516-7.967,7.832-7.967
c5.599,0,5.819,4.946,5.819,7.967v27.273h6.193v-28.021c0-4.63,0-12.529-10.401-12.529c-3.815,0-7.947,2.07-9.567,5.694h-0.163
v-4.669h-5.887V487.449z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.306,487.449h6.212v-34.646h6.768v-4.88h-6.768v-4.63
c0-2.732,1.313-3.758,3.979-3.758h2.866v-5.312h-4.496c-5.982,0-8.561,3.097-8.561,9.069v4.63h-5.742v4.88h5.742V487.449z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.634,467.701
c0,11.12,2.819,20.783,14.236,20.783c11.36,0,14.227-9.663,14.227-20.783c0-11.149-2.8-20.803-14.227-20.803
C382.53,446.898,379.634,456.552,379.634,467.701 M393.717,483.634c-6.337,0-7.573-7.401-7.573-15.933
c0-8.57,1.323-15.933,7.573-15.933c6.644,0,7.909,7.362,7.909,15.933C401.626,476.232,400.284,483.634,393.717,483.634"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="425.623px" height="519.375px" viewBox="0 0 425.623 519.375" enable-background="new 0 0 425.623 519.375"
xml:space="preserve">
<g>
<defs>
<rect id="SVGID_1_" y="-3.621" width="426.082" height="536.12"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect y="0.003" clip-path="url(#SVGID_2_)" fill="#A5C400" width="425.717" height="425.712"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M126.872,59.573h167.75c-18.741,96.225-48.536,196.696-50.243,305.68h-68.975
c4.261-83.44,22.571-166.038,42.578-246.929h-91.11V59.573z"/>
<path clip-path="url(#SVGID_2_)" d="M0.009,519.375h425.708V0.003H0.009 M417.204,417.192H8.522V8.511h408.681V417.192z"/>
<path clip-path="url(#SVGID_2_)" d="M381.254,17.033v3.159h-6.739v21.33h-3.949v-21.33h-6.729v-3.159H381.254z M408.691,41.522
h-3.959V22.234h-0.115l-6.787,19.288h-3.221l-6.452-19.288h-0.124v19.288h-3.95V17.033h6.279l6.106,18.219h0.115l5.943-18.219
h6.164V41.522z"/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.043,487.452 34.267,487.452 40.905,455.165 41.049,455.165
47.98,487.452 54.763,487.452 64.119,447.927 57.639,447.927 51.522,480.243 51.369,480.243 44.812,447.927 37.517,447.927
30.801,480.243 30.653,480.243 24.311,447.927 17.826,447.927 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.842,487.452 82.065,487.452 88.699,455.165 88.857,455.165
95.788,487.452 102.551,487.452 111.927,447.927 105.437,447.927 99.321,480.243 99.163,480.243 92.596,447.927 85.305,447.927
78.6,480.243 78.451,480.243 72.109,447.927 65.62,447.927 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.63,487.452 129.858,487.452 136.492,455.165 136.641,455.165
143.582,487.452 150.354,487.452 159.72,447.927 153.24,447.927 147.114,480.243 146.966,480.243 140.399,447.927 133.104,447.927
126.393,480.243 126.245,480.243 119.903,447.927 113.403,447.927 "/>
<rect x="163.21" y="479.648" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.778" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.326,467.704
c0-9.012,1.107-15.492,7.972-15.492c5.751,0,7.223,6.059,7.223,14.744c0,10.181-1.472,16.221-7.223,16.221
C186.659,483.177,185.326,475.363,185.326,467.704 M179.502,500.432h6.188v-17.466h0.153c1.404,3.384,4.726,5.521,8.259,5.521
c10.248,0,12.908-12.539,12.908-21.531c0-11.715-3.533-20.055-12.908-20.055c-4.281,0-7.736,2.962-8.551,5.905h-0.148v-4.88h-5.901
V500.432z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.042,463.563v-1.477
c0-2.339,0.729-10.314,7.219-10.314c5.455,0,6.864,5.225,6.864,9.653v2.138H219.042z M239.605,468.433v-2.502
c0-8.484-1.112-19.029-13.201-19.029c-12.155,0-14.083,11.427-14.083,21.32c0,13.564,4.055,20.266,13.718,20.266
c10.766,0,13.268-9.807,13.268-14.006h-6.183c0,2.943-0.825,9.146-6.721,9.146c-7.583,0-7.583-9.146-7.583-15.194H239.605z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.634,452.212
c6.634,0,7.956,7.813,7.956,15.492c0,8.091-1.322,14.446-8.033,14.446c-6.174,0-7.151-8.043-7.151-14.446
C251.406,458.271,252.882,452.212,258.634,452.212 M272.419,447.927h-5.896v5.033h-0.163c-0.806-3.106-4.267-6.059-8.552-6.059
c-10.018,0-12.884,10.104-12.884,20.803c0,5.234,0.729,19.748,12.232,19.748c3.911,0,7.593-1.994,8.925-5.302h0.153v5.167
c0,2.723,0.288,8.839-7.679,8.839c-3.24,0-6.059-1.399-6.337-5.004h-6.192c1.016,9.874,10.535,9.874,12.951,9.874
c7.976,0,13.44-4.275,13.44-16.076V447.927z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.922,487.452h6.184v-39.516
h-6.184V487.452z M280.922,441.897h6.184v-7.095h-6.184V441.897z"/>
<rect x="296.97" y="479.648" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.641,487.452h6.202v-39.516
h-6.202V487.452z M313.641,441.897h6.202v-7.095h-6.202V441.897z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.328,487.452h6.174v-27.273c0-5.752,4.506-7.967,7.822-7.967
c5.599,0,5.829,4.946,5.829,7.967v27.273h6.192v-28.021c0-4.63,0-12.529-10.411-12.529c-3.815,0-7.947,2.07-9.567,5.694h-0.153
v-4.669h-5.886V487.452z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.306,487.452h6.222v-34.646h6.758v-4.88h-6.758v-4.63
c0-2.732,1.304-3.758,3.969-3.758h2.866v-5.312h-4.496c-5.982,0-8.561,3.097-8.561,9.069v4.63h-5.743v4.88h5.743V487.452z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.634,467.704
c0,11.12,2.818,20.783,14.236,20.783c11.36,0,14.227-9.663,14.227-20.783c0-11.149-2.8-20.803-14.227-20.803
C382.53,446.901,379.634,456.555,379.634,467.704 M393.727,483.637c-6.347,0-7.583-7.401-7.583-15.933
c0-8.57,1.332-15.933,7.583-15.933c6.634,0,7.899,7.362,7.899,15.933C401.626,476.235,400.293,483.637,393.727,483.637"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="426.082px" height="519.378px" viewBox="0 0 426.082 519.378" enable-background="new 0 0 426.082 519.378"
xml:space="preserve">
<g>
<defs>
<rect id="SVGID_1_" y="-3.624" width="426.082" height="536.125"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect clip-path="url(#SVGID_2_)" fill="#F5A200" width="425.727" height="425.717"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M149.868,365.254H83.447V134.505H40.029V95.339
c29.8,0.422,49.386-11.931,60.027-40.877h49.812V365.254z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M280.125,189c12.77-11.926,22.145-20.439,43.427-20.439
c39.593,0,60.453,33.635,60.453,96.226c0,58.756-15.328,105.586-85.569,105.586c-49.391,0-74.507-25.126-83.446-72.81
c-3.83-20.86-4.262-46.414-4.262-81.314c0.432-42.583,0.853-68.127,4.692-88.987c8.939-47.679,34.047-72.801,83.438-72.801
c44.692,0,80.892,27.677,80.892,74.512v15.756h-62.16v-7.248c0-21.282-8.091-26.818-18.731-26.818
c-12.77,1.706-18.311,13.627-18.732,30.648V189z M299.28,229.868c-13.191,0-19.154,13.206-19.154,41.299
c0,28.524,5.963,41.294,19.154,41.294c14.054,0,20.017-12.77,20.017-41.294C319.296,243.073,313.333,229.868,299.28,229.868"/>
<path clip-path="url(#SVGID_2_)" d="M0,519.378h425.727V0H0 M417.195,417.194H8.513V8.508h408.682V417.194z"/>
<path clip-path="url(#SVGID_2_)" d="M381.245,17.031v3.159h-6.729v21.33h-3.95v-21.33h-6.739v-3.159H381.245z M408.691,41.52
h-3.959V22.231h-0.115L397.83,41.52h-3.221l-6.462-19.288h-0.115V41.52h-3.949V17.031h6.279l6.106,18.219h0.115l5.943-18.219h6.164
V41.52z"/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.034,487.455 34.258,487.455 40.896,455.167 41.045,455.167
47.976,487.455 54.759,487.455 64.11,447.929 57.635,447.929 51.519,480.245 51.36,480.245 44.803,447.929 37.508,447.929
30.797,480.245 30.648,480.245 24.307,447.929 17.817,447.929 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.833,487.455 82.057,487.455 88.695,455.167 88.854,455.167
95.785,487.455 102.548,487.455 111.919,447.929 105.434,447.929 99.317,480.245 99.159,480.245 92.592,447.929 85.297,447.929
78.591,480.245 78.447,480.245 72.106,447.929 65.616,447.929 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.627,487.455 129.851,487.455 136.489,455.167 136.633,455.167
143.574,487.455 150.347,487.455 159.713,447.929 153.232,447.929 147.106,480.245 146.963,480.245 140.396,447.929
133.101,447.929 126.385,480.245 126.236,480.245 119.895,447.929 113.4,447.929 "/>
<rect x="163.212" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.324,467.706
c0-9.012,1.107-15.492,7.966-15.492c5.757,0,7.228,6.06,7.228,14.744c0,10.182-1.471,16.221-7.228,16.221
C186.656,483.179,185.324,475.366,185.324,467.706 M179.5,500.435h6.184v-17.467h0.158c1.404,3.385,4.721,5.522,8.254,5.522
c10.248,0,12.913-12.539,12.913-21.532c0-11.715-3.547-20.055-12.913-20.055c-4.275,0-7.731,2.962-8.546,5.905H185.4v-4.88H179.5
V500.435z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.035,463.564v-1.476
c0-2.34,0.733-10.315,7.224-10.315c5.455,0,6.854,5.225,6.854,9.653v2.138H219.035z M239.593,468.435v-2.502
c0-8.484-1.103-19.029-13.191-19.029c-12.16,0-14.083,11.428-14.083,21.32c0,13.565,4.055,20.267,13.723,20.267
c10.752,0,13.264-9.808,13.264-14.006h-6.193c0,2.942-0.824,9.146-6.711,9.146c-7.583,0-7.583-9.146-7.583-15.195H239.593z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.632,452.214
c6.634,0,7.957,7.813,7.957,15.492c0,8.092-1.323,14.447-8.043,14.447c-6.174,0-7.143-8.043-7.143-14.447
C251.404,458.273,252.88,452.214,258.632,452.214 M272.408,447.929h-5.896v5.033h-0.153c-0.805-3.105-4.266-6.059-8.551-6.059
c-10.019,0-12.885,10.104-12.885,20.803c0,5.234,0.729,19.749,12.232,19.749c3.911,0,7.593-1.994,8.916-5.302h0.163v5.167
c0,2.723,0.277,8.839-7.688,8.839c-3.231,0-6.05-1.399-6.337-5.004h-6.193c1.026,9.874,10.546,9.874,12.961,9.874
c7.977,0,13.431-4.275,13.431-16.077V447.929z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.912,487.455h6.192v-39.517
h-6.192V487.455z M280.912,441.899h6.192v-7.095h-6.192V441.899z"/>
<rect x="296.979" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.777" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.64,487.455h6.212v-39.517h-6.212
V487.455z M313.64,441.899h6.212v-7.095h-6.212V441.899z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.317,487.455h6.174v-27.274c0-5.752,4.516-7.967,7.833-7.967
c5.598,0,5.828,4.947,5.828,7.967v27.274h6.193v-28.022c0-4.63,0-12.529-10.411-12.529c-3.815,0-7.957,2.07-9.567,5.694h-0.153
v-4.669h-5.896V487.455z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.305,487.455h6.212v-34.646h6.759v-4.88h-6.759v-4.63
c0-2.732,1.313-3.758,3.979-3.758h2.867v-5.312h-4.497c-5.981,0-8.561,3.097-8.561,9.069v4.63h-5.742v4.88h5.742V487.455z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.634,467.706
c0,11.121,2.818,20.784,14.236,20.784c11.36,0,14.217-9.663,14.217-20.784c0-11.149-2.79-20.803-14.217-20.803
C382.53,446.903,379.634,456.557,379.634,467.706 M393.727,483.64c-6.347,0-7.583-7.401-7.583-15.934
c0-8.57,1.322-15.933,7.583-15.933c6.634,0,7.899,7.362,7.899,15.933C401.626,476.238,400.284,483.64,393.727,483.64"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="426.082px" height="519.378px" viewBox="0 0 426.082 519.378" enable-background="new 0 0 426.082 519.378"
xml:space="preserve">
<g>
<defs>
<rect id="SVGID_1_" y="-3.624" width="426.082" height="536.125"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect clip-path="url(#SVGID_2_)" fill="#A5C400" width="425.717" height="425.717"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M183.924,178.78h14.471c22.993,0,27.25-11.916,27.25-32.776
c0-25.975-5.101-34.488-17.889-34.488c-10.642,0-16.6,8.935-16.6,29.795v11.926h-62.581c0-63.435,20.007-98.775,83.873-98.775
c48.954,0,79.612,28.098,79.612,86.006c0,38.313-11.926,54.49-30.658,61.728c22.145,12.348,34.914,25.539,34.914,71.099
c0,60.448-22.566,97.078-87.271,97.078c-75.365,0-85.153-48.968-84.731-113.687h65.567v28.108c0,17.025,6.812,24.264,16.599,24.264
c12.774,0,20.86-8.944,20.86-37.47c0-31.492-6.797-42.564-30.648-42.564h-12.77V178.78z"/>
<path clip-path="url(#SVGID_2_)" d="M0,519.378h425.717V0H0 M417.205,417.194H8.522V8.508h408.682V417.194z"/>
<path clip-path="url(#SVGID_2_)" d="M381.254,17.031v3.159h-6.729v21.33h-3.96v-21.33h-6.739v-3.159H381.254z M408.691,41.52
h-3.949V22.231h-0.125l-6.777,19.288h-3.24l-6.442-19.288h-0.115V41.52h-3.959V17.031h6.279l6.106,18.219h0.125l5.934-18.219h6.164
V41.52z"/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.039,487.455 34.263,487.455 40.901,455.167 41.045,455.167
47.976,487.455 54.759,487.455 64.115,447.929 57.64,447.929 51.523,480.245 51.365,480.245 44.808,447.929 37.512,447.929
30.797,480.245 30.653,480.245 24.312,447.929 17.822,447.929 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.838,487.455 82.062,487.455 88.7,455.167 88.854,455.167
95.785,487.455 102.548,487.455 111.924,447.929 105.434,447.929 99.322,480.245 99.164,480.245 92.597,447.929 85.302,447.929
78.596,480.245 78.447,480.245 72.105,447.929 65.621,447.929 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.627,487.455 129.855,487.455 136.489,455.167 136.638,455.167
143.579,487.455 150.352,487.455 159.718,447.929 153.237,447.929 147.111,480.245 146.963,480.245 140.396,447.929
133.105,447.929 126.39,480.245 126.241,480.245 119.9,447.929 113.4,447.929 "/>
<rect x="163.212" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.323,467.706
c0-9.012,1.107-15.492,7.972-15.492c5.752,0,7.223,6.06,7.223,14.744c0,10.182-1.471,16.221-7.223,16.221
C186.661,483.179,185.323,475.366,185.323,467.706 M179.504,500.435h6.184v-17.467h0.158c1.4,3.385,4.722,5.522,8.254,5.522
c10.248,0,12.908-12.539,12.908-21.532c0-11.715-3.533-20.055-12.908-20.055c-4.28,0-7.736,2.962-8.551,5.905H185.4v-4.88h-5.896
V500.435z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.035,463.564v-1.476
c0-2.34,0.738-10.315,7.224-10.315c5.464,0,6.864,5.225,6.864,9.653v2.138H219.035z M239.603,468.435v-2.502
c0-8.484-1.112-19.029-13.191-19.029c-12.165,0-14.092,11.428-14.092,21.32c0,13.565,4.055,20.267,13.728,20.267
c10.756,0,13.258-9.808,13.258-14.006h-6.183c0,2.942-0.825,9.146-6.711,9.146c-7.593,0-7.593-9.146-7.593-15.195H239.603z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.623,452.214
c6.644,0,7.967,7.813,7.967,15.492c0,8.092-1.323,14.447-8.044,14.447c-6.173,0-7.142-8.043-7.142-14.447
C251.404,458.273,252.871,452.214,258.623,452.214 M272.408,447.929h-5.886v5.033h-0.153c-0.806-3.105-4.275-6.059-8.552-6.059
c-10.027,0-12.894,10.104-12.894,20.803c0,5.234,0.729,19.749,12.232,19.749c3.901,0,7.583-1.994,8.925-5.302h0.154v5.167
c0,2.723,0.287,8.839-7.689,8.839c-3.24,0-6.039-1.399-6.326-5.004h-6.193c1.016,9.874,10.545,9.874,12.961,9.874
c7.967,0,13.421-4.275,13.421-16.077V447.929z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.921,487.455h6.174v-39.517
h-6.174V487.455z M280.921,441.899h6.174v-7.095h-6.174V441.899z"/>
<rect x="296.969" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.65,487.455h6.192v-39.517h-6.192
V487.455z M313.65,441.899h6.192v-7.095h-6.192V441.899z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.317,487.455h6.174v-27.274c0-5.752,4.525-7.967,7.842-7.967
c5.589,0,5.819,4.947,5.819,7.967v27.274h6.193v-28.022c0-4.63,0-12.529-10.401-12.529c-3.825,0-7.957,2.07-9.577,5.694h-0.163
v-4.669h-5.887V487.455z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.305,487.455h6.212v-34.646h6.769v-4.88h-6.769v-4.63
c0-2.732,1.323-3.758,3.979-3.758h2.866v-5.312h-4.496c-5.972,0-8.561,3.097-8.561,9.069v4.63h-5.742v4.88h5.742V487.455z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.644,467.706
c0,11.121,2.818,20.784,14.227,20.784c11.36,0,14.227-9.663,14.227-20.784c0-11.149-2.8-20.803-14.227-20.803
C382.539,446.903,379.644,456.557,379.644,467.706 M393.727,483.64c-6.337,0-7.584-7.401-7.584-15.934
c0-8.57,1.323-15.933,7.584-15.933c6.634,0,7.898,7.362,7.898,15.933C401.625,476.238,400.293,483.64,393.727,483.64"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="426.086px" height="519.378px" viewBox="0 0 426.086 519.378" enable-background="new 0 0 426.086 519.378"
xml:space="preserve">
<g>
<defs>
<rect id="SVGID_1_" y="-3.624" width="426.086" height="536.125"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect clip-path="url(#SVGID_2_)" fill="#F5A200" width="425.722" height="425.717"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M149.873,365.254H83.461V134.505H40.034V95.339
c29.805,0.422,49.386-11.931,60.027-40.877h49.812V365.254z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M376.351,302.241v63.022H213.719V299.26
c74.071-100.894,97.922-117.924,97.922-156.664c0-15.755-5.973-25.117-17.457-25.117c-15.751,0-19.164,12.338-19.164,26.396v18.296
h-62.159v-20.429c0-48.11,23.41-87.276,81.323-87.276c55.343,0,85.569,34.905,85.569,90.685c0,66.411-56.196,109.838-94.514,157.09
H376.351z"/>
<path clip-path="url(#SVGID_2_)" d="M0.01,519.378h425.712V0H0.01 M417.209,417.194H8.518V8.508h408.691V417.194z"/>
<path clip-path="url(#SVGID_2_)" d="M381.26,17.031v3.159h-6.73v21.33h-3.969v-21.33h-6.729v-3.159H381.26z M408.696,41.52h-3.959
V22.231h-0.115l-6.778,19.288h-3.24l-6.441-19.288h-0.115V41.52h-3.969V17.031h6.288l6.107,18.219h0.114l5.935-18.219h6.174V41.52z
"/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.039,487.455 34.268,487.455 40.901,455.167 41.05,455.167
47.981,487.455 54.764,487.455 64.12,447.929 57.64,447.929 51.523,480.245 51.365,480.245 44.808,447.929 37.518,447.929
30.802,480.245 30.653,480.245 24.312,447.929 17.822,447.929 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.838,487.455 82.062,487.455 88.7,455.167 88.858,455.167
95.79,487.455 102.553,487.455 111.929,447.929 105.438,447.929 99.322,480.245 99.164,480.245 92.597,447.929 85.302,447.929
78.601,480.245 78.452,480.245 72.111,447.929 65.621,447.929 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.632,487.455 129.855,487.455 136.494,455.167 136.643,455.167
143.579,487.455 150.356,487.455 159.718,447.929 153.242,447.929 147.116,480.245 146.968,480.245 140.401,447.929
133.105,447.929 126.39,480.245 126.246,480.245 119.905,447.929 113.405,447.929 "/>
<rect x="163.212" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.328,467.706
c0-9.012,1.107-15.492,7.972-15.492c5.752,0,7.223,6.06,7.223,14.744c0,10.182-1.471,16.221-7.223,16.221
C186.661,483.179,185.328,475.366,185.328,467.706 M179.504,500.435h6.184v-17.467h0.158c1.404,3.385,4.721,5.522,8.259,5.522
c10.248,0,12.908-12.539,12.908-21.532c0-11.715-3.538-20.055-12.908-20.055c-4.28,0-7.736,2.962-8.551,5.905h-0.148v-4.88h-5.901
V500.435z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.04,463.564v-1.476
c0-2.34,0.733-10.315,7.223-10.315c5.465,0,6.864,5.225,6.864,9.653v2.138H219.04z M239.607,468.435v-2.502
c0-8.484-1.111-19.029-13.195-19.029c-12.166,0-14.088,11.428-14.088,21.32c0,13.565,4.055,20.267,13.724,20.267
c10.761,0,13.263-9.808,13.263-14.006h-6.184c0,2.942-0.824,9.146-6.715,9.146c-7.588,0-7.588-9.146-7.588-15.195H239.607z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.628,452.214
c6.644,0,7.966,7.813,7.966,15.492c0,8.092-1.322,14.447-8.043,14.447c-6.174,0-7.142-8.043-7.142-14.447
C251.409,458.273,252.876,452.214,258.628,452.214 M272.413,447.929h-5.886v5.033h-0.154c-0.805-3.105-4.275-6.059-8.551-6.059
c-10.027,0-12.894,10.104-12.894,20.803c0,5.234,0.729,19.749,12.232,19.749c3.901,0,7.583-1.994,8.925-5.302h0.153v5.167
c0,2.723,0.288,8.839-7.688,8.839c-3.24,0-6.039-1.399-6.327-5.004h-6.193c1.017,9.874,10.546,9.874,12.962,9.874
c7.966,0,13.421-4.275,13.421-16.077V447.929z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.926,487.455h6.184v-39.517
h-6.184V487.455z M280.926,441.899h6.184v-7.095h-6.184V441.899z"/>
<rect x="296.974" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.654,487.455h6.203v-39.517
h-6.203V487.455z M313.654,441.899h6.203v-7.095h-6.203V441.899z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.322,487.455h6.174v-27.274c0-5.752,4.515-7.967,7.842-7.967
c5.589,0,5.81,4.947,5.81,7.967v27.274h6.192v-28.022c0-4.63,0-12.529-10.392-12.529c-3.825,0-7.957,2.07-9.577,5.694h-0.163
v-4.669h-5.886V487.455z"/>
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.311,487.455h6.212v-34.646h6.768v-4.88h-6.768v-4.63
c0-2.732,1.323-3.758,3.979-3.758h2.866v-5.312h-4.496c-5.973,0-8.561,3.097-8.561,9.069v4.63h-5.743v4.88h5.743V487.455z"/>
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.64,467.706
c0,11.121,2.818,20.784,14.235,20.784c11.36,0,14.227-9.663,14.227-20.784c0-11.149-2.799-20.803-14.227-20.803
C382.534,446.903,379.64,456.557,379.64,467.706 M393.722,483.64c-6.337,0-7.573-7.401-7.573-15.934
c0-8.57,1.323-15.933,7.573-15.933c6.644,0,7.909,7.362,7.909,15.933C401.631,476.238,400.298,483.64,393.722,483.64"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="1875"
height="1875"
id="svg2">
<defs
id="defs4" />
<g
transform="matrix(15.293834,0,0,15.293834,18363.696,2924.4945)"
id="layer1">
<g
transform="translate(-27.695315,1.6811913)"
id="g4398">
<rect
width="120.41093"
height="120.41093"
rx="10.629922"
ry="10.629921"
x="-1171.9364"
y="-191.80794"
id="rect3315"
style="fill:#e30613;fill-opacity:0.701961;stroke:#e30613;stroke-width:2.1875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="77.257874"
height="77.257874"
rx="6.8203545"
ry="6.820354"
x="-917.79828"
y="654.4267"
transform="rotate(45)"
id="rect3317"
style="fill:#e30613;fill-opacity:1;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m -1125.6244,-168.82932 h 1.9696 v 5.28322 c 0,0.8384 0.024,1.38181 0.073,1.63022 0.084,0.39924 0.285,0.71973 0.6022,0.96149 0.3171,0.24176 0.7508,0.36264 1.3008,0.36264 0.5589,0 0.9804,-0.11422 1.2643,-0.34268 0.2839,-0.22845 0.4546,-0.50902 0.5123,-0.84172 0.058,-0.33269 0.087,-0.88497 0.087,-1.65683 v -5.39634 h 1.9696 v 5.12353 c 0,1.17109 -0.053,1.9984 -0.1597,2.48192 -0.1065,0.48352 -0.3028,0.89162 -0.5889,1.22432 -0.2861,0.3327 -0.6687,0.59775 -1.1478,0.79514 -0.4791,0.1974 -1.1045,0.2961 -1.8764,0.2961 -0.9316,0 -1.638,-0.10757 -2.1193,-0.32271 -0.4813,-0.21514 -0.8617,-0.49461 -1.1411,-0.8384 -0.2795,-0.34378 -0.4636,-0.7042 -0.5523,-1.08126 -0.1286,-0.55893 -0.193,-1.38402 -0.193,-2.47526 z m 9.3621,6.58074 1.9164,-0.18631 c 0.1153,0.64322 0.3493,1.11565 0.7019,1.41729 0.3527,0.30164 0.8285,0.45247 1.4273,0.45247 0.6343,0 1.1123,-0.13419 1.4339,-0.40257 0.3216,-0.26837 0.4824,-0.58221 0.4824,-0.94153 0,-0.23067 -0.068,-0.42696 -0.2029,-0.58887 -0.1353,-0.16191 -0.3715,-0.30275 -0.7086,-0.42253 -0.2307,-0.0798 -0.7564,-0.22179 -1.577,-0.42585 -1.0558,-0.26172 -1.7966,-0.58332 -2.2224,-0.96482 -0.5989,-0.53674 -0.8983,-1.19105 -0.8983,-1.96291 0,-0.49682 0.1408,-0.96149 0.4225,-1.394 0.2817,-0.4325 0.6876,-0.76187 1.2177,-0.98811 0.5301,-0.22622 1.17,-0.33934 1.9196,-0.33935 1.2244,1e-5 2.1459,0.26839 2.7647,0.80513 0.6189,0.53676 0.9438,1.25316 0.9748,2.14922 l -1.9695,0.0865 c -0.084,-0.50126 -0.2651,-0.86168 -0.5423,-1.08127 -0.2773,-0.21957 -0.6931,-0.32936 -1.2476,-0.32937 -0.5723,1e-5 -1.0203,0.11757 -1.3441,0.35266 -0.2085,0.15083 -0.3128,0.35267 -0.3128,0.60551 0,0.23068 0.098,0.42808 0.2928,0.5922 0.2484,0.2085 0.8517,0.42586 1.8099,0.65209 0.9581,0.22624 1.6668,0.46023 2.1259,0.70199 0.4591,0.24176 0.8184,0.57224 1.078,0.99143 0.2594,0.4192 0.3892,0.9371 0.3892,1.5537 0,0.55893 -0.1553,1.08237 -0.4658,1.57033 -0.3105,0.48795 -0.7497,0.85059 -1.3174,1.08791 -0.5679,0.23733 -1.2754,0.35599 -2.1227,0.35599 -1.2331,0 -2.1802,-0.28501 -2.8412,-0.85503 -0.6609,-0.57002 -1.0557,-1.40065 -1.1844,-2.4919 z m 9.6283,3.17393 v -9.75467 h 1.9695 v 4.33171 l 3.9791,-4.33171 h 2.6482 l -3.6729,3.7994 3.8726,5.95527 h -2.5485 l -2.6815,-4.57791 -1.597,1.63021 v 2.9477 z"
id="text3321"
style="font-style:normal;font-weight:normal;font-size:14.8661px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="m -1115.5632,-153.11667 -1.1696,-0.21099 c 0.1315,-0.47091 0.3578,-0.8195 0.6789,-1.04579 0.321,-0.22627 0.798,-0.33941 1.431,-0.33942 0.5749,1e-5 1.003,0.068 1.2843,0.20411 0.2813,0.13608 0.4793,0.30885 0.594,0.51831 0.1147,0.20947 0.172,0.59399 0.172,1.15357 l -0.014,1.50446 c 0,0.4281 0.021,0.74382 0.062,0.94717 0.041,0.20335 0.1185,0.42122 0.2316,0.65361 h -1.2751 c -0.034,-0.0856 -0.075,-0.21252 -0.1239,-0.3807 -0.021,-0.0764 -0.037,-0.1269 -0.046,-0.15136 -0.2202,0.21405 -0.4557,0.37459 -0.7064,0.48161 -0.2507,0.10702 -0.5183,0.16054 -0.8027,0.16054 -0.5015,0 -0.8967,-0.13608 -1.1857,-0.40823 -0.2889,-0.27214 -0.4334,-0.61615 -0.4334,-1.03202 0,-0.2752 0.066,-0.5206 0.1972,-0.73618 0.1315,-0.21557 0.3157,-0.38069 0.5527,-0.49537 0.237,-0.11466 0.5787,-0.21481 1.0252,-0.30043 0.6024,-0.11314 1.0198,-0.21863 1.2522,-0.31649 v -0.12843 c 0,-0.24768 -0.061,-0.42427 -0.1835,-0.52977 -0.1223,-0.10549 -0.3532,-0.15824 -0.6926,-0.15824 -0.2294,0 -0.4082,0.0451 -0.5367,0.13531 -0.1284,0.0902 -0.2324,0.24845 -0.3119,0.47473 z m 1.7247,1.04578 c -0.1652,0.055 -0.4266,0.12079 -0.7844,0.19723 -0.3577,0.0764 -0.5917,0.15137 -0.7018,0.22475 -0.1681,0.11926 -0.2522,0.27063 -0.2522,0.45409 0,0.18042 0.067,0.33637 0.2018,0.46786 0.1345,0.13148 0.3058,0.19723 0.5137,0.19723 0.2324,0 0.4541,-0.0764 0.6651,-0.22934 0.1559,-0.1162 0.2584,-0.25839 0.3073,-0.42657 0.034,-0.11008 0.05,-0.31954 0.05,-0.62839 z m 2.486,2.33925 v -6.7242 h 1.2889 v 2.42182 c 0.3975,-0.45256 0.8684,-0.67884 1.4127,-0.67885 0.5932,1e-5 1.084,0.21482 1.4724,0.64444 0.3883,0.42964 0.5825,1.04656 0.5825,1.85077 0,0.83173 -0.198,1.47235 -0.594,1.92185 -0.396,0.44951 -0.8769,0.67426 -1.4426,0.67426 -0.2782,0 -0.5527,-0.0696 -0.8233,-0.2087 -0.2706,-0.13913 -0.5038,-0.34477 -0.6995,-0.61692 v 0.71553 z m 1.2797,-2.54107 c 0,0.50455 0.079,0.87761 0.2385,1.11918 0.2232,0.34248 0.5198,0.51371 0.8898,0.51371 0.2844,0 0.5268,-0.12154 0.727,-0.36464 0.2003,-0.2431 0.3005,-0.6261 0.3005,-1.14899 0,-0.55652 -0.1009,-0.95787 -0.3027,-1.20403 -0.2019,-0.24615 -0.4603,-0.36923 -0.7752,-0.36923 -0.3089,0 -0.5657,0.12002 -0.7706,0.36006 -0.2049,0.24004 -0.3073,0.60469 -0.3073,1.09394 z"
id="text3325"
style="font-style:normal;font-weight:normal;font-size:15.1574px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="m -1120.5986,-107.43128 h -6.762 v -25.48391 c -2.4706,2.31018 -5.3823,4.01873 -8.7353,5.12566 v -6.13635 c 1.7647,-0.57752 3.6818,-1.67243 5.7514,-3.28476 2.0695,-1.61226 3.4892,-3.49327 4.2593,-5.64303 h 5.4866 z m 15.9305,-19.03473 c -1.7487,-0.73794 -3.0201,-1.75264 -3.8142,-3.04411 -0.7941,-1.29141 -1.1912,-2.70719 -1.1912,-4.24732 0,-2.63098 0.9185,-4.80477 2.7554,-6.52137 1.8369,-1.71654 4.4478,-2.57483 7.8329,-2.57486 3.3529,3e-5 5.9558,0.85832 7.8088,2.57486 1.8529,1.7166 2.7794,3.89039 2.7794,6.52137 0,1.63639 -0.4252,3.09227 -1.2754,4.36764 -0.8503,1.27542 -2.0455,2.25002 -3.5856,2.92379 1.9572,0.78612 3.4452,1.93317 4.4639,3.44117 1.0187,1.50804 1.5281,3.24867 1.5281,5.22192 0,3.25669 -1.0388,5.90374 -3.1163,7.94116 -2.0776,2.03743 -4.8409,3.05614 -8.2901,3.05615 -3.2086,-1e-5 -5.8797,-0.84225 -8.0134,-2.52674 -2.5187,-1.98929 -3.778,-4.71656 -3.778,-8.1818 0,-1.90908 0.4732,-3.66174 1.4198,-5.25801 0.9465,-1.59624 2.4385,-2.82752 4.4759,-3.69385 z m 1.3957,-6.81014 c 0,1.34761 0.381,2.39841 1.1431,3.1524 0.762,0.75403 1.7767,1.13103 3.0441,1.13101 1.2834,2e-5 2.3101,-0.38099 3.0802,-1.14304 0.77,-0.76201 1.155,-1.81682 1.1551,-3.16444 -10e-5,-1.26735 -0.3811,-2.28205 -1.1431,-3.04411 -0.762,-0.762 -1.7687,-1.14301 -3.02,-1.14304 -1.2995,3e-5 -2.3343,0.38505 -3.1043,1.15507 -0.7701,0.77008 -1.1551,1.7888 -1.1551,3.05615 z m -0.6257,15.11227 c 0,1.86097 0.4773,3.31283 1.4319,4.3556 0.9545,1.04279 2.1457,1.56418 3.5735,1.56417 1.3957,1e-5 2.5508,-0.50133 3.4652,-1.504 0.9144,-1.00267 1.3716,-2.45053 1.3717,-4.34358 -10e-5,-1.65239 -0.4653,-2.97993 -1.3958,-3.98261 -0.9304,-1.00266 -2.1096,-1.50399 -3.5374,-1.50401 -1.6524,2e-5 -2.8837,0.56953 -3.6938,1.70855 -0.8102,1.13905 -1.2153,2.37434 -1.2153,3.70588 z"
id="text3329"
style="font-style:normal;font-weight:normal;font-size:14.785px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,619 @@
using System;
using System.Data;
using System.Security.Policy;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using gaseous_tools;
using MySqlX.XDevAPI;
using Org.BouncyCastle.Utilities.IO.Pem;
using static gaseous_server.Classes.Metadata.Games;
namespace gaseous_server.Classes
{
public class ImportGames
{
public ImportGames(string ImportPath)
{
if (Directory.Exists(ImportPath))
{
string[] importContents_Files = Directory.GetFiles(ImportPath);
string[] importContents_Directories = Directory.GetDirectories(ImportPath);
// import files first
foreach (string importContent in importContents_Files) {
ImportGame.ImportGameFile(importContent);
}
}
else
{
Logging.Log(Logging.LogType.Critical, "Import Games", "The import directory " + ImportPath + " does not exist.");
throw new DirectoryNotFoundException("Invalid path: " + ImportPath);
}
}
}
public class ImportGame
{
public static void ImportGameFile(string GameFileImportPath, bool IsDirectory = false, bool ForceImport = false)
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
string[] SkippableFiles = {
".DS_STORE",
"desktop.ini"
};
if (SkippableFiles.Contains<string>(Path.GetFileName(GameFileImportPath), StringComparer.OrdinalIgnoreCase))
{
Logging.Log(Logging.LogType.Debug, "Import Game", "Skipping item " + GameFileImportPath);
}
else
{
//Logging.Log(Logging.LogType.Information, "Import Game", "Processing item " + GameFileImportPath);
if (IsDirectory == false)
{
FileInfo fi = new FileInfo(GameFileImportPath);
Common.hashObject hash = new Common.hashObject(GameFileImportPath);
// check to make sure we don't already have this file imported
sql = "SELECT COUNT(Id) AS count FROM Games_Roms WHERE MD5=@md5 AND SHA1=@sha1";
dbDict.Add("md5", hash.md5hash);
dbDict.Add("sha1", hash.sha1hash);
DataTable importDB = db.ExecuteCMD(sql, dbDict);
if ((Int64)importDB.Rows[0]["count"] > 0)
{
if (!GameFileImportPath.StartsWith(Config.LibraryConfiguration.LibraryImportDirectory))
{
Logging.Log(Logging.LogType.Warning, "Import Game", " " + GameFileImportPath + " already in database - skipping");
}
}
else
{
Logging.Log(Logging.LogType.Information, "Import Game", " " + GameFileImportPath + " not in database - processing");
// process as a single file
Models.Signatures_Games discoveredSignature = GetFileSignature(hash, fi, GameFileImportPath);
// get discovered platform
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(discoveredSignature.Flags.IGDBPlatformId);
if (determinedPlatform == null)
{
determinedPlatform = new IGDB.Models.Platform();
}
IGDB.Models.Game determinedGame = SearchForGame(discoveredSignature.Game.Name, discoveredSignature.Flags.IGDBPlatformId);
// add to database
StoreROM(hash, determinedGame, determinedPlatform, discoveredSignature, GameFileImportPath);
}
}
}
}
public static Models.Signatures_Games GetFileSignature(Common.hashObject hash, FileInfo fi, string GameFileImportPath)
{
// check 1: do we have a signature for it?
gaseous_server.Controllers.SignaturesController sc = new Controllers.SignaturesController();
List<Models.Signatures_Games> signatures = sc.GetSignature(hash.md5hash);
if (signatures.Count == 0)
{
// no md5 signature found - try sha1
signatures = sc.GetSignature("", hash.sha1hash);
}
Models.Signatures_Games discoveredSignature = new Models.Signatures_Games();
if (signatures.Count == 1)
{
// only 1 signature found!
discoveredSignature = signatures.ElementAt(0);
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
}
else if (signatures.Count > 1)
{
// more than one signature found - find one with highest score
foreach (Models.Signatures_Games Sig in signatures)
{
if (Sig.Score > discoveredSignature.Score)
{
discoveredSignature = Sig;
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
}
}
}
else
{
// no signature match found - try name search
signatures = sc.GetByTosecName(fi.Name);
if (signatures.Count == 1)
{
// only 1 signature found!
discoveredSignature = signatures.ElementAt(0);
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
}
else if (signatures.Count > 1)
{
// more than one signature found - find one with highest score
foreach (Models.Signatures_Games Sig in signatures)
{
if (Sig.Score > discoveredSignature.Score)
{
discoveredSignature = Sig;
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
}
}
}
else
{
// still no search - try alternate method
Models.Signatures_Games.GameItem gi = new Models.Signatures_Games.GameItem();
Models.Signatures_Games.RomItem ri = new Models.Signatures_Games.RomItem();
discoveredSignature.Game = gi;
discoveredSignature.Rom = ri;
// game title is the file name without the extension or path
gi.Name = Path.GetFileNameWithoutExtension(GameFileImportPath);
// remove everything after brackets - leaving (hopefully) only the name
if (gi.Name.Contains("("))
{
gi.Name = gi.Name.Substring(0, gi.Name.IndexOf("("));
}
// remove special characters like dashes
gi.Name = gi.Name.Replace("-", "");
// guess platform
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, true);
// get rom data
ri.Name = Path.GetFileName(GameFileImportPath);
ri.Md5 = hash.md5hash;
ri.Sha1 = hash.sha1hash;
ri.Size = fi.Length;
ri.SignatureSource = Models.Signatures_Games.RomItem.SignatureSourceType.None;
}
}
Logging.Log(Logging.LogType.Information, "Import Game", " Determined import file as: " + discoveredSignature.Game.Name + " (" + discoveredSignature.Game.Year + ") " + discoveredSignature.Game.System);
return discoveredSignature;
}
public static IGDB.Models.Game SearchForGame(string GameName, long PlatformId)
{
// search discovered game - case insensitive exact match first
IGDB.Models.Game determinedGame = new IGDB.Models.Game();
List<string> SearchCandidates = GetSearchCandidates(GameName);
foreach (string SearchCandidate in SearchCandidates)
{
bool GameFound = false;
Logging.Log(Logging.LogType.Information, "Import Game", " Searching for title: " + SearchCandidate);
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
{
Logging.Log(Logging.LogType.Information, "Import Game", " Search type: " + searchType.ToString());
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
if (games.Length == 1)
{
// exact match!
determinedGame = Metadata.Games.GetGame((long)games[0].Id, false, false);
Logging.Log(Logging.LogType.Information, "Import Game", " IGDB game: " + determinedGame.Name);
GameFound = true;
break;
}
else if (games.Length > 0)
{
Logging.Log(Logging.LogType.Information, "Import Game", " " + games.Length + " search results found");
}
else
{
Logging.Log(Logging.LogType.Information, "Import Game", " No search results found");
}
}
if (GameFound == true) { break; }
}
if (determinedGame == null)
{
determinedGame = new IGDB.Models.Game();
}
string destSlug = "";
if (determinedGame.Id == null)
{
Logging.Log(Logging.LogType.Information, "Import Game", " Unable to determine game");
}
return determinedGame;
}
public static List<IGDB.Models.Game> SearchForGame_GetAll(string GameName, long PlatformId)
{
List<IGDB.Models.Game> searchResults = new List<IGDB.Models.Game>();
List<string> SearchCandidates = GetSearchCandidates(GameName);
foreach (string SearchCandidate in SearchCandidates)
{
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
{
if ((PlatformId == 0 && searchType == SearchType.searchNoPlatform) || (PlatformId != 0 && searchType != SearchType.searchNoPlatform))
{
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
foreach (IGDB.Models.Game foundGame in games)
{
bool gameInResults = false;
foreach (IGDB.Models.Game searchResult in searchResults)
{
if (searchResult.Id == foundGame.Id)
{
gameInResults = true;
}
}
if (gameInResults == false)
{
searchResults.Add(foundGame);
}
}
}
}
}
return searchResults;
}
private static List<string> GetSearchCandidates(string GameName)
{
// remove version numbers from name
GameName = Regex.Replace(GameName, @"v(\d+\.)?(\d+\.)?(\*|\d+)$", "").Trim();
GameName = Regex.Replace(GameName, @"Rev (\d+\.)?(\d+\.)?(\*|\d+)$", "").Trim();
List<string> SearchCandidates = new List<string>();
SearchCandidates.Add(GameName);
if (GameName.Contains(" - "))
{
SearchCandidates.Add(GameName.Replace(" - ", ": "));
SearchCandidates.Add(GameName.Substring(0, GameName.IndexOf(" - ")).Trim());
}
if (GameName.Contains(": "))
{
SearchCandidates.Add(GameName.Substring(0, GameName.IndexOf(": ")).Trim());
}
Logging.Log(Logging.LogType.Information, "Import Game", " Search candidates: " + String.Join(", ", SearchCandidates));
return SearchCandidates;
}
public static long StoreROM(Common.hashObject hash, IGDB.Models.Game determinedGame, IGDB.Models.Platform determinedPlatform, Models.Signatures_Games discoveredSignature, string GameFileImportPath, long UpdateId = 0)
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
if (UpdateId == 0)
{
sql = "INSERT INTO Games_Roms (PlatformId, GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Flags, RomType, RomTypeMedia, MediaLabel, Path, MetadataSource) VALUES (@platformid, @gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel, @path, @metadatasource); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
} else
{
sql = "UPDATE Games_Roms SET PlatformId=platformid, GameId=@gameid, Name=@name, Size=@size, DevelopmentStatus=@developmentstatus, Flags=@flags, RomType=@romtype, RomTypeMedia=@romtypemedia, MediaLabel=@medialabel, MetadataSource=@metadatasource WHERE Id=@id;";
dbDict.Add("id", UpdateId);
}
dbDict.Add("platformid", Common.ReturnValueIfNull(determinedPlatform.Id, 0));
dbDict.Add("gameid", Common.ReturnValueIfNull(determinedGame.Id, 0));
dbDict.Add("name", Common.ReturnValueIfNull(discoveredSignature.Rom.Name, ""));
dbDict.Add("size", Common.ReturnValueIfNull(discoveredSignature.Rom.Size, 0));
dbDict.Add("md5", hash.md5hash);
dbDict.Add("sha1", hash.sha1hash);
dbDict.Add("crc", Common.ReturnValueIfNull(discoveredSignature.Rom.Crc, ""));
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(discoveredSignature.Rom.DevelopmentStatus, ""));
dbDict.Add("metadatasource", discoveredSignature.Rom.SignatureSource);
if (discoveredSignature.Rom.flags != null)
{
if (discoveredSignature.Rom.flags.Count > 0)
{
dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(discoveredSignature.Rom.flags));
}
else
{
dbDict.Add("flags", "[ ]");
}
}
else
{
dbDict.Add("flags", "[ ]");
}
dbDict.Add("romtype", (int)discoveredSignature.Rom.RomType);
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(discoveredSignature.Rom.RomTypeMedia, ""));
dbDict.Add("medialabel", Common.ReturnValueIfNull(discoveredSignature.Rom.MediaLabel, ""));
dbDict.Add("path", GameFileImportPath);
DataTable romInsert = db.ExecuteCMD(sql, dbDict);
long romId = 0;
if (UpdateId == 0)
{
romId = (long)romInsert.Rows[0][0];
} else
{
romId = UpdateId;
}
// move to destination
MoveGameFile(romId);
return romId;
}
public static string ComputeROMPath(long RomId)
{
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
// get metadata
IGDB.Models.Platform platform = gaseous_server.Classes.Metadata.Platforms.GetPlatform(rom.PlatformId);
IGDB.Models.Game game = gaseous_server.Classes.Metadata.Games.GetGame(rom.GameId, false, false);
// build path
string platformSlug = "Unknown Platform";
if (platform != null)
{
platformSlug = platform.Slug;
}
string gameSlug = "Unknown Title";
if (game != null)
{
gameSlug = game.Slug;
}
string DestinationPath = Path.Combine(Config.LibraryConfiguration.LibraryDataDirectory, gameSlug, platformSlug);
if (!Directory.Exists(DestinationPath))
{
Directory.CreateDirectory(DestinationPath);
}
string DestinationPathName = Path.Combine(DestinationPath, rom.Name);
return DestinationPathName;
}
public static bool MoveGameFile(long RomId)
{
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
string romPath = rom.Path;
if (File.Exists(romPath))
{
string DestinationPath = ComputeROMPath(RomId);
if (romPath == DestinationPath)
{
Logging.Log(Logging.LogType.Debug, "Move Game ROM", "Destination path is the same as the current path - aborting");
return true;
}
else
{
Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath);
if (File.Exists(DestinationPath))
{
Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting");
return false;
}
else
{
File.Move(romPath, DestinationPath);
// update the db
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("id", RomId);
dbDict.Add("path", DestinationPath);
db.ExecuteCMD(sql, dbDict);
return true;
}
}
}
else
{
Logging.Log(Logging.LogType.Warning, "Move Game ROM", "File " + romPath + " appears to be missing!");
return false;
}
}
public static void OrganiseLibrary()
{
Logging.Log(Logging.LogType.Information, "Organise Library", "Starting library organisation");
// move rom files to their new location
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT * FROM Games_Roms";
DataTable romDT = db.ExecuteCMD(sql);
if (romDT.Rows.Count > 0)
{
foreach (DataRow dr in romDT.Rows)
{
Logging.Log(Logging.LogType.Information, "Organise Library", "Processing ROM " + dr["name"]);
long RomId = (long)dr["id"];
MoveGameFile(RomId);
}
}
// clean up empty directories
DeleteOrphanedDirectories(Config.LibraryConfiguration.LibraryDataDirectory);
Logging.Log(Logging.LogType.Information, "Organise Library", "Finsihed library organisation");
}
private static void DeleteOrphanedDirectories(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
DeleteOrphanedDirectories(directory);
if (Directory.GetFiles(directory).Length == 0 &&
Directory.GetDirectories(directory).Length == 0)
{
Directory.Delete(directory, false);
}
}
}
public static void LibraryScan()
{
Logging.Log(Logging.LogType.Information, "Library Scan", "Starting library scan");
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for duplicate library files to clean up");
string duplicateSql = "DELETE r1 FROM Games_Roms r1 INNER JOIN Games_Roms r2 WHERE r1.Id > r2.Id AND r1.MD5 = r2.MD5;";
db.ExecuteCMD(duplicateSql);
string sql = "SELECT * FROM Games_Roms ORDER BY `name`";
DataTable dtRoms = db.ExecuteCMD(sql);
// clean out database entries in the import folder
if (dtRoms.Rows.Count > 0)
{
for (var i = 0; i < dtRoms.Rows.Count; i++)
{
long romId = (long)dtRoms.Rows[i]["Id"];
string romPath = (string)dtRoms.Rows[i]["Path"];
if (!romPath.StartsWith(Config.LibraryConfiguration.LibraryDataDirectory))
{
Logging.Log(Logging.LogType.Information, "Library Scan", " Deleting database entry for files with incorrect directory " + romPath);
string deleteSql = "DELETE FROM Games_Roms WHERE Id=@id";
Dictionary<string, object> deleteDict = new Dictionary<string, object>();
deleteDict.Add("Id", romId);
db.ExecuteCMD(deleteSql, deleteDict);
}
}
}
sql = "SELECT * FROM Games_Roms ORDER BY `name`";
dtRoms = db.ExecuteCMD(sql);
// search for files in the library that aren't in the database
Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for orphaned library files to add");
string[] LibraryFiles = Directory.GetFiles(Config.LibraryConfiguration.LibraryDataDirectory, "*.*", SearchOption.AllDirectories);
foreach (string LibraryFile in LibraryFiles)
{
Common.hashObject LibraryFileHash = new Common.hashObject(LibraryFile);
// check if file is in database
bool romFound = false;
for (var i = 0; i < dtRoms.Rows.Count; i++)
{
long romId = (long)dtRoms.Rows[i]["Id"];
string romPath = (string)dtRoms.Rows[i]["Path"];
string romMd5 = (string)dtRoms.Rows[i]["MD5"];
if ((LibraryFile == romPath) || (LibraryFileHash.md5hash == romMd5))
{
romFound = true;
break;
}
}
if (romFound == false)
{
// file is not in database - process it
Common.hashObject hash = new Common.hashObject(LibraryFile);
FileInfo fi = new FileInfo(LibraryFile);
Models.Signatures_Games sig = GetFileSignature(hash, fi, LibraryFile);
Logging.Log(Logging.LogType.Information, "Library Scan", " Orphaned file found in library: " + LibraryFile);
// get discovered platform
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(sig.Flags.IGDBPlatformId);
if (determinedPlatform == null)
{
determinedPlatform = new IGDB.Models.Platform();
}
IGDB.Models.Game determinedGame = SearchForGame(sig.Game.Name, sig.Flags.IGDBPlatformId);
StoreROM(hash, determinedGame, determinedPlatform, sig, LibraryFile);
}
}
sql = "SELECT * FROM Games_Roms ORDER BY `name`";
dtRoms = db.ExecuteCMD(sql);
// check all roms to see if their local file still exists
Logging.Log(Logging.LogType.Information, "Library Scan", "Checking library files exist on disk");
if (dtRoms.Rows.Count > 0)
{
for (var i = 0; i < dtRoms.Rows.Count; i++)
{
long romId = (long)dtRoms.Rows[i]["Id"];
string romPath = (string)dtRoms.Rows[i]["Path"];
Classes.Roms.GameRomItem.SourceType romMetadataSource = (Classes.Roms.GameRomItem.SourceType)(int)dtRoms.Rows[i]["MetadataSource"];
Logging.Log(Logging.LogType.Information, "Library Scan", " Processing ROM at path " + romPath);
if (File.Exists(romPath))
{
// file exists, so lets check to make sure the signature was matched, and update if a signature can be found
if (romMetadataSource == Roms.GameRomItem.SourceType.None)
{
Common.hashObject hash = new Common.hashObject
{
md5hash = "",
sha1hash = ""
};
FileInfo fi = new FileInfo(romPath);
Models.Signatures_Games sig = GetFileSignature(hash, fi, romPath);
if (sig.Rom.SignatureSource != Models.Signatures_Games.RomItem.SignatureSourceType.None)
{
Logging.Log(Logging.LogType.Information, "Library Scan", " Update signature found for " + romPath);
// get discovered platform
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(sig.Flags.IGDBPlatformId);
if (determinedPlatform == null)
{
determinedPlatform = new IGDB.Models.Platform();
}
IGDB.Models.Game determinedGame = SearchForGame(sig.Game.Name, sig.Flags.IGDBPlatformId);
StoreROM(hash, determinedGame, determinedPlatform, sig, romPath, romId);
}
}
if (romPath != ComputeROMPath(romId))
{
MoveGameFile(romId);
}
}
else
{
// file doesn't exist where it's supposed to be! delete it from the db
Logging.Log(Logging.LogType.Warning, "Library Scan", " Deleting orphaned database entry for " + romPath);
string deleteSql = "DELETE FROM Games_Roms WHERE Id = @id";
Dictionary<string, object> deleteDict = new Dictionary<string, object>();
deleteDict.Add("id", romId);
db.ExecuteCMD(deleteSql, deleteDict);
}
}
}
Logging.Log(Logging.LogType.Information, "Library Scan", "Library scan completed");
}
}
}

View File

@@ -0,0 +1,152 @@
using System;
using System.Reflection;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class AgeRatings
{
const string fieldList = "fields category,checksum,content_descriptions,rating,rating_cover_url,synopsis;";
public AgeRatings()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static AgeRating? GetAgeRatings(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<AgeRating> RetVal = _GetAgeRatings(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static AgeRating GetAgeRatings(string Slug)
{
Task<AgeRating> RetVal = _GetAgeRatings(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<AgeRating> _GetAgeRatings(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("AgeRating", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("AgeRating", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
AgeRating returnValue = new AgeRating();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
UpdateSubClasses(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
UpdateSubClasses(returnValue);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<AgeRating>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private static void UpdateSubClasses(AgeRating ageRating)
{
if (ageRating.ContentDescriptions != null)
{
foreach (long AgeRatingContentDescriptionId in ageRating.ContentDescriptions.Ids)
{
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(AgeRatingContentDescriptionId);
}
}
}
private enum SearchUsing
{
id,
slug
}
private static async Task<AgeRating> GetObjectFromServer(string WhereClause)
{
// get AgeRatings metadata
var results = await igdb.QueryAsync<AgeRating>(IGDBClient.Endpoints.AgeRating, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
public static GameAgeRating GetConsolidatedAgeRating(long RatingId)
{
GameAgeRating gameAgeRating = new GameAgeRating();
AgeRating ageRating = GetAgeRatings(RatingId);
gameAgeRating.Id = (long)ageRating.Id;
gameAgeRating.RatingBoard = (AgeRatingCategory)ageRating.Category;
gameAgeRating.RatingTitle = (AgeRatingTitle)ageRating.Rating;
List<string> descriptions = new List<string>();
if (ageRating.ContentDescriptions != null)
{
foreach (long ContentId in ageRating.ContentDescriptions.Ids)
{
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(ContentId);
descriptions.Add(ageRatingContentDescription.Description);
}
}
gameAgeRating.Descriptions = descriptions.ToArray();
return gameAgeRating;
}
public class GameAgeRating
{
public long Id { get; set; }
public AgeRatingCategory RatingBoard { get; set; }
public AgeRatingTitle RatingTitle { get; set; }
public string[] Descriptions { get; set; }
}
}
}

View File

@@ -0,0 +1,107 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class AgeRatingContentDescriptions
{
const string fieldList = "fields category,checksum,description;";
public AgeRatingContentDescriptions()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static AgeRatingContentDescription? GetAgeRatingContentDescriptions(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<AgeRatingContentDescription> RetVal = _GetAgeRatingContentDescriptions(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static AgeRatingContentDescription GetAgeRatingContentDescriptions(string Slug)
{
Task<AgeRatingContentDescription> RetVal = _GetAgeRatingContentDescriptions(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<AgeRatingContentDescription> _GetAgeRatingContentDescriptions(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("AgeRatingContentDescription", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("AgeRatingContentDescription", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
AgeRatingContentDescription returnValue = new AgeRatingContentDescription();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<AgeRatingContentDescription>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<AgeRatingContentDescription> GetObjectFromServer(string WhereClause)
{
// get AgeRatingContentDescriptionContentDescriptions metadata
var results = await igdb.QueryAsync<AgeRatingContentDescription>(IGDBClient.Endpoints.AgeRatingContentDescriptions, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,107 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class AlternativeNames
{
const string fieldList = "fields checksum,comment,game,name;";
public AlternativeNames()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static AlternativeName? GetAlternativeNames(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<AlternativeName> RetVal = _GetAlternativeNames(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static AlternativeName GetAlternativeNames(string Slug)
{
Task<AlternativeName> RetVal = _GetAlternativeNames(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<AlternativeName> _GetAlternativeNames(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("AlternativeName", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("AlternativeName", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
AlternativeName returnValue = new AlternativeName();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<AlternativeName>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<AlternativeName> GetObjectFromServer(string WhereClause)
{
// get AlternativeNames metadata
var results = await igdb.QueryAsync<AlternativeName>(IGDBClient.Endpoints.AlternativeNames, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,168 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class Artworks
{
const string fieldList = "fields alpha_channel,animated,checksum,game,height,image_id,url,width;";
public Artworks()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Artwork? GetArtwork(long? Id, string LogoPath)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Artwork> RetVal = _GetArtwork(SearchUsing.id, Id, LogoPath);
return RetVal.Result;
}
}
public static Artwork GetArtwork(string Slug, string LogoPath)
{
Task<Artwork> RetVal = _GetArtwork(SearchUsing.slug, Slug, LogoPath);
return RetVal.Result;
}
private static async Task<Artwork> _GetArtwork(SearchUsing searchUsing, object searchValue, string LogoPath)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Artwork", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Artwork", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Artwork returnValue = new Artwork();
bool forceImageDownload = false;
LogoPath = Path.Combine(LogoPath, "Artwork");
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Artwork>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
if ((!File.Exists(Path.Combine(LogoPath, returnValue.ImageId + ".jpg"))) || forceImageDownload == true)
{
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb, returnValue.ImageId);
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med, returnValue.ImageId);
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_original, returnValue.ImageId);
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Artwork> GetObjectFromServer(string WhereClause, string LogoPath)
{
// get Artwork metadata
var results = await igdb.QueryAsync<Artwork>(IGDBClient.Endpoints.Artworks, query: fieldList + " " + WhereClause + ";");
var result = results.First();
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb, result.ImageId);
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med, result.ImageId);
GetImageFromServer(result.Url, LogoPath, LogoSize.t_original, result.ImageId);
return result;
}
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize, string ImageId)
{
using (var client = new HttpClient())
{
string fileName = "Artwork.jpg";
string extension = "jpg";
switch (logoSize)
{
case LogoSize.t_thumb:
fileName = "_Thumb";
extension = "jpg";
break;
case LogoSize.t_logo_med:
fileName = "_Medium";
extension = "png";
break;
case LogoSize.t_original:
fileName = "";
extension = "png";
break;
default:
fileName = "Artwork";
extension = "jpg";
break;
}
fileName = ImageId + fileName;
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
using (var s = client.GetStreamAsync("https:" + imageUrl))
{
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
{
s.Result.CopyTo(fs);
}
}
}
}
private enum LogoSize
{
t_thumb,
t_logo_med,
t_original
}
}
}

View File

@@ -0,0 +1,107 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class Collections
{
const string fieldList = "fields checksum,created_at,games,name,slug,updated_at,url;";
public Collections()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Collection? GetCollections(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Collection> RetVal = _GetCollections(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static Collection GetCollections(string Slug)
{
Task<Collection> RetVal = _GetCollections(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<Collection> _GetCollections(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Collection", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Collection", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Collection returnValue = new Collection();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Collection>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Collection> GetObjectFromServer(string WhereClause)
{
// get Collections metadata
var results = await igdb.QueryAsync<Collection>(IGDBClient.Endpoints.Collections, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,123 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
namespace gaseous_server.Classes.Metadata
{
public class Companies
{
const string fieldList = "fields change_date,change_date_category,changed_company_id,checksum,country,created_at,description,developed,logo,name,parent,published,slug,start_date,start_date_category,updated_at,url,websites;";
public Companies()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Company? GetCompanies(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Company> RetVal = _GetCompanies(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static Company GetCompanies(string Slug)
{
Task<Company> RetVal = _GetCompanies(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<Company> _GetCompanies(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Company", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Company", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Company returnValue = new Company();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
if (returnValue != null) { Storage.NewCacheValue(returnValue); }
UpdateSubClasses(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
if (returnValue != null) { Storage.NewCacheValue(returnValue, true); }
UpdateSubClasses(returnValue);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Company>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private static void UpdateSubClasses(Company company)
{
if (company.Logo != null)
{
CompanyLogo companyLogo = CompanyLogos.GetCompanyLogo(company.Logo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Company(company));
}
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Company> GetObjectFromServer(string WhereClause)
{
// get Companies metadata
var results = await igdb.QueryAsync<Company>(IGDBClient.Endpoints.Companies, query: fieldList + " " + WhereClause + ";");
if (results.Length > 0)
{
var result = results.First();
return result;
}
else
{
return null;
}
}
}
}

View File

@@ -0,0 +1,175 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class CompanyLogos
{
const string fieldList = "fields alpha_channel,animated,checksum,height,image_id,url,width;";
public CompanyLogos()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static CompanyLogo? GetCompanyLogo(long? Id, string LogoPath)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<CompanyLogo> RetVal = _GetCompanyLogo(SearchUsing.id, Id, LogoPath);
return RetVal.Result;
}
}
public static CompanyLogo GetCompanyLogo(string Slug, string LogoPath)
{
Task<CompanyLogo> RetVal = _GetCompanyLogo(SearchUsing.slug, Slug, LogoPath);
return RetVal.Result;
}
private static async Task<CompanyLogo> _GetCompanyLogo(SearchUsing searchUsing, object searchValue, string LogoPath)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("CompanyLogo", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("CompanyLogo", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
CompanyLogo returnValue = new CompanyLogo();
bool forceImageDownload = false;
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
}
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
}
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<CompanyLogo>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
if (returnValue != null)
{
if ((!File.Exists(Path.Combine(LogoPath, "Logo.jpg"))) || forceImageDownload == true)
{
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb);
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med);
}
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<CompanyLogo?> GetObjectFromServer(string WhereClause, string LogoPath)
{
// get CompanyLogo metadata
var results = await igdb.QueryAsync<CompanyLogo>(IGDBClient.Endpoints.CompanyLogos, query: fieldList + " " + WhereClause + ";");
if (results.Length > 0)
{
var result = results.First();
GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb);
GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med);
return result;
}
else
{
return null;
}
}
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize)
{
using (var client = new HttpClient())
{
string fileName = "Logo.jpg";
string extension = "jpg";
switch (logoSize)
{
case LogoSize.t_thumb:
fileName = "Logo_Thumb";
extension = "jpg";
break;
case LogoSize.t_logo_med:
fileName = "Logo_Medium";
extension = "png";
break;
default:
fileName = "Logo";
extension = "jpg";
break;
}
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
using (var s = client.GetStreamAsync("https:" + imageUrl))
{
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
{
s.Result.CopyTo(fs);
}
}
}
}
private enum LogoSize
{
t_thumb,
t_logo_med
}
}
}

View File

@@ -0,0 +1,166 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class Covers
{
const string fieldList = "fields alpha_channel,animated,checksum,game,height,image_id,url,width;";
public Covers()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Cover? GetCover(long? Id, string LogoPath)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Cover> RetVal = _GetCover(SearchUsing.id, Id, LogoPath);
return RetVal.Result;
}
}
public static Cover GetCover(string Slug, string LogoPath)
{
Task<Cover> RetVal = _GetCover(SearchUsing.slug, Slug, LogoPath);
return RetVal.Result;
}
private static async Task<Cover> _GetCover(SearchUsing searchUsing, object searchValue, string LogoPath)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Cover", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Cover", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Cover returnValue = new Cover();
bool forceImageDownload = false;
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Cover>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
if ((!File.Exists(Path.Combine(LogoPath, "Cover.jpg"))) || forceImageDownload == true)
{
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb, returnValue.ImageId);
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med, returnValue.ImageId);
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_original, returnValue.ImageId);
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Cover> GetObjectFromServer(string WhereClause, string LogoPath)
{
// get Cover metadata
var results = await igdb.QueryAsync<Cover>(IGDBClient.Endpoints.Covers, query: fieldList + " " + WhereClause + ";");
var result = results.First();
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb, result.ImageId);
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med, result.ImageId);
GetImageFromServer(result.Url, LogoPath, LogoSize.t_original, result.ImageId);
return result;
}
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize, string ImageId)
{
using (var client = new HttpClient())
{
string fileName = "Cover.jpg";
string extension = "jpg";
switch (logoSize)
{
case LogoSize.t_thumb:
fileName = "Cover_Thumb";
extension = "jpg";
break;
case LogoSize.t_logo_med:
fileName = "Cover_Medium";
extension = "png";
break;
case LogoSize.t_original:
fileName = "Cover";
extension = "png";
break;
default:
fileName = "Cover";
extension = "jpg";
break;
}
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
using (var s = client.GetStreamAsync("https:" + imageUrl))
{
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
{
s.Result.CopyTo(fs);
}
}
}
}
private enum LogoSize
{
t_thumb,
t_logo_med,
t_original
}
}
}

View File

@@ -0,0 +1,120 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class ExternalGames
{
const string fieldList = "fields category,checksum,countries,created_at,game,media,name,platform,uid,updated_at,url,year;";
public ExternalGames()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static ExternalGame? GetExternalGames(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<ExternalGame> RetVal = _GetExternalGames(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static ExternalGame GetExternalGames(string Slug)
{
Task<ExternalGame> RetVal = _GetExternalGames(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<ExternalGame> _GetExternalGames(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("ExternalGame", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("ExternalGame", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
ExternalGame returnValue = new ExternalGame();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue);
}
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue, true);
}
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<ExternalGame>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<ExternalGame?> GetObjectFromServer(string WhereClause)
{
// get ExternalGames metadata
var results = await igdb.QueryAsync<ExternalGame>(IGDBClient.Endpoints.ExternalGames, query: fieldList + " " + WhereClause + ";");
if (results.Length > 0)
{
var result = results.First();
return result;
}
else
{
return null;
}
}
}
}

View File

@@ -0,0 +1,107 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class Franchises
{
const string fieldList = "fields checksum,created_at,games,name,slug,updated_at,url;";
public Franchises()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Franchise? GetFranchises(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Franchise> RetVal = _GetFranchises(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static Franchise GetFranchises(string Slug)
{
Task<Franchise> RetVal = _GetFranchises(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<Franchise> _GetFranchises(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Franchise", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Franchise", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Franchise returnValue = new Franchise();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Franchise>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Franchise> GetObjectFromServer(string WhereClause)
{
// get FranchiseContentDescriptions metadata
var results = await igdb.QueryAsync<Franchise>(IGDBClient.Endpoints.Franchies, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,110 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class GamesVideos
{
const string fieldList = "fields checksum,game,name,video_id;";
public GamesVideos()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static GameVideo? GetGame_Videos(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<GameVideo> RetVal = _GetGame_Videos(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static GameVideo GetGame_Videos(string Slug)
{
Task<GameVideo> RetVal = _GetGame_Videos(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<GameVideo> _GetGame_Videos(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("GameVideo", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("GameVideo", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
GameVideo returnValue = new GameVideo();
bool forceImageDownload = false;
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<GameVideo>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<GameVideo> GetObjectFromServer(string WhereClause)
{
// get Game_Videos metadata
var results = await igdb.QueryAsync<GameVideo>(IGDBClient.Endpoints.GameVideos, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,288 @@
using System;
using System.Data;
using gaseous_tools;
using IGDB;
using IGDB.Models;
namespace gaseous_server.Classes.Metadata
{
public class Games
{
const string fieldList = "fields age_ratings,aggregated_rating,aggregated_rating_count,alternative_names,artworks,bundles,category,checksum,collection,cover,created_at,dlcs,expanded_games,expansions,external_games,first_release_date,follows,forks,franchise,franchises,game_engines,game_localizations,game_modes,genres,hypes,involved_companies,keywords,language_supports,multiplayer_modes,name,parent_game,platforms,player_perspectives,ports,rating,rating_count,release_dates,remakes,remasters,screenshots,similar_games,slug,standalone_expansions,status,storyline,summary,tags,themes,total_rating,total_rating_count,updated_at,url,version_parent,version_title,videos,websites;";
public Games()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Game? GetGame(long Id, bool followSubGames, bool forceRefresh)
{
if (Id == 0)
{
Game returnValue = new Game();
if (Storage.GetCacheStatus("Game", 0) == Storage.CacheStatus.NotPresent)
{
returnValue = new Game
{
Id = 0,
Name = "Unknown Title",
Slug = "Unknown"
};
Storage.NewCacheValue(returnValue);
return returnValue;
}
else
{
return Storage.GetCacheValue<Game>(returnValue, "id", 0);
}
}
else
{
Task<Game> RetVal = _GetGame(SearchUsing.id, Id, followSubGames, forceRefresh);
return RetVal.Result;
}
}
public static Game GetGame(string Slug, bool followSubGames, bool forceRefresh)
{
Task<Game> RetVal = _GetGame(SearchUsing.slug, Slug, followSubGames, forceRefresh);
return RetVal.Result;
}
public static Game GetGame(DataRow dataRow)
{
return Storage.BuildCacheObject<Game>(new Game(), dataRow);
}
private static async Task<Game> _GetGame(SearchUsing searchUsing, object searchValue, bool followSubGames = false, bool forceRefresh = false)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Game", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Game", (string)searchValue);
}
if (forceRefresh == true)
{
if (cacheStatus == Storage.CacheStatus.Current) { cacheStatus = Storage.CacheStatus.Expired; }
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Game returnValue = new Game();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
UpdateSubClasses(returnValue, followSubGames);
return returnValue;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
UpdateSubClasses(returnValue, followSubGames);
return returnValue;
case Storage.CacheStatus.Current:
return Storage.GetCacheValue<Game>(returnValue, "id", (long)searchValue);
default:
throw new Exception("How did you get here?");
}
}
private static void UpdateSubClasses(Game Game, bool followSubGames)
{
if (Game.AgeRatings != null)
{
foreach (long AgeRatingId in Game.AgeRatings.Ids)
{
AgeRating GameAgeRating = AgeRatings.GetAgeRatings(AgeRatingId);
}
}
if (Game.AlternativeNames != null)
{
foreach (long AlternativeNameId in Game.AlternativeNames.Ids)
{
AlternativeName GameAlternativeName = AlternativeNames.GetAlternativeNames(AlternativeNameId);
}
}
if (Game.Artworks != null)
{
foreach (long ArtworkId in Game.Artworks.Ids)
{
Artwork GameArtwork = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game));
}
}
if (followSubGames)
{
List<long> gamesToFetch = new List<long>();
if (Game.Bundles != null) { gamesToFetch.AddRange(Game.Bundles.Ids); }
if (Game.Dlcs != null) { gamesToFetch.AddRange(Game.Dlcs.Ids); }
if (Game.Expansions != null) { gamesToFetch.AddRange(Game.Expansions.Ids); }
if (Game.ParentGame != null) { gamesToFetch.Add((long)Game.ParentGame.Id); }
//if (Game.SimilarGames != null) { gamesToFetch.AddRange(Game.SimilarGames.Ids); }
if (Game.StandaloneExpansions != null) { gamesToFetch.AddRange(Game.StandaloneExpansions.Ids); }
if (Game.VersionParent != null) { gamesToFetch.Add((long)Game.VersionParent.Id); }
foreach (long gameId in gamesToFetch)
{
Game relatedGame = GetGame(gameId, false, false);
}
}
if (Game.Collection != null)
{
Collection GameCollection = Collections.GetCollections(Game.Collection.Id);
}
if (Game.Cover != null)
{
Cover GameCover = Covers.GetCover(Game.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game));
}
if (Game.ExternalGames != null)
{
foreach (long ExternalGameId in Game.ExternalGames.Ids)
{
ExternalGame GameExternalGame = ExternalGames.GetExternalGames(ExternalGameId);
}
}
if (Game.Franchise != null)
{
Franchise GameFranchise = Franchises.GetFranchises(Game.Franchise.Id);
}
if (Game.Franchises != null)
{
foreach (long FranchiseId in Game.Franchises.Ids)
{
Franchise GameFranchise = Franchises.GetFranchises(FranchiseId);
}
}
if (Game.Genres != null)
{
foreach (long GenreId in Game.Genres.Ids)
{
Genre GameGenre = Genres.GetGenres(GenreId);
}
}
if (Game.InvolvedCompanies != null)
{
foreach (long involvedCompanyId in Game.InvolvedCompanies.Ids)
{
InvolvedCompany involvedCompany = InvolvedCompanies.GetInvolvedCompanies(involvedCompanyId);
}
}
if (Game.Platforms != null)
{
foreach (long PlatformId in Game.Platforms.Ids)
{
Platform GamePlatform = Platforms.GetPlatform(PlatformId);
}
}
if (Game.Screenshots != null)
{
foreach (long ScreenshotId in Game.Screenshots.Ids)
{
Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game));
}
}
if (Game.Videos != null)
{
foreach (long GameVideoId in Game.Videos.Ids)
{
GameVideo gameVideo = GamesVideos.GetGame_Videos(GameVideoId);
}
}
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Game> GetObjectFromServer(string WhereClause)
{
// get Game metadata
var results = await igdb.QueryAsync<Game>(IGDBClient.Endpoints.Games, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
public static Game[] SearchForGame(string SearchString, long PlatformId, SearchType searchType)
{
Task<Game[]> games = _SearchForGame(SearchString, PlatformId, searchType);
return games.Result;
}
private static async Task<Game[]> _SearchForGame(string SearchString, long PlatformId, SearchType searchType)
{
string searchBody = "";
searchBody += "fields id,name,slug,platforms,summary; ";
switch (searchType)
{
case SearchType.searchNoPlatform:
searchBody += "search \"" + SearchString + "\"; ";
break;
case SearchType.search:
searchBody += "search \"" + SearchString + "\"; ";
searchBody += "where platforms = (" + PlatformId + ");";
break;
case SearchType.wherefuzzy:
searchBody += "where platforms = (" + PlatformId + ") & name ~ *\"" + SearchString + "\"*;";
break;
case SearchType.where:
searchBody += "where platforms = (" + PlatformId + ") & name ~ \"" + SearchString + "\";";
break;
}
// get Game metadata
var results = await igdb.QueryAsync<Game>(IGDBClient.Endpoints.Games, query: searchBody);
return results;
}
public enum SearchType
{
where = 0,
wherefuzzy = 1,
search = 2,
searchNoPlatform = 3
}
}
}

View File

@@ -0,0 +1,110 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class Genres
{
const string fieldList = "fields checksum,created_at,name,slug,updated_at,url;";
public Genres()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Genre? GetGenres(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Genre> RetVal = _GetGenres(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static Genre GetGenres(string Slug)
{
Task<Genre> RetVal = _GetGenres(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<Genre> _GetGenres(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Genre", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Genre", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Genre returnValue = new Genre();
bool forceImageDownload = false;
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Genre>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Genre> GetObjectFromServer(string WhereClause)
{
// get Genres metadata
var results = await igdb.QueryAsync<Genre>(IGDBClient.Endpoints.Genres, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,126 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
namespace gaseous_server.Classes.Metadata
{
public class InvolvedCompanies
{
const string fieldList = "fields *;";
public InvolvedCompanies()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static InvolvedCompany? GetInvolvedCompanies(long? Id)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<InvolvedCompany> RetVal = _GetInvolvedCompanies(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static InvolvedCompany GetInvolvedCompanies(string Slug)
{
Task<InvolvedCompany> RetVal = _GetInvolvedCompanies(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<InvolvedCompany> _GetInvolvedCompanies(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("InvolvedCompany", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("InvolvedCompany", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
InvolvedCompany returnValue = new InvolvedCompany();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
UpdateSubClasses(returnValue);
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
UpdateSubClasses(returnValue);
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<InvolvedCompany>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
return returnValue;
}
private static void UpdateSubClasses(InvolvedCompany involvedCompany)
{
if (involvedCompany.Company != null)
{
Company company = Companies.GetCompanies(involvedCompany.Company.Id);
}
}
private enum SearchUsing
{
id,
slug
}
private static async Task<InvolvedCompany> GetObjectFromServer(string WhereClause)
{
// get InvolvedCompanies metadata
try
{
var results = await igdb.QueryAsync<InvolvedCompany>(IGDBClient.Endpoints.InvolvedCompanies, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
catch (Exception ex)
{
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Failure when requesting involved companies.");
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Field list: " + fieldList);
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Where clause: " + WhereClause);
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Error", ex);
throw;
}
}
}
}

View File

@@ -0,0 +1,175 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class PlatformLogos
{
const string fieldList = "fields alpha_channel,animated,checksum,height,image_id,url,width;";
public PlatformLogos()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static PlatformLogo? GetPlatformLogo(long? Id, string LogoPath)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<PlatformLogo> RetVal = _GetPlatformLogo(SearchUsing.id, Id, LogoPath);
return RetVal.Result;
}
}
public static PlatformLogo GetPlatformLogo(string Slug, string LogoPath)
{
Task<PlatformLogo> RetVal = _GetPlatformLogo(SearchUsing.slug, Slug, LogoPath);
return RetVal.Result;
}
private static async Task<PlatformLogo> _GetPlatformLogo(SearchUsing searchUsing, object searchValue, string LogoPath)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("PlatformLogo", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("PlatformLogo", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
PlatformLogo returnValue = new PlatformLogo();
bool forceImageDownload = false;
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
}
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
}
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<PlatformLogo>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
if (returnValue != null)
{
if ((!File.Exists(Path.Combine(LogoPath, "Logo.jpg"))) || forceImageDownload == true)
{
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb);
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med);
}
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<PlatformLogo?> GetObjectFromServer(string WhereClause, string LogoPath)
{
// get PlatformLogo metadata
var results = await igdb.QueryAsync<PlatformLogo>(IGDBClient.Endpoints.PlatformLogos, query: fieldList + " " + WhereClause + ";");
if (results.Length > 0)
{
var result = results.First();
GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb);
GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med);
return result;
}
else
{
return null;
}
}
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize)
{
using (var client = new HttpClient())
{
string fileName = "Logo.jpg";
string extension = "jpg";
switch (logoSize)
{
case LogoSize.t_thumb:
fileName = "Logo_Thumb";
extension = "jpg";
break;
case LogoSize.t_logo_med:
fileName = "Logo_Medium";
extension = "png";
break;
default:
fileName = "Logo";
extension = "jpg";
break;
}
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
using (var s = client.GetStreamAsync("https:" + imageUrl))
{
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
{
s.Result.CopyTo(fs);
}
}
}
}
private enum LogoSize
{
t_thumb,
t_logo_med
}
}
}

View File

@@ -0,0 +1,126 @@
using System;
using System.Data;
using gaseous_tools;
using IGDB;
using IGDB.Models;
namespace gaseous_server.Classes.Metadata
{
public class PlatformVersions
{
const string fieldList = "fields checksum,companies,connectivity,cpu,graphics,main_manufacturer,media,memory,name,online,os,output,platform_logo,platform_version_release_dates,resolutions,slug,sound,storage,summary,url;";
public PlatformVersions()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static PlatformVersion? GetPlatformVersion(long Id, Platform ParentPlatform)
{
if (Id == 0)
{
return null;
}
else
{
Task<PlatformVersion> RetVal = _GetPlatformVersion(SearchUsing.id, Id, ParentPlatform);
return RetVal.Result;
}
}
public static PlatformVersion GetPlatformVersion(string Slug, Platform ParentPlatform)
{
Task<PlatformVersion> RetVal = _GetPlatformVersion(SearchUsing.slug, Slug, ParentPlatform);
return RetVal.Result;
}
private static async Task<PlatformVersion> _GetPlatformVersion(SearchUsing searchUsing, object searchValue, Platform ParentPlatform)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("PlatformVersion", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("PlatformVersion", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
PlatformVersion returnValue = new PlatformVersion();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue);
UpdateSubClasses(ParentPlatform, returnValue);
}
return returnValue;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
if (returnValue != null)
{
Storage.NewCacheValue(returnValue, true);
UpdateSubClasses(ParentPlatform, returnValue);
}
return returnValue;
case Storage.CacheStatus.Current:
return Storage.GetCacheValue<PlatformVersion>(returnValue, "id", (long)searchValue);
default:
throw new Exception("How did you get here?");
}
}
private static void UpdateSubClasses(Platform ParentPlatform, PlatformVersion platformVersion)
{
if (platformVersion.PlatformLogo != null)
{
PlatformLogo platformLogo = PlatformLogos.GetPlatformLogo(platformVersion.PlatformLogo.Id, Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(ParentPlatform), "Versions", platformVersion.Slug));
}
}
private enum SearchUsing
{
id,
slug
}
private static async Task<PlatformVersion?> GetObjectFromServer(string WhereClause)
{
// get PlatformVersion metadata
var results = await igdb.QueryAsync<PlatformVersion>(IGDBClient.Endpoints.PlatformVersions, query: fieldList + " " + WhereClause + ";");
if (results.Length > 0)
{
var result = results.First();
return result;
}
else
{
return null;
}
}
}
}

View File

@@ -0,0 +1,139 @@
using System;
using System.Data;
using System.Net;
using gaseous_tools;
using IGDB;
using IGDB.Models;
namespace gaseous_server.Classes.Metadata
{
public class Platforms
{
const string fieldList = "fields abbreviation,alternative_name,category,checksum,created_at,generation,name,platform_family,platform_logo,slug,summary,updated_at,url,versions,websites;";
public Platforms()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Platform? GetPlatform(long Id)
{
if (Id == 0)
{
Platform returnValue = new Platform();
if (Storage.GetCacheStatus("Platform", 0) == Storage.CacheStatus.NotPresent)
{
returnValue = new Platform
{
Id = 0,
Name = "Unknown Platform",
Slug = "Unknown"
};
Storage.NewCacheValue(returnValue);
return returnValue;
}
else
{
return Storage.GetCacheValue<Platform>(returnValue, "id", 0);
}
}
else
{
Task<Platform> RetVal = _GetPlatform(SearchUsing.id, Id);
return RetVal.Result;
}
}
public static Platform GetPlatform(string Slug)
{
Task<Platform> RetVal = _GetPlatform(SearchUsing.slug, Slug);
return RetVal.Result;
}
private static async Task<Platform> _GetPlatform(SearchUsing searchUsing, object searchValue)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Platform", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Platform", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Platform returnValue = new Platform();
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue);
UpdateSubClasses(returnValue);
return returnValue;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause);
Storage.NewCacheValue(returnValue, true);
UpdateSubClasses(returnValue);
return returnValue;
case Storage.CacheStatus.Current:
return Storage.GetCacheValue<Platform>(returnValue, "id", (long)searchValue);
default:
throw new Exception("How did you get here?");
}
}
private static void UpdateSubClasses(Platform platform)
{
if (platform.Versions != null)
{
foreach (long PlatformVersionId in platform.Versions.Ids)
{
PlatformVersion platformVersion = PlatformVersions.GetPlatformVersion(PlatformVersionId, platform);
}
}
if (platform.PlatformLogo != null)
{
PlatformLogo platformLogo = PlatformLogos.GetPlatformLogo(platform.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platform));
}
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Platform> GetObjectFromServer(string WhereClause)
{
// get platform metadata
var results = await igdb.QueryAsync<Platform>(IGDBClient.Endpoints.Platforms, query: fieldList + " " + WhereClause + ";");
var result = results.First();
return result;
}
}
}

View File

@@ -0,0 +1,168 @@
using System;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using MySqlX.XDevAPI.Common;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Classes.Metadata
{
public class Screenshots
{
const string fieldList = "fields alpha_channel,animated,checksum,game,height,image_id,url,width;";
public Screenshots()
{
}
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
public static Screenshot? GetScreenshot(long? Id, string LogoPath)
{
if ((Id == 0) || (Id == null))
{
return null;
}
else
{
Task<Screenshot> RetVal = _GetScreenshot(SearchUsing.id, Id, LogoPath);
return RetVal.Result;
}
}
public static Screenshot GetScreenshot(string Slug, string LogoPath)
{
Task<Screenshot> RetVal = _GetScreenshot(SearchUsing.slug, Slug, LogoPath);
return RetVal.Result;
}
private static async Task<Screenshot> _GetScreenshot(SearchUsing searchUsing, object searchValue, string LogoPath)
{
// check database first
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
if (searchUsing == SearchUsing.id)
{
cacheStatus = Storage.GetCacheStatus("Screenshot", (long)searchValue);
}
else
{
cacheStatus = Storage.GetCacheStatus("Screenshot", (string)searchValue);
}
// set up where clause
string WhereClause = "";
switch (searchUsing)
{
case SearchUsing.id:
WhereClause = "where id = " + searchValue;
break;
case SearchUsing.slug:
WhereClause = "where slug = " + searchValue;
break;
default:
throw new Exception("Invalid search type");
}
Screenshot returnValue = new Screenshot();
bool forceImageDownload = false;
LogoPath = Path.Combine(LogoPath, "Screenshots");
switch (cacheStatus)
{
case Storage.CacheStatus.NotPresent:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
Storage.NewCacheValue(returnValue);
forceImageDownload = true;
break;
case Storage.CacheStatus.Expired:
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
Storage.NewCacheValue(returnValue, true);
forceImageDownload = true;
break;
case Storage.CacheStatus.Current:
returnValue = Storage.GetCacheValue<Screenshot>(returnValue, "id", (long)searchValue);
break;
default:
throw new Exception("How did you get here?");
}
if ((!File.Exists(Path.Combine(LogoPath, "Screenshot.jpg"))) || forceImageDownload == true)
{
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb, returnValue.ImageId);
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med, returnValue.ImageId);
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_original, returnValue.ImageId);
}
return returnValue;
}
private enum SearchUsing
{
id,
slug
}
private static async Task<Screenshot> GetObjectFromServer(string WhereClause, string LogoPath)
{
// get Screenshot metadata
var results = await igdb.QueryAsync<Screenshot>(IGDBClient.Endpoints.Screenshots, query: fieldList + " " + WhereClause + ";");
var result = results.First();
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb, result.ImageId);
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med, result.ImageId);
GetImageFromServer(result.Url, LogoPath, LogoSize.t_original, result.ImageId);
return result;
}
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize, string ImageId)
{
using (var client = new HttpClient())
{
string fileName = "Artwork.jpg";
string extension = "jpg";
switch (logoSize)
{
case LogoSize.t_thumb:
fileName = "_Thumb";
extension = "jpg";
break;
case LogoSize.t_logo_med:
fileName = "_Medium";
extension = "png";
break;
case LogoSize.t_original:
fileName = "";
extension = "png";
break;
default:
fileName = "Artwork";
extension = "jpg";
break;
}
fileName = ImageId + fileName;
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
using (var s = client.GetStreamAsync("https:" + imageUrl))
{
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
{
s.Result.CopyTo(fs);
}
}
}
}
private enum LogoSize
{
t_thumb,
t_logo_med,
t_original
}
}
}

View File

@@ -0,0 +1,385 @@
using System;
using System.Data;
using System.Reflection;
using gaseous_tools;
using IGDB;
using IGDB.Models;
namespace gaseous_server.Classes.Metadata
{
public class Storage
{
public enum CacheStatus
{
NotPresent,
Current,
Expired
}
public static CacheStatus GetCacheStatus(string Endpoint, string Slug)
{
return _GetCacheStatus(Endpoint, "slug", Slug);
}
public static CacheStatus GetCacheStatus(string Endpoint, long Id)
{
return _GetCacheStatus(Endpoint, "id", Id);
}
public static CacheStatus GetCacheStatus(DataRow Row)
{
if (Row.Table.Columns.Contains("lastUpdated"))
{
DateTime CacheExpiryTime = DateTime.UtcNow.AddHours(-168);
if ((DateTime)Row["lastUpdated"] < CacheExpiryTime)
{
return CacheStatus.Expired;
}
else
{
return CacheStatus.Current;
}
}
else
{
throw new Exception("No lastUpdated column!");
}
}
private static CacheStatus _GetCacheStatus(string Endpoint, string SearchField, object SearchValue)
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT lastUpdated FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField;
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("Endpoint", Endpoint);
dbDict.Add(SearchField, SearchValue);
DataTable dt = db.ExecuteCMD(sql, dbDict);
if (dt.Rows.Count == 0)
{
// no data stored for this item, or lastUpdated
return CacheStatus.NotPresent;
}
else
{
DateTime CacheExpiryTime = DateTime.UtcNow.AddHours(-168);
if ((DateTime)dt.Rows[0]["lastUpdated"] < CacheExpiryTime)
{
return CacheStatus.Expired;
}
else
{
return CacheStatus.Current;
}
}
}
public static void NewCacheValue(object ObjectToCache, bool UpdateRecord = false)
{
// get the object type name
string ObjectTypeName = ObjectToCache.GetType().Name;
// build dictionary
string objectJson = Newtonsoft.Json.JsonConvert.SerializeObject(ObjectToCache);
Dictionary<string, object?> objectDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object?>>(objectJson);
objectDict.Add("dateAdded", DateTime.UtcNow);
objectDict.Add("lastUpdated", DateTime.UtcNow);
// generate sql
string fieldList = "";
string valueList = "";
string updateFieldValueList = "";
foreach (KeyValuePair<string, object?> key in objectDict)
{
if (fieldList.Length > 0)
{
fieldList = fieldList + ", ";
valueList = valueList + ", ";
}
fieldList = fieldList + key.Key;
valueList = valueList + "@" + key.Key;
if ((key.Key != "id") && (key.Key != "dateAdded"))
{
if (updateFieldValueList.Length > 0)
{
updateFieldValueList = updateFieldValueList + ", ";
}
updateFieldValueList += key.Key + " = @" + key.Key;
}
// check property type
Type objectType = ObjectToCache.GetType();
if (objectType != null)
{
PropertyInfo objectProperty = objectType.GetProperty(key.Key);
if (objectProperty != null)
{
string compareName = objectProperty.PropertyType.Name.ToLower().Split("`")[0];
var objectValue = objectProperty.GetValue(ObjectToCache);
if (objectValue != null)
{
string newObjectValue;
Dictionary<string, object> newDict;
switch (compareName)
{
case "identityorvalue":
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
newDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(newObjectValue);
objectDict[key.Key] = newDict["Id"];
break;
case "identitiesorvalues":
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
newDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(newObjectValue);
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(newDict["Ids"]);
objectDict[key.Key] = newObjectValue;
break;
case "int32[]":
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
objectDict[key.Key] = newObjectValue;
break;
}
}
}
}
}
string sql = "";
if (UpdateRecord == false)
{
sql = "INSERT INTO " + ObjectTypeName + " (" + fieldList + ") VALUES (" + valueList + ")";
}
else
{
sql = "UPDATE " + ObjectTypeName + " SET " + updateFieldValueList + " WHERE Id = @Id";
}
// execute sql
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
db.ExecuteCMD(sql, objectDict);
}
public static T GetCacheValue<T>(T EndpointType, string SearchField, object SearchValue)
{
string Endpoint = EndpointType.GetType().Name;
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT * FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField;
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("Endpoint", Endpoint);
dbDict.Add(SearchField, SearchValue);
DataTable dt = db.ExecuteCMD(sql, dbDict);
if (dt.Rows.Count == 0)
{
// no data stored for this item
throw new Exception("No record found that matches endpoint " + Endpoint + " with search value " + SearchValue);
}
else
{
DataRow dataRow = dt.Rows[0];
return BuildCacheObject<T>(EndpointType, dataRow);
}
}
public static T BuildCacheObject<T>(T EndpointType, DataRow dataRow)
{
foreach (PropertyInfo property in EndpointType.GetType().GetProperties())
{
if (dataRow.Table.Columns.Contains(property.Name))
{
if (dataRow[property.Name] != DBNull.Value)
{
string objectTypeName = property.PropertyType.Name.ToLower().Split("`")[0];
string subObjectTypeName = "";
object? objectToStore = null;
if (objectTypeName == "nullable")
{
objectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[System.", "").Replace("]", "").ToLower();
}
try
{
switch (objectTypeName)
{
//case "boolean":
// Boolean storedBool = Convert.ToBoolean((int)dataRow[property.Name]);
// property.SetValue(EndpointType, storedBool);
// break;
case "datetimeoffset":
DateTimeOffset? storedDate = (DateTime?)dataRow[property.Name];
property.SetValue(EndpointType, storedDate);
break;
//case "nullable":
// Console.WriteLine("Nullable: " + property.PropertyType.UnderlyingSystemType);
// break;
case "identityorvalue":
subObjectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[IGDB.Models.", "").Replace("]", "").ToLower();
switch (subObjectTypeName)
{
case "collection":
objectToStore = new IdentityOrValue<Collection>(id: (long)dataRow[property.Name]);
break;
case "company":
objectToStore = new IdentityOrValue<Company>(id: (long)dataRow[property.Name]);
break;
case "cover":
objectToStore = new IdentityOrValue<Cover>(id: (long)dataRow[property.Name]);
break;
case "franchise":
objectToStore = new IdentityOrValue<Franchise>(id: (long)dataRow[property.Name]);
break;
case "game":
objectToStore = new IdentityOrValue<Game>(id: (long)dataRow[property.Name]);
break;
case "platformfamily":
objectToStore = new IdentityOrValue<PlatformFamily>(id: (long)dataRow[property.Name]);
break;
case "platformlogo":
objectToStore = new IdentityOrValue<PlatformLogo>(id: (long)dataRow[property.Name]);
break;
case "platformversioncompany":
objectToStore = new IdentityOrValue<PlatformVersionCompany>(id: (long)dataRow[property.Name]);
break;
}
if (objectToStore != null)
{
property.SetValue(EndpointType, objectToStore);
}
break;
case "identitiesorvalues":
subObjectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[IGDB.Models.", "").Replace("]", "").ToLower();
long[] fromJsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<long[]>((string)dataRow[property.Name]);
switch (subObjectTypeName)
{
case "agerating":
objectToStore = new IdentitiesOrValues<AgeRating>(ids: fromJsonObject);
break;
case "alternativename":
objectToStore = new IdentitiesOrValues<AlternativeName>(ids: fromJsonObject);
break;
case "artwork":
objectToStore = new IdentitiesOrValues<Artwork>(ids: fromJsonObject);
break;
case "ageratingcontentdescription":
objectToStore = new IdentitiesOrValues<AgeRatingContentDescription>(ids: fromJsonObject);
break;
case "game":
objectToStore = new IdentitiesOrValues<Game>(ids: fromJsonObject);
break;
case "externalgame":
objectToStore = new IdentitiesOrValues<ExternalGame>(ids: fromJsonObject);
break;
case "franchise":
objectToStore = new IdentitiesOrValues<Franchise>(ids: fromJsonObject);
break;
case "gameengine":
objectToStore = new IdentitiesOrValues<GameEngine>(ids: fromJsonObject);
break;
case "gamemode":
objectToStore = new IdentitiesOrValues<GameMode>(ids: fromJsonObject);
break;
case "gamevideo":
objectToStore = new IdentitiesOrValues<GameVideo>(ids: fromJsonObject);
break;
case "genre":
objectToStore = new IdentitiesOrValues<Genre>(ids: fromJsonObject);
break;
case "involvedcompany":
objectToStore = new IdentitiesOrValues<InvolvedCompany>(ids: fromJsonObject);
break;
case "multiplayermode":
objectToStore = new IdentitiesOrValues<MultiplayerMode>(ids: fromJsonObject);
break;
case "platform":
objectToStore = new IdentitiesOrValues<Platform>(ids: fromJsonObject);
break;
case "platformversion":
objectToStore = new IdentitiesOrValues<PlatformVersion>(ids: fromJsonObject);
break;
case "platformwebsite":
objectToStore = new IdentitiesOrValues<PlatformWebsite>(ids: fromJsonObject);
break;
case "platformversioncompany":
objectToStore = new IdentitiesOrValues<PlatformVersionCompany>(ids: fromJsonObject);
break;
case "platformversionreleasedate":
objectToStore = new IdentitiesOrValues<PlatformVersionReleaseDate>(ids: fromJsonObject);
break;
case "playerperspective":
objectToStore = new IdentitiesOrValues<PlayerPerspective>(ids: fromJsonObject);
break;
case "releasedate":
objectToStore = new IdentitiesOrValues<ReleaseDate>(ids: fromJsonObject);
break;
case "screenshot":
objectToStore = new IdentitiesOrValues<Screenshot>(ids: fromJsonObject);
break;
case "theme":
objectToStore = new IdentitiesOrValues<Theme>(ids: fromJsonObject);
break;
case "website":
objectToStore = new IdentitiesOrValues<Website>(ids: fromJsonObject);
break;
}
if (objectToStore != null)
{
property.SetValue(EndpointType, objectToStore);
}
break;
case "int32[]":
Int32[] fromJsonObject_int32Array = Newtonsoft.Json.JsonConvert.DeserializeObject<Int32[]>((string)dataRow[property.Name]);
if (fromJsonObject_int32Array != null)
{
property.SetValue(EndpointType, fromJsonObject_int32Array);
}
break;
case "[igdb.models.category":
property.SetValue(EndpointType, (Category)dataRow[property.Name]);
break;
case "[igdb.models.gamestatus":
property.SetValue(EndpointType, (GameStatus)dataRow[property.Name]);
break;
case "[igdb.models.ageratingcategory":
property.SetValue(EndpointType, (AgeRatingCategory)dataRow[property.Name]);
break;
case "[igdb.models.ageratingcontentdescriptioncategory":
property.SetValue(EndpointType, (AgeRatingContentDescriptionCategory)dataRow[property.Name]);
break;
case "[igdb.models.ageratingtitle":
property.SetValue(EndpointType, (AgeRatingTitle)dataRow[property.Name]);
break;
case "[igdb.models.externalcategory":
property.SetValue(EndpointType, (ExternalCategory)dataRow[property.Name]);
break;
case "[igdb.models.startdatecategory":
property.SetValue(EndpointType, (StartDateCategory)dataRow[property.Name]);
break;
default:
property.SetValue(EndpointType, dataRow[property.Name]);
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Error occurred in column " + property.Name);
Console.WriteLine(ex.ToString());
}
}
}
}
return EndpointType;
}
}
}

View File

@@ -0,0 +1,30 @@
using System;
using System.Data;
using gaseous_tools;
namespace gaseous_server.Classes
{
public class MetadataManagement
{
public static void RefreshMetadata(bool forceRefresh = false)
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT Id, `Name` FROM Game;";
DataTable dt = db.ExecuteCMD(sql);
foreach (DataRow dr in dt.Rows)
{
try
{
Logging.Log(Logging.LogType.Information, "Metadata Refresh", "Refreshing metadata for game " + dr["name"] + " (" + dr["id"] + ")");
Metadata.Games.GetGame((long)dr["id"], true, forceRefresh);
}
catch (Exception ex)
{
Logging.Log(Logging.LogType.Critical, "Metadata Refresh", "An error occurred while refreshing metadata for " + dr["name"], ex);
}
}
}
}
}

View File

@@ -0,0 +1,140 @@
using System;
using System.Data;
using gaseous_tools;
namespace gaseous_server.Classes
{
public class Roms
{
public static List<GameRomItem> GetRoms(long GameId)
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT * FROM Games_Roms WHERE GameId = @id ORDER BY `Name`";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("id", GameId);
DataTable romDT = db.ExecuteCMD(sql, dbDict);
if (romDT.Rows.Count > 0)
{
List<GameRomItem> romItems = new List<GameRomItem>();
foreach (DataRow romDR in romDT.Rows)
{
romItems.Add(BuildRom(romDR));
}
return romItems;
}
else
{
throw new Exception("Unknown Game Id");
}
}
public static GameRomItem GetRom(long RomId)
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT * FROM Games_Roms WHERE Id = @id";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("id", RomId);
DataTable romDT = db.ExecuteCMD(sql, dbDict);
if (romDT.Rows.Count > 0)
{
DataRow romDR = romDT.Rows[0];
GameRomItem romItem = BuildRom(romDR);
return romItem;
}
else
{
throw new Exception("Unknown ROM Id");
}
}
public static GameRomItem UpdateRom(long RomId, long PlatformId, long GameId)
{
// ensure metadata for platformid is present
IGDB.Models.Platform platform = Classes.Metadata.Platforms.GetPlatform(PlatformId);
// ensure metadata for gameid is present
IGDB.Models.Game game = Classes.Metadata.Games.GetGame(GameId, false, false);
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid WHERE Id = @id";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("id", RomId);
dbDict.Add("platformid", PlatformId);
dbDict.Add("gameid", GameId);
db.ExecuteCMD(sql, dbDict);
GameRomItem rom = GetRom(RomId);
return rom;
}
public static void DeleteRom(long RomId)
{
GameRomItem rom = GetRom(RomId);
if (File.Exists(rom.Path))
{
File.Delete(rom.Path);
}
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "DELETE FROM Games_Roms WHERE Id = @id";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("id", RomId);
db.ExecuteCMD(sql, dbDict);
}
private static GameRomItem BuildRom(DataRow romDR)
{
GameRomItem romItem = new GameRomItem
{
Id = (long)romDR["id"],
PlatformId = (long)romDR["platformid"],
Platform = Classes.Metadata.Platforms.GetPlatform((long)romDR["platformid"]),
GameId = (long)romDR["gameid"],
Name = (string)romDR["name"],
Size = (long)romDR["size"],
CRC = (string)romDR["crc"],
MD5 = (string)romDR["md5"],
SHA1 = (string)romDR["sha1"],
DevelopmentStatus = (string)romDR["developmentstatus"],
Flags = Newtonsoft.Json.JsonConvert.DeserializeObject<string[]>((string)romDR["flags"]),
RomType = (int)romDR["romtype"],
RomTypeMedia = (string)romDR["romtypemedia"],
MediaLabel = (string)romDR["medialabel"],
Path = (string)romDR["path"],
Source = (GameRomItem.SourceType)(Int32)romDR["metadatasource"]
};
return romItem;
}
public class GameRomItem
{
public long Id { get; set; }
public long PlatformId { get; set; }
public IGDB.Models.Platform Platform { get; set; }
public long GameId { get; set; }
public string? Name { get; set; }
public long Size { get; set; }
public string? CRC { get; set; }
public string? MD5 { get; set; }
public string? SHA1 { get; set; }
public string? DevelopmentStatus { get; set; }
public string[]? Flags { get; set; }
public int RomType { get; set; }
public string? RomTypeMedia { get; set; }
public string? MediaLabel { get; set; }
public string? Path { get; set; }
public SourceType Source { get; set; }
public enum SourceType
{
None = 0,
TOSEC = 1
}
}
}
}

View File

@@ -0,0 +1,234 @@
using System;
using System.IO;
using MySql.Data.MySqlClient;
using gaseous_romsignatureobject;
using gaseous_signature_parser.parsers;
using gaseous_tools;
using MySqlX.XDevAPI;
namespace gaseous_server.SignatureIngestors.TOSEC
{
public class TOSECIngestor
{
public void Import(string SearchPath)
{
// connect to database
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
// process provided files
Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing from " + SearchPath);
if (Directory.Exists(Config.LibraryConfiguration.LibrarySignatureImportDirectory_TOSEC))
{
string[] tosecPathContents = Directory.GetFiles(SearchPath);
Array.Sort(tosecPathContents);
string sql = "";
Dictionary<string, object> dbDict = new Dictionary<string, object>();
System.Data.DataTable sigDB;
for (UInt16 i = 0; i < tosecPathContents.Length; ++i)
{
string tosecXMLFile = tosecPathContents[i];
// check tosec file md5
Common.hashObject hashObject = new Common.hashObject(tosecXMLFile);
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
dbDict = new Dictionary<string, object>();
dbDict.Add("sourcemd5", hashObject.md5hash);
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
try
{
Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing file: " + tosecXMLFile);
// start parsing file
TosecParser tosecParser = new TosecParser();
RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile);
// store in database
// store source object
bool processGames = false;
if (tosecObject.SourceMd5 != null)
{
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
dbDict = new Dictionary<string, object>();
dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, ""));
dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, ""));
dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, ""));
dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, ""));
dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, ""));
dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, ""));
dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, ""));
dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, ""));
dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, ""));
dbDict.Add("sourcemd5", tosecObject.SourceMd5);
dbDict.Add("sourcesha1", tosecObject.SourceSHA1);
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Sources (Name, Description, Category, Version, Author, Email, Homepage, Url, SourceType, SourceMD5, SourceSHA1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)";
db.ExecuteCMD(sql, dbDict);
processGames = true;
}
if (processGames == true)
{
for (int x = 0; x < tosecObject.Games.Count; ++x)
{
RomSignatureObject.Game gameObject = tosecObject.Games[x];
// set up game dictionary
dbDict = new Dictionary<string, object>();
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, ""));
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, ""));
dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, ""));
dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, ""));
dbDict.Add("demo", (int)gameObject.Demo);
dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, ""));
dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, ""));
dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, ""));
dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, ""));
dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, ""));
dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, ""));
dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, ""));
// store platform
int gameSystem = 0;
if (gameObject.System != null)
{
sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform";
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
sigDB = db.ExecuteCMD(sql, dbDict);
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
}
else
{
gameSystem = (int)sigDB.Rows[0][0];
}
}
dbDict.Add("systemid", gameSystem);
// store publisher
int gamePublisher = 0;
if (gameObject.Publisher != null)
{
sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher";
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
sigDB = db.ExecuteCMD(sql, dbDict);
gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]);
}
else
{
gamePublisher = (int)sigDB.Rows[0][0];
}
}
dbDict.Add("publisherid", gamePublisher);
// store game
int gameId = 0;
sql = "SELECT * FROM Signatures_Games WHERE Name=@name AND Year=@year AND Publisherid=@publisher AND Systemid=@systemid AND Country=@country AND Language=@language";
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Games " +
"(Name, Description, Year, PublisherId, Demo, SystemId, SystemVariant, Video, Country, Language, Copyright) VALUES " +
"(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
sigDB = db.ExecuteCMD(sql, dbDict);
gameId = Convert.ToInt32(sigDB.Rows[0][0]);
}
else
{
gameId = (int)sigDB.Rows[0][0];
}
// store rom
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
{
if (romObject.Md5 != null)
{
int romId = 0;
sql = "SELECT * FROM Signatures_Roms WHERE GameId=@gameid AND MD5=@md5";
dbDict = new Dictionary<string, object>();
dbDict.Add("gameid", gameId);
dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, ""));
dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, ""));
dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, ""));
dbDict.Add("md5", romObject.Md5);
dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, ""));
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, ""));
if (romObject.flags != null)
{
if (romObject.flags.Count > 0)
{
dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags));
}
else
{
dbDict.Add("flags", "[ ]");
}
}
else
{
dbDict.Add("flags", "[ ]");
}
dbDict.Add("romtype", (int)romObject.RomType);
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
dbDict.Add("metadatasource", Classes.Roms.GameRomItem.SourceType.TOSEC);
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Flags, RomType, RomTypeMedia, MediaLabel, MetadataSource) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel, @metadatasource); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
sigDB = db.ExecuteCMD(sql, dbDict);
romId = Convert.ToInt32(sigDB.Rows[0][0]);
}
else
{
romId = (int)sigDB.Rows[0][0];
}
}
}
}
}
}
}
catch (Exception ex)
{
Logging.Log(Logging.LogType.Warning, "Signature Ingestor - TOSEC", "Invalid import file: " + tosecXMLFile, ex);
}
}
else
{
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - TOSEC", "Rejecting already imported file: " + tosecXMLFile);
}
}
}
}
}
}

View File

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace gaseous_server.Controllers
{
[ApiController]
[Route("api/v1/[controller]")]
public class BackgroundTasksController : Controller
{
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public List<ProcessQueue.QueueItem> GetQueue()
{
return ProcessQueue.QueueItems;
}
[HttpGet]
[Route("{TaskType}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<ProcessQueue.QueueItem> ForceRun(ProcessQueue.QueueItemType TaskType, Boolean ForceRun)
{
foreach (ProcessQueue.QueueItem qi in ProcessQueue.QueueItems)
{
if (TaskType == qi.ItemType)
{
if (ForceRun == true)
{
qi.ForceExecute();
}
return qi;
}
}
return NotFound();
}
}
}

View File

@@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using gaseous_tools;
using IGDB.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace gaseous_server.Controllers
{
[Route("api/v1/[controller]")]
[ApiController]
public class FilterController : ControllerBase
{
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
//[ResponseCache(CacheProfileName = "5Minute")]
public Dictionary<string, object> Filter()
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
Dictionary<string, object> FilterSet = new Dictionary<string, object>();
// platforms
List<Platform> platforms = new List<Platform>();
string sql = "SELECT Platform.Id, Platform.Abbreviation, Platform.AlternativeName, Platform.`Name`, Platform.PlatformLogo, (SELECT COUNT(Games_Roms.Id) AS RomCount FROM Games_Roms WHERE Games_Roms.PlatformId = Platform.Id) AS RomCount FROM Platform HAVING RomCount > 0 ORDER BY `Name`";
DataTable dbResponse = db.ExecuteCMD(sql);
foreach (DataRow dr in dbResponse.Rows)
{
platforms.Add(Classes.Metadata.Platforms.GetPlatform((long)dr["id"]));
}
FilterSet.Add("platforms", platforms);
// genres
List<Genre> genres = new List<Genre>();
sql = "SELECT DISTINCT t1.Id, t1.`Name` FROM Genre AS t1 JOIN (SELECT * FROM Game WHERE (SELECT COUNT(Id) FROM Games_Roms WHERE GameId = Game.Id) > 0) AS t2 ON JSON_CONTAINS(t2.Genres, CAST(t1.Id AS char), '$') ORDER BY t1.`Name`";
dbResponse = db.ExecuteCMD(sql);
foreach (DataRow dr in dbResponse.Rows)
{
genres.Add(Classes.Metadata.Genres.GetGenres((long)dr["id"]));
}
FilterSet.Add("genres", genres);
return FilterSet;
}
}
}

View File

@@ -0,0 +1,966 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using gaseous_server.Classes.Metadata;
using gaseous_tools;
using IGDB.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis.Scripting;
using Org.BouncyCastle.Asn1.X509;
using static gaseous_server.Classes.Metadata.AgeRatings;
namespace gaseous_server.Controllers
{
[Route("api/v1/[controller]")]
[ApiController]
public class GamesController : ControllerBase
{
[HttpGet]
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
public ActionResult Game(string name = "", string platform = "", string genre = "", bool sortdescending = false)
{
string whereClause = "";
string havingClause = "";
Dictionary<string, object> whereParams = new Dictionary<string, object>();
List<string> whereClauses = new List<string>();
List<string> havingClauses = new List<string>();
string tempVal = "";
if (name.Length > 0)
{
tempVal = "`Name` LIKE @Name";
whereParams.Add("@Name", "%" + name + "%");
havingClauses.Add(tempVal);
}
if (platform.Length > 0)
{
tempVal = "Games_Roms.PlatformId IN (";
string[] platformClauseItems = platform.Split(",");
for (int i = 0; i < platformClauseItems.Length; i++)
{
if (i > 0)
{
tempVal += ", ";
}
string platformLabel = "@Platform" + i;
tempVal += platformLabel;
whereParams.Add(platformLabel, platformClauseItems[i]);
}
tempVal += ")";
whereClauses.Add(tempVal);
}
if (genre.Length > 0)
{
tempVal = "(";
string[] genreClauseItems = genre.Split(",");
for (int i = 0; i < genreClauseItems.Length; i++)
{
if (i > 0)
{
tempVal += " AND ";
}
string genreLabel = "@Genre" + i;
tempVal += "JSON_CONTAINS(Game.Genres, " + genreLabel + ", '$')";
whereParams.Add(genreLabel, genreClauseItems[i]);
}
tempVal += ")";
whereClauses.Add(tempVal);
}
// build where clause
if (whereClauses.Count > 0)
{
whereClause = "WHERE ";
for (int i = 0; i < whereClauses.Count; i++)
{
if (i > 0)
{
whereClause += " AND ";
}
whereClause += whereClauses[i];
}
}
// build having clause
if (havingClauses.Count > 0)
{
havingClause = "HAVING ";
for (int i = 0; i < havingClauses.Count; i++)
{
if (i > 0)
{
havingClause += " AND ";
}
havingClause += havingClauses[i];
}
}
// order by clause
string orderByClause = "ORDER BY `Name` ASC";
if (sortdescending == true)
{
orderByClause = "ORDER BY `Name` DESC";
}
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT DISTINCT Games_Roms.GameId AS ROMGameId, Game.Id, Game.AgeRatings, Game.AggregatedRating, Game.AggregatedRatingCount, Game.AlternativeNames, Game.Artworks, Game.Bundles, Game.Category, Game.Collection, Game.Cover, Game.Dlcs, Game.Expansions, Game.ExternalGames, Game.FirstReleaseDate, Game.`Follows`, Game.Franchise, Game.Franchises, Game.GameEngines, Game.GameModes, Game.Genres, Game.Hypes, Game.InvolvedCompanies, Game.Keywords, Game.MultiplayerModes, Game.`Name`, Game.ParentGame, Game.Platforms, Game.PlayerPerspectives, Game.Rating, Game.RatingCount, Game.ReleaseDates, Game.Screenshots, Game.SimilarGames, Game.Slug, Game.StandaloneExpansions, Game.`Status`, Game.StoryLine, Game.Summary, Game.Tags, Game.Themes, Game.TotalRating, Game.TotalRatingCount, Game.VersionParent, Game.VersionTitle, Game.Videos, Game.Websites FROM gaseous.Games_Roms LEFT JOIN Game ON Game.Id = Games_Roms.GameId " + whereClause + " " + havingClause + " " + orderByClause;
List<IGDB.Models.Game> RetVal = new List<IGDB.Models.Game>();
DataTable dbResponse = db.ExecuteCMD(sql, whereParams);
foreach (DataRow dr in dbResponse.Rows)
{
//RetVal.Add(Classes.Metadata.Games.GetGame((long)dr["ROMGameId"], false, false));
RetVal.Add(Classes.Metadata.Games.GetGame(dr));
}
return Ok(RetVal);
}
[HttpGet]
[Route("{GameId}")]
[ProducesResponseType(typeof(Game), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "5Minute")]
public ActionResult Game(long GameId, bool forceRefresh = false)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, forceRefresh);
if (gameObject != null)
{
return Ok(gameObject);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/alternativename")]
[ProducesResponseType(typeof(List<AlternativeName>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameAlternativeNames(long GameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject.AlternativeNames != null)
{
List<AlternativeName> altNames = new List<AlternativeName>();
foreach (long altNameId in gameObject.AlternativeNames.Ids)
{
altNames.Add(AlternativeNames.GetAlternativeNames(altNameId));
}
return Ok(altNames);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/agerating")]
[ProducesResponseType(typeof(List<AgeRatings.GameAgeRating>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameAgeClassification(long GameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject.AgeRatings != null)
{
List<AgeRatings.GameAgeRating> ageRatings = new List<AgeRatings.GameAgeRating>();
foreach (long ageRatingId in gameObject.AgeRatings.Ids)
{
ageRatings.Add(AgeRatings.GetConsolidatedAgeRating(ageRatingId));
}
return Ok(ageRatings);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/agerating/{RatingId}/image")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameAgeClassification(long GameId, long RatingId)
{
try
{
GameAgeRating gameAgeRating = GetConsolidatedAgeRating(RatingId);
string fileExtension = "";
string fileType = "";
switch (gameAgeRating.RatingBoard)
{
case AgeRatingCategory.ESRB:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
case AgeRatingCategory.PEGI:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
case AgeRatingCategory.ACB:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
case AgeRatingCategory.CERO:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
case AgeRatingCategory.USK:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
case AgeRatingCategory.GRAC:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
case AgeRatingCategory.CLASS_IND:
fileExtension = "svg";
fileType = "image/svg+xml";
break;
}
string resourceName = "gaseous_server.Assets.Ratings." + gameAgeRating.RatingBoard.ToString() + "." + gameAgeRating.RatingTitle.ToString() + "." + fileExtension;
var assembly = Assembly.GetExecutingAssembly();
string[] resources = assembly.GetManifestResourceNames();
if (resources.Contains(resourceName))
{
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
byte[] filedata = new byte[stream.Length];
stream.Read(filedata, 0, filedata.Length);
string filename = gameAgeRating.RatingBoard.ToString() + "-" + gameAgeRating.RatingTitle.ToString() + "." + fileExtension;
string contentType = fileType;
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("Cache-Control", "public, max-age=604800");
return File(filedata, contentType);
}
}
return NotFound();
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/artwork")]
[ProducesResponseType(typeof(List<Artwork>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameArtwork(long GameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
List<Artwork> artworks = new List<Artwork>();
if (gameObject.Artworks != null)
{
foreach (long ArtworkId in gameObject.Artworks.Ids)
{
Artwork GameArtwork = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
artworks.Add(GameArtwork);
}
}
return Ok(artworks);
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/artwork/{ArtworkId}")]
[ProducesResponseType(typeof(Artwork), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameArtwork(long GameId, long ArtworkId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
try
{
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
if (artworkObject != null)
{
return Ok(artworkObject);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/artwork/{ArtworkId}/image")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameCoverImage(long GameId, long ArtworkId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
try
{
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
if (artworkObject != null) {
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Artwork", artworkObject.ImageId + ".png");
if (System.IO.File.Exists(coverFilePath))
{
string filename = artworkObject.ImageId + ".png";
string filepath = coverFilePath;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = "image/png";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("Cache-Control", "public, max-age=604800");
return File(filedata, contentType);
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/cover")]
[ProducesResponseType(typeof(Cover), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameCover(long GameId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject != null)
{
IGDB.Models.Cover coverObject = Covers.GetCover(gameObject.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
if (coverObject != null)
{
return Ok(coverObject);
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/cover/image")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameCoverImage(long GameId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Cover.png");
if (System.IO.File.Exists(coverFilePath)) {
string filename = "Cover.png";
string filepath = coverFilePath;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = "image/png";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("Cache-Control", "public, max-age=604800");
return File(filedata, contentType);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/genre")]
[ProducesResponseType(typeof(List<Genre>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameGenre(long GameId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject != null)
{
List<IGDB.Models.Genre> genreObjects = new List<Genre>();
if (gameObject.Genres != null)
{
foreach (long genreId in gameObject.Genres.Ids)
{
genreObjects.Add(Classes.Metadata.Genres.GetGenres(genreId));
}
}
List<IGDB.Models.Genre> sortedGenreObjects = genreObjects.OrderBy(o => o.Name).ToList();
return Ok(sortedGenreObjects);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/companies")]
[ProducesResponseType(typeof(List<Dictionary<string, object>>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameInvolvedCompanies(long GameId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject != null)
{
List<Dictionary<string, object>> icObjects = new List<Dictionary<string, object>>();
if (gameObject.InvolvedCompanies != null)
{
foreach (long icId in gameObject.InvolvedCompanies.Ids)
{
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(icId);
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
company.Developed = null;
company.Published = null;
Dictionary<string, object> companyData = new Dictionary<string, object>();
companyData.Add("involvement", involvedCompany);
companyData.Add("company", company);
icObjects.Add(companyData);
}
}
return Ok(icObjects);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/companies/{CompanyId}")]
[ProducesResponseType(typeof(Dictionary<string, object>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameInvolvedCompanies(long GameId, long CompanyId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject != null)
{
List<Dictionary<string, object>> icObjects = new List<Dictionary<string, object>>();
if (gameObject.InvolvedCompanies != null)
{
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(CompanyId);
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
company.Developed = null;
company.Published = null;
Dictionary<string, object> companyData = new Dictionary<string, object>();
companyData.Add("involvement", involvedCompany);
companyData.Add("company", company);
return Ok(companyData);
} else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/companies/{CompanyId}/image")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameCompanyImage(long GameId, long CompanyId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(CompanyId);
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Company(company), "Logo_Medium.png");
if (System.IO.File.Exists(coverFilePath))
{
string filename = "Logo.png";
string filepath = coverFilePath;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = "image/png";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("Cache-Control", "public, max-age=604800");
return File(filedata, contentType);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/roms")]
[ProducesResponseType(typeof(List<Classes.Roms.GameRomItem>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
//[ResponseCache(CacheProfileName = "5Minute")]
public ActionResult GameRom(long GameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
List<Classes.Roms.GameRomItem> roms = Classes.Roms.GetRoms(GameId);
return Ok(roms);
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/roms/{RomId}")]
[ProducesResponseType(typeof(Classes.Roms.GameRomItem), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
//[ResponseCache(CacheProfileName = "5Minute")]
public ActionResult GameRom(long GameId, long RomId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
if (rom.GameId == GameId)
{
return Ok(rom);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpPatch]
[Route("{GameId}/roms/{RomId}")]
[ProducesResponseType(typeof(Classes.Roms.GameRomItem), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameRomRename(long GameId, long RomId, long NewPlatformId, long NewGameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
if (rom.GameId == GameId)
{
rom = Classes.Roms.UpdateRom(RomId, NewPlatformId, NewGameId);
return Ok(rom);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpDelete]
[Route("{GameId}/roms/{RomId}")]
[ProducesResponseType(typeof(Classes.Roms.GameRomItem), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameRomDelete(long GameId, long RomId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
if (rom.GameId == GameId)
{
Classes.Roms.DeleteRom(RomId);
return Ok(rom);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/roms/{RomId}/file")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameRomFile(long GameId, long RomId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
if (rom.GameId != GameId)
{
return NotFound();
}
string romFilePath = rom.Path;
if (System.IO.File.Exists(romFilePath))
{
string filename = Path.GetFileName(romFilePath);
string filepath = romFilePath;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = "application/octet-stream";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = false,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("Cache-Control", "public, max-age=604800");
return File(filedata, contentType);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("search")]
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameSearch(long RomId = 0, string SearchString = "")
{
try
{
if (RomId > 0)
{
Classes.Roms.GameRomItem romItem = Classes.Roms.GetRom(RomId);
Common.hashObject hash = new Common.hashObject(romItem.Path);
Models.Signatures_Games romSig = Classes.ImportGame.GetFileSignature(hash, new FileInfo(romItem.Path), romItem.Path);
List<Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(romSig.Game.Name, romSig.Flags.IGDBPlatformId);
return Ok(searchResults);
}
else
{
if (SearchString.Length > 0)
{
List<Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(SearchString, 0);
return Ok(searchResults);
}
else
{
return NotFound();
}
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/screenshots")]
[ProducesResponseType(typeof(List<Screenshot>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameScreenshot(long GameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
List<Screenshot> screenshots = new List<Screenshot>();
if (gameObject.Screenshots != null)
{
foreach (long ScreenshotId in gameObject.Screenshots.Ids)
{
Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
screenshots.Add(GameScreenshot);
}
}
return Ok(screenshots);
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/screenshots/{ScreenshotId}")]
[ProducesResponseType(typeof(Screenshot), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameScreenshot(long GameId, long ScreenshotId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
if (gameObject != null) {
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
if (screenshotObject != null)
{
return Ok(screenshotObject);
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/screenshots/{ScreenshotId}/image")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult GameScreenshotImage(long GameId, long ScreenshotId)
{
try
{
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Screenshots", screenshotObject.ImageId + ".png");
if (System.IO.File.Exists(coverFilePath))
{
string filename = screenshotObject.ImageId + ".png";
string filepath = coverFilePath;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = "image/png";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("Cache-Control", "public, max-age=604800");
return File(filedata, contentType);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{GameId}/videos")]
[ProducesResponseType(typeof(List<GameVideo>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ResponseCache(CacheProfileName = "7Days")]
public ActionResult GameVideo(long GameId)
{
try
{
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
List<GameVideo> videos = new List<GameVideo>();
if (gameObject.Videos != null)
{
foreach (long VideoId in gameObject.Videos.Ids)
{
GameVideo gameVideo = GamesVideos.GetGame_Videos(VideoId);
videos.Add(gameVideo);
}
}
return Ok(videos);
}
catch
{
return NotFound();
}
}
}
}

View File

@@ -0,0 +1,137 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using gaseous_server.Classes.Metadata;
using gaseous_tools;
using IGDB.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis.Scripting;
namespace gaseous_server.Controllers
{
[Route("api/v1/[controller]")]
[ApiController]
public class PlatformsController : Controller
{
[HttpGet]
[ProducesResponseType(typeof(List<Platform>), StatusCodes.Status200OK)]
public ActionResult Platform()
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT * FROM gaseous.Platform WHERE Id IN (SELECT DISTINCT PlatformId FROM Games_Roms) ORDER BY `Name` ASC;";
List<Platform> RetVal = new List<Platform>();
DataTable dbResponse = db.ExecuteCMD(sql);
foreach (DataRow dr in dbResponse.Rows)
{
RetVal.Add(Classes.Metadata.Platforms.GetPlatform((long)dr["id"]));
}
return Ok(RetVal);
}
[HttpGet]
[Route("{PlatformId}")]
[ProducesResponseType(typeof(Platform), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult Platform(long PlatformId)
{
try
{
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
if (platformObject != null)
{
return Ok(platformObject);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{PlatformId}/platformlogo")]
[ProducesResponseType(typeof(PlatformLogo), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult PlatformLogo(long PlatformId)
{
try
{
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
if (platformObject != null)
{
IGDB.Models.PlatformLogo logoObject = PlatformLogos.GetPlatformLogo(platformObject.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject));
if (logoObject != null)
{
return Ok(logoObject);
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
[HttpGet]
[Route("{PlatformId}/platformlogo/image")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult PlatformLogoImage(long PlatformId)
{
try
{
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
string logoFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject), "Logo_Medium.png");
if (System.IO.File.Exists(logoFilePath))
{
string filename = "Logo.png";
string filepath = logoFilePath;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = "image/png";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.Headers.Add("Content-Disposition", cd.ToString());
return File(filedata, contentType);
}
else
{
return NotFound();
}
}
catch
{
return NotFound();
}
}
}
}

View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using gaseous_tools;
using IGDB;
using IGDB.Models;
using Microsoft.AspNetCore.Mvc;
using static gaseous_server.Classes.Metadata.Games;
using static gaseous_tools.Config.ConfigFile;
namespace gaseous_server.Controllers
{
[ApiController]
[Route("api/v1/[controller]")]
public class SearchController : Controller
{
private static IGDBClient igdb = new IGDBClient(
// Found in Twitch Developer portal for your app
Config.IGDB.ClientId,
Config.IGDB.Secret
);
[HttpGet]
[Route("Platform")]
[ProducesResponseType(typeof(List<Platform>), StatusCodes.Status200OK)]
public async Task<ActionResult> SearchPlatform(string SearchString)
{
List<Platform> RetVal = await _SearchForPlatform(SearchString);
return Ok(RetVal);
}
private static async Task<List<Platform>> _SearchForPlatform(string SearchString)
{
string searchBody = "";
searchBody += "fields abbreviation,alternative_name,category,checksum,created_at,generation,name,platform_family,platform_logo,slug,summary,updated_at,url,versions,websites; ";
searchBody += "where name ~ *\"" + SearchString + "\"*;";
// get Platform metadata
var results = await igdb.QueryAsync<Platform>(IGDBClient.Endpoints.Platforms, query: searchBody);
return results.ToList();
}
[HttpGet]
[Route("Game")]
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
public async Task<ActionResult> SearchGame(long PlatformId, string SearchString)
{
List<Game> RetVal = await _SearchForGame(PlatformId, SearchString);
return Ok(RetVal);
}
private static async Task<List<Game>> _SearchForGame(long PlatformId, string SearchString)
{
string searchBody = "";
searchBody += "fields cover.*,first_release_date,name,platforms,slug; ";
searchBody += "search \"" + SearchString + "\";";
searchBody += "where platforms = (" + PlatformId + ");";
// get Platform metadata
var results = await igdb.QueryAsync<Game>(IGDBClient.Endpoints.Games, query: searchBody);
return results.ToList();
}
}
}

View File

@@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Mvc;
namespace gaseous_server.Controllers namespace gaseous_server.Controllers
{ {
[ApiController] [ApiController]
[Route("api/[controller]/[action]")] [Route("api/v1/[controller]/[action]")]
public class SignaturesController : ControllerBase public class SignaturesController : ControllerBase
{ {
/// <summary> /// <summary>
@@ -20,28 +20,42 @@ namespace gaseous_server.Controllers
/// </summary> /// </summary>
/// <returns>Number of sources, publishers, games, and rom signatures in the database</returns> /// <returns>Number of sources, publishers, games, and rom signatures in the database</returns>
[HttpGet] [HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public Models.Signatures_Status Status() public Models.Signatures_Status Status()
{ {
return new Models.Signatures_Status(); return new Models.Signatures_Status();
} }
[HttpGet] [HttpGet]
[Route("api/[controller]/[action]")] [ProducesResponseType(StatusCodes.Status200OK)]
public List<Models.Signatures_Games> GetSignature(string md5 = "", string sha1 = "") public List<Models.Signatures_Games> GetSignature(string md5 = "", string sha1 = "")
{ {
if (md5.Length > 0) if (md5.Length > 0)
{ {
return _GetSignature("signatures_roms.md5 = @searchstring", md5); return _GetSignature("Signatures_Roms.md5 = @searchstring", md5);
} else } else
{ {
return _GetSignature("signatures_roms.sha1 = @searchstring", sha1); return _GetSignature("Signatures_Roms.sha1 = @searchstring", sha1);
}
}
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public List<Models.Signatures_Games> GetByTosecName(string TosecName = "")
{
if (TosecName.Length > 0)
{
return _GetSignature("Signatures_Roms.name = @searchstring", TosecName);
} else
{
return null;
} }
} }
private List<Models.Signatures_Games> _GetSignature(string sqlWhere, string searchString) private List<Models.Signatures_Games> _GetSignature(string sqlWhere, string searchString)
{ {
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "SELECT \n view_signatures_games.*,\n signatures_roms.id AS romid,\n signatures_roms.name AS romname,\n signatures_roms.size,\n signatures_roms.crc,\n signatures_roms.md5,\n signatures_roms.sha1,\n signatures_roms.developmentstatus,\n signatures_roms.flags,\n signatures_roms.romtype,\n signatures_roms.romtypemedia,\n signatures_roms.medialabel\nFROM\n signatures_roms\n INNER JOIN\n view_signatures_games ON signatures_roms.gameid = view_signatures_games.id WHERE " + sqlWhere; string sql = "SELECT view_Signatures_Games.*, Signatures_Roms.Id AS romid, Signatures_Roms.Name AS romname, Signatures_Roms.Size, Signatures_Roms.CRC, Signatures_Roms.MD5, Signatures_Roms.SHA1, Signatures_Roms.DevelopmentStatus, Signatures_Roms.Flags, Signatures_Roms.RomType, Signatures_Roms.RomTypeMedia, Signatures_Roms.MediaLabel, Signatures_Roms.MetadataSource FROM Signatures_Roms INNER JOIN view_Signatures_Games ON Signatures_Roms.GameId = view_Signatures_Games.Id WHERE " + sqlWhere;
Dictionary<string, object> dbDict = new Dictionary<string, object>(); Dictionary<string, object> dbDict = new Dictionary<string, object>();
dbDict.Add("searchString", searchString); dbDict.Add("searchString", searchString);
@@ -55,32 +69,33 @@ namespace gaseous_server.Controllers
{ {
Game = new Models.Signatures_Games.GameItem Game = new Models.Signatures_Games.GameItem
{ {
Id = (Int32)sigDbRow["id"], Id = (Int32)sigDbRow["Id"],
Name = (string)sigDbRow["name"], Name = (string)sigDbRow["Name"],
Description = (string)sigDbRow["description"], Description = (string)sigDbRow["Description"],
Year = (string)sigDbRow["year"], Year = (string)sigDbRow["Year"],
Publisher = (string)sigDbRow["publisher"], Publisher = (string)sigDbRow["Publisher"],
Demo = (Models.Signatures_Games.GameItem.DemoTypes)(int)sigDbRow["demo"], Demo = (Models.Signatures_Games.GameItem.DemoTypes)(int)sigDbRow["Demo"],
System = (string)sigDbRow["platform"], System = (string)sigDbRow["Platform"],
SystemVariant = (string)sigDbRow["systemvariant"], SystemVariant = (string)sigDbRow["SystemVariant"],
Video = (string)sigDbRow["video"], Video = (string)sigDbRow["Video"],
Country = (string)sigDbRow["country"], Country = (string)sigDbRow["Country"],
Language = (string)sigDbRow["language"], Language = (string)sigDbRow["Language"],
Copyright = (string)sigDbRow["copyright"] Copyright = (string)sigDbRow["Copyright"]
}, },
Rom = new Models.Signatures_Games.RomItem Rom = new Models.Signatures_Games.RomItem
{ {
Id = (Int32)sigDbRow["romid"], Id = (Int32)sigDbRow["romid"],
Name = (string)sigDbRow["romname"], Name = (string)sigDbRow["romname"],
Size = (Int64)sigDbRow["size"], Size = (Int64)sigDbRow["Size"],
Crc = (string)sigDbRow["crc"], Crc = (string)sigDbRow["CRC"],
Md5 = (string)sigDbRow["md5"], Md5 = (string)sigDbRow["MD5"],
Sha1 = (string)sigDbRow["sha1"], Sha1 = (string)sigDbRow["SHA1"],
DevelopmentStatus = (string)sigDbRow["developmentstatus"], DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"],
flags = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>((string)sigDbRow["flags"]), flags = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>((string)sigDbRow["Flags"]),
RomType = (Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["romtype"], RomType = (Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"],
RomTypeMedia = (string)sigDbRow["romtypemedia"], RomTypeMedia = (string)sigDbRow["RomTypeMedia"],
MediaLabel = (string)sigDbRow["medialabel"] MediaLabel = (string)sigDbRow["MediaLabel"],
SignatureSource = (Models.Signatures_Games.RomItem.SignatureSourceType)(Int32)sigDbRow["MetadataSource"]
} }
}; };
GamesList.Add(gameItem); GamesList.Add(gameItem);

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using gaseous_tools;
using Microsoft.AspNetCore.Mvc;
namespace gaseous_server.Controllers
{
[ApiController]
[Route("api/v1/[controller]")]
public class SystemController : Controller
{
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public Dictionary<string, object> GetSystemStatus()
{
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
Dictionary<string, object> ReturnValue = new Dictionary<string, object>();
// disk size
List<Dictionary<string, object>> Disks = new List<Dictionary<string, object>>();
//Disks.Add(GetDisk(gaseous_tools.Config.ConfigurationPath));
Disks.Add(GetDisk(gaseous_tools.Config.LibraryConfiguration.LibraryRootDirectory));
ReturnValue.Add("Paths", Disks);
// database size
string sql = "SELECT table_schema, SUM(data_length + index_length) FROM information_schema.tables WHERE table_schema = '" + Config.DatabaseConfiguration.DatabaseName + "'";
DataTable dbResponse = db.ExecuteCMD(sql);
ReturnValue.Add("DatabaseSize", dbResponse.Rows[0][1]);
return ReturnValue;
}
private Dictionary<string, object> GetDisk(string Path)
{
Dictionary<string, object> DiskValues = new Dictionary<string, object>();
DiskValues.Add("LibraryPath", Path);
DiskValues.Add("SpaceUsed", gaseous_tools.Common.DirSize(new DirectoryInfo(Path)));
DiskValues.Add("SpaceAvailable", new DriveInfo(Path).AvailableFreeSpace);
DiskValues.Add("TotalSpace", new DriveInfo(Path).TotalSize);
return DiskValues;
}
}
}

View File

@@ -0,0 +1,84 @@
using System;
using System.Reflection;
namespace gaseous_server.Models
{
public class PlatformMapping
{
public PlatformMapping()
{
}
private static List<PlatformMapItem> _PlatformMaps = new List<PlatformMapItem>();
public static List<PlatformMapItem> PlatformMap
{
get
{
if (_PlatformMaps.Count == 0)
{
// load platform maps from: gaseous_server.Support.PlatformMap.json
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "gaseous_server.Support.PlatformMap.json";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
string rawJson = reader.ReadToEnd();
_PlatformMaps.Clear();
_PlatformMaps = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem>>(rawJson);
}
}
return _PlatformMaps;
}
}
public static void GetIGDBPlatformMapping(ref Models.Signatures_Games Signature, FileInfo RomFileInfo, bool SetSystemName)
{
bool PlatformFound = false;
foreach (Models.PlatformMapping.PlatformMapItem PlatformMapping in Models.PlatformMapping.PlatformMap)
{
if (PlatformMapping.KnownFileExtensions.Contains(RomFileInfo.Extension, StringComparer.OrdinalIgnoreCase))
{
if (SetSystemName == true)
{
if (Signature.Game != null) { Signature.Game.System = PlatformMapping.IGDBName; }
}
Signature.Flags.IGDBPlatformId = PlatformMapping.IGDBId;
Signature.Flags.IGDBPlatformName = PlatformMapping.IGDBName;
PlatformFound = true;
break;
}
}
if (PlatformFound == false)
{
foreach (Models.PlatformMapping.PlatformMapItem PlatformMapping in Models.PlatformMapping.PlatformMap)
{
if (PlatformMapping.AlternateNames.Contains(Signature.Game.System, StringComparer.OrdinalIgnoreCase))
{
if (SetSystemName == true)
{
if (Signature.Game != null) { Signature.Game.System = PlatformMapping.IGDBName; }
}
Signature.Flags.IGDBPlatformId = PlatformMapping.IGDBId;
Signature.Flags.IGDBPlatformName = PlatformMapping.IGDBName;
PlatformFound = true;
break;
}
}
}
}
public class PlatformMapItem
{
public int IGDBId { get; set; }
public string IGDBName { get; set; }
public List<string> AlternateNames { get; set; } = new List<string>();
public List<string> KnownFileExtensions { get; set; } = new List<string>();
}
}
}

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Text.Json.Serialization;
using static gaseous_romsignatureobject.RomSignatureObject.Game; using static gaseous_romsignatureobject.RomSignatureObject.Game;
namespace gaseous_server.Models namespace gaseous_server.Models
@@ -12,6 +13,29 @@ namespace gaseous_server.Models
public GameItem? Game { get; set; } public GameItem? Game { get; set; }
public RomItem? Rom { get; set; } public RomItem? Rom { get; set; }
//[JsonIgnore]
public int Score
{
get
{
int _score = 0;
if (Game != null)
{
_score = _score + Game.Score;
}
if (Rom != null)
{
_score = _score + Rom.Score;
}
return _score;
}
}
public SignatureFlags Flags = new SignatureFlags();
public class GameItem public class GameItem
{ {
public Int32? Id { get; set; } public Int32? Id { get; set; }
@@ -36,6 +60,60 @@ namespace gaseous_server.Models
demo_rolling = 4, demo_rolling = 4,
demo_slideshow = 5 demo_slideshow = 5
} }
[JsonIgnore]
public int Score
{
get
{
// calculate a score based on the availablility of data
int _score = 0;
var properties = this.GetType().GetProperties();
foreach (var prop in properties)
{
if (prop.GetGetMethod() != null)
{
switch (prop.Name.ToLower())
{
case "id":
case "score":
break;
case "name":
case "year":
case "publisher":
case "system":
if (prop.PropertyType == typeof(string))
{
if (prop.GetValue(this) != null)
{
string propVal = prop.GetValue(this).ToString();
if (propVal.Length > 0)
{
_score = _score + 10;
}
}
}
break;
default:
if (prop.PropertyType == typeof(string))
{
if (prop.GetValue(this) != null)
{
string propVal = prop.GetValue(this).ToString();
if (propVal.Length > 0)
{
_score = _score + 1;
}
}
}
break;
}
}
}
return _score;
}
}
} }
public class RomItem public class RomItem
@@ -55,6 +133,14 @@ namespace gaseous_server.Models
public string? RomTypeMedia { get; set; } public string? RomTypeMedia { get; set; }
public string? MediaLabel { get; set; } public string? MediaLabel { get; set; }
public SignatureSourceType SignatureSource { get; set; }
public enum SignatureSourceType
{
None = 0,
TOSEC = 1
}
public enum RomTypes public enum RomTypes
{ {
/// <summary> /// <summary>
@@ -92,6 +178,66 @@ namespace gaseous_server.Models
/// </summary> /// </summary>
Side = 6 Side = 6
} }
[JsonIgnore]
public int Score
{
get
{
// calculate a score based on the availablility of data
int _score = 0;
var properties = this.GetType().GetProperties();
foreach (var prop in properties)
{
if (prop.GetGetMethod() != null)
{
switch (prop.Name.ToLower())
{
case "name":
case "size":
case "crc":
case "developmentstatus":
case "flags":
case "romtypemedia":
case "medialabel":
if (prop.PropertyType == typeof(string) || prop.PropertyType == typeof(Int64) || prop.PropertyType == typeof(List<string>))
{
if (prop.GetValue(this) != null)
{
string propVal = prop.GetValue(this).ToString();
if (propVal.Length > 0)
{
_score = _score + 10;
}
}
}
break;
default:
if (prop.PropertyType == typeof(string))
{
if (prop.GetValue(this) != null)
{
string propVal = prop.GetValue(this).ToString();
if (propVal.Length > 0)
{
_score = _score + 1;
}
}
}
break;
}
}
}
return _score;
}
}
}
public class SignatureFlags
{
public int IGDBPlatformId { get; set; }
public string IGDBPlatformName { get; set; }
} }
} }
} }

View File

@@ -15,7 +15,7 @@ namespace gaseous_server.Models
public Signatures_Status() public Signatures_Status()
{ {
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = "select (select count(*) from signatures_sources) as SourceCount, (select count(*) from signatures_platforms) as PlatformCount, (select count(*) from signatures_games) as GameCount, (select count(*) from signatures_roms) as RomCount;"; string sql = "select (select count(*) from Signatures_Sources) as SourceCount, (select count(*) from Signatures_Platforms) as PlatformCount, (select count(*) from Signatures_Games) as GameCount, (select count(*) from Signatures_Roms) as RomCount;";
DataTable sigDb = db.ExecuteCMD(sql); DataTable sigDb = db.ExecuteCMD(sql);
if (sigDb.Rows.Count > 0) if (sigDb.Rows.Count > 0)

View File

@@ -0,0 +1,140 @@
using System;
using gaseous_tools;
namespace gaseous_server
{
public static class ProcessQueue
{
public static List<QueueItem> QueueItems = new List<QueueItem>();
public class QueueItem
{
public QueueItem(QueueItemType ItemType, int ExecutionInterval)
{
_ItemType = ItemType;
_ItemState = QueueItemState.NeverStarted;
_LastRunTime = DateTime.UtcNow.AddMinutes(ExecutionInterval);
_Interval = ExecutionInterval;
}
public QueueItem(QueueItemType ItemType, int ExecutionInterval, List<QueueItemType> Blocks)
{
_ItemType = ItemType;
_ItemState = QueueItemState.NeverStarted;
_LastRunTime = DateTime.UtcNow.AddMinutes(ExecutionInterval);
_Interval = ExecutionInterval;
_Blocks = Blocks;
}
private QueueItemType _ItemType = QueueItemType.NotConfigured;
private QueueItemState _ItemState = QueueItemState.NeverStarted;
private DateTime _LastRunTime = DateTime.UtcNow;
private DateTime _LastFinishTime = DateTime.UtcNow;
private int _Interval = 0;
private string _LastResult = "";
private string? _LastError = null;
private bool _ForceExecute = false;
private List<QueueItemType> _Blocks = new List<QueueItemType>();
public QueueItemType ItemType => _ItemType;
public QueueItemState ItemState => _ItemState;
public DateTime LastRunTime => _LastRunTime;
public DateTime LastFinishTime => _LastFinishTime;
public DateTime NextRunTime {
get
{
return LastRunTime.AddMinutes(Interval);
}
}
public int Interval => _Interval;
public string LastResult => _LastResult;
public string? LastError => _LastError;
public bool Force => _ForceExecute;
public List<QueueItemType> Blocks => _Blocks;
public void Execute()
{
if (_ItemState != QueueItemState.Disabled)
{
if ((DateTime.UtcNow > NextRunTime || _ForceExecute == true) && _ItemState != QueueItemState.Running)
{
// we can run - do some setup before we start processing
_LastRunTime = DateTime.UtcNow;
_ItemState = QueueItemState.Running;
_LastResult = "";
_LastError = null;
Logging.Log(Logging.LogType.Information, "Timered Event", "Executing " + _ItemType);
try
{
switch (_ItemType)
{
case QueueItemType.SignatureIngestor:
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Signature Ingestor");
SignatureIngestors.TOSEC.TOSECIngestor tIngest = new SignatureIngestors.TOSEC.TOSECIngestor();
tIngest.Import(Config.LibraryConfiguration.LibrarySignatureImportDirectory_TOSEC);
break;
case QueueItemType.TitleIngestor:
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Title Ingestor");
Classes.ImportGames importGames = new Classes.ImportGames(Config.LibraryConfiguration.LibraryImportDirectory);
break;
case QueueItemType.MetadataRefresh:
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Metadata Refresher");
Classes.MetadataManagement.RefreshMetadata(true);
break;
case QueueItemType.OrganiseLibrary:
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Library Organiser");
Classes.ImportGame.OrganiseLibrary();
break;
case QueueItemType.LibraryScan:
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Library Scanner");
Classes.ImportGame.LibraryScan();
break;
}
}
catch (Exception ex)
{
Logging.Log(Logging.LogType.Warning, "Timered Event", "An error occurred", ex);
_LastResult = "";
_LastError = ex.ToString();
}
_ForceExecute = false;
_ItemState = QueueItemState.Stopped;
_LastFinishTime = DateTime.UtcNow;
}
}
}
public void ForceExecute()
{
_ForceExecute = true;
}
}
public enum QueueItemType
{
NotConfigured,
SignatureIngestor,
TitleIngestor,
MetadataRefresh,
OrganiseLibrary,
LibraryScan
}
public enum QueueItemState
{
NeverStarted,
Running,
Stopped,
Disabled
}
}
}

View File

@@ -1,38 +1,120 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using gaseous_server;
using gaseous_tools; using gaseous_tools;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args); Logging.Log(Logging.LogType.Information, "Startup", "Starting Gaseous Server");
// Add services to the container.
builder.Services.AddControllers().AddJsonOptions(x =>
{
// serialize enums as strings in api responses (e.g. Role)
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
// set up db // set up db
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
db.InitDB(); db.InitDB();
// load app settings
Config.InitSettings();
// set initial values
Guid APIKey = Guid.NewGuid();
if (Config.ReadSetting("API Key", "Test API Key") == "Test API Key")
{
// it's a new api key save it
Logging.Log(Logging.LogType.Information, "Startup", "Setting initial API key");
Config.SetSetting("API Key", APIKey.ToString());
}
// set up server
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddJsonOptions(x =>
{
// serialize enums as strings in api responses (e.g. Role)
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
// suppress nulls
x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
builder.Services.AddResponseCaching();
builder.Services.AddControllers(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
options.CacheProfiles.Add("5Minute",
new CacheProfile()
{
Duration = 300,
Location = ResponseCacheLocation.Any
});
options.CacheProfiles.Add("7Days",
new CacheProfile()
{
Duration = 604800,
Location = ResponseCacheLocation.Any
});
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddHostedService<TimedHostedService>();
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
//app.UseHttpsRedirection();
app.UseResponseCaching();
app.UseAuthorization();
app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();
// setup library directories
Config.LibraryConfiguration.InitLibrary();
// insert unknown platform and game if not present
gaseous_server.Classes.Metadata.Games.GetGame(0, false, false);
gaseous_server.Classes.Metadata.Platforms.GetPlatform(0);
// organise library
//gaseous_server.Classes.ImportGame.OrganiseLibrary();
// add background tasks
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(ProcessQueue.QueueItemType.SignatureIngestor, 60));
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
ProcessQueue.QueueItemType.TitleIngestor, 1,
new List<ProcessQueue.QueueItemType>
{
ProcessQueue.QueueItemType.OrganiseLibrary,
ProcessQueue.QueueItemType.LibraryScan
})
);
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(ProcessQueue.QueueItemType.MetadataRefresh, 360));
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
ProcessQueue.QueueItemType.OrganiseLibrary, 2040, new List<ProcessQueue.QueueItemType>
{
ProcessQueue.QueueItemType.LibraryScan,
ProcessQueue.QueueItemType.TitleIngestor
})
);
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
ProcessQueue.QueueItemType.LibraryScan, 30, new List<ProcessQueue.QueueItemType>
{
ProcessQueue.QueueItemType.TitleIngestor,
ProcessQueue.QueueItemType.OrganiseLibrary
})
);
// start the app // start the app
app.Run(); app.Run();

View File

@@ -0,0 +1,93 @@
[
{
"IGDBId": 15,
"IGDBName": "Commodore C64/128/MAX",
"AlternateNames": [
"C64",
"Commodore C64",
"Commodore C128",
"Commodore C64DTV",
"Commodore C64/128/MAX"
],
"KnownFileExtensions": [
".C64",
".CRT",
".D64",
".D71",
".D81",
".G64",
".PRG",
".T64",
".TAP"
]
},
{
"IGDBId": 16,
"IGDBName": "Amiga",
"AlternateNames": [
"Amiga",
"Commodore Amiga"
],
"KnownFileExtensions": [
".ADF",
".ADZ",
".DMS"
]
},
{
"IGDBId": 64,
"IGDBName": "Sega Master System/Mark III",
"AlternateNames": [
"Sega Master System/Mark III",
"Sega Master System",
"Sega Mark III & Master System"
],
"KnownFileExtensions": [
".SMS"
]
},
{
"IGDBId": 29,
"IGDBName": "Sega Mega Drive/Genesis",
"AlternateNames": [
"Sega Mega Drive/Genesis",
"Sega Mega Drive",
"Sega Genesis",
"Sega Mega Drive & Genesis"
],
"KnownFileExtensions": [
".GEN",
".MD",
".SG",
".SMD"
]
},
{
"IGDBId": 4,
"IGDBName": "Nintendo 64",
"AlternateNames": [
"Nintendo 64",
"N64"
],
"KnownFileExtensions": [
".Z64"
]
},
{
"IGDBId": 18,
"IGDBName": "Nintendo Entertainment System",
"AlternateNames": [
"Nintendo Entertainment System",
"NES"
],
"KnownFileExtensions": [
".NES",
".FDS",
".FIG",
".MGD",
".SFC",
".SMC",
".SWC"
]
}
]

79
gaseous-server/Timer.cs Normal file
View File

@@ -0,0 +1,79 @@
using System;
using gaseous_tools;
namespace gaseous_server
{
// see: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio-mac#timed-background-tasks-1
public class TimedHostedService : IHostedService, IDisposable
{
private int executionCount = 0;
//private readonly ILogger<TimedHostedService> _logger;
private Timer _timer;
//public TimedHostedService(ILogger<TimedHostedService> logger)
//{
// _logger = logger;
//}
public Task StartAsync(CancellationToken stoppingToken)
{
//_logger.LogInformation("Timed Hosted Service running.");
Logging.Log(Logging.LogType.Debug, "Background", "Starting background task monitor");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
var count = Interlocked.Increment(ref executionCount);
//_logger.LogInformation(
// "Timed Hosted Service is working. Count: {Count}", count);
foreach (ProcessQueue.QueueItem qi in ProcessQueue.QueueItems) {
if ((DateTime.UtcNow > qi.NextRunTime || qi.Force == true) && CheckProcessBlockList(qi) == true) {
qi.Execute();
}
}
}
public Task StopAsync(CancellationToken stoppingToken)
{
//_logger.LogInformation("Timed Hosted Service is stopping.");
Logging.Log(Logging.LogType.Debug, "Background", "Stopping background task monitor");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
private bool CheckProcessBlockList(ProcessQueue.QueueItem queueItem)
{
if (queueItem.Blocks.Count > 0)
{
foreach (ProcessQueue.QueueItem qi in ProcessQueue.QueueItems)
{
if (queueItem.Blocks.Contains(qi.ItemType) && qi.ItemState == ProcessQueue.QueueItemState.Running)
{
return false;
}
}
return true;
}
else
{
return true;
}
}
}
}

View File

@@ -9,11 +9,103 @@
<PropertyGroup Condition=" '$(RunConfiguration)' == 'https' " /> <PropertyGroup Condition=" '$(RunConfiguration)' == 'https' " />
<PropertyGroup Condition=" '$(RunConfiguration)' == 'http' " /> <PropertyGroup Condition=" '$(RunConfiguration)' == 'http' " />
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\net7.0\gaseous-server.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.8" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.7" />
<PackageReference Include="IGDB" Version="2.3.2" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Remove="Controllers\" />
<None Remove="Models\" />
<None Remove="Models\Signatures.Status" />
<None Remove="Classes\" />
<None Remove="Classes\SignatureIngestors\" />
<None Remove="Support\" />
<None Remove="Classes\Metadata\" />
<None Remove="Assets\" />
<None Remove="Assets\Ratings\" />
<None Remove="Assets\Ratings\ESRB\" />
<None Remove="Assets\Ratings\ACB\" />
<None Remove="Assets\Ratings\PEGI\" />
<None Remove="Assets\Ratings\ESRB\AO.svg" />
<None Remove="Assets\Ratings\ESRB\E.svg" />
<None Remove="Assets\Ratings\ESRB\E10plus.svg" />
<None Remove="Assets\Ratings\ESRB\M.svg" />
<None Remove="Assets\Ratings\ESRB\RP.svg" />
<None Remove="Assets\Ratings\ESRB\RP-LM17-English.svg" />
<None Remove="Assets\Ratings\ESRB\T.svg" />
<None Remove="Assets\Ratings\CERO\" />
<None Remove="Assets\Ratings\CERO\CERO_A.png" />
<None Remove="Assets\Ratings\CERO\CERO_B.png" />
<None Remove="Assets\Ratings\CERO\CERO_C.png" />
<None Remove="Assets\Ratings\CERO\CERO_D.png" />
<None Remove="Assets\Ratings\CERO\CERO_Z.png" />
<None Remove="Assets\Ratings\USK\" />
<None Remove="Assets\Ratings\USK\USK_0.svg" />
<None Remove="Assets\Ratings\USK\USK_12.svg" />
<None Remove="Assets\Ratings\USK\USK_16.svg" />
<None Remove="Assets\Ratings\USK\USK_18.svg" />
<None Remove="Assets\Ratings\USK\USK_6.svg" />
<None Remove="Assets\Ratings\ACB\ACB_G.svg" />
<None Remove="Assets\Ratings\ACB\ACB_M.svg" />
<None Remove="Assets\Ratings\ACB\ACB_MA15.svg" />
<None Remove="Assets\Ratings\ACB\ACB_PG.svg" />
<None Remove="Assets\Ratings\ACB\ACB_R18.svg" />
<None Remove="Assets\Ratings\ACB\ACB_RC.svg" />
<None Remove="Assets\Ratings\CERO\CERO_A.svg" />
<None Remove="Assets\Ratings\CERO\CERO_B.svg" />
<None Remove="Assets\Ratings\CERO\CERO_C.svg" />
<None Remove="Assets\Ratings\CERO\CERO_D.svg" />
<None Remove="Assets\Ratings\CERO\CERO_Z.svg" />
<None Remove="Assets\Ratings\PEGI\Eighteen.svg" />
<None Remove="Assets\Ratings\PEGI\Seven.svg" />
<None Remove="Assets\Ratings\PEGI\Sixteen.svg" />
<None Remove="Assets\Ratings\PEGI\Three.svg" />
<None Remove="Assets\Ratings\PEGI\Twelve.svg" />
<None Remove="Assets\Ratings\GRAC\" />
<None Remove="Assets\Ratings\GRAC\GRAC_All.svg" />
<None Remove="Assets\Ratings\GRAC\GRAC_Eighteen.svg" />
<None Remove="Assets\Ratings\GRAC\GRAC_Fifteen.svg" />
<None Remove="Assets\Ratings\GRAC\GRAC_Testing.svg" />
<None Remove="Assets\Ratings\GRAC\GRAC_Twelve.svg" />
<None Remove="Assets\Ratings\CLASS_IND\" />
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Eighteen.svg" />
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Fourteen.svg" />
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_L.svg" />
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Sixteen.svg" />
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Ten.svg" />
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Twelve.svg" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\" />
<Folder Include="Models\" />
<Folder Include="Classes\" />
<Folder Include="Classes\SignatureIngestors\" />
<Folder Include="Support\" />
<Folder Include="wwwroot\" />
<Folder Include="Classes\Metadata\" />
<Folder Include="Assets\" />
<Folder Include="Assets\Ratings\" />
<Folder Include="Assets\Ratings\ESRB\" />
<Folder Include="Assets\Ratings\ACB\" />
<Folder Include="Assets\Ratings\PEGI\" />
<Folder Include="wwwroot\scripts\" />
<Folder Include="wwwroot\images\" />
<Folder Include="wwwroot\styles\" />
<Folder Include="wwwroot\pages\" />
<Folder Include="Assets\Ratings\CERO\" />
<Folder Include="Assets\Ratings\USK\" />
<Folder Include="Assets\Ratings\GRAC\" />
<Folder Include="Assets\Ratings\CLASS_IND\" />
<Folder Include="wwwroot\fonts\" />
<Folder Include="wwwroot\pages\dialogs\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\gaseous-tools\gaseous-tools.csproj"> <ProjectReference Include="..\gaseous-tools\gaseous-tools.csproj">
<GlobalPropertiesToRemove></GlobalPropertiesToRemove> <GlobalPropertiesToRemove></GlobalPropertiesToRemove>
@@ -21,14 +113,56 @@
<ProjectReference Include="..\gaseous-romsignatureobject\gaseous-romsignatureobject.csproj"> <ProjectReference Include="..\gaseous-romsignatureobject\gaseous-romsignatureobject.csproj">
<GlobalPropertiesToRemove></GlobalPropertiesToRemove> <GlobalPropertiesToRemove></GlobalPropertiesToRemove>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\gaseous-signature-parser\gaseous-signature-parser.csproj">
<GlobalPropertiesToRemove></GlobalPropertiesToRemove>
</ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="Controllers\" /> <Content Remove="Support\PlatformMap.json" />
<None Remove="Models\" />
<None Remove="Models\Signatures.Status" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Controllers\" /> <EmbeddedResource Include="Support\PlatformMap.json" Condition="'$(ExcludeConfigFilesFromBuildOutput)'!='true'">
<Folder Include="Models\" /> <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Assets\Ratings\ESRB\AO.svg" />
<EmbeddedResource Include="Assets\Ratings\ESRB\E.svg" />
<EmbeddedResource Include="Assets\Ratings\ESRB\E10.svg" />
<EmbeddedResource Include="Assets\Ratings\ESRB\M.svg" />
<EmbeddedResource Include="Assets\Ratings\ESRB\RP.svg" />
<EmbeddedResource Include="Assets\Ratings\ESRB\RP-LM17-English.svg" />
<EmbeddedResource Include="Assets\Ratings\ESRB\T.svg" />
<EmbeddedResource Include="Assets\Ratings\USK\USK_0.svg" />
<EmbeddedResource Include="Assets\Ratings\USK\USK_12.svg" />
<EmbeddedResource Include="Assets\Ratings\USK\USK_16.svg" />
<EmbeddedResource Include="Assets\Ratings\USK\USK_18.svg" />
<EmbeddedResource Include="Assets\Ratings\USK\USK_6.svg" />
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_G.svg" />
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_M.svg" />
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_MA15.svg" />
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_PG.svg" />
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_R18.svg" />
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_RC.svg" />
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_A.svg" />
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_B.svg" />
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_C.svg" />
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_D.svg" />
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_Z.svg" />
<EmbeddedResource Include="Assets\Ratings\PEGI\Eighteen.svg" />
<EmbeddedResource Include="Assets\Ratings\PEGI\Seven.svg" />
<EmbeddedResource Include="Assets\Ratings\PEGI\Sixteen.svg" />
<EmbeddedResource Include="Assets\Ratings\PEGI\Three.svg" />
<EmbeddedResource Include="Assets\Ratings\PEGI\Twelve.svg" />
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_All.svg" />
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Eighteen.svg" />
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Fifteen.svg" />
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Testing.svg" />
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Twelve.svg" />
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Eighteen.svg" />
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Fourteen.svg" />
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_L.svg" />
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Sixteen.svg" />
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Ten.svg" />
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Twelve.svg" />
</ItemGroup> </ItemGroup>
</Project> </Project>

BIN
gaseous-server/wwwroot/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1 @@
<svg width="159" height="110" xmlns="http://www.w3.org/2000/svg"><path d="m154 17.5c-1.82-6.73-7.07-12-13.8-13.8-9.04-3.49-96.6-5.2-122 0.1-6.73 1.82-12 7.07-13.8 13.8-4.08 17.9-4.39 56.6 0.1 74.9 1.82 6.73 7.07 12 13.8 13.8 17.9 4.12 103 4.7 122 0 6.73-1.82 12-7.07 13.8-13.8 4.35-19.5 4.66-55.8-0.1-75z" fill="#f00"/><path d="m105 55-40.8-23.4v46.8z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link type="text/css" rel="stylesheet" href="/styles/style.css" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://momentjs.com/downloads/moment.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script src="/scripts/main.js" type="text/javascript"></script>
<script src="/scripts/filterformating.js" type="text/javascript"></script>
<script src="/scripts/gamesformating.js" type="text/javascript"></script>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<title>Gaseous Games</title>
</head>
<body>
<div id="banner_icon" onclick="window.location.href = '/index.html';">
<img src="/images/logo.png" alt="Gaseous" id="banner_icon_image" />
</div>
<div id="banner_header">
<div id="banner_header_label">Gaseous Games</div>
</div>
<div id="banner_cog" onclick="window.location.href = '/index.html?page=system';">
<img src="/images/cog.jpg" alt="System" id="banner_system_image" />
</div>
<div id="content">
</div>
<!-- The Modal -->
<div id="myModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="close">&times;</span>
<div><h1 id="modal-heading">Modal heading</h1></div>
<div id="modal-content">Some text in the Modal..</div>
</div>
</div>
<script type="text/javascript">var modalVariables = null;
$(document).ready(function () {
const urlParams = new URLSearchParams(window.location.search);
var myParam = urlParams.get('page');
if (!myParam) {
myParam = 'home';
}
$('#content').load('/pages/' + myParam + '.html');
});</script>
</body>
</html>

View File

@@ -0,0 +1,18 @@
<p>Are you sure you want to delete this ROM?</p>
<p><strong>Warning:</strong> This cannot be undone!</p>
<div style="width: 100%; text-align: center;">
<div style="display: inline-block; margin-right: 20px;">
<button class="redbutton" value="Delete" onclick="deleteRom();">Delete</button>
</div>
<div style="display: inline-block; margin-left: 20px;">
<button value="Cancel" onclick="closeSubDialog();">Cancel</button>
</div>
</div>
<script type="text/javascript">
function deleteRom() {
ajaxCall('/api/v1/Games/' + gameId + '/roms/' + modalVariables, 'DELETE', function (result) {
window.location.reload();
});
}
</script>

Some files were not shown because too many files have changed in this diff Show More