1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-14 17:13:50 +01:00

net/unicoap: add documentation

This commit is contained in:
Carl Seifert 2025-07-07 17:12:21 +02:00
parent 0db81c5de7
commit 5e353a3967
13 changed files with 6021 additions and 1 deletions

View File

@ -1324,7 +1324,10 @@ HTML_EXTRA_FILES = src/css/bootstrap.min.css \
src/js/jquery.smartmenus.bootstrap.min.js \ src/js/jquery.smartmenus.bootstrap.min.js \
src/js/jquery-ui.min.js \ src/js/jquery-ui.min.js \
src/js/menu.js \ src/js/menu.js \
src/js/riot-doxy.js src/js/riot-doxy.js \
../../sys/net/application_layer/unicoap/docs/unicoap-layers.svg \
../../sys/net/application_layer/unicoap/docs/unicoap-layers-comms.svg \
../../sys/net/application_layer/unicoap/docs/unicoap-layers-comms-apis.svg
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to # will adjust the colors in the style sheet and background images according to

View File

@ -0,0 +1,51 @@
@defgroup net_unicoap unicoap: Unified CoAP Suite
@ingroup net
@brief Send requests and create server resources using the Constrained Application Protocol across different transports
@{
Module. Specify `USEMODULE += unicoap` in your application's Makefile.
@warning `unicoap` is work in progress. Not all functionality is implemented in RIOT yet, however
the documentation already exists. Do not expect everything to work yet.
`unicoap` is RIOT's unified and modular framework for communication via the Constrained Application
Protocol. `unicoap` supports different transports and several CoAP features, enabled by
a **layered** and **modular** design. Support for each CoAP transport, such as UDP, is available through
[drivers](@ref net_unicoap_drivers).
`unicoap` aims to eventually replace @ref net_gcoap, @ref net_nanocoap, and @ref net_nanosock,
in favor of a more beginner-friendly and easily extensible design.
## CoAP
The [Constrained Application Protocol (CoAP)](https://datatracker.ietf.org/doc/html/rfc7252)
is a lightweight alternative to HTTP. HTTP as a general-purpose application protocol carries a
significant overhead and is thus problematic for IoT networks with limited bandwidth and
nodes with little memory. CoAP covers a range of features needed in the IoT, such as resource
discovery, message fragmentation, and end-to-end message protection.
## Quick start
In your application Makefile, add
```Makefile
USEMODULE += unicoap
USEMODULE += unicoap_driver_udp
```
`unicoap` enables support for CoAP over various transport protocols. Currently, `unicoap` supports
a @ref net_unicoap_drivers_udp and @ref net_unicoap_drivers_dtls.
You must specify at least one driver to use networking functionality. If you just want to
[use message APIs](@ref net_unicoap_message_example), you can use the framing implementation of
each driver, such as the @ref net_unicoap_drivers_rfc7252_pdu submodule for the RFC 7252 PDU format.
`unicoap` implements both a client and a server.
To configure `unicoap`, go to the @ref net_unicoap_config.
For extending `unicoap`, refer to @ref net_unicoap_internal.
<!--
FIXME: undefined references, upcoming PR
If you are already using `unicoap` und want to go the extra mile, head to
@ref net_unicoap_optimizing.
-->
@}

View File

@ -0,0 +1,158 @@
@defgroup net_unicoap_internal Behind The Scenes of unicoap
@ingroup net_unicoap
@{
## CoAP 101
CoAP was originally specified in [RFC 7252](https://datatracker.ietf.org/doc/html/rfc7252)
and could only be used in combination with UDP and DTLS as transport protocols.
[RFC 8223](https://datatracker.ietf.org/doc/html/rfc8323) modified the CoAP format
for sending CoAP messages over TCP, TLS, and WebSockets (including WebSockets over TLS).
There is also an Internet Draft for [CoAP over GATT (BLE)](https://datatracker.ietf.org/doc/draft-amsuess-core-coap-over-gatt).
Each of these standards leverage different messaging models, i.e., what timeouts to apply, how
reliable transmission is implemented, and what messages are allowed to be sent
in response to a certain message type. A custom CoAP PDU header (i.e., another PDU
format) has been specified for CoAP over reliable transports.
For instance, CoAP over UDP and over DTLS share the same PDU format; so do CoAP over TCP and TLS.
The set of protocol characteristics that vary depending on the _transport_ forms a specific version
of CoAP, which is called a _CoAP combination_ in `unicoap`.
For instance, CoAP over UDP is CoAP combination, so is CoAP over DTLS.
## Layered Design
The design of `unicoap` involves three distinct layers that reflect the layered approach of CoAP,
as shown in the figure below. Conceptually, newly received message traverse these layers up to
the application, and data sent by the application travels in the opposite direction.
Located beneath the application, the _exchange_ layer embodies the REST model of CoAP.
It is responsible for handling advanced CoAP features operating above the request-response exchanges,
such as [resource observation](/FIXME-upcoming-pr-net_unicoap_client_resource_observation)
and [block-wise transfer](/FIXME-upcoming-pr-net_unicoap_blockwise).
This layer is shared between CoAP combinations, i.e., the REST semantics remain the same,
regardless of the messaging model and transport beneath.
Since messaging differs between CoAP combinations, a modular design to ease the addition
of new CoAP combinations was necessary: The layer dedicated to _messaging_ covers framing and can
accommodate a custom reliability mechanism, such as the one specified in RFC 7252
(using the four tempers `CON`, `NON`, `ACK`, `RST`). Serializing messages and parsing PDUs received
from the network are also handled by the messaging layer.
The transport layer at the bottom manages different transport protocols.
Here, `unicoap` coordinates with the operating system networking interface.
<img src="unicoap-layers.svg" alt="Figure 1: Layered Design of unicoap" width="500em"/>
### Overview of CoAP Combinations
To better illustrate what parts of the CoAP stack differ, have a look
at the following graph, where each node represents a version of a certain layer. Each leaf node stands for
a different CoAP combination ("CoAP over ...") specification.
```
Requests/Responses
RFC 7252, RFC 7641, RFC 7959, ...
(incl. Resource Observation, Block-Wise Transfers)
/ \
/ \
/ \
Specification: RFC 7252 RFC 8323
| |
+-+- Messaging shared between largely shared between
| | Model: UDP & DTLS TCP, TLS & WebSockets
| | | / \
| | | / \
| +- PDU Format: shared between shared between WebSockets
| UDP & DTLS TCP & TLS / \
| / \ / \ / \
| / \ / \ / \
+-- Transport UDP DTLS TCP TLS WebSockets WebSockets
Protocol: over TLS
Figure 2: Differences between CoAP combinations
```
#### CoAP over UDP and CoAP over DTLS (RFC 7252)
CoAP over UDP and DTLS works with messages of different types. A message can be confirmable (a `CON`
message), non-confirmable (`NON`), an acknowledgment message (`ACK`), or a reset message (`RST`).
Confirmable messages elicit an acknowledgement message to be sent by the peer. Hence, RFC 7252
provides optional reliability (i.e., retransmission using an exponential back-of mechanism)
using confirmable and acknowledgement messages.
@see [RFC 7252](https://datatracker.ietf.org/doc/html/rfc7252)
#### CoAP over TCP, CoAP over TLS, and CoAP over WebScokets (RFC 8323)
RFC 8323 eliminates the need for reliability to be implemented on the application layer, as the underlying
transport protocol already provides reliability. While message processing looks the same for both
CoAP over TCP/TLS ([RFC 8323, Section 3](https://datatracker.ietf.org/doc/html/rfc8323#section-3)) and
CoAP over WebSockets ([RFC 8323, Section 4](https://datatracker.ietf.org/doc/html/rfc8323#section-4)),
the PDU format employed *does* vary a little between them.
@see [RFC 8323](https://datatracker.ietf.org/doc/html/rfc8323)
#### CoAP over GATT over Bluetooth Low Energy (BLE) (IETF Draft)
The [CoAP over GATT (BLE)](https://datatracker.ietf.org/doc/draft-amsuess-core-coap-over-gatt)
messaging layer works entirely different from previously specified Constrained Application Protocol variants.
Hence, the PDU format is also custom and optimized to take as little space as possible to reduce airtime.
@see [`draft-amsuess-core-coap-over-gatt`](https://datatracker.ietf.org/doc/draft-amsuess-core-coap-over-gatt)
### Drivers
To integrate new CoAP combinations, functionality for messaging and transport layer must be added.
The `unicoap` design refers to these integrations collectively as a _driver_ that represents
a CoAP combination, such as CoAP over DTLS. Each driver is a RIOT module you can import. For instance,
to use the CoAP over UDP driver, you import the `unicoap_driver_udp` by adding it to the `USEMODULE`
Makefile variable: `USEMODULE += unicoap_driver_udp`.
Drivers themselves can in turn consist of a shared module for messaging and a specific transport
support module. For example, the CoAP over DTLS driver encompasses a transport module for DTLS networking;
and depends on the common RFC 7252 messaging module also employed by the CoAP over UDP driver.
You can see this relationship in `Makefile.dep` in the `unicoap` source directory: The common
messaging module is a shared dependency of both the @ref net_unicoap_drivers_udp and @ref net_unicoap_drivers_dtls.
driver module. We encourage you to follow the same approach for CoAP combinations that share a common
messaging model, such as CoAP over TCP, TLS, and WebSockets when implementing these.
On a high level, each driver interacts with the upper layers on these three occasions:
- **Initialization and deinitialization**:
Drivers must provide an [initialization](/FIXME-upcoming-pr-unicoap_init) and [teardown](/FIXME-upcoming-pr-unicoap_deinit)
These may be used for setup work in the transport and messaging layer such as for creating
sockets or establishing connections to peripherals, alongside allocating objects required for messaging.
- **Sending side / Outbound**:
A driver must expose a standardized API for [sending from the messaging layer](/FIXME-upcoming-pr-unicoap_messaging_send).
The exchange layer will call into this functionality, prompting the driver to perform any due
work in the messaging layer like attempting to retransmit the message. Apart from the message,
as well as the remote and local endpoint, this function accepts flags that customize transmission
behavior. The RFC 7252 message type is abstracted into a _reliability_ flag the messaging layer in
the CoAP over UDP and DTLS drivers interpret as an instruction to send a confirmable message. When
finished, the messaging layer serializes the message and forwards it to the transport
implementation.
- **Receiving side / Inbound**:
Upon receipt of a new message, each driver will need to invoke an [exchange-layer processing function](/FIXME-upcoming-pr-unicoap_exchange_process).
- **Ping**: Due to the variability in ping mechanisms (empty `CON` in CoAP over UDP and `7.03` message in CoAP over reliable transports), each driver can implement a ping function. unicoap bundles these APIs and provides a [single, generic ping function that multiplexes](/FIXME-upcoming-pr-unicoap_ping) between the driver implementations.
### Communication Between Layers
The following figure illustrates communication between layers in a block-wise transfer,
where a client request from the application may result in multiple
[`unicoap_messaging_send`](/FIXME-upcoming-pr-unicoap_messaging_send) and
[`unicoap_exchange_process`](/FIXME-upcoming-pr-unicoap_exchange_process) calls between the
exchange and messaging layer:
<img src="unicoap-layers-comms.svg" alt="Figure 3: Communication between layers" width="600em"/>
The next schematic depicts how these APIs are implemented, based on the CoAP over UDP and
CoAP over DTLS drivers that share the RFC 7252 messaging implementation:
<img src="unicoap-layers-comms-apis.svg" alt="Figure 4: APIs for communication between layers" width="700em"/>
Both the CoAP over UDP and CoAP over DTLS driver support sending vectored data, hence the `sendv`
suffixes in the function names depicted in the figure above.
## Adding a New Driver
In the `unicoap` codebase you will encounter several marks (`MARK: ...`)
that help with extending the suite.
- **MARK: unicoap_driver_extension_point**: Every region of code that would need to be extended to support a new transport protocol or driver is
annotated with this mark.
@}

View File

@ -0,0 +1,292 @@
@defgroup net_unicoap_message_example Using Message APIs
@ingroup net_unicoap_message
@brief A demo of `unicoap` message APIs
@{
Sample code.
This example demonstrates how you can use `unicoap` message and options APIs and how to parse PDUs.
You can find a demo application in the `examples/networking/coap/unicoap_message` folder.
## Bytes to Message (Deserializing)
### Parsing a PDU
To start, let us assume `pdu` is a buffer containing the CoAP PDU.
```c
const uint8_t pdu[] = { /* ... */ };
```
Next, allocate a result structure.
```c
unicoap_parser_result_t parsed = { 0 };
```
Then, call one of the message parsers. CoAP supports different transports which is why the CoAP PDU
header varies. In this case, let us assume we received the message over UDP or DTLS. In these cases,
we use the RFC 7252 PDU format. Using the result structure frees you of needing to allocate options
and a message struct and to wire up options with message struct.
```c
if ((res = unicoap_pdu_parse_rfc7252_result(pdu, sizeof(pdu), &parsed)) < 0) {
puts("Error: parsing failed");
return;
}
unicoap_message_t* message = &parsed.message;
```
Because the header varies, transport-dependent details like the RFC 7252 message type and ID
are accessible via the
@ref unicoap_message_properties_t::rfc7252 member.
```c
printf("CoAP message has token=<%i bytes>\n",
parsed.properties.token_length);
printf("CoAP over UDP/DTLS has id=%i type=%s\n",
parsed.properties.rfc7252.id,
unicoap_string_from_rfc7252_type(parsed.properties.rfc7252.type));
```
### Inspecting a Message
You use the
@ref unicoap_message_is_request,
@ref unicoap_message_is_response, and
@ref unicoap_message_is_signal
methods to check whether a given message is a request, response, or signaling message.
The corresponding typed view of the code is accessible through
@ref unicoap_message_t.method,
@ref unicoap_message_t.status, and
@ref unicoap_message_t.signal.
You can also obtain a human-readable constant null-terminated C string. There are also versions
available for status codes and signal numbers. To get a string description of the CoAP code
without checking the message class first, use @ref unicoap_string_from_code.
```c
const char* method_name = unicoap_string_from_method(message->method);
```
The payload and payload size in bytes can be retrieved the
@ref unicoap_message_t.payload and
@ref unicoap_message_t.payload_size members.
### Reading Options
First, let us dump all options to the standard output.
```c
unicoap_options_dump_all(message->options);
```
To read options like `Content-Format` which can occur no more than once, you use
@ref unicoap_options_t::unicoap_options_get_content_format.
Read accessors for non-repeatable options are prefixed with `unicoap_options_get`.
```c
unicoap_content_format_t format = 0;
if (unicoap_options_get_content_format(message->options, &format) < 0) {
puts("Error: could not read Content-Format!");
}
assert(format == UNICOAP_FORMAT_JSON);
```
Options like `Uri-Query` can occur more than once. For these types of options, `unicoap` defines
several convenience accessors. Let us retrieve the first `Uri-Query` option.
```c
const char* query = NULL;
ssize_t res = unicoap_options_get_first_uri_query(message->options, &query);
if (res < 0) {
if (res == -ENOENT) {
puts("Message has no Uri-Query option");
}
printf("Error: could read first Uri-Query option");
}
```
The `first` getter provides a view into the PDU buffer. The returned string
is thus not null-terminated.
```c
printf("First URI query: '%.*s'\n", (int)res, query);
```
In the case of URI queries, you can also retrieve queries by name (if they obey the `name=value`
format).
```c
res = unicoap_options_get_first_uri_query_by_name(message->options, "color", &query);
if (res < 0) {
/* The getter also fails in cases where no option was found */
if (res == -ENOENT) {
puts("Message has no 'color' query");
}
printf("Error: could read first 'color' query");
}
```
For a number of repeatable options, such as `Uri-Path`, `Location-Path`, `Uri-Query`,
and `Location-Query`, `unicoap` offers accessors that generate the original, contiguous representation.
This means that multiple `Uri-Path` options are stitched back together, forming the `/original/path`.
These accessores do copy. Now, let us create a query string (`?a=1&b=2&c=3`).
```c
char query_string[50] = { 0 };
res = unicoap_options_copy_uri_queries(message->options, query_string, sizeof(query_string));
if (res < 0) {
puts("Error: could not generate URI query string");
}
```
Alternatively, you can iterate over all query options, avoiding the copy operation and allocation.
To do this, you will need to allocate an
@ref unicoap_options_iterator_t and initialize it using
@ref unicoap_options_iterator_t::unicoap_options_iterator_init.
This is the main tool to iterate over options.
`unicoap` exposes multiple methods for getting the next instance of a repeatable option.
```c
unicoap_options_iterator_t iterator;
unicoap_options_iterator_init(&iterator, message->options);
while ((res = unicoap_options_get_next_uri_query(&iterator, &query)) >= 0) {
printf("- URI query: '%.*s'\n", (int)res, query);
}
```
The option iterator can also be used to iterate over all options, regardless of their type.
```c
unicoap_options_iterator_init(&iterator, message->options);
unicoap_option_number_t number;
const uint8_t* value = NULL;
while ((res = unicoap_options_get_next(&iterator, &number, &value)) >= 0) {
const char* name = unicoap_string_from_option_number(number);
printf("- option %s nr=%i contains %" PRIuSIZE " bytes\n", name, number, res);
}
```
## Message to Bytes (Serializing)
### Creating a Message Container
Since we want to add options to the CoAP message, we need to allocate an options buffer first.
To avoid the boilerplate necessary for allocating a helper structure and buffer and the initialization
work, you just need to call
@ref UNICOAP_OPTIONS_ALLOC and provide the desired buffer capacity.
```c
UNICOAP_OPTIONS_ALLOC(options, 100);
```
Now, let us initialize a message. You can either use the designated initializer or initializer
function.
```c
unicoap_request_init_string_with_options(&message, UNICOAP_METHOD_POST, "Hello, World!", &options);
```
### Customizing Options
To set non-repeatable options like `Content-Format`, use `unicoap_options_set` accessors.
```c
int res = unicoap_options_set_content_format(&options, UNICOAP_FORMAT_TEXT);
if (res < 0) {
puts("Error: could not set Content-Format");
}
```
For repeatable options, `unicoap` provides two versions. You can either add multiple instances
of an option like `Uri-Path` by providing the original, contiguous representation (e.g., the path).
```c
int res = unicoap_options_add_uri_path_string(&options, "/thermostat/temperature");
if (res < 0) {
if (res == -ENOBUFS) {
puts("Error: options buffer too small");
}
puts("Error: could not add URI path");
}
```
Or, you can add _components_ individually as follows.
```c
res = unicoap_options_add_uri_path_component_string(&options, "thermostat");
if (res < 0) {
puts("Error: could not add path component");
}
res = unicoap_options_add_uri_path_component_string(&options, "temperature");
if (res < 0) {
puts("Error: could not add path component");
}
```
The same applies to `Uri-Query`.
```c
res = unicoap_options_add_uri_queries_string(&options, "unit=C&friendly=yes");
if (res < 0) {
puts("Error: could not add URI query");
}
```
`unicoap` offers versions for both null-terminated C strings and strings without a null-terminator
that require a length indication instead. Example:
@ref unicoap_options_t::unicoap_options_add_uri_queries and
@ref unicoap_options_t::unicoap_options_add_uri_queries_string, or
@ref unicoap_options_t::unicoap_options_add_uri_query and
@ref unicoap_options_t::unicoap_options_add_uri_query_string.
### Serializing a Message
First, allocate a buffer with a capacity of your choice.
```c
uint8_t pdu[200];
```
The header format varies depending on the transport. Let's use CoAP over UDP or CoAP over DTLS,
i.e., the RFC 7252 format.
@remark In this very simple scenario, we don't use a token. Very constrained nodes
are allowed to handle one request at a time and thus don't need a token to differentiate
responses to outstanding requests.
```c
unicoap_message_properties_t properties = {
.token = NULL,
.token_length = 0,
.rfc7252 = {
.id = 0xABCD,
.type = UNICOAP_TYPE_NON
}
};
```
Finally, call the serializer appropriate for the transport.
```c
ssize_t res = unicoap_pdu_build_rfc7252(pdu, sizeof(pdu), message, &properties);
if (res < 0) {
if (res == -ENOBUFS) {
puts("Error: PDU buffer too small");
}
puts("Error: could not serialize message");
return;
}
printf("The final PDU has a size of %" PRIuSIZE " bytes.\n", res);
```
@}

View File

@ -0,0 +1,24 @@
@defgroup net_unicoap_message Message APIs
@ingroup net_unicoap
@brief Create and serialize CoAP messages
@{
@ref unicoap_message_t is the central container type for CoAP messages. To see how to access
CoAP options, see @ref net_unicoap_options. You may also look at the [guide to using CoAP
messages](https://guides.riot-os.org/FIXME)
## Example
```c
unicoap_message_t message;
const char payload[] = "Hello, World!";
unicoap_request_init_string(&message, UNICOAP_METHOD_POST, payload, &options);
```
You can access the CoAP code through different views, including as ast
@ref unicoap_message_t.method,
@ref unicoap_message_t.status, or
@ref unicoap_message_t.signal number.
@}

View File

@ -0,0 +1,50 @@
@defgroup net_unicoap_pdu Parsing and Serialization
@ingroup net_unicoap_message
@brief Tools for parsing PDUs and serializing messages and options
## Parsing
To parse a message on your own, use one of the parsers in @ref net_unicoap_message and
@ref unicoap_parser_result_t. The parsed message structure helps you allocate everything needed in
one go.
```c
// Parse an RFC 7252 PDU
uint8_t pdu[] = {
0x40, 0x02, 0xfe, 0xb1, 0xb9, 0x61, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x6c, 0x65, 0x64, 0x73, 0x11, 0x32, 0x37, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x67, 0x21, 0x32, 0xff, 0x6d, 0x6f, 0x64, 0x65, 0x3d, 0x6f, 0x6e
};
unicoap_parser_result_t parsed = { 0 }; // Zero-initialize everything
// Parse message
ssize_t res = unicoap_pdu_parse_rfc7252_result(pdu, sizeof(pdu), &parsed);
// Handle errors
if (res < 0) {
// eat error
}
// parsed.message contains the parsed message
```
## Serializing
To serialize a message on your own, decide whether you need vectored data or contiguous data.
To get vectored data, you use `unicoap_pdu_buildv_*` functions, depending on the CoAP transport you intend to use.
Vectored data is represented using an @ref iolist_t.
If you want to build a contiguous storage body, refer to the `unicoap_pdu_build_*` methods, also depending
on the transport.
```c
// Build an RFC 7252 PDU
uint8_t pdu[MY_CAPACITY] = { 0 };
ssize_t size = unicoap_pdu_build_rfc7252(pdu, sizeof(pdu), message, properties);
// Handle errors
if (res < 0) {
// eat error
}
```
## Implementation
Parsing and serialization are each done in two steps:
1. Message header up until options is parsed/serialized by driver
2. Options are parsed/serialized by common `unicoap` implementation

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 96 KiB

View File

@ -0,0 +1,903 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="602.30389"
viewBox="0 0 1135.7111 602.30389"
width="1135.7111"
version="1.1"
id="svg125"
sodipodi:docname="layers-comms.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview125"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="0.21851852"
inkscape:cx="693.30508"
inkscape:cy="320.33898"
inkscape:window-width="1312"
inkscape:window-height="449"
inkscape:window-x="309"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="svg125" />
<defs
id="defs22">
<g
id="a">
<path
d="M 13.03125,0 H 2.34375 v -18.5625 h 10.6875 v 3.21875 H 6.265625 v 4.078125 H 12.5625 V -8.03125 H 6.265625 V -3.25 h 6.765625 z m 0,0"
id="path1" />
</g>
<g
id="b">
<path
d="m 13.296875,-5.15625 c 0,1.105469 -0.273437,2.0625 -0.8125,2.875 -0.53125,0.8125 -1.308594,1.4375 -2.328125,1.875 C 9.144531,0.0273438 7.910156,0.25 6.453125,0.25 5.804688,0.25 5.175781,0.207031 4.5625,0.125 3.945312,0.0390625 3.359375,-0.0820312 2.796875,-0.25 2.234375,-0.414062 1.695312,-0.617188 1.1875,-0.859375 v -3.65625 c 0.882812,0.386719 1.800781,0.734375 2.75,1.046875 C 4.882812,-3.15625 5.820312,-3 6.75,-3 7.394531,-3 7.914062,-3.082031 8.3125,-3.25 8.707031,-3.414062 8.992188,-3.644531 9.171875,-3.9375 9.347656,-4.238281 9.4375,-4.582031 9.4375,-4.96875 9.4375,-5.425781 9.28125,-5.820312 8.96875,-6.15625 8.65625,-6.488281 8.222656,-6.796875 7.671875,-7.078125 7.128906,-7.367188 6.515625,-7.679688 5.828125,-8.015625 5.398438,-8.210938 4.929688,-8.457031 4.421875,-8.75 3.910156,-9.039062 3.425781,-9.398438 2.96875,-9.828125 2.507812,-10.253906 2.132812,-10.769531 1.84375,-11.375 c -0.292969,-0.601562 -0.4375,-1.328125 -0.4375,-2.171875 0,-1.101563 0.253906,-2.050781 0.765625,-2.84375 0.507813,-0.789063 1.234375,-1.394531 2.171875,-1.8125 0.945312,-0.414063 2.0625,-0.625 3.34375,-0.625 0.96875,0 1.890625,0.117187 2.765625,0.34375 0.875,0.21875 1.789063,0.542969 2.75,0.96875 l -1.265625,3.0625 c -0.855469,-0.351563 -1.621094,-0.625 -2.296875,-0.8125 -0.679687,-0.1875 -1.371094,-0.28125 -2.078125,-0.28125 -0.492188,0 -0.90625,0.07813 -1.25,0.234375 -0.34375,0.15625 -0.609375,0.375 -0.796875,0.65625 C 5.335938,-14.375 5.25,-14.046875 5.25,-13.671875 c 0,0.4375 0.128906,0.808594 0.390625,1.109375 0.257813,0.304688 0.648437,0.59375 1.171875,0.875 0.519531,0.273438 1.171875,0.59375 1.953125,0.96875 0.945313,0.449219 1.753906,0.917969 2.421875,1.40625 0.675781,0.492188 1.195312,1.0625 1.5625,1.71875 0.363281,0.65625 0.546875,1.46875 0.546875,2.4375 z m 0,0"
id="path2" />
</g>
<g
id="c">
<path
d="m 13.703125,0 -1.34375,-4.421875 H 5.59375 L 4.234375,0 H 0 l 6.546875,-18.640625 h 4.8125 L 17.9375,0 Z M 11.40625,-7.71875 10.0625,-12.03125 C 9.976562,-12.320312 9.863281,-12.691406 9.71875,-13.140625 9.582031,-13.597656 9.445312,-14.0625 9.3125,-14.53125 9.175781,-15 9.0625,-15.40625 8.96875,-15.75 c -0.085938,0.34375 -0.199219,0.773438 -0.34375,1.28125 -0.148438,0.511719 -0.289062,0.996094 -0.421875,1.453125 -0.136719,0.460937 -0.234375,0.789063 -0.296875,0.984375 l -1.328125,4.3125 z m 0,0"
id="path3" />
</g>
<g
id="d">
<path
d="m 9.375,-10.421875 h 7.375 v 9.625 C 15.769531,-0.472656 14.753906,-0.21875 13.703125,-0.03125 12.660156,0.15625 11.472656,0.25 10.140625,0.25 8.296875,0.25 6.726562,-0.113281 5.4375,-0.84375 4.15625,-1.570312 3.179688,-2.644531 2.515625,-4.0625 c -0.667969,-1.425781 -1,-3.175781 -1,-5.25 0,-1.9375 0.375,-3.613281 1.125,-5.03125 0.75,-1.425781 1.84375,-2.53125 3.28125,-3.3125 1.445313,-0.78125 3.207031,-1.171875 5.28125,-1.171875 0.988281,0 1.957031,0.109375 2.90625,0.328125 0.957031,0.210938 1.828125,0.480469 2.609375,0.8125 l -1.3125,3.15625 c -0.5625,-0.289062 -1.210938,-0.53125 -1.9375,-0.71875 -0.730469,-0.195312 -1.492188,-0.296875 -2.28125,-0.296875 -1.148438,0 -2.140625,0.261719 -2.984375,0.78125 -0.84375,0.523437 -1.496094,1.257813 -1.953125,2.203125 -0.460938,0.949219 -0.6875,2.058594 -0.6875,3.328125 0,1.210937 0.160156,2.28125 0.484375,3.21875 0.332031,0.9375 0.851563,1.671875 1.5625,2.203125 0.71875,0.53125 1.644531,0.796875 2.78125,0.796875 0.5625,0 1.035156,-0.023437 1.421875,-0.078125 0.382812,-0.0625 0.75,-0.125 1.09375,-0.1875 V -7.140625 H 9.375 Z m 0,0"
id="path4" />
</g>
<g
id="e">
<path
d="M 2.34375,0 V -18.5625 H 6.265625 V 0 Z m 0,0"
id="path5" />
</g>
<g
id="f">
<path
d="m 18.796875,0 h -5 L 5.71875,-14.046875 H 5.609375 c 0.03125,0.585937 0.054687,1.171875 0.078125,1.765625 0.03125,0.59375 0.054688,1.1875 0.078125,1.78125 0.03125,0.585938 0.0625,1.171875 0.09375,1.765625 V 0 H 2.34375 v -18.5625 h 4.953125 l 8.0625,13.90625 h 0.09375 C 15.429688,-5.226562 15.40625,-5.796875 15.375,-6.359375 15.351562,-6.929688 15.332031,-7.5 15.3125,-8.0625 c -0.02344,-0.570312 -0.03906,-1.144531 -0.04687,-1.71875 v -8.78125 h 3.53125 z m 0,0"
id="path6" />
</g>
<g
id="g">
<path
d="M 9.5,0 H 5.5625 V -15.28125 H 0.515625 V -18.5625 H 14.53125 v 3.28125 H 9.5 Z m 0,0"
id="path7" />
</g>
<g
id="h">
<path
d="m 7.75,-18.5625 c 1.675781,0 3.0625,0.203125 4.15625,0.609375 1.101562,0.40625 1.921875,1.023437 2.453125,1.84375 0.53125,0.824219 0.796875,1.859375 0.796875,3.109375 0,0.84375 -0.164062,1.585938 -0.484375,2.21875 -0.324219,0.636719 -0.746094,1.179688 -1.265625,1.625 -0.523438,0.4375 -1.089844,0.792969 -1.703125,1.0625 L 17.171875,0 h -4.375 l -4.4375,-7.125 H 6.265625 V 0 H 2.34375 v -18.5625 z m -0.28125,3.21875 H 6.265625 v 5.015625 h 1.28125 c 1.300781,0 2.234375,-0.210937 2.796875,-0.640625 0.5625,-0.4375 0.84375,-1.082031 0.84375,-1.9375 0,-0.875 -0.304688,-1.5 -0.90625,-1.875 -0.605469,-0.375 -1.542969,-0.5625 -2.8125,-0.5625 z m 0,0"
id="path8" />
</g>
<g
id="i">
<path
d="m 8.265625,-18.5625 c 2.394531,0 4.140625,0.515625 5.234375,1.546875 1.101562,1.03125 1.65625,2.449219 1.65625,4.25 0,0.8125 -0.125,1.589844 -0.375,2.328125 -0.242188,0.742188 -0.636719,1.398438 -1.1875,1.96875 -0.554688,0.574219 -1.292969,1.027344 -2.21875,1.359375 -0.929688,0.335937 -2.070312,0.5 -3.421875,0.5 h -1.6875 V 0 H 2.34375 V -18.5625 Z M 8.0625,-15.34375 H 6.265625 v 5.515625 H 7.5625 c 0.738281,0 1.378906,-0.09375 1.921875,-0.28125 0.539063,-0.195313 0.957031,-0.503906 1.25,-0.921875 0.300781,-0.414062 0.453125,-0.945312 0.453125,-1.59375 0,-0.914062 -0.257812,-1.597656 -0.765625,-2.046875 C 9.910156,-15.117188 9.125,-15.34375 8.0625,-15.34375 Z m 0,0"
id="path9" />
</g>
<g
id="j">
<path
d="m 19.1875,-9.3125 c 0,1.4375 -0.183594,2.746094 -0.546875,3.921875 C 18.285156,-4.222656 17.75,-3.21875 17.03125,-2.375 c -0.71875,0.84375 -1.636719,1.496094 -2.75,1.953125 C 13.175781,0.0234375 11.863281,0.25 10.34375,0.25 8.832031,0.25 7.519531,0.0234375 6.40625,-0.421875 5.300781,-0.878906 4.382812,-1.53125 3.65625,-2.375 2.9375,-3.21875 2.398438,-4.226562 2.046875,-5.40625 1.691406,-6.582031 1.515625,-7.890625 1.515625,-9.328125 c 0,-1.925781 0.3125,-3.597656 0.9375,-5.015625 0.632813,-1.425781 1.609375,-2.535156 2.921875,-3.328125 1.3125,-0.789063 2.976562,-1.1875 5,-1.1875 2.007812,0 3.664062,0.398437 4.96875,1.1875 1.300781,0.792969 2.265625,1.902344 2.890625,3.328125 0.632813,1.429688 0.953125,3.105469 0.953125,5.03125 z m -13.546875,0 c 0,1.304688 0.160156,2.421875 0.484375,3.359375 0.320312,0.929687 0.832031,1.648437 1.53125,2.15625 0.695312,0.5 1.59375,0.75 2.6875,0.75 1.113281,0 2.019531,-0.25 2.71875,-0.75 0.695312,-0.507813 1.203125,-1.226563 1.515625,-2.15625 0.320313,-0.9375 0.484375,-2.054687 0.484375,-3.359375 0,-1.9375 -0.367188,-3.460938 -1.09375,-4.578125 -0.730469,-1.125 -1.929688,-1.6875 -3.59375,-1.6875 -1.117188,0 -2.023438,0.257813 -2.71875,0.765625 -0.699219,0.5 -1.210938,1.21875 -1.53125,2.15625 -0.324219,0.929688 -0.484375,2.042969 -0.484375,3.34375 z m 0,0"
id="path10" />
</g>
<g
id="k">
<path
d="m 10.21875,-15.546875 c -0.75,0 -1.417969,0.148437 -2,0.4375 -0.585938,0.292969 -1.074219,0.714844 -1.46875,1.265625 -0.386719,0.542969 -0.683594,1.203125 -0.890625,1.984375 -0.199219,0.78125 -0.296875,1.65625 -0.296875,2.625 0,1.3125 0.160156,2.433594 0.484375,3.359375 0.320313,0.929688 0.828125,1.636719 1.515625,2.125 0.6875,0.492188 1.570312,0.734375 2.65625,0.734375 0.75,0 1.503906,-0.082031 2.265625,-0.25 C 13.242188,-3.441406 14.066406,-3.6875 14.953125,-4 v 3.296875 C 14.128906,-0.359375 13.320312,-0.113281 12.53125,0.03125 11.738281,0.175781 10.847656,0.25 9.859375,0.25 7.941406,0.25 6.363281,-0.144531 5.125,-0.9375 3.894531,-1.726562 2.984375,-2.835938 2.390625,-4.265625 1.804688,-5.691406 1.515625,-7.351562 1.515625,-9.25 c 0,-1.40625 0.1875,-2.691406 0.5625,-3.859375 0.382813,-1.164063 0.941406,-2.175781 1.671875,-3.03125 0.738281,-0.863281 1.648438,-1.523437 2.734375,-1.984375 1.082031,-0.46875 2.328125,-0.703125 3.734375,-0.703125 0.925781,0 1.851562,0.121094 2.78125,0.359375 0.925781,0.230469 1.8125,0.546875 2.65625,0.953125 l -1.265625,3.1875 c -0.699219,-0.320313 -1.402344,-0.601563 -2.109375,-0.84375 -0.699219,-0.25 -1.386719,-0.375 -2.0625,-0.375 z m 0,0"
id="path11" />
</g>
<g
id="l">
<path
d="M 2.359375,0 V -2.296875 H 5.875 V -15.21875 H 2.359375 v -2.296875 h 9.6875 v 2.296875 h -3.53125 v 12.921875 h 3.53125 V 0 Z m 0,0"
id="path12" />
</g>
<g
id="m">
<path
d="m 1.9375,0 v -17.515625 h 3.265625 l 5.109375,14.5625 c -0.03125,-0.457031 -0.07422,-1.003906 -0.125,-1.640625 -0.04297,-0.644531 -0.07422,-1.3125 -0.09375,-2 -0.02344,-0.6875 -0.03125,-1.3125 -0.03125,-1.875 v -9.046875 h 2.390625 V 0 H 9.1875 L 4.109375,-14.5625 c 0.03125,0.417969 0.0625,0.9375 0.09375,1.5625 0.039063,0.617188 0.070313,1.261719 0.09375,1.9375 0.03125,0.667969 0.046875,1.292969 0.046875,1.875 V 0 Z m 0,0"
id="path13" />
</g>
<g
id="n">
<path
d="m 5.90625,0 v -15.140625 h -4.6875 v -2.40625 h 11.953125 v 2.40625 H 8.5 V 0 Z m 0,0"
id="path14" />
</g>
<g
id="o">
<path
d="m 1.984375,0 v -17.515625 h 4.90625 c 1.144531,0 2.140625,0.21875 2.984375,0.65625 0.851562,0.4375 1.515625,1.058594 1.984375,1.859375 0.476563,0.804688 0.71875,1.746094 0.71875,2.828125 V -5.375 c 0,1.074219 -0.242187,2.023438 -0.71875,2.84375 -0.46875,0.8125 -1.132813,1.4375 -1.984375,1.875 C 9.03125,-0.21875 8.035156,0 6.890625,0 Z m 2.59375,-2.359375 h 2.3125 c 0.957031,0 1.710937,-0.265625 2.265625,-0.796875 C 9.707031,-3.6875 9.984375,-4.425781 9.984375,-5.375 v -6.796875 c 0,-0.925781 -0.277344,-1.65625 -0.828125,-2.1875 -0.554688,-0.539063 -1.308594,-0.8125 -2.265625,-0.8125 h -2.3125 z m 0,0"
id="path15" />
</g>
<g
id="p">
<path
d="m 2.25,0 v -17.515625 h 10.296875 v 2.296875 h -7.75 V -10.25 h 6.921875 v 2.28125 H 4.796875 v 5.671875 h 7.75 V 0 Z m 0,0"
id="path16" />
</g>
<g
id="q">
<path
d="m 2.015625,0 v -17.515625 h 5.5 c 1.101563,0 2.0625,0.214844 2.875,0.640625 0.8125,0.417969 1.445313,1.011719 1.90625,1.78125 0.457031,0.773438 0.6875,1.671875 0.6875,2.703125 0,1.179687 -0.304687,2.195313 -0.90625,3.046875 -0.59375,0.855469 -1.40625,1.460938 -2.4375,1.8125 L 13.21875,0 h -2.953125 l -3.1875,-7.203125 H 4.609375 V 0 Z m 2.59375,-9.484375 h 2.90625 c 0.863281,0 1.550781,-0.257813 2.0625,-0.78125 0.507813,-0.519531 0.765625,-1.210937 0.765625,-2.078125 0,-0.894531 -0.257812,-1.597656 -0.765625,-2.109375 -0.511719,-0.507813 -1.199219,-0.765625 -2.0625,-0.765625 h -2.90625 z m 0,0"
id="path17" />
</g>
<g
id="r">
<path
d="M 7.265625,0.234375 C 6.085938,0.234375 5.070312,0.0390625 4.21875,-0.34375 3.375,-0.738281 2.71875,-1.300781 2.25,-2.03125 1.789062,-2.757812 1.5625,-3.625 1.5625,-4.625 H 4.125 c 0,0.792969 0.28125,1.417969 0.84375,1.875 0.5625,0.460938 1.335938,0.6875 2.328125,0.6875 0.925781,0 1.648437,-0.222656 2.171875,-0.671875 0.53125,-0.445313 0.796875,-1.0625 0.796875,-1.84375 0,-0.65625 -0.183594,-1.222656 -0.546875,-1.703125 C 9.363281,-6.769531 8.851562,-7.097656 8.1875,-7.265625 l -2.21875,-0.65625 c -1.273438,-0.363281 -2.257812,-0.988281 -2.953125,-1.875 -0.699219,-0.894531 -1.046875,-1.957031 -1.046875,-3.1875 0,-0.957031 0.210938,-1.796875 0.640625,-2.515625 0.4375,-0.71875 1.050781,-1.273438 1.84375,-1.671875 0.800781,-0.40625 1.75,-0.609375 2.84375,-0.609375 1.601563,0 2.882813,0.433594 3.84375,1.296875 0.96875,0.867187 1.460937,2.023437 1.484375,3.46875 h -2.59375 c 0,-0.757813 -0.246094,-1.359375 -0.734375,-1.796875 C 8.804688,-15.257812 8.125,-15.484375 7.25,-15.484375 c -0.855469,0 -1.523438,0.210937 -2,0.625 -0.480469,0.40625 -0.71875,0.976563 -0.71875,1.703125 0,0.65625 0.175781,1.226562 0.53125,1.703125 0.363281,0.480469 0.882812,0.820313 1.5625,1.015625 l 2.234375,0.671875 c 1.28125,0.355469 2.265625,0.980469 2.953125,1.875 0.6875,0.898437 1.03125,1.964844 1.03125,3.203125 0,0.980469 -0.234375,1.84375 -0.703125,2.59375 -0.460937,0.742188 -1.105469,1.3125 -1.9375,1.71875 -0.835937,0.4023438 -1.8125,0.609375 -2.9375,0.609375 z m 0,0"
id="path18" />
</g>
<g
id="s">
<path
d="M 2.015625,0 V -17.515625 H 7.75 c 1.132812,0 2.117188,0.21875 2.953125,0.65625 0.84375,0.429687 1.492187,1.039063 1.953125,1.828125 0.457031,0.792969 0.6875,1.726562 0.6875,2.796875 0,1.054687 -0.234375,1.980469 -0.703125,2.78125 -0.460937,0.804687 -1.105469,1.421875 -1.9375,1.859375 C 9.867188,-7.164062 8.882812,-6.953125 7.75,-6.953125 H 4.609375 V 0 Z m 2.59375,-9.28125 H 7.75 c 0.894531,0 1.609375,-0.265625 2.140625,-0.796875 0.539063,-0.539063 0.8125,-1.257813 0.8125,-2.15625 0,-0.914063 -0.273437,-1.632813 -0.8125,-2.15625 C 9.359375,-14.921875 8.644531,-15.1875 7.75,-15.1875 H 4.609375 Z m 0,0"
id="path19" />
</g>
<g
id="t">
<path
d="M 7.203125,0.234375 C 6.109375,0.234375 5.164062,0.0273438 4.375,-0.375 3.582031,-0.78125 2.972656,-1.367188 2.546875,-2.140625 2.128906,-2.921875 1.921875,-3.832031 1.921875,-4.875 v -7.765625 c 0,-1.0625 0.207031,-1.972656 0.625,-2.734375 0.425781,-0.769531 1.035156,-1.359375 1.828125,-1.765625 0.789062,-0.414063 1.734375,-0.625 2.828125,-0.625 1.082031,0 2.019531,0.210937 2.8125,0.625 0.789063,0.40625 1.398437,0.996094 1.828125,1.765625 0.425781,0.761719 0.640625,1.664062 0.640625,2.703125 V -4.875 c 0,1.042969 -0.214844,1.953125 -0.640625,2.734375 -0.429688,0.773437 -1.039062,1.359375 -1.828125,1.765625 -0.792969,0.4023438 -1.730469,0.609375 -2.8125,0.609375 z m 0,-2.296875 c 0.875,0 1.539063,-0.242188 2,-0.734375 0.457031,-0.488281 0.6875,-1.179687 0.6875,-2.078125 v -7.765625 c 0,-0.914063 -0.230469,-1.613281 -0.6875,-2.09375 -0.460937,-0.476563 -1.125,-0.71875 -2,-0.71875 -0.867187,0 -1.53125,0.242187 -2,0.71875 -0.460937,0.480469 -0.6875,1.179687 -0.6875,2.09375 V -4.875 c 0,0.898438 0.226563,1.589844 0.6875,2.078125 0.46875,0.492187 1.132813,0.734375 2,0.734375 z m 0,0"
id="path20" />
</g>
<g
id="u">
<path
d="M 7.296875,0.234375 C 6.203125,0.234375 5.25,0.0273438 4.4375,-0.375 3.632812,-0.78125 3.015625,-1.367188 2.578125,-2.140625 2.140625,-2.921875 1.921875,-3.832031 1.921875,-4.875 v -7.765625 c 0,-1.0625 0.21875,-1.972656 0.65625,-2.734375 0.4375,-0.769531 1.054687,-1.359375 1.859375,-1.765625 0.8125,-0.414063 1.765625,-0.625 2.859375,-0.625 1.082031,0 2.023437,0.210937 2.828125,0.625 0.800781,0.417969 1.421875,1.007813 1.859375,1.765625 0.4375,0.761719 0.65625,1.671875 0.65625,2.734375 H 10.0625 c 0,-0.914063 -0.246094,-1.613281 -0.734375,-2.09375 -0.480469,-0.476563 -1.15625,-0.71875 -2.03125,-0.71875 -0.886719,0 -1.574219,0.242187 -2.0625,0.71875 -0.480469,0.480469 -0.71875,1.167969 -0.71875,2.0625 V -4.875 c 0,0.898438 0.238281,1.589844 0.71875,2.078125 0.488281,0.492187 1.175781,0.734375 2.0625,0.734375 0.875,0 1.550781,-0.242188 2.03125,-0.734375 C 9.816406,-3.285156 10.0625,-3.976562 10.0625,-4.875 h 2.578125 c 0,1.042969 -0.21875,1.949219 -0.65625,2.71875 -0.4375,0.761719 -1.058594,1.351562 -1.859375,1.765625 -0.804688,0.4140625 -1.746094,0.625 -2.828125,0.625 z m 0,0"
id="path21" />
</g>
<g
id="v">
<path
d="m 9.234375,-14.796875 c 0.269531,0 0.554687,0.01563 0.859375,0.04687 0.3125,0.03125 0.578125,0.07031 0.796875,0.109375 l -0.28125,2.46875 c -0.210937,-0.05078 -0.453125,-0.09375 -0.734375,-0.125 -0.273438,-0.03906 -0.527344,-0.0625 -0.765625,-0.0625 -0.5625,0 -1.101563,0.109375 -1.609375,0.328125 -0.511719,0.210938 -0.960938,0.515625 -1.34375,0.921875 C 5.769531,-10.710938 5.46875,-10.226562 5.25,-9.65625 5.03125,-9.082031 4.921875,-8.425781 4.921875,-7.6875 V 0 H 2.25 v -14.53125 h 2.140625 l 0.3125,2.625 h 0.125 c 0.300781,-0.53125 0.660156,-1.015625 1.078125,-1.453125 0.425781,-0.4375 0.921875,-0.785156 1.484375,-1.046875 0.5625,-0.257812 1.175781,-0.390625 1.84375,-0.390625 z m 0,0"
id="path22" />
</g>
</defs>
<path
d="M 79.683596,354.01486 H 1056.0235 c 16.5859,0 26.539,0 33.1758,2.34375 10.4765,3.8164 18.7304,12.07031 22.5468,22.54687 1.5977,4.05078 2.3438,10.36328 2.3438,15.10938 0,4.74218 -0.7461,11.05468 -2.3438,15.10547 -3.8164,10.48046 -12.0703,18.73437 -22.5468,22.54687 -6.6368,2.34766 -16.5899,2.34766 -33.1758,2.34766 H 79.683596 c -16.58594,0 -26.53907,0 -33.17188,-2.34766 -10.48047,-3.8125 -18.73437,-12.06641 -22.54687,-22.54687 -1.60157,-4.05079 -2.34766,-10.36329 -2.34766,-15.10547 0,-4.7461 0.74609,-11.0586 2.34766,-15.10938 3.8125,-10.47656 12.0664,-18.73047 22.54687,-22.54687 6.63281,-2.34375 16.58594,-2.34375 33.17188,-2.34375 z m 0,0"
fill="#55c1a7"
fill-opacity="0.2"
id="path23" />
<path
d="M 79.683594,354.01485 H 1056.0235 c 16.5859,0 26.539,0 33.1719,2.34375 10.4804,3.81641 18.7343,12.07032 22.5507,22.54688 1.5977,4.05078 2.3438,10.36328 2.3438,15.10937 0,4.74219 -0.7461,11.05469 -2.3438,15.10547 -3.8164,10.48047 -12.0703,18.73438 -22.5507,22.54688 -6.6329,2.34765 -16.586,2.34765 -33.1719,2.34765 H 79.683594 c -16.585938,0 -26.539063,0 -33.171875,-2.34765 -10.480469,-3.8125 -18.734375,-12.06641 -22.546875,-22.54688 -1.601563,-4.05078 -2.347656,-10.36328 -2.347656,-15.10547 0,-4.74609 0.746093,-11.05859 2.347656,-15.10937 3.8125,-10.47656 12.066406,-18.73047 22.546875,-22.54688 6.632812,-2.34375 16.585937,-2.34375 33.171875,-2.34375 z m 0,0"
fill="none"
stroke="#55c1a7"
stroke-width="1.1"
id="path24" />
<g
fill="#4caf98"
id="g32"
transform="translate(-265.83984,-221.91483)">
<path
d="M 10.1875,0 5.71875,-14.5625 H 5.609375 c 0.019531,0.34375 0.046875,0.867188 0.078125,1.5625 0.039062,0.699219 0.078125,1.445312 0.109375,2.234375 0.039063,0.792969 0.0625,1.5 0.0625,2.125 V 0 H 2.34375 V -18.5625 H 7.6875 l 4.40625,14.1875 h 0.0625 l 4.671875,-14.1875 h 5.34375 V 0 h -3.65625 v -8.78125 c 0,-0.582031 0.0078,-1.253906 0.03125,-2.015625 0.01953,-0.769531 0.04687,-1.5 0.07813,-2.1875 0.03125,-0.6875 0.05469,-1.203125 0.07813,-1.546875 H 18.59375 L 13.796875,0 Z m 0,0"
transform="translate(310.4748,625.811)"
id="path25" />
<use
x="334.73019"
xlink:href="#a"
y="625.81097"
id="use25" />
<use
x="349.02759"
xlink:href="#b"
y="625.81097"
id="use26" />
<use
x="363.091"
xlink:href="#b"
y="625.81097"
id="use27" />
<use
x="377.15439"
xlink:href="#c"
y="625.81097"
id="use28" />
<use
x="394.83179"
xlink:href="#d"
y="625.81097"
id="use29" />
<use
x="413.39319"
xlink:href="#e"
y="625.81097"
id="use30" />
<use
x="421.7366"
xlink:href="#f"
y="625.81097"
id="use31" />
<use
x="442.612"
xlink:href="#d"
y="625.81097"
id="use32" />
</g>
<path
d="M 80.285156,457.01486 H 1055.4219 c 16.75,0 26.7969,0 33.4961,2.35937 10.6016,3.85547 18.9531,12.20703 22.8125,22.8125 1.5977,4.10547 2.3594,10.11328 2.3594,14.82813 0,4.71093 -0.7617,10.71875 -2.3594,14.82812 -3.8594,10.60157 -12.2109,18.95313 -22.8125,22.8125 -6.6992,2.35938 -16.7461,2.35938 -33.4961,2.35938 H 80.285156 c -16.74609,0 -26.79687,0 -33.49609,-2.35938 -10.60157,-3.85937 -18.95313,-12.21093 -22.8125,-22.8125 -1.59766,-4.10937 -2.35938,-10.11718 -2.35938,-14.82812 0,-4.71485 0.76172,-10.72266 2.35938,-14.82813 3.85937,-10.60547 12.21093,-18.95703 22.8125,-22.8125 6.69922,-2.35937 16.75,-2.35937 33.49609,-2.35937 z m 0,0"
fill="#00a2ff"
fill-opacity="0.2"
id="path32" />
<path
d="M 80.285156,457.01485 H 1055.4219 c 16.7461,0 26.7969,0 33.4961,2.35938 10.6016,3.85547 18.9531,12.20703 22.8125,22.8125 1.5977,4.10547 2.3594,10.11328 2.3594,14.82812 0,4.71094 -0.7617,10.71875 -2.3594,14.82813 -3.8594,10.60156 -12.2109,18.95312 -22.8125,22.8125 -6.6992,2.35937 -16.75,2.35937 -33.4961,2.35937 H 80.285156 c -16.746094,0 -26.796875,0 -33.496094,-2.35937 -10.601562,-3.85938 -18.953125,-12.21094 -22.8125,-22.8125 -1.597656,-4.10938 -2.359374,-10.11719 -2.359374,-14.82813 0,-4.71484 0.761718,-10.72265 2.359374,-14.82812 3.859375,-10.60547 12.210938,-18.95703 22.8125,-22.8125 6.699219,-2.35938 16.75,-2.35938 33.496094,-2.35938 z m 0,0"
fill="none"
stroke="#00a2ff"
stroke-width="1.1"
id="path33" />
<g
fill="#00a2ff"
id="g41"
transform="translate(-265.83984,-221.91483)">
<use
x="310.86209"
xlink:href="#g"
y="728.81097"
id="use33" />
<use
x="325.65869"
xlink:href="#h"
y="728.81097"
id="use34" />
<use
x="342.56131"
xlink:href="#c"
y="728.81097"
id="use35" />
<use
x="360.2439"
xlink:href="#f"
y="728.81097"
id="use36" />
<use
x="381.12451"
xlink:href="#b"
y="728.81097"
id="use37" />
<use
x="395.19312"
xlink:href="#i"
y="728.81097"
id="use38" />
<use
x="411.2637"
xlink:href="#j"
y="728.81097"
id="use39" />
<use
x="431.7023"
xlink:href="#h"
y="728.81097"
id="use40" />
<use
x="448.60489"
xlink:href="#g"
y="728.81097"
id="use41" />
</g>
<path
d="m 253.66016,165.74533 h 594.6016 c 16.75,0 26.7968,0 33.5,2.35937 10.6015,3.85938 18.9531,12.21094 22.8125,22.8125 1.5976,4.10938 2.3593,10.11719 2.3593,14.82813 0,4.71093 -0.7617,10.71875 -2.3593,14.82812 -3.8594,10.60156 -12.211,18.95313 -22.8125,22.8125 -6.7032,2.35938 -16.75,2.35938 -33.5,2.35938 h -594.6016 c -16.75,0 -26.80078,0 -33.5,-2.35938 -10.60156,-3.85937 -18.95313,-12.21094 -22.8125,-22.8125 -1.59766,-4.10937 -2.35938,-10.11719 -2.35938,-14.82812 0,-4.71094 0.76172,-10.71875 2.35938,-14.82813 3.85937,-10.60156 12.21094,-18.95312 22.8125,-22.8125 6.69922,-2.35937 16.75,-2.35937 33.5,-2.35937 z m 0,0"
fill="#f6891e"
fill-opacity="0.2"
id="path41" />
<path
d="m 253.66016,165.74532 h 594.60156 c 16.75,0 26.80078,0 33.5,2.35938 10.60157,3.85937 18.95313,12.21094 22.8125,22.8125 1.59766,4.10937 2.35938,10.11719 2.35938,14.82812 0,4.71094 -0.76172,10.71875 -2.35938,14.82813 -3.85937,10.60156 -12.21093,18.95312 -22.8125,22.8125 -6.69922,2.35937 -16.75,2.35937 -33.5,2.35937 H 253.66016 c -16.75,0 -26.80078,0 -33.5,-2.35937 -10.60157,-3.85938 -18.95313,-12.21094 -22.8125,-22.8125 -1.59766,-4.10938 -2.35938,-10.11719 -2.35938,-14.82813 0,-4.71093 0.76172,-10.71875 2.35938,-14.82812 3.85937,-10.60156 12.21093,-18.95313 22.8125,-22.8125 6.69922,-2.35938 16.75,-2.35938 33.5,-2.35938 z m 0,0"
fill="none"
stroke="#f6891e"
stroke-width="1.1"
id="path42" />
<g
fill="#f6891e"
id="g47"
transform="translate(-265.83984,-221.91483)">
<use
x="484.2334"
xlink:href="#a"
y="437.5426"
id="use42" />
<path
d="m 17.34375,0 h -4.5 L 8.53125,-7.015625 4.21875,0 H 0 L 6.15625,-9.578125 0.390625,-18.5625 h 4.34375 l 4,6.671875 3.921875,-6.671875 h 4.234375 l -5.8125,9.203125 z m 0,0"
transform="translate(498.536,437.5426)"
id="path43" />
<use
x="515.62061"
xlink:href="#k"
y="437.5426"
id="use43" />
<path
d="M 17.546875,0 H 13.625 V -8.015625 H 6.265625 V 0 H 2.34375 v -18.5625 h 3.921875 v 7.28125 H 13.625 v -7.28125 h 3.921875 z m 0,0"
transform="translate(531.9252,437.5426)"
id="path44" />
<use
x="551.5578"
xlink:href="#c"
y="437.5426"
id="use44" />
<use
x="569.24042"
xlink:href="#f"
y="437.5426"
id="use45" />
<use
x="590.12097"
xlink:href="#d"
y="437.5426"
id="use46" />
<use
x="608.68762"
xlink:href="#a"
y="437.5426"
id="use47" />
</g>
<path
d="M 81.816406,0.55001077 H 1053.8907 c 17.1601,0 27.457,0 34.3203,2.39062523 10.914,3.972656 19.5156,12.574218 23.4883,23.488281 1.5937,4.273437 2.3906,9.453125 2.3906,14.121094 0,4.667968 -0.7969,9.847656 -2.3906,14.121093 -3.9727,10.914063 -12.5743,19.511719 -23.4883,23.488282 -6.8633,2.390625 -17.1602,2.390625 -34.3203,2.390625 H 81.816406 c -17.160156,0 -27.457031,0 -34.320312,-2.390625 C 36.582031,74.182823 27.980469,65.585167 24.007812,54.671104 c -1.59375,-4.273437 -2.390624,-9.453125 -2.390624,-14.121093 0,-4.667969 0.796874,-9.847657 2.390624,-14.121094 C 27.980469,15.514854 36.582031,6.913292 47.496094,2.940636 54.359375,0.55001077 64.65625,0.55001077 81.816406,0.55001077 Z m 0,0"
fill="#cf2189"
fill-opacity="0.2"
stroke="#cf2189"
stroke-opacity="0.6"
stroke-width="1.1"
id="path47" />
<g
fill="#cf2189"
id="g57"
transform="translate(-265.83984,-221.91483)">
<use
x="311.6319"
xlink:href="#c"
y="272.34729"
id="use48" />
<use
x="329.3093"
xlink:href="#i"
y="272.34729"
id="use49" />
<use
x="345.37469"
xlink:href="#i"
y="272.34729"
id="use50" />
<path
d="M 2.34375,0 V -18.5625 H 6.265625 V -3.25 h 7.53125 V 0 Z m 0,0"
transform="translate(361.4401,272.3473)"
id="path50" />
<use
x="375.86749"
xlink:href="#e"
y="272.34729"
id="use51" />
<use
x="384.21091"
xlink:href="#k"
y="272.34729"
id="use52" />
<use
x="400.51031"
xlink:href="#c"
y="272.34729"
id="use53" />
<use
x="418.18771"
xlink:href="#g"
y="272.34729"
id="use54" />
<use
x="432.9791"
xlink:href="#e"
y="272.34729"
id="use55" />
<use
x="441.32251"
xlink:href="#j"
y="272.34729"
id="use56" />
<use
x="461.75589"
xlink:href="#f"
y="272.34729"
id="use57" />
</g>
<path
d="M 85.464844,333.01485 H 1050.2422 c 24.6407,0 39.4258,0 49.2813,4.11329 14.207,5.17187 25.3984,16.36328 30.5703,30.57422 4.1172,9.85546 4.1172,24.64062 4.1172,49.27734 v 57.5 c 0,24.64063 0,39.42578 -4.1172,49.28125 -5.1719,14.20703 -16.3633,25.40234 -30.5703,30.57422 -9.8555,4.11328 -24.6406,4.11328 -49.2813,4.11328 H 85.464844 c -24.640625,0 -39.421875,0 -49.277344,-4.11328 C 21.976562,549.16329 10.785156,537.96798 5.6132813,523.76095 1.5,513.90548 1.5,499.12033 1.5,474.4797 v -57.5 c 0,-24.63672 0,-39.42188 4.1132813,-49.27734 5.1718747,-14.21094 16.3632807,-25.40235 30.5742187,-30.57422 9.855469,-4.11329 24.636719,-4.11329 49.277344,-4.11329 z m 0,0"
fill="none"
stroke="#5e5e5e"
stroke-dasharray="6, 6"
stroke-width="3"
id="path57" />
<path
d="M 59.730469,79.975792 V 319.81173"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path58" />
<path
d="m 53.128906,318.31173 6.60156,13.20313 6.60156,-13.20313 z m 0,0"
fill="#64707b"
id="path59" />
<path
d="m 108.10547,183.87814 h 20.60937 c 9.51954,0 15.23047,0 19.03907,1.3164 6.07422,2.21094 10.85937,6.9961 13.07031,13.07032 0.87109,2.39843 1.31641,4.92968 1.31641,7.48046 0,2.55079 -0.44532,5.08204 -1.31641,7.48047 -2.21094,6.07422 -6.99609,10.85938 -13.07031,13.07032 -3.8086,1.3164 -9.51953,1.3164 -19.03907,1.3164 h -20.60937 c -9.519533,0 -15.23047,0 -19.039064,-1.3164 -6.074219,-2.21094 -10.859375,-6.9961 -13.070312,-13.07032 -0.875,-2.39843 -1.320313,-4.92968 -1.320313,-7.48047 0,-2.55078 0.445313,-5.08203 1.320313,-7.48046 2.210937,-6.07422 6.996093,-10.85938 13.070312,-13.07032 3.808594,-1.3164 9.519531,-1.3164 19.039064,-1.3164 z m 0,0"
fill="#64707b"
stroke="#929292"
stroke-width="0.6"
id="path60" />
<g
fill="#ffffff"
id="g63"
transform="translate(-265.83984,-221.91483)">
<use
x="355.63269"
xlink:href="#l"
y="436.20099"
id="use60" />
<use
x="369.79269"
xlink:href="#m"
y="436.20099"
id="use61" />
<use
x="383.9527"
xlink:href="#l"
y="436.20099"
id="use62" />
<use
x="398.1127"
xlink:href="#n"
y="436.20099"
id="use63" />
</g>
<g
fill="#5e5e5e"
id="g67"
transform="translate(-265.83984,-221.91483)">
<g
id="g64">
<path
d="m 18.0625,-9.828125 c 0,2.179687 -0.402344,3.996094 -1.203125,5.453125 C 16.054688,-2.925781 14.894531,-1.832031 13.375,-1.09375 11.863281,-0.363281 10.03125,0 7.875,0 H 2.578125 V -19.28125 H 8.46875 c 1.96875,0 3.664062,0.359375 5.09375,1.078125 1.4375,0.71875 2.546875,1.78125 3.328125,3.1875 0.78125,1.398437 1.171875,3.125 1.171875,5.1875 z M 15.234375,-9.75 c 0,-1.644531 -0.273437,-3.003906 -0.8125,-4.078125 -0.53125,-1.070313 -1.320313,-1.867187 -2.359375,-2.390625 C 11.019531,-16.738281 9.75,-17 8.25,-17 H 5.28125 v 14.703125 h 2.5 c 2.488281,0 4.351562,-0.617187 5.59375,-1.859375 1.238281,-1.25 1.859375,-3.113281 1.859375,-5.59375 z m 0,0"
transform="translate(778.178,823.9531)"
id="path63" />
<use
x="797.60449"
xlink:href="#v"
y="823.95312"
id="use64" />
</g>
<path
d="M 4.90625,-14.53125 V 0 H 2.25 v -14.53125 z m -1.3125,-5.5 c 0.425781,0 0.789062,0.125 1.09375,0.375 0.300781,0.25 0.453125,0.652344 0.453125,1.203125 C 5.140625,-17.898438 4.988281,-17.5 4.6875,-17.25 4.382812,-17 4.019531,-16.875 3.59375,-16.875 3.164062,-16.875 2.800781,-17 2.5,-17.25 2.207031,-17.5 2.0625,-17.898438 2.0625,-18.453125 c 0,-0.550781 0.144531,-0.953125 0.4375,-1.203125 0.300781,-0.25 0.664062,-0.375 1.09375,-0.375 z m 0,0"
transform="translate(808.661,823.9531)"
id="path64" />
<g
id="g66">
<path
d="M 5.53125,0 0,-14.53125 h 2.8125 l 3.09375,8.671875 C 6.101562,-5.296875 6.300781,-4.675781 6.5,-4 c 0.195312,0.679688 0.332031,1.234375 0.40625,1.671875 H 7 C 7.082031,-2.773438 7.226562,-3.332031 7.4375,-4 7.65625,-4.675781 7.863281,-5.296875 8.0625,-5.859375 l 3.078125,-8.671875 H 13.96875 L 8.421875,0 Z m 0,0"
transform="translate(815.5595,823.9531)"
id="path65" />
<path
d="m 7.953125,-14.796875 c 1.257813,0 2.34375,0.273437 3.25,0.8125 0.90625,0.542969 1.597656,1.308594 2.078125,2.296875 0.488281,0.980469 0.734375,2.136719 0.734375,3.46875 v 1.515625 H 4.15625 c 0.019531,1.554687 0.414062,2.746094 1.1875,3.578125 0.78125,0.824219 1.867188,1.234375 3.265625,1.234375 0.925781,0 1.75,-0.082031 2.46875,-0.25 0.71875,-0.175781 1.460937,-0.4375 2.234375,-0.78125 v 2.21875 c -0.730469,0.335937 -1.464844,0.582031 -2.203125,0.734375 -0.730469,0.15625 -1.605469,0.234375 -2.625,0.234375 -1.40625,0 -2.640625,-0.28125 -3.703125,-0.84375 -1.054688,-0.5625 -1.875,-1.394531 -2.46875,-2.5 -0.585938,-1.101563 -0.875,-2.460937 -0.875,-4.078125 0,-1.601562 0.265625,-2.972656 0.796875,-4.109375 C 2.773438,-12.398438 3.53125,-13.269531 4.5,-13.875 c 0.976562,-0.613281 2.128906,-0.921875 3.453125,-0.921875 z m -0.015625,2.0625 c -1.074219,0 -1.9375,0.351563 -2.59375,1.046875 -0.648438,0.699219 -1.027344,1.699219 -1.140625,3 h 7.140625 c 0,-0.800781 -0.125,-1.503906 -0.375,-2.109375 -0.25,-0.601563 -0.625,-1.078125 -1.125,-1.421875 -0.492188,-0.34375 -1.125,-0.515625 -1.90625,-0.515625 z m 0,0"
transform="translate(829.262,823.9531)"
id="path66" />
</g>
<use
x="844.34149"
xlink:href="#v"
y="823.95312"
id="use66" />
</g>
<path
d="M 1075.2969,81.077355 V 319.81173"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path67" />
<path
d="m 1068.6954,318.31173 6.6015,13.20313 6.5977,-13.20313 z m 0,0"
fill="#64707b"
id="path68" />
<path
d="m 973.20706,183.90548 h 48.80864 c 9.5195,0 15.2343,0 19.039,1.32031 6.0743,2.21094 10.8594,6.9961 13.0703,13.07032 0.875,2.39453 1.3204,4.92578 1.3204,7.47656 0,2.55078 -0.4454,5.08203 -1.3204,7.48047 -2.2109,6.07422 -6.996,10.85937 -13.0703,13.07031 -3.8047,1.31641 -9.5195,1.31641 -19.039,1.31641 h -48.80864 c -9.5196,0 -15.2305,0 -19.0391,-1.31641 -6.0742,-2.21094 -10.8594,-6.99609 -13.0703,-13.07031 -0.875,-2.39844 -1.3203,-4.92969 -1.3203,-7.48047 0,-2.55078 0.4453,-5.08203 1.3203,-7.47656 2.2109,-6.07422 6.9961,-10.85938 13.0703,-13.07032 3.8086,-1.32031 9.5195,-1.32031 19.0391,-1.32031 z m 0,0"
fill="#64707b"
id="path69" />
<path
d="m 973.20703,183.90548 h 48.80857 c 9.5196,0 15.2305,0 19.0391,1.32031 6.0742,2.21094 10.8594,6.9961 13.0703,13.07032 0.875,2.39453 1.3203,4.92578 1.3203,7.47656 0,2.55078 -0.4453,5.08203 -1.3203,7.48047 -2.2109,6.07422 -6.9961,10.85937 -13.0703,13.07031 -3.8086,1.31641 -9.5195,1.31641 -19.0391,1.31641 h -48.80857 c -9.51953,0 -15.23047,0 -19.03906,-1.31641 -6.07422,-2.21094 -10.85938,-6.99609 -13.07031,-13.07031 -0.875,-2.39844 -1.32032,-4.92969 -1.32032,-7.48047 0,-2.55078 0.44532,-5.08203 1.32032,-7.47656 2.21093,-6.07422 6.99609,-10.85938 13.07031,-13.07032 3.80859,-1.32031 9.51953,-1.32031 19.03906,-1.32031 z m 0,0"
fill="none"
stroke="#929292"
stroke-width="0.6"
id="path70" />
<g
fill="#ffffff"
id="g75"
transform="translate(-265.83984,-221.91483)">
<use
x="1220.6689"
xlink:href="#o"
y="436.22961"
id="use70" />
<use
x="1234.829"
xlink:href="#p"
y="436.22961"
id="use71" />
<use
x="1248.989"
xlink:href="#l"
y="436.22961"
id="use72" />
<use
x="1263.149"
xlink:href="#m"
y="436.22961"
id="use73" />
<use
x="1277.309"
xlink:href="#l"
y="436.22961"
id="use74" />
<use
x="1291.469"
xlink:href="#n"
y="436.22961"
id="use75" />
</g>
<path
d="M 227.54297,81.050011 V 153.5461"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path75" />
<path
d="m 220.94532,152.04611 6.59765,13.19922 6.60156,-13.19922 z m 0,0"
fill="#64707b"
id="path76" />
<path
d="m 279.66797,101.15939 h 62.80859 c 9.51954,0 15.23047,0 19.03907,1.32031 6.07422,2.21094 10.85937,6.99609 13.07031,13.07031 0.87109,2.39844 1.32031,4.92969 1.32031,7.48047 0,2.55078 -0.44922,5.08203 -1.32031,7.47656 -2.21094,6.07422 -6.99609,10.85938 -13.07031,13.07031 -3.8086,1.32032 -9.51953,1.32032 -19.03907,1.32032 h -62.80859 c -9.51953,0 -15.23047,0 -19.03906,-1.32032 -6.07422,-2.21093 -10.85938,-6.99609 -13.07032,-13.07031 -0.87109,-2.39453 -1.32031,-4.92578 -1.32031,-7.47656 0,-2.55078 0.44922,-5.08203 1.32031,-7.48047 2.21094,-6.07422 6.9961,-10.85937 13.07032,-13.07031 3.80859,-1.32031 9.51953,-1.32031 19.03906,-1.32031 z m 0,0"
fill="#64707b"
stroke="#929292"
stroke-width="0.6"
id="path77" />
<g
fill="#ffffff"
id="g81"
transform="translate(-265.83984,-221.91483)">
<use
x="527.22742"
xlink:href="#q"
y="353.48511"
id="use77" />
<use
x="541.38739"
xlink:href="#p"
y="353.48511"
id="use78" />
<path
d="M 9.953125,4.3125 7.375,0.03125 7.75,0.21875 c -0.0625,0 -0.140625,0 -0.234375,0 -0.09375,0.007812 -0.199219,0.015625 -0.3125,0.015625 -1.09375,0 -2.046875,-0.2148438 -2.859375,-0.640625 C 3.53125,-0.84375 2.898438,-1.445312 2.453125,-2.21875 2.003906,-3 1.78125,-3.90625 1.78125,-4.9375 v -7.640625 c 0,-1.050781 0.222656,-1.960937 0.671875,-2.734375 0.445313,-0.769531 1.078125,-1.367188 1.890625,-1.796875 0.8125,-0.4375 1.765625,-0.65625 2.859375,-0.65625 1.101563,0 2.054687,0.21875 2.859375,0.65625 0.8125,0.429687 1.441406,1.027344 1.890625,1.796875 0.445313,0.773438 0.671875,1.683594 0.671875,2.734375 V -4.9375 c 0,1.054688 -0.230469,1.980469 -0.6875,2.78125 -0.460938,0.804688 -1.109375,1.402344 -1.953125,1.796875 L 12.84375,4.3125 Z m -2.75,-6.359375 c 0.875,0 1.5625,-0.257813 2.0625,-0.78125 C 9.773438,-3.359375 10.03125,-4.0625 10.03125,-4.9375 v -7.640625 c 0,-0.894531 -0.257812,-1.601563 -0.765625,-2.125 -0.5,-0.519531 -1.1875,-0.78125 -2.0625,-0.78125 -0.867187,0 -1.554687,0.261719 -2.0625,0.78125 -0.511719,0.523437 -0.765625,1.230469 -0.765625,2.125 V -4.9375 c 0,0.875 0.25,1.578125 0.75,2.109375 0.5,0.523437 1.191406,0.78125 2.078125,0.78125 z m 0,0"
transform="translate(555.5474,353.4851)"
id="path78" />
<path
d="m 7.203125,0.234375 c -1.679687,0 -2.976563,-0.457031 -3.890625,-1.375 -0.917969,-0.914063 -1.375,-2.164063 -1.375,-3.75 v -12.625 h 2.59375 v 12.625 c 0,0.875 0.21875,1.570313 0.65625,2.078125 0.445312,0.511719 1.117188,0.765625 2.015625,0.765625 0.875,0 1.535156,-0.253906 1.984375,-0.765625 0.445312,-0.507812 0.671875,-1.203125 0.671875,-2.078125 v -12.625 h 2.59375 v 12.625 c 0,1.585937 -0.460937,2.835937 -1.375,3.75 -0.90625,0.917969 -2.199219,1.375 -3.875,1.375 z m 0,0"
transform="translate(569.7074,353.4851)"
id="path79" />
<use
x="583.86737"
xlink:href="#p"
y="353.48511"
id="use79" />
<use
x="598.0274"
xlink:href="#r"
y="353.48511"
id="use80" />
<use
x="612.18738"
xlink:href="#n"
y="353.48511"
id="use81" />
</g>
<path
d="M 875.50781,163.64767 V 91.151573"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path81" />
<path
d="m 882.10936,92.651577 -6.6015,-13.19922 -6.5977,13.19922 z m 0,0"
fill="#64707b"
id="path82" />
<path
d="m 733.44531,99.56173 h 87.42579 c 9.51953,0 15.23047,0 19.03906,1.32031 6.07422,2.21094 10.85937,6.9961 13.07031,13.07031 0.8711,2.39844 1.31641,4.92969 1.31641,7.48047 0,2.55078 -0.44531,5.08203 -1.31641,7.47657 -2.21094,6.07421 -6.99609,10.85937 -13.07031,13.07031 -3.80859,1.32031 -9.51953,1.32031 -19.03906,1.32031 h -87.42579 c -9.51953,0 -15.23047,0 -19.03906,-1.32031 -6.07422,-2.21094 -10.85937,-6.9961 -13.07031,-13.07031 -0.8711,-2.39454 -1.32032,-4.92579 -1.32032,-7.47657 0,-2.55078 0.44922,-5.08203 1.32032,-7.48047 2.21094,-6.07421 6.99609,-10.85937 13.07031,-13.07031 3.80859,-1.32031 9.51953,-1.32031 19.03906,-1.32031 z m 0,0"
fill="#64707b"
stroke="#929292"
stroke-width="0.6"
id="path83" />
<g
fill="#ffffff"
id="g90"
transform="translate(-265.83984,-221.91483)">
<use
x="986.23767"
xlink:href="#q"
y="351.27811"
id="use83" />
<use
x="1000.3977"
xlink:href="#p"
y="351.27811"
id="use84" />
<use
x="1014.5577"
xlink:href="#r"
y="351.27811"
id="use85" />
<use
x="1028.7177"
xlink:href="#s"
y="351.27811"
id="use86" />
<use
x="1042.8777"
xlink:href="#t"
y="351.27811"
id="use87" />
<use
x="1057.0377"
xlink:href="#m"
y="351.27811"
id="use88" />
<use
x="1071.1978"
xlink:href="#r"
y="351.27811"
id="use89" />
<use
x="1085.3577"
xlink:href="#p"
y="351.27811"
id="use90" />
</g>
<path
d="m 225.94141,246.24532 v 95.56641"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path90" />
<path
d="m 219.33985,340.31173 6.60156,13.20313 6.59766,-13.20313 z m 0,0"
fill="#64707b"
id="path91" />
<path
d="m 279.66797,267.01095 h 20.60937 c 9.51954,0 15.23047,0 19.03907,1.32031 6.07422,2.21094 10.85937,6.9961 13.07031,13.07031 0.87109,2.39454 1.32031,4.92579 1.32031,7.47657 0,2.55078 -0.44922,5.08203 -1.32031,7.48047 -2.21094,6.07421 -6.99609,10.85937 -13.07031,13.07031 -3.8086,1.3164 -9.51953,1.3164 -19.03907,1.3164 h -20.60937 c -9.51953,0 -15.23047,0 -19.03906,-1.3164 -6.07422,-2.21094 -10.85938,-6.9961 -13.07032,-13.07031 -0.87109,-2.39844 -1.32031,-4.92969 -1.32031,-7.48047 0,-2.55078 0.44922,-5.08203 1.32031,-7.47657 2.21094,-6.07421 6.9961,-10.85937 13.07032,-13.07031 3.80859,-1.32031 9.51953,-1.32031 19.03906,-1.32031 z m 0,0"
fill="#64707b"
stroke="#929292"
stroke-width="0.6"
id="path92" />
<g
fill="#ffffff"
id="g95"
transform="translate(-265.83984,-221.91483)">
<use
x="527.19562"
xlink:href="#r"
y="519.33508"
id="use92" />
<use
x="541.35559"
xlink:href="#p"
y="519.33508"
id="use93" />
<use
x="555.51562"
xlink:href="#m"
y="519.33508"
id="use94" />
<use
x="569.6756"
xlink:href="#o"
y="519.33508"
id="use95" />
</g>
<path
d="m 225.94141,434.51485 v 10.73438"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path95" />
<path
d="m 219.33985,443.74923 6.60156,13.19922 6.59766,-13.19922 z m 0,0"
fill="#64707b"
id="path96" />
<path
d="m 518.53906,445.77657 v 10.73829"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path97" />
<path
d="m 525.14063,447.27658 -6.60156,-13.19922 -6.59766,13.19922 z m 0,0"
fill="#64707b"
id="path98" />
<path
d="m 518.53906,257.94454 v 95.57032"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path99" />
<path
d="m 525.14063,259.44454 -6.60156,-13.19921 -6.59766,13.19921 z m 0,0"
fill="#64707b"
id="path100" />
<path
d="m 404.22656,267.01095 h 62.80469 c 9.52344,0 15.23438,0 19.04297,1.32031 6.07422,2.21094 10.85938,6.9961 13.07031,13.07031 0.8711,2.39454 1.31641,4.92579 1.31641,7.47657 0,2.55078 -0.44531,5.08203 -1.31641,7.48047 -2.21093,6.07421 -6.99609,10.85937 -13.07031,13.07031 -3.80859,1.3164 -9.51953,1.3164 -19.04297,1.3164 h -62.80469 c -9.52343,0 -15.23437,0 -19.04297,-1.3164 -6.07421,-2.21094 -10.85937,-6.9961 -13.07031,-13.07031 -0.87109,-2.39844 -1.31641,-4.92969 -1.31641,-7.48047 0,-2.55078 0.44532,-5.08203 1.31641,-7.47657 2.21094,-6.07421 6.9961,-10.85937 13.07031,-13.07031 3.8086,-1.32031 9.51954,-1.32031 19.04297,-1.32031 z m 0,0"
fill="#64707b"
stroke="#929292"
stroke-width="0.6"
id="path101" />
<g
fill="#ffffff"
id="g107"
transform="translate(-265.83984,-221.91483)">
<use
x="651.784"
xlink:href="#s"
y="519.33508"
id="use101" />
<use
x="665.94397"
xlink:href="#q"
y="519.33508"
id="use102" />
<use
x="680.104"
xlink:href="#t"
y="519.33508"
id="use103" />
<use
x="694.26398"
xlink:href="#u"
y="519.33508"
id="use104" />
<use
x="708.42401"
xlink:href="#p"
y="519.33508"
id="use105" />
<use
x="722.58398"
xlink:href="#r"
y="519.33508"
id="use106" />
<use
x="736.74402"
xlink:href="#r"
y="519.33508"
id="use107" />
</g>
<path
d="m 586.14453,247.31954 v 95.56641"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path107" />
<path
d="m 579.54688,341.38595 6.59765,13.19922 6.60157,-13.19922 z m 0,0"
fill="#64707b"
id="path108" />
<path
d="m 639.875,268.08517 h 20.60547 c 9.51953,0 15.23437,0 19.03906,1.3164 6.07422,2.21094 10.85938,6.9961 13.07031,13.07032 0.875,2.39843 1.32032,4.92968 1.32032,7.48046 0,2.55079 -0.44532,5.08204 -1.32032,7.48047 -2.21093,6.07422 -6.99609,10.85938 -13.07031,13.07032 -3.80469,1.3164 -9.51953,1.3164 -19.03906,1.3164 H 639.875 c -9.52344,0 -15.23437,0 -19.04297,-1.3164 -6.07422,-2.21094 -10.85937,-6.9961 -13.07031,-13.07032 -0.87109,-2.39843 -1.31641,-4.92968 -1.31641,-7.48047 0,-2.55078 0.44532,-5.08203 1.31641,-7.48046 2.21094,-6.07422 6.99609,-10.85938 13.07031,-13.07032 3.8086,-1.3164 9.51953,-1.3164 19.04297,-1.3164 z m 0,0"
fill="#64707b"
stroke="#929292"
stroke-width="0.6"
id="path109" />
<g
fill="#ffffff"
id="g112"
transform="translate(-265.83984,-221.91483)">
<use
x="887.40033"
xlink:href="#r"
y="520.40808"
id="use109" />
<use
x="901.5603"
xlink:href="#p"
y="520.40808"
id="use110" />
<use
x="915.72028"
xlink:href="#m"
y="520.40808"
id="use111" />
<use
x="929.88031"
xlink:href="#o"
y="520.40808"
id="use112" />
</g>
<path
d="m 586.14453,435.58517 v 10.73437"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path112" />
<path
d="m 579.54688,444.81954 6.59765,13.20313 6.60157,-13.20313 z m 0,0"
fill="#64707b"
id="path113" />
<path
d="m 875.50781,446.21407 v 10.73438"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path114" />
<path
d="m 882.10936,447.71408 -6.6015,-13.19922 -6.5977,13.19922 z m 0,0"
fill="#64707b"
id="path115" />
<path
d="m 875.50781,258.38204 v 95.56641"
fill="none"
stroke="#64707b"
stroke-width="3"
id="path116" />
<path
d="m 882.10936,259.88204 -6.6015,-13.20312 -6.5977,13.20312 z m 0,0"
fill="#64707b"
id="path117" />
<path
d="m 761.19146,267.44454 h 62.8085 c 9.5196,0 15.2344,0 19.043,1.32032 6.0742,2.21093 10.8555,6.99609 13.0664,13.07031 0.875,2.39844 1.3203,4.92969 1.3203,7.48047 0,2.55078 -0.4453,5.08203 -1.3203,7.47656 -2.2109,6.07422 -6.9922,10.85938 -13.0664,13.07031 -3.8086,1.32032 -9.5234,1.32032 -19.043,1.32032 h -62.8085 c -9.5196,0 -15.2305,0 -19.0391,-1.32032 -6.0742,-2.21093 -10.85939,-6.99609 -13.07033,-13.07031 -0.87109,-2.39453 -1.3164,-4.92578 -1.3164,-7.47656 0,-2.55078 0.44531,-5.08203 1.3164,-7.48047 2.21094,-6.07422 6.99613,-10.85938 13.07033,-13.07031 3.8086,-1.32032 9.5195,-1.32032 19.0391,-1.32032 z m 0,0"
fill="#64707b"
id="path118" />
<path
d="M 761.19531,267.44454 H 824 c 9.51954,0 15.23438,0 19.04297,1.32032 6.07422,2.21093 10.85938,6.99609 13.07031,13.07031 0.8711,2.39844 1.31641,4.92969 1.31641,7.48047 0,2.55078 -0.44531,5.08203 -1.31641,7.47656 -2.21093,6.07422 -6.99609,10.85937 -13.07031,13.07031 -3.80859,1.32031 -9.52343,1.32031 -19.04297,1.32031 h -62.80469 c -9.52343,0 -15.23437,0 -19.04297,-1.32031 -6.07421,-2.21094 -10.85937,-6.99609 -13.07031,-13.07031 -0.87109,-2.39453 -1.31641,-4.92578 -1.31641,-7.47656 0,-2.55078 0.44532,-5.08203 1.31641,-7.48047 2.21094,-6.07422 6.9961,-10.85938 13.07031,-13.07031 3.8086,-1.32032 9.51954,-1.32032 19.04297,-1.32032 z m 0,0"
fill="none"
stroke="#929292"
stroke-width="0.6"
id="path119" />
<g
fill="#ffffff"
id="g125"
transform="translate(-265.83984,-221.91483)">
<use
x="1008.753"
xlink:href="#s"
y="519.77032"
id="use119" />
<use
x="1022.913"
xlink:href="#q"
y="519.77032"
id="use120" />
<use
x="1037.073"
xlink:href="#t"
y="519.77032"
id="use121" />
<use
x="1051.233"
xlink:href="#u"
y="519.77032"
id="use122" />
<use
x="1065.3929"
xlink:href="#p"
y="519.77032"
id="use123" />
<use
x="1079.553"
xlink:href="#r"
y="519.77032"
id="use124" />
<use
x="1093.713"
xlink:href="#r"
y="519.77032"
id="use125" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 48 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -0,0 +1,11 @@
@defgroup net_unicoap_drivers Drivers
@ingroup net_unicoap
@brief Collection of transport drivers
@{
Drivers enable you to use different transports while still relying on the same high-level CoAP
API. Each driver implements framing and a messaging model optimized for the given transport.
Which transport you choose depends on the deployment. For most constrained deployments,
we recommend the @ref net_unicoap_drivers_udp or @ref net_unicoap_drivers_dtls.
@}

View File

@ -0,0 +1,30 @@
@defgroup net_unicoap_drivers_rfc7252_pdu RFC 7252 Framing
@ingroup net_unicoap_drivers
@brief Parse and serialize RFC 7252 PDUs
@{
Module. Specify `USEMODULE += unicoap_driver_rfc7252_pdu` in your application's Makefile.
This module allows you to use the RFC 7252 parser without having to import the
@ref net_unicoap_drivers_udp or @ref net_unicoap_drivers_dtls, i.e., without a network backend.
This is particularly handy if you want to experiment with `unicoap` or write tests that don't
need the ability to do network I/O.
## PDU Format
```
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver| T | TKL | Code | Message ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Token (if any, TKL bytes) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (if any) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 1 1 1 1 1 1 1| Payload (if any) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```
@see [RFC 7252, Message Format](https://datatracker.ietf.org/doc/html/rfc7252#section-3)
@}

View File

@ -0,0 +1,48 @@
@defgroup net_unicoap_drivers_dtls CoAP over DTLS Driver
@ingroup net_unicoap_drivers
@brief Use CoAP over DTLS, with optional reliability
@{
Module. Specify `USEMODULE += unicoap_driver_dtls` in your application's Makefile.
Include these headers required for managing DTLS credentials.
```c
#include "net/sock/dtls/creds.h"
#include "net/credman.h"
#include "net/dsm.h"
```
Then, in your application, call @ref sock_dtls_add_credential to add a DTLS credential.
<!--
FIXME: undefined references, upcoming PR
If you need
to access the DTLS socket, call @ref unicoap_transport_io_dtls_get_socket(). You must add
DTLS credentials yourself.
-->
<!--
FIXME: undefined references, upcoming PR
To change the UDP port `unicoap` is listening on, modify @ref CONFIG_UNICOAP_DTLS_PORT.
The CoAP over DTLS driver uses the same socket both for client and server functionality.
@see @ref UNICOAP_PROTO_DTLS
-->
@see @ref unicoap_rfc7252_message_type_t
This is the dependency graph of this driver:
```
unicoap_driver_dtls
├── unicoap_driver_rfc7252_common
│ ├── unicoap_driver_rfc7252_common_messaging
│ └── unicoap_driver_rfc7252_common_pdu
├── unicoap_sock_support
│ ├── sock_async
│ ├── sock_async_event
│ ├── sock_aux_local
│ └── sock_util
├── ... (operating system networking modules)
.
```
@}

View File

@ -0,0 +1,32 @@
@defgroup net_unicoap_drivers_udp CoAP over UDP Driver
@ingroup net_unicoap_drivers
@brief Use CoAP over the UDP transport protocol, with optional reliability
@{
Module. Specify `USEMODULE += unicoap_driver_udp` in your application's Makefile.
<!--
FIXME: undefined references, upcoming PR
To change the UDP port `unicoap` is listening on, modify @ref CONFIG_UNICOAP_UDP_PORT.
The CoAP over UDP driver uses the same socket both for client and server functionality.
@see @ref UNICOAP_PROTO_UDP
-->
@see @ref unicoap_rfc7252_message_type_t
This is the dependency graph of this driver:
```
unicoap_driver_udp
├── unicoap_driver_rfc7252_common
│ ├── unicoap_driver_rfc7252_common_messaging
│ └── unicoap_driver_rfc7252_common_pdu
├── unicoap_sock_support
│ ├── sock_async
│ ├── sock_async_event
│ ├── sock_aux_local
│ └── sock_util
└── ... (operating system networking module)
```
@}