Compare commits
56 Commits
4a9cecf85e
...
1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 1629f24fcc | |||
| adb3677d71 | |||
| d6f06525c9 | |||
| 4d810783fc | |||
| feb26d7269 | |||
| 3dfd6c82fe | |||
| 244455909d | |||
| f53f557a6a | |||
| e1df24633a | |||
| 4543cf1e09 | |||
| 0cf2e5ca90 | |||
| ff90c610ae | |||
| 2e50dd0e3f | |||
| b584cc03bd | |||
| eb4341e05b | |||
| 73b390d8cd | |||
| 5a51707452 | |||
| f4b49dd8c4 | |||
| a4be8f1d9e | |||
| 0543b9c0c7 | |||
| ef6061fc21 | |||
| 73aa168152 | |||
| 52c7794d59 | |||
| 13104d84e8 | |||
| c35a8501a7 | |||
| 72c857c858 | |||
| e8168ad40f | |||
| c2b8cc46a3 | |||
| a29fda7c0d | |||
| f456531028 | |||
| 047ed7ae85 | |||
| ed8e4dd9ef | |||
| c86e41b977 | |||
| 374624f459 | |||
| 9a19260a6c | |||
| 7a4448c852 | |||
| ac40b8ce27 | |||
| 6ea15a23d6 | |||
| e7ff1ade4f | |||
| 9427532189 | |||
| d8f903ae66 | |||
| 97f95c752d | |||
| d296242480 | |||
| 9d98a39724 | |||
| f402d31be5 | |||
| 8598e019d4 | |||
| cea4b0d52a | |||
| 99903dcbb2 | |||
| 3b87786066 | |||
| c6f67ed21a | |||
| 16cd90d11d | |||
| 078fa74afb | |||
| dccfbf758e | |||
| c7279afbae | |||
| a0cf358b53 | |||
| 0f2b35be2a |
17
.gitignore
vendored
17
.gitignore
vendored
@@ -7,11 +7,13 @@
|
||||
.vscode/extensions.json
|
||||
.vscode/ipch
|
||||
.vscode/launch.json
|
||||
.vscode/settings.json
|
||||
|
||||
# Own folders
|
||||
_unused/
|
||||
|
||||
# Own files
|
||||
log.txt
|
||||
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
@@ -63,4 +65,15 @@ _unused/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
dkms.conf
|
||||
|
||||
# Python
|
||||
venv
|
||||
.venv
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Local backup
|
||||
*.*_
|
||||
*.*bak*
|
||||
|
||||
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"cmake.configureOnOpen": false,
|
||||
"editor.rulers": [120]
|
||||
}
|
||||
99
README.md
99
README.md
@@ -1,96 +1,49 @@
|
||||
# Important Note:
|
||||
This project has been unofficially forked from https://github.com/techniccontroller/wordclock_esp8266 which was initially created by techniccontroller. Copyright and licensing is respected.
|
||||
This project has been unofficially forked from https://github.com/techniccontroller/wordclock_esp8266 which was initially created by techniccontroller. Copyright and licensing is respected. Very many thanks for the initial code!
|
||||
|
||||
|
||||
# Wordclock 2.0
|
||||
|
||||
Wordclock 2.0 with ESP8266 and NTP time
|
||||
|
||||
More details on my website: https://techniccontroller.com/word-clock-with-wifi-and-neopixel/
|
||||
|
||||
More details on techniccontroller's website: https://techniccontroller.com/word-clock-with-wifi-and-neopixel/
|
||||
|
||||
**Languages**
|
||||
|
||||
The Wordclock is available in **German**, **English** and **Italian** language. By default the language is German.
|
||||
To use the English or Italian language please replace the file *wordclockfunctions.ino* with *wordclockfunctions.ino_english* or *wordclockfunctions.ino_italian*.
|
||||
The code compiles only with one file named *wordclockfunctions.ino*. So please rename the file you want to use to *wordclockfunctions.ino* and replace the existing file.
|
||||
The Wordclock is available in **German** language.
|
||||
|
||||
|
||||
## Features
|
||||
- 6 modes (Clock, Digital Clock, SPIRAL animation, TETRIS, SNAKE, PONG)
|
||||
- time update via NTP server
|
||||
- automatic summer/wintertime change
|
||||
- easy WIFI setup with WifiManager
|
||||
- configurable color
|
||||
- configurable night mode (start and end time)
|
||||
- configurable brightness
|
||||
- automatic mode change
|
||||
- webserver interface for configuration and control
|
||||
- physical button to change mode or enable night mode without webserver
|
||||
- automatic current limiting of LEDs
|
||||
- Time update via NTP server
|
||||
- Games: Pong, Snake, Tetris, ...
|
||||
- Automatic summer/wintertime change
|
||||
- Easy wifi setup with WifiManager
|
||||
- Configurable color
|
||||
- Configurable night mode (start and end time)
|
||||
- Configurable brightness
|
||||
- Automatic mode change
|
||||
- Webserver interface for configuration and control (web address: wordclock.local)
|
||||
- Automatic current limiting of LEDs
|
||||
|
||||
## Pictures of clock
|
||||

|
||||
|
||||
## Screenshots of webserver UI
|
||||

|
||||
|
||||
## Quickstart
|
||||
|
||||
1. Clone the project into the sketch folder of the Arduino IDE,
|
||||
2. Rename the file "example_secrets.h" to "secrets.h". You don't need to change anything in the file if you want uses the normal WiFi setup with WiFiManager (see section "Remark about the WiFi setup").
|
||||
3. Install the additional libraries and flash it to the ESP8266 as usual (See section [*Upload program to ESP8266*](https://github.com/techniccontroller/wordclock_esp8266/blob/main/README.md#upload-program-to-esp8266-with-arduino-ide) below).
|
||||
4. The implemented WiFiManager helps you to set up a WiFi connection with your home WiFi -> on the first startup it will create a WiFi access point named "WordclockAP". Connect your phone to this access point and follow the steps which will be shown to you.
|
||||
5. After a successful WiFi setup, open the browser and enter the IP address of your ESP8266 to access the interface of the webserver.
|
||||
6. Here you can then upload all files located in the folder "data". Please make sure all icons stay in the folder "icons" also on the webserver.
|
||||
|
||||
|
||||
<img src="https://techniccontroller.com/wp-content/uploads/filemanager1-1.png" height="300px" /> <img src="https://techniccontroller.com/wp-content/uploads/filemanager2-1.png" height="300px" /> <img src="https://techniccontroller.com/wp-content/uploads/filemanager3-1.png" height="300px" />
|
||||
|
||||
## Install needed Libraries
|
||||
|
||||
Please download all these libraries as ZIP from GitHub, and extract them in the *libraries* folder of your Sketchbook location (see **File -> Preferences**):
|
||||
|
||||
- https://github.com/adafruit/Adafruit-GFX-Library
|
||||
- https://github.com/adafruit/Adafruit_NeoMatrix
|
||||
- https://github.com/adafruit/Adafruit_NeoPixel
|
||||
- https://github.com/tzapu/WiFiManager
|
||||
- https://github.com/adafruit/Adafruit_BusIO
|
||||
1. Clone the project into the a directory.
|
||||
2. Open directory in VSCode with PlatformIO extension installed.
|
||||
3. Current dependencies (2024-07-21):
|
||||
- Platform espressif8266 @ 2.6.3 (required: espressif8266 @ 2.6.3)
|
||||
- Libraries
|
||||
- ├── FastLED @ 3.7.0 (required: fastled/FastLED @ 3.7.0)
|
||||
- ├── FastLED NeoMatrix @ 1.2.0 (required: marcmerlin/FastLED NeoMatrix @ ^1.2)
|
||||
- │⠀⠀⠀└── Framebuffer GFX @ 1.1.0 (required: Framebuffer GFX)
|
||||
- │⠀⠀⠀│⠀⠀⠀├── Adafruit GFX Library @ 1.11.9 (required: Adafruit GFX Library)
|
||||
- │⠀⠀⠀│⠀⠀⠀│⠀⠀⠀└── Adafruit BusIO @ 1.16.1 (required: Adafruit BusIO)
|
||||
- ├── WiFiManager @ 0.16.0 (required: tzapu/WiFiManager @ ^0.16.0)
|
||||
- └── base64 @ 1.4.0 (required: densaugeo/base64 @ ^1.4.0)
|
||||
|
||||
|
||||
## Remark about the WiFi setup
|
||||
|
||||
Regarding the Wifi setting, I have actually implemented two variants:
|
||||
1. By default the WifiManager is activated. That is, the word clock makes the first time its own WiFi (should be called "WordclockAP"). There you simply connect to the cell phone and you can perform configuration of the WiFi settings conveniently as with a SmartHome devices (Very elegant 😊)
|
||||
2. Another (traditional) variant is to define the wifi credentials in the code (in secrets.h).
|
||||
- For this you have to comment out lines 230 to 251 in the code of the file *wordclock_esp8266.ino* (/\* before and \*/ after)
|
||||
- and comment out lines 257 to 305 (/\* and \*/ remove)
|
||||
|
||||
|
||||
## Remark about Logging
|
||||
|
||||
The wordclock send continuously log messages to the serial port and via multicast UDP. If you want to see these messages, you have to
|
||||
|
||||
- open the serial monitor in the Arduino IDE (Tools -> Serial Monitor). The serial monitor must be set to 115200 baud.
|
||||
|
||||
OR
|
||||
|
||||
- run the following steps for the multicast UDP logging:
|
||||
|
||||
1. starting situation: wordclock is connected to WLAN, a computer with installed Python (https://www.python.org/downloads/) is in the same local area network (WLAN or LAN doesn't matter).
|
||||
3. open the file **multicastUDP_receiver.py** in a text editor and in line 81 enter the IP address of the computer (not the wordclock!).
|
||||
```python
|
||||
# ip address of network interface
|
||||
MCAST_IF_IP = '192.168.0.7'
|
||||
```
|
||||
4. execute the script with following command:
|
||||
|
||||
```bash
|
||||
python multicastUDP_receiver_analyzer.py
|
||||
```
|
||||
|
||||
5. now you should see the log messages of the word clock (every 5 seconds a heartbeat message and the currently displayed time).
|
||||
If this is not the case, there could be a problem with the network settings of the computer, then recording is unfortunately not possible.
|
||||
|
||||
6. If special events (failed NTP update, reboot) occur, a section of the log is saved in a file called *log.txt*.
|
||||
In principle, the events are not critical and will occur from time to time, but should not be too frequent.
|
||||
By default the WifiManager is activated. That is, the word clock makes the first time its own WiFi (should be called "WordclockAP"). There you simply connect to the cell phone and you can perform configuration of the WiFi settings conveniently as with SmartHome devices.
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
#define ANIMATIONFUNCTIONS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "wordclock_constants.h"
|
||||
|
||||
extern bool spiral_direction; // Direction of sprial animation
|
||||
|
||||
enum Direction
|
||||
{
|
||||
@@ -14,7 +17,8 @@ enum Direction
|
||||
Direction next_direction(Direction dir, int d);
|
||||
int random_snake(bool init, const uint8_t len, const uint32_t color, int numSteps);
|
||||
int random_tetris(bool init);
|
||||
int draw_heart_animation(void);
|
||||
int draw_spiral(bool init, bool empty, uint8_t size);
|
||||
void show_digital_clock(uint8_t hours, uint8_t minutes, uint32_t color);
|
||||
|
||||
#endif /* ANIMATIONFUNCTIONS_H */
|
||||
#endif /* ANIMATIONFUNCTIONS_H */
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2016 Arturo Guadalupi. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef BASE64_WRAPPER_H
|
||||
#define BASE64_WRAPPER_H
|
||||
|
||||
class Base64Class{
|
||||
public:
|
||||
int encode(char *output, char *input, int inputLength);
|
||||
int decode(char * output, char * input, int inputLength);
|
||||
int encodedLength(int plainLength);
|
||||
int decodedLength(char * input, int inputLength);
|
||||
|
||||
private:
|
||||
inline void fromA3ToA4(unsigned char * A4, unsigned char * A3);
|
||||
inline void fromA4ToA3(unsigned char * A3, unsigned char * A4);
|
||||
inline unsigned char lookupTable(char c);
|
||||
};
|
||||
extern Base64Class Base64;
|
||||
|
||||
#endif /* BASE64_WRAPPER_H */
|
||||
26
include/diagnosis.h
Normal file
26
include/diagnosis.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef DIAGNOSIS_H
|
||||
#define DIAGNOSIS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "led_matrix.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
class Diagnosis
|
||||
{
|
||||
public:
|
||||
Diagnosis(); // constructor
|
||||
Diagnosis(UDPLogger *logger, LEDMatrix *matrix); // constructor
|
||||
|
||||
String handle_command(const String &command);
|
||||
String print_device_info();
|
||||
String print_sketch_info();
|
||||
String print_last_reset_details();
|
||||
String print_matrix_fps();
|
||||
|
||||
private:
|
||||
UDPLogger *_logger;
|
||||
LEDMatrix * _matrix;
|
||||
void print(const String &s);
|
||||
};
|
||||
|
||||
#endif // DIAGNOSIS_H
|
||||
@@ -1,24 +1,28 @@
|
||||
#ifndef LEDMATRIX_H
|
||||
#define LEDMATRIX_H
|
||||
|
||||
#ifndef FASTLED_INTERNAL
|
||||
#define FASTLED_INTERNAL
|
||||
#endif
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_NeoMatrix.h>
|
||||
#include <FastLED_NeoMatrix.h>
|
||||
#include "wordclock_constants.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
#define DEFAULT_CURRENT_LIMIT 9999
|
||||
|
||||
extern const uint32_t colors_24bit[NUM_COLORS];
|
||||
|
||||
class LEDMatrix
|
||||
{
|
||||
public:
|
||||
LEDMatrix(Adafruit_NeoMatrix * matrix, uint8_t brightness, UDPLogger * logger);
|
||||
LEDMatrix(FastLED_NeoMatrix *matrix, uint8_t brightness, UDPLogger *logger);
|
||||
static uint16_t color_24_to_16bit(uint32_t color24bit);
|
||||
static uint32_t color_24bit(uint8_t r, uint8_t g, uint8_t b);
|
||||
static uint32_t interpolate_color_24bit(uint32_t color1, uint32_t color2, float factor);
|
||||
static uint32_t wheel(uint8_t WheelPos);
|
||||
uint16_t get_fps(void);
|
||||
void draw_on_matrix_instant();
|
||||
void draw_on_matrix_smooth(float factor);
|
||||
void flush(void);
|
||||
@@ -31,26 +35,26 @@ public:
|
||||
void setup_matrix();
|
||||
|
||||
private:
|
||||
Adafruit_NeoMatrix * _neomatrix;
|
||||
UDPLogger * _logger;
|
||||
FastLED_NeoMatrix *_neomatrix;
|
||||
UDPLogger *_logger;
|
||||
|
||||
uint8_t _brightness;
|
||||
uint16_t _current_limit;
|
||||
|
||||
// target representation of matrix as 2D array
|
||||
uint32_t _target_grid[MATRIX_HEIGHT][MATRIX_WIDTH] = {0};
|
||||
uint32_t _target_grid[MATRIX_HEIGHT][MATRIX_WIDTH];
|
||||
|
||||
// current representation of matrix as 2D array
|
||||
uint32_t _current_grid[MATRIX_HEIGHT][MATRIX_WIDTH] = {0};
|
||||
uint32_t _current_grid[MATRIX_HEIGHT][MATRIX_WIDTH];
|
||||
|
||||
// target representation of minutes indicator leds
|
||||
uint32_t _target_indicators[4] = {0, 0, 0, 0};
|
||||
// target representation of minutes indicator LEDs
|
||||
uint32_t _target_minute_indicators[4] = {0, 0, 0, 0};
|
||||
|
||||
// current representation of minutes indicator leds
|
||||
uint32_t _current_indicators[4] = {0, 0, 0, 0};
|
||||
// current representation of minutes indicator LEDs
|
||||
uint32_t _current_minute_indicators[4] = {0, 0, 0, 0};
|
||||
|
||||
void _draw_on_matrix(float factor);
|
||||
uint16_t _calc_estimated_led_current(uint32_t color);
|
||||
};
|
||||
|
||||
#endif /* LEDMATRIX_H */
|
||||
#endif /* LEDMATRIX_H */
|
||||
@@ -1,90 +0,0 @@
|
||||
#ifndef NTPCLIENTPLUS_H
|
||||
#define NTPCLIENTPLUS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
#define UNIX_TIMESTAMP_1900 2208988800UL // careful: positive value
|
||||
#define NTP_PACKET_SIZE 48
|
||||
#define NTP_DEFAULT_LOCAL_PORT 1337
|
||||
#define MAX_NTP_CONN_TRIES 50 // 50 * NTP_RECEIVE_WAIT_TIME_MS => 500ms
|
||||
#define NTP_RECEIVE_WAIT_TIME_MS 10 // 10ms
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NTP_UPDATE_TIMEOUT = -1,
|
||||
NTP_UPDATE_SUCCESS = 0,
|
||||
NTP_UPDATE_DIFFTOOHIGH = 1,
|
||||
NTP_UPDATE_TIME_INVALID = 2
|
||||
} ntp_return_values;
|
||||
|
||||
/**
|
||||
* @brief Own NTP Client library for Arduino with code from:
|
||||
* - https://github.com/arduino-libraries/NTPClient
|
||||
* - SPS&Technik - Projekt WordClock v1.02
|
||||
*
|
||||
*/
|
||||
class NTPClientPlus
|
||||
{
|
||||
public:
|
||||
NTPClientPlus(UDP &udp, const char *poolServerName, int utcx, bool _swChange);
|
||||
void setupNTPClient();
|
||||
int updateNTP();
|
||||
void end();
|
||||
void setTimeOffset(int timeOffset);
|
||||
void setPoolServerName(const char *poolServerName);
|
||||
unsigned long getSecsSince1900() const;
|
||||
unsigned long getEpochTime() const;
|
||||
int getHours24() const;
|
||||
int getHours12() const;
|
||||
int getMinutes() const;
|
||||
int getSeconds() const;
|
||||
String getFormattedTime() const;
|
||||
String getFormattedDate();
|
||||
void calcDate();
|
||||
unsigned int getDayOfWeek();
|
||||
unsigned int getYear();
|
||||
bool isLeapYear(unsigned int year);
|
||||
int getMonth(int dayOfYear);
|
||||
long getTimeOffset();
|
||||
bool updateSWChange();
|
||||
|
||||
private:
|
||||
UDP *_udp;
|
||||
bool _udpSetup = false;
|
||||
|
||||
bool _swChange = 1;
|
||||
const char *_poolServerName = "pool.ntp.org"; // Default time server
|
||||
int _utcx = 0;
|
||||
IPAddress _poolServerIP;
|
||||
long _timeOffset = 0;
|
||||
unsigned int _port = NTP_DEFAULT_LOCAL_PORT;
|
||||
|
||||
unsigned long _updateInterval = 60000; // In ms
|
||||
|
||||
unsigned long _currentEpoc = 0; // In s
|
||||
unsigned long _lastUpdate = 0; // In ms
|
||||
unsigned long _secsSince1900 = 0; // seconds since 1. Januar 1900, 00:00:00
|
||||
unsigned long _lastSecsSince1900 = 0;
|
||||
unsigned int _dateYear = 0;
|
||||
unsigned int _dateMonth = 0;
|
||||
unsigned int _dateDay = 0;
|
||||
unsigned int _dayOfWeek = 0;
|
||||
|
||||
unsigned char _packetBuffer[NTP_PACKET_SIZE] = {0};
|
||||
void sendNTPPacket();
|
||||
void setSummertime(bool summertime);
|
||||
|
||||
static const unsigned long secondperday = 86400;
|
||||
static const unsigned long secondperhour = 3600;
|
||||
static const unsigned long secondperminute = 60;
|
||||
static const unsigned long minuteperhour = 60;
|
||||
static const unsigned long millisecondpersecond = 1000;
|
||||
|
||||
// number of days in months
|
||||
unsigned int daysInMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
};
|
||||
|
||||
void wait(unsigned long time);
|
||||
|
||||
#endif /* NTPCLIENTPLUS_H */
|
||||
9
include/ota_functions.h
Normal file
9
include/ota_functions.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef OTA_FUNCTIONS_H
|
||||
#define OTA_FUNCTIONS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
void handleOTA();
|
||||
void setupOTA(String hostname);
|
||||
|
||||
#endif /* OTA_FUNCTIONS_H */
|
||||
@@ -1,9 +0,0 @@
|
||||
#ifndef OTAFUNCTIONS_H
|
||||
#define OTAFUNCTIONS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
void handleOTA();
|
||||
void setupOTA(String hostname);
|
||||
|
||||
#endif /* OTAFUNCTIONS_H */
|
||||
@@ -1,66 +1,20 @@
|
||||
#ifndef OWNFONT_H
|
||||
#define OWNFONT_H
|
||||
#ifndef OWN_FONT_H
|
||||
#define OWN_FONT_H
|
||||
|
||||
uint8_t numbers_font[10][5] = { {0b00000111,
|
||||
0b00000101,
|
||||
0b00000101,
|
||||
0b00000101,
|
||||
0b00000111},
|
||||
{0b00000001,
|
||||
0b00000001,
|
||||
0b00000001,
|
||||
0b00000001,
|
||||
0b00000001},
|
||||
{0b00000111,
|
||||
0b00000001,
|
||||
0b00000111,
|
||||
0b00000100,
|
||||
0b00000111},
|
||||
{0b00000111,
|
||||
0b00000001,
|
||||
0b00000111,
|
||||
0b00000001,
|
||||
0b00000111},
|
||||
{0b00000101,
|
||||
0b00000101,
|
||||
0b00000111,
|
||||
0b00000001,
|
||||
0b00000001},
|
||||
{0b00000111,
|
||||
0b00000100,
|
||||
0b00000111,
|
||||
0b00000001,
|
||||
0b00000111},
|
||||
{0b00000111,
|
||||
0b00000100,
|
||||
0b00000111,
|
||||
0b00000101,
|
||||
0b00000111},
|
||||
{0b00000111,
|
||||
0b00000001,
|
||||
0b00000001,
|
||||
0b00000001,
|
||||
0b00000001},
|
||||
{0b00000111,
|
||||
0b00000101,
|
||||
0b00000111,
|
||||
0b00000101,
|
||||
0b00000111},
|
||||
{0b00000111,
|
||||
0b00000101,
|
||||
0b00000111,
|
||||
0b00000001,
|
||||
0b00000111}};
|
||||
#include <Arduino.h>
|
||||
|
||||
uint8_t chars_font[2][5] = { {0b00000010,
|
||||
0b00000010,
|
||||
0b00000010,
|
||||
0b00000010,
|
||||
0b00000010},
|
||||
{0b00000111,
|
||||
0b00000101,
|
||||
0b00000111,
|
||||
0b00000100,
|
||||
0b00000100}};
|
||||
uint8_t numbers_font[10][5] = {{0b00000111, 0b00000101, 0b00000101, 0b00000101, 0b00000111},
|
||||
{0b00000001, 0b00000001, 0b00000001, 0b00000001, 0b00000001},
|
||||
{0b00000111, 0b00000001, 0b00000111, 0b00000100, 0b00000111},
|
||||
{0b00000111, 0b00000001, 0b00000111, 0b00000001, 0b00000111},
|
||||
{0b00000101, 0b00000101, 0b00000111, 0b00000001, 0b00000001},
|
||||
{0b00000111, 0b00000100, 0b00000111, 0b00000001, 0b00000111},
|
||||
{0b00000111, 0b00000100, 0b00000111, 0b00000101, 0b00000111},
|
||||
{0b00000111, 0b00000001, 0b00000001, 0b00000001, 0b00000001},
|
||||
{0b00000111, 0b00000101, 0b00000111, 0b00000101, 0b00000111},
|
||||
{0b00000111, 0b00000101, 0b00000111, 0b00000001, 0b00000111}};
|
||||
|
||||
#endif /* OWNFONT_H */
|
||||
uint8_t chars_font[2][5] = {{0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000010},
|
||||
{0b00000111, 0b00000101, 0b00000111, 0b00000100, 0b00000100}};
|
||||
|
||||
#endif /* OWN_FONT_H */
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#define PONG_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
#ifdef DEBOUNCE_TIME
|
||||
@@ -79,8 +79,8 @@ private:
|
||||
UDPLogger *_logger;
|
||||
uint8_t _gameState = 0;
|
||||
uint8_t _numBots = 0;
|
||||
uint8_t _playerMovement[PLAYER_AMOUNT] = {0};
|
||||
Coords _paddles[PLAYER_AMOUNT][PADDLE_WIDTH] = {0};
|
||||
uint8_t _playerMovement[PLAYER_AMOUNT];
|
||||
Coords _paddles[PLAYER_AMOUNT][PADDLE_WIDTH];
|
||||
Coords _ball = {0, 0};
|
||||
Coords _ball_old = {0, 0};
|
||||
int _ballMovement[2] = {0, 0};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef WORDCLOCK_FUNCTIONS_H
|
||||
#define WORDCLOCK_FUNCTIONS_H
|
||||
#ifndef RENDER_FUNCTIONS_H
|
||||
#define RENDER_FUNCTIONS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
@@ -8,4 +8,4 @@ String split(String s, char parser, int index);
|
||||
String time_to_string(uint8_t hours, uint8_t minutes);
|
||||
void draw_minute_indicator(uint8_t minutes, uint32_t color);
|
||||
|
||||
#endif /* WORDCLOCK_FUNCTIONS_H */
|
||||
#endif /* RENDER_FUNCTIONS_H */
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
#define snake_h
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
#ifdef DEBOUNCE_TIME
|
||||
#undef DEBOUNCE_TIME
|
||||
#endif
|
||||
#define DEBOUNCE_TIME 300 // in ms
|
||||
#define DEBOUNCE_TIME 250 // in ms
|
||||
|
||||
#define X_MAX 11
|
||||
#define Y_MAX 11
|
||||
@@ -76,7 +76,7 @@ private:
|
||||
uint8_t _userDirection = 0;
|
||||
uint8_t _gameState = 0;
|
||||
Coords _head = {0, 0};
|
||||
Coords _tail[MAX_TAIL_LENGTH] = {0};
|
||||
Coords _tail[MAX_TAIL_LENGTH];
|
||||
Coords _food = {0, 0};
|
||||
unsigned long _lastDrawUpdate = 0;
|
||||
unsigned long _lastButtonClick = 0;
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#define TETRIS_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
#ifdef DEBOUNCE_TIME
|
||||
@@ -128,7 +128,7 @@ private:
|
||||
|
||||
bool _allowdrop = false;
|
||||
bool _tetrisGameOver = false;
|
||||
int _gameStatet = GAME_STATE_INIT;
|
||||
int _gameState = GAME_STATE_INIT;
|
||||
int _score = 0;
|
||||
unsigned int _speedtetris = 80;
|
||||
unsigned long _brickSpeed = 0;
|
||||
|
||||
80
include/time_manager.h
Normal file
80
include/time_manager.h
Normal file
@@ -0,0 +1,80 @@
|
||||
#ifndef TIME_MANAGER_H
|
||||
#define TIME_MANAGER_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <time.h>
|
||||
#include "udp_logger.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TIME_UPDATE_FAILED = 0,
|
||||
TIME_UPDATE_OK = 1,
|
||||
TIME_UPDATE_PENDING = 2,
|
||||
} TimeUpdateState;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TM_INIT = 0,
|
||||
TM_INITIAL_SYNC = 1,
|
||||
TM_NORMAL = 2,
|
||||
TM_SYNC_OVERDUE = 3,
|
||||
TM_SYNC_TIMEOUT = 4,
|
||||
TM_SETUP_FAILED = 5,
|
||||
} TimeManagerState;
|
||||
|
||||
class TimeManager
|
||||
{
|
||||
#define NTP_MAX_UPDATE_TIME_US (5 * 1000 * 1000) // 5000ms max update time
|
||||
|
||||
public:
|
||||
// constructors
|
||||
TimeManager();
|
||||
TimeManager(const char *tz,
|
||||
const char *ntp_server,
|
||||
bool (*is_wifi_connected)(void),
|
||||
uint32 ntp_max_offline_time_s,
|
||||
UDPLogger *logger);
|
||||
|
||||
// init
|
||||
void init();
|
||||
|
||||
// callback
|
||||
void time_set_cb(void); // callback which is called when NTP time was set
|
||||
|
||||
// ntp methods
|
||||
bool ntp_sync_successful(void) const; // was there a NTP sync once?
|
||||
bool ntp_sync_overdue(void); // function to check if NTP sync is overdue
|
||||
bool ntp_sync_timeout(void); // function to check if maximum time since last NTP sync has been reached
|
||||
TimeUpdateState get_time(); // main time update method, called in loop
|
||||
|
||||
// getter for time values
|
||||
bool isdst(void) const; // true if summertime (daylight saving time)
|
||||
int day(void) const;
|
||||
int hour(void) const;
|
||||
int minute(void) const;
|
||||
int month(void) const;
|
||||
int year(void) const;
|
||||
struct tm time_info(void) const;
|
||||
|
||||
// getter
|
||||
TimeManagerState tm_state(void) const; // get current state
|
||||
|
||||
// logging
|
||||
void log_time() const; // log _time_info
|
||||
void log_time(struct tm time_info) const; // log argument time_info
|
||||
|
||||
private:
|
||||
void _set_up_ntp(void); // set up NTP server
|
||||
bool (*_is_wifi_connected)(void); // function to check if wifi is connected
|
||||
|
||||
const char *_ntp_server = "pool.ntp.org"; // ntp server address
|
||||
const char *_tz; // timezone
|
||||
struct tm _time_info = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // structure tm holds time information
|
||||
time_t _now = 0; // local time value
|
||||
time_t _ntp_sync_timestamp_s = 0; // timestamp of last successful ntp sync
|
||||
TimeManagerState _tm_state = TM_INIT; // Main state
|
||||
UDPLogger *_logger; // logger instance
|
||||
uint32 _ntp_max_offline_time_s; // maximum time in seconds which is considered ok since last NTP update
|
||||
};
|
||||
|
||||
#endif /* TIME_MANAGER_H */
|
||||
@@ -6,66 +6,74 @@
|
||||
// ----------------------------------------------------------------------------------
|
||||
// CONSTANTS
|
||||
// ----------------------------------------------------------------------------------
|
||||
#define AP_SSID "WordclockAP" // SSID name of Access Point
|
||||
#define NTP_SERVER_URL "de.pool.ntp.org" // NTP server address
|
||||
#define AP_SSID "WordclockAP" // SSID name of Access Point
|
||||
#define NTP_SERVER_URL "de.pool.ntp.org" // NTP server address
|
||||
#define MY_TZ "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Timezone
|
||||
|
||||
#define HOSTNAME (String("wordclock")) // Local hostname
|
||||
#define LOGGER_MULTICAST_IP (IPAddress(230, 120, 10, 2)) // IP for UDP server
|
||||
#define LOGGER_MULTICAST_PORT 8123 // Port for UDP server
|
||||
#define HTTP_PORT 80 // Standard HTTP port
|
||||
#define LOGGER_MULTICAST_PORT (8123) // Port for UDP server
|
||||
#define HTTP_PORT (80) // Standard HTTP port
|
||||
|
||||
// EEPROM layout
|
||||
typedef enum
|
||||
{
|
||||
ADR_NM_START_H = 0,
|
||||
ADR_NM_END_H = 4,
|
||||
ADR_NM_START_M = 8,
|
||||
ADR_NM_END_M = 12,
|
||||
ADR_BRIGHTNESS = 16,
|
||||
ADR_MC_RED = 20,
|
||||
ADR_MC_GREEN = 22,
|
||||
ADR_MC_BLUE = 24,
|
||||
EEPROM_SIZE = 30
|
||||
} EepromLayout_en;
|
||||
// ESP8266 Pins
|
||||
#define FASTLED_PIN (14) // pin to which the LEDs are attached
|
||||
#define BUTTON_PIN (5) // pin to which the button is attached
|
||||
|
||||
#define NEOPIXEL_PIN 5 // pin to which the NeoPixels are attached
|
||||
#define BUTTON_PIN 14 // pin to which the button is attached
|
||||
// Time limits
|
||||
#define HOUR_MAX (23)
|
||||
#define MINUTE_MAX (59)
|
||||
|
||||
#define MINUTES_IN_HOUR (60)
|
||||
#define HOURS_IN_DAY (24)
|
||||
|
||||
// Night mode
|
||||
#define NIGHTMODE_START_HR 23
|
||||
#define NIGHTMODE_START_MIN 0
|
||||
#define NIGHTMODE_END_HR 7
|
||||
#define NIGHTMODE_END_MIN 0
|
||||
#define NIGHTMODE_START_HR (23)
|
||||
#define NIGHTMODE_START_MIN (0)
|
||||
#define NIGHTMODE_END_HR (7)
|
||||
#define NIGHTMODE_END_MIN (0)
|
||||
|
||||
// Timings in ms
|
||||
#define PERIOD_ANIMATION 200
|
||||
#define PERIOD_HEARTBEAT 1000
|
||||
#define PERIOD_MATRIX_UPDATE 100
|
||||
#define PERIOD_NIGHTMODE_CHECK 20000
|
||||
#define PERIOD_NTP_UPDATE 30000
|
||||
#define PERIOD_PONG 10
|
||||
#define PERIOD_SNAKE 50
|
||||
#define PERIOD_STATE_CHANGE 10000
|
||||
#define PERIOD_TETRIS 50
|
||||
#define PERIOD_TIME_VISU_UPDATE 1000
|
||||
#define TIMEOUT_LEDDIRECT 5000
|
||||
// Timings in us
|
||||
#define PERIOD_ANIMATION_US (200 * 1000) // 200ms
|
||||
#define PERIOD_CLOCK_UPDATE_US (1 * 1000 * 1000) // Must be 1s! Do not change!
|
||||
#define PERIOD_HEARTBEAT_US (1 * 1000 * 1000) // 1s
|
||||
#define PERIOD_MATRIX_UPDATE_US (33 * 1000) // 33ms
|
||||
#define PERIOD_NIGHTMODE_CHECK_US (30 * 1000 * 1000) // 30s
|
||||
#define PERIOD_TIME_UPDATE_US (1 * 1000 * 1000) // 1000ms
|
||||
#define PERIOD_PONG_US (10 * 1000) // 10ms
|
||||
#define PERIOD_SNAKE_US (50 * 1000) // 50ms
|
||||
#define PERIOD_STATE_CHANGE_US (10 * 1000 * 1000) // 10s
|
||||
#define PERIOD_TETRIS_US (50 * 1000) // 50ms
|
||||
#define TIMEOUT_LEDDIRECT_US (5 * 1000 * 1000) // 5s
|
||||
#define PERIOD_BRIGHTNESS_UPDATE_US (5 * 60 * 1000 * 1000) // 300s
|
||||
|
||||
#define SHORT_PRESS_MS 100
|
||||
#define LONG_PRESS_MS 2000
|
||||
#define SHORT_PRESS_US (100 * 1000) // 100ms
|
||||
#define LONG_PRESS_US (2 * 1000 * 1000) // 2s
|
||||
#define VERY_LONG_PRESS_US (10 * 1000 * 1000) // 10s
|
||||
|
||||
// Current limit
|
||||
#define CURRENT_LIMIT_LED 2500 // limit the total current consumed by LEDs (mA)
|
||||
#define CURRENT_LIMIT_LED (2500) // limit the total current consumed by LEDs (mA)
|
||||
|
||||
// Brightness ranges range: 0 - 255
|
||||
#define DEFAULT_BRIGHTNESS (40)
|
||||
#define MIN_BRIGHTNESS (10)
|
||||
#define MAX_BRIGHTNESS UINT8_MAX
|
||||
|
||||
// LED smoothing
|
||||
#define DEFAULT_SMOOTHING_FACTOR 0.5
|
||||
#define DEFAULT_SMOOTHING_FACTOR (0.5f)
|
||||
|
||||
// Number of colors in colors array
|
||||
#define NUM_COLORS 7
|
||||
#define NUM_COLORS (7)
|
||||
#define COLOR_ORDER GRB // WS2812B color order
|
||||
|
||||
// LED matrix size
|
||||
#define MATRIX_WIDTH 11
|
||||
#define MATRIX_HEIGHT 11
|
||||
#define MATRIX_WIDTH (11)
|
||||
#define MATRIX_HEIGHT (11)
|
||||
#define NUM_MATRIX (MATRIX_WIDTH * (MATRIX_HEIGHT + 1))
|
||||
|
||||
// State machine states count
|
||||
#define NUM_STATES 6
|
||||
// NTP macros
|
||||
#define BUILD_YEAR (__DATE__ + 7) // Will expand to current year at compile time as string.
|
||||
#define NTP_MINIMUM_RX_YEAR (atoi(BUILD_YEAR) - 1) // Will expand to current year minus one at compile time.
|
||||
#define NTP_START_YEAR (1900) // NTP minimum year is 1900
|
||||
#define NTP_MAX_OFFLINE_TIME_S (7 * 24 * 3600) // Watchdog value, maximum offline time before a restart is triggered
|
||||
|
||||
#endif /* WORDCLOCK_CONSTANTS_H */
|
||||
|
||||
@@ -2,49 +2,88 @@
|
||||
#define WORDCLOCK_ESP8266_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <stdlib.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
extern UDPLogger logger;
|
||||
extern LEDMatrix led_matrix;
|
||||
extern ESP8266WebServer webserver;
|
||||
#define RANGE_LIMIT(X, MIN, MAX) (((X) < (MIN)) ? (MIN) : (((X) > (MAX)) ? (MAX) : (X)))
|
||||
#define RANGE_LIMIT_SUB(X, MIN, MAX, SUB) (((X) < (MIN)) ? (SUB) : (((X) > (MAX)) ? (SUB) : (X)))
|
||||
|
||||
#define EEPROM_SIZE (sizeof(EepromLayout_st) / sizeof(uint8_t))
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// TYPEDEFS
|
||||
// ----------------------------------------------------------------------------------
|
||||
typedef struct
|
||||
{
|
||||
int start_hour;
|
||||
int start_min;
|
||||
int end_hour;
|
||||
int end_min;
|
||||
} NightModeTimes_st;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int nightmode_start_hour;
|
||||
int nightmode_start_min;
|
||||
int nightmode_end_hour;
|
||||
int nightmode_end_min;
|
||||
} NightModeTimes_st;
|
||||
uint8_t red;
|
||||
uint8_t green;
|
||||
uint8_t blue;
|
||||
uint8_t alpha; // note: unused
|
||||
} Color_st;
|
||||
|
||||
typedef enum
|
||||
typedef struct
|
||||
{
|
||||
uint8_t static_brightness; // user-controlled static brightness of LEDs
|
||||
uint8_t dyn_brightness_min; // user-controlled min brightness of LEDs
|
||||
uint8_t dyn_brightness_max; // user-controlled max brightness of LEDs
|
||||
bool flg_dynamic_brightness; // flag if user wants to use daytime dynamic brightness
|
||||
} Brightness_st;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
NightModeTimes_st night_mode_times;
|
||||
Brightness_st brightness_values;
|
||||
Color_st color_values;
|
||||
} EepromLayout_st;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ST_CLOCK,
|
||||
ST_DICLOCK,
|
||||
ST_SPIRAL,
|
||||
ST_TETRIS,
|
||||
ST_SNAKE,
|
||||
ST_PINGPONG
|
||||
} clock_state_en;
|
||||
ST_PINGPONG,
|
||||
ST_HEARTS,
|
||||
NUM_STATES
|
||||
} ClockState_en;
|
||||
|
||||
int EEPROM_read_address(int address);
|
||||
// ----------------------------------------------------------------------------------
|
||||
// FUNCTIONS DECLARATIONS
|
||||
// ----------------------------------------------------------------------------------
|
||||
bool check_wifi_status(void);
|
||||
String leading_zero2digit(int value);
|
||||
uint8_t calculate_dynamic_brightness(uint8_t min_brightness, uint8_t max_brightness, int hours, int minutes, bool summertime);
|
||||
uint8_t update_brightness(void);
|
||||
void check_night_mode(void);
|
||||
void EEPROM_write_to_address(int address, int value);
|
||||
void cold_start_setup(void);
|
||||
void draw_main_color(void);
|
||||
void handle_button(void);
|
||||
void handle_command(void);
|
||||
void handle_current_state(void);
|
||||
void handle_data_request(void);
|
||||
void handle_led_direct(void);
|
||||
void load_main_color(void);
|
||||
void ntp_time_update(void);
|
||||
void limit_value_ranges(void);
|
||||
void log_data(void);
|
||||
void on_state_entry(uint8_t state);
|
||||
void read_settings_from_EEPROM(void);
|
||||
void reset_wifi_credentials(void);
|
||||
void send_heartbeat(void);
|
||||
void set_dynamic_brightness(bool state);
|
||||
void set_main_color(uint8_t red, uint8_t green, uint8_t blue);
|
||||
void set_night_mode(bool on);
|
||||
void state_change(uint8_t newState);
|
||||
void state_change(ClockState_en new_state);
|
||||
void update_matrix(void);
|
||||
void update_state_machine(void);
|
||||
void write_settings_to_EEPROM(void);
|
||||
|
||||
#endif /* WORDCLOCK_ESP8266_H */
|
||||
|
||||
@@ -8,13 +8,25 @@
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
[platformio]
|
||||
default_envs = nodemcuv2
|
||||
|
||||
[env]
|
||||
platform = espressif8266@2.6.3
|
||||
board = nodemcuv2
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
adafruit/Adafruit NeoMatrix@^1.3.0
|
||||
adafruit/Adafruit NeoPixel@^1.11.0
|
||||
tzapu/WiFiManager@^0.16.0
|
||||
densaugeo/base64@^1.4.0
|
||||
fastled/FastLED@3.7.6
|
||||
marcmerlin/FastLED NeoMatrix@^1.2
|
||||
tzapu/WiFiManager@^2.0.17
|
||||
build_flags =
|
||||
-DFASTLED_ESP8266_RAW_PIN_ORDER
|
||||
|
||||
[env:nodemcuv2]
|
||||
monitor_speed = 115200
|
||||
monitor_filters = direct
|
||||
|
||||
[env:nodemcuv2_ota]
|
||||
upload_protocol = espota
|
||||
upload_port = wordclock.local
|
||||
|
||||
775
res/frontplate/WordClock_Front_Paths.svg
Normal file
775
res/frontplate/WordClock_Front_Paths.svg
Normal file
@@ -0,0 +1,775 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="500mm"
|
||||
height="500mm"
|
||||
viewBox="0 0 500 500"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
id="layer1">
|
||||
<g
|
||||
id="g1">
|
||||
<path
|
||||
id="rect2951"
|
||||
style="display:inline;fill-rule:evenodd;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 0,0 H 500 V 500 H 0 Z" />
|
||||
</g>
|
||||
<g
|
||||
id="g3"
|
||||
style="display:inline">
|
||||
<path
|
||||
d="M 81.224283,86.25 V 72.10854 H 91.44935 v 1.668808 h -8.353687 v 4.331184 h 7.823141 v 1.659162 h -7.823141 v 4.813498 h 8.681661 V 86.25 Z"
|
||||
id="text3140"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="M 147.16962,86.25 V 72.10854 h 6.27009 q 1.89067,0 2.87459,0.385852 0.98393,0.376205 1.57235,1.340834 0.58842,0.964629 0.58842,2.13183 0,1.504821 -0.97427,2.536974 -0.97428,1.032153 -3.00964,1.311895 0.74276,0.356913 1.12861,0.704179 0.81994,0.752411 1.55305,1.881027 L 159.63263,86.25 h -2.3537 l -1.87138,-2.942118 q -0.81993,-1.27331 -1.35048,-1.948551 -0.53054,-0.67524 -0.95498,-0.945336 -0.41479,-0.270096 -0.84887,-0.376205 -0.31833,-0.06752 -1.0418,-0.06752 H 149.041 V 86.25 Z m 1.87138,-7.900311 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.270096 1.09968,-0.848873 0.3762,-0.588424 0.3762,-1.27331 0,-1.003214 -0.73311,-1.649516 -0.72347,-0.646301 -2.29582,-0.646301 H 149.041 Z"
|
||||
id="text1"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 113.79905,81.706598 1.76527,-0.154341 q 0.1254,1.061092 0.57878,1.745979 0.46302,0.67524 1.42765,1.099677 0.96463,0.41479 2.17041,0.41479 1.07074,0 1.89068,-0.318328 0.81993,-0.318327 1.21543,-0.868166 0.40514,-0.559484 0.40514,-1.215432 0,-0.665594 -0.38585,-1.157555 -0.38585,-0.501607 -1.27331,-0.839227 -0.56913,-0.221865 -2.51768,-0.684886 -1.94855,-0.472669 -2.7299,-0.887459 -1.01286,-0.530546 -1.51447,-1.311895 -0.49196,-0.790996 -0.49196,-1.765271 0,-1.070738 0.60772,-1.996782 0.60772,-0.93569 1.77492,-1.418005 1.1672,-0.482314 2.59485,-0.482314 1.57234,0 2.76848,0.511253 1.20579,0.501607 1.85209,1.485529 0.6463,0.983921 0.69453,2.228293 l -1.79421,0.135048 q -0.14469,-1.340835 -0.98392,-2.025721 -0.82958,-0.684887 -2.4598,-0.684887 -1.69775,0 -2.4791,0.627009 -0.7717,0.617363 -0.7717,1.495175 0,0.762057 0.54984,1.254018 0.54019,0.49196 2.81671,1.01286 2.28617,0.511253 3.13505,0.897105 1.23472,0.569131 1.82315,1.446943 0.58842,0.868166 0.58842,2.006428 0,1.128616 -0.6463,2.13183 -0.6463,0.993568 -1.86174,1.553053 -1.20578,0.549838 -2.72025,0.549838 -1.91961,0 -3.22186,-0.559485 -1.2926,-0.559484 -2.03537,-1.678454 -0.73311,-1.128616 -0.7717,-2.54662 z"
|
||||
id="text3144"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="M 185.09807,86.25 V 72.10854 h 1.87138 V 86.25 Z"
|
||||
id="text3971"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 213.54904,81.706598 1.76527,-0.154341 q 0.12541,1.061092 0.57878,1.745979 0.46302,0.67524 1.42765,1.099677 0.96463,0.41479 2.17042,0.41479 1.07074,0 1.89067,-0.318328 0.81993,-0.318327 1.21543,-0.868166 0.40515,-0.559484 0.40515,-1.215432 0,-0.665594 -0.38586,-1.157555 -0.38585,-0.501607 -1.27331,-0.839227 -0.56913,-0.221865 -2.51768,-0.684886 -1.94855,-0.472669 -2.7299,-0.887459 -1.01286,-0.530546 -1.51446,-1.311895 -0.49196,-0.790996 -0.49196,-1.765271 0,-1.070738 0.60771,-1.996782 0.60772,-0.93569 1.77492,-1.418005 1.1672,-0.482314 2.59485,-0.482314 1.57235,0 2.76849,0.511253 1.20578,0.501607 1.85208,1.485529 0.6463,0.983921 0.69454,2.228293 l -1.79421,0.135048 q -0.1447,-1.340835 -0.98393,-2.025721 -0.82958,-0.684887 -2.4598,-0.684887 -1.69775,0 -2.4791,0.627009 -0.7717,0.617363 -0.7717,1.495175 0,0.762057 0.54984,1.254018 0.54019,0.49196 2.81672,1.01286 2.28617,0.511253 3.13504,0.897105 1.23473,0.569131 1.82315,1.446943 0.58842,0.868166 0.58842,2.006428 0,1.128616 -0.6463,2.13183 -0.6463,0.993568 -1.86173,1.553053 -1.20579,0.549838 -2.72026,0.549838 -1.91961,0 -3.22186,-0.559485 -1.2926,-0.559484 -2.03536,-1.678454 -0.73312,-1.128616 -0.77171,-2.54662 z"
|
||||
id="text3975"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="M 251.58843,86.25 V 73.777348 h -4.65916 V 72.10854 h 11.20899 v 1.668808 h -4.67845 V 86.25 Z"
|
||||
id="text3979"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="M 280.12139,86.25 V 72.10854 h 1.91961 l 7.42764,11.102879 V 72.10854 h 1.79421 V 86.25 h -1.91961 L 281.9156,75.137475 V 86.25 Z"
|
||||
id="text3983"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="M 314.58682,86.25 V 72.10854 h 9.54018 v 1.668808 h -7.6688 v 4.379415 h 6.63665 v 1.668808 H 316.4582 V 86.25 Z"
|
||||
id="text3987"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 355.92041,72.10854 h 1.87138 v 8.170407 q 0,2.13183 -0.48231,3.385848 -0.48232,1.254017 -1.74598,2.045013 -1.25402,0.781349 -3.29903,0.781349 -1.98714,0 -3.2508,-0.684886 -1.26366,-0.684887 -1.80386,-1.97749 -0.54019,-1.302249 -0.54019,-3.549834 V 72.10854 h 1.87138 v 8.160761 q 0,1.842441 0.33762,2.720253 0.34727,0.868166 1.17685,1.340834 0.83923,0.472669 2.04501,0.472669 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.598066 z m -6.42443,-0.868166 v -1.977489 h 1.81351 v 1.977489 z m 3.59807,0 v -1.977489 h 1.8135 v 1.977489 z"
|
||||
id="text3991"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Ü" />
|
||||
<path
|
||||
d="M 379.87136,86.25 V 72.10854 h 1.91961 l 7.42764,11.102879 V 72.10854 h 1.79421 V 86.25 h -1.91961 L 381.66557,75.137475 V 86.25 Z"
|
||||
id="text3995"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="M 414.33679,86.25 V 72.10854 h 9.54018 v 1.668808 h -7.6688 v 4.379415 h 6.63665 v 1.668808 h -6.63665 V 86.25 Z"
|
||||
id="text3999"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 85.227493,119.50001 -5.479092,-14.14146 h 2.025721 l 3.675236,10.2733 q 0.443729,1.23472 0.742764,2.31511 0.327974,-1.15756 0.762057,-2.31511 l 3.819931,-10.2733 h 1.909965 l -5.53697,14.14146 z"
|
||||
id="text4003"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="V" />
|
||||
<path
|
||||
d="m 118.59808,119.50001 v -14.14146 h 1.87138 v 14.14146 z"
|
||||
id="text4007"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.72428,119.50001 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4011"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 180.41962,119.50001 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98393,0.3762 1.57235,1.34083 0.58842,0.96463 0.58842,2.13183 0,1.50482 -0.97427,2.53698 -0.97428,1.03215 -3.00964,1.31189 0.74276,0.35692 1.12861,0.70418 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84887 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94534 -0.41479,-0.27009 -0.84887,-0.3762 -0.31833,-0.0675 -1.0418,-0.0675 H 182.291 v 6.27974 z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84888 0.3762,-0.58842 0.3762,-1.27331 0,-1.00321 -0.73311,-1.64951 -0.72347,-0.6463 -2.29582,-0.6463 H 182.291 Z"
|
||||
id="text4015"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 218.33843,119.50001 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4019"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 247.47428,119.50001 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4023"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 281.70338,119.50001 v -14.14146 h 1.87138 v 12.47265 h 6.96462 v 1.66881 z"
|
||||
id="text4027"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 313.36174,119.50001 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 v 1.66881 z"
|
||||
id="text4031"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 347.22428,119.50001 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4035"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 379.94853,119.50001 v -14.14146 h 1.87138 v 5.80706 h 7.35047 v -5.80706 h 1.87138 v 14.14146 h -1.87138 v -6.66559 h -7.35047 v 6.66559 z"
|
||||
id="text4039"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 413.12136,119.50001 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11253 v 11.11253 z"
|
||||
id="text4043"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 80.611744,152.75 v -1.73633 l 7.244363,-9.05787 q 0.771703,-0.96463 1.466236,-1.67845 h -7.890664 v -1.66881 h 10.128603 v 1.66881 l -7.938896,9.81027 -0.858519,0.99357 h 9.028926 V 152.75 Z"
|
||||
id="text4047"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 114.17043,152.75 -3.75241,-14.14146 h 1.91961 l 2.15112,9.27008 q 0.34727,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63666,-2.61414 l 2.69131,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.2701,-1.34083 0.70418,-3.07717 l 2.21865,-9.0868 h 1.88102 l -3.8778,14.14146 h -1.80386 l -2.9807,-10.7749 q -0.37621,-1.35049 -0.44373,-1.65917 -0.22187,0.97428 -0.41479,1.65917 l -3,10.7749 z"
|
||||
id="text4051"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 146.13265,152.75 5.43086,-14.14146 h 2.01607 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4055"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 180.37139,152.75 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 152.75 h -1.91961 L 182.1656,141.63748 V 152.75 Z"
|
||||
id="text4059"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 213.61174,152.75 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 V 152.75 Z"
|
||||
id="text4063"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 251.59806,152.75 v -14.14146 h 1.87138 V 152.75 Z"
|
||||
id="text4067"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 286.2082,147.20338 v -1.65916 l 5.99034,-0.01 v 5.24758 q -1.37942,1.09967 -2.84565,1.65916 -1.46624,0.54984 -3.00964,0.54984 -2.0836,0 -3.79099,-0.88746 -1.69775,-0.89711 -2.56592,-2.58521 -0.86816,-1.6881 -0.86816,-3.7717 0,-2.0643 0.85852,-3.84887 0.86816,-1.7942 2.48874,-2.66237 1.62058,-0.86817 3.73311,-0.86817 1.53376,0 2.76849,0.50161 1.24437,0.49196 1.94855,1.37942 0.70418,0.88746 1.07074,2.31511 l -1.6881,0.46302 q -0.31833,-1.08038 -0.791,-1.69775 -0.47267,-0.61736 -1.35048,-0.98392 -0.87781,-0.3762 -1.94855,-0.3762 -1.28296,0 -2.21865,0.39549 -0.93569,0.38586 -1.51447,1.02251 -0.56913,0.63666 -0.88745,1.39871 -0.5402,1.3119 -0.5402,2.84566 0,1.89067 0.64631,3.16398 0.65594,1.27331 1.90031,1.89067 1.24438,0.61737 2.64309,0.61737 1.21543,0 2.37298,-0.46303 1.15756,-0.47266 1.75563,-1.00321 v -2.63344 z"
|
||||
id="text4071"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="G" />
|
||||
<path
|
||||
d="m 313.44856,152.75 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 152.75 h -1.87138 v -6.66559 h -7.35047 V 152.75 Z"
|
||||
id="text4075"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 351.22749,152.75 -5.47909,-14.14146 h 2.02572 l 3.67524,10.2733 q 0.44373,1.23472 0.74276,2.31511 0.32798,-1.15756 0.76206,-2.31511 l 3.81993,-10.2733 h 1.90996 L 353.1471,152.75 Z"
|
||||
id="text4079"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="V" />
|
||||
<path
|
||||
d="m 378.77168,145.86255 q 0,-3.5209 1.89068,-5.50803 1.89067,-1.99678 4.88102,-1.99678 1.95819,0 3.53054,0.93569 1.57234,0.93569 2.39228,2.61414 0.82958,1.66881 0.82958,3.79099 0,2.15113 -0.86817,3.84887 -0.86816,1.69775 -2.4598,2.57556 -1.59164,0.86817 -3.43408,0.86817 -1.99678,0 -3.56913,-0.96463 -1.57234,-0.96463 -2.38263,-2.63344 -0.81029,-1.66881 -0.81029,-3.53054 z m 1.92926,0.0289 q 0,2.55627 1.36977,4.03215 1.37942,1.46623 3.45338,1.46623 2.11253,0 3.47266,-1.48553 1.36977,-1.48552 1.36977,-4.21542 0,-1.72669 -0.58842,-3.00965 -0.57878,-1.2926 -1.70739,-1.99678 -1.11897,-0.71382 -2.51769,-0.71382 -1.98713,0 -3.42443,1.36977 -1.42765,1.36013 -1.42765,4.55305 z"
|
||||
id="text4083"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="O" />
|
||||
<path
|
||||
d="m 413.16959,152.75 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98392,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00965,1.3119 0.74277,0.35691 1.12862,0.70417 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84887 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94533 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 V 152.75 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72348,-0.6463 -2.29582,-0.6463 h -4.47588 z"
|
||||
id="text4087"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 81.185698,186 v -14.14146 h 5.334398 q 1.408358,0 2.151123,0.13505 1.041799,0.17363 1.745978,0.66559 0.704179,0.48232 1.128616,1.36013 0.434083,0.87781 0.434083,1.92926 0,1.80385 -1.147909,3.05787 -1.147908,1.24437 -4.147904,1.24437 H 83.057078 V 186 Z m 1.87138,-7.418 h 3.655944 q 1.813502,0 2.575559,-0.67524 0.762057,-0.67524 0.762057,-1.90032 0,-0.88745 -0.453376,-1.51446 -0.443729,-0.63666 -1.176847,-0.83923 -0.472668,-0.1254 -1.745978,-0.1254 h -3.617359 z"
|
||||
id="text4091"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="P" />
|
||||
<path
|
||||
d="m 118.59809,186 v -14.14146 h 1.87138 V 186 Z"
|
||||
id="text4095"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.60853,186 v -14.14146 h 1.87138 v 7.01285 l 7.0225,-7.01285 h 2.53697 l -5.93247,5.7299 6.19292,8.41156 h -2.46945 l -5.03536,-7.15755 -2.31511,2.25724 V 186 Z"
|
||||
id="text4099"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="K" />
|
||||
<path
|
||||
d="m 179.38265,186 5.43086,-14.14146 h 2.01607 L 192.61735,186 h -2.13183 l -1.64951,-4.28295 h -5.91318 L 181.36978,186 Z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4103"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 223.7307,181.04181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4107"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 246.94855,186 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 186 h -1.87138 v -6.66559 h -7.35047 V 186 Z"
|
||||
id="text4111"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 289.42041,171.85854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4115"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 313.37139,186 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 186 h -1.91961 L 315.1656,174.88748 V 186 Z"
|
||||
id="text4119"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 345.63265,186 5.43086,-14.14146 h 2.01607 L 358.86735,186 h -2.13183 l -1.64951,-4.28295 h -5.91318 L 347.61978,186 Z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4123"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 389.98067,181.04181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4127"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 413.19853,186 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 186 h -1.87138 v -6.66559 h -7.35047 V 186 Z"
|
||||
id="text4131"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 80.698561,219.25 v -14.14146 h 1.87138 v 5.80707 h 7.350472 v -5.80707 h 1.87138 V 219.25 h -1.87138 v -6.66559 H 82.569941 V 219.25 Z"
|
||||
id="text4135"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 112.88265,219.25 5.43086,-14.14146 h 2.01608 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80707 h 4.79421 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00322,-2.93247 -0.27009,1.36013 -0.76205,2.70096 z"
|
||||
id="text4139"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 148.70338,219.25 v -14.14146 h 1.87138 v 12.47265 h 6.96462 V 219.25 Z"
|
||||
id="text4143"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 180.85853,219.25 v -14.14146 h 5.30546 q 1.62057,0 2.59485,0.43408 0.98392,0.42444 1.53376,1.32154 0.55948,0.88746 0.55948,1.86174 0,0.90675 -0.49196,1.70739 -0.49196,0.80064 -1.48553,1.2926 1.28296,0.37621 1.96785,1.28296 0.69453,0.90675 0.69453,2.14148 0,0.99356 -0.42444,1.85208 -0.41479,0.84888 -1.03215,1.3119 -0.61736,0.46302 -1.55305,0.70418 -0.92605,0.23151 -2.27653,0.23151 z m 1.87138,-8.19935 h 3.05787 q 1.24437,0 1.78457,-0.16398 0.71382,-0.21222 1.07073,-0.70418 0.36656,-0.49196 0.36656,-1.23473 0,-0.70418 -0.33762,-1.23472 -0.33762,-0.54019 -0.96463,-0.73312 -0.62701,-0.20257 -2.15112,-0.20257 h -2.82636 z m 0,6.53054 h 3.52089 q 0.90675,0 1.27331,-0.0675 0.64631,-0.11576 1.08039,-0.38585 0.43408,-0.2701 0.71382,-0.78135 0.27975,-0.5209 0.27975,-1.19614 0,-0.791 -0.40515,-1.36978 -0.40514,-0.58842 -1.12861,-0.81993 -0.71383,-0.24116 -2.06431,-0.24116 h -3.27009 z"
|
||||
id="text4147"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="B" />
|
||||
<path
|
||||
d="m 212.48795,219.25 v -14.14146 h 2.81672 l 3.34726,10.01285 q 0.46302,1.39871 0.67524,2.09324 0.24116,-0.7717 0.75241,-2.26687 l 3.38585,-9.83922 h 2.51768 V 219.25 h -1.80386 v -11.836 l -4.10932,11.836 h -1.6881 l -4.09002,-12.03857 V 219.25 Z"
|
||||
id="text4151"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="M" />
|
||||
<path
|
||||
d="m 247.47428,219.25 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 219.25 Z"
|
||||
id="text4155"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 281.70338,219.25 v -14.14146 h 1.87138 v 12.47265 h 6.96462 V 219.25 Z"
|
||||
id="text4159"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 314.58682,219.25 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 H 316.4582 V 219.25 Z"
|
||||
id="text4163"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 355.92041,205.10854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z m -6.42443,-0.86817 v -1.97749 h 1.81351 v 1.97749 z m 3.59807,0 v -1.97749 h 1.8135 v 1.97749 z"
|
||||
id="text4167"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Ü" />
|
||||
<path
|
||||
d="m 379.87136,219.25 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 219.25 h -1.91961 l -7.42764,-11.11252 V 219.25 Z"
|
||||
id="text4171"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 414.33679,219.25 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 h -6.63665 V 219.25 Z"
|
||||
id="text4175"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 79.487951,252.49998 v -14.14146 h 2.816717 l 3.347262,10.01285 q 0.463022,1.39871 0.67524,2.09325 0.241158,-0.77171 0.752411,-2.26688 l 3.385847,-9.83922 h 2.517682 v 14.14146 h -1.803856 v -11.83599 l -4.109319,11.83599 h -1.688101 l -4.090027,-12.03856 v 12.03856 z"
|
||||
id="text4179"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="M" />
|
||||
<path
|
||||
d="m 118.59809,252.49998 v -14.14146 h 1.87138 v 14.14146 z"
|
||||
id="text4183"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 151.83843,252.49998 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4187"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 185.08843,252.49998 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4191"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 214.22428,252.49998 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33119 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.6688 z"
|
||||
id="text4195"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 246.91959,252.49998 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38586 0.98392,0.3762 1.57235,1.34083 0.58842,0.96463 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03216 -3.00965,1.3119 0.74277,0.35691 1.12862,0.70418 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84886 h -2.3537 l -1.87138,-2.94211 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94534 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 V 252.5 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.27009 1.09968,-0.84887 0.3762,-0.58842 0.3762,-1.27331 0,-1.00321 -0.73311,-1.64951 -0.72348,-0.64631 -2.29582,-0.64631 h -4.47588 z"
|
||||
id="text4199"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 280.12139,252.49998 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11252 v 11.11252 z"
|
||||
id="text4203"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 312.38265,252.49998 5.43086,-14.14146 h 2.01607 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80706 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78457 -1.00321,-2.93248 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4207"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 356.7307,247.54179 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.5209 -1.52412,1.20578 -3.73312,1.20578 -2.28617,0 -3.72346,-0.92604 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64952 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08038 1.44694,1.08039 2.01607,3.03858 l -1.84244,0.43409 q -0.49196,-1.54341 -1.42765,-2.24759 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.3119 -0.44373,2.71061 0,1.80386 0.5209,3.15434 0.53054,1.34083 1.63987,2.00642 1.10932,0.6656 2.40192,0.6656 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69132 z"
|
||||
id="text4211"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 379.94853,252.49998 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 v 14.14146 h -1.87138 v -6.66558 h -7.35047 v 6.66558 z"
|
||||
id="text4215"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 417.8384,252.49998 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4219"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="M 81.224283,285.75 V 271.60854 H 91.44935 v 1.66881 h -8.353687 v 4.33118 h 7.823141 v 1.65916 h -7.823141 v 4.8135 h 8.681661 V 285.75 Z"
|
||||
id="text4223"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 118.59808,285.75 v -14.14146 h 1.87138 V 285.75 Z"
|
||||
id="text4227"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.12139,285.75 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 285.75 h -1.91961 L 148.9156,274.63748 V 285.75 Z"
|
||||
id="text4231"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 180.29904,281.2066 1.76527,-0.15434 q 0.12541,1.06109 0.57878,1.74598 0.46302,0.67524 1.42765,1.09967 0.96463,0.41479 2.17042,0.41479 1.07074,0 1.89067,-0.31832 0.81993,-0.31833 1.21543,-0.86817 0.40515,-0.55949 0.40515,-1.21543 0,-0.6656 -0.38586,-1.15756 -0.38585,-0.5016 -1.27331,-0.83922 -0.56913,-0.22187 -2.51768,-0.68489 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.51446,-1.3119 -0.49196,-0.79099 -0.49196,-1.76527 0,-1.07073 0.60771,-1.99678 0.60772,-0.93569 1.77492,-1.418 1.1672,-0.48232 2.59485,-0.48232 1.57235,0 2.76849,0.51126 1.20578,0.5016 1.85208,1.48552 0.6463,0.98393 0.69454,2.2283 l -1.79421,0.13505 q -0.1447,-1.34084 -0.98393,-2.02573 -0.82958,-0.68488 -2.4598,-0.68488 -1.69775,0 -2.4791,0.62701 -0.7717,0.61736 -0.7717,1.49517 0,0.76206 0.54984,1.25402 0.54019,0.49196 2.81672,1.01286 2.28617,0.51125 3.13504,0.8971 1.23473,0.56914 1.82315,1.44695 0.58842,0.86816 0.58842,2.00643 0,1.12861 -0.6463,2.13183 -0.6463,0.99356 -1.86173,1.55305 -1.20579,0.54984 -2.72026,0.54984 -1.91961,0 -3.22186,-0.55949 -1.2926,-0.55948 -2.03536,-1.67845 -0.73312,-1.12862 -0.77171,-2.54662 z"
|
||||
id="text4235"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 222.92041,271.60854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4239"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="M 247.17041,285.75 243.418,271.60854 h 1.91962 l 2.15112,9.27008 q 0.34726,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63665,-2.61414 l 2.69132,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.27009,-1.34083 0.70418,-3.07717 l 2.21864,-9.0868 h 1.88103 L 257.72345,285.75 h -1.80386 l -2.9807,-10.7749 q -0.3762,-1.35049 -0.44373,-1.65917 -0.22186,0.97428 -0.41479,1.65917 l -2.99999,10.7749 z"
|
||||
id="text4243"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 289.42041,271.60854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4247"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 313.36174,285.75 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 V 285.75 Z"
|
||||
id="text4251"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 346.92043,285.75 -3.75241,-14.14146 h 1.91961 l 2.15112,9.27008 q 0.34727,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63666,-2.61414 l 2.69131,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.2701,-1.34083 0.70418,-3.07717 l 2.21865,-9.0868 h 1.88102 l -3.8778,14.14146 h -1.80386 l -2.9807,-10.7749 q -0.37621,-1.35049 -0.44373,-1.65917 -0.22187,0.97428 -0.41479,1.65917 l -3,10.7749 z"
|
||||
id="text4255"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 380.47425,285.75 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 285.75 Z"
|
||||
id="text4259"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 417.84804,285.75 v -14.14146 h 1.87138 V 285.75 Z"
|
||||
id="text4263"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 80.640683,319 v -14.14146 h 4.871376 q 1.649515,0 2.517681,0.20257 1.215433,0.27974 2.073952,1.01286 1.11897,0.94534 1.668808,2.42122 0.559485,1.46624 0.559485,3.35691 0,1.61093 -0.376205,2.8553 -0.376205,1.24437 -0.964629,2.06431 -0.588424,0.81029 -1.292603,1.28295 -0.694532,0.46303 -1.6881,0.70418 Q 87.026526,319 85.74357,319 Z m 1.87138,-1.66881 h 3.019288 q 1.398712,0 2.189708,-0.26045 0.800642,-0.26045 1.27331,-0.73312 0.665594,-0.66559 1.032153,-1.78456 0.376205,-1.12862 0.376205,-2.7299 0,-2.21865 -0.733118,-3.40514 -0.723471,-1.19614 -1.76527,-1.60128 -0.752411,-0.28939 -2.421219,-0.28939 h -2.971057 z"
|
||||
id="text4267"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="D" />
|
||||
<path
|
||||
d="m 113.91962,319 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98393,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00964,1.3119 0.74276,0.35691 1.12861,0.70417 0.81994,0.75241 1.55305,1.88103 L 126.38263,319 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94533 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 H 115.791 V 319 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72347,-0.6463 -2.29582,-0.6463 H 115.791 Z"
|
||||
id="text4271"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 147.72428,319 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 319 Z"
|
||||
id="text4275"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 185.09807,319 v -14.14146 h 1.87138 V 319 Z"
|
||||
id="text4279"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 214.83682,319 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 H 216.7082 V 319 Z"
|
||||
id="text4283"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 256.1704,304.85854 h 1.87138 v 8.17041 q 0,2.13183 -0.48232,3.38584 -0.48231,1.25402 -1.74597,2.04502 -1.25402,0.78135 -3.29904,0.78135 -1.98713,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80385,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34726,0.86817 1.17684,1.34084 0.83923,0.47267 2.04502,0.47267 2.0643,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4287"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 280.12139,319 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 319 h -1.91961 L 281.9156,307.88748 V 319 Z"
|
||||
id="text4291"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 317.97749,319 -5.47909,-14.14146 h 2.02572 l 3.67524,10.2733 q 0.44373,1.23472 0.74276,2.31511 0.32798,-1.15756 0.76206,-2.31511 l 3.81993,-10.2733 h 1.90996 L 319.8971,319 Z"
|
||||
id="text4295"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="V" />
|
||||
<path
|
||||
d="m 351.34807,319 v -14.14146 h 1.87138 V 319 Z"
|
||||
id="text4299"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 380.47425,319 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 319 Z"
|
||||
id="text4303"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 413.16959,319 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98392,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00965,1.3119 0.74277,0.35691 1.12862,0.70417 0.81994,0.75241 1.55305,1.88103 L 425.6326,319 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94533 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 V 319 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72348,-0.6463 -2.29582,-0.6463 h -4.47588 z"
|
||||
id="text4307"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 80.549043,347.7066 1.765271,-0.15434 q 0.125402,1.06109 0.578777,1.74598 0.463022,0.67524 1.427651,1.09967 0.964629,0.41479 2.170415,0.41479 1.070738,0 1.890673,-0.31832 0.819934,-0.31833 1.215432,-0.86817 0.405144,-0.55949 0.405144,-1.21543 0,-0.6656 -0.385851,-1.15756 -0.385852,-0.5016 -1.27331,-0.83922 -0.569131,-0.22187 -2.517682,-0.68489 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.514467,-1.3119 -0.491961,-0.79099 -0.491961,-1.76527 0,-1.07073 0.607717,-1.99678 0.607716,-0.93569 1.774917,-1.418 1.167201,-0.48232 2.594852,-0.48232 1.572345,0 2.768484,0.51126 1.205787,0.5016 1.852088,1.48552 0.646301,0.98393 0.694533,2.2283 l -1.79421,0.13505 q -0.144694,-1.34084 -0.983921,-2.02573 -0.829581,-0.68488 -2.459804,-0.68488 -1.697747,0 -2.479096,0.62701 -0.771704,0.61736 -0.771704,1.49517 0,0.76206 0.549839,1.25402 0.540192,0.49196 2.816716,1.01286 2.286171,0.51125 3.135044,0.8971 1.234725,0.56914 1.823149,1.44695 0.588423,0.86816 0.588423,2.00643 0,1.12861 -0.646301,2.13183 -0.646301,0.99356 -1.861734,1.55305 -1.205786,0.54984 -2.720253,0.54984 -1.919612,0 -3.221861,-0.55949 -1.292602,-0.55948 -2.035367,-1.67845 -0.733118,-1.12862 -0.771703,-2.54662 z"
|
||||
id="text4311"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 114.47431,352.25 v -14.14146 h 10.22506 v 1.66881 h -8.35368 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 352.25 Z"
|
||||
id="text4315"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 157.2307,347.29181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4319"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 180.44856,352.25 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 352.25 h -1.87138 v -6.66559 h -7.35047 V 352.25 Z"
|
||||
id="text4323"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 213.54904,347.7066 1.76527,-0.15434 q 0.12541,1.06109 0.57878,1.74598 0.46302,0.67524 1.42765,1.09967 0.96463,0.41479 2.17042,0.41479 1.07074,0 1.89067,-0.31832 0.81993,-0.31833 1.21543,-0.86817 0.40515,-0.55949 0.40515,-1.21543 0,-0.6656 -0.38586,-1.15756 -0.38585,-0.5016 -1.27331,-0.83922 -0.56913,-0.22187 -2.51768,-0.68489 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.51446,-1.3119 -0.49196,-0.79099 -0.49196,-1.76527 0,-1.07073 0.60771,-1.99678 0.60772,-0.93569 1.77492,-1.418 1.1672,-0.48232 2.59485,-0.48232 1.57235,0 2.76849,0.51126 1.20578,0.5016 1.85208,1.48552 0.6463,0.98393 0.69454,2.2283 l -1.79421,0.13505 q -0.1447,-1.34084 -0.98393,-2.02573 -0.82958,-0.68488 -2.4598,-0.68488 -1.69775,0 -2.4791,0.62701 -0.7717,0.61736 -0.7717,1.49517 0,0.76206 0.54984,1.25402 0.54019,0.49196 2.81672,1.01286 2.28617,0.51125 3.13504,0.8971 1.23473,0.56914 1.82315,1.44695 0.58842,0.86816 0.58842,2.00643 0,1.12861 -0.6463,2.13183 -0.6463,0.99356 -1.86173,1.55305 -1.20579,0.54984 -2.72026,0.54984 -1.91961,0 -3.22186,-0.55949 -1.2926,-0.55948 -2.03536,-1.67845 -0.73312,-1.12862 -0.77171,-2.54662 z"
|
||||
id="text4327"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 245.77171,345.36255 q 0,-3.5209 1.89068,-5.50803 1.89067,-1.99678 4.88102,-1.99678 1.95819,0 3.53054,0.93569 1.57235,0.93569 2.39228,2.61414 0.82958,1.66881 0.82958,3.79099 0,2.15113 -0.86817,3.84887 -0.86816,1.69775 -2.4598,2.57556 -1.59164,0.86817 -3.43408,0.86817 -1.99678,0 -3.56912,-0.96463 -1.57235,-0.96463 -2.38264,-2.63344 -0.81029,-1.66881 -0.81029,-3.53054 z m 1.92926,0.0289 q 0,2.55627 1.36977,4.03215 1.37942,1.46623 3.45338,1.46623 2.11253,0 3.47266,-1.48553 1.36977,-1.48552 1.36977,-4.21542 0,-1.72669 -0.58842,-3.00965 -0.57878,-1.2926 -1.70739,-1.99678 -1.11897,-0.71382 -2.51769,-0.71382 -1.98713,0 -3.42443,1.36977 -1.42765,1.36013 -1.42765,4.55305 z"
|
||||
id="text4331"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="O" />
|
||||
<path
|
||||
d="m 280.60853,352.25 v -14.14146 h 5.30546 q 1.62057,0 2.59485,0.43408 0.98392,0.42444 1.53376,1.32154 0.55948,0.88746 0.55948,1.86174 0,0.90675 -0.49196,1.70739 -0.49196,0.80064 -1.48553,1.2926 1.28296,0.37621 1.96785,1.28296 0.69453,0.90675 0.69453,2.14148 0,0.99356 -0.42444,1.85208 -0.41479,0.84888 -1.03215,1.3119 -0.61736,0.46302 -1.55305,0.70418 -0.92605,0.23151 -2.27653,0.23151 z m 1.87138,-8.19935 h 3.05787 q 1.24437,0 1.78457,-0.16398 0.71382,-0.21222 1.07073,-0.70418 0.36656,-0.49196 0.36656,-1.23473 0,-0.70418 -0.33762,-1.23472 -0.33762,-0.54019 -0.96463,-0.73312 -0.62701,-0.20257 -2.15112,-0.20257 h -2.82636 z m 0,6.53054 h 3.52089 q 0.90675,0 1.27331,-0.0675 0.64631,-0.11576 1.08039,-0.38585 0.43408,-0.2701 0.71382,-0.78135 0.27975,-0.5209 0.27975,-1.19614 0,-0.791 -0.40515,-1.36978 -0.40514,-0.58842 -1.12861,-0.81993 -0.71383,-0.24116 -2.06431,-0.24116 h -3.27009 z"
|
||||
id="text4335"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="B" />
|
||||
<path
|
||||
d="m 312.38265,352.25 5.43086,-14.14146 h 2.01607 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4339"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 356.7307,347.29181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4343"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 379.94853,352.25 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 352.25 h -1.87138 v -6.66559 h -7.35047 V 352.25 Z"
|
||||
id="text4347"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 417.8384,352.25 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 V 352.25 Z"
|
||||
id="text4351"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 80.549043,380.95657 1.765271,-0.15434 q 0.125402,1.06109 0.578777,1.74598 0.463022,0.67524 1.427651,1.09967 0.964629,0.41479 2.170415,0.41479 1.070738,0 1.890673,-0.31833 0.819934,-0.31832 1.215432,-0.86816 0.405144,-0.55949 0.405144,-1.21543 0,-0.6656 -0.385851,-1.15756 -0.385852,-0.50161 -1.27331,-0.83923 -0.569131,-0.22186 -2.517682,-0.68488 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.514467,-1.3119 -0.491961,-0.79099 -0.491961,-1.76527 0,-1.07073 0.607717,-1.99678 0.607716,-0.93569 1.774917,-1.418 1.167201,-0.48232 2.594852,-0.48232 1.572345,0 2.768484,0.51126 1.205787,0.5016 1.852088,1.48552 0.646301,0.98393 0.694533,2.2283 l -1.79421,0.13505 q -0.144694,-1.34084 -0.983921,-2.02573 -0.829581,-0.68488 -2.459804,-0.68488 -1.697747,0 -2.479096,0.62701 -0.771704,0.61736 -0.771704,1.49517 0,0.76206 0.549839,1.25402 0.540192,0.49196 2.816716,1.01286 2.286171,0.51125 3.135044,0.8971 1.234725,0.56914 1.823149,1.44695 0.588423,0.86816 0.588423,2.00643 0,1.12861 -0.646301,2.13183 -0.646301,0.99356 -1.861734,1.55305 -1.205786,0.54984 -2.720253,0.54984 -1.919612,0 -3.221861,-0.55949 -1.292602,-0.55948 -2.035367,-1.67845 -0.733118,-1.12862 -0.771703,-2.54662 z"
|
||||
id="text4355"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 118.59808,385.49997 v -14.14146 h 1.87138 v 14.14146 z"
|
||||
id="text4359"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.72428,385.49997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4363"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 180.85853,385.49997 v -14.14146 h 5.30546 q 1.62057,0 2.59485,0.43408 0.98392,0.42444 1.53376,1.32154 0.55948,0.88746 0.55948,1.86174 0,0.90675 -0.49196,1.70739 -0.49196,0.80064 -1.48553,1.2926 1.28296,0.37621 1.96785,1.28296 0.69453,0.90675 0.69453,2.14148 0,0.99356 -0.42444,1.85208 -0.41479,0.84888 -1.03215,1.3119 -0.61736,0.46302 -1.55305,0.70418 -0.92605,0.23151 -2.27653,0.23151 z m 1.87138,-8.19935 h 3.05787 q 1.24437,0 1.78457,-0.16398 0.71382,-0.21222 1.07073,-0.70418 0.36656,-0.49196 0.36656,-1.23473 0,-0.70418 -0.33762,-1.23472 -0.33762,-0.54019 -0.96463,-0.73312 -0.62701,-0.20257 -2.15112,-0.20257 h -2.82636 z m 0,6.53054 h 3.52089 q 0.90675,0 1.27331,-0.0675 0.64631,-0.11576 1.08039,-0.38585 0.43408,-0.2701 0.71382,-0.78135 0.27975,-0.5209 0.27975,-1.19614 0,-0.791 -0.40515,-1.36978 -0.40514,-0.58842 -1.12861,-0.81993 -0.71383,-0.24116 -2.06431,-0.24116 h -3.27009 z"
|
||||
id="text4367"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="B" />
|
||||
<path
|
||||
d="m 214.22428,385.49997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4371"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 246.87138,385.49997 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42765,-11.11253 v 11.11253 z"
|
||||
id="text4375"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 280.11174,385.49997 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 v 1.66881 z"
|
||||
id="text4379"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 313.67043,385.49997 -3.75241,-14.14146 h 1.91961 l 2.15112,9.27008 q 0.34727,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63666,-2.61414 l 2.69131,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.2701,-1.34083 0.70418,-3.07717 l 2.21865,-9.0868 h 1.88102 l -3.8778,14.14146 h -1.80386 l -2.9807,-10.77491 q -0.37621,-1.35048 -0.44373,-1.65916 -0.22187,0.97428 -0.41479,1.65916 l -3,10.77491 z"
|
||||
id="text4383"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 345.52171,378.61252 q 0,-3.5209 1.89068,-5.50803 1.89067,-1.99678 4.88102,-1.99678 1.95819,0 3.53054,0.93569 1.57235,0.93569 2.39228,2.61414 0.82958,1.66881 0.82958,3.79099 0,2.15112 -0.86817,3.84887 -0.86816,1.69775 -2.4598,2.57556 -1.59164,0.86817 -3.43408,0.86817 -1.99678,0 -3.56912,-0.96463 -1.57235,-0.96463 -2.38264,-2.63344 -0.81029,-1.66881 -0.81029,-3.53054 z m 1.92926,0.0289 q 0,2.55626 1.36977,4.03215 1.37942,1.46623 3.45338,1.46623 2.11253,0 3.47266,-1.48553 1.36977,-1.48552 1.36977,-4.21542 0,-1.72669 -0.58842,-3.00965 -0.57878,-1.2926 -1.70739,-1.99678 -1.11897,-0.71382 -2.51769,-0.71382 -1.98713,0 -3.42443,1.36977 -1.42765,1.36013 -1.42765,4.55305 z m 2.09325,-8.15112 v -1.97749 h 1.8135 v 1.97749 z m 3.59806,0 v -1.97749 h 1.8135 v 1.97749 z"
|
||||
id="text4387"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Ö" />
|
||||
<path
|
||||
d="m 381.45335,385.49997 v -14.14146 h 1.87138 v 12.47265 h 6.96462 v 1.66881 z"
|
||||
id="text4391"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 414.33679,385.49997 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 h -6.63665 v 6.42443 z"
|
||||
id="text4395"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 80.611744,418.74997 v -1.73633 l 7.244363,-9.05787 q 0.771703,-0.96463 1.466236,-1.67845 h -7.890664 v -1.66881 h 10.128603 v 1.66881 l -7.938896,9.81027 -0.858519,0.99357 h 9.028926 v 1.66881 z"
|
||||
id="text4399"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 114.47431,418.74997 v -14.14146 h 10.22506 v 1.66881 h -8.35368 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4403"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 147.19856,418.74997 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 v 14.14146 h -1.87138 v -6.66559 h -7.35047 v 6.66559 z"
|
||||
id="text4407"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 180.37139,418.74997 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11253 v 11.11253 z"
|
||||
id="text4411"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 214.22428,418.74997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4415"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 256.1704,404.60851 h 1.87138 v 8.17041 q 0,2.13183 -0.48232,3.38584 -0.48231,1.25402 -1.74597,2.04502 -1.25402,0.78135 -3.29904,0.78135 -1.98713,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80385,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34726,0.86817 1.17684,1.34084 0.83923,0.47267 2.04502,0.47267 2.0643,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4419"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 280.12139,418.74997 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11253 v 11.11253 z"
|
||||
id="text4423"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 313.97428,418.74997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4427"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 355.92041,404.60851 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4431"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 379.94853,418.74997 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 v 14.14146 h -1.87138 v -6.66559 h -7.35047 v 6.66559 z"
|
||||
id="text4435"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 413.16959,418.74997 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98392,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00965,1.31189 0.74277,0.35692 1.12862,0.70418 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84887 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94534 -0.41479,-0.27009 -0.84887,-0.3762 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 v 6.27973 z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72348,-0.6463 -2.29582,-0.6463 h -4.47588 z"
|
||||
id="text4439"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
</g>
|
||||
<g
|
||||
id="g1663"
|
||||
transform="translate(252.87499,354.25)"
|
||||
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none">
|
||||
<path
|
||||
id="rect4466-1-4"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="M 7.7500038,84.25 H 19.750004 v 2 H 7.7500038 Z" />
|
||||
<path
|
||||
id="rect4466-1-4-2"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="m 41.000004,84.25 h 12 v 2 h -12 z" />
|
||||
<path
|
||||
id="rect4466-1-4-9"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="m -25.499994,84.25 h 12 v 2 h -12 z" />
|
||||
<path
|
||||
id="rect4466-1-4-6"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="m -58.749992,84.25 h 12 v 2 h -12 z" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 82 KiB |
808
res/frontplate/WordClock_Front_Paths_Inkscape.svg
Normal file
808
res/frontplate/WordClock_Front_Paths_Inkscape.svg
Normal file
@@ -0,0 +1,808 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="500mm"
|
||||
height="500mm"
|
||||
viewBox="0 0 500 500"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
||||
sodipodi:docname="WordClock_Front_Paths_Inkscape.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
labelstyle="default"
|
||||
inkscape:zoom="0.5"
|
||||
inkscape:cx="762"
|
||||
inkscape:cy="831"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1377"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g1"
|
||||
inkscape:label="Background"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
id="rect2951"
|
||||
style="display:inline;fill-rule:evenodd;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 0,0 H 500 V 500 H 0 Z" />
|
||||
</g>
|
||||
<g
|
||||
id="g3"
|
||||
inkscape:label="Chars"
|
||||
style="display:inline"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
d="M 81.224283,86.25 V 72.10854 H 91.44935 v 1.668808 h -8.353687 v 4.331184 h 7.823141 v 1.659162 h -7.823141 v 4.813498 h 8.681661 V 86.25 Z"
|
||||
id="text3140"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="M 147.16962,86.25 V 72.10854 h 6.27009 q 1.89067,0 2.87459,0.385852 0.98393,0.376205 1.57235,1.340834 0.58842,0.964629 0.58842,2.13183 0,1.504821 -0.97427,2.536974 -0.97428,1.032153 -3.00964,1.311895 0.74276,0.356913 1.12861,0.704179 0.81994,0.752411 1.55305,1.881027 L 159.63263,86.25 h -2.3537 l -1.87138,-2.942118 q -0.81993,-1.27331 -1.35048,-1.948551 -0.53054,-0.67524 -0.95498,-0.945336 -0.41479,-0.270096 -0.84887,-0.376205 -0.31833,-0.06752 -1.0418,-0.06752 H 149.041 V 86.25 Z m 1.87138,-7.900311 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.270096 1.09968,-0.848873 0.3762,-0.588424 0.3762,-1.27331 0,-1.003214 -0.73311,-1.649516 -0.72347,-0.646301 -2.29582,-0.646301 H 149.041 Z"
|
||||
id="text1"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
inkscape:label="text1"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 113.79905,81.706598 1.76527,-0.154341 q 0.1254,1.061092 0.57878,1.745979 0.46302,0.67524 1.42765,1.099677 0.96463,0.41479 2.17041,0.41479 1.07074,0 1.89068,-0.318328 0.81993,-0.318327 1.21543,-0.868166 0.40514,-0.559484 0.40514,-1.215432 0,-0.665594 -0.38585,-1.157555 -0.38585,-0.501607 -1.27331,-0.839227 -0.56913,-0.221865 -2.51768,-0.684886 -1.94855,-0.472669 -2.7299,-0.887459 -1.01286,-0.530546 -1.51447,-1.311895 -0.49196,-0.790996 -0.49196,-1.765271 0,-1.070738 0.60772,-1.996782 0.60772,-0.93569 1.77492,-1.418005 1.1672,-0.482314 2.59485,-0.482314 1.57234,0 2.76848,0.511253 1.20579,0.501607 1.85209,1.485529 0.6463,0.983921 0.69453,2.228293 l -1.79421,0.135048 q -0.14469,-1.340835 -0.98392,-2.025721 -0.82958,-0.684887 -2.4598,-0.684887 -1.69775,0 -2.4791,0.627009 -0.7717,0.617363 -0.7717,1.495175 0,0.762057 0.54984,1.254018 0.54019,0.49196 2.81671,1.01286 2.28617,0.511253 3.13505,0.897105 1.23472,0.569131 1.82315,1.446943 0.58842,0.868166 0.58842,2.006428 0,1.128616 -0.6463,2.13183 -0.6463,0.993568 -1.86174,1.553053 -1.20578,0.549838 -2.72025,0.549838 -1.91961,0 -3.22186,-0.559485 -1.2926,-0.559484 -2.03537,-1.678454 -0.73311,-1.128616 -0.7717,-2.54662 z"
|
||||
id="text3144"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="M 185.09807,86.25 V 72.10854 h 1.87138 V 86.25 Z"
|
||||
id="text3971"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 213.54904,81.706598 1.76527,-0.154341 q 0.12541,1.061092 0.57878,1.745979 0.46302,0.67524 1.42765,1.099677 0.96463,0.41479 2.17042,0.41479 1.07074,0 1.89067,-0.318328 0.81993,-0.318327 1.21543,-0.868166 0.40515,-0.559484 0.40515,-1.215432 0,-0.665594 -0.38586,-1.157555 -0.38585,-0.501607 -1.27331,-0.839227 -0.56913,-0.221865 -2.51768,-0.684886 -1.94855,-0.472669 -2.7299,-0.887459 -1.01286,-0.530546 -1.51446,-1.311895 -0.49196,-0.790996 -0.49196,-1.765271 0,-1.070738 0.60771,-1.996782 0.60772,-0.93569 1.77492,-1.418005 1.1672,-0.482314 2.59485,-0.482314 1.57235,0 2.76849,0.511253 1.20578,0.501607 1.85208,1.485529 0.6463,0.983921 0.69454,2.228293 l -1.79421,0.135048 q -0.1447,-1.340835 -0.98393,-2.025721 -0.82958,-0.684887 -2.4598,-0.684887 -1.69775,0 -2.4791,0.627009 -0.7717,0.617363 -0.7717,1.495175 0,0.762057 0.54984,1.254018 0.54019,0.49196 2.81672,1.01286 2.28617,0.511253 3.13504,0.897105 1.23473,0.569131 1.82315,1.446943 0.58842,0.868166 0.58842,2.006428 0,1.128616 -0.6463,2.13183 -0.6463,0.993568 -1.86173,1.553053 -1.20579,0.549838 -2.72026,0.549838 -1.91961,0 -3.22186,-0.559485 -1.2926,-0.559484 -2.03536,-1.678454 -0.73312,-1.128616 -0.77171,-2.54662 z"
|
||||
id="text3975"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="M 251.58843,86.25 V 73.777348 h -4.65916 V 72.10854 h 11.20899 v 1.668808 h -4.67845 V 86.25 Z"
|
||||
id="text3979"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="M 280.12139,86.25 V 72.10854 h 1.91961 l 7.42764,11.102879 V 72.10854 h 1.79421 V 86.25 h -1.91961 L 281.9156,75.137475 V 86.25 Z"
|
||||
id="text3983"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="M 314.58682,86.25 V 72.10854 h 9.54018 v 1.668808 h -7.6688 v 4.379415 h 6.63665 v 1.668808 H 316.4582 V 86.25 Z"
|
||||
id="text3987"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 355.92041,72.10854 h 1.87138 v 8.170407 q 0,2.13183 -0.48231,3.385848 -0.48232,1.254017 -1.74598,2.045013 -1.25402,0.781349 -3.29903,0.781349 -1.98714,0 -3.2508,-0.684886 -1.26366,-0.684887 -1.80386,-1.97749 -0.54019,-1.302249 -0.54019,-3.549834 V 72.10854 h 1.87138 v 8.160761 q 0,1.842441 0.33762,2.720253 0.34727,0.868166 1.17685,1.340834 0.83923,0.472669 2.04501,0.472669 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.598066 z m -6.42443,-0.868166 v -1.977489 h 1.81351 v 1.977489 z m 3.59807,0 v -1.977489 h 1.8135 v 1.977489 z"
|
||||
id="text3991"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Ü" />
|
||||
<path
|
||||
d="M 379.87136,86.25 V 72.10854 h 1.91961 l 7.42764,11.102879 V 72.10854 h 1.79421 V 86.25 h -1.91961 L 381.66557,75.137475 V 86.25 Z"
|
||||
id="text3995"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="M 414.33679,86.25 V 72.10854 h 9.54018 v 1.668808 h -7.6688 v 4.379415 h 6.63665 v 1.668808 h -6.63665 V 86.25 Z"
|
||||
id="text3999"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 85.227493,119.50001 -5.479092,-14.14146 h 2.025721 l 3.675236,10.2733 q 0.443729,1.23472 0.742764,2.31511 0.327974,-1.15756 0.762057,-2.31511 l 3.819931,-10.2733 h 1.909965 l -5.53697,14.14146 z"
|
||||
id="text4003"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="V" />
|
||||
<path
|
||||
d="m 118.59808,119.50001 v -14.14146 h 1.87138 v 14.14146 z"
|
||||
id="text4007"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.72428,119.50001 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4011"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 180.41962,119.50001 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98393,0.3762 1.57235,1.34083 0.58842,0.96463 0.58842,2.13183 0,1.50482 -0.97427,2.53698 -0.97428,1.03215 -3.00964,1.31189 0.74276,0.35692 1.12861,0.70418 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84887 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94534 -0.41479,-0.27009 -0.84887,-0.3762 -0.31833,-0.0675 -1.0418,-0.0675 H 182.291 v 6.27974 z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84888 0.3762,-0.58842 0.3762,-1.27331 0,-1.00321 -0.73311,-1.64951 -0.72347,-0.6463 -2.29582,-0.6463 H 182.291 Z"
|
||||
id="text4015"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 218.33843,119.50001 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4019"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 247.47428,119.50001 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4023"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 281.70338,119.50001 v -14.14146 h 1.87138 v 12.47265 h 6.96462 v 1.66881 z"
|
||||
id="text4027"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 313.36174,119.50001 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 v 1.66881 z"
|
||||
id="text4031"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 347.22428,119.50001 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4035"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 379.94853,119.50001 v -14.14146 h 1.87138 v 5.80706 h 7.35047 v -5.80706 h 1.87138 v 14.14146 h -1.87138 v -6.66559 h -7.35047 v 6.66559 z"
|
||||
id="text4039"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 413.12136,119.50001 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11253 v 11.11253 z"
|
||||
id="text4043"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 80.611744,152.75 v -1.73633 l 7.244363,-9.05787 q 0.771703,-0.96463 1.466236,-1.67845 h -7.890664 v -1.66881 h 10.128603 v 1.66881 l -7.938896,9.81027 -0.858519,0.99357 h 9.028926 V 152.75 Z"
|
||||
id="text4047"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 114.17043,152.75 -3.75241,-14.14146 h 1.91961 l 2.15112,9.27008 q 0.34727,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63666,-2.61414 l 2.69131,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.2701,-1.34083 0.70418,-3.07717 l 2.21865,-9.0868 h 1.88102 l -3.8778,14.14146 h -1.80386 l -2.9807,-10.7749 q -0.37621,-1.35049 -0.44373,-1.65917 -0.22187,0.97428 -0.41479,1.65917 l -3,10.7749 z"
|
||||
id="text4051"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 146.13265,152.75 5.43086,-14.14146 h 2.01607 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4055"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 180.37139,152.75 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 152.75 h -1.91961 L 182.1656,141.63748 V 152.75 Z"
|
||||
id="text4059"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 213.61174,152.75 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 V 152.75 Z"
|
||||
id="text4063"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 251.59806,152.75 v -14.14146 h 1.87138 V 152.75 Z"
|
||||
id="text4067"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 286.2082,147.20338 v -1.65916 l 5.99034,-0.01 v 5.24758 q -1.37942,1.09967 -2.84565,1.65916 -1.46624,0.54984 -3.00964,0.54984 -2.0836,0 -3.79099,-0.88746 -1.69775,-0.89711 -2.56592,-2.58521 -0.86816,-1.6881 -0.86816,-3.7717 0,-2.0643 0.85852,-3.84887 0.86816,-1.7942 2.48874,-2.66237 1.62058,-0.86817 3.73311,-0.86817 1.53376,0 2.76849,0.50161 1.24437,0.49196 1.94855,1.37942 0.70418,0.88746 1.07074,2.31511 l -1.6881,0.46302 q -0.31833,-1.08038 -0.791,-1.69775 -0.47267,-0.61736 -1.35048,-0.98392 -0.87781,-0.3762 -1.94855,-0.3762 -1.28296,0 -2.21865,0.39549 -0.93569,0.38586 -1.51447,1.02251 -0.56913,0.63666 -0.88745,1.39871 -0.5402,1.3119 -0.5402,2.84566 0,1.89067 0.64631,3.16398 0.65594,1.27331 1.90031,1.89067 1.24438,0.61737 2.64309,0.61737 1.21543,0 2.37298,-0.46303 1.15756,-0.47266 1.75563,-1.00321 v -2.63344 z"
|
||||
id="text4071"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="G" />
|
||||
<path
|
||||
d="m 313.44856,152.75 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 152.75 h -1.87138 v -6.66559 h -7.35047 V 152.75 Z"
|
||||
id="text4075"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 351.22749,152.75 -5.47909,-14.14146 h 2.02572 l 3.67524,10.2733 q 0.44373,1.23472 0.74276,2.31511 0.32798,-1.15756 0.76206,-2.31511 l 3.81993,-10.2733 h 1.90996 L 353.1471,152.75 Z"
|
||||
id="text4079"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="V" />
|
||||
<path
|
||||
d="m 378.77168,145.86255 q 0,-3.5209 1.89068,-5.50803 1.89067,-1.99678 4.88102,-1.99678 1.95819,0 3.53054,0.93569 1.57234,0.93569 2.39228,2.61414 0.82958,1.66881 0.82958,3.79099 0,2.15113 -0.86817,3.84887 -0.86816,1.69775 -2.4598,2.57556 -1.59164,0.86817 -3.43408,0.86817 -1.99678,0 -3.56913,-0.96463 -1.57234,-0.96463 -2.38263,-2.63344 -0.81029,-1.66881 -0.81029,-3.53054 z m 1.92926,0.0289 q 0,2.55627 1.36977,4.03215 1.37942,1.46623 3.45338,1.46623 2.11253,0 3.47266,-1.48553 1.36977,-1.48552 1.36977,-4.21542 0,-1.72669 -0.58842,-3.00965 -0.57878,-1.2926 -1.70739,-1.99678 -1.11897,-0.71382 -2.51769,-0.71382 -1.98713,0 -3.42443,1.36977 -1.42765,1.36013 -1.42765,4.55305 z"
|
||||
id="text4083"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="O" />
|
||||
<path
|
||||
d="m 413.16959,152.75 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98392,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00965,1.3119 0.74277,0.35691 1.12862,0.70417 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84887 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94533 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 V 152.75 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72348,-0.6463 -2.29582,-0.6463 h -4.47588 z"
|
||||
id="text4087"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 81.185698,186 v -14.14146 h 5.334398 q 1.408358,0 2.151123,0.13505 1.041799,0.17363 1.745978,0.66559 0.704179,0.48232 1.128616,1.36013 0.434083,0.87781 0.434083,1.92926 0,1.80385 -1.147909,3.05787 -1.147908,1.24437 -4.147904,1.24437 H 83.057078 V 186 Z m 1.87138,-7.418 h 3.655944 q 1.813502,0 2.575559,-0.67524 0.762057,-0.67524 0.762057,-1.90032 0,-0.88745 -0.453376,-1.51446 -0.443729,-0.63666 -1.176847,-0.83923 -0.472668,-0.1254 -1.745978,-0.1254 h -3.617359 z"
|
||||
id="text4091"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="P" />
|
||||
<path
|
||||
d="m 118.59809,186 v -14.14146 h 1.87138 V 186 Z"
|
||||
id="text4095"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.60853,186 v -14.14146 h 1.87138 v 7.01285 l 7.0225,-7.01285 h 2.53697 l -5.93247,5.7299 6.19292,8.41156 h -2.46945 l -5.03536,-7.15755 -2.31511,2.25724 V 186 Z"
|
||||
id="text4099"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="K" />
|
||||
<path
|
||||
d="m 179.38265,186 5.43086,-14.14146 h 2.01607 L 192.61735,186 h -2.13183 l -1.64951,-4.28295 h -5.91318 L 181.36978,186 Z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4103"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 223.7307,181.04181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4107"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 246.94855,186 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 186 h -1.87138 v -6.66559 h -7.35047 V 186 Z"
|
||||
id="text4111"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 289.42041,171.85854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4115"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 313.37139,186 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 186 h -1.91961 L 315.1656,174.88748 V 186 Z"
|
||||
id="text4119"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 345.63265,186 5.43086,-14.14146 h 2.01607 L 358.86735,186 h -2.13183 l -1.64951,-4.28295 h -5.91318 L 347.61978,186 Z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4123"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 389.98067,181.04181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4127"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 413.19853,186 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 186 h -1.87138 v -6.66559 h -7.35047 V 186 Z"
|
||||
id="text4131"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 80.698561,219.25 v -14.14146 h 1.87138 v 5.80707 h 7.350472 v -5.80707 h 1.87138 V 219.25 h -1.87138 v -6.66559 H 82.569941 V 219.25 Z"
|
||||
id="text4135"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 112.88265,219.25 5.43086,-14.14146 h 2.01608 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80707 h 4.79421 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00322,-2.93247 -0.27009,1.36013 -0.76205,2.70096 z"
|
||||
id="text4139"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 148.70338,219.25 v -14.14146 h 1.87138 v 12.47265 h 6.96462 V 219.25 Z"
|
||||
id="text4143"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 180.85853,219.25 v -14.14146 h 5.30546 q 1.62057,0 2.59485,0.43408 0.98392,0.42444 1.53376,1.32154 0.55948,0.88746 0.55948,1.86174 0,0.90675 -0.49196,1.70739 -0.49196,0.80064 -1.48553,1.2926 1.28296,0.37621 1.96785,1.28296 0.69453,0.90675 0.69453,2.14148 0,0.99356 -0.42444,1.85208 -0.41479,0.84888 -1.03215,1.3119 -0.61736,0.46302 -1.55305,0.70418 -0.92605,0.23151 -2.27653,0.23151 z m 1.87138,-8.19935 h 3.05787 q 1.24437,0 1.78457,-0.16398 0.71382,-0.21222 1.07073,-0.70418 0.36656,-0.49196 0.36656,-1.23473 0,-0.70418 -0.33762,-1.23472 -0.33762,-0.54019 -0.96463,-0.73312 -0.62701,-0.20257 -2.15112,-0.20257 h -2.82636 z m 0,6.53054 h 3.52089 q 0.90675,0 1.27331,-0.0675 0.64631,-0.11576 1.08039,-0.38585 0.43408,-0.2701 0.71382,-0.78135 0.27975,-0.5209 0.27975,-1.19614 0,-0.791 -0.40515,-1.36978 -0.40514,-0.58842 -1.12861,-0.81993 -0.71383,-0.24116 -2.06431,-0.24116 h -3.27009 z"
|
||||
id="text4147"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="B" />
|
||||
<path
|
||||
d="m 212.48795,219.25 v -14.14146 h 2.81672 l 3.34726,10.01285 q 0.46302,1.39871 0.67524,2.09324 0.24116,-0.7717 0.75241,-2.26687 l 3.38585,-9.83922 h 2.51768 V 219.25 h -1.80386 v -11.836 l -4.10932,11.836 h -1.6881 l -4.09002,-12.03857 V 219.25 Z"
|
||||
id="text4151"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="M" />
|
||||
<path
|
||||
d="m 247.47428,219.25 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 219.25 Z"
|
||||
id="text4155"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 281.70338,219.25 v -14.14146 h 1.87138 v 12.47265 h 6.96462 V 219.25 Z"
|
||||
id="text4159"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 314.58682,219.25 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 H 316.4582 V 219.25 Z"
|
||||
id="text4163"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 355.92041,205.10854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z m -6.42443,-0.86817 v -1.97749 h 1.81351 v 1.97749 z m 3.59807,0 v -1.97749 h 1.8135 v 1.97749 z"
|
||||
id="text4167"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Ü" />
|
||||
<path
|
||||
d="m 379.87136,219.25 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 219.25 h -1.91961 l -7.42764,-11.11252 V 219.25 Z"
|
||||
id="text4171"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 414.33679,219.25 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 h -6.63665 V 219.25 Z"
|
||||
id="text4175"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 79.487951,252.49998 v -14.14146 h 2.816717 l 3.347262,10.01285 q 0.463022,1.39871 0.67524,2.09325 0.241158,-0.77171 0.752411,-2.26688 l 3.385847,-9.83922 h 2.517682 v 14.14146 h -1.803856 v -11.83599 l -4.109319,11.83599 h -1.688101 l -4.090027,-12.03856 v 12.03856 z"
|
||||
id="text4179"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="M" />
|
||||
<path
|
||||
d="m 118.59809,252.49998 v -14.14146 h 1.87138 v 14.14146 z"
|
||||
id="text4183"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 151.83843,252.49998 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4187"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 185.08843,252.49998 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4191"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 214.22428,252.49998 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33119 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.6688 z"
|
||||
id="text4195"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 246.91959,252.49998 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38586 0.98392,0.3762 1.57235,1.34083 0.58842,0.96463 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03216 -3.00965,1.3119 0.74277,0.35691 1.12862,0.70418 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84886 h -2.3537 l -1.87138,-2.94211 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94534 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 V 252.5 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.27009 1.09968,-0.84887 0.3762,-0.58842 0.3762,-1.27331 0,-1.00321 -0.73311,-1.64951 -0.72348,-0.64631 -2.29582,-0.64631 h -4.47588 z"
|
||||
id="text4199"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 280.12139,252.49998 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11252 v 11.11252 z"
|
||||
id="text4203"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 312.38265,252.49998 5.43086,-14.14146 h 2.01607 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80706 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78457 -1.00321,-2.93248 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4207"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 356.7307,247.54179 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.5209 -1.52412,1.20578 -3.73312,1.20578 -2.28617,0 -3.72346,-0.92604 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64952 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08038 1.44694,1.08039 2.01607,3.03858 l -1.84244,0.43409 q -0.49196,-1.54341 -1.42765,-2.24759 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.3119 -0.44373,2.71061 0,1.80386 0.5209,3.15434 0.53054,1.34083 1.63987,2.00642 1.10932,0.6656 2.40192,0.6656 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69132 z"
|
||||
id="text4211"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 379.94853,252.49998 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 v 14.14146 h -1.87138 v -6.66558 h -7.35047 v 6.66558 z"
|
||||
id="text4215"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 417.8384,252.49998 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 v 12.47265 z"
|
||||
id="text4219"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="M 81.224283,285.75 V 271.60854 H 91.44935 v 1.66881 h -8.353687 v 4.33118 h 7.823141 v 1.65916 h -7.823141 v 4.8135 h 8.681661 V 285.75 Z"
|
||||
id="text4223"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 118.59808,285.75 v -14.14146 h 1.87138 V 285.75 Z"
|
||||
id="text4227"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.12139,285.75 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 285.75 h -1.91961 L 148.9156,274.63748 V 285.75 Z"
|
||||
id="text4231"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 180.29904,281.2066 1.76527,-0.15434 q 0.12541,1.06109 0.57878,1.74598 0.46302,0.67524 1.42765,1.09967 0.96463,0.41479 2.17042,0.41479 1.07074,0 1.89067,-0.31832 0.81993,-0.31833 1.21543,-0.86817 0.40515,-0.55949 0.40515,-1.21543 0,-0.6656 -0.38586,-1.15756 -0.38585,-0.5016 -1.27331,-0.83922 -0.56913,-0.22187 -2.51768,-0.68489 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.51446,-1.3119 -0.49196,-0.79099 -0.49196,-1.76527 0,-1.07073 0.60771,-1.99678 0.60772,-0.93569 1.77492,-1.418 1.1672,-0.48232 2.59485,-0.48232 1.57235,0 2.76849,0.51126 1.20578,0.5016 1.85208,1.48552 0.6463,0.98393 0.69454,2.2283 l -1.79421,0.13505 q -0.1447,-1.34084 -0.98393,-2.02573 -0.82958,-0.68488 -2.4598,-0.68488 -1.69775,0 -2.4791,0.62701 -0.7717,0.61736 -0.7717,1.49517 0,0.76206 0.54984,1.25402 0.54019,0.49196 2.81672,1.01286 2.28617,0.51125 3.13504,0.8971 1.23473,0.56914 1.82315,1.44695 0.58842,0.86816 0.58842,2.00643 0,1.12861 -0.6463,2.13183 -0.6463,0.99356 -1.86173,1.55305 -1.20579,0.54984 -2.72026,0.54984 -1.91961,0 -3.22186,-0.55949 -1.2926,-0.55948 -2.03536,-1.67845 -0.73312,-1.12862 -0.77171,-2.54662 z"
|
||||
id="text4235"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 222.92041,271.60854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4239"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="M 247.17041,285.75 243.418,271.60854 h 1.91962 l 2.15112,9.27008 q 0.34726,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63665,-2.61414 l 2.69132,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.27009,-1.34083 0.70418,-3.07717 l 2.21864,-9.0868 h 1.88103 L 257.72345,285.75 h -1.80386 l -2.9807,-10.7749 q -0.3762,-1.35049 -0.44373,-1.65917 -0.22186,0.97428 -0.41479,1.65917 l -2.99999,10.7749 z"
|
||||
id="text4243"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 289.42041,271.60854 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4247"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 313.36174,285.75 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 V 285.75 Z"
|
||||
id="text4251"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 346.92043,285.75 -3.75241,-14.14146 h 1.91961 l 2.15112,9.27008 q 0.34727,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63666,-2.61414 l 2.69131,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.2701,-1.34083 0.70418,-3.07717 l 2.21865,-9.0868 h 1.88102 l -3.8778,14.14146 h -1.80386 l -2.9807,-10.7749 q -0.37621,-1.35049 -0.44373,-1.65917 -0.22187,0.97428 -0.41479,1.65917 l -3,10.7749 z"
|
||||
id="text4255"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 380.47425,285.75 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 285.75 Z"
|
||||
id="text4259"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 417.84804,285.75 v -14.14146 h 1.87138 V 285.75 Z"
|
||||
id="text4263"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 80.640683,319 v -14.14146 h 4.871376 q 1.649515,0 2.517681,0.20257 1.215433,0.27974 2.073952,1.01286 1.11897,0.94534 1.668808,2.42122 0.559485,1.46624 0.559485,3.35691 0,1.61093 -0.376205,2.8553 -0.376205,1.24437 -0.964629,2.06431 -0.588424,0.81029 -1.292603,1.28295 -0.694532,0.46303 -1.6881,0.70418 Q 87.026526,319 85.74357,319 Z m 1.87138,-1.66881 h 3.019288 q 1.398712,0 2.189708,-0.26045 0.800642,-0.26045 1.27331,-0.73312 0.665594,-0.66559 1.032153,-1.78456 0.376205,-1.12862 0.376205,-2.7299 0,-2.21865 -0.733118,-3.40514 -0.723471,-1.19614 -1.76527,-1.60128 -0.752411,-0.28939 -2.421219,-0.28939 h -2.971057 z"
|
||||
id="text4267"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="D" />
|
||||
<path
|
||||
d="m 113.91962,319 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98393,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00964,1.3119 0.74276,0.35691 1.12861,0.70417 0.81994,0.75241 1.55305,1.88103 L 126.38263,319 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94533 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 H 115.791 V 319 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72347,-0.6463 -2.29582,-0.6463 H 115.791 Z"
|
||||
id="text4271"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 147.72428,319 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 319 Z"
|
||||
id="text4275"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 185.09807,319 v -14.14146 h 1.87138 V 319 Z"
|
||||
id="text4279"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 214.83682,319 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 H 216.7082 V 319 Z"
|
||||
id="text4283"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 256.1704,304.85854 h 1.87138 v 8.17041 q 0,2.13183 -0.48232,3.38584 -0.48231,1.25402 -1.74597,2.04502 -1.25402,0.78135 -3.29904,0.78135 -1.98713,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80385,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34726,0.86817 1.17684,1.34084 0.83923,0.47267 2.04502,0.47267 2.0643,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4287"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 280.12139,319 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 V 319 h -1.91961 L 281.9156,307.88748 V 319 Z"
|
||||
id="text4291"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 317.97749,319 -5.47909,-14.14146 h 2.02572 l 3.67524,10.2733 q 0.44373,1.23472 0.74276,2.31511 0.32798,-1.15756 0.76206,-2.31511 l 3.81993,-10.2733 h 1.90996 L 319.8971,319 Z"
|
||||
id="text4295"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="V" />
|
||||
<path
|
||||
d="m 351.34807,319 v -14.14146 h 1.87138 V 319 Z"
|
||||
id="text4299"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 380.47425,319 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 319 Z"
|
||||
id="text4303"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 413.16959,319 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98392,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00965,1.3119 0.74277,0.35691 1.12862,0.70417 0.81994,0.75241 1.55305,1.88103 L 425.6326,319 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94533 -0.41479,-0.2701 -0.84887,-0.37621 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 V 319 Z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72348,-0.6463 -2.29582,-0.6463 h -4.47588 z"
|
||||
id="text4307"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
<path
|
||||
d="m 80.549043,347.7066 1.765271,-0.15434 q 0.125402,1.06109 0.578777,1.74598 0.463022,0.67524 1.427651,1.09967 0.964629,0.41479 2.170415,0.41479 1.070738,0 1.890673,-0.31832 0.819934,-0.31833 1.215432,-0.86817 0.405144,-0.55949 0.405144,-1.21543 0,-0.6656 -0.385851,-1.15756 -0.385852,-0.5016 -1.27331,-0.83922 -0.569131,-0.22187 -2.517682,-0.68489 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.514467,-1.3119 -0.491961,-0.79099 -0.491961,-1.76527 0,-1.07073 0.607717,-1.99678 0.607716,-0.93569 1.774917,-1.418 1.167201,-0.48232 2.594852,-0.48232 1.572345,0 2.768484,0.51126 1.205787,0.5016 1.852088,1.48552 0.646301,0.98393 0.694533,2.2283 l -1.79421,0.13505 q -0.144694,-1.34084 -0.983921,-2.02573 -0.829581,-0.68488 -2.459804,-0.68488 -1.697747,0 -2.479096,0.62701 -0.771704,0.61736 -0.771704,1.49517 0,0.76206 0.549839,1.25402 0.540192,0.49196 2.816716,1.01286 2.286171,0.51125 3.135044,0.8971 1.234725,0.56914 1.823149,1.44695 0.588423,0.86816 0.588423,2.00643 0,1.12861 -0.646301,2.13183 -0.646301,0.99356 -1.861734,1.55305 -1.205786,0.54984 -2.720253,0.54984 -1.919612,0 -3.221861,-0.55949 -1.292602,-0.55948 -2.035367,-1.67845 -0.733118,-1.12862 -0.771703,-2.54662 z"
|
||||
id="text4311"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 114.47431,352.25 v -14.14146 h 10.22506 v 1.66881 h -8.35368 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 V 352.25 Z"
|
||||
id="text4315"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 157.2307,347.29181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4319"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 180.44856,352.25 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 352.25 h -1.87138 v -6.66559 h -7.35047 V 352.25 Z"
|
||||
id="text4323"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 213.54904,347.7066 1.76527,-0.15434 q 0.12541,1.06109 0.57878,1.74598 0.46302,0.67524 1.42765,1.09967 0.96463,0.41479 2.17042,0.41479 1.07074,0 1.89067,-0.31832 0.81993,-0.31833 1.21543,-0.86817 0.40515,-0.55949 0.40515,-1.21543 0,-0.6656 -0.38586,-1.15756 -0.38585,-0.5016 -1.27331,-0.83922 -0.56913,-0.22187 -2.51768,-0.68489 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.51446,-1.3119 -0.49196,-0.79099 -0.49196,-1.76527 0,-1.07073 0.60771,-1.99678 0.60772,-0.93569 1.77492,-1.418 1.1672,-0.48232 2.59485,-0.48232 1.57235,0 2.76849,0.51126 1.20578,0.5016 1.85208,1.48552 0.6463,0.98393 0.69454,2.2283 l -1.79421,0.13505 q -0.1447,-1.34084 -0.98393,-2.02573 -0.82958,-0.68488 -2.4598,-0.68488 -1.69775,0 -2.4791,0.62701 -0.7717,0.61736 -0.7717,1.49517 0,0.76206 0.54984,1.25402 0.54019,0.49196 2.81672,1.01286 2.28617,0.51125 3.13504,0.8971 1.23473,0.56914 1.82315,1.44695 0.58842,0.86816 0.58842,2.00643 0,1.12861 -0.6463,2.13183 -0.6463,0.99356 -1.86173,1.55305 -1.20579,0.54984 -2.72026,0.54984 -1.91961,0 -3.22186,-0.55949 -1.2926,-0.55948 -2.03536,-1.67845 -0.73312,-1.12862 -0.77171,-2.54662 z"
|
||||
id="text4327"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 245.77171,345.36255 q 0,-3.5209 1.89068,-5.50803 1.89067,-1.99678 4.88102,-1.99678 1.95819,0 3.53054,0.93569 1.57235,0.93569 2.39228,2.61414 0.82958,1.66881 0.82958,3.79099 0,2.15113 -0.86817,3.84887 -0.86816,1.69775 -2.4598,2.57556 -1.59164,0.86817 -3.43408,0.86817 -1.99678,0 -3.56912,-0.96463 -1.57235,-0.96463 -2.38264,-2.63344 -0.81029,-1.66881 -0.81029,-3.53054 z m 1.92926,0.0289 q 0,2.55627 1.36977,4.03215 1.37942,1.46623 3.45338,1.46623 2.11253,0 3.47266,-1.48553 1.36977,-1.48552 1.36977,-4.21542 0,-1.72669 -0.58842,-3.00965 -0.57878,-1.2926 -1.70739,-1.99678 -1.11897,-0.71382 -2.51769,-0.71382 -1.98713,0 -3.42443,1.36977 -1.42765,1.36013 -1.42765,4.55305 z"
|
||||
id="text4331"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="O" />
|
||||
<path
|
||||
d="m 280.60853,352.25 v -14.14146 h 5.30546 q 1.62057,0 2.59485,0.43408 0.98392,0.42444 1.53376,1.32154 0.55948,0.88746 0.55948,1.86174 0,0.90675 -0.49196,1.70739 -0.49196,0.80064 -1.48553,1.2926 1.28296,0.37621 1.96785,1.28296 0.69453,0.90675 0.69453,2.14148 0,0.99356 -0.42444,1.85208 -0.41479,0.84888 -1.03215,1.3119 -0.61736,0.46302 -1.55305,0.70418 -0.92605,0.23151 -2.27653,0.23151 z m 1.87138,-8.19935 h 3.05787 q 1.24437,0 1.78457,-0.16398 0.71382,-0.21222 1.07073,-0.70418 0.36656,-0.49196 0.36656,-1.23473 0,-0.70418 -0.33762,-1.23472 -0.33762,-0.54019 -0.96463,-0.73312 -0.62701,-0.20257 -2.15112,-0.20257 h -2.82636 z m 0,6.53054 h 3.52089 q 0.90675,0 1.27331,-0.0675 0.64631,-0.11576 1.08039,-0.38585 0.43408,-0.2701 0.71382,-0.78135 0.27975,-0.5209 0.27975,-1.19614 0,-0.791 -0.40515,-1.36978 -0.40514,-0.58842 -1.12861,-0.81993 -0.71383,-0.24116 -2.06431,-0.24116 h -3.27009 z"
|
||||
id="text4335"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="B" />
|
||||
<path
|
||||
d="m 312.38265,352.25 5.43086,-14.14146 h 2.01607 l 5.78777,14.14146 h -2.13183 l -1.64951,-4.28295 h -5.91318 l -1.55305,4.28295 z m 4.08038,-5.80707 h 4.7942 l -1.47588,-3.91639 q -0.67524,-1.78456 -1.00321,-2.93247 -0.2701,1.36013 -0.76206,2.70096 z"
|
||||
id="text4339"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="A" />
|
||||
<path
|
||||
d="m 356.7307,347.29181 1.87138,0.47267 q -0.58842,2.30546 -2.12218,3.52089 -1.52412,1.20579 -3.73312,1.20579 -2.28617,0 -3.72346,-0.92605 -1.42765,-0.93569 -2.18007,-2.70096 -0.74276,-1.76527 -0.74276,-3.79099 0,-2.209 0.83923,-3.84887 0.84887,-1.64951 2.40192,-2.49839 1.5627,-0.85852 3.43408,-0.85852 2.12219,0 3.56913,1.08039 1.44694,1.08038 2.01607,3.03858 l -1.84244,0.43408 q -0.49196,-1.5434 -1.42765,-2.24758 -0.93569,-0.70418 -2.35369,-0.70418 -1.63023,0 -2.7299,0.78135 -1.09003,0.78135 -1.53376,2.10289 -0.44373,1.31189 -0.44373,2.7106 0,1.80386 0.5209,3.15434 0.53054,1.34084 1.63987,2.00643 1.10932,0.66559 2.40192,0.66559 1.57235,0 2.66238,-0.90675 1.09003,-0.90675 1.47588,-2.69131 z"
|
||||
id="text4343"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="C" />
|
||||
<path
|
||||
d="m 379.94853,352.25 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 V 352.25 h -1.87138 v -6.66559 h -7.35047 V 352.25 Z"
|
||||
id="text4347"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 417.8384,352.25 v -12.47265 h -4.65916 v -1.66881 h 11.20899 v 1.66881 h -4.67845 V 352.25 Z"
|
||||
id="text4351"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="T" />
|
||||
<path
|
||||
d="m 80.549043,380.95657 1.765271,-0.15434 q 0.125402,1.06109 0.578777,1.74598 0.463022,0.67524 1.427651,1.09967 0.964629,0.41479 2.170415,0.41479 1.070738,0 1.890673,-0.31833 0.819934,-0.31832 1.215432,-0.86816 0.405144,-0.55949 0.405144,-1.21543 0,-0.6656 -0.385851,-1.15756 -0.385852,-0.50161 -1.27331,-0.83923 -0.569131,-0.22186 -2.517682,-0.68488 -1.94855,-0.47267 -2.7299,-0.88746 -1.01286,-0.53055 -1.514467,-1.3119 -0.491961,-0.79099 -0.491961,-1.76527 0,-1.07073 0.607717,-1.99678 0.607716,-0.93569 1.774917,-1.418 1.167201,-0.48232 2.594852,-0.48232 1.572345,0 2.768484,0.51126 1.205787,0.5016 1.852088,1.48552 0.646301,0.98393 0.694533,2.2283 l -1.79421,0.13505 q -0.144694,-1.34084 -0.983921,-2.02573 -0.829581,-0.68488 -2.459804,-0.68488 -1.697747,0 -2.479096,0.62701 -0.771704,0.61736 -0.771704,1.49517 0,0.76206 0.549839,1.25402 0.540192,0.49196 2.816716,1.01286 2.286171,0.51125 3.135044,0.8971 1.234725,0.56914 1.823149,1.44695 0.588423,0.86816 0.588423,2.00643 0,1.12861 -0.646301,2.13183 -0.646301,0.99356 -1.861734,1.55305 -1.205786,0.54984 -2.720253,0.54984 -1.919612,0 -3.221861,-0.55949 -1.292602,-0.55948 -2.035367,-1.67845 -0.733118,-1.12862 -0.771703,-2.54662 z"
|
||||
id="text4355"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="S" />
|
||||
<path
|
||||
d="m 118.59808,385.49997 v -14.14146 h 1.87138 v 14.14146 z"
|
||||
id="text4359"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="I" />
|
||||
<path
|
||||
d="m 147.72428,385.49997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4363"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 180.85853,385.49997 v -14.14146 h 5.30546 q 1.62057,0 2.59485,0.43408 0.98392,0.42444 1.53376,1.32154 0.55948,0.88746 0.55948,1.86174 0,0.90675 -0.49196,1.70739 -0.49196,0.80064 -1.48553,1.2926 1.28296,0.37621 1.96785,1.28296 0.69453,0.90675 0.69453,2.14148 0,0.99356 -0.42444,1.85208 -0.41479,0.84888 -1.03215,1.3119 -0.61736,0.46302 -1.55305,0.70418 -0.92605,0.23151 -2.27653,0.23151 z m 1.87138,-8.19935 h 3.05787 q 1.24437,0 1.78457,-0.16398 0.71382,-0.21222 1.07073,-0.70418 0.36656,-0.49196 0.36656,-1.23473 0,-0.70418 -0.33762,-1.23472 -0.33762,-0.54019 -0.96463,-0.73312 -0.62701,-0.20257 -2.15112,-0.20257 h -2.82636 z m 0,6.53054 h 3.52089 q 0.90675,0 1.27331,-0.0675 0.64631,-0.11576 1.08039,-0.38585 0.43408,-0.2701 0.71382,-0.78135 0.27975,-0.5209 0.27975,-1.19614 0,-0.791 -0.40515,-1.36978 -0.40514,-0.58842 -1.12861,-0.81993 -0.71383,-0.24116 -2.06431,-0.24116 h -3.27009 z"
|
||||
id="text4367"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="B" />
|
||||
<path
|
||||
d="m 214.22428,385.49997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4371"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 246.87138,385.49997 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42765,-11.11253 v 11.11253 z"
|
||||
id="text4375"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 280.11174,385.49997 v -1.73633 l 7.24437,-9.05787 q 0.7717,-0.96463 1.46623,-1.67845 h -7.89066 v -1.66881 h 10.1286 v 1.66881 l -7.93889,9.81027 -0.85852,0.99357 h 9.02892 v 1.66881 z"
|
||||
id="text4379"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 313.67043,385.49997 -3.75241,-14.14146 h 1.91961 l 2.15112,9.27008 q 0.34727,1.45659 0.59807,2.89389 0.54019,-2.26688 0.63666,-2.61414 l 2.69131,-9.54983 h 2.25723 l 2.02572,7.15755 q 0.76206,2.66237 1.09968,5.00642 0.2701,-1.34083 0.70418,-3.07717 l 2.21865,-9.0868 h 1.88102 l -3.8778,14.14146 h -1.80386 l -2.9807,-10.77491 q -0.37621,-1.35048 -0.44373,-1.65916 -0.22187,0.97428 -0.41479,1.65916 l -3,10.77491 z"
|
||||
id="text4383"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="W" />
|
||||
<path
|
||||
d="m 345.52171,378.61252 q 0,-3.5209 1.89068,-5.50803 1.89067,-1.99678 4.88102,-1.99678 1.95819,0 3.53054,0.93569 1.57235,0.93569 2.39228,2.61414 0.82958,1.66881 0.82958,3.79099 0,2.15112 -0.86817,3.84887 -0.86816,1.69775 -2.4598,2.57556 -1.59164,0.86817 -3.43408,0.86817 -1.99678,0 -3.56912,-0.96463 -1.57235,-0.96463 -2.38264,-2.63344 -0.81029,-1.66881 -0.81029,-3.53054 z m 1.92926,0.0289 q 0,2.55626 1.36977,4.03215 1.37942,1.46623 3.45338,1.46623 2.11253,0 3.47266,-1.48553 1.36977,-1.48552 1.36977,-4.21542 0,-1.72669 -0.58842,-3.00965 -0.57878,-1.2926 -1.70739,-1.99678 -1.11897,-0.71382 -2.51769,-0.71382 -1.98713,0 -3.42443,1.36977 -1.42765,1.36013 -1.42765,4.55305 z m 2.09325,-8.15112 v -1.97749 h 1.8135 v 1.97749 z m 3.59806,0 v -1.97749 h 1.8135 v 1.97749 z"
|
||||
id="text4387"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Ö" />
|
||||
<path
|
||||
d="m 381.45335,385.49997 v -14.14146 h 1.87138 v 12.47265 h 6.96462 v 1.66881 z"
|
||||
id="text4391"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="L" />
|
||||
<path
|
||||
d="m 414.33679,385.49997 v -14.14146 h 9.54018 v 1.66881 h -7.6688 v 4.37941 h 6.63665 v 1.66881 h -6.63665 v 6.42443 z"
|
||||
id="text4395"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="F" />
|
||||
<path
|
||||
d="m 80.611744,418.74997 v -1.73633 l 7.244363,-9.05787 q 0.771703,-0.96463 1.466236,-1.67845 h -7.890664 v -1.66881 h 10.128603 v 1.66881 l -7.938896,9.81027 -0.858519,0.99357 h 9.028926 v 1.66881 z"
|
||||
id="text4399"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 114.47431,418.74997 v -14.14146 h 10.22506 v 1.66881 h -8.35368 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4403"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 147.19856,418.74997 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 v 14.14146 h -1.87138 v -6.66559 h -7.35047 v 6.66559 z"
|
||||
id="text4407"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 180.37139,418.74997 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11253 v 11.11253 z"
|
||||
id="text4411"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 214.22428,418.74997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4415"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 256.1704,404.60851 h 1.87138 v 8.17041 q 0,2.13183 -0.48232,3.38584 -0.48231,1.25402 -1.74597,2.04502 -1.25402,0.78135 -3.29904,0.78135 -1.98713,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80385,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34726,0.86817 1.17684,1.34084 0.83923,0.47267 2.04502,0.47267 2.0643,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4419"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 280.12139,418.74997 v -14.14146 h 1.91961 l 7.42764,11.10288 v -11.10288 h 1.79421 v 14.14146 h -1.91961 l -7.42764,-11.11253 v 11.11253 z"
|
||||
id="text4423"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="N" />
|
||||
<path
|
||||
d="m 313.97428,418.74997 v -14.14146 h 10.22507 v 1.66881 h -8.35369 v 4.33118 h 7.82314 v 1.65916 h -7.82314 v 4.8135 h 8.68166 v 1.66881 z"
|
||||
id="text4427"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="E" />
|
||||
<path
|
||||
d="m 355.92041,404.60851 h 1.87138 v 8.17041 q 0,2.13183 -0.48231,3.38584 -0.48232,1.25402 -1.74598,2.04502 -1.25402,0.78135 -3.29903,0.78135 -1.98714,0 -3.2508,-0.68489 -1.26366,-0.68489 -1.80386,-1.97749 -0.54019,-1.30225 -0.54019,-3.54983 v -8.17041 h 1.87138 v 8.16076 q 0,1.84244 0.33762,2.72025 0.34727,0.86817 1.17685,1.34084 0.83923,0.47267 2.04501,0.47267 2.06431,0 2.94212,-0.93569 0.87781,-0.93569 0.87781,-3.59807 z"
|
||||
id="text4431"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="U" />
|
||||
<path
|
||||
d="m 379.94853,418.74997 v -14.14146 h 1.87138 v 5.80707 h 7.35047 v -5.80707 h 1.87138 v 14.14146 h -1.87138 v -6.66559 h -7.35047 v 6.66559 z"
|
||||
id="text4435"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="H" />
|
||||
<path
|
||||
d="m 413.16959,418.74997 v -14.14146 h 6.27009 q 1.89067,0 2.87459,0.38585 0.98392,0.37621 1.57235,1.34084 0.58842,0.96462 0.58842,2.13183 0,1.50482 -0.97427,2.53697 -0.97428,1.03215 -3.00965,1.31189 0.74277,0.35692 1.12862,0.70418 0.81994,0.75241 1.55305,1.88103 l 2.45981,3.84887 h -2.3537 l -1.87138,-2.94212 q -0.81993,-1.27331 -1.35048,-1.94855 -0.53054,-0.67524 -0.95498,-0.94534 -0.41479,-0.27009 -0.84887,-0.3762 -0.31833,-0.0675 -1.0418,-0.0675 h -2.17042 v 6.27973 z m 1.87138,-7.90031 h 4.0225 q 1.28296,0 2.00643,-0.26045 0.72347,-0.2701 1.09968,-0.84887 0.3762,-0.58843 0.3762,-1.27331 0,-1.00322 -0.73311,-1.64952 -0.72348,-0.6463 -2.29582,-0.6463 h -4.47588 z"
|
||||
id="text4439"
|
||||
style="font-size:19.7556px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;white-space:pre;fill:#ffffff;stroke-width:0.264583px"
|
||||
transform="translate(-2.6356579,-6.03331)"
|
||||
aria-label="R" />
|
||||
</g>
|
||||
<g
|
||||
id="g1663"
|
||||
transform="translate(252.87499,354.25)"
|
||||
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
inkscape:label="Minus"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
id="rect4466-1-4"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="M 7.7500038,84.25 H 19.750004 v 2 H 7.7500038 Z" />
|
||||
<path
|
||||
id="rect4466-1-4-2"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="m 41.000004,84.25 h 12 v 2 h -12 z" />
|
||||
<path
|
||||
id="rect4466-1-4-9"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="m -25.499994,84.25 h 12 v 2 h -12 z" />
|
||||
<path
|
||||
id="rect4466-1-4-6"
|
||||
style="fill:#ffffff;stroke-width:0.184347"
|
||||
d="m -58.749992,84.25 h 12 v 2 h -12 z" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 84 KiB |
@@ -1,80 +1,83 @@
|
||||
|
||||
<!DOCTYPE HTML> <!-- For more information visit: https://fipsok.de -->
|
||||
<html lang="de">
|
||||
<head>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<title>Filesystem Manager</title>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
list(JSON.parse(localStorage.getItem('sortBy')));
|
||||
btn.addEventListener('click', () => {
|
||||
if (!confirm(`Wirklich formatieren? Alle Daten gehen verloren.\nDu musst anschließend fs.html wieder laden.`)) event.preventDefault();
|
||||
});
|
||||
});
|
||||
function list(to){
|
||||
let myList = document.querySelector('main'), noted = '';
|
||||
fetch(`?sort=${to}`).then( (response) => {
|
||||
return response.json();
|
||||
}).then((json) => {
|
||||
myList.innerHTML = '<nav><input type="radio" id="/" name="group" checked="checked"><label for="/"> 📁</label><span id="cr">+📁</nav></span><span id="si"></span>';
|
||||
document.querySelector('form').setAttribute('action', '/upload?f=');
|
||||
for (var i = 0; i < json.length - 1; i++) {
|
||||
let dir = '', f = json[i].folder, n = json[i].name;
|
||||
if (f != noted) {
|
||||
noted = f;
|
||||
dir = `<nav><input type="radio" id="${f}" name="group"><label for="${f}"></label> 📁 ${f} <a href="?delete=/${f}">🗑️</a></nav>`;
|
||||
}
|
||||
if (n != '') dir += `<li><a href="${f}/${n}">${n}</a><small> ${json[i].size}</small><a href="${f}/${n}"download="${n}"> Download</a> or<a href="?delete=${f}/${n}"> Delete</a>`;
|
||||
myList.insertAdjacentHTML('beforeend', dir);
|
||||
}
|
||||
myList.insertAdjacentHTML('beforeend', `<li><b id="so">${to ? '▼' : '▲'} LittleFS</b> belegt ${json[i].usedBytes.replace(".00", "")} von ${json[i].totalBytes.replace(".00", "")}`);
|
||||
var free = json[i].freeBytes;
|
||||
cr.addEventListener('click', () => {
|
||||
document.getElementById('no').classList.toggle('no');
|
||||
});
|
||||
so.addEventListener('click', () => {
|
||||
list(to=++to%2);
|
||||
localStorage.setItem('sortBy', JSON.stringify(to));
|
||||
});
|
||||
document.addEventListener('change', (e) => {
|
||||
if (e.target.id == 'fs') {
|
||||
for (var bytes = 0, i = 0; i < event.target.files.length; i++) bytes += event.target.files[i].size;
|
||||
for (var output = `${bytes} Byte`, i = 0, circa = bytes / 1024; circa > 1; circa /= 1024) output = circa.toFixed(2) + [' KB', ' MB', ' GB'][i++];
|
||||
if (bytes > free) {
|
||||
si.innerHTML = `<li><b> ${output}</b><strong> Ungenügend Speicher frei</strong></li>`;
|
||||
up.setAttribute('disabled', 'disabled');
|
||||
}
|
||||
else {
|
||||
si.innerHTML = `<li><b>Dateigröße:</b> ${output}</li>`;
|
||||
up.removeAttribute('disabled');
|
||||
}
|
||||
}
|
||||
document.querySelectorAll(`input[type=radio]`).forEach(el => { if (el.checked) document.querySelector('form').setAttribute('action', '/upload?f=' + el.id)});
|
||||
});
|
||||
document.querySelectorAll('[href^="?delete=/"]').forEach(node => {
|
||||
node.addEventListener('click', () => {
|
||||
if (!confirm('Sicher!')) event.preventDefault();
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
list(JSON.parse(localStorage.getItem('sortBy')));
|
||||
btn.addEventListener('click', () => {
|
||||
if (!confirm(`Wirklich formatieren? Alle Daten gehen verloren.\nDu musst anschließend fs.html wieder laden.`)) event.preventDefault();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
function list(to) {
|
||||
let myList = document.querySelector('main'), noted = '';
|
||||
fetch(`?sort=${to}`).then((response) => {
|
||||
return response.json();
|
||||
}).then((json) => {
|
||||
myList.innerHTML = '<nav><input type="radio" id="/" name="group" checked="checked"><label for="/"> 📁</label><span id="cr">+📁</nav></span><span id="si"></span>';
|
||||
document.querySelector('form').setAttribute('action', '/upload?f=');
|
||||
for (var i = 0; i < json.length - 1; i++) {
|
||||
let dir = '', f = json[i].folder, n = json[i].name;
|
||||
if (f != noted) {
|
||||
noted = f;
|
||||
dir = `<nav><input type="radio" id="${f}" name="group"><label for="${f}"></label> 📁 ${f} <a href="?delete=/${f}">🗑️</a></nav>`;
|
||||
}
|
||||
if (n != '') dir += `<li><a href="${f}/${n}">${n}</a><small> ${json[i].size}</small><a href="${f}/${n}"download="${n}"> Download</a> or<a href="?delete=${f}/${n}"> Delete</a>`;
|
||||
myList.insertAdjacentHTML('beforeend', dir);
|
||||
}
|
||||
myList.insertAdjacentHTML('beforeend', `<li><b id="so">${to ? '▼' : '▲'} LittleFS</b> belegt ${json[i].usedBytes.replace(".00", "")} von ${json[i].totalBytes.replace(".00", "")}`);
|
||||
var free = json[i].freeBytes;
|
||||
cr.addEventListener('click', () => {
|
||||
document.getElementById('no').classList.toggle('no');
|
||||
});
|
||||
so.addEventListener('click', () => {
|
||||
list(to = ++to % 2);
|
||||
localStorage.setItem('sortBy', JSON.stringify(to));
|
||||
});
|
||||
document.addEventListener('change', (e) => {
|
||||
if (e.target.id == 'fs') {
|
||||
for (var bytes = 0, i = 0; i < event.target.files.length; i++) bytes += event.target.files[i].size;
|
||||
for (var output = `${bytes} Byte`, i = 0, circa = bytes / 1024; circa > 1; circa /= 1024) output = circa.toFixed(2) + [' KB', ' MB', ' GB'][i++];
|
||||
if (bytes > free) {
|
||||
si.innerHTML = `<li><b> ${output}</b><strong> Ungenügend Speicher frei</strong></li>`;
|
||||
up.setAttribute('disabled', 'disabled');
|
||||
}
|
||||
else {
|
||||
si.innerHTML = `<li><b>Dateigröße:</b> ${output}</li>`;
|
||||
up.removeAttribute('disabled');
|
||||
}
|
||||
}
|
||||
document.querySelectorAll(`input[type=radio]`).forEach(el => { if (el.checked) document.querySelector('form').setAttribute('action', '/upload?f=' + el.id) });
|
||||
});
|
||||
document.querySelectorAll('[href^="?delete=/"]').forEach(node => {
|
||||
node.addEventListener('click', () => {
|
||||
if (!confirm('Sicher!')) event.preventDefault();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h2>ESP8266 Filesystem Manager</h2>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<input id="fs" type="file" name="up[]" multiple>
|
||||
<button id="up" disabled>Upload</button>
|
||||
<input id="fs" type="file" name="up[]" multiple>
|
||||
<button id="up" disabled>Upload</button>
|
||||
</form>
|
||||
<form id="no" class="no" method="POST">
|
||||
<input name="new" placeholder="Ordner Name" pattern="[^\x22/%&\\:;]{1,31}" title="Zeichen “ % & / : ; \ sind nicht erlaubt." required="">
|
||||
<button>Create</button>
|
||||
<input name="new" placeholder="Ordner Name" pattern="[^\x22/%&\\:;]{1,31}"
|
||||
title="Zeichen “ % & / : ; \ sind nicht erlaubt." required="">
|
||||
<button>Create</button>
|
||||
</form>
|
||||
<main></main>
|
||||
<form action="/format" method="POST">
|
||||
<button id="btn">Format LittleFS</button>
|
||||
<button id="btn">Format LittleFS</button>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
71
res/webserver/icons/hearts.svg
Normal file
71
res/webserver/icons/hearts.svg
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="50mm"
|
||||
height="50mm"
|
||||
version="1.1"
|
||||
viewBox="0 0 50 50"
|
||||
id="svg4"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<metadata
|
||||
id="metadata1">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(-60.99,-59.667)"
|
||||
display="none"
|
||||
id="g1">
|
||||
<rect
|
||||
x="-30.238001"
|
||||
y="-2.0789001"
|
||||
width="265.14999"
|
||||
height="146.28"
|
||||
fill="#1b2131"
|
||||
fill-rule="evenodd"
|
||||
opacity="0.998"
|
||||
id="rect1" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-158.51 -1.487)"
|
||||
stroke="#fff"
|
||||
id="g2">
|
||||
<rect
|
||||
x="159.51"
|
||||
y="2.487"
|
||||
width="48"
|
||||
height="48"
|
||||
ry="6.8036"
|
||||
fill="none"
|
||||
opacity=".998"
|
||||
stroke="#fff"
|
||||
stroke-dashoffset="37.795"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
id="rect2" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-60.944598,-60.498371)"
|
||||
fill="none"
|
||||
stroke="#ffffff"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
id="g4">
|
||||
<path
|
||||
d="m 98.493049,73.311072 c -1.567368,-1.782803 -3.642384,-2.757209 -5.857002,-2.757209 -2.214619,0 -4.29598,0.981624 -5.863346,2.764427 l -0.818584,0.9311 -0.831275,-0.945536 c -1.567366,-1.782803 -3.655074,-2.771645 -5.869692,-2.771645 -2.208273,0 -4.289634,0.981625 -5.850654,2.757209 -1.567366,1.782803 -2.43037,4.15025 -2.424025,6.669271 0,2.519022 0.86935,4.87925 2.436716,6.662054 l 11.91706,13.555077 c 0.164986,0.18766 0.387082,0.28871 0.602834,0.28871 0.21575,0 0.437847,-0.0938 0.602832,-0.28149 l 11.94244,-13.533427 c 1.567367,-1.782803 2.430367,-4.150249 2.430367,-6.66927 0.006,-2.519021 -0.85031,-4.886468 -2.417671,-6.669271 z M 97.274689,85.271009 85.935081,98.118738 74.620853,85.249355 c -1.24374,-1.414693 -1.929067,-3.291328 -1.929067,-5.290666 0,-1.999337 0.678982,-3.875972 1.922721,-5.283447 1.237395,-1.407477 2.887254,-2.187003 4.638643,-2.187003 1.757735,0 3.413939,0.779526 4.657679,2.19422 l 1.43411,1.631228 c 0.336317,0.382545 0.875694,0.382545 1.212012,0 l 1.421416,-1.616792 c 1.24374,-1.414695 2.899945,-2.194219 4.651334,-2.194219 1.751392,0 3.401248,0.779524 4.644988,2.187001 1.24374,1.414694 1.922718,3.291328 1.922718,5.290666 0.0064,1.999337 -0.678978,3.875972 -1.922718,5.290666 z"
|
||||
id="path1"
|
||||
style="fill:#ffffff;stroke-width:0.067677" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,3 @@
|
||||
|
||||
/* For more information visit:https://fipsok.de */
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
@@ -7,72 +6,89 @@ body {
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
}
|
||||
h1,h2 {
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
color: #e1e1e1;
|
||||
text-shadow: 2px 2px 2px black;
|
||||
}
|
||||
|
||||
li {
|
||||
background-color: #feb1e2;
|
||||
list-style-type: none;
|
||||
margin-bottom: 10px;
|
||||
padding: 2px 5px 1px 0;
|
||||
box-shadow: 5px 5px 5px rgba(0,0,0,0.7);
|
||||
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
li a:first-child, li b {
|
||||
|
||||
li a:first-child,
|
||||
li b {
|
||||
background-color: #8f05a5;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration:none;
|
||||
text-decoration: none;
|
||||
padding: 2px 5px;
|
||||
text-shadow: 2px 2px 1px black;
|
||||
cursor:pointer;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li strong {
|
||||
color: red;
|
||||
}
|
||||
|
||||
input {
|
||||
height:35px;
|
||||
font-size:14px;
|
||||
height: 35px;
|
||||
font-size: 14px;
|
||||
padding-left: .3em;
|
||||
}
|
||||
label + a {
|
||||
|
||||
label+a {
|
||||
text-decoration: none;
|
||||
}
|
||||
h1 + main {
|
||||
|
||||
h1+main {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
aside {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 0.2em;
|
||||
}
|
||||
|
||||
button {
|
||||
height:40px;
|
||||
width:130px;
|
||||
font-size:16px;
|
||||
height: 40px;
|
||||
width: 130px;
|
||||
font-size: 16px;
|
||||
margin-top: 1em;
|
||||
box-shadow: 5px 5px 5px rgba(0,0,0,0.7);
|
||||
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
div button {
|
||||
background-color: #7bff97;
|
||||
}
|
||||
|
||||
nav {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
#left {
|
||||
align-items:flex-end;
|
||||
align-items: flex-end;
|
||||
text-shadow: 0.5px 0.5px 1px #757474;
|
||||
}
|
||||
|
||||
#cr {
|
||||
font-weight: bold;
|
||||
cursor:pointer;
|
||||
cursor: pointer;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
#up {
|
||||
width: auto;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.note {
|
||||
background-color: #fecdee;
|
||||
padding: 0.5em;
|
||||
@@ -81,31 +97,39 @@ nav {
|
||||
max-width: 320px;
|
||||
border-radius: 0.5em;
|
||||
}
|
||||
|
||||
.no {
|
||||
display: none;
|
||||
}
|
||||
|
||||
form [title] {
|
||||
background-color: skyblue;
|
||||
font-size: 16px;
|
||||
width: 125px;
|
||||
}
|
||||
|
||||
form:nth-of-type(2) {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
[value*=Format] {
|
||||
margin-top: 1em;
|
||||
box-shadow: 5px 5px 5px rgba(0,0,0,0.7);
|
||||
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
[name="group"] {
|
||||
display: none;
|
||||
}
|
||||
[name="group"] + label {
|
||||
|
||||
[name="group"]+label {
|
||||
font-size: 1.5em;
|
||||
margin-right: 5px;
|
||||
}
|
||||
[name="group"] + label::before {
|
||||
|
||||
[name="group"]+label::before {
|
||||
content: "\002610";
|
||||
}
|
||||
[name="group"]:checked + label::before {
|
||||
content: '\002611\0027A5';
|
||||
}
|
||||
|
||||
[name="group"]:checked+label::before {
|
||||
content: '\002611\0027A5';
|
||||
}
|
||||
13
scripts/http_diagnosis.py
Normal file
13
scripts/http_diagnosis.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import requests
|
||||
|
||||
r = requests.get("http://wordclock.local/cmd?diag=reset_info")
|
||||
print(r.status_code)
|
||||
print(r.text)
|
||||
|
||||
r = requests.get("http://wordclock.local/cmd?diag=sketch_info")
|
||||
print(r.status_code)
|
||||
print(r.text)
|
||||
|
||||
r = requests.get("http://wordclock.local/cmd?diag=device_info")
|
||||
print(r.status_code)
|
||||
print(r.text)
|
||||
@@ -1,14 +1,33 @@
|
||||
from datetime import datetime
|
||||
import logging
|
||||
import queue
|
||||
import socket
|
||||
import struct
|
||||
import sys
|
||||
from datetime import datetime
|
||||
import queue
|
||||
from pathlib import Path
|
||||
|
||||
# ip address of network interface
|
||||
MCAST_IF_IP = '192.168.178.66'
|
||||
LOG_PATH = Path("C:/temp/wordclock_log.txt")
|
||||
|
||||
multicast_group = '230.120.10.2'
|
||||
server_address = ('', 8123)
|
||||
def setup_logging():
|
||||
FORMAT = "%(asctime)s %(message)s"
|
||||
logging.basicConfig(format=FORMAT, level=logging.INFO)
|
||||
logger = logging.getLogger()
|
||||
handler = logging.FileHandler(LOG_PATH)
|
||||
handler.setLevel(logging.INFO)
|
||||
logger.addHandler(handler)
|
||||
return logger
|
||||
|
||||
|
||||
def get_ip_address():
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
s.connect(("1.1.1.1", 80))
|
||||
return s.getsockname()[0]
|
||||
|
||||
|
||||
logger = setup_logging()
|
||||
|
||||
multicast_group = "230.120.10.2"
|
||||
server_address = ("", 8123)
|
||||
|
||||
# Create the socket
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
@@ -16,44 +35,18 @@ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
# Bind to the server address
|
||||
sock.bind(server_address)
|
||||
|
||||
print("Start")
|
||||
logging.info("Start")
|
||||
|
||||
# Tell the operating system to add the socket to the multicast group
|
||||
# on all interfaces.
|
||||
group = socket.inet_aton(multicast_group)
|
||||
mreq = struct.pack('4s4s', group, socket.inet_aton(MCAST_IF_IP))
|
||||
mreq = struct.pack("4s4s", group, socket.inet_aton(get_ip_address()))
|
||||
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
|
||||
|
||||
print("Ready")
|
||||
saveCounter = 0
|
||||
|
||||
buffer = queue.Queue(20)
|
||||
logger.info("Ready")
|
||||
|
||||
# Receive/respond loop
|
||||
while True:
|
||||
data, address = sock.recvfrom(1024)
|
||||
data_str = data.decode("utf-8").strip()
|
||||
print(address, ": ", data_str)
|
||||
data_str = datetime.now().strftime('%b-%d-%Y_%H%M%S') + ": " + data_str
|
||||
buffer.put(data_str)
|
||||
if buffer.full():
|
||||
buffer.get()
|
||||
|
||||
|
||||
if "NTP-Update not successful" in data_str or "Start program" in data_str:
|
||||
f = open("log.txt",'a')
|
||||
while not buffer.empty():
|
||||
f.write(buffer.get())
|
||||
f.write("\n")
|
||||
f.close()
|
||||
saveCounter = 20
|
||||
|
||||
if saveCounter > 0:
|
||||
f = open("log.txt",'a')
|
||||
f.write(data_str)
|
||||
f.write("\n")
|
||||
if saveCounter == 1:
|
||||
f.write("\n")
|
||||
f.close()
|
||||
saveCounter -= 1
|
||||
|
||||
logger.info(data_str)
|
||||
|
||||
BIN
scripts/requirements.txt
Normal file
BIN
scripts/requirements.txt
Normal file
Binary file not shown.
93
src/connectivity/diagnosis.cpp
Normal file
93
src/connectivity/diagnosis.cpp
Normal file
@@ -0,0 +1,93 @@
|
||||
#include "diagnosis.h"
|
||||
|
||||
Diagnosis::Diagnosis()
|
||||
{
|
||||
_logger = nullptr;
|
||||
}
|
||||
|
||||
Diagnosis::Diagnosis(UDPLogger *logger, LEDMatrix *matrix) // constructor
|
||||
{
|
||||
_logger = logger;
|
||||
_matrix = matrix;
|
||||
}
|
||||
|
||||
String Diagnosis::handle_command(const String &command)
|
||||
{
|
||||
if (command == "device_info")
|
||||
{
|
||||
return print_device_info();
|
||||
}
|
||||
else if (command == "sketch_info")
|
||||
{
|
||||
return print_sketch_info();
|
||||
}
|
||||
else if (command == "reset_info")
|
||||
{
|
||||
return print_last_reset_details();
|
||||
}
|
||||
else if (command == "matrix_fps")
|
||||
{
|
||||
return print_matrix_fps();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Handle unknown command
|
||||
String unknown_command = "Diagnosis: Unknown command!\n";
|
||||
print(unknown_command);
|
||||
return unknown_command;
|
||||
}
|
||||
}
|
||||
|
||||
String Diagnosis::print_device_info()
|
||||
{
|
||||
// Retrieve and print device information
|
||||
String device_info = "Device Information:\n";
|
||||
device_info += "Chip ID: " + String(ESP.getChipId()) + "\n";
|
||||
device_info += "Flash Chip ID: " + String(ESP.getFlashChipId()) + "\n";
|
||||
device_info += "Flash Chip Size: " + String(ESP.getFlashChipSize()) + " bytes\n";
|
||||
device_info += "Free Heap Size: " + String(ESP.getFreeHeap()) + " bytes\n";
|
||||
device_info += "Free Sketch Space: " + String(ESP.getFreeSketchSpace()) + " bytes\n";
|
||||
device_info += "SDK Version: " + String(ESP.getSdkVersion()) + "\n";
|
||||
print(device_info);
|
||||
return device_info;
|
||||
}
|
||||
|
||||
String Diagnosis::print_sketch_info()
|
||||
{
|
||||
// Retrieve and print sketch information
|
||||
String sketch_info = "Sketch Information:\n";
|
||||
sketch_info += "Sketch Size: " + String(ESP.getSketchSize()) + " bytes\n";
|
||||
sketch_info += "Sketch MD5: " + String(ESP.getSketchMD5()) + "\n";
|
||||
print(sketch_info);
|
||||
return sketch_info;
|
||||
}
|
||||
|
||||
String Diagnosis::print_last_reset_details()
|
||||
{
|
||||
// Retrieve and print last reset details
|
||||
String reset_info = "Last Reset Details:\n";
|
||||
reset_info += "Reset Reason: " + String(ESP.getResetReason()) + "\n";
|
||||
reset_info += "Reset Info: " + String(ESP.getResetInfo()) + "\n";
|
||||
print(reset_info);
|
||||
return reset_info;
|
||||
}
|
||||
|
||||
String Diagnosis::print_matrix_fps()
|
||||
{
|
||||
// Retrieve and print matrix FPS
|
||||
String matrix_fps = "Matrix FPS: " + String(_matrix->get_fps()) + "\n";
|
||||
print(matrix_fps);
|
||||
return matrix_fps;
|
||||
}
|
||||
|
||||
void Diagnosis::print(const String &s)
|
||||
{
|
||||
if (_logger != nullptr)
|
||||
{
|
||||
_logger->log_string(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println(s);
|
||||
}
|
||||
}
|
||||
@@ -1,693 +0,0 @@
|
||||
#include <Arduino.h>
|
||||
#include "ntp_client_plus.h"
|
||||
|
||||
/**
|
||||
* @brief Construct a new NTPClientPlus::NTPClientPlus object
|
||||
*
|
||||
* @param udp UDP client
|
||||
* @param poolServerName time server name
|
||||
* @param utcx UTC offset (in 1h)
|
||||
* @param _swChange should summer/winter time be considered
|
||||
*/
|
||||
NTPClientPlus::NTPClientPlus(UDP &udp, const char *poolServerName, int utcx, bool _swChange)
|
||||
{
|
||||
this->_udp = &udp;
|
||||
this->_utcx = utcx;
|
||||
this->_timeOffset = this->secondperhour * this->_utcx;
|
||||
this->_poolServerName = poolServerName;
|
||||
this->_swChange = _swChange;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Starts the underlying UDP client, get first NTP timestamp and calc date
|
||||
*
|
||||
*/
|
||||
void NTPClientPlus::setupNTPClient()
|
||||
{
|
||||
this->_udp->begin(this->_port);
|
||||
this->_udpSetup = true;
|
||||
this->updateNTP();
|
||||
this->calcDate();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get new update from NTP
|
||||
*
|
||||
* @return NTP_UPDATE_TIMEOUT timeout after 500 ms
|
||||
* @return NTP_UPDATE_SUCCESS after successful update
|
||||
* @return NTP_UPDATE_DIFFTOOHIGH too much difference to previous received time (try again)
|
||||
* @return NTP_UPDATE_TIME_INVALID time value is invalid
|
||||
*/
|
||||
int NTPClientPlus::updateNTP()
|
||||
{
|
||||
|
||||
// flush any existing packets
|
||||
while (this->_udp->parsePacket() != 0)
|
||||
{
|
||||
this->_udp->flush();
|
||||
}
|
||||
|
||||
this->sendNTPPacket();
|
||||
|
||||
// Wait till data is there or timeout...
|
||||
uint8_t conn_tries = 0;
|
||||
int received_bytes = 0;
|
||||
|
||||
while ((received_bytes == 0) && (conn_tries++ <= MAX_NTP_CONN_TRIES))
|
||||
{
|
||||
received_bytes = this->_udp->parsePacket();
|
||||
wait(NTP_RECEIVE_WAIT_TIME_MS);
|
||||
}
|
||||
|
||||
if (conn_tries >= MAX_NTP_CONN_TRIES)
|
||||
{
|
||||
return NTP_UPDATE_TIMEOUT;
|
||||
}
|
||||
|
||||
this->_udp->read(this->_packetBuffer, NTP_PACKET_SIZE);
|
||||
|
||||
unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]);
|
||||
unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]);
|
||||
// combine the four bytes (two words) into a long integer
|
||||
// this is NTP time (seconds since Jan 1 1900):
|
||||
unsigned long tempSecsSince1900 = highWord << 16 | lowWord;
|
||||
|
||||
if (tempSecsSince1900 < UNIX_TIMESTAMP_1900) // NTP time is not valid
|
||||
{
|
||||
return NTP_UPDATE_TIME_INVALID;
|
||||
}
|
||||
|
||||
// check if time off last ntp update is roughly in the same range: 100sec apart (validation check)
|
||||
if (this->_lastSecsSince1900 == 0 || tempSecsSince1900 - this->_lastSecsSince1900 < 100000)
|
||||
{
|
||||
// Only update time then
|
||||
this->_lastUpdate = millis() - (NTP_RECEIVE_WAIT_TIME_MS * (conn_tries + 1)); // Account for delay in reading the time
|
||||
this->_secsSince1900 = tempSecsSince1900;
|
||||
this->_currentEpoc = this->_secsSince1900 - UNIX_TIMESTAMP_1900;
|
||||
|
||||
// Remember time of last update
|
||||
this->_lastSecsSince1900 = tempSecsSince1900;
|
||||
return NTP_UPDATE_SUCCESS; // return 0 after successful update
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remember time of last update
|
||||
this->_lastSecsSince1900 = tempSecsSince1900;
|
||||
return NTP_UPDATE_DIFFTOOHIGH;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Stops the underlying UDP client
|
||||
*
|
||||
*/
|
||||
void NTPClientPlus::end()
|
||||
{
|
||||
this->_udp->stop();
|
||||
this->_udpSetup = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Setter TimeOffset
|
||||
*
|
||||
* @param timeOffset offset from UTC in seconds
|
||||
*/
|
||||
void NTPClientPlus::setTimeOffset(int timeOffset)
|
||||
{
|
||||
this->_timeOffset = timeOffset;
|
||||
}
|
||||
|
||||
long NTPClientPlus::getTimeOffset()
|
||||
{
|
||||
return this->_timeOffset;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set time server name
|
||||
*
|
||||
* @param poolServerName
|
||||
*/
|
||||
void NTPClientPlus::setPoolServerName(const char *poolServerName)
|
||||
{
|
||||
this->_poolServerName = poolServerName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calc seconds since 1. Jan. 1900
|
||||
*
|
||||
* @return unsigned long seconds since 1. Jan. 1900
|
||||
*/
|
||||
unsigned long NTPClientPlus::getSecsSince1900() const
|
||||
{
|
||||
return this->_timeOffset + // User offset
|
||||
this->_secsSince1900 + // seconds returned by the NTP server
|
||||
((millis() - this->_lastUpdate) / 1000); // Time since last update
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get UNIX Epoch time since 1. Jan. 1970
|
||||
*
|
||||
* @return unsigned long UNIX Epoch time since 1. Jan. 1970 in seconds
|
||||
*/
|
||||
unsigned long NTPClientPlus::getEpochTime() const
|
||||
{
|
||||
return this->getSecsSince1900() - UNIX_TIMESTAMP_1900;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get current hours in 24h format
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int NTPClientPlus::getHours24() const
|
||||
{
|
||||
int hours = ((this->getEpochTime() % 86400L) / 3600);
|
||||
return hours;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get current hours in 12h format
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int NTPClientPlus::getHours12() const
|
||||
{
|
||||
int hours = this->getHours24();
|
||||
if (hours >= 12)
|
||||
{
|
||||
hours = hours - 12;
|
||||
}
|
||||
return hours;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get current minutes
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int NTPClientPlus::getMinutes() const
|
||||
{
|
||||
return ((this->getEpochTime() % 3600) / 60);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get current seconds
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int NTPClientPlus::getSeconds() const
|
||||
{
|
||||
return (this->getEpochTime() % 60);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @return String time formatted like `hh:mm:ss`
|
||||
*/
|
||||
String NTPClientPlus::getFormattedTime() const
|
||||
{
|
||||
unsigned long rawTime = this->getEpochTime();
|
||||
unsigned long hours = (rawTime % 86400L) / 3600;
|
||||
String hoursStr = hours < 10 ? "0" + String(hours) : String(hours);
|
||||
|
||||
unsigned long minutes = (rawTime % 3600) / 60;
|
||||
String minuteStr = minutes < 10 ? "0" + String(minutes) : String(minutes);
|
||||
|
||||
unsigned long seconds = rawTime % 60;
|
||||
String secondStr = seconds < 10 ? "0" + String(seconds) : String(seconds);
|
||||
|
||||
return hoursStr + ":" + minuteStr + ":" + secondStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @return String date formatted like `dd.mm.yyyy`
|
||||
*/
|
||||
String NTPClientPlus::getFormattedDate()
|
||||
{
|
||||
this->calcDate();
|
||||
unsigned int dateDay = this->_dateDay;
|
||||
unsigned int dateMonth = this->_dateMonth;
|
||||
unsigned int dateYear = this->_dateYear;
|
||||
|
||||
String dayStr = dateDay < 10 ? "0" + String(dateDay) : String(dateDay);
|
||||
String monthStr = dateMonth < 10 ? "0" + String(dateMonth) : String(dateMonth);
|
||||
String yearStr = dateYear < 10 ? "0" + String(dateYear) : String(dateYear);
|
||||
|
||||
return dayStr + "." + monthStr + "." + yearStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calc date from seconds since 1900
|
||||
*
|
||||
*/
|
||||
void NTPClientPlus::calcDate()
|
||||
{
|
||||
// Start: Calc date
|
||||
|
||||
// get days since 1900
|
||||
unsigned long days1900 = this->getSecsSince1900() / secondperday;
|
||||
|
||||
// calc current year
|
||||
this->_dateYear = this->getYear();
|
||||
|
||||
// calc how many leap days since 1.Jan 1900
|
||||
int leapDays = 0;
|
||||
for (unsigned int i = 1900; i < this->_dateYear; i++)
|
||||
{
|
||||
// check if leap year
|
||||
if (this->isLeapYear(i))
|
||||
{
|
||||
leapDays++;
|
||||
}
|
||||
}
|
||||
leapDays = leapDays - 1;
|
||||
|
||||
// check if current year is leap year
|
||||
if (this->isLeapYear(this->_dateYear))
|
||||
{
|
||||
daysInMonth[2] = 29;
|
||||
}
|
||||
else
|
||||
{
|
||||
daysInMonth[2] = 28;
|
||||
}
|
||||
|
||||
unsigned int dayOfYear = (days1900 - ((this->_dateYear - 1900) * 365) - leapDays);
|
||||
|
||||
// calc current month
|
||||
this->_dateMonth = this->getMonth(dayOfYear);
|
||||
|
||||
this->_dateDay = 0;
|
||||
|
||||
// calc day of month
|
||||
for (unsigned int i = 0; i < this->_dateMonth; i++)
|
||||
{
|
||||
this->_dateDay = this->_dateDay + daysInMonth[i];
|
||||
}
|
||||
this->_dateDay = dayOfYear - this->_dateDay;
|
||||
|
||||
// calc day of week:
|
||||
// Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6, Sunday = 7
|
||||
// 1. Januar 1900 was a monday
|
||||
this->_dayOfWeek = 1;
|
||||
|
||||
for (unsigned int i = 0; i < days1900; i++)
|
||||
{
|
||||
if (this->_dayOfWeek < 7)
|
||||
{
|
||||
this->_dayOfWeek = this->_dayOfWeek + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->_dayOfWeek = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// End: Calc date (dateDay, dateMonth, dateYear)
|
||||
|
||||
// calc if summer time active
|
||||
|
||||
this->updateSWChange();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Getter for day of the week
|
||||
*
|
||||
* @return unsigned int
|
||||
*/
|
||||
unsigned int NTPClientPlus::getDayOfWeek()
|
||||
{
|
||||
return this->_dayOfWeek;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Function to calc current year
|
||||
*
|
||||
* @return unsigned int
|
||||
*/
|
||||
unsigned int NTPClientPlus::getYear()
|
||||
{
|
||||
|
||||
unsigned long sec1900 = this->getSecsSince1900();
|
||||
|
||||
// NTP starts at 1. Jan 1900
|
||||
unsigned int result = 1900;
|
||||
unsigned int dayInYear = 0;
|
||||
unsigned int days = 0;
|
||||
unsigned int days1900 = 0;
|
||||
|
||||
unsigned int for_i = 0;
|
||||
bool leapYear = LOW;
|
||||
|
||||
days1900 = sec1900 / this->secondperday;
|
||||
|
||||
for (for_i = 0; for_i < days1900; for_i++)
|
||||
{
|
||||
|
||||
leapYear = this->isLeapYear(result);
|
||||
|
||||
if (leapYear)
|
||||
{
|
||||
dayInYear = 366;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
dayInYear = 365;
|
||||
}
|
||||
|
||||
days++;
|
||||
|
||||
if (days >= dayInYear)
|
||||
{
|
||||
result++;
|
||||
days = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Function to check if given year is leap year
|
||||
*
|
||||
* @param year
|
||||
* @return true
|
||||
* @return false
|
||||
*/
|
||||
bool NTPClientPlus::isLeapYear(unsigned int year)
|
||||
{
|
||||
|
||||
bool result = LOW;
|
||||
|
||||
// check for leap year
|
||||
if ((year % 4) == 0)
|
||||
{
|
||||
|
||||
result = HIGH;
|
||||
|
||||
if ((year % 100) == 0)
|
||||
{
|
||||
|
||||
result = LOW;
|
||||
|
||||
if ((year % 400) == 0)
|
||||
{
|
||||
|
||||
result = HIGH;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
result = LOW;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get Month of given day of year
|
||||
*
|
||||
* @param dayOfYear
|
||||
* @return int
|
||||
*/
|
||||
int NTPClientPlus::getMonth(int dayOfYear)
|
||||
{
|
||||
|
||||
bool leapYear = this->isLeapYear(this->getYear());
|
||||
|
||||
// Month beginnings
|
||||
int monthMin[13] = {0, 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
|
||||
// Month endings
|
||||
int monthMax[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
|
||||
|
||||
int month = 0;
|
||||
|
||||
int y = 0;
|
||||
|
||||
// Calculation of the beginning and end of each month in the leap year
|
||||
if (leapYear == HIGH)
|
||||
{
|
||||
|
||||
for (y = 3; y < 13; y++)
|
||||
{
|
||||
monthMin[y] = monthMin[y] + 1;
|
||||
}
|
||||
|
||||
for (y = 2; y < 13; y++)
|
||||
{
|
||||
monthMax[y] = monthMax[y] + 1;
|
||||
}
|
||||
}
|
||||
|
||||
// January
|
||||
if (dayOfYear >= monthMin[1] && dayOfYear <= monthMax[1])
|
||||
{
|
||||
month = 1;
|
||||
}
|
||||
|
||||
// February
|
||||
if (dayOfYear >= monthMin[2] && dayOfYear <= monthMax[2])
|
||||
{
|
||||
month = 2;
|
||||
}
|
||||
|
||||
// March
|
||||
if (dayOfYear >= monthMin[3] && dayOfYear <= monthMax[3])
|
||||
{
|
||||
month = 3;
|
||||
}
|
||||
|
||||
// April
|
||||
if (dayOfYear >= monthMin[4] && dayOfYear <= monthMax[4])
|
||||
{
|
||||
month = 4;
|
||||
}
|
||||
|
||||
// May
|
||||
if (dayOfYear >= monthMin[5] && dayOfYear <= monthMax[5])
|
||||
{
|
||||
month = 5;
|
||||
}
|
||||
|
||||
// June
|
||||
if (dayOfYear >= monthMin[6] && dayOfYear <= monthMax[6])
|
||||
{
|
||||
month = 6;
|
||||
}
|
||||
|
||||
// July
|
||||
if (dayOfYear >= monthMin[7] && dayOfYear <= monthMax[7])
|
||||
{
|
||||
month = 7;
|
||||
}
|
||||
|
||||
// August
|
||||
if (dayOfYear >= monthMin[8] && dayOfYear <= monthMax[8])
|
||||
{
|
||||
month = 8;
|
||||
}
|
||||
|
||||
// September
|
||||
if (dayOfYear >= monthMin[9] && dayOfYear <= monthMax[9])
|
||||
{
|
||||
month = 9;
|
||||
}
|
||||
|
||||
// October
|
||||
if (dayOfYear >= monthMin[10] && dayOfYear <= monthMax[10])
|
||||
{
|
||||
month = 10;
|
||||
}
|
||||
|
||||
// November
|
||||
if (dayOfYear >= monthMin[11] && dayOfYear <= monthMax[11])
|
||||
{
|
||||
month = 11;
|
||||
}
|
||||
|
||||
// December
|
||||
if (dayOfYear >= monthMin[12] && dayOfYear <= monthMax[12])
|
||||
{
|
||||
month = 12;
|
||||
}
|
||||
|
||||
return month;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief (private) Send NTP Packet to NTP server
|
||||
*
|
||||
*/
|
||||
void NTPClientPlus::sendNTPPacket()
|
||||
{
|
||||
// set all bytes in the buffer to 0
|
||||
memset(this->_packetBuffer, 0, NTP_PACKET_SIZE);
|
||||
// Initialize values needed to form NTP request
|
||||
this->_packetBuffer[0] = 0b11100011; // LI, Version, Mode
|
||||
this->_packetBuffer[1] = 0; // Stratum, or type of clock
|
||||
this->_packetBuffer[2] = 6; // Polling Interval
|
||||
this->_packetBuffer[3] = 0xEC; // Peer Clock Precision
|
||||
// 8 bytes of zero for Root Delay & Root Dispersion
|
||||
this->_packetBuffer[12] = 49;
|
||||
this->_packetBuffer[13] = 0x4E;
|
||||
this->_packetBuffer[14] = 49;
|
||||
this->_packetBuffer[15] = 52;
|
||||
|
||||
// all NTP fields have been given values, now
|
||||
// you can send a packet requesting a timestamp:
|
||||
if (this->_poolServerName)
|
||||
{
|
||||
this->_udp->beginPacket(this->_poolServerName, 123);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->_udp->beginPacket(this->_poolServerIP, 123);
|
||||
}
|
||||
this->_udp->write(this->_packetBuffer, NTP_PACKET_SIZE);
|
||||
this->_udp->endPacket();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief (private) Set time offset accordance to summer time
|
||||
*
|
||||
* @param summertime
|
||||
*/
|
||||
void NTPClientPlus::setSummertime(bool summertime)
|
||||
{
|
||||
if (summertime)
|
||||
{
|
||||
this->_timeOffset = this->secondperhour * (this->_utcx + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->_timeOffset = this->secondperhour * (this->_utcx);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief (private) Update Summer/Winter time change
|
||||
*
|
||||
* @returns bool summertime active
|
||||
*/
|
||||
bool NTPClientPlus::updateSWChange()
|
||||
{
|
||||
unsigned int dayOfWeek = this->_dayOfWeek;
|
||||
unsigned int dateDay = this->_dateDay;
|
||||
unsigned int dateMonth = this->_dateMonth;
|
||||
|
||||
bool summertimeActive = false;
|
||||
|
||||
if (this->_swChange)
|
||||
{
|
||||
// Start: Set summer-/ winter time
|
||||
|
||||
// current month is march
|
||||
if (dateMonth == 3)
|
||||
{
|
||||
|
||||
// it is last week in march
|
||||
if ((this->daysInMonth[3] - dateDay) < 7)
|
||||
{
|
||||
|
||||
// Example year 2020: March 31 days; Restart March 26, 2020 (Thursday = weekday = 4); 5 days remaining; Last Sunday March 29, 2020
|
||||
// Calculation: 31 - 26 = 5; 5 + 4 = 9;
|
||||
// Result: Last day in March is a Tuesday. There follows another Sunday in October => set winter time
|
||||
|
||||
// Example year 2021: March 31 days; Restart March 30, 2021 (Tuesday = weekday = 2); 1 days remaining; Last Sunday March 28, 2021
|
||||
// Calculation: 31 - 30 = 1; 1 + 2 = 3;
|
||||
// Result: Last day in March is a Wednesday. Changeover to summer time already done => set summer time
|
||||
|
||||
// There follows within the last week in March one more Sunday => set winter time
|
||||
if (((this->daysInMonth[3] - dateDay) + dayOfWeek) >= 7)
|
||||
{
|
||||
this->setSummertime(0);
|
||||
summertimeActive = false;
|
||||
}
|
||||
|
||||
// last sunday in march already over -> summer time
|
||||
else
|
||||
{
|
||||
this->setSummertime(1);
|
||||
summertimeActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
// restart in first three weeks of march -> winter time
|
||||
else
|
||||
{
|
||||
this->setSummertime(0);
|
||||
summertimeActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
// current month is october
|
||||
else if (dateMonth == 10)
|
||||
{
|
||||
|
||||
// restart last week of october
|
||||
if ((this->daysInMonth[10] - dateDay) < 7)
|
||||
{
|
||||
|
||||
// Example year 2020: October 31 days; restart October 26, 2020 (Monday = weekday = 1); 5 days remaining; last Sunday October 25, 2020
|
||||
// Calculation: 31 - 26 = 5; 5 + 1 = 6;
|
||||
// Result: Last day in October is a Saturday. Changeover to winter time already done => set winter time
|
||||
|
||||
// Example year 2021: October 31 days; Restart 26. October 2021 (Tuesday = weekday = 2); 5 days remaining; Last Sunday 31. October 2021
|
||||
// Calculation: 31 - 26 = 5; 5 + 2 = 7;
|
||||
// Result: Last day in October is a Sunday. There follows another Sunday in October => set summer time
|
||||
|
||||
// There follows within the last week in October one more Sunday => summer time
|
||||
if (((this->daysInMonth[10] - dateDay) + dayOfWeek) >= 7)
|
||||
{
|
||||
this->setSummertime(1);
|
||||
summertimeActive = true;
|
||||
}
|
||||
|
||||
// last sunday in october already over -> winter time
|
||||
else
|
||||
{
|
||||
this->setSummertime(0);
|
||||
summertimeActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
// restart in first three weeks of october -> summer time
|
||||
else
|
||||
{
|
||||
this->setSummertime(1);
|
||||
summertimeActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
// restart in summer time
|
||||
else if (dateMonth > 3 && dateMonth < 10)
|
||||
{
|
||||
this->setSummertime(1);
|
||||
summertimeActive = true;
|
||||
}
|
||||
|
||||
// restart in winter time
|
||||
else if (dateMonth < 3 || dateMonth > 10)
|
||||
{
|
||||
this->setSummertime(0);
|
||||
summertimeActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
return summertimeActive;
|
||||
}
|
||||
|
||||
void wait(unsigned long time)
|
||||
{
|
||||
unsigned long start = millis();
|
||||
while (millis() - start < time)
|
||||
{
|
||||
yield();
|
||||
};
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <Arduino.h>
|
||||
#include <ArduinoOTA.h>
|
||||
#include "otafunctions.h"
|
||||
#include "ota_functions.h"
|
||||
|
||||
// setup Arduino OTA
|
||||
void setupOTA(String hostname)
|
||||
214
src/connectivity/time_manager.cpp
Normal file
214
src/connectivity/time_manager.cpp
Normal file
@@ -0,0 +1,214 @@
|
||||
#include "time_manager.h"
|
||||
#include "wordclock_constants.h"
|
||||
#include <coredecls.h> // required for settimeofday_cb()
|
||||
#include <sntp.h>
|
||||
#include <time.h>
|
||||
|
||||
extern UDPLogger logger; // logging instance
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// Class
|
||||
// ----------------------------------------------------------------------------------
|
||||
TimeManager::TimeManager(){};
|
||||
TimeManager::TimeManager(const char *tz,
|
||||
const char *ntp_server,
|
||||
bool (*is_wifi_connected)(void),
|
||||
uint32 ntp_max_offline_time_s,
|
||||
UDPLogger *logger)
|
||||
{
|
||||
_tz = tz;
|
||||
_ntp_server = ntp_server;
|
||||
_is_wifi_connected = is_wifi_connected;
|
||||
_ntp_max_offline_time_s = ntp_max_offline_time_s;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
void TimeManager::init()
|
||||
{
|
||||
// Set up NTP server once
|
||||
_set_up_ntp();
|
||||
|
||||
if (_tm_state == TM_INITIAL_SYNC)
|
||||
{
|
||||
// force sntp reinit now
|
||||
sntp_stop();
|
||||
sntp_init();
|
||||
}
|
||||
settimeofday_cb([&]() { time_set_cb(); });
|
||||
}
|
||||
|
||||
bool TimeManager::ntp_sync_successful(void) const
|
||||
{
|
||||
return (_now > 1716913300); // UTC timestamp in the past (28.05.2024)
|
||||
}
|
||||
|
||||
bool TimeManager::ntp_sync_overdue(void)
|
||||
{
|
||||
if (!ntp_sync_successful())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool retval = false;
|
||||
// after the ntp sync update delay has been reached six times, the sync is considered overdue
|
||||
if (_now >= (_ntp_sync_timestamp_s + (time_t)(6 * (sntp_update_delay_MS_rfc_not_less_than_15000() / 1000))))
|
||||
{
|
||||
_tm_state = TM_SYNC_OVERDUE;
|
||||
retval = true;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool TimeManager::ntp_sync_timeout(void)
|
||||
{
|
||||
if (!ntp_sync_successful())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool retval = false;
|
||||
// after the maxmimum offline time has been reached, the sync is considered timed out
|
||||
if (_now >= (_ntp_sync_timestamp_s + (time_t)_ntp_max_offline_time_s))
|
||||
{
|
||||
_tm_state = TM_SYNC_TIMEOUT;
|
||||
retval = true;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief NTP time update, should be called in loop().
|
||||
*
|
||||
* @retval true if last update was successful
|
||||
*/
|
||||
TimeUpdateState TimeManager::get_time()
|
||||
{
|
||||
TimeUpdateState retval = TIME_UPDATE_PENDING; // NTP time update
|
||||
uint32 timestamp_us = system_get_time(); // NTP update start time
|
||||
struct tm time_info; // local NTP time info
|
||||
|
||||
do
|
||||
{
|
||||
_now = time(nullptr); // update time
|
||||
(void)localtime_r(&_now, &time_info); // convert time
|
||||
yield(); // since this loop could take up to NTP_MAX_UPDATE_TIME_US
|
||||
|
||||
} while (((system_get_time() - timestamp_us) <= NTP_MAX_UPDATE_TIME_US) && (time_info.tm_year < (NTP_MINIMUM_RX_YEAR - NTP_START_YEAR)));
|
||||
|
||||
retval = (time_info.tm_year <= (NTP_MINIMUM_RX_YEAR - NTP_START_YEAR)) ? TIME_UPDATE_FAILED : TIME_UPDATE_OK; // sanity check
|
||||
|
||||
if (retval == TIME_UPDATE_OK)
|
||||
{
|
||||
_time_info = time_info; // take over time_info to member variable
|
||||
_tm_state = TM_NORMAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.log_string("NTP-Update was not successful. Retrying in " + String(sntp_update_delay_MS_rfc_not_less_than_15000()) + "ms.");
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool TimeManager::isdst(void) const
|
||||
{
|
||||
return (_time_info.tm_isdst > 0);
|
||||
}
|
||||
|
||||
int TimeManager::day(void) const
|
||||
{
|
||||
return (_time_info.tm_mday + 1); // add 1 to get actual day
|
||||
}
|
||||
|
||||
int TimeManager::hour(void) const
|
||||
{
|
||||
return _time_info.tm_hour;
|
||||
}
|
||||
|
||||
int TimeManager::minute(void) const
|
||||
{
|
||||
return _time_info.tm_min;
|
||||
}
|
||||
|
||||
int TimeManager::month(void) const
|
||||
{
|
||||
return (_time_info.tm_mon + 1); // add 1 to get actual month
|
||||
}
|
||||
|
||||
int TimeManager::year(void) const
|
||||
{
|
||||
return _time_info.tm_year + NTP_START_YEAR; // add start year to get actual year
|
||||
}
|
||||
|
||||
struct tm TimeManager::time_info(void) const
|
||||
{
|
||||
return _time_info;
|
||||
}
|
||||
|
||||
TimeManagerState TimeManager::tm_state(void) const
|
||||
{
|
||||
return _tm_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log time_info as string.
|
||||
*
|
||||
* @param local_time
|
||||
*/
|
||||
void TimeManager::log_time() const
|
||||
{
|
||||
log_time(_time_info);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log time_info as string.
|
||||
*
|
||||
* @param local_time
|
||||
*/
|
||||
void TimeManager::log_time(struct tm time_info) const
|
||||
{
|
||||
char strftime_buf[64]; // Time string buffer
|
||||
strftime(strftime_buf, sizeof(strftime_buf), "%c", &time_info);
|
||||
logger.log_string(String(strftime_buf));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets up the NTP server config
|
||||
*
|
||||
*/
|
||||
void TimeManager::_set_up_ntp(void)
|
||||
{
|
||||
if ((_tz != nullptr) && (_ntp_server != nullptr))
|
||||
{
|
||||
// set up NTP server and timezone at init
|
||||
configTime(_tz, _ntp_server);
|
||||
_tm_state = TM_INITIAL_SYNC;
|
||||
logger.log_string(String("NTP configuration was set up successfully!"));
|
||||
}
|
||||
else
|
||||
{
|
||||
_tm_state = TM_SETUP_FAILED;
|
||||
logger.log_string(String("ERROR: Timezone and/or NTP-Server were not given correctly!"));
|
||||
}
|
||||
}
|
||||
|
||||
void TimeManager::time_set_cb(void)
|
||||
{
|
||||
if ((*_is_wifi_connected)())
|
||||
{
|
||||
if (get_time() == TIME_UPDATE_OK)
|
||||
{
|
||||
_ntp_sync_timestamp_s = _now;
|
||||
logger.log_string("NTP successfully synced at...");
|
||||
log_time();
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.log_string("NTP sync failed!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.log_string("NTP sync failed, WiFi is not connected!");
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
#include "udp_logger.h"
|
||||
|
||||
UDPLogger::UDPLogger()
|
||||
{
|
||||
}
|
||||
UDPLogger::UDPLogger() {}
|
||||
|
||||
UDPLogger::UDPLogger(IPAddress interface_addr, IPAddress multicast_addr, int port, String name)
|
||||
{
|
||||
@@ -20,24 +18,27 @@ void UDPLogger::set_name(String name)
|
||||
|
||||
void UDPLogger::log_string(String message)
|
||||
{
|
||||
// wait 5 milliseconds if last send was less than 5 milliseconds before
|
||||
if (millis() < (_lastSend + 5))
|
||||
// wait 5 milliseconds if last send was less than 10 milliseconds before
|
||||
if ((system_get_time() / 1000) < (_lastSend + 10))
|
||||
{
|
||||
delay(5);
|
||||
delay(10);
|
||||
}
|
||||
message = _name + ": " + message;
|
||||
#ifdef SERIAL_DEBUG
|
||||
Serial.println(message);
|
||||
delay(10);
|
||||
#endif /* SERIAL_DEBUG */
|
||||
_udp.beginPacketMulticast(_multicastAddr, _port, _interfaceAddr);
|
||||
message.toCharArray(_packetBuffer, 100);
|
||||
_udp.print(_packetBuffer);
|
||||
_udp.endPacket();
|
||||
_lastSend = millis();
|
||||
_lastSend = (system_get_time() / 1000);
|
||||
}
|
||||
|
||||
void UDPLogger::log_color_24bit(uint32_t color)
|
||||
{
|
||||
uint8_t result_red = color >> 16 & 0xff;
|
||||
uint8_t result_green = color >> 8 & 0xff;
|
||||
uint8_t result_blue = color & 0xff;
|
||||
uint8_t result_red = color >> 16 & UINT8_MAX;
|
||||
uint8_t result_green = color >> 8 & UINT8_MAX;
|
||||
uint8_t result_blue = color & UINT8_MAX;
|
||||
log_string(String(result_red) + ", " + String(result_green) + ", " + String(result_blue));
|
||||
}
|
||||
@@ -60,10 +60,10 @@ void Pong::loopCycle()
|
||||
*/
|
||||
void Pong::ctrlUp(uint8_t playerid)
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME)
|
||||
if ((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME))
|
||||
{
|
||||
_playerMovement[playerid] = PADDLE_MOVE_DOWN; // need to swap direction as field is rotated 180deg
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,10 +74,10 @@ void Pong::ctrlUp(uint8_t playerid)
|
||||
*/
|
||||
void Pong::ctrlDown(uint8_t playerid)
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME)
|
||||
if ((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME))
|
||||
{
|
||||
_playerMovement[playerid] = PADDLE_MOVE_UP; // need to swap direction as field is rotated 180deg
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,10 +88,10 @@ void Pong::ctrlDown(uint8_t playerid)
|
||||
*/
|
||||
void Pong::ctrlNone(uint8_t playerid)
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME)
|
||||
if ((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME))
|
||||
{
|
||||
_playerMovement[playerid] = PADDLE_MOVE_NONE;
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,9 +102,9 @@ void Pong::ctrlNone(uint8_t playerid)
|
||||
*/
|
||||
void Pong::initGame(uint8_t numBots)
|
||||
{
|
||||
(*_logger).log_string("Pong: init with " + String(numBots) + " Bots");
|
||||
_logger->log_string("Pong: init with " + String(numBots) + " Bots");
|
||||
resetLEDs();
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
|
||||
_numBots = numBots;
|
||||
|
||||
@@ -134,11 +134,11 @@ void Pong::initGame(uint8_t numBots)
|
||||
void Pong::updateBall()
|
||||
{
|
||||
bool hitBall = false;
|
||||
if ((millis() - _lastBallUpdate) < _ballDelay)
|
||||
if (((system_get_time() / 1000) - _lastBallUpdate) < _ballDelay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_lastBallUpdate = millis();
|
||||
_lastBallUpdate = (system_get_time() / 1000);
|
||||
toggleLed(_ball.x, _ball.y, LED_TYPE_OFF);
|
||||
|
||||
// collision detection for player 1
|
||||
@@ -199,7 +199,7 @@ void Pong::updateBall()
|
||||
*/
|
||||
void Pong::endGame()
|
||||
{
|
||||
(*_logger).log_string("Pong: Game ended");
|
||||
_logger->log_string("Pong: Game ended");
|
||||
_gameState = GAME_STATE_END;
|
||||
toggleLed(_ball.x, _ball.y, LED_TYPE_BALL_RED);
|
||||
}
|
||||
@@ -210,11 +210,11 @@ void Pong::endGame()
|
||||
*/
|
||||
void Pong::updateGame()
|
||||
{
|
||||
if ((millis() - _lastDrawUpdate) < GAME_DELAY)
|
||||
if (((system_get_time() / 1000) - _lastDrawUpdate) < GAME_DELAY)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_lastDrawUpdate = millis();
|
||||
_lastDrawUpdate = (system_get_time() / 1000);
|
||||
|
||||
// turn off paddle LEDs
|
||||
for (uint8_t p = 0; p < PLAYER_AMOUNT; p++)
|
||||
@@ -297,7 +297,7 @@ uint8_t Pong::getPlayerMovement(uint8_t playerId)
|
||||
*/
|
||||
void Pong::resetLEDs()
|
||||
{
|
||||
(*_ledmatrix).flush();
|
||||
_ledmatrix->flush();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -328,5 +328,5 @@ void Pong::toggleLed(uint8_t x, uint8_t y, uint8_t type)
|
||||
break;
|
||||
}
|
||||
|
||||
(*_ledmatrix).grid_add_pixel(x, y, color);
|
||||
_ledmatrix->grid_add_pixel(x, y, color);
|
||||
}
|
||||
@@ -26,7 +26,7 @@ Snake::Snake()
|
||||
* @param myledmatrix pointer to LEDMatrix object, need to provide gridAddPixel(x, y, col), gridFlush()
|
||||
* @param mylogger pointer to UDPLogger object, need to provide a function logString(message)
|
||||
*/
|
||||
Snake::Snake(LEDMatrix * matrix, UDPLogger * logger)
|
||||
Snake::Snake(LEDMatrix *matrix, UDPLogger *logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_ledmatrix = matrix;
|
||||
@@ -58,11 +58,11 @@ void Snake::loopCycle()
|
||||
*/
|
||||
void Snake::ctrlUp()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
if (((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME)) && (_gameState == GAME_STATE_RUNNING) && (_userDirection != DIRECTION_UP))
|
||||
{
|
||||
(*_logger).log_string("Snake: UP");
|
||||
_logger->log_string("Snake: UP");
|
||||
_userDirection = DIRECTION_DOWN; // need to swap direction as field is rotated 180deg
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,11 +72,11 @@ void Snake::ctrlUp()
|
||||
*/
|
||||
void Snake::ctrlDown()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
if (((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME)) && (_gameState == GAME_STATE_RUNNING) && (_userDirection != DIRECTION_DOWN))
|
||||
{
|
||||
_logger->log_string("Snake: DOWN");
|
||||
_userDirection = DIRECTION_UP; // need to swap direction as field is rotated 180deg
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,11 +86,11 @@ void Snake::ctrlDown()
|
||||
*/
|
||||
void Snake::ctrlRight()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
if (((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME)) && (_gameState == GAME_STATE_RUNNING) && (_userDirection != DIRECTION_RIGHT))
|
||||
{
|
||||
_logger->log_string("Snake: RIGHT");
|
||||
_userDirection = DIRECTION_LEFT; // need to swap direction as field is rotated 180deg
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,11 +100,11 @@ void Snake::ctrlRight()
|
||||
*/
|
||||
void Snake::ctrlLeft()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
if (((system_get_time() / 1000) > (_lastButtonClick + DEBOUNCE_TIME)) && (_gameState == GAME_STATE_RUNNING) && (_userDirection != DIRECTION_LEFT))
|
||||
{
|
||||
_logger->log_string("Snake: LEFT");
|
||||
_userDirection = DIRECTION_RIGHT; // need to swap direction as field is rotated 180deg
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ void Snake::initGame()
|
||||
_food.y = -1;
|
||||
_wormLength = MIN_TAIL_LENGTH;
|
||||
_userDirection = DIRECTION_LEFT;
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
|
||||
for (int i = 0; i < MAX_TAIL_LENGTH; i++)
|
||||
{
|
||||
@@ -148,7 +148,7 @@ void Snake::initGame()
|
||||
*/
|
||||
void Snake::updateGame()
|
||||
{
|
||||
if ((millis() - _lastDrawUpdate) > GAME_DELAY)
|
||||
if (((system_get_time() / 1000) - _lastDrawUpdate) > GAME_DELAY)
|
||||
{
|
||||
_logger->log_string("Snake: update game");
|
||||
toggleLed(_tail[_wormLength - 1].x, _tail[_wormLength - 1].y, LED_TYPE_OFF);
|
||||
@@ -197,7 +197,7 @@ void Snake::updateGame()
|
||||
updateFood();
|
||||
}
|
||||
|
||||
_lastDrawUpdate = millis();
|
||||
_lastDrawUpdate = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ Tetris::Tetris(LEDMatrix *myledmatrix, UDPLogger *mylogger)
|
||||
{
|
||||
_logger = mylogger;
|
||||
_ledmatrix = myledmatrix;
|
||||
_gameStatet = GAME_STATE_READY;
|
||||
_gameState = GAME_STATE_READY;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,7 +35,7 @@ Tetris::Tetris(LEDMatrix *myledmatrix, UDPLogger *mylogger)
|
||||
*/
|
||||
void Tetris::loopCycle()
|
||||
{
|
||||
switch (_gameStatet)
|
||||
switch (_gameState)
|
||||
{
|
||||
case GAME_STATE_READY:
|
||||
|
||||
@@ -51,18 +51,18 @@ void Tetris::loopCycle()
|
||||
// move faster down when allow drop
|
||||
if (_allowdrop)
|
||||
{
|
||||
if (millis() > _droptime + 50)
|
||||
if ((system_get_time() / 1000) > (_droptime + 50))
|
||||
{
|
||||
_droptime = millis();
|
||||
_droptime = (system_get_time() / 1000);
|
||||
shiftActiveBrick(DIR_DOWN);
|
||||
printField();
|
||||
}
|
||||
}
|
||||
|
||||
// move down with regular speed
|
||||
if ((millis() - _prevUpdateTime) > (_brickSpeed * _speedtetris / 100))
|
||||
if (((system_get_time() / 1000) - _prevUpdateTime) > (_brickSpeed * _speedtetris / 100))
|
||||
{
|
||||
_prevUpdateTime = millis();
|
||||
_prevUpdateTime = (system_get_time() / 1000);
|
||||
shiftActiveBrick(DIR_DOWN);
|
||||
printField();
|
||||
}
|
||||
@@ -74,7 +74,7 @@ void Tetris::loopCycle()
|
||||
// and create new brick at top of field
|
||||
checkFullLines();
|
||||
newActiveBrick();
|
||||
_prevUpdateTime = millis(); // Reset update time to avoid brick dropping two spaces
|
||||
_prevUpdateTime = (system_get_time() / 1000); // Reset update time to avoid brick dropping two spaces
|
||||
}
|
||||
break;
|
||||
case GAME_STATE_PAUSED:
|
||||
@@ -85,17 +85,17 @@ void Tetris::loopCycle()
|
||||
if (_tetrisGameOver == true)
|
||||
{
|
||||
_tetrisGameOver = false;
|
||||
(*_logger).log_string("Tetris: end");
|
||||
_logger->log_string("Tetris: end");
|
||||
everythingRed();
|
||||
_tetrisshowscore = millis();
|
||||
_tetrisshowscore = (system_get_time() / 1000);
|
||||
}
|
||||
|
||||
if (millis() > (_tetrisshowscore + RED_END_TIME))
|
||||
if ((system_get_time() / 1000) > (_tetrisshowscore + RED_END_TIME))
|
||||
{
|
||||
resetLEDs();
|
||||
_score = _nbRowsTotal;
|
||||
showscore();
|
||||
_gameStatet = GAME_STATE_READY;
|
||||
_gameState = GAME_STATE_READY;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -107,10 +107,10 @@ void Tetris::loopCycle()
|
||||
*/
|
||||
void Tetris::ctrlStart()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME)
|
||||
if ((system_get_time() / 1000) > _lastButtonClick + DEBOUNCE_TIME)
|
||||
{
|
||||
_lastButtonClick = millis();
|
||||
_gameStatet = GAME_STATE_INIT;
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
_gameState = GAME_STATE_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,20 +120,20 @@ void Tetris::ctrlStart()
|
||||
*/
|
||||
void Tetris::ctrlPlayPause()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME)
|
||||
if ((system_get_time() / 1000) > _lastButtonClick + DEBOUNCE_TIME)
|
||||
{
|
||||
_lastButtonClick = millis();
|
||||
if (_gameStatet == GAME_STATE_PAUSED)
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
if (_gameState == GAME_STATE_PAUSED)
|
||||
{
|
||||
(*_logger).log_string("Tetris: continue");
|
||||
_logger->log_string("Tetris: continue");
|
||||
|
||||
_gameStatet = GAME_STATE_RUNNING;
|
||||
_gameState = GAME_STATE_RUNNING;
|
||||
}
|
||||
else if (_gameStatet == GAME_STATE_RUNNING)
|
||||
else if (_gameState == GAME_STATE_RUNNING)
|
||||
{
|
||||
(*_logger).log_string("Tetris: pause");
|
||||
_logger->log_string("Tetris: pause");
|
||||
|
||||
_gameStatet = GAME_STATE_PAUSED;
|
||||
_gameState = GAME_STATE_PAUSED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -144,9 +144,9 @@ void Tetris::ctrlPlayPause()
|
||||
*/
|
||||
void Tetris::ctrlRight()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameStatet == GAME_STATE_RUNNING)
|
||||
if ((system_get_time() / 1000) > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
{
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
shiftActiveBrick(DIR_RIGHT);
|
||||
printField();
|
||||
}
|
||||
@@ -158,9 +158,9 @@ void Tetris::ctrlRight()
|
||||
*/
|
||||
void Tetris::ctrlLeft()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameStatet == GAME_STATE_RUNNING)
|
||||
if ((system_get_time() / 1000) > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
{
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
shiftActiveBrick(DIR_LEFT);
|
||||
printField();
|
||||
}
|
||||
@@ -172,9 +172,9 @@ void Tetris::ctrlLeft()
|
||||
*/
|
||||
void Tetris::ctrlUp()
|
||||
{
|
||||
if (millis() > _lastButtonClick + DEBOUNCE_TIME && _gameStatet == GAME_STATE_RUNNING)
|
||||
if ((system_get_time() / 1000) > _lastButtonClick + DEBOUNCE_TIME && _gameState == GAME_STATE_RUNNING)
|
||||
{
|
||||
_lastButtonClick = millis();
|
||||
_lastButtonClick = (system_get_time() / 1000);
|
||||
rotateActiveBrick();
|
||||
printField();
|
||||
}
|
||||
@@ -187,10 +187,10 @@ void Tetris::ctrlUp()
|
||||
void Tetris::ctrlDown()
|
||||
{
|
||||
// longer debounce time, to prevent immediate drop
|
||||
if (millis() > _lastButtonClickr + DEBOUNCE_TIME * 5 && _gameStatet == GAME_STATE_RUNNING)
|
||||
if ((system_get_time() / 1000) > _lastButtonClickr + DEBOUNCE_TIME * 5 && _gameState == GAME_STATE_RUNNING)
|
||||
{
|
||||
_allowdrop = true;
|
||||
_lastButtonClickr = millis();
|
||||
_lastButtonClickr = (system_get_time() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ void Tetris::resetLEDs()
|
||||
*/
|
||||
void Tetris::tetrisInit()
|
||||
{
|
||||
(*_logger).log_string("Tetris: init");
|
||||
_logger->log_string("Tetris: init");
|
||||
|
||||
clearField();
|
||||
_brickSpeed = INIT_SPEED;
|
||||
@@ -230,9 +230,9 @@ void Tetris::tetrisInit()
|
||||
_tetrisGameOver = false;
|
||||
|
||||
newActiveBrick();
|
||||
_prevUpdateTime = millis();
|
||||
_prevUpdateTime = (system_get_time() / 1000);
|
||||
|
||||
_gameStatet = GAME_STATE_RUNNING;
|
||||
_gameState = GAME_STATE_RUNNING;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -318,7 +318,7 @@ void Tetris::newActiveBrick()
|
||||
if (checkFieldCollision(&_activeBrick))
|
||||
{
|
||||
_tetrisGameOver = true;
|
||||
_gameStatet = GAME_STATE_END;
|
||||
_gameState = GAME_STATE_END;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "animation_functions.h"
|
||||
#include "wordclock_constants.h"
|
||||
#include "udp_logger.h"
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
|
||||
extern UDPLogger logger;
|
||||
extern LEDMatrix led_matrix;
|
||||
@@ -10,6 +10,8 @@ extern LEDMatrix led_matrix;
|
||||
const int8_t dx[] = {1, -1, 0, 0};
|
||||
const int8_t dy[] = {0, 0, -1, 1};
|
||||
|
||||
bool spiral_direction = false; // Direction of sprial animation
|
||||
|
||||
/**
|
||||
* @brief Function to draw a spiral step (from center)
|
||||
*
|
||||
@@ -305,6 +307,8 @@ int random_tetris(bool init)
|
||||
if (init || gameover)
|
||||
{
|
||||
logger.log_string("Init Tetris: init=" + String(init) + ", gameover=" + String(gameover));
|
||||
delay(10);
|
||||
|
||||
// clear local game screen
|
||||
for (int h = 0; h < MATRIX_HEIGHT + 3; h++)
|
||||
{
|
||||
@@ -364,6 +368,8 @@ int random_tetris(bool init)
|
||||
{
|
||||
// no more moving blocks -> check if game over or spawn new block
|
||||
logger.log_string("Tetris: No more Mover");
|
||||
delay(10);
|
||||
|
||||
gameover = false;
|
||||
// check if game was lost -> one pixel active in 4rd row (top row on the led grid)
|
||||
for (int s = 0; s < MATRIX_WIDTH; s++)
|
||||
@@ -437,3 +443,750 @@ int random_tetris(bool init)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define HEART_ANIMATION_FRAMES 5
|
||||
const uint32_t heart_frames_colormap_11x11[HEART_ANIMATION_FRAMES][MATRIX_WIDTH][MATRIX_HEIGHT] =
|
||||
{
|
||||
{
|
||||
{
|
||||
0x005b000a,
|
||||
0x002d0304,
|
||||
0x000f0002,
|
||||
0x00090001,
|
||||
0x00350306,
|
||||
0x00530103,
|
||||
0x00310407,
|
||||
0x000a0104,
|
||||
0x00090001,
|
||||
0x00300306,
|
||||
0x00570006,
|
||||
},
|
||||
{
|
||||
0x00330206,
|
||||
0x00090000,
|
||||
0x00ce0404,
|
||||
0x00d70300,
|
||||
0x000f0008,
|
||||
0x00350306,
|
||||
0x000b0100,
|
||||
0x00c70600,
|
||||
0x00d40201,
|
||||
0x00080202,
|
||||
0x00390006,
|
||||
},
|
||||
{
|
||||
0x000a0000,
|
||||
0x00db0503,
|
||||
0x00940906,
|
||||
0x00950a03,
|
||||
0x00e20100,
|
||||
0x000e0008,
|
||||
0x00d00000,
|
||||
0x00960806,
|
||||
0x00940605,
|
||||
0x00d50600,
|
||||
0x000d0103,
|
||||
},
|
||||
{
|
||||
0x00da010c,
|
||||
0x00940700,
|
||||
0x00580000,
|
||||
0x00570104,
|
||||
0x00940a0a,
|
||||
0x00d40100,
|
||||
0x00940a08,
|
||||
0x005a0006,
|
||||
0x005b0005,
|
||||
0x009d0305,
|
||||
0x00da0300,
|
||||
},
|
||||
{
|
||||
0x00d70707,
|
||||
0x00910a06,
|
||||
0x00560202,
|
||||
0x00570207,
|
||||
0x00580007,
|
||||
0x00900a09,
|
||||
0x00540109,
|
||||
0x005a0004,
|
||||
0x005b0007,
|
||||
0x00910a04,
|
||||
0x00d40201,
|
||||
},
|
||||
{
|
||||
0x00da0207,
|
||||
0x0092070c,
|
||||
0x005b0002,
|
||||
0x00330005,
|
||||
0x00300405,
|
||||
0x00580308,
|
||||
0x002e0503,
|
||||
0x002c0404,
|
||||
0x005a0004,
|
||||
0x00970609,
|
||||
0x00d80202,
|
||||
},
|
||||
{
|
||||
0x00040402,
|
||||
0x00dc0600,
|
||||
0x008f0a0b,
|
||||
0x00590006,
|
||||
0x00310504,
|
||||
0x00320406,
|
||||
0x00330507,
|
||||
0x00620008,
|
||||
0x00960709,
|
||||
0x00dd0301,
|
||||
0x000d0304,
|
||||
},
|
||||
{
|
||||
0x00330205,
|
||||
0x00090100,
|
||||
0x00d8020a,
|
||||
0x00930906,
|
||||
0x00570209,
|
||||
0x00330205,
|
||||
0x00580007,
|
||||
0x00980808,
|
||||
0x00d60200,
|
||||
0x000d0003,
|
||||
0x00340205,
|
||||
},
|
||||
{
|
||||
0x00560008,
|
||||
0x00340306,
|
||||
0x00100001,
|
||||
0x00d40a00,
|
||||
0x009e0507,
|
||||
0x005c0007,
|
||||
0x009e0508,
|
||||
0x00e50000,
|
||||
0x000e0001,
|
||||
0x00310305,
|
||||
0x00590004,
|
||||
},
|
||||
{
|
||||
0x00a00606,
|
||||
0x00580007,
|
||||
0x00350304,
|
||||
0x00100001,
|
||||
0x00d40404,
|
||||
0x00940902,
|
||||
0x00d50407,
|
||||
0x00000205,
|
||||
0x00350304,
|
||||
0x00560108,
|
||||
0x00900906,
|
||||
},
|
||||
{
|
||||
0x00d90104,
|
||||
0x008d080b,
|
||||
0x0060000b,
|
||||
0x00340106,
|
||||
0x00050100,
|
||||
0x00e00106,
|
||||
0x000f0000,
|
||||
0x00370003,
|
||||
0x00570104,
|
||||
0x00950a07,
|
||||
0x00e10007,
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00da0308,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d60101,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00d60101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00560004,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00370803,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x002c0303,
|
||||
0x00310304,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00310304,
|
||||
0x00310304,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00130102,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00d60101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d90802,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d90802,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d60101,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00560004,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x002d0303,
|
||||
0x00320508,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x002d0303,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00560004,
|
||||
0x00320508,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x002f0308,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x002d0303,
|
||||
0x00590005,
|
||||
},
|
||||
{
|
||||
0x00560004,
|
||||
0x002d0303,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00320508,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x002d0303,
|
||||
0x00590005,
|
||||
},
|
||||
{
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d40809,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x003b0203,
|
||||
0x00590005,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x002d0303,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00d40809,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x002d0303,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00d40809,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00320508,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d60101,
|
||||
0x00940808,
|
||||
0x005a0209,
|
||||
0x002d0303,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x00560004,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
0x00d80802,
|
||||
0x00940808,
|
||||
0x00590004,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590004,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00560004,
|
||||
0x00310304,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00590004,
|
||||
0x002a0309,
|
||||
0x00310304,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00590004,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590004,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
},
|
||||
{
|
||||
0x00350408,
|
||||
0x000b0001,
|
||||
0x00d80802,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d60101,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x002c0303,
|
||||
0x00130102,
|
||||
0x00d60101,
|
||||
0x00d60101,
|
||||
0x00d80802,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00d60101,
|
||||
0x00d80802,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00db0209,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x00590004,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d80802,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x003b0303,
|
||||
0x00560004,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590004,
|
||||
0x00350408,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590004,
|
||||
0x002e0804,
|
||||
0x00130102,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00e10102,
|
||||
0x00940808,
|
||||
0x00590004,
|
||||
0x002c0303,
|
||||
0x000b0001,
|
||||
0x003b0303,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d80802,
|
||||
0x00940808,
|
||||
0x00560004,
|
||||
0x00310304,
|
||||
0x00590004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x002c0303,
|
||||
0x00310304,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00560004,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
},
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x002c0303,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00cf0804,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d60101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00e10102,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00940808,
|
||||
0x00cf0804,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00da0308,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
},
|
||||
{
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00590005,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
},
|
||||
{
|
||||
0x005a0109,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00cf0804,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
},
|
||||
{
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00e10102,
|
||||
0x00940808,
|
||||
0x00d60101,
|
||||
0x000b0001,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
},
|
||||
{
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00130102,
|
||||
0x00310304,
|
||||
0x00590005,
|
||||
0x00940808,
|
||||
0x00e10102,
|
||||
},
|
||||
{
|
||||
0x000b0001,
|
||||
0x00d90101,
|
||||
0x00940808,
|
||||
0x00590005,
|
||||
0x00310304,
|
||||
0x000b0001,
|
||||
0x002c0303,
|
||||
0x00560004,
|
||||
0x00940808,
|
||||
0x00d90101,
|
||||
0x00130102,
|
||||
},
|
||||
}};
|
||||
|
||||
int draw_heart_animation(void)
|
||||
{
|
||||
static uint8_t frame_idx = 0;
|
||||
|
||||
// switch row and col order and decrement row to turn image 90 degrees clockwise
|
||||
for (int col = 0; col < MATRIX_WIDTH; col++)
|
||||
{
|
||||
for (int row = MATRIX_HEIGHT - 1; row >= 0; row--)
|
||||
{
|
||||
led_matrix.grid_add_pixel(col, row, heart_frames_colormap_11x11[frame_idx][row][col]);
|
||||
}
|
||||
}
|
||||
|
||||
// Increase frame index per call until HEART_ANIMATION_FRAMES - 1 for array index.
|
||||
frame_idx = (frame_idx >= (HEART_ANIMATION_FRAMES - 1)) ? 0 : frame_idx + 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
#include "own_font.h"
|
||||
#include "wordclock_constants.h"
|
||||
|
||||
@@ -21,7 +21,7 @@ const uint32_t colors_24bit[NUM_COLORS] = {
|
||||
* @param mybrightness the initial brightness of the leds
|
||||
* @param mylogger pointer to the UDPLogger object
|
||||
*/
|
||||
LEDMatrix::LEDMatrix(Adafruit_NeoMatrix * matrix, uint8_t brightness, UDPLogger * logger)
|
||||
LEDMatrix::LEDMatrix(FastLED_NeoMatrix *matrix, uint8_t brightness, UDPLogger *logger)
|
||||
{
|
||||
_neomatrix = matrix;
|
||||
_brightness = brightness;
|
||||
@@ -50,9 +50,9 @@ uint32_t LEDMatrix::color_24bit(uint8_t r, uint8_t g, uint8_t b)
|
||||
*/
|
||||
uint16_t LEDMatrix::color_24_to_16bit(uint32_t color_24bit)
|
||||
{
|
||||
uint8_t r = color_24bit >> 16 & 0xff;
|
||||
uint8_t g = color_24bit >> 8 & 0xff;
|
||||
uint8_t b = color_24bit & 0xff;
|
||||
uint8_t r = color_24bit >> 16 & UINT8_MAX;
|
||||
uint8_t g = color_24bit >> 8 & UINT8_MAX;
|
||||
uint8_t b = color_24bit & UINT8_MAX;
|
||||
return ((uint16_t)(r & 0xF8) << 8) |
|
||||
((uint16_t)(g & 0xFC) << 3) |
|
||||
(b >> 3);
|
||||
@@ -90,13 +90,13 @@ uint32_t LEDMatrix::wheel(uint8_t WheelPos)
|
||||
*/
|
||||
uint32_t LEDMatrix::interpolate_color_24bit(uint32_t color1, uint32_t color2, float factor)
|
||||
{
|
||||
uint8_t resultRed = color1 >> 16 & 0xff;
|
||||
uint8_t resultGreen = color1 >> 8 & 0xff;
|
||||
uint8_t resultBlue = color1 & 0xff;
|
||||
resultRed = (uint8_t)(resultRed + (int16_t)(factor * ((int16_t)(color2 >> 16 & 0xff) - (int16_t)resultRed)));
|
||||
resultGreen = (uint8_t)(resultGreen + (int16_t)(factor * ((int16_t)(color2 >> 8 & 0xff) - (int16_t)resultGreen)));
|
||||
resultBlue = (uint8_t)(resultBlue + (int16_t)(factor * ((int16_t)(color2 & 0xff) - (int16_t)resultBlue)));
|
||||
return color_24bit(resultRed, resultGreen, resultBlue);
|
||||
uint8_t result_R = color1 >> 16 & UINT8_MAX;
|
||||
uint8_t result_G = color1 >> 8 & UINT8_MAX;
|
||||
uint8_t result_B = color1 & UINT8_MAX;
|
||||
result_R = (uint8_t)(result_R + (int16_t)(factor * ((int16_t)(color2 >> 16 & UINT8_MAX) - (int16_t)result_R)));
|
||||
result_G = (uint8_t)(result_G + (int16_t)(factor * ((int16_t)(color2 >> 8 & UINT8_MAX) - (int16_t)result_G)));
|
||||
result_B = (uint8_t)(result_B + (int16_t)(factor * ((int16_t)(color2 & UINT8_MAX) - (int16_t)result_B)));
|
||||
return color_24bit(result_R, result_G, result_B);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,19 +128,19 @@ void LEDMatrix::set_min_indicator(uint8_t pattern, uint32_t color)
|
||||
// 0 -> 0000
|
||||
if (pattern & 1)
|
||||
{
|
||||
_target_indicators[0] = color;
|
||||
_target_minute_indicators[0] = color;
|
||||
}
|
||||
if (pattern >> 1 & 1)
|
||||
{
|
||||
_target_indicators[1] = color;
|
||||
_target_minute_indicators[1] = color;
|
||||
}
|
||||
if (pattern >> 2 & 1)
|
||||
{
|
||||
_target_indicators[2] = color;
|
||||
_target_minute_indicators[2] = color;
|
||||
}
|
||||
if (pattern >> 3 & 1)
|
||||
{
|
||||
_target_indicators[3] = color;
|
||||
_target_minute_indicators[3] = color;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,10 +158,6 @@ void LEDMatrix::grid_add_pixel(uint8_t x, uint8_t y, uint32_t color)
|
||||
{
|
||||
_target_grid[y][x] = color;
|
||||
}
|
||||
else
|
||||
{
|
||||
// logger->log_string("Index out of Range: " + String(x) + ", " + String(y));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -179,10 +175,15 @@ void LEDMatrix::flush(void)
|
||||
}
|
||||
}
|
||||
// set every minutes indicator led to 0
|
||||
_target_indicators[0] = 0;
|
||||
_target_indicators[1] = 0;
|
||||
_target_indicators[2] = 0;
|
||||
_target_indicators[3] = 0;
|
||||
_target_minute_indicators[0] = 0;
|
||||
_target_minute_indicators[1] = 0;
|
||||
_target_minute_indicators[2] = 0;
|
||||
_target_minute_indicators[3] = 0;
|
||||
}
|
||||
|
||||
uint16_t LEDMatrix::get_fps(void)
|
||||
{
|
||||
return FastLED.getFPS();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -215,31 +216,31 @@ void LEDMatrix::_draw_on_matrix(float factor)
|
||||
uint32_t filtered_color = 0;
|
||||
|
||||
// loop over all leds in matrix
|
||||
for (int s = 0; s < MATRIX_WIDTH; s++)
|
||||
for (uint8_t col = 0; col < MATRIX_WIDTH; col++)
|
||||
{
|
||||
for (int z = 0; z < MATRIX_HEIGHT; z++)
|
||||
for (uint8_t row = 0; row < MATRIX_HEIGHT; row++)
|
||||
{
|
||||
// inplement momentum as smooth transistion function
|
||||
uint32_t filtered_color = interpolate_color_24bit(_current_grid[z][s], _target_grid[z][s], factor);
|
||||
_neomatrix->drawPixel(s, z, color_24_to_16bit(filtered_color));
|
||||
_current_grid[z][s] = filtered_color;
|
||||
// implement momentum as smooth transistion function
|
||||
filtered_color = interpolate_color_24bit(_current_grid[row][col], _target_grid[row][col], factor);
|
||||
_neomatrix->drawPixel(col, row, color_24_to_16bit(filtered_color));
|
||||
_current_grid[row][col] = filtered_color;
|
||||
total_current += _calc_estimated_led_current(filtered_color);
|
||||
}
|
||||
}
|
||||
|
||||
// loop over all minute indicator leds
|
||||
for (int i = 0; i < 4; i++)
|
||||
for (uint8_t i = 0; i < 4; i++)
|
||||
{
|
||||
filtered_color = interpolate_color_24bit(_current_indicators[i], _target_indicators[i], factor);
|
||||
filtered_color = interpolate_color_24bit(_current_minute_indicators[i], _target_minute_indicators[i], factor);
|
||||
_neomatrix->drawPixel(MATRIX_WIDTH - (1 + i), MATRIX_HEIGHT, color_24_to_16bit(filtered_color));
|
||||
_current_indicators[i] = filtered_color;
|
||||
_current_minute_indicators[i] = filtered_color;
|
||||
total_current += _calc_estimated_led_current(filtered_color);
|
||||
}
|
||||
|
||||
// Check if totalCurrent reaches CURRENTLIMIT -> if yes reduce brightness
|
||||
// Check if totalCurrent reaches _current_limit -> if yes reduce brightness
|
||||
if (total_current > _current_limit)
|
||||
{
|
||||
uint8_t new_brightness = _brightness * float(_current_limit) / float(total_current);
|
||||
uint8_t new_brightness = (uint8)(_brightness * (float(_current_limit) / float(total_current)));
|
||||
_neomatrix->setBrightness(new_brightness);
|
||||
}
|
||||
_neomatrix->show();
|
||||
@@ -319,9 +320,9 @@ void LEDMatrix::set_brightness(uint8_t brightness)
|
||||
uint16_t LEDMatrix::_calc_estimated_led_current(uint32_t color)
|
||||
{
|
||||
// extract rgb values
|
||||
uint8_t red = color >> 16 & 0xff;
|
||||
uint8_t green = color >> 8 & 0xff;
|
||||
uint8_t blue = color & 0xff;
|
||||
uint8_t red = color >> 16 & UINT8_MAX;
|
||||
uint8_t green = color >> 8 & UINT8_MAX;
|
||||
uint8_t blue = color & UINT8_MAX;
|
||||
|
||||
// Linear estimation: 20mA for full brightness per LED
|
||||
// (calculation avoids float numbers)
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <Arduino.h>
|
||||
#include "render_functions.h"
|
||||
#include "ledmatrix.h"
|
||||
#include "led_matrix.h"
|
||||
#include "udp_logger.h"
|
||||
|
||||
extern LEDMatrix led_matrix;
|
||||
@@ -16,38 +16,36 @@ const String clock_chars_as_string = "ESRISTNFUNFVIERTELZEHNZWANZIGHVORPIKACHUNA
|
||||
void draw_minute_indicator(uint8_t minutes, uint32_t color)
|
||||
{
|
||||
// separate LEDs for minutes in an additional row
|
||||
switch (minutes % 5)
|
||||
{
|
||||
switch (minutes % 5)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1000, color);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1000, color);
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1100, color);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1100, color);
|
||||
break;
|
||||
}
|
||||
|
||||
case 3:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1110, color);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1110, color);
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1111, color);
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
led_matrix.set_min_indicator(0b1111, color);
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,7 +133,7 @@ String time_to_string(uint8_t hours, uint8_t minutes)
|
||||
}
|
||||
else if (minutes >= 20 && minutes < 25)
|
||||
{
|
||||
message += "ZEHN VOR HALB ";
|
||||
message += "ZWANZIG NACH ";
|
||||
}
|
||||
else if (minutes >= 25 && minutes < 30)
|
||||
{
|
||||
@@ -151,7 +149,7 @@ String time_to_string(uint8_t hours, uint8_t minutes)
|
||||
}
|
||||
else if (minutes >= 40 && minutes < 45)
|
||||
{
|
||||
message += "ZEHN NACH HALB ";
|
||||
message += "ZWANZIG VOR ";
|
||||
}
|
||||
else if (minutes >= 45 && minutes < 50)
|
||||
{
|
||||
@@ -166,67 +164,96 @@ String time_to_string(uint8_t hours, uint8_t minutes)
|
||||
message += "FUNF VOR ";
|
||||
}
|
||||
|
||||
// convert hours to 12h format
|
||||
if (hours >= 12)
|
||||
{
|
||||
hours -= 12;
|
||||
}
|
||||
if (minutes >= 20)
|
||||
// increment hour when 25 minutes of an hour have passed
|
||||
if (minutes >= 25)
|
||||
{
|
||||
hours++;
|
||||
}
|
||||
if (hours == 12)
|
||||
|
||||
// convert hours to 12h format
|
||||
if (hours > 12) // 24h -> 12h, except 12h
|
||||
{
|
||||
hours = 0;
|
||||
hours -= 12;
|
||||
}
|
||||
|
||||
// show hours
|
||||
switch (hours)
|
||||
{
|
||||
case 0:
|
||||
message += "ZWOLF ";
|
||||
break;
|
||||
case 1:
|
||||
message += "EIN";
|
||||
// EIN(S)
|
||||
if (minutes > 4)
|
||||
case 0:
|
||||
{
|
||||
message += "S";
|
||||
if (minutes >= 0 && minutes < 5)
|
||||
{
|
||||
message += "MITTERNACHT ";
|
||||
}
|
||||
else
|
||||
{
|
||||
message += "ZWOLF ";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
message += "EIN";
|
||||
message += (minutes > 4) ? "S " : " "; // add "S" if needed
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
message += "ZWEI ";
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
message += "DREI ";
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
message += "VIER ";
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
message += "FUNF ";
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
{
|
||||
message += "SECHS ";
|
||||
break;
|
||||
}
|
||||
case 7:
|
||||
{
|
||||
message += "SIEBEN ";
|
||||
break;
|
||||
}
|
||||
case 8:
|
||||
{
|
||||
message += "ACHT ";
|
||||
break;
|
||||
}
|
||||
case 9:
|
||||
{
|
||||
message += "NEUN ";
|
||||
break;
|
||||
}
|
||||
case 10:
|
||||
{
|
||||
message += "ZEHN ";
|
||||
break;
|
||||
}
|
||||
case 11:
|
||||
{
|
||||
message += "ELF ";
|
||||
break;
|
||||
}
|
||||
case 12:
|
||||
{
|
||||
message += "ZWOLF ";
|
||||
break;
|
||||
}
|
||||
message += " ";
|
||||
break;
|
||||
case 2:
|
||||
message += "ZWEI ";
|
||||
break;
|
||||
case 3:
|
||||
message += "DREI ";
|
||||
break;
|
||||
case 4:
|
||||
message += "VIER ";
|
||||
break;
|
||||
case 5:
|
||||
message += "FUNF ";
|
||||
break;
|
||||
case 6:
|
||||
message += "SECHS ";
|
||||
break;
|
||||
case 7:
|
||||
message += "SIEBEN ";
|
||||
break;
|
||||
case 8:
|
||||
message += "ACHT ";
|
||||
break;
|
||||
case 9:
|
||||
message += "NEUN ";
|
||||
break;
|
||||
case 10:
|
||||
message += "ZEHN ";
|
||||
break;
|
||||
case 11:
|
||||
message += "ELF ";
|
||||
break;
|
||||
}
|
||||
if (minutes < 5)
|
||||
if ((minutes < 5) && (hours != 0))
|
||||
{
|
||||
message += "UHR ";
|
||||
}
|
||||
@@ -247,6 +274,7 @@ String split(String s, char parser, int index)
|
||||
String rs = "";
|
||||
int parser_cnt = 0;
|
||||
int r_from_index = 0, r_to_index = -1;
|
||||
|
||||
while (index >= parser_cnt)
|
||||
{
|
||||
r_from_index = r_to_index + 1;
|
||||
@@ -260,7 +288,9 @@ String split(String s, char parser, int index)
|
||||
return s.substring(r_from_index, r_to_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
parser_cnt++;
|
||||
}
|
||||
}
|
||||
return rs;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,143 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2016 Arturo Guadalupi. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "base64_wrapper.h"
|
||||
#if (defined(__AVR__))
|
||||
#include <avr/pgmspace.h>
|
||||
#else
|
||||
#include <pgmspace.h>
|
||||
#endif
|
||||
|
||||
const char PROGMEM _Base64AlphabetTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
"abcdefghijklmnopqrstuvwxyz"
|
||||
"0123456789+/";
|
||||
|
||||
int Base64Class::encode(char *output, char *input, int inputLength) {
|
||||
int i = 0, j = 0;
|
||||
int encodedLength = 0;
|
||||
unsigned char A3[3];
|
||||
unsigned char A4[4];
|
||||
|
||||
while(inputLength--) {
|
||||
A3[i++] = *(input++);
|
||||
if(i == 3) {
|
||||
fromA3ToA4(A4, A3);
|
||||
|
||||
for(i = 0; i < 4; i++) {
|
||||
output[encodedLength++] = pgm_read_byte(&_Base64AlphabetTable[A4[i]]);
|
||||
}
|
||||
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(i) {
|
||||
for(j = i; j < 3; j++) {
|
||||
A3[j] = '\0';
|
||||
}
|
||||
|
||||
fromA3ToA4(A4, A3);
|
||||
|
||||
for(j = 0; j < i + 1; j++) {
|
||||
output[encodedLength++] = pgm_read_byte(&_Base64AlphabetTable[A4[j]]);
|
||||
}
|
||||
|
||||
while((i++ < 3)) {
|
||||
output[encodedLength++] = '=';
|
||||
}
|
||||
}
|
||||
output[encodedLength] = '\0';
|
||||
return encodedLength;
|
||||
}
|
||||
|
||||
int Base64Class::decode(char * output, char * input, int inputLength) {
|
||||
int i = 0, j = 0;
|
||||
int decodedLength = 0;
|
||||
unsigned char A3[3];
|
||||
unsigned char A4[4];
|
||||
|
||||
|
||||
while (inputLength--) {
|
||||
if(*input == '=') {
|
||||
break;
|
||||
}
|
||||
|
||||
A4[i++] = *(input++);
|
||||
if (i == 4) {
|
||||
for (i = 0; i <4; i++) {
|
||||
A4[i] = lookupTable(A4[i]);
|
||||
}
|
||||
|
||||
fromA4ToA3(A3,A4);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
output[decodedLength++] = A3[i];
|
||||
}
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (i) {
|
||||
for (j = i; j < 4; j++) {
|
||||
A4[j] = '\0';
|
||||
}
|
||||
|
||||
for (j = 0; j <4; j++) {
|
||||
A4[j] = lookupTable(A4[j]);
|
||||
}
|
||||
|
||||
fromA4ToA3(A3,A4);
|
||||
|
||||
for (j = 0; j < i - 1; j++) {
|
||||
output[decodedLength++] = A3[j];
|
||||
}
|
||||
}
|
||||
output[decodedLength] = '\0';
|
||||
return decodedLength;
|
||||
}
|
||||
|
||||
int Base64Class::encodedLength(int plainLength) {
|
||||
int n = plainLength;
|
||||
return (n + 2 - ((n + 2) % 3)) / 3 * 4;
|
||||
}
|
||||
|
||||
int Base64Class::decodedLength(char * input, int inputLength) {
|
||||
int i = 0;
|
||||
int numEq = 0;
|
||||
for(i = inputLength - 1; input[i] == '='; i--) {
|
||||
numEq++;
|
||||
}
|
||||
|
||||
return ((6 * inputLength) / 8) - numEq;
|
||||
}
|
||||
|
||||
//Private utility functions
|
||||
inline void Base64Class::fromA3ToA4(unsigned char * A4, unsigned char * A3) {
|
||||
A4[0] = (A3[0] & 0xfc) >> 2;
|
||||
A4[1] = ((A3[0] & 0x03) << 4) + ((A3[1] & 0xf0) >> 4);
|
||||
A4[2] = ((A3[1] & 0x0f) << 2) + ((A3[2] & 0xc0) >> 6);
|
||||
A4[3] = (A3[2] & 0x3f);
|
||||
}
|
||||
|
||||
inline void Base64Class::fromA4ToA3(unsigned char * A3, unsigned char * A4) {
|
||||
A3[0] = (A4[0] << 2) + ((A4[1] & 0x30) >> 4);
|
||||
A3[1] = ((A4[1] & 0xf) << 4) + ((A4[2] & 0x3c) >> 2);
|
||||
A3[2] = ((A4[2] & 0x3) << 6) + A4[3];
|
||||
}
|
||||
|
||||
inline unsigned char Base64Class::lookupTable(char c) {
|
||||
if(c >='A' && c <='Z') return c - 'A';
|
||||
if(c >='a' && c <='z') return c - 71;
|
||||
if(c >='0' && c <='9') return c + 4;
|
||||
if(c == '+') return 62;
|
||||
if(c == '/') return 63;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Base64Class Base64;
|
||||
Reference in New Issue
Block a user