From 7263d583fd4a1c1bd1611327812d6d41eb45b973 Mon Sep 17 00:00:00 2001 From: Andreas Huber <anh@fjd.de> Date: Thu, 3 Feb 2022 15:54:54 +0100 Subject: [PATCH] planning#210: Events und deren Payloads mit Beispielen dokumentiert. --- docs/changelog.md | 15 +- docs/getting-started/event-log.mdx | 301 -------- docs/getting-started/event-log/events.mdx | 266 ++++++++ docs/getting-started/event-log/overview.mdx | 28 + .../event-log/set-creation.mdx | 314 +++++++++ .../event-log/set-validation.mdx | 401 +++++++++++ docs/intro.mdx | 4 +- docs/receiving/process-and-acknowledge.mdx | 2 +- docs/receiving/verification.mdx | 489 +++++++++++++ docs/sending/accept-reject.mdx | 646 ++++++++++++++++++ docs/sending/query-status.mdx | 47 +- docs/status-and-error-codes.md | 33 +- sidebar.js | 13 +- src/views/FAQList.jsx | 2 +- static/images/events/accept-submission.svg | 184 +++++ static/images/events/reject-submission.svg | 538 +++++++++++++++ 16 files changed, 2942 insertions(+), 341 deletions(-) delete mode 100644 docs/getting-started/event-log.mdx create mode 100644 docs/getting-started/event-log/events.mdx create mode 100644 docs/getting-started/event-log/overview.mdx create mode 100644 docs/getting-started/event-log/set-creation.mdx create mode 100644 docs/getting-started/event-log/set-validation.mdx create mode 100644 docs/receiving/verification.mdx create mode 100644 docs/sending/accept-reject.mdx create mode 100644 static/images/events/accept-submission.svg create mode 100644 static/images/events/reject-submission.svg diff --git a/docs/changelog.md b/docs/changelog.md index 22b6932d8..d8527e56d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,16 +2,27 @@ Das Format dieser Datei basiert auf [Keep a Changelog](https://keepachangelog.com/de). +## 2022-02-03 +### Zustelldienst 1.2.0 +- Story: Der Zustelldienst schreibt nun zusätzliche Infos in die Events `submit-submission` und `notify-submission`. + Die Events enthalten jetzt eine Referenz (`$schema`) auf das zugehörige Schema. + ([Story](https://git.fitko.de/fit-connect/planning/-/issues/210)) + +### Dokumentation +- Die [Beschreibung des Ereignisprotokolls](getting-started/event-log/overview.mdx) wurde in mehrere Seiten aufgeteilt. +- Die [Liste der Ereignisse](getting-started/event-log/events.mdx) wurde um die Beschreibung der Payloads erweitert. +- Umgang mit [Empfangsbestätigung oder Zurückweisung](sending/accept-reject.mdx) ergänzt. +- [Einreichung überprüfen](receiving/verification.mdx) ergänzt. + ## 2022-01-19 ### Dokumenation - [Aufbau der Zustellpunkt-Informationen](responsibilities/get-destination.mdx#destination-object) überarbeitet ## 2022-01-17 ### Dokumentation -- [Kontaktmöglichkeiten](https://docs.fitko.de/fit-connect/contact) überarbeitet +- [Kontaktmöglichkeiten](/contact) überarbeitet ## 2022-01-11 - ### Dokumentation - [Abschnitt zur Pflege der FIT-Connect „destinationSignatur“ in FIM-Redaktionssytemen](responsibilities/routing.mdx) ergänzt diff --git a/docs/getting-started/event-log.mdx b/docs/getting-started/event-log.mdx deleted file mode 100644 index a79f56da2..000000000 --- a/docs/getting-started/event-log.mdx +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Ereignisprotokoll ---- - -import ApiLink from '@site/src/components/ApiLink' - -Im Ereignisprotokoll (Event Log) werden relevante Ereignisse (events) aufgezeichnet. -Beim Abruf des Ereignisprotokolls liefert die API ein Array von JSON Web Token (JWT) gemäß [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519). -Der JWT ist einen Security-Event-Token (SET) gemäß [RFC 8417](https://datatracker.ietf.org/doc/html/rfc8417). -Wie mit den Security-Event-Token (SET) umgegangen wird, wird in diesem Abschnitt beschrieben. - -## Hintergrund - -Für die Übermittlung von Einreichungen zwischen Sendern und Empfängern soll gewährleistet werden, dass alle Schritte nachweissicher dokumentiert werden, um im Streitfall den Ablauf eines erfolgten Übermittlungsvorgang zweifelsfrei zu dokumentieren. -Zudem sollen diese Nachweise außerhalb der Submission API und der damit verbundenen Systeme genutzt werden können, damit diese Dritten einfach zur Verfügung gestellt werden können. -SETs erfüllen diese Anforderungen durch folgende Merkmale: - -- Für jedes SET wird ein eindeutiger Herausgeber definiert (`iss`) -- Jedes SET kann eindeutig einem konkreten fachlichen Kontext zugeordnet werden (`sub`) - - Mehrere SETs aus unterschiedliche fachlichen Kontexten können zu einem gemeinsamen Vorgang zusammengeführt werden (`txn`) -- SETs können für unterschiedliche Ereignisse ausgeprägt werden und innerhalb dieser Ereignisse können Detailinformationen ergänzt werden, die diese Ereignisse näher beschreiben - - Über ein Zeitstempel (`iat`) können diese Ereignisse zudem konkreten Zeitpunkt zugeordnet werden -- Durch eine Signatur im JWS Format wird sichergestellt, dass alle SETs ihre Integrität erhalten und eindeutig dem Schlüsselinhaber als Ersteller zugeordnet werden können. - -Die Nutzung ist aber nicht auf die Klärung von Streitigkeiten zu technischen Übermittlungen beschränkt. SETs können aufgrund dieser Merkmale unter anderem auch für folgende Zwecke genutzt werden: -- Als Auditinstrument, dass bei Prüfungen oder Sicherheitsvorfällen durch Dritte (bspw. Datenschutz- oder Sicherheitsbeauftragte) genutzt wird, -- oder als Nachweis für den Start von Fristen in Verwaltungsverfahren, die in der Regel dann beginnen, wenn eine zuständige Stelle Kenntnis von einer Einreichung hat oder wenn diese Einreichung in den Hoheitsbereich der empfangenden Stelle gelangt. - -In der Submission API werden SETs durch den Zustelldienst und das empfangende System erstellt. -Während die SETs des Zustelldienstes dazu dienen, die korrekte Übermittlung an den Zustelldienst und die Inkenntnissetzung von empfangende Systemen über neue Einreichungen dokumentieren, sollen SETs des empfangenden Systems die Bestätigung oder Ablehnung der technische Verarbeitbarkeit einer Einreichung nachweisen. - -## Events - -Das folgende Statusdiagramm zeigt die Status und Ereignisse einer Einreichung. Die Status sind als orange Ovale dargestellt. -Rechtecke stehen für Ereignisse. Blau dargestellte Ereignisse werden vom Zustelldienst, grüne vom empfangenden System erstellt und signiert. - - - -Das Akzeptieren oder Zurückweisen von Einreichungen auf einer rein technischen Ebene und trifft keine Aussage über die fachliche Korrektheit der Einreichungen. -Gründe für technische Rückweisungen wären beispielsweise Probleme bei der Entschlüsselung oder Validierungsfehler der Datenstrukturen. -In der folgenden Tabelle sind die möglichen Ereignisse, ihre Beschreibungen und die Autoren aufgeführt und beschrieben. - -| Event | Autor | Bedeutung | -|-----------------------------------------------------------------|---------------------|-------------------------------| -| `https://schema.fitko.de/fit-connect/events/create-submission` | Zustelldienst | Die Einreichung wurde durch den Sender angelegt. | -| `https://schema.fitko.de/fit-connect/events/submit-submission` | Zustelldienst | Die Einreichung wurde durch den Sender abgesendet. | -| `https://schema.fitko.de/fit-connect/events/notify-submission` | Zustelldienst | Der Empfänger wurde per Webhook über die Einreichung informiert. | -| `https://schema.fitko.de/fit-connect/events/forward-submission` | Empfangendes System | Ein nachgelagertes System hat die Einreichung zur Weiterleitung übernommen. | -| `https://schema.fitko.de/fit-connect/events/reject-submission` | Empfangendes System | Die Einreichung wurde durch den Empfänger zurückgewiesen. | -| `https://schema.fitko.de/fit-connect/events/accept-submission` | Empfangendes System | Die Einreichung wurde durch den Empfänger akzeptiert. | -| `https://schema.fitko.de/fit-connect/events/delete-submission` | Zustelldienst | Die Einreichung wurde durch den Zustelldienst gelöscht. | - -## Prüfung eines Security-Event-Token (SET) {#set-validation} - -Um eine vollständige Prüfung eines Security-Event-Tokens durchzuführen, MUSS zwingend sowohl die Einhaltung der (kryptografischen) Vorgaben als auch die Signatur geprüft werden. -Die Prüfung der Signatur des SET ist abhängig vom ausstellenden System (Zustelldienst, Subscriber oder Sender). -Sowohl die Prüfung der kryptografischen Vorgaben, als auch die Prüfung der Signatur darf KEINESFALLS ausgelassen werden. - -### Prüfung der Einhaltung von kryptografischen Vorgaben und der Struktur - -Alle generierten Security-Event-Tokens MÜSSEN den Vorgaben aus [RFC 7519](https://tools.ietf.org/html/rfc7519) entsprechen und über folgende Header-Attribute verfügen: - -| Feld | Inhalt | Erläuterung | -|-------|-------------------------------------|---------------------------------------------------------------------------------------| -| `typ` | `secevent+jwt` | Wird gemäß [RFC 8417, Abschnitt 2.3](https://datatracker.ietf.org/doc/html/rfc8417#section-2.3) auf den festen Wert "`secevent+jwt`" gesetzt. | -| `alg` | `PS512` | Zur Signaturerstellung wird der Signaturalgorithmus RSASSA-PSS mit SHA-512 und MGF1 mit SHA-512 verwendet. Vorgabe gemäß [BSI TR-02102](https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102.html) in der Version 2021-01 (Stand 24. März 2021). | -| `kid` | Key-ID des zugehörigen Public Keys | Die Key-ID des Public Key, mit dem die Signatur des JWT geprüft werden kann. | - -In der Payload des signierten SET MÜSSEN die folgenden [standardisierten Felder](https://www.iana.org/assignments/jwt/jwt.xhtml) gesetzt sein: - -| Feld | Inhalt | Erläuterung | -|--------|------------------------------------------------|---------------------------------------------------------------| -| `iss` | Id des Token Issuers | Diese Angabe dient dazu, um herauszufinden, wer den Token ausgestellt hat. Für SETs, die vom Zustelldienst ausgestellt sind, wird die Host-Adresse (API-URL) verwendet. Bei SETs von empfangenden Systemen ist die `destinationId`, an der dieser die Submission schickt. | -| `iat` | Timestamp (UNIX-Format) | Zeitpunkt der Ausstellung des SET. | -| `jti` | UUID des Token | Die JWT ID ist eine eindeutige ID des SET bzw. JWT. Es wird eine zufällige UUID verwendet. | -| `sub` | URI, die den Gegenstand des SET identifiziert | Das Subject eines SET ist eine Kombination aus dem Schlüsselwort `submission` und der Id `submissionId` der Resource. | -| `events` | JSON-Objekt der Events in diesem Event-Token | Das Objekt "events" beschreibt eine oder mehrere Ereignisse zu einem logischen Sachverhalt bzw. Gesamtereignis, wie bspw. der Versendung einer Einreichung durch den Sender. Dieses Objekt beinhaltet immer zwingend eine URI, die das jeweilige Gesamtereignis eindeutig identifiziert. Das Objekt der URI des Gesamtereignisses ist aktuell leer, kann aber zukünftig weitere Details zu einem Gesamtereignis enthalten. | -| `txn` | URI, die den Vorgang identifiziert | Als "Transaction Identifier" wird die Vorgangsreferenz `caseId` angegeben. | - -:::note SET Beispiel - -```json title="SET Header" -{ - "typ": "secevent+jwt", - "alg": "PS512", - "kid": "dd0409e5-410e-4d98-85b6-f81a40b8d980", -} -``` - -```json title="SET Payload" -{ - "iss": "https://api.fitko.de/fit-connect/", - "iat": 1622796532, - "jti": "0BF6DBF6-CE7E-44A3-889F-82FE74C3E715", - "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", - "events": { - "https://schema.fitko.de/fit-connect/events/accept-submission": {} - }, - "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90" -} -``` - -::: - -Im folgenden Beispiel kann die allgemeine Struktur eines SET über folgenden Code validiert werden. - -```java -SignedJWT securityEventToken = SignedJWT.parse(eventToken); -JWTClaimsSet payload = securityEventToken.getJWTClaimsSet(); -UUID keyId = UUID.fromString(securityEventToken.getHeader().getKeyID()); - -validateTokenStructure(securityEventToken); - -verifyZustelldienstSignature(securityEventToken, keyId) -// bzw. -verifyClientSignature(securityEventToken, keyId); -``` - -```java -boolean validateTokenStructure(SignedJWT securityEventToken) { - try { - validateHeader(securityEventToken.getHeader()); - validatePayload(securityEventToken.getJWTClaimsSet()); - } catch (ParseException e) { - throw new RuntimeException("The payload of the SET could not get parsed properly."); - } -} - -private void validateHeader(JWSHeader header) { - validateTrueOrElseThrow(header.getAlgorithm() == JWSAlgorithm.PS512, "The provided alg in the SET header is not allowed."); - validateTrueOrElseThrow(header.getType().toString().equals("secevent+jwt"), "The provided typ in the SET header is not secevent+jwt"); - validateTrueOrElseThrow(header.getKeyID() != null, "The kid the SET was signed with is not set."); -} - -private void validatePayload(JWTClaimsSet payload) throws ParseException { - validateTrueOrElseThrow(payload.getClaim("iss") != null, "The claim iss is missing in the payload of th SET."); - validateTrueOrElseThrow(payload.getClaim("iat") != null, "The claim iat is missing in the payload of th SET."); - validateTrueOrElseThrow(payload.getClaim("jti") != null, "The claim jti is missing in the payload of th SET."); - validateTrueOrElseThrow(payload.getClaim("sub") != null, "The claim sub is missing in the payload of th SET."); - validateTrueOrElseThrow(payload.getClaim("txn") != null, "The claim txn is missing in the payload of the SET."); - validateTrueOrElseThrow(payload.getClaim("events") != null, "The claim events is missing in the payload of the SET."); - validateTrueOrElseThrow(payload.getJSONObjectClaim("events").keySet().size() == 1, "Only exactly one event is allowed."); - - String uuidPattern = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}"; - - String subject = payload.getStringClaim("sub"); - validateTrueOrElseThrow(subject.matches("(submission|case|reply):" + uuidPattern), "The provided subject does not match the allowed pattern."); - - String transactionId = payload.getStringClaim("txn"); - validateTrueOrElseThrow(transactionId.matches("case:" + uuidPattern), "The provided txn does not match the allowed pattern."); -} - -private void validateTrueOrElseThrow(boolean expression, String msg) { - if (!expression) { - throw new RuntimeException(msg); - } -} -``` - -### Signaturprüfung eines vom Zustelldienst ausgestellten SET - -Um die Signatur eines SET zu überprüfen, welches vom Zustelldienst ausgestellt wurde, ist es notwendig auf die verwendeten Schlüssel zugreifen zu können. -Der Zustelldienst stellt ein JSON Web Key Set (JWKS) öffentlich zugänglich über den Endpunkt <ApiLink api="submission-api" to="/.well-known/jwks.json" /> bereit. -Ein Beispiel für ein JWKS ist in folgendem Ausschnitt dargestellt: - -```json -{ - "keys": [ - { - "alg": "PS512", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "kid": "6508dbcd-ab3b-4edb-a42b-37bc69f38fed", - "kty": "RSA", - "n": "65rmDz943SDKYWt8KhmaU…ga16_y9bAdoQJZRpcRr3_v9Q" - }, - { - "alg": "PS512", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "kid": "14a70431-01e6-4d67-867d-d678a3686f4b", - "kty": "RSA", - "n": "wnqKgmQHSqJhvCfdUWWyi8q…yVv3TrQVvGtsjrJVjvJR-s_D7rWoBcJVM" - } - ] -} -``` - -Mit diesem JWK Set kann die Signatur eines Security-Event-Tokens überprüft werden. -Hierfür muss der Schlüssel mit der passenden `kid` aus dem Header des SET’s im JWK Set gesucht werden. -Dann kann man mit diesem und einer entsprechenden Bibliothek eine Signaturprüfung durchführen. -Im folgenden Beispiel wird die Bibliothek [nimbus-jose-jwt](https://connect2id.com/products/nimbus-jose-jwt) für die Prüfung genutzt. - -```java -static final SUBMISSION_API = "https://submission-api-testing.fit-connect.fitko.dev"; - -boolean verifyZustelldienstSignature(SignedJWT securityEventToken, String keyId) { - JWKSet jwks = JWKSet.load(SUBMISSION_API + "/.well-known/jwks.json"); - JWK publicKey = jwks.getKeyByKeyId(keyId) - - if (publicKey.getAlgorithm() != JWSAlgorithm.PS512) { - throw new RuntimeException("The key specified for signature verification doesn't use/specify PS512 as algorithm.") - } - - JWSVerifier jwsVerifier = new RSASSAVerifier(publicKey.toRSAKey()); - return securityEventToken.verify(jwsVerifier); -} -``` - -### Signaturprüfung eines vom empfangenden System ausgestellten SET - -Um die Signatur eines von einem empfangenden System ausgestellen SET zu überprüfen ist es notwendig, auf den verwendeten Schlüssel zugreifen zu können. -Der bzw. die Schlüssel sind öffentlich verfügbar und können über die Submission API abgerufen werden. - -#### Ausgangslage: Das SET -Als Ausgangslage dient das folgende SET. -Aus dem Header wird die Schlüssel-ID aus dem Feld `kid` benötigt. -Aus dem Payload benötigen wir das Feld `submissionId`. -Konkret sind das hier: - -- kid: `dd0409e5-410e-4d98-85b6-f81a40b8d980` -- submissionId: `F65FEAB2-4883-4DFF-85FB-169448545D9F` - -```json title="SET Header" -{ - "typ": "secevent+jwt", - "alg": "PS512", - "kid": "dd0409e5-410e-4d98-85b6-f81a40b8d980", -} -``` - -```json title="SET Payload" -{ - "iss": "https://api.fitko.de/fit-connect/", - "iat": 1622796532, - "jti": "0BF6DBF6-CE7E-44A3-889F-82FE74C3E715", - "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", - "events": { - "https://schema.fitko.de/fit-connect/events/accept-submission": {} - }, - "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90" -} -``` - -#### Abruf des JWK zur Gültigkeitsprüfung des SET - -Mit der `submissionId` kann über den Endpunkt <ApiLink api="submission-api" to="/v1/submissions/{submissionId}" /> die zugehörige `destinationId` ermittelt werden. -Hier ist das konkret der Wert `92f2f581-c89d-44a5-b834-1fe3f6fa48d5`. - -```http title="Abfrage der destinationId einer Submission" -GET /v1/submissions/F65FEAB2-4883-4DFF-85FB-169448545D9F -{ - "destinationId": "92f2f581-c89d-44a5-b834-1fe3f6fa48d5", - // ... -} -``` - -Mit den zwei Informationen `kid` und `destinationid` kann nun der JWK zur Signaturprüfung abgerufen werden: - -```shell title="Beispiel: Abruf des JWK eines Zustellpunktes" -$ KID=... -$ SUBMISSION_API=https://submission-api-testing.fit-connect.fitko.dev -$ DESTINATION_ID=... -$ curl -X GET \ - "$SUBMISSION_API/v1/destinations/$DESTINATION_ID/keys/$KID" ---- -{ - "kty": "RSA", - "e": "AQAB", - "keyops": ["verify"], - "x5c": [ - "LS0tLS1CRUdJTiBDRVJU...jN1NGKzQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" - ], - "x5t": "MTg6NTU6RUY6ME...MEM6QzM6ODQ6QjA6MkE6RkMK", - "kid": "787f3a1c-7da7-44d7-9b79-9783b1ea9be8", - "alg": "RSA-OAEP-256", - "n": "sX2DX7rG5BoJd23...FlxHZt8T6ZqjRa1QcFnkq3_M4-tk" -} -``` - -#### Validierung des SET mit Hilfe des JWK - -Die Verifikation des SET mit dem eben abgerufenen JWK ist dann ziemlich geradlinig. -Es wird zunächst geprüft ob der Schlüssel den passenden Algorithmus hat. Anschließend wird die eigentliche Verifikation durch die Bibliothek durchgeführt. - -```java -boolean verifyClientSignature(SignedJWT securityEventToken, String keyId) { - JWK publicKey = getKeyForSET(securityEventToken, keyId); - - if (publicKey.getAlgorithm() != JWSAlgorithm.PS512) { - throw new RuntimeException("The key specified for signature verification doesn't use/specify PS512 as algorithm.") - } - - JWSVerifier jwsVerifier = new RSASSAVerifier(publicKey.toRSAKey()); - return securityEventToken.verify(jwsVerifier); -} -``` diff --git a/docs/getting-started/event-log/events.mdx b/docs/getting-started/event-log/events.mdx new file mode 100644 index 000000000..014d18191 --- /dev/null +++ b/docs/getting-started/event-log/events.mdx @@ -0,0 +1,266 @@ +--- +title: Ereignisse +--- + +import ApiLink from '@site/src/components/ApiLink' + +Das folgende Statusdiagramm zeigt die Status und Ereignisse einer Einreichung. Die Status sind als orange Ovale dargestellt. +Rechtecke stehen für Ereignisse. Blau dargestellte Ereignisse werden vom Zustelldienst, grüne vom empfangenden System erstellt und signiert. + + + +Das Akzeptieren oder Zurückweisen von Einreichungen auf einer rein technischen Ebene und trifft keine Aussage über die fachliche Korrektheit der Einreichungen. +Gründe für technische Rückweisungen wären beispielsweise Probleme bei der Entschlüsselung oder Validierungsfehler der Datenstrukturen. +In der folgenden Tabelle sind die möglichen Ereignisse, ihre Beschreibungen und die Autoren aufgeführt und beschrieben. + +| Event | Autor | Bedeutung | +|------------------------------------------------------------------------------------------|---------------------|-------------------------------| +| `https://schema.fitko.de/fit-connect/events/create-submission` [↓](#create-submission) | Zustelldienst | Die Einreichung wurde durch den Sender angelegt. | +| `https://schema.fitko.de/fit-connect/events/submit-submission` [↓](#submit-submission) | Zustelldienst | Die Einreichung wurde durch den Sender abgesendet. | +| `https://schema.fitko.de/fit-connect/events/notify-submission` [↓](#notify-submission) | Zustelldienst | Der Empfänger wurde per Webhook über die Einreichung informiert. | +| `https://schema.fitko.de/fit-connect/events/forward-submission` [↓](#forward-submission) | Empfangendes System | Ein nachgelagertes System hat die Einreichung zur Weiterleitung übernommen. | +| `https://schema.fitko.de/fit-connect/events/reject-submission` [↓](#reject-submission) | Empfangendes System | Die Einreichung wurde durch den Empfänger zurückgewiesen. | +| `https://schema.fitko.de/fit-connect/events/accept-submission` [↓](#accept-submission) | Empfangendes System | Die Einreichung wurde durch den Empfänger akzeptiert. | +| `https://schema.fitko.de/fit-connect/events/delete-submission` [↓](#delete-submission) | Zustelldienst | Die Einreichung wurde durch den Zustelldienst gelöscht. | + +## create-submission {#create-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/create-submission` dokumentiert der Zustelldienst, +dass eine Einreichung angelegt wurde. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "ada1b5b4-1bd2-4fab-b236-c30ef88e8c72", + "iss": "https://submission-api-dev.fit-connect.fitko.dev", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/create-submission": { + } + } +} +``` + +## submit-submission {#submit-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/submit-submission` dokumentiert der Zustelldienst, +dass die Einreichung abgesendet wurde. + +Das Event enthält das Objekt `authenticationTags`, das die Authentication Tags der verschlüsselten Inhalte enthält. +- `metadata`: Authentication Tag des Metadatensatzes +- `data`: Authentication Tag des Fachdatensatzes +- `attachments`: Objekt mit den Authentication Tags der Anlagen mit ihren `attachmentId`s als Schlüssel + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "25d2eb77-458d-4c9d-991c-6428c4651646", + "iss": "https://submission-api-dev.fit-connect.fitko.dev", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/submit-submission": { + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } + } + } +} +``` + +## notify-submission {#notify-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/notify-submission` dokumentiert der Zustelldienst, +dass das empfangende System Kenntnis von der Einreichung erlangt hat. +Wie dies erfolgt ist, wird mit dem Eintrag `notifyType` dokumentiert. + +1. `"notifyType": "callback"` - Der Subscriber wurde per Callback informiert. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "116c3c03-5f31-4d4c-9e65-d36e1e3895f7", + "iss": "https://submission-api-dev.fit-connect.fitko.dev", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/notify-submission": { + "notifyType": "callback" + } + } +} +``` + +2. `"notifyType": "polling"` - Der Subscriber hat die Liste der Submission über <ApiLink api="submission-api" to="/v1/submissions " withMethod="get"/> abgerufen. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "6127ff87-2786-4d0f-90fe-c531672f5de1", + "iss": "https://submission-api-dev.fit-connect.fitko.dev", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/notify-submission": { + "notifyType": "polling" + } + } +} +``` + +## forward-submission {#forward-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/forward-submission` dokumentiert ein nachgelagertes System, +dass es die Einreichung zur Weiterleitung übernommen hat. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "c0cda2aa-bf79-4427-86f3-9f973bad2ecd", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/forward-submission": { + } + } +} +``` + +## reject-submission {#reject-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/reject-submission` dokumentiert das empfangende System, +dass die Einreichung zurückgewiesen wird. + +Das Event enthält ein Array `problems`, dass die Fehler der Einreichung dokumentiert. +Der Aufbau ist an [RFC 7807](https://datatracker.ietf.org/doc/html/rfc7807) angelehnt, +lässt jedoch den Status aus, weil hier kein passender HTTP Status Code angegeben werden kann. + +- `type`: Fehlercode in Form einer URI. +- `title`: Für Menschen verständliche Fehlermeldung +- `detail`: Details zum Fehler, z.B. eine technische Fehlermeldung (optional) +- `instance`: Betroffener Teil der Übertragung. + Mögliche Werte: `submission`, `metadata`, `data`, `attachment:` + UUID des Attachments oder `other` + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "4ac47caa-bce1-435a-b04f-3322b224b32e", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/reject-submission": { + "problems": [ + { + "type": "https://schema.fitko.de/fit-connect/events/problems/authentication-tag-incorrect", + "title": "Das Authentication Tag des Metadatensatzes ist ungültig", + "detail": "Das Authentication Tag des Metadatensatzes stimmt nicht mit dem im Submit-Submission-Event angegebenen Wert überein.", + "instance": "metadata" + } + ] + } + } +} +``` + +## accept-submission {#accept-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/accept-submission` dokumentiert das empfangende System, +dass die Einreichung akzeptiert wurde. + +Das Event muss eine mit dem [`submit-submission`](#submit-submission) Event übereinstimmende Liste von Authentication Tags enthalten. +Das empfangende System dokumentiert damit, dass es die Authentication Tags überprüft hat. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "8538165b-9ce3-4097-871d-5b9581a3b4d9", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", + "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90", + "events": { + "https://schema.fitko.de/fit-connect/events/accept-submission": { + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } + } + } +} +``` + +Sofern Probleme in der Einreichung gefunden wurden, +die jedoch nicht zu einer Zurückweisung geführt haben, +werden diese analog zu der `problems` Liste in [`reject-submission`](#reject-submission) dokumentiert. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "6872b19f-5ee2-47d7-a0e9-ebfe87ab2563", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", + "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90", + "events": { + "https://schema.fitko.de/fit-connect/events/accept-submission": { + "problems": [ + { + "type": "https://schema.fitko.de/fit-connect/events/problems/schema-missing", + "title": "Schemareferenz fehlt im Metadatensatz", + "detail": "Die Referenz auf das Metadatenschema ('$schema') fehlt im Metadatensatz.", + "instance": "metadata" + } + ], + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } + } + } +} +``` + +## delete-submission {#delete-submission} + +Mit dem Event `https://schema.fitko.de/fit-connect/events/delete-submission` dokumentiert der Zustelldienst, +dass die Einreichung gelöscht wurde. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "29d091aa-86ab-4806-beb5-fb462d18e2a1", + "iss": "https://submission-api-dev.fit-connect.fitko.dev", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/delete-submission": { + } + } +} +``` diff --git a/docs/getting-started/event-log/overview.mdx b/docs/getting-started/event-log/overview.mdx new file mode 100644 index 000000000..86d6f33d3 --- /dev/null +++ b/docs/getting-started/event-log/overview.mdx @@ -0,0 +1,28 @@ +--- +title: Überblick +--- + +Im Ereignisprotokoll (Event Log) werden relevante Ereignisse (events) aufgezeichnet. +Beim Abruf des Ereignisprotokolls liefert die API ein Array von JSON Web Token (JWT) gemäß [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519). +Der JWT ist einen Security-Event-Token (SET) gemäß [RFC 8417](https://datatracker.ietf.org/doc/html/rfc8417). +Wie mit den Security-Event-Token (SET) umgegangen wird, wird in diesem Abschnitt beschrieben. + +## Hintergrund + +Für die Übermittlung von Einreichungen zwischen Sendern und Empfängern soll gewährleistet werden, dass alle Schritte nachweissicher dokumentiert werden, um im Streitfall den Ablauf eines erfolgten Übermittlungsvorgang zweifelsfrei zu dokumentieren. +Zudem sollen diese Nachweise außerhalb der Submission API und der damit verbundenen Systeme genutzt werden können, damit diese Dritten einfach zur Verfügung gestellt werden können. +SETs erfüllen diese Anforderungen durch folgende Merkmale: + +- Für jedes SET wird ein eindeutiger Herausgeber definiert (`iss`) +- Jedes SET kann eindeutig einem konkreten fachlichen Kontext zugeordnet werden (`sub`) + - Mehrere SETs aus unterschiedliche fachlichen Kontexten können zu einem gemeinsamen Vorgang zusammengeführt werden (`txn`) +- SETs können für unterschiedliche Ereignisse ausgeprägt werden und innerhalb dieser Ereignisse können Detailinformationen ergänzt werden, die diese Ereignisse näher beschreiben + - Über ein Zeitstempel (`iat`) können diese Ereignisse zudem konkreten Zeitpunkt zugeordnet werden +- Durch eine Signatur im JWS Format wird sichergestellt, dass alle SETs ihre Integrität erhalten und eindeutig dem Schlüsselinhaber als Ersteller zugeordnet werden können. + +Die Nutzung ist aber nicht auf die Klärung von Streitigkeiten zu technischen Übermittlungen beschränkt. SETs können aufgrund dieser Merkmale unter anderem auch für folgende Zwecke genutzt werden: +- Als Auditinstrument, dass bei Prüfungen oder Sicherheitsvorfällen durch Dritte (bspw. Datenschutz- oder Sicherheitsbeauftragte) genutzt wird, +- oder als Nachweis für den Start von Fristen in Verwaltungsverfahren, die in der Regel dann beginnen, wenn eine zuständige Stelle Kenntnis von einer Einreichung hat oder wenn diese Einreichung in den Hoheitsbereich der empfangenden Stelle gelangt. + +In der Submission API werden SETs durch den Zustelldienst und das empfangende System erstellt. +Während die SETs des Zustelldienstes dazu dienen, die korrekte Übermittlung an den Zustelldienst und die Inkenntnissetzung von empfangende Systemen über neue Einreichungen dokumentieren, sollen SETs des empfangenden Systems die Bestätigung oder Ablehnung der technische Verarbeitbarkeit einer Einreichung nachweisen. diff --git a/docs/getting-started/event-log/set-creation.mdx b/docs/getting-started/event-log/set-creation.mdx new file mode 100644 index 000000000..ecd284e74 --- /dev/null +++ b/docs/getting-started/event-log/set-creation.mdx @@ -0,0 +1,314 @@ +--- +title: Erzeugen eines Security-Event-Token (SET) +--- + +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +# Event + +Je nach Event ist ein Payload für das Event vorgesehen. +Auf der Seite [Ereignisse](./events.mdx) finden Sie eine Liste der Ereignisse und deren Struktur. + +Derzeit ist es weiterhin möglich, Events ohne Payload zu senden. +In diesem Fall darf kein Schema (`$schema`) angegeben werden. + +## Event Payload + +### Authentication Tags + +Die Struktur der "Authentication Tags" sieht wie folgt aus. + +```json +{ + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } +} +``` + +Diese können Sie zum Beispiel wie folgt aufbauen. + +<Tabs +defaultValue="java" +values={[ +{ label: 'Java', value: 'java', }, +{ label: 'C#', value: 'csharp', }, +{ label: 'JavaScript', value: 'js', }, +] +}> + +<TabItem value="java"> + +```java + public Map<String, Object> toEventPayloadMap() { + final HashMap<String, Object> authenticationTags = new HashMap<>(3); + authenticationTags.put("metadata", metadata); + if (data != null) { + authenticationTags.put("data", data); + } + if (!attachments.isEmpty()) { + authenticationTags.put("attachments", Collections.unmodifiableMap(attachments)); + } + return Map.of( + "authenticationTags", + authenticationTags + ); + } +``` + +</TabItem> + +<TabItem value="csharp"> + +```csharp +// TBD +``` + +</TabItem> + +<TabItem value="js"> + +```js +// TBD +``` + +</TabItem> + +</Tabs> + +### Problems + +Die Struktur der "Problems" sieht wie folgt aus. + +```json +{ + "problems": [ + { + "type": "https://schema.fitko.de/fit-connect/events/problems/authentication-tag-incorrect", + "title": "Das Authentication Tag des Metadatensatzes ist ungültig", + "detail": "Das Authentication Tag des Metadatensatzes stimmt nicht mit dem im Submit-Submission-Event angegebenen Wert überein.", + "instance": "metadata" + } + ] +} +``` + +Diese können Sie zum Beispiel wie folgt aufbauen. + +<Tabs +defaultValue="java" +values={[ +{ label: 'Java', value: 'java', }, +{ label: 'C#', value: 'csharp', }, +{ label: 'JavaScript', value: 'js', }, +] +}> + +<TabItem value="java"> + +```java + public Map<String, Object> toEventPayloadMap() { + final ArrayList<Map<String, Object>> problemList = new ArrayList<>(); + for (Problem problem : problems) { + final HashMap<String, Object> problemMap = new HashMap<>(problem.getParameters()); + final URI type = problem.getType(); + if (type != null) { + problemMap.put("type", type); + } + final String title = problem.getTitle(); + if (title != null) { + problemMap.put("title", title); + } + final StatusType status = problem.getStatus(); + if (status != null) { + problemMap.put("status", status); + } + final String detail = problem.getDetail(); + if (detail != null) { + problemMap.put("detail", detail); + } + final URI instance = problem.getInstance(); + if (instance != null) { + problemMap.put("instance", instance); + } + problemList.add(problemMap); + } + return Map.of("problems", problemList); + } +``` + + +</TabItem> + +<TabItem value="csharp"> + +```csharp +// TBD +``` + +</TabItem> + +<TabItem value="js"> + +```js +// TBD +``` + +</TabItem> + +</Tabs> + +## SET Claims + +Der SET Payload ist wie folgt aufgebaut. +Die Elemente der obersten Ebene sind bei allen SETs vorhanden. +Der Claim `events` enthält als Schlüssel das eigentliche Event, das ggf. einen Payload (hier: `authenticationTags`) enthält. + +:::info + +Derzeit ist die Version 0.1.0 des SET-Payload-Schemas aktuell. +Die in den Beispielen genannte Version 1.0.0 wird im Zuge des Rückkanals veröffentlicht. + +::: + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "8538165b-9ce3-4097-871d-5b9581a3b4d9", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", + "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90", + "events": { + "https://schema.fitko.de/fit-connect/events/accept-submission": { + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } + } + } +} +``` + +## SET Header + +Der Header eines SET enthält immer die gleichen drei Angaben. + +```json +{ + "typ", "secevent+jwt", + "kid", "{keyId}", + "alg", "PS512" +} +``` + +## SET erzeugen und signieren + +<Tabs +defaultValue="java" +values={[ +{ label: 'Java', value: 'java', }, +{ label: 'C#', value: 'csharp', }, +{ label: 'JavaScript', value: 'js', }, +] +}> + +<TabItem value="java"> + +Das Erzeugen eines SET besteht aus drei Schritten. + +```java + public static SignedJWT buildEvent(String issuer, UUID caseId, UUID submissionId, FitConnectEvent event, Map<String, Object> payload, JWK jwk) { + try { + final FitConnectSET set = new FitConnectSET("" + issuer, "submission:" + submissionId, "case:" + caseId); + set.addEvent(event, payload); + return set.sign(jwk); + } catch (ParseException | JOSEException ex) { + throw new FitConnectClientException(ex.getMessage(), ex); + } + } +``` + +### SET anlegen + +Im Konstruktor der Klasse `FitConnectSET` wird das `JWTClaimsSet` erzeugt. +Als Claim `events` wird eine später zu befüllende `Map` eingesetzt. + +```java + public FitConnectSET(String issuer, String subject, String transactionId) { + UUID jti = UUID.randomUUID(); + this.events = new HashMap<>(); + this.claimsSet = new JWTClaimsSet.Builder() + .claim(CLAIM_SCHEMA, FitConnect.SET_PAYLOAD_SCHEMA_TO_USE) + .issuer(issuer) + .issueTime(new Date()) + .jwtID(jti.toString()) + .subject(subject) + .claim("events", events) + .claim("txn", transactionId) + .build(); + } +``` + +### Event Payload hinzufügen + +Im zweiten Schritt wird das Event, ggf. mit Payload hinzugefügt. + +```java + public void addEvent(FitConnectEvent event, Map<String, Object> payload) { + if (signedJWT != null || event == null) { + throw new UnsupportedOperationException("Im aktuellen Zustand kann kein Event hinzugefügt werden."); + } + events.put(event.getFullName(), payload == null ? Collections.emptyMap() : payload); + } +``` + +### SET erstellen & signieren + +Im letzten Schritt wird das SET erstellt und signiert. + +```java + public SignedJWT sign(JWK key) throws JOSEException, ParseException { + JWSSigner signer = new RSASSASigner(key.toRSAKey()); + JWSHeader header = JWSHeader.parse(Map.of( + "typ", HEADER_TYPE, + "kid", key.getKeyID(), + "alg", "PS512" + )); + this.signedJWT = new SignedJWT(header, claimsSet); + signedJWT.sign(signer); + return signedJWT; + } +``` + +</TabItem> + +<TabItem value="csharp"> + +```csharp +// TBD +``` + +</TabItem> + +<TabItem value="js"> + +```js +// TBD +``` + +</TabItem> + +</Tabs> diff --git a/docs/getting-started/event-log/set-validation.mdx b/docs/getting-started/event-log/set-validation.mdx new file mode 100644 index 000000000..2ac3a58d7 --- /dev/null +++ b/docs/getting-started/event-log/set-validation.mdx @@ -0,0 +1,401 @@ +--- +title: Prüfung eines Security-Event-Token (SET) +--- + +import ApiLink from '@site/src/components/ApiLink' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +Um eine vollständige Prüfung eines Security-Event-Tokens durchzuführen, MUSS zwingend sowohl die Einhaltung der (kryptografischen) Vorgaben als auch die Signatur geprüft werden. +Die Prüfung der Signatur des SET ist abhängig vom ausstellenden System (Zustelldienst, Subscriber oder Sender). +Sowohl die Prüfung der kryptografischen Vorgaben, als auch die Prüfung der Signatur darf KEINESFALLS ausgelassen werden. + +## Prüfung der Einhaltung von kryptografischen Vorgaben und der Struktur + +Alle generierten Security-Event-Tokens MÜSSEN den Vorgaben aus [RFC 7519](https://tools.ietf.org/html/rfc7519) entsprechen und über folgende Header-Attribute verfügen: + +| Feld | Inhalt | Erläuterung | +|-------|-------------------------------------|---------------------------------------------------------------------------------------| +| `typ` | `secevent+jwt` | Wird gemäß [RFC 8417, Abschnitt 2.3](https://datatracker.ietf.org/doc/html/rfc8417#section-2.3) auf den festen Wert "`secevent+jwt`" gesetzt. | +| `alg` | `PS512` | Zur Signaturerstellung wird der Signaturalgorithmus RSASSA-PSS mit SHA-512 und MGF1 mit SHA-512 verwendet. Vorgabe gemäß [BSI TR-02102](https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102.html) in der Version 2021-01 (Stand 24. März 2021). | +| `kid` | Key-ID des zugehörigen Public Keys | Die Key-ID des Public Key, mit dem die Signatur des JWT geprüft werden kann. | + +In der Payload des signierten SET MÜSSEN die folgenden [standardisierten Felder](https://www.iana.org/assignments/jwt/jwt.xhtml) gesetzt sein: + +| Feld | Inhalt | Erläuterung | +|-----------|-----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `$schema` | Referenz auf das verwendete SET-Schema | Gibt das SET-Schema an, dem das SET entspricht. Das Schema kann von [schema.fitko.de](https://schema.fitko.de/fit-connect/set-payload/) bezogen werden. Mit dem Schema kann die Struktur des SET Payloads validiert werden. | +| `jti` | UUID des Token | Die JWT ID ist eine eindeutige ID des SET bzw. JWT. Es wird eine zufällige UUID verwendet. | +| `iss` | ID des Token Issuers | Diese Angabe dient dazu, um herauszufinden, wer den Token ausgestellt hat. Für SETs, die vom Zustelldienst ausgestellt sind, wird die Host-Adresse (API-URL) verwendet. Bei SETs von empfangenden Systemen ist die `destinationId`, an der dieser die Submission schickt. | +| `iat` | Timestamp (UNIX-Format) | Zeitpunkt der Ausstellung des SET. | +| `sub` | URI, die den Gegenstand des SET identifiziert | Das Subject eines SET ist eine Kombination aus dem Schlüsselwort `submission` und der Id `submissionId` der Resource. | +| `txn` | URI, die den Vorgang identifiziert | Als "Transaction Identifier" wird die Vorgangsreferenz `caseId` angegeben. | +| `events` | JSON-Objekt der Events in diesem Event-Token | Das Objekt `events` enthält genau ein Ereignis zu einem logischen Sachverhalt bzw. Gesamtereignis, wie bspw. der Versendung einer Einreichung durch den Sender. Dieses Objekt beinhaltet immer zwingend eine URI, die das jeweilige Gesamtereignis eindeutig identifiziert. Das Objekt der URI des Gesamtereignisses ist aktuell leer, kann aber zukünftig weitere Details zu einem Gesamtereignis enthalten. | + +:::note SET Beispiel + +```json title="SET Header" +{ + "typ": "secevent+jwt", + "alg": "PS512", + "kid": "dd0409e5-410e-4d98-85b6-f81a40b8d980", +} +``` + +```json title="SET Payload" +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "8538165b-9ce3-4097-871d-5b9581a3b4d9", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/accept-submission": { + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } + } + } +} +``` + +::: + +<Tabs +defaultValue="java" +values={[ +{ label: 'Java', value: 'java', }, +{ label: 'C#', value: 'csharp', }, +{ label: 'JavaScript', value: 'js', }, +] +}> + +<TabItem value="java"> + +Im folgenden Beispiel kann die allgemeine Struktur eines SET über folgenden Code validiert werden. +Die Prüfungen bauen auf der Methode `assertTrue` auf. +Diese kann im Fehlerfall die Fehler sammeln oder direkt eine Exception werfen. + +```java + public void validate(SignedJWT signedJWT, UUID caseId, FitConnectKeyLookup keyLookup) { + try { + final JWSHeader header = signedJWT.getHeader(); + validateHeader(header); + // + final JWTClaimsSet payload = signedJWT.getJWTClaimsSet(); + validatePayload(payload); + validateSubject(payload); + // + validateTxnClaim(signedJWT.getJWTClaimsSet(), caseId); + // + validateSignature(signedJWT, keyLookup); + } catch (Exception e) { + fail(e.getMessage()); + } + } +``` + +Der Header wird auf die drei verpflichtenden Angaben geprüft. + +```java + private void validateHeader(JWSHeader header) { + assertTrue(header.getAlgorithm() == JWSAlgorithm.PS512, "The provided alg in the SET header is not allowed."); + assertTrue(header.getType().toString().equals(FitConnectSET.HEADER_TYPE), "The provided typ in the SET header is not " + FitConnectSET.HEADER_TYPE); + assertTrue(header.getKeyID() != null, "The kid the SET was signed with is not set."); + } +``` + +Die Struktur des Payloads wird geprüft. + +```java + private void validatePayload(JWTClaimsSet payload) throws ParseException { + assertTrue(payload.getClaim("iss") != null, "The claim iss is missing in the payload of the SET."); + assertTrue(payload.getClaim("iat") != null, "The claim iat is missing in the payload of the SET."); + assertTrue(payload.getClaim("jti") != null, "The claim jti is missing in the payload of the SET."); + assertTrue(payload.getClaim("sub") != null, "The claim sub is missing in the payload of the SET."); + assertTrue(payload.getClaim("txn") != null, "The claim txn is missing in the payload of the SET."); + assertTrue(payload.getClaim("events") != null, "The claim events is missing in the payload of the SET."); + assertTrue(payload.getJSONObjectClaim("events").keySet().size() == 1, "Only exactly one event is allowed."); + // This matches exactly a UUIDv4 (https://stackoverflow.com/questions/136505/searching-for-uuids-in-text-with-regex) + String uuidPattern = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}"; + String subject = payload.getStringClaim("sub"); + assertTrue(subject.matches("(submission|case|reply):" + uuidPattern), "The provided subject does not match the allowed pattern."); + String transactionId = payload.getStringClaim("txn"); + assertTrue(transactionId.matches("case:" + uuidPattern), "The provided txn does not match the allowed pattern."); + Optional<String> events = payload.getJSONObjectClaim("events").keySet().stream().findFirst(); + events.ifPresentOrElse( + s -> assertTrue(FitConnectEvent.ofURL(s) != null, "The provided event is not a valid event supported by this instance."), + () -> fail("No events in JWT")); + } +``` + +Der Subject (`sub`) Claim wird noch mal separat geprüft. + +```java + private void validateSubject(JWTClaimsSet payload) throws ParseException { + String subject = payload.getStringClaim("sub"); + String tokenType = subject.substring(0, subject.indexOf(':')); + assertTrue(tokenType.equalsIgnoreCase("submission"), "The provided subject does not contain a submission. 'case' and 'reply' are not yet supported."); + } +``` + +Der Claim `txn` muss mit der übergebenen `caseId` übereinstimmen. + +```java + private void validateTxnClaim(JWTClaimsSet payload, UUID caseId) throws ParseException { + String txn = payload.getStringClaim("txn"); + String transactionId = txn.substring(txn.indexOf(':') + 1); + assertTrue(transactionId.equalsIgnoreCase(caseId.toString()), "The provided txn does not match with the case."); + } +``` + +Die Signatur wird validiert. +Das Laden des Verifikations-Schlüssels ist hier in in den `FitConnectKeyLookup` ausgelagert. +Details dazu im Folgenden. + +```java + private void validateSignature(SignedJWT signedJWT, FitConnectKeyLookup keyLookup) { + try { + final JWSHeader header = signedJWT.getHeader(); + final String keyID = header.getKeyID(); + final RSAKey rsaKey = keyLookup.getKey(keyID); + final JWSVerifier jwsVerifier = new RSASSAVerifier(rsaKey); + assertTrue(signedJWT.verify(jwsVerifier), "The signature of the token could not be verified with the specified key."); + } catch (ParseException | JOSEException e) { + fail("The SET could not get parsed properly."); + } + } +``` + +</TabItem> + +<TabItem value="csharp"> + +```csharp +// TBD +``` + +</TabItem> + +<TabItem value="js"> + +```js +// TBD +``` + +</TabItem> + +</Tabs> + +## Signaturprüfung eines vom Zustelldienst ausgestellten SET + +Um die Signatur eines SET zu überprüfen, welches vom Zustelldienst ausgestellt wurde, ist es notwendig auf die verwendeten Schlüssel zugreifen zu können. +Der Zustelldienst stellt ein JSON Web Key Set (JWKS) öffentlich zugänglich über den Endpunkt <ApiLink api="submission-api" to="/.well-known/jwks.json" /> bereit. +Ein Beispiel für ein JWKS ist in folgendem Ausschnitt dargestellt: + +```json +{ + "keys": [ + { + "alg": "PS512", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "kid": "6508dbcd-ab3b-4edb-a42b-37bc69f38fed", + "kty": "RSA", + "n": "65rmDz943SDKYWt8KhmaU…ga16_y9bAdoQJZRpcRr3_v9Q" + }, + { + "alg": "PS512", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "kid": "14a70431-01e6-4d67-867d-d678a3686f4b", + "kty": "RSA", + "n": "wnqKgmQHSqJhvCfdUWWyi8q…yVv3TrQVvGtsjrJVjvJR-s_D7rWoBcJVM" + } + ] +} +``` + +Mit diesem JWK Set kann die Signatur eines Security-Event-Tokens überprüft werden. +Hierfür muss der Schlüssel mit der passenden `kid` aus dem Header des SET’s im JWK Set gesucht werden. +Dann kann man mit diesem und einer entsprechenden Bibliothek eine Signaturprüfung durchführen. + +<Tabs +defaultValue="java" +values={[ +{ label: 'Java', value: 'java', }, +{ label: 'C#', value: 'csharp', }, +{ label: 'JavaScript', value: 'js', }, +] +}> + +<TabItem value="java"> + +Im folgenden Beispiel wird die Bibliothek [nimbus-jose-jwt](https://connect2id.com/products/nimbus-jose-jwt) für die Prüfung genutzt. + +```java +static final SUBMISSION_API = "https://submission-api-testing.fit-connect.fitko.dev"; + +boolean verifyZustelldienstSignature(SignedJWT securityEventToken, String keyId) { + JWKSet jwks = JWKSet.load(SUBMISSION_API + "/.well-known/jwks.json"); + JWK publicKey = jwks.getKeyByKeyId(keyId) + + if (publicKey.getAlgorithm() != JWSAlgorithm.PS512) { + throw new RuntimeException("The key specified for signature verification doesn't use/specify PS512 as algorithm.") + } + + JWSVerifier jwsVerifier = new RSASSAVerifier(publicKey.toRSAKey()); + return securityEventToken.verify(jwsVerifier); +} +``` + +</TabItem> + +<TabItem value="csharp"> + +```csharp +// TBD +``` + +</TabItem> + +<TabItem value="js"> + +```js +// TBD +``` + +</TabItem> + +</Tabs> + +## Signaturprüfung eines vom empfangenden System ausgestellten SET + +Um die Signatur eines von einem empfangenden System ausgestellen SET zu überprüfen ist es notwendig, auf den verwendeten Schlüssel zugreifen zu können. +Der bzw. die Schlüssel sind öffentlich verfügbar und können über die Submission API abgerufen werden. + +### Ausgangslage: Das SET +Als Ausgangslage dient das folgende SET. +Aus dem Header wird die Schlüssel-ID aus dem Feld `kid` benötigt. +Aus dem Payload benötigen wir das Feld `submissionId`. +Konkret sind das hier: + +- kid: `dd0409e5-410e-4d98-85b6-f81a40b8d980` +- submissionId: `F65FEAB2-4883-4DFF-85FB-169448545D9F` + +```json title="SET Header" +{ + "typ": "secevent+jwt", + "alg": "PS512", + "kid": "dd0409e5-410e-4d98-85b6-f81a40b8d980", +} +``` + +```json title="SET Payload" +{ + "iss": "https://api.fitko.de/fit-connect/", + "iat": 1622796532, + "jti": "0BF6DBF6-CE7E-44A3-889F-82FE74C3E715", + "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", + "events": { + "https://schema.fitko.de/fit-connect/events/accept-submission": {} + }, + "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90" +} +``` + +### Abruf des JWK zur Gültigkeitsprüfung des SET + +Mit der `submissionId` kann über den Endpunkt <ApiLink api="submission-api" to="/v1/submissions/{submissionId}" /> die zugehörige `destinationId` ermittelt werden. +Hier ist das konkret der Wert `92f2f581-c89d-44a5-b834-1fe3f6fa48d5`. + +```http title="Abfrage der destinationId einer Submission" +GET /v1/submissions/F65FEAB2-4883-4DFF-85FB-169448545D9F +{ + "destinationId": "92f2f581-c89d-44a5-b834-1fe3f6fa48d5", + // ... +} +``` + +Mit den zwei Informationen `kid` und `destinationid` kann nun der JWK zur Signaturprüfung abgerufen werden: + +```shell title="Beispiel: Abruf des JWK eines Zustellpunktes" +$ KID=... +$ SUBMISSION_API=https://submission-api-testing.fit-connect.fitko.dev +$ DESTINATION_ID=... +$ curl -X GET \ + "$SUBMISSION_API/v1/destinations/$DESTINATION_ID/keys/$KID" +--- +{ + "kty": "RSA", + "e": "AQAB", + "keyops": ["verify"], + "x5c": [ + "LS0tLS1CRUdJTiBDRVJU...jN1NGKzQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" + ], + "x5t": "MTg6NTU6RUY6ME...MEM6QzM6ODQ6QjA6MkE6RkMK", + "kid": "787f3a1c-7da7-44d7-9b79-9783b1ea9be8", + "alg": "RSA-OAEP-256", + "n": "sX2DX7rG5BoJd23...FlxHZt8T6ZqjRa1QcFnkq3_M4-tk" +} +``` + +### Validierung des SET mit Hilfe des JWK + +Die Verifikation des SET mit dem eben abgerufenen JWK ist dann ziemlich geradlinig. +Es wird zunächst geprüft ob der Schlüssel den passenden Algorithmus hat. Anschließend wird die eigentliche Verifikation durch die Bibliothek durchgeführt. + +<Tabs +defaultValue="java" +values={[ +{ label: 'Java', value: 'java', }, +{ label: 'C#', value: 'csharp', }, +{ label: 'JavaScript', value: 'js', }, +] +}> + +<TabItem value="java"> + +```java +boolean verifyClientSignature(SignedJWT securityEventToken, String keyId) { + JWK publicKey = getKeyForSET(securityEventToken, keyId); + + if (publicKey.getAlgorithm() != JWSAlgorithm.PS512) { + throw new RuntimeException("The key specified for signature verification doesn't use/specify PS512 as algorithm.") + } + + JWSVerifier jwsVerifier = new RSASSAVerifier(publicKey.toRSAKey()); + return securityEventToken.verify(jwsVerifier); +} +``` + +</TabItem> + +<TabItem value="csharp"> + +```csharp +// TBD +``` + +</TabItem> + +<TabItem value="js"> + +```js +// TBD +``` + +</TabItem> + +</Tabs> diff --git a/docs/intro.mdx b/docs/intro.mdx index a64776162..b6fba56de 100644 --- a/docs/intro.mdx +++ b/docs/intro.mdx @@ -55,14 +55,14 @@ Fragt nun ein sendendes System über die Routing API an, ermittelt der FIT-Conne ### Anwendungsfall 3: Übermittlung von Einreichungen (Anträge oder Berichtsmeldungen) Über den **FIT-Connect Zustelldienst** können sendende Systeme Einreichungen [an die zuvor ermittelte fachlich zuständige Behörde senden](./sending/overview.mdx). -Der Zustelldienst stellt hierfür die **Submission API** bereit. Sendende Systeme können sich über eine erfolgreiche Zustellung über ein [Ereignisprotokoll (Event Log)](./getting-started/event-log.mdx) informieren. +Der Zustelldienst stellt hierfür die **Submission API** bereit. Sendende Systeme können sich über eine erfolgreiche Zustellung über ein [Ereignisprotokoll (Event Log)](./getting-started/event-log/overview.mdx) informieren. Die Vertraulichkeit der Übermittlung ist dank der [obligatorischen Ende-zu-Ende-Verschlüsselung](./getting-started/encryption.mdx) für alle übermittelten Daten jederzeit gewährleistet. Die eingesetzte Ende-zu-Ende-Verschlüsselung stellt sicher, dass auch die Betreiber der FIT-Connect-Infrastruktur zu keinem Zeitpunkt Zugriff auf die Inhalte der übermittelten Einreichungen erlangen können. Mit FIT-Connect ist eine Realisierung einer Ende-zu-Ende-Verschlüsselung bis in den Browser oder das Endgerät der Antrag- oder Berichtssteller:in möglich. ### Anwendungsfall 4: Abruf von Einreichungen (Anträge oder Berichtsmeldungen) Empfangende Systeme werden durch den **FIT-Connect Zustelldienst** [über eingegangene Einreichungen informiert](./receiving/notification.mdx). Anschließend können empfangende Systeme diese Einreichungen über die **Submission API** [abrufen](./receiving/overview.mdx). -Nach dem Abruf ist der Versand einer Empfangsbestätigung über das [Ereignisprotokoll](./getting-started/event-log.mdx) möglich. So können empfangende Systeme den Eingang von Einreichungen nachweisbar bestätigen. +Nach dem Abruf ist der Versand einer Empfangsbestätigung über das [Ereignisprotokoll](./getting-started/event-log/events.mdx) möglich. So können empfangende Systeme den Eingang von Einreichungen nachweisbar bestätigen. ## Für wen ist die föderale Antragsdatenübermittlungsinfrastruktur FIT-Connect gedacht und warum sollte ich sie nutzen? diff --git a/docs/receiving/process-and-acknowledge.mdx b/docs/receiving/process-and-acknowledge.mdx index 7c62f4c95..8b54cdd37 100644 --- a/docs/receiving/process-and-acknowledge.mdx +++ b/docs/receiving/process-and-acknowledge.mdx @@ -9,7 +9,7 @@ import TabItem from '@theme/TabItem' Der letzte Schritt zum Empfang einer Einreichung ist die Bestätigung des Empfangs und damit auch der Gültigkeit der Einreichung. Mit Gültigkeit ist hier gemeint, dass alle Informationen erfolgreich heruntergeladen, entschlüsselt und im Falle der Metadaten validiert werden konnten. -Wie auf der [Event Log Übersichtsseite](../getting-started/event-log.mdx#events) zu sehen, gibt es für ein empfangendes System ein festes Set an Events, die dem Zustelldienst gesendet werden können. +Wie auf der [Event Log Übersichtsseite](../getting-started/event-log/events.mdx) zu sehen, gibt es für ein empfangendes System ein festes Set an Events, die dem Zustelldienst gesendet werden können. | Event | Autor | Bedeutung | |-----------------------------------------------------------------|---------------------|-------------------------------| diff --git a/docs/receiving/verification.mdx b/docs/receiving/verification.mdx new file mode 100644 index 000000000..70d4d68db --- /dev/null +++ b/docs/receiving/verification.mdx @@ -0,0 +1,489 @@ +--- +title: Einreichung überprüfen +--- + +import ApiLink from '@site/src/components/ApiLink' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +Nachdem das empfangende System eine Einreichung empfangen hat, muss es diese überprüfen. +Nach der Überprüfung muss entweder ein Empfangsbestätigung ("accept submission") oder Zurückweisung ("reject submission") +gesendet werden. + +Eine Rückweisung könnte wie folgt aussehen. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "4ac47caa-bce1-435a-b04f-3322b224b32e", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/reject-submission": { + "problems": [ + { + "type": "https://schema.fitko.de/fit-connect/events/problems/an-example", + "title": "Nur ein Beispiel", + "detail": "Es darf kein Beispiel verwendet werden.", + "instance": "metadata" + } + ] + } + } +} +``` + +Die grundsätzliche Struktur der Events ist auf der Seite [Ereignisse](../getting-started/event-log/events.mdx) beschreiben. +Das `reject-submission`-Event enthält eine Liste von Problemen. +Diese enthält im obigen Beispiel ein Beispiel-Problem. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/an-example", + "title": "Nur ein Beispiel", + "detail": "Es darf kein Beispiel verwendet werden.", + "instance": "metadata" +} +``` + +In der folgenden Liste der durchzuführenden Validierungen sind die zu verwendenden Werte für `type`, `title`, `detail` +und `instance` angegeben. + +Die Angaben `type` und `instance` MÜSSEN exakt übernommen werden. +Die Angabe unter `title` SOLLTE wie dokumentiert übernommen werden. +Die Angabe `detail` KANN ergänzt oder ersetzt werden, sofern zur Fehlerbehebung hilfreiche Informationen zur Verfügung +stehen. + +:::caution Hinweis + +Alle Informationen im Problem-Datensatz werden an das sendende System gesendet, das sie zur Fehlerbehebung speichert. +Die Fehlermeldungen dürfen den Nutzern des Systems (z.B. Bürgern, die einen Online-Antrag nutzen) nicht angezeigt werden! + +::: + +## Überprüfung der Einreichung + +### Überprüfung des Event-Logs + +Rufen Sie das Event-Log unter <ApiLink api="submission-api" withMethod="get" to="/v1/cases/{caseId}/events" /> ab. +Prüfen Sie die Events gemäß der Seite [Prüfung eines Security-Event-Token (SET)](../getting-started/event-log/set-validation.mdx). + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/invalid-event-log", + "title": "Inkonsistentes Event-Log", + "detail": "Das Event-Log ist inkonsistent.", + "instance": "submission" +} +``` + +### Genau ein Submit-Event + +Das Event-Log muss genau ein Event `submit-submission` für die betreffende Einreichung enthalten. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/invalid-event-log", + "title": "Inkonsistentes Event-Log", + "detail": "Das Event-Log ist inkonsistent, da es nicht genau ein Event 'submit-submission' enthält.", + "instance": "submission" +} +``` + +### Authentication-Tags im Submit-Event + +Das Submit-Submission-Event muss einen Payload `authenticationTags` enthalten. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-authentication-tags", + "title": "Fehlende Authentication-Tags", + "detail": "Das Event 'submit-submission' enthält keine Authentication-Tags.", + "instance": "submission" +} +``` + +### Liste der Anlagen abgleichen + +Die UUIDs der Anlagen in der Submission müssen den Schlüsseln der Anlagen in den Authentication-Tags entsprechen. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/attachments-mismatch", + "title": "Fehlerhafte Anlagen-Liste", + "detail": "Die Liste der Anlagen in Submission und Event-Log stimmt nicht überein.", + "instance": "submission" +} +``` + +## Überprüfung des Metadatensatzes + +### Authentication-Tag prüfen + +Stimmt der Authentication-Tag des Metadatensatzes (submission/encryptedMetadata) mit dem im Submit-Submission-Event (authenticationTags/metadata) überein? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + "title": "Authentication-Tag ungültig", + "detail": "Das Authentication-Tag des Metadatensatzes ist ungültig.", + "instance": "metadata" +} +``` + +### Entschlüsselung + +Kann der Metadatensatz (submission/encryptedMetadata) entschlüsselt werden? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Die Entschlüsselung des Metadatensatzes ist fehlgeschlagen.", + "instance": "metadata" +} +``` + +Sofern ein falscher oder veralteter Schlüssel verwendet wurde, +der Metadatensatz aber dennoch entschlüsselt werden konnte, +sollte Verarbeitung fortgesetzt werden, aber eine entsprechende Meldung erfolgen. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + "instance": "metadata" +} +``` + +### Syntax-Validierung + +Ist der Metadatensatz valides JSON? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + "title": "Syntax-Fehler", + "detail": "Der Metadatensatz ist kein valides JSON.", + "instance": "metadata" +} +``` + +### Schema-Referenz + +Enthält der Metadatensatz einen Eintrag `$schema`? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-schema", + "title": "Schema-Referenz fehlt", + "detail": "Die Schema-Referenz fehlt im Metadatensatz.", + "instance": "metadata" +} +``` + +### Metadatenschema + +Entspricht die angegebene URI einem gültigen Metadatenschema? +Wird die verwendete Version des Metadatenschemas unterstützt? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-schema", + "title": "Metadatenschema nicht unterstützt", + "detail": "Die angegebene Metadatenschema-URI ('$schema') ist keines der unterstützten Metadatenschemas.", + "instance": "metadata" +} +``` + +### Schema-Prüfung + +Ist der Metadatensatz valide bezüglich des verwendeten Metadatenschemas? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/schema-violation", + "title": "Schema-Fehler", + "detail": "Der Metadatensatz ist nicht schema-valide.", + "instance": "metadata" +} +``` + +### Verwaltungsleistung abgleichen (I) + +Stimmt der Identifier des Metadatensatzes `publicServiceType/identifier` +mit dem der Submission `serviceType/identifier` überein? + +Die Verwarbeitung sollte mit dem `identifier` aus dem Metadatensatz fortgesetzt werden. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/service-mismatch", + "title": "Verwaltungsleistung stimmt nicht überein", + "detail": "Die Verwaltungsleistung in Submission und Metadatensatz stimmen nicht überein.", + "instance": "metadata" +} +``` + +### Verwaltungsleistung abgleichen (II) + +Stimmt der Identifier unter `publicServiceType/identifier` mit einem der +Identifier der Destination unter `services[]/identifier` überein? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-service", + "title": "Verwaltungsleistung nicht unterstützt", + "detail": "Die angegebene Verwaltungsleistung wird nicht unterstützt.", + "instance": "metadata" +} +``` + +### Fachdatensatz + +Enthält die Einreichung einen Fachdatensatz? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-data", + "title": "Fachdatensatz fehlt", + "detail": "Der Fachdatensatz fehlt.", + "instance": "metadata" +} +``` + +### Fachdatenschema + +Stimmt das ausgewählte Fachdatenschema mit einem der angebotenen überein? +Die Angabe `contentStructure/data/schema` muss mit einem Eintrag unter `submissionSchemas[]` +des ausgewählten Services (siehe oben) übereinstimmen. + +Die Verarbeitung sollte ohne Prüfung des Fachdatenschemas fortgeführt werden. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-schema", + "title": "Fachdatenschema nicht unterstützt", + "detail": "Das angegebene Fachdatenschema wird nicht unterstützt.", + "instance": "metadata" +} +``` + +### Liste der Anlagen abgleichen + +Stimmt die Liste der Anlagen in der Submission mit den Anlagen im Metadatensatz überein? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/attachments-mismatch", + "title": "Fehlerhafte Anlagen-Liste", + "detail": "Die Liste der Anlagen in Submission und Metadatensatz stimmt nicht überein.", + "instance": "metadata" +} +``` + +### Rückkanal + +Entspricht der gewählte Rückkanal einem der angebotenen Kanäle? +Die Angabe keines Rückkanals ist immer gültig, auch wenn Rückkanäle angeboten werden. + +Die Angabe des falschen Rückkanals sollte ignoriert und die Verarbeitung ohne Rückkanal fortgesetzt werden. +Es wird daher der postalische Weg als Fallback genutzt. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-reply-channel", + "title": "Rückkanal nicht unterstützt", + "detail": "Der gewählte Rückkanal wird nicht unterstützt.", + "instance": "metadata" +} +``` + +## Überprüfung des Fachdatensatzes + +### Authentication-Tag prüfen + +Stimmt das Authentication-Tag mit dem im Submit-Submission-Event überein? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + "title": "Authentication-Tag ungültig", + "detail": "Das Authentication-Tag des Fachdatensatzes ist ungültig.", + "instance": "data" +} +``` + +### Entschlüsselung + +Kann der Fachdatensatz entschlüsselt werden? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Fachdatensatz konnte nicht entschlüsselt werden.", + "instance": "data" +} +``` + +Sofern ein falscher oder veralteter Schlüssel verwendet wurde, +der Fachdatensatz aber dennoch entschlüsselt werden konnte, +sollte Verarbeitung fortgesetzt werden, aber eine entsprechende Meldung erfolgen. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + "instance": "data" +} +``` + +### Hash-Prüfung + +Passt der Hash im Metadatensatz zu den entschlüsselten Daten? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/hash-mismatch", + "title": "Prüfsumme stimmt nicht", + "detail": "Die Prüfsumme des Fachdatensatzes stimmt nicht.", + "instance": "data" +} +``` + +### Syntax-Validierung + +Handelt es sich beim Fachdatensatz um valides JSON bzw. XML gemäß dem MIME-Type im Schema? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + "title": "Syntax-Fehler", + "detail": "Der Fachdatensatz ist kein valides JSON.", + "instance": "data" +} +``` + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + "title": "Syntax-Fehler", + "detail": "Der Fachdatensatz ist kein valides XML.", + "instance": "data" +} +``` + +### Schema-Prüfung + +Ist der Fachdatensatz valide bezüglich des verwendeten Fachdatenschemas? + +Falls die Abweichung nicht zu groß ist, sollte die Verarbeitung fortgesetzt werden. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/schema-violation", + "title": "Schema-Fehler", + "detail": "Der Fachdatensatz ist nicht schema-valide.", + "instance": "data" +} +``` + +## Überprüfung der Anlagen + +### Anlage laden + +Kann das im Metadatensatz genannte Attachment geladen werden? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-attachment", + "title": "Anlage fehlt", + "detail": "Die Anlage {attachmentId} konnte nicht geladen werden.", + "instance": "attachment:{attachmentId}" +} +``` + +### Authentication-Tag prüfen + +Stimmt das Authentication-Tag mit dem im Submit-Submission-Event überein? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + "title": "Authentication-Tag ungültig", + "detail": "Das Authentication-Tag der Anlage {attachmentId} ist ungültig.", + "instance": "attachment:{attachmentId}" +} +``` + +### Entschlüsselung + +Kann die Anlage entschlüsselt werden? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Die Anlage {attachmentId} konnte nicht entschlüsselt werden.", + "instance": "attachment:{attachmentId}" +} +``` + +Sofern ein falscher oder veralteter Schlüssel verwendet wurde, +die Anlage aber dennoch entschlüsselt werden konnte, +sollte Verarbeitung fortgesetzt werden, aber eine entsprechende Meldung erfolgen. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + "instance": "attachment:{attachmentId}" +} +``` + +### Hash-Prüfung + +Passt der Hash im Metadatensatz zu den entschlüsselten Daten? + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/hash-mismatch", + "title": "Prüfsumme stimmt nicht", + "detail": "Der Hash der Anlage {attachmentId} stimmt nicht.", + "instance": "attachment:{attachmentId}" +} +``` + +### Inhaltliche Prüfung + +Inhaltliche Prüfung, z.B. auf Viren oder Prüfung des Dateiformats: Wenn z.B. ein Word-Datei geschickt wurde, obwohl als Art „PDF“ angegeben wurde. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/invalid-content", + "title": "Unzulässiger Inhalt", + "detail": "Der Inhalt der Anlage {attachmentId} ist nicht zulässig.", + "instance": "attachment:{attachmentId}" +} +``` + +## Weitere Fehler + +### Technischer Fehler + +Fehler bei der technischen Verarbeitung im empfangenden System + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/technical-error", + "title": "Technischer Fehler", + "detail": "Bei der Verarbeitung im empfangenden System trat ein technischer Fehler auf.", + "instance": "other" +} +``` diff --git a/docs/sending/accept-reject.mdx b/docs/sending/accept-reject.mdx new file mode 100644 index 000000000..3184ecf43 --- /dev/null +++ b/docs/sending/accept-reject.mdx @@ -0,0 +1,646 @@ +--- +title: Empfangsbestätigung oder Zurückweisung +--- + +Eine Einreichung wird immer mit einer Empfangsbestätigung (`accept-submission`) akzeptiert oder mit einer Zurückweisung +(`reject-submission`) abgelehnt. +Eine Empfangsbestätigung kann, eine Zurückweisung muss eine Liste von Problemen (`problems`) enthalten. + +## Darstellung für Nutzer + +:::caution Hinweis + +Die Fehlermeldungen im Problem-Datensatz dürfen den Nutzern des Systems (z.B. Bürgern, die einen Online-Antrag nutzen) +nicht angezeigt werden! + +Die Anzeige für die Nutzer (Bürger) sollte sich daher auf drei Status beschränken: +- Die Einreichung wurde abgeschickt/ist auf dem Zustellweg. +- Die Einreichung wurde empfangen. +- Die Einreichung konnte nicht verarbeitet werden. + +::: + +### Beim Versand der Einreichung + +Nach dem Versand von Einreichungen muss das sendende System den Nutzer darauf hinweisen, dass die Einreichung zwar +versendet, jedoch noch nicht von der zuständigen Stelle empfangen wurde. +Der Nutzer muss zu einem späteren Zeitpunkt prüfen, ob eine Empfangsbestätigung vorliegt. + +### Bei einer Empfangsbestätigung + +Erhält das sendende System Kenntnis von der Empfangsbestätigung, sollte es, sofern möglich, den Nutzer informieren. +Die Empfangsbestätigung ist nur eine technische Eingangsbestätigung. +Eine fachliche Prüfung erfolgt zu einem späteren Zeitpunkt. +Bei der Formulierung sollte darauf geachtet werden, dass es sich um einer Eingangsbestätigung handelt und die fachliche +Prüfung erst noch erfolgt. +Eine mögliche Formulierung wäre "Ihre Einreichung ist bei der zuständigen Stelle eingegangen.", nicht korrekt wäre z.B. +"Ihre Einreichung wurde von der zuständigen Stelle akzeptiert.". + +### Bei einer Rückweisung + +Erhält das sendende System Kenntnis von der Zurückweisung, sollte es, sofern möglich, den Nutzer informieren. +Die Zurückweisung erfolgt aufgrund von technischen Problemen, die im Normalfall das sendende System vor dem Versand +verhindern soll. +Bei der Formulierung sollte darauf geachtet werden, dass der Nutzer darüber informiert wird, +dass eine Klärung der technischen Fehler erfolgt und ggf. ein neuer Antrag mit seiner Beteiligung versendet werden muss. +Ob der Nutzer den Antrag erneut eingeben muss, ergibt sich aus dem Fehler und wie/ob die Daten beim sendenden System noch vorgehalten werden. + +## Aufbau einer Zurückweisung + +Eine Rückweisung könnte wie folgt aussehen. + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "4ac47caa-bce1-435a-b04f-3322b224b32e", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", + "iat": 1622796532, + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", + "events": { + "https://schema.fitko.de/fit-connect/events/reject-submission": { + "problems": [ + { + "type": "https://schema.fitko.de/fit-connect/events/problems/an-example", + "title": "Nur ein Beispiel", + "detail": "Es darf kein Beispiel verwendet werden.", + "instance": "metadata" + } + ] + } + } +} +``` + +Die grundsätzliche Struktur der Events ist auf der Seite [Ereignisse](../getting-started/event-log/events.mdx) beschreiben. +Das `reject-submission`-Event enthält eine Liste von Problemen. +Diese enthält im obigen Beispiel ein Beispiel-Problem. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/an-example", + "title": "Nur ein Beispiel", + "detail": "Es darf kein Beispiel verwendet werden.", + "instance": "metadata" +} +``` + +Das Problem-Objekt enthält drei Informationen: +- `type` gibt einen Fehlercode an - siehe [Tabelle Fehlercodes](#type) +- `instance` gibt den betroffenen Teil der Übertragung an. + Mögliche Werte sind: `submission`, `metadata`, `data`, `attachment:` + UUID des Attachments oder `other` +- `title`, `detail` und evtl. weitere vorhandene Werte geben Detailinformationen zum Fehler. + +## Fehlercodes (`type`) {#type} + +| Fehlercode (`type`) | Bedeutung | Fehlerbehebung | +|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------| +| `https://schema.fitko.de/fit-connect/events/problems/attachments-mismatch` [↓](#attachments-mismatch) | Die Liste der Attachments (UUIDs) stimmt nicht überein. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/encryption-issue` [↓](#encryption-issue) | Die Entschlüsselung ist fehlgeschlagen oder es gab ein Unstimmigkeit mit dem verwendeten Schlüssel. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/hash-mismatch` [↓](#hash-mismatch) | Die Prüfsumme stimmt nicht. | [Integritätssicherung der Einreichung](#integritaetssicherung) | +| `https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag` [↓](#incorrect-authentication-tag) | Der Authentication-Tag stimmt nicht überein. | [Integritätssicherung der Einreichung](#integritaetssicherung) | +| `https://schema.fitko.de/fit-connect/events/problems/invalid-content` [↓](#invalid-content) | Die Inhaltliche Prüfung, z.B. auf Viren oder Prüfung des Dateiformats, hat einen Fehler ergeben. | [Sonstige Fehler](#sonstige) | +| `https://schema.fitko.de/fit-connect/events/problems/invalid-event-log` [↓](#invalid-event-log) | Das Ereignis-Protokoll ist ungültig. | [Fehler in FIT-Connect](#fit-connect) | +| `https://schema.fitko.de/fit-connect/events/problems/missing-attachment` [↓](#missing-attachment) | Eine Anlage fehlt. | [Fehler in FIT-Connect](#fit-connect) | +| `https://schema.fitko.de/fit-connect/events/problems/missing-authentication-tags` [↓](#missing-authentication-tags) | Die Authentication-Tags fehlen im Ereigsnis-Protokoll. | [Fehler in FIT-Connect](#fit-connect) | +| `https://schema.fitko.de/fit-connect/events/problems/missing-data` [↓](#missing-data) | Der Fachdatensatz fehlt. | [Fehler in FIT-Connect](#fit-connect) | +| `https://schema.fitko.de/fit-connect/events/problems/missing-schema` [↓](#missing-schema) | Es wurde kein Schema angegeben. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/schema-violation` [↓](#schema-violation) | Der Datensatz entspricht nicht dem Schema. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/service-mismatch` [↓](#service-mismatch) | Es wurde eine falsche Verwaltungsleistung angegeben. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/syntax-violation` [↓](#syntax-violation) | Der Datensatz ist kein valides JSON bzw. XML. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/technical-error` [↓](#technical-error) | Bei der Verarbeitung im empfangenden System trat ein technischer Fehler auf. | [Sonstige Fehler](#sonstige) | +| `https://schema.fitko.de/fit-connect/events/problems/timeout` [↓](#timeout) | Die Einreichung wurde automatisch zurückgewiesen, da sie nicht rechtzeitig abgeholt wurde. | [Sonstige Fehler](#sonstige) | +| `https://schema.fitko.de/fit-connect/events/problems/unsupported-reply-channel` [↓](#unsupported-reply-channel) | Der gewählte Rückkanal wird nicht unterstützt. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/unsupported-schema` [↓](#unsupported-schema) | Das angegebene Schema wird nicht unterstützt. | [Aufbau einer Einreichung](#aufbau) | +| `https://schema.fitko.de/fit-connect/events/problems/unsupported-service` [↓](#unsupported-service) | Die angegebene Verwaltungsleistung wird nicht unterstützt. | [Aufbau einer Einreichung](#aufbau) | + +## Verhalten des sendenden Systems + +### Verarbeitung einer Empfangsbestätigung + +Nachdem das empfangende System den Empfang bestätigt hat (`accept-submission`), informiert FIT-Connect das sendende +System per Callback, sofern ein Callback hinterlegt wurde. +Unabhängig von der Hinterlegung eines Callbacks sollte das sendende System das Ereignis-Protokoll regelmäßig prüfen, da +fehlgeschlagene Callbacks nicht wiederholt werden. + +Auch eine Empfangsbestätigung kann Probleme enthalten. +In diesem Fall waren diese nicht so gravieren, dass das empfangende System die Verarbeitung abbrechen musste. +Sie sollten protokolliert und von einem Systemadministrator überprüft werden. +Hieraus können sich Anpassungsbedarfe in der Software ergeben, wenn bspw. Fehler bzgl. der Nutzung veralteter Schemata oder deren inkorrekten Umsetzung ergeben. + + + +### Verarbeitung einer Zurückweisung + +Nachdem das empfangende System die Einreichung zurückgewiesen hat (`reject-submission`), informiert FIT-Connect das +sendende System per Callback, sofern ein Callback hinterlegt wurde. +Unabhängig von der Hinterlegung eines Callbacks sollte das sendende System das Ereignis-Protokoll regelmäßig prüfen, da +fehlgeschlagene Callbacks nicht wiederholt werden. + +Eine Zurückweisung erfolgt aufgrund von technischen Problemen, die im Normalfall das sendende System vor dem Versand +verhindern muss. +Die Probleme aus der Zurückweisung müssen protokolliert und zeitnah von einem Systemadministrator überprüft werden. + + + +## Mögliche automatische Korrekturen + +### `https://schema.fitko.de/fit-connect/events/problems/encryption-issue` + +Im Falle, dass ein inkorrekter Key genutzt wurde und die Einreichung unverschlüsselt vorliegt, verschlüsseln Sie diese erneut mit dem korrekten Key der Destination: +1. Rufen Sie den betreffenden Zustellpunkt erneut ab: <ApiLink api="submission-api" to="/v1/destinations/{destinationId}" withMethod="get" /> +2. Laden Sie den darin genannten Schlüssel (`encryptionKid`) herunter: <ApiLink api="submission-api" to="/v1/destinations/{destinationId}/keys/{keyId}" withMethod="get" /> +3. Verschlüsseln Sie alle Teile mit dem neu ermittelten Schlüssel +4. Versenden Sie die Einreichung + +Sollte die Einreichung nur noch in verschlüsselter Form vorliegen, melden sie beim Service Desk, um eine Problemlösung zu erreichen. + +## Klärungsmöglichkeiten + +### Probleme mit den übersendeten Daten (Schemafehler, nicht nutzbare Datenformate, etc.) + +Falls es Probleme mit den übersendeten Daten hinsichtlich der Verarbeitbarkeit gekommen ist, dass die empfangende Stelle eine Annahme der Daten verweigert, +besteht die Möglichkeit über das Service Desk von FIT-Connect mit der empfangenden Stelle in Kontakt zu treten, um eventuell das Problem bilateral zu klären und zu lösen. +Es besteht jedoch keine Garantie, dass die Daten auf Seite der empfangenden Stelle nach einem Reject aufbewahrt werden oder die auf der Seite des sendenden Systems eventuell noch verschlüsselt vorgehaltenen Daten sich für eine Korrektur eignen. + +Es wird daher dazu geraten, sich präzise an die Vorgaben der Destination hinsichtlich der zu versendenden Fachdatenformate und -standards zu halten und die Nutzung dieser Standards ausreichend zu testen. + +## Fehlerbeschreibungen + +### Aufbau einer Einreichung {#aufbau} + +#### Entschlüsselungs-Fehler {#encryption-issue} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Die Entschlüsselung des Metadatensatzes ist fehlgeschlagen.", + "instance": "metadata" +} +``` + +Der Metadatensatz konnte nicht entschlüsselt werden. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Fachdatensatz konnte nicht entschlüsselt werden.", + "instance": "data" +} +``` + +Der Fachdatensatz konnte nicht entschlüsselt werden. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Die Anlage {attachmentId} konnte nicht entschlüsselt werden.", + "instance": "attachment:{attachmentId}" +} +``` + +Die Anlage konnte nicht entschlüsselt werden. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + "instance": "metadata" +} +``` + +Der Metadatensatz konnte entschlüsselt werden, es wurde jedoch der falsche Schlüssel für die Verschlüsselung genutzt. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + "instance": "data" +} +``` + +Der Fachdatensatz konnte entschlüsselt werden, es wurde jedoch der falsche Schlüssel für die Verschlüsselung genutzt. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + "title": "Entschlüsselungs-Fehler", + "detail": "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + "instance": "attachment:{attachmentId}" +} +``` + +Die Anlage konnte entschlüsselt werden, es wurde jedoch der falsche Schlüssel für die Verschlüsselung genutzt. + +#### Syntax-Fehler {#syntax-violation} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + "title": "Syntax-Fehler", + "detail": "Der Metadatensatz ist kein valides JSON.", + "instance": "metadata" +} +``` + +Der Metadatensatz ist kein valides JSON. +Achten Sie darauf, die Syntax von JSON einzuhalten. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + "title": "Syntax-Fehler", + "detail": "Der Fachdatensatz ist kein valides JSON.", + "instance": "data" +} +``` + +Der Fachdatensatz ist kein valides JSON. +Achten Sie darauf, die Syntax von JSON einzuhalten. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + "title": "Syntax-Fehler", + "detail": "Der Fachdatensatz ist kein valides XML.", + "instance": "data" +} +``` + +Der Fachdatensatz ist kein valides XML. +Achten Sie darauf, die Syntax von XML einzuhalten. + +#### Schema-Referenz fehlt {#missing-schema} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-schema", + "title": "Schema-Referenz fehlt", + "detail": "Die Schema-Referenz fehlt im Metadatensatz.", + "instance": "metadata" +} +``` + +Der Metadatensatz enthält keinen Eintrag `$schema`. +Im Metadatensatz muss ein Eintrag `$schema` sein, der auf ein unter https://schema.fitko.de/fit-connect/metadata/ +angebotenes Schema verweist. + +#### Metadatenschema nicht unterstützt {#unsupported-schema} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-schema", + "title": "Metadatenschema nicht unterstützt", + "detail": "Die angegebene Metadatenschema-URI ('$schema') ist keines der unterstützten Metadatenschemas.", + "instance": "metadata" +} +``` + +Die angegebene Schema-URI (`$schema`) entspricht keinem gültigen Metadatenschema oder +die verwendete Version des Metadatenschemas wird nicht unterstützt. +Im Zustellpunkt wird eine Liste von unterstützten Metadatenschemas (`metadataVersions`) vorgegeben. +Die im Metadatensatz angegebene Schema-URI (`$schema`) muss einer der angebotenen Versionen entsprechen. + +Wenn zum Beispiel die Version `1.0.0` im Zustellpunkt angeboten wird: + +```json + { + "destinationId": "13ad2349-975c-4167-bcd8-da606b4e1d84", + "status": "active", + "services": [ + { + "identifier": "urn:de:fim:leika:leistung:99107004018000", + "submissionSchemas": [ + { + "schemaUri": "https://schema.fitko.de/fim/s00000122_1.0.0.schema.json", + "mimeType": "application/json" + } + ], + "regions": [ + "DE09" + ] + } + ], + "encryptionKid": "e4142167-7f03-4d4f-a8c9-c7ecc78f55f8", + "metadataVersions": [ + "1.0.0" + ] +} +``` + +Dann muss die Schema-URI `https://schema.fitko.de/fit-connect/metadata/1.0.0/metadata.schema.json` lauten: + +```json +{ + "$schema": "https://schema.fitko.de/fit-connect/metadata/1.0.0/metadata.schema.json", + "destinationId": "879ee109-a690-4db8-ab32-424284184d7d", + "announcedAttachments": [ + "123ee109-a690-4db8-ab32-424284184d7d", + "456ee109-a690-4db8-ab32-424284184d7d" + ], + "serviceType": { + "name": "Bauantrag", + "identifier": "urn:de:fim:leika:leistung:99010003001006" + }, + "callback": { + "url": "https://my-onlineservice.example.org/callbacks/fit-connect", + "secret": "insecure_unsafe_qHScgrg_kP-R31jHUwp3GkVkGJolvBchz65b74Lzue0" + } +} +``` + +#### Schema-Fehler {#schema-violation} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/schema-violation", + "title": "Schema-Fehler", + "detail": "Der Metadatensatz ist nicht schema-valide.", + "instance": "metadata" +} +``` + +Der Metadatensatz ist nicht valide bezüglich des verwendeten Metadatenschemas (`$schema`). +Prüfen Sie den Metadatensatz mit einem geeigneten Tool gegen das JSON-Schema. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/schema-violation", + "title": "Schema-Fehler", + "detail": "Der Fachdatensatz ist nicht schema-valide.", + "instance": "data" +} +``` + +Der Fachdatensatz ist nicht valide bezüglich des verwendeten Fachdatenschemas. +Prüfen Sie den Metadatensatz mit einem geeigneten Tool gegen das JSON- bzw. XML-Schema. + +#### Verwaltungsleistung stimmt nicht überein {#service-mismatch} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/service-mismatch", + "title": "Verwaltungsleistung stimmt nicht überein", + "detail": "Die Verwaltungsleistung in Submission und Metadatensatz stimmen nicht überein.", + "instance": "metadata" +} +``` + +Der Identifier des Metadatensatzes `publicServiceType/identifier` stimmt nicht mit dem +in der Submission `serviceType/identifier` überein. +Geben Sie in der Submission unter `serviceType` genau die gleichen Daten an, +wie im Metadatensatz unter `publicServiceType`. + +#### Verwaltungsleistung nicht unterstützt {#unsupported-service} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-service", + "title": "Verwaltungsleistung nicht unterstützt", + "detail": "Die angegebene Verwaltungsleistung wird nicht unterstützt.", + "instance": "metadata" +} +``` + +Der Identifier der Verwaltungsleistung im Metadatensatz (`publicServiceType/identifier`) entspricht keinem der +angebotenen Verwaltungsleistungen des Zustellpunktes (`services[]/identifier`). +Im Zustellpunkt werden ein oder mehrere Verwaltungsleistungen aufgelistet, +die über diesen Zustellpunkt versendet werden können. +Im Metadatensatz die Verwaltungsleistung benannt werden, die Grundlage der Einreichung ist. +Diese muss in der Liste der angebotenen Verwaltungsleistungen stehen, +ansonsten ist eine Einreichung bei diesem Zustellpunkt nicht möglich. + +#### Fachdatensatz fehlt {#missing-data} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-data", + "title": "Fachdatensatz fehlt", + "detail": "Der Fachdatensatz fehlt.", + "instance": "metadata" +} +``` + +Die Einreichung enthält keinen Fachdatensatz. +Fügen Sie einen Fachdatensatz entsprechend den Vorgaben des Zustellpunktes (`services[]/submissionSchemas[]`) bei. +Dazu wählen Sie zuerst aus der Liste der Verwaltungsleistungen (`services`) eine Leistung aus und +anschließend ein Fachdatenschema aus der Liste darunter (`submissionSchemas`). + +#### Fachdatenschema nicht unterstützt {#unsupported-schema} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-schema", + "title": "Fachdatenschema nicht unterstützt", + "detail": "Das angegebene Fachdatenschema wird nicht unterstützt.", + "instance": "metadata" +} +``` + +Das im Metadatensatz angegebene Fachdatenschema (`contentStructure/data/schema`) stimmt mit keinem der +im ausgewählten Service angebotenen Schemas (`submissionSchemas[]`) überein. +Wählen Sie aus der Liste der angebotenen Fachdatenschemas (`submissionSchemas`) ein Schema aus und +geben Sie es im Metadatensatz (`contentStructure/data/schema`) an. +Alle Angaben (`mimeType` und `schemaUri`) müssen exakt übernommen werden. + +#### Fehlerhafte Anlagen-Liste {#attachments-mismatch} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/attachments-mismatch", + "title": "Fehlerhafte Anlagen-Liste", + "detail": "Die Liste der Anlagen in Submission und Metadatensatz stimmt nicht überein.", + "instance": "metadata" +} +``` + +Die Liste der Anlagen in der Submission (`announcedAttachments`) stimmt nicht +mit den Anlagen im Metadatensatz (`contentStructure/attachments`) überein. + +#### Rückkanal nicht unterstützt {#unsupported-reply-channel} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/unsupported-reply-channel", + "title": "Rückkanal nicht unterstützt", + "detail": "Der gewählte Rückkanal wird nicht unterstützt.", + "instance": "metadata" +} +``` + +Der gewählte Rückkanal im Metadatensatz (`replyChannel`) entspricht keinem +der im Zustellpunkt angebotenen Kanäle (`replyChannels`). +Es wird daher der postalische Weg als Fallback genutzt. + +### Integritätssicherung der Einreichung {#integritaetssicherung} + +#### Authentication-Tag ungültig {#incorrect-authentication-tag} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + "title": "Authentication-Tag ungültig", + "detail": "Das Authentication-Tag des Metadatensatzes ist ungültig.", + "instance": "metadata" +} +``` + +Das Authentication-Tag des Metadatensatzes stimmt nicht mit dem im Submit-Submission-Event (`authenticationTags/metadata`) überein. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + "title": "Authentication-Tag ungültig", + "detail": "Das Authentication-Tag des Fachdatensatzes ist ungültig.", + "instance": "data" +} +``` + +Das Authentication-Tag des Fachdatensatzes stimmt nicht mit dem im Submit-Submission-Event (`authenticationTags/data`) überein. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + "title": "Authentication-Tag ungültig", + "detail": "Das Authentication-Tag der Anlage {attachmentId} ist ungültig.", + "instance": "attachment:{attachmentId}" +} +``` + +Das Authentication-Tag der Anlage stimmt nicht mit dem im Submit-Submission-Event (`authenticationTags/attachment/{attachmentId}`) überein. + +#### Hash-Fehler {#hash-mismatch} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/hash-mismatch", + "title": "Prüfsumme stimmt nicht", + "detail": "Die Prüfsumme des Fachdatensatzes stimmt nicht.", + "instance": "data" +} +``` + +Der Hash des Fachdatensatzes im Metadatensatz (`contentStructure/data/hash`) passt nicht zu den entschlüsselten Daten. + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/hash-mismatch", + "title": "Prüfsumme stimmt nicht", + "detail": "Der Hash der Anlage {attachmentId} stimmt nicht.", + "instance": "attachment:{attachmentId}" +} +``` + +Der Hash der Anlage im Metadatensatz (`contentStructure/attachments[]/hash`) passt nicht zu den entschlüsselten Daten. + +### Fehler in FIT-Connect {#fit-connect} + +Bei Fehlern, die sich auf die Konsistenz der Daten in FIT-Connect beziehen, +wenden Sie sich bitte an den [FIT-Connect Service Desk](/contact). +Geben Sie hierbei, soweit vorhanden, die IDs des Vorgangs (`destinationId`, `submissionId`, `caseId`) sowie die +verwendete Client-ID (nicht das Secret!) an. + +#### Inkonsistentes Ereignis-Protokoll {#invalid-event-log} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/invalid-event-log", + "title": "Inkonsistentes Event-Log", + "detail": "Das Event-Log ist inkonsistent.", + "instance": "submission" +} +``` + +Die Prüfung des Ereignis-Protokolls hat Fehler ergeben. + +#### Fehlende Authentication-Tags {#missing-authentication-tags} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-authentication-tags", + "title": "Fehlende Authentication-Tags", + "detail": "Das Event 'submit-submission' enthält keine Authentication-Tags.", + "instance": "submission" +} +``` + +Beim Absenden einer Einreichung protokolliert FIT-Connect die Authentication-Tags aller verschlüsselten Teile +im `submit-submission`-Event. + +#### Fehlerhafte Anlagen-Liste {#attachments-mismatch} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/attachments-mismatch", + "title": "Fehlerhafte Anlagen-Liste", + "detail": "Die Liste der Anlagen in Submission und Event-Log stimmt nicht überein.", + "instance": "submission" +} +``` + +Die UUIDs der Anlagen in der Submission müssen den Schlüsseln der Anlagen in den Authentication-Tags entsprechen. + +#### Anlage fehlt {#missing-attachment} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/missing-attachment", + "title": "Anlage fehlt", + "detail": "Die Anlage {attachmentId} konnte nicht geladen werden.", + "instance": "attachment:{attachmentId}" +} +``` + +Die im Metadatensatz genannte Anlage kann nicht geladen werden. + +### Sonstige Fehler {#sonstige} + +#### Zeitablauf (Timeout) {#timeout} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/timeout", + "title": "Zeitablauf", + "detail": "Die Einreichung wurde automatisch zurückgewiesen.", + "instance": "submission" +} +``` + +Die Einreichung wurde automatisch zurückgewiesen, da sie nicht rechtzeitig abgeholt wurde. +Sofern das empfangende System eine Einreichung nicht fristgerecht abholt oder zurückweist, +erzeugt der Zustelldienst selbst eine Zurückweisung. + +#### Unzulässiger Inhalt {#invalid-content} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/invalid-content", + "title": "Unzulässiger Inhalt", + "detail": "Der Inhalt der Anlage {attachmentId} ist nicht zulässig.", + "instance": "attachment:{attachmentId}" +} +``` + +Die Inhaltliche Prüfung der Anlage hat einen Fehler ergeben. +Mögliche Gründe sind: +- Der Virenscanner hat die Anlage als auffällig markiert. +- Das Dateiformat passt nicht, z.B. wenn eine Word-Datei geschickt wurde, obwohl nur PDF akzeptiert wird. +- Die übermittelte Datei entspricht nicht dem angegebenen Dateiformat (`contentStructure/attachments[]/mimeType`). + +#### Technischer Fehler {#technical-error} + +```json +{ + "type": "https://schema.fitko.de/fit-connect/events/problems/technical-error", + "title": "Technischer Fehler", + "detail": "Bei der Verarbeitung im empfangenden System trat ein technischer Fehler auf.", + "instance": "other" +} +``` + +Bei der Verarbeitung im empfangenden System trat ein teschnischer Fehler auf. diff --git a/docs/sending/query-status.mdx b/docs/sending/query-status.mdx index 692f51a02..5eb62e247 100644 --- a/docs/sending/query-status.mdx +++ b/docs/sending/query-status.mdx @@ -6,12 +6,13 @@ import ApiLink from '@site/src/components/ApiLink' Nachdem die Einreichung versendet worden ist, kann der Status dieser abgefragt werden. Der Status ist für das sendende System relevant, da hierüber das empfangende System mitteilt, ob es die Einreichung technisch korrekt verarbeiten konnte. -Bis zu einer Bestätigung über den Status *Accepted* sollte das System sämtliche Inhalte einer Einreichung vorhalten. +Bis zu einer Bestätigung über den Status `accepted` sollte das System sämtliche Inhalte einer Einreichung vorhalten. Dies sollte es tun, damit es im Falle eines Fehlers (aufgrund eines inkorrekten Schemas oder eines falschen Public Keys), den Fehler eventuell korrigieren kann und Informationen korrekt übermitteln kann, ohne den Nutzer (bspw. einen Antragssteller) zu einer erneuten Dateneingabe aufzufordern. Zudem stellt der Status in Form des signierten Security-Event-Tokens einen sicheren Nachweis der Übermittlung und des Empfangs dar, der gegenüber Dritten genutzt werden kann. Das Statusmodell einer Einreichung ist in der folgenden Grafik dargestellt und enthält fünf Zustände (in orange), die in der darunterliegenden Tabelle beschrieben sind. +Die in blau und grün dargestellten [Ereignisse](../getting-started/event-log/events.mdx) werden unter "Ereignisprotokoll" im Bereich "Grundlagen" beschreiben.  @@ -20,8 +21,8 @@ Das Statusmodell einer Einreichung ist in der folgenden Grafik dargestellt und e | `incomplete` | Das sendende System hat begonnen, die Einreichung zu übermitteln. Sie jedoch noch nicht abgesendet. | | `submitted` | Das sendende System hat die Einreichung vollständig übermittelt und abgesendet. | | `forwarded` | Ein vermittelndes System hat die Einreichung übernommen, sie aber noch nicht dem Zielsystem zugestellt. | -| `rejected` | Die Einreichung wurde durch den Empfänger zurückgewiesen. | -| `accepted` | Die Einreichung wurde durch den Empfänger akzeptiert. | +| `rejected` | Die Einreichung wurde durch den Empfänger zurückgewiesen. | +| `accepted` | Die Einreichung wurde durch den Empfänger akzeptiert. | Der Event Log einer Einreichung kann über den Endpunkt <ApiLink api="submission-api" to="/v1/cases/{caseId}/events" /> abgefragt werden. Hierbei wird der Event Log aller Einreichungen eines Cases zurückgeliefert. Dieser Event Log beinhaltet die verschiedenen Statusübergänge bzw. abgelegten Ereignisse. @@ -47,25 +48,37 @@ Das letzte Security Event Token (SET) aus obigem Beispiel hat folgenden Payload: ```json { - "iss": "https://submission-api-testing.fit-connect.fitko.dev", + "$schema": "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json", + "jti": "8538165b-9ce3-4097-871d-5b9581a3b4d9", + "iss": "40847c29-06aa-40e2-bf28-c29884c694c4", "iat": 1622796532, - "jti": "0BF6DBF6-CE7E-44A3-889F-82FE74C3E715", - "sub": "submission:F65FEAB2-4883-4DFF-85FB-169448545D9F", + "sub": "submission:02bf1d9f-282d-4abf-810a-c4104baf0afe", + "txn": "case:452b5ee6-35df-441a-bd39-6141723cf914", "events": { - "https://schema.fitko.de/fit-connect/events/accept-submission": {} - }, - "txn": "case:F73D30C6-8894-4444-8687-00AE756FEA90" + "https://schema.fitko.de/fit-connect/events/accept-submission": { + "authenticationTags": { + "metadata": "XFBoMYUZodetZdvTiFvSkQ", + "data": "UCGiqJxhBI3IFVdPalHHvA", + "attachments": { + "0b799252-deb9-42b0-98d3-c50d24bbafe0": "rT99rwrBTbTI7IJM8fU3El", + "25abf553-0e53-43b9-a14a-1581b32a9ee5": "i7226HEB7IchCxNuh7lCiu", + "046a9fa5-bed6-494b-aab6-d41056c6db79": "d48LxeolRdtFF4nzQibeYO" + } + } + } + } } ``` In dem SET ist folgende Information abgelegt: -- Er wurde vom Zustelldienst https://submission-api-testing.fit-connect.fitko.dev ausgestellt (iss = issuer) -- Er wurde am 04.06.2021 um 08:48:52 GMT+0 (Unixzeit 1622796532) aufgezeichnet (iat = issued at) -- Er hat die eindeutige ID `0BF6DBF6-CE7E-44A3-889F-82FE74C3E715` (jti = JWT ID) -- Er betrifft die Einreichung `F65FEAB2-4883-4DFF-85FB-169448545D9F` (sub = subject) -- Die Submission wurde angelegt "accept-submission" (events) -- Die Submission gehört zur Vorgangsreferenz (case) `F73D30C6-8894-4444-8687-00AE756FEA90` +- `$schema`: URI des zugrunde liegenden JSON Schemas. Mit diesem kann der SET Payload geprüft werden. +- `jti` (JWT ID): Er hat die eindeutige ID `8538165b-9ce3-4097-871d-5b9581a3b4d9` +- `iss` (Issuer): Er wurde vom Empfänger des Zustellpunktes (Destination) `40847c29-06aa-40e2-bf28-c29884c694c4` ausgestellt. +- `iat` (Issued At): Er wurde am 04.06.2021 um 10:48:52 (Unixzeit 1622796532) aufgezeichnet +- `sub` (Subject): Er betrifft die Einreichung `02bf1d9f-282d-4abf-810a-c4104baf0afe` +- `txn` (Transaction Identifier): Die Submission gehört zur Vorgangsreferenz (Case) `452b5ee6-35df-441a-bd39-6141723cf914` +- `events`: Die Submission wurde akzeptiert (`accept-submission`) -Aus dem Event des SET lässt sich ableiten, dass der aktuelle Status der Einreichung in diesem Case `accepted` ist und der Zeitpunkt des Übergangs der 04.06.2021 um 08:48:52 GMT+0 war. +Aus dem Event des SET lässt sich ableiten, dass der aktuelle Status der Einreichung in diesem Case `accepted` ist und der Zeitpunkt des Übergangs der 04.06.2021 um 10:48:52 war. Da alle SETs im Event Log signiert sind, kann diese Signatur auch noch überprüft werden. -Die Überprüfung ist im Artikel zum [Event Log](../getting-started/event-log.mdx#set-validation) beschrieben. +Die Überprüfung ist im Artikel [Prüfung eines Security-Event-Token (SET)](../getting-started/event-log/set-validation.mdx) beschrieben. diff --git a/docs/status-and-error-codes.md b/docs/status-and-error-codes.md index 252ebe6c7..6cd2b922c 100644 --- a/docs/status-and-error-codes.md +++ b/docs/status-and-error-codes.md @@ -33,22 +33,23 @@ abgebildet. Fachliche schon. ### Technische Fehler -| `type` des technischen Fehlers | Titel laut [httpstatus.es](https://httpstatuses.com/) | Beschreibung | -|------------------------------------------------------------------------|---------------------------------------------------------|--------------| -| https://schema.fitko.de/fit-connect/submission-api/problems/constraint-violation | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/request-binding-error | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/no-handler-found | 404 Not Found | | -| https://schema.fitko.de/fit-connect/submission-api/problems/missing-request-part | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/missing-request-parameter | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/socket-timeout | 504 Gateway Timeout | | -| https://schema.fitko.de/fit-connect/submission-api/problems/type-mismatch | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/multipart-error | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/message-not-readable | 400 Bad Request | | -| https://schema.fitko.de/fit-connect/submission-api/problems/method-not-supported | 405 Method Not Allowed | | -| https://schema.fitko.de/fit-connect/submission-api/problems/media-type-not-supported | 415 Unsupported Media Type | | -| https://schema.fitko.de/fit-connect/submission-api/problems/media-type-not-acceptable | 406 Not Acceptable | | -| https://schema.fitko.de/fit-connect/submission-api/problems/unsupported-operation | 501 Not Implemented | | -| https://schema.fitko.de/fit-connect/submission-api/problems/invalid-state-transition | 500 Internal Server Error | | +| `type` des technischen Fehlers | Titel laut [httpstatus.es](https://httpstatuses.com/) | Beschreibung | +|---------------------------------------------------------------------------------------|---------------------------------------------------------|-----------------------------------------------------------------------------------------| +| https://schema.fitko.de/fit-connect/submission-api/problems/constraint-violation | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/request-binding-error | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/no-handler-found | 404 Not Found | | +| https://schema.fitko.de/fit-connect/submission-api/problems/missing-request-part | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/missing-request-parameter | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/socket-timeout | 504 Gateway Timeout | | +| https://schema.fitko.de/fit-connect/submission-api/problems/type-mismatch | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/multipart-error | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/message-not-readable | 400 Bad Request | | +| https://schema.fitko.de/fit-connect/submission-api/problems/method-not-supported | 405 Method Not Allowed | | +| https://schema.fitko.de/fit-connect/submission-api/problems/media-type-not-supported | 415 Unsupported Media Type | | +| https://schema.fitko.de/fit-connect/submission-api/problems/media-type-not-acceptable | 406 Not Acceptable | | +| https://schema.fitko.de/fit-connect/submission-api/problems/unsupported-operation | 501 Not Implemented | | +| https://schema.fitko.de/fit-connect/submission-api/problems/invalid-state-transition | 500 Internal Server Error | | +| https://schema.fitko.de/fit-connect/submission-api/problems/invalid-jwe-content | 400 Bad Request | Es besteht ein Problem mit dem über die API übermittelten verschlüsselten Inhalt (JWE). | ### Fachliche Fehler diff --git a/sidebar.js b/sidebar.js index fe54c55df..2a649aef0 100644 --- a/sidebar.js +++ b/sidebar.js @@ -23,7 +23,16 @@ module.exports = { }, 'getting-started/schema-validation', 'getting-started/encryption', - 'getting-started/event-log', + { + type: 'category', + label: 'Ereignisprotokoll', + items: [ + 'getting-started/event-log/overview', + 'getting-started/event-log/events', + 'getting-started/event-log/set-creation', + 'getting-started/event-log/set-validation', + ] + }, 'getting-started/rate-limiting', ], }, @@ -45,6 +54,7 @@ module.exports = { 'sending/attachments', 'sending/submit', 'sending/query-status', + 'sending/accept-reject', ] }, { @@ -57,6 +67,7 @@ module.exports = { 'receiving/notification', 'receiving/download-submission', 'receiving/decrypt', + 'receiving/verification', 'receiving/process-and-acknowledge', ] }, diff --git a/src/views/FAQList.jsx b/src/views/FAQList.jsx index 0a6fd5a44..032ee6f2f 100644 --- a/src/views/FAQList.jsx +++ b/src/views/FAQList.jsx @@ -125,7 +125,7 @@ export default function FAQList() { <FaqItem title='Wo sehe ich die Statusänderungen im Event-Log?'> Zu jeder Submission können Sie über den Endpunkt <ApiLink api={'submission-api'} to={'/submissions/{sumissionId}/events'}/> das Log mit allen erfolgten Statusänderungen der Submission abrufen. Jeder der Token kann unter <Link to={'https://jwt.io/'}>jwt.io</Link> dekodiert werden und in der Payload unter dem Feld "events" finden Sie den Status der Submission. - Mehr zur Statusfolge finden Sie <Link to={'docs/getting-started/event-log'}>hier</Link>. + Mehr zur Statusfolge finden Sie <Link to={'docs/getting-started/event-log/events'}>hier</Link>. </FaqItem> <FaqItem title='Was sind die Schritte um die Signatur der Events (z.B. nach Jahren) zu prüfen wenn die PublikKey’s bereits getauscht wurden?'> Bei Änderung der Signaturschlüssels seitens des Senders wird empfohlen die alten Public-Keys nicht zu löschen, sondern lediglich die neuen hinzuzufügen, so dass eine Signaturprüfung (gegen alle vorliegenden Schlüssel) möglich bleibt. diff --git a/static/images/events/accept-submission.svg b/static/images/events/accept-submission.svg new file mode 100644 index 000000000..d9e04d469 --- /dev/null +++ b/static/images/events/accept-submission.svg @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="400" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="720" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto"> + <!--Generated by ySVG 2.5--> + <defs id="genericDefs"/> + <g> + <defs id="defs1"> + <linearGradient x1="274.879" gradientUnits="userSpaceOnUse" x2="304.879" y1="0" y2="30" id="linearGradient1" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="274.879" gradientUnits="userSpaceOnUse" x2="304.879" y1="0" y2="30" id="linearGradient2" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="267.379" gradientUnits="userSpaceOnUse" x2="312.379" y1="90" y2="135" id="linearGradient3" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="267.379" gradientUnits="userSpaceOnUse" x2="312.379" y1="90" y2="135" id="linearGradient4" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="274.879" gradientUnits="userSpaceOnUse" x2="304.879" y1="660" y2="690" id="linearGradient5" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="219.879" gradientUnits="userSpaceOnUse" x2="359.879" y1="540" y2="600" id="linearGradient6" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="219.879" gradientUnits="userSpaceOnUse" x2="359.879" y1="195" y2="255" id="linearGradient7" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="219.879" gradientUnits="userSpaceOnUse" x2="359.879" y1="315" y2="375" id="linearGradient8" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="267.379" gradientUnits="userSpaceOnUse" x2="312.379" y1="435" y2="480" id="linearGradient9" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="267.379" gradientUnits="userSpaceOnUse" x2="312.379" y1="435" y2="480" id="linearGradient10" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"> + <path d="M0 0 L400 0 L400 720 L0 720 L0 0 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"> + <path d="M-10 -15 L390 -15 L390 705 L-10 705 L-10 -15 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"> + <path d="M-47.3379 -6.8031 L348.0289 -6.8031 L348.0289 704.8571 L-47.3379 704.8571 L-47.3379 -6.8031 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"> + <path d="M-4.1299 -78.9351 L328.3376 -78.9351 L328.3376 519.5065 L-4.1299 519.5065 L-4.1299 -78.9351 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"> + <path d="M-268.879 -667 L131.121 -667 L131.121 53 L-268.879 53 L-268.879 -667 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"> + <path d="M-221.879 -547 L178.121 -547 L178.121 173 L-221.879 173 L-221.879 -547 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"> + <path d="M-221.879 -202 L178.121 -202 L178.121 518 L-221.879 518 L-221.879 -202 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"> + <path d="M-221.879 -322 L178.121 -322 L178.121 398 L-221.879 398 L-221.879 -322 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"> + <path d="M-261.379 -442 L138.621 -442 L138.621 278 L-261.379 278 L-261.379 -442 Z"/> + </clipPath> + </defs> + <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(10,15)" stroke="white"> + <rect x="-10" width="400" height="720" y="-15" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1.0117,0,0,1.0117,47.8926,6.8828)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath3)" width="276" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAAAyCAYAAACd8iTmAAAFkElEQVR4Xu3d55Ic RRCF0QK0EhLee1gJ7QokvPcavHv/96EONYkqJnbFGkRoeu4XcSM03WX0p29kZmX3 thZCCCGEEEIIIYQQQgghhBBCCOH+4YG1HjxCdS+EEI6lDOShrgtde10Xj5Dr7htX BhNCCH9TRsIkGMbDXVe6Hu16rOvxSX677r5xxpsXYwlhx5mN5FIbJsEwnup6tuv5 rhe7Xl7rpfVv191/cj3evBhLCDuMh17KIn253Eb08UwbhvFa19Wu612HXW9N8tt1 940z3jzzrWM968ZUQtgRykxEJdKXp9swhje6Drpudb3f9VHXx12frvXJ+veH6/s3 1+PNM986j7QRrcRUQtgBZjORrkhdRBqM4Z02TOSzri+7vu76puvbSX677r5xzIUB iVpebWM961o/phLCgpnNRIqiFiK6kMp80PV5G2bxXdeq6/uuH46Q6+4bZzxjMd86 1nuuxVRCWDxzZMJM9ttIW6QxX7VhEGUiP3b9dBe5b9xqPU/EIrp5u90xFemU9Eeh NoSwIDzUCqZqHNISDz0zURcRZazayYxkU2Ust9swJebEVF5vYx/72TdRSggLoVId pzCOhNU6pCciijKT0xrJpmZTse6NNvZxtKxfxf4hhAUgOpF6SHVeaKOAquYhTWEC ZSY/n0OzqXzRxinQm23sJ/VJlBLCAqjoRJTgWFcq4lRGIVXtgwnMxvDLGTWbitMg x8xSKidIoiL7p5YSwpbDUEQHahkKsaIG0YnURAG2IhOm8Os5VKYi2lm1sb597Gdf +19oiVJC2Goq3Xmi65U2CqaiB1FERSdlJr91/X4GmVemwqAYlfUVfNVq7OuY2v8j hhLCFlPpjrTDyc67bdQ4qnZShlJm8scZVKZSUQqjkk7pa9EsZ9+kPSEsAIZypY0j 3Gvt+HRnNpQ/T6GjDKXSHkVfxdmrbex/ueW0J4StRXqhbqF+odHM6Y5WeUfF/4eh MC77qaPYn7HFUELYUmZDURg9aKNHxPs40pJ7aSgMi3HZj5HNhdkQwhZyvxiKfWMo IWw5m4YiUjiJoZzUVI4rylbKw1CkPBWhJOUJYYspQ/Egq2FUD8pRNRTHvv/VKc9m L4pisKJsDCWELccD7HTFV9X2u95r4/Rl1e6toVQLvv322+jSzbFxCFuOB/hSGy/p aYO/1e603c99KOdtbJsNpfpQ7HOzjX3t7/+RxrYQthiGcrGNFwN9ZPqwjU8MzHUU RjCbymlV7ffMxHpzQdZ+Pg9p/70WQwlhq5nrKOoYmsykIUd1y55Xc3RifV25+y1N bSEsikp7vM/jz2HcaCNK2SzOnlfz6U59E8V+9r3YUj8JYRHMx8eihf023rFR4/AS H1NhBozlrKreE6mUlw/VarzDoxgsOrJ/CGEhVJTirV81DUfIUh8v8M2mclpjqTmr NtaxnnWtX7WTRCchLIyKUtQynLhIRQ7aeHmvTGXVRg2E7mYuda+iEvNEJiIe61nX +vPnH1OMDWFhiBL22khB9IX4TomHX0QhTfm3P6HBQOrfZSTGa2AzXxHWetb1uQLm xcRiJiEslE1TEUlIT9Q8FFJFKwxCxMIsnAStJvntuvvGGa+9Xr/JtTbWYybWt4/9 QggLZjYVaYkPSSugHrZRrGUQIg5moauWcZT8dt1944w3z7dqrWM9kUnMJIQdwsMu HVHjUDh1GqPxjbFcb+NTkcxCTcT7OCXpkevuG2e8eeZbx3rWjZmEsGOobSiYOoUR rTgBYgwiDXUQUYdGOKlMaX993X3jpE3miUqskwJsCDuMh7+iFYbAGPwdHc1oaiEM Ru9KiYG4zkSMKyOpqCRmEkL4x1hEGGUu0heGMcs1/SxlIsbHSEIIx8IcymDKZEp1 rcaEEEIIIYQQQgghhBBCCCGEneYvy1HI25eRzoUAAAAASUVORK5CYII=" height="50" preserveAspectRatio="none"/> + <path fill="url(#linearGradient1)" d="M304.879 15 C304.879 23.2843 298.1632 30 289.879 30 C281.5947 30 274.879 23.2843 274.879 15 C274.879 6.7157 281.5947 0 289.879 0 C298.1632 0 304.879 6.7157 304.879 15 Z" clip-path="url(#clipPath2)" transform="matrix(0.9884,0,0,0.9884,-37.4537,8.0232)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(39,174,39)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(39,174,39)" stroke-miterlimit="1.45"> + <path fill="none" d="M304.879 15 C304.879 23.2843 298.1632 30 289.879 30 C281.5947 30 274.879 23.2843 274.879 15 C274.879 6.7157 281.5947 0 289.879 0 C298.1632 0 304.879 6.7157 304.879 15 Z" clip-path="url(#clipPath2)"/> + <rect x="282.055" y="9.7814" clip-path="url(#clipPath2)" fill="url(#linearGradient2)" width="15.648" height="10.4372" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M282.055 9.7814 L297.703 9.7814 L297.703 20.2186 L282.055 20.2186 ZL289.879 15 L297.703 9.7814" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <text x="48.0098" xml:space="preserve" y="13.6016" clip-path="url(#clipPath2)" stroke="none">Event 'accept-submission' empfangen</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1.2031,0,0,1.2031,4.9688,94.9688)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath4)" width="276" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAAA6CAYAAABxoaaLAAAEN0lEQVR4Xu2d527U UBBGBwKE3luoApJQRETvbQmd938g5uPukFnr2utdENqsz5E+JRht/vlkZuw7MQMA AAAAAAAAAAAAAAAAAACAJWHPOHtT9G8AgJmQOFY8+z0HPKvjr/sMsQDADEgWEock cthzzHPcc9RzyIpkkAoATCVkctCKRM54LnrWPOc9pzxHrFQrSAUAWskyOeG54Lnm WfdseG56LluRDFIBgFaaMlFVcsNzz/PQ88iz5dn0XDWkAgAt1GSiauS+56nnlee1 54UVudw2pAIAFbpk8szzxvPBM/K887y0Uq0gFQCYYJpM3loRybbnk+ej572VigWp AMAf+shEApFIPo+j7yUXpAIAf5hHJjmSitogpAIwcKbJRHMSyUTi+NIRyQapAAyY Lpk8t53KRML4mpJFkq8hFYCB0iWT3OaoMpEwvqVkueRrkgozFYCB0VcmqjgkiZDG 9/R9TlyXVGKmIqnwSBlgyekjk5HtDGCbQok0r+UqJT9SRioAS8o8Mok5SVMozWSh 6LNIBWCJmUUmXUL50UhTJiEUpAKwpMwjk0iWSh+h5M/2lcp+K1IBgAVHMtHNumpl MZJ2mNywfjJpCkXiCJH8HH+dJpSaVOJA4RUr+1S0pGmfUaUALDxRnWjTmioC7TPR CgKdGtZBv5HVRTKLUGrtTjNZKjql/MDKXhVVS1rcFK0PACwwuknVUmhdoxYk3bJy M+s9Eb2Etm31m78plbY5SptQmj8jro2siExCu2ul9VGVonZsxQBgoZFQ9Ntf7Y6q AVUFajlCKG03/t8KpZaoUtRmSSiqlFQxnbbS9iAUgAUnKhQNP8/ZzvxEr9bHOZ22 +UnI5F8IRT9f1VC8RSupbXouWRkUa8ZDywOw4GiGot/8ailOWrmB1620PZplTJNK FkrIRPOT5lC2SyghE1VE2vT22Eq7o+rkrO086WEoC7ALiCpFg1nNK7RYesP6SSVE kauTmlDanvI0ZfLEikyuW6mY1IrFQBahAOwSslQ0s+gjlWntTk0oWSp9ZKJWRxUU MgHYZcwilVmEEnOUXKUgE4ABMI9UslDakqsUZAIwIPpKpSYUfc1pCkWfQSYAA6OP VCQGCSKEEon2Jl/P1QkyARgg06Sid0YklahS8pykdk0yGRkyARgsXVLRQb6QSh7S 1oJMAOA3bVLR26xNqdRCmwMAE9SksmmTlUrzPZXa0xydz0EmAFCVSrQ/+emPJFKT CZUJAEzQRyqjcVS1IBMA6KRLKjqlrH0mik4Nx0E/ZAIArbRJZctKRaJ9JhraIhMA 6EWWik4pa/XBTc8dKyKRYLSCAJkAQC+yVLRPRWsktVxaqxvXrOyp1XpJZAIAvQip HLRSiUgsqli0aS3+tg4yAYDeSCqShuQhsSiqSiQa/R8yAYCZkDRCLAoiAQAAAAAA AAAAAAAAAACA/8UvaKzKAc/Yfe0AAAAASUVORK5CYII=" height="58" preserveAspectRatio="none"/> + <path fill="url(#linearGradient3)" d="M289.879 90 L312.379 112.5 L289.879 135 L267.379 112.5 Z" clip-path="url(#clipPath2)" transform="matrix(0.8312,0,0,0.8312,4.1818,-66.4675)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M289.879 90 L312.379 112.5 L289.879 135 L267.379 112.5 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient4)" d="M294.502 123.2869 L285.256 101.7131 M294.502 101.7131 L285.256 123.2869" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M294.502 123.2869 L285.256 101.7131 M294.502 101.7131 L285.256 123.2869" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <text x="7.0001" xml:space="preserve" y="103.6016" clip-path="url(#clipPath2)" stroke="none">Enthält das Event eine Liste von Problemen?</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,268.879,667)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath5)" width="59" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAAzCAYAAAApdnDeAAAEvUlEQVR4Xu3ZCY/U RhAF4AosRy5yhyQEEJlZArnJHUhgyMH//0npT+2SOi3PQZC9s8IlPa1st3f61fGq eiZiscUWW2yxl9te2YFzb0nkQsHFgpMBlxrkPc+tO3fkW4IIXSm4WvBawesFbzRw 7b7nl4f1LfGjtiRp4wgg9FbBuwXvF3xYcL3go+Gva/ffKbgWlbz3kvRREs5o2mSS RACZGwW3C1YFpwWfD7g7XH82PP9kWO8978sIKX5UUbaRjKaUfDtq1G4VrAu+KPim 4PuCHwt+auD6wfD8flSH3IxKWkb4fxx4FIRboqLxXtRIIvllVIK/FDws+KPgccGT Bq5/H57/HJU45yAt0tJfavv/CJ+Z9UQ/iBrNewXfRSWJ4Kbgz4K/Cv4egfueI/8o Kulvo6a5KHOg/3+mhH1wEiUy6k5Ufoi66U1UIv8MeLYHiCdpkZYVUpsDERZhKT17 OvtAH6ymbMSGEFWD0vJp1M23JJP0GNo13vM+h3GcTBFhKf1qnIFK+0CqS4zUKHW1 MURFpyeQJLahJ98SFuG7UWuYaMmm2dI5oyp9qe46ao3amA0m0UNI7iO8Kfgtag1r UXRBOp/EDNFNURJV/VB6fRVVjDZRN7iPqDreJlY9YesoNtFSJp9Gja4ePHl0keVV 3tUL11HTTPqmGLW1N0ayR7+uJ6wsZI3sWUUVQ1rB6ZNaKjDvqlXezqi2RHuyPcEe uwh7TqENIcTq44I3YwZl5k0pTBm1GpMPr/N+r6iHEh0j3JJ1TQvU7tdRlZ8wSuXJ yUohqbSKmsIGB5sdi2pPaB+2EeZMpSKV70Rtd5w+Wd329Xoata9KMZubkqxnnKq9 raOqcvbcSSzJZsvR+9RRT/b/Et1F2H2qzLmczNmTilTbX51HDRLIbmJespw8C9lD IvsihMeI9mRniyyybc2qIZuYg6yaJYirqAKpZicTKMaTqcbGN+fPXWr8PIS3EYV2 sKDGWt+kasyQzVFRv9P3HMdsxqb6uj2UcL++Jep6U/Br1NHUiKrPGm4m7bM5Qfly zCnEedPcuqtu9xHu1/VRtSbrlSi2E9Sk1tatXreKmso5RfURGcM2kmNkXZueZE+e fLJeL8YM5kPyLOsUYj5uo9tv9nkwFlWaQPVlkXk8z7STpnBa22+psujyOu9vYnzT Pakx9O8gyoFq1QxOmPLEcxIzmugaxHlZ7eq52kIe4Mc235PbRjKJbqI6kAKfRh1k aIWoTqrCvWXtqh1tgEI6fm37su1QIK/22y/diJJyUTbKh6NnSeHWePdSVLHKL90Q tkHHMQpq4ylGPbGWIFgnK7wndQlfEuXQTN/ZiaZlK0rCIiyl1TDREmVRQiKJ93A/ SYomMVKjp/Ffohw7a/r2xstthG1MDWsRVFp0kBZp59H8VSDhmkM8R5KTqC4x0k8N L0dBNK0lrIaJlh4sKpRaapu0CI2aNhwkpLz7JiPrOEl7obrESI1K3aMg2lqKFpUW ZYKCtEirZ9FaR01Pqe4vZ7gv/UUSyfxBS3mciRgdahnlJG3TRjvE1TTyenPCtfue W2f9Uf5Uucta0tIbASmOjKjnL+4gVT23TiTPDckxS+KATI98dm4JLrbYYosttthg /wKSX8ay1v4aNwAAAABJRU5ErkJggg==" height="51" preserveAspectRatio="none"/> + <circle transform="matrix(1,0,0,1,-258.879,-652)" clip-path="url(#clipPath2)" fill="url(#linearGradient5)" image-rendering="auto" r="13.75" cx="289.879" cy="675" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(177,31,31)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(177,31,31)" stroke-width="3" stroke-miterlimit="1.45"> + <circle fill="none" r="13.75" clip-path="url(#clipPath2)" cx="289.879" cy="675"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,221.879,547)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath6)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="219.879" y="540" transform="matrix(1,0,0,1,-211.879,-532)" clip-path="url(#clipPath2)" fill="url(#linearGradient6)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="219.879" y="540" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="248.96" y="560.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Benutzer über</text> + <text x="228.9473" y="574.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Eingangsbestätigung</text> + <text x="255.8741" y="588.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">informieren</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,221.879,202)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath7)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="219.879" y="195" transform="matrix(1,0,0,1,-211.879,-187)" clip-path="url(#clipPath2)" fill="url(#linearGradient7)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="219.879" y="195" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="264.8272" y="215.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Liste der</text> + <text x="262.6241" y="229.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Probleme</text> + <text x="263.4561" y="243.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">ermitteln</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,221.879,322)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath8)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="219.879" y="315" transform="matrix(1,0,0,1,-211.879,-307)" clip-path="url(#clipPath2)" fill="url(#linearGradient8)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="219.879" y="315" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="264.8272" y="335.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Liste der</text> + <text x="262.6241" y="349.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Probleme</text> + <text x="248.7725" y="363.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">protokollieren</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,261.379,442)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath9)" width="74" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABCCAYAAADwg0AcAAAD3klEQVR4Xu3ZaW/T QBAG4IGUXkDLIUAcH2hVyheOUon7Cvfx/39Q59Xuqw6j9dpOSJvN7kiv4tjgxI9n N+lGpFWrVq1atWrVqpi6oLmomcRgG/taxSLQmmZdsxGDbezDseqLSJc0W5qrmt0Y bGMfjlWNBSQMMXTOZc11zR3NvZjbcd+2VIzlkW5o7mv2NY9jsA0wHKsSyyPd1DzQ HGqeaY5jnmoeSQCsDqsLCR10pHmtea95p3mleS4VYvUhvdF80kxjPkqAqwprKNIX zTfN17hdFVYf0lv5F8mmGqwc0gs5RUIHAea7STVYQ5A+S0CyQD7EAiiGKLDwCbkS WEOR2EU/4mMqPAZQi1V8Z+WQOCcRCQg/Y7Btwficx1cKawgSLpRIv0wslkWyxy1W sXNWHxK/AnBOIsLv+Oix7HH+G2IVO8GPRUpBWIzcMfzfIj8NhyLxe1IK6k98tN3F 5zxmoXCOorBmQeqCslgWKQdVBNasSP4TzWMRJofELD3WPEg5qL/x0aN1QS011rxI FosTt4WyIRSRUlBLi4UXwgumkPwfuP5iPJTtqi6orm7y5+vD4rLymoSbvdDCC+CF tiS8MN7AofR3Ei/C7vdQ6BwP1TXsUufLYR1o7kr40WJTwohYaKGbMOSuSFj835ew fIs31LcKkLowi+WHX27Y5c5psT5IWCl9otnT3JIwEjAiFtpVuBMbEu4MFv4x5I4l LN9OpftN+8wCNfScDG4a/qbEdIA/xDEE0VU7Em72uUP5N527oDFQOSyPhH3nCpUa evi1BO2NOYHzk3/zqYvixc8L1YU0lTD0XkoYeg/lDIeencyvSegq3ClMmJin+rDs c4s0djJPnS+FhBuIOfRATidzjIiJnEHx68G2hO8n+OQbipWDGvv1wCeHhBuKG4sb vCYL7iZb/wPLd1MXFLvKD7+lR2LNg+W7iVCp5Ibf0iOxZsUiFABSUPa5h7JYRSCx xmBZqFQ3YZswfr/vqqKQWGOxPJQFsvHHLFRxSKwxWCko4mA/j/nj2M9umkqBSKyh WLhYi2GROA+ljmM/kHCOYpFYQ7AwbCwWu4hIKSx2E5BwjqKRWH1YXGnwMICw8ceI hHMUj8TKYfmfr/rC4bYyneRrCJb/6uCBVh6JlcPyn4YWrMjvSfPWWKwqkVhDsQBU LRJrCBZWJZFqkVg5LMBg6RbBymS1SKwUFkCwZIv17aO4XTUSy2LhN0KA7EnoLgTb WL6tGolFLEAABIv/wEGwvRuPVY3EAhYgNiX8QrITg23sa0imADGR0F3rMdjGvobk CiAIOgzh81atWrVq1apVq2WoE8+OJFhW6KMCAAAAAElFTkSuQmCC" height="66" preserveAspectRatio="none"/> + <path fill="url(#linearGradient9)" d="M289.879 435 L312.379 457.5 L289.879 480 L267.379 457.5 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-251.379,-427)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,10,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M289.879 435 L312.379 457.5 L289.879 480 L267.379 457.5 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient10)" d="M294.502 468.2869 L285.256 446.7131 M294.502 446.7131 L285.256 468.2869" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M294.502 468.2869 L285.256 446.7131 M294.502 446.7131 L285.256 468.2869" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M289.879 29.9963 L289.879 78.9807" clip-path="url(#clipPath2)"/> + <path d="M289.879 89.9807 L295.879 77.9807 L283.879 77.9807 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M289.879 600 L289.879 649.022" clip-path="url(#clipPath2)"/> + <path d="M289.879 660.022 L295.879 648.022 L283.879 648.022 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M289.879 135.0183 L289.879 183.9707" clip-path="url(#clipPath2)"/> + <path d="M289.879 194.9707 L295.879 182.9707 L283.879 182.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="291.879" xml:space="preserve" y="153.6016" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">ja</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M289.879 255 L289.879 303.9707" clip-path="url(#clipPath2)"/> + <path d="M289.879 314.9707 L295.879 302.9707 L283.879 302.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M289.879 375 L289.879 423.9817" clip-path="url(#clipPath2)"/> + <path d="M289.879 434.9817 L295.879 422.9817 L283.879 422.9817 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M312.4156 112.5 L364.879 112.5 L369.254 113.125 L372.379 115 L374.254 118.125 L374.879 122.5 L374.879 447.5 L374.254 451.875 L372.379 455 L369.254 456.875 L364.879 457.5 L323.4156 457.5" clip-path="url(#clipPath2)"/> + <path d="M312.4156 457.5 L324.4156 463.5 L324.4156 451.5 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="319.379" xml:space="preserve" y="107.9688" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">nein</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,10,15)" stroke-linecap="butt"> + <path fill="none" d="M289.879 480.0183 L289.879 528.9707" clip-path="url(#clipPath2)"/> + <path d="M289.879 539.9707 L295.879 527.9707 L283.879 527.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + </g> +</svg> diff --git a/static/images/events/reject-submission.svg b/static/images/events/reject-submission.svg new file mode 100644 index 000000000..57fb663f3 --- /dev/null +++ b/static/images/events/reject-submission.svg @@ -0,0 +1,538 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="964" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="1557" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto"> + <!--Generated by ySVG 2.5--> + <defs id="genericDefs"/> + <g> + <defs id="defs1"> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="90" y2="150" id="linearGradient1" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="305.4476" gradientUnits="userSpaceOnUse" x2="335.4476" y1="0" y2="30" id="linearGradient2" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="305.4476" gradientUnits="userSpaceOnUse" x2="335.4476" y1="0" y2="30" id="linearGradient3" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="210" y2="270" id="linearGradient4" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="693.0381" gradientUnits="userSpaceOnUse" x2="738.0381" y1="780" y2="825" id="linearGradient5" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="693.0381" gradientUnits="userSpaceOnUse" x2="738.0381" y1="780" y2="825" id="linearGradient6" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="645.5381" gradientUnits="userSpaceOnUse" x2="785.5381" y1="1126.3984" y2="1186.3984" id="linearGradient7" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="330" y2="375" id="linearGradient8" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="330" y2="375" id="linearGradient9" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="645.5381" gradientUnits="userSpaceOnUse" x2="785.5381" y1="660" y2="720" id="linearGradient10" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="435" y2="495" id="linearGradient11" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="660" y2="720" id="linearGradient12" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="660" y2="720" id="linearGradient13" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="700.5381" gradientUnits="userSpaceOnUse" x2="730.5381" y1="1271.3984" y2="1301.3984" id="linearGradient14" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="555" y2="600" id="linearGradient15" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="555" y2="600" id="linearGradient16" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="10" gradientUnits="userSpaceOnUse" x2="150" y1="888.1992" y2="948.1992" id="linearGradient17" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="780" y2="825" id="linearGradient18" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="780" y2="825" id="linearGradient19" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="1011.3984" y2="1056.3984" id="linearGradient20" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="297.9476" gradientUnits="userSpaceOnUse" x2="342.9476" y1="1011.3984" y2="1056.3984" id="linearGradient21" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="888.1992" y2="948.1992" id="linearGradient22" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="888.1992" y2="948.1992" id="linearGradient23" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="1116.3984" y2="1196.3984" id="linearGradient24" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="305.4476" gradientUnits="userSpaceOnUse" x2="335.4476" y1="1496.3984" y2="1526.3984" id="linearGradient25" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="1256.3984" y2="1316.3984" id="linearGradient26" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="1256.3984" y2="1316.3984" id="linearGradient27" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <linearGradient x1="250.4476" gradientUnits="userSpaceOnUse" x2="390.4476" y1="1376.3984" y2="1436.3984" id="linearGradient28" spreadMethod="reflect"> + <stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/> + <stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/> + </linearGradient> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"> + <path d="M0 0 L964 0 L964 1557 L0 1557 L0 0 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"> + <path d="M-5 -15 L959 -15 L959 1542 L-5 1542 L-5 -15 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"> + <path d="M-247.4476 -97 L716.5524 -97 L716.5524 1460 L-247.4476 1460 L-247.4476 -97 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"> + <path d="M-78.6586 -7 L885.3414 -7 L885.3414 1550 L-78.6586 1550 L-78.6586 -7 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"> + <path d="M-247.4476 -217 L716.5524 -217 L716.5524 1340 L-247.4476 1340 L-247.4476 -217 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"> + <path d="M-690.0381 -787 L273.9619 -787 L273.9619 770 L-690.0381 770 L-690.0381 -787 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"> + <path d="M-642.5381 -1133.3984 L321.4619 -1133.3984 L321.4619 423.6016 L-642.5381 423.6016 L-642.5381 -1133.3984 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"> + <path d="M-161.9528 -185.6652 L381.6242 -185.6652 L381.6242 692.2908 L-161.9528 692.2908 L-161.9528 -185.6652 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"> + <path d="M-642.5381 -667 L321.4619 -667 L321.4619 890 L-642.5381 890 L-642.5381 -667 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath10"> + <path d="M-247.4476 -442 L716.5524 -442 L716.5524 1115 L-247.4476 1115 L-247.4476 -442 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath11"> + <path d="M-247.4476 -667 L716.5524 -667 L716.5524 890 L-247.4476 890 L-247.4476 -667 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath12"> + <path d="M-689.5381 -1278.3984 L274.4619 -1278.3984 L274.4619 278.6016 L-689.5381 278.6016 L-689.5381 -1278.3984 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath13"> + <path d="M-245.1196 -450.0196 L561.3641 -450.0196 L561.3641 852.5686 L-245.1196 852.5686 L-245.1196 -450.0196 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath14"> + <path d="M-7 -895.1992 L957 -895.1992 L957 661.8008 L-7 661.8008 L-7 -895.1992 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath15"> + <path d="M-264.8824 -708.4225 L604.0754 -708.4225 L604.0754 695.0704 L-264.8824 695.0704 L-264.8824 -708.4225 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath16"> + <path d="M-92.0004 -1018.3984 L871.9996 -1018.3984 L871.9996 538.6016 L-92.0004 538.6016 L-92.0004 -1018.3984 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath17"> + <path d="M-247.4476 -895.1992 L716.5524 -895.1992 L716.5524 661.8008 L-247.4476 661.8008 L-247.4476 -895.1992 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath18"> + <path d="M-447.4479 -892 L516.5521 -892 L516.5521 665 L-447.4479 665 L-447.4479 -892 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath19"> + <path d="M-247.4476 -1123.3984 L716.5524 -1123.3984 L716.5524 433.6016 L-247.4476 433.6016 L-247.4476 -1123.3984 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath20"> + <path d="M-294.4476 -1503.3984 L669.5524 -1503.3984 L669.5524 53.6016 L-294.4476 53.6016 L-294.4476 -1503.3984 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath21"> + <path d="M-247.4476 -1263.3984 L716.5524 -1263.3984 L716.5524 293.6016 L-247.4476 293.6016 L-247.4476 -1263.3984 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath22"> + <path d="M-247.4476 -1383.3984 L716.5524 -1383.3984 L716.5524 173.6016 L-247.4476 173.6016 L-247.4476 -1383.3984 Z"/> + </clipPath> + </defs> + <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(5,15)" stroke="white"> + <rect x="-5" width="964" height="1557" y="-15" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,97)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath3)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="90" transform="matrix(1,0,0,1,-242.4476,-82)" clip-path="url(#clipPath2)" fill="url(#linearGradient1)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="90" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="295.3959" y="110.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Liste der</text> + <text x="293.1927" y="124.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Probleme</text> + <text x="294.0248" y="138.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">ermitteln</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,78.6586,7)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath4)" width="274" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARIAAAAzCAYAAABbsIcEAAAF2UlEQVR4Xu2dZ3Mb VRhGX8AJhNB7RwlOc+i9IyCh/v//wz1z/eDrjRRHSRhmV+fMPGPJkvxtz7zlal0l IiIiIiIiIiIiIiIiIiIPl0eGPLoheU1E5BSjOB5rOWg513J+En5HeJ33RSwissdM 5fF4y4WWJ1ueanm65ZkhPL94/B7eG6koFJE9hQsfgSADpIAgkMULLS+1vNryessb x+Hxay2vtLzY8lx12SAVqpVUKCKyJ3DBpwJBIM9WlwfCeKflcsuVlmst14dcbXmv ZdXyVnXZIB4qlSeqS8nqRGQPiES48BEAAnmz5VJ1cbzf8nHLpy2ft3xxHB5/1vJJ y4ctN1oOq4sHoVCh0BKlOlEmIgsFiVA10I5w4SOAd6sLBDkgiq9avm35vuWHSfjd dy3fVJcLwjmqXqUgI1oe2h1lIrJQUolEIsw8aGFuVhfI19VF8VPLuuXnll82hN/z OmJBOAgFCdH2vF29wolMnJmILAgqg7QzkQhVxAfVRUCVgUCQxK/HubUleR2prKsL BQnR8jBHodVBJsxeMjMRkQXAxcxgla0Mm5dI5MvqIohAptI4K3yGz/5Yvd2JTKhM GMJS/RyULY7I7OEipjKgQqBSWFUfqD6oRMZQnVDRIBPmJrQ5bIDYBiEwqxKRGZOz ImlpGIhSMTATYR6CRCKD2w+QyITKhGEt1Q5boJerC+ygrEpEZstYjXCQjOHqR9Ur h3X1SmQUwm/3kVEmiAlBsSpmPcxZEwRmVSIyYzIbocVINcJwlZaGCmKUx+/3mVEo iIkWh+ErwkJctFOcL6EyEpGZkbaGgSfnO1bVW45UI2lnIpE/Wv7cMXyGRChjVUL7 dK36hoiDb1RGtjciMyNtDWc6aGsOq29VWPWO1cgokb92TIQSkfA3MythmMsZFTY4 aW8UicjM4KI9X33lS1VAW8PsgrYms5GIZJTI3zskMkFE0/aGyoeDaqvqq2AGvs5J RGbGOB9h6HlUvUqgWtgmkqkozso2kayrn3plFeycRGTGRCS0FbQXnB1hNUu1MJ2P /BcioYWileLwG2tgRSIyQyKS5+tEJGxTFImI3DP/d0VCa6NIRGbO9AzJ3WYk49Zm Kott4b1niWSckVwoRSIyO7K14QwHWxvOdGzb2mwSSUQxzfS16fqXv51DaWxtuN+J WxuRmYJI+I7LxbrzHAmHxrjoySiScQ18t+S9qUZGkXCOBFlR/RzV6WPyniMRmRnj yVYqAioDTrZSKazrzjlJTqmOgtiUTa/xef5WTrYiK27VeLX6bQs82SoyY8Y5CV/r H9sbKgcufESSIIRdk8+mGmEGk7bmUnmGRGT2jO0NmxMubC7wrIEzK3kYGde++Z4N Q17vSSKyAKgEuJCZU6Qqoe3ggl/X6ZsaIYQ8PisRSJ7T0mQ2wqp5VSfVCDITkRkz ViV8C5hZCUNQWhy+pbuu3pKMQtklfA6JpKXh9gGH1WcjfM+HzZHViMgC4ELOKpgN Di0OVcN44+fIJJkKYyoPwmfWdXID6NxmkZaGE7U5O+KQVWQBZIPDWQ5mFlQLl6vL hMqEw2NUFOs6+TcUo1TG8BrhfQiIqoYTs0iEtolTtFQ+tDTnSomILIq0OKNMqExo czhfggyoTqgu8r9tCMJIeM5rSAeBcKsARMRa+Ur1MyNIhDYKidjSiCyQUSbML2hz +D80tCPIgCEsw1IEQZWCWBBGwnNeQzoIhHnIjepC4vQs7YwSEdkDIhM2Odw9jQoC CayqC+Vm9RUxVQprXII0+IloaGFoia5X/0IeVQirZaocZiJKRGRPyMyEASyzDKoT hEK7w4yDCoPNC2Jh7kF4TPvCbIXND6tkKppUIYgJQSkRkT0CmXDRc/EjFKoJtjqc N0EqSAKxECoWfvI7zoZw5B75IBDapFQhDlZF9pQIhQoFIVBZIBUkQeuDXAiP+R0V DPJAPqlAFIiI/MsoFSRBkEvCc16LPBSIiNwTEYbSEBERERERERERERERWTz/ALlB zeJV2Q4xAAAAAElFTkSuQmCC" height="51" preserveAspectRatio="none"/> + <path fill="url(#linearGradient2)" d="M335.4476 15 C335.4476 23.2843 328.7319 30 320.4476 30 C312.1634 30 305.4476 23.2843 305.4476 15 C305.4476 6.7157 312.1634 0 320.4476 0 C328.7319 0 335.4476 6.7157 335.4476 15 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-73.6586,8)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(39,174,39)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(39,174,39)" stroke-miterlimit="1.45"> + <path fill="none" d="M335.4476 15 C335.4476 23.2843 328.7319 30 320.4476 30 C312.1634 30 305.4476 23.2843 305.4476 15 C305.4476 6.7157 312.1634 0 320.4476 0 C328.7319 0 335.4476 6.7157 335.4476 15 Z" clip-path="url(#clipPath2)"/> + <rect x="312.6236" y="9.7814" clip-path="url(#clipPath2)" fill="url(#linearGradient3)" width="15.648" height="10.4372" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M312.6236 9.7814 L328.2716 9.7814 L328.2716 20.2186 L312.6236 20.2186 ZL320.4476 15 L328.2716 9.7814" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="83.6586" xml:space="preserve" y="13.6016" clip-path="url(#clipPath2)" stroke="none">Event 'reject-submission' empfangen</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,217)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath5)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="210" transform="matrix(1,0,0,1,-242.4476,-202)" clip-path="url(#clipPath2)" fill="url(#linearGradient4)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="210" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="295.3959" y="230.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Liste der</text> + <text x="293.1927" y="244.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Probleme</text> + <text x="279.3412" y="258.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">protokollieren</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,690.0381,787)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath6)" width="256" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABYCAYAAAAa2ClIAAAEsklEQVR4Xu3dWY/c RBTF8QszZAMSFgFieSBRCC8sIRL7NuzL9/9AqaOqq1yuymW7e5R2m/9Puhq3Hfrt HJdttTEDAAAAAAAAAAAAgGvzQpkXy1y00bb2AdgxD/5lmRtlbrbRtvbpGIAd8vC/ VOZ2mVfL3Gujbe3TMUoA2BmFX0t9nelfLvN6mXfKvNfm7bbvjlECwK7k8L9R5v0y D8p83EbbKgIdowSAncjhf7PMB2UelfmszJM2n5b5yGoxUALADkyFX2f8x2W+LvN9 me/KfFXmc6MEgF2YC/83ZX4qc9XmR6uFQAkAZ25p+H8p81uZX9s2JQCcubnwf2v/ DX8cSgA4Y6Pwf2HPwq8zvgL/exhKADhjS8L/s9Xwx+Dn8RJQUehSQSWgJwaUALBR S8PvZ/0/2t/e+DEVRSwBVgLABo3C79f8Hn6F+8822o5F4J/9OCUAbNyS8CvAHv6/ wsQSiOGPx2MJcE8A2JC58PujPr/m93D/3f7mEojH/d94CXBjENiQteHvBTyGfHRM /y1PB4CNWBp+f87fK4B/2t+4GvDPfiwWgL6DEgBO7JDwTxVALIEY/lEBUALAiRwa /nyHP5eAB34Ufh9KADiBY8I/KoB/299cBlMFQAkAz9mx4Y8l4Df8YgHE8QLw8PcK gBIAniMFSEHqhT//sCeHNBdAXAVMFcDU2T9/31wJ+OvFLq2WGICVFBwF6LbVQClY j2z+zO/hjPtzAehMnwtgavnf+75RCTws867Vl43esrqCAbCSzv5a+r9i9aWdD6y+ xktBm/tVXy+wsQTyZcBo+T/6zlgCP1h9s9AnZe6XecvqykUrGFYBwEo6c960eibV Czu19H9i9TVeVzYdxjyHFMDS7/RRGek3B7os0Q+QdCmgVcBdqyVGAQArLSmAHMZR UNcUwKgEcvi1jwIArlnvEkBv79UyW9fcfv2fQ9kLq4f62AKYCv+V1UuAL61eAnxo XAIAR4k3AV+zugrQmVU32nQfYK4E4ucY/rU3AXvf1wu/ikn3KB7as5uAWsFcGICD +GPAO1afr+tJwNISGBXA2seAeUbhV1GpsFRcl8bZHzjKdZRAPvtPFYCvAvJlAOEH TuiYEshnfy+A3owuAwg/cEKHloAXgILdK4D4ORdALAHCD5zYmhKIBdA7+2vbA5/3 51UA4Qc2Ym0J5AKIwY+Tj8UCIPzAhqwpgV4BeOi134/l49rvZ/8rI/zApiwtAYU4 hjyG36/ze8e1X+HXdxB+YIOWlICW77EE/Kzv4e+VgJ/9FX59B+EHNmquBPyXgznw CnicfMzDr+8g/MCGjUogvyZ8bnzZz5kfOCNLSiA/IszBJ/zAGRuVQH46EIuA5/zA TqwtAcIP7MzSElDwCT+wQ0tKQG/x0RB+YIdGJaDA6xVeGr3Jh/ADO9QrAQVdr+7S +/set23CD+xULAH9PwYU9PtWVwMabes1XoQf2CkvAQVcQddLOxV6jbbvtWOEH9gp lYACfsvqG3vvttG29hF+YOcU8Aurq4EbbbStfYQf+B9Q0DVaEWj8MwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2/YUqukkWBINHdUAAAAASUVORK5CYII=" height="88" preserveAspectRatio="none"/> + <path fill="url(#linearGradient5)" d="M715.5381 780 L738.0381 802.5 L715.5381 825 L693.0381 802.5 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-685.0381,-772)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M715.5381 780 L738.0381 802.5 L715.5381 825 L693.0381 802.5 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient6)" d="M720.1611 813.2869 L710.9151 791.7131 M720.1611 791.7131 L710.9151 813.2869" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M720.1611 813.2869 L710.9151 791.7131 M720.1611 791.7131 L710.9151 813.2869" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="740.0381" xml:space="preserve" y="842.6016" clip-path="url(#clipPath2)" stroke="none">Wurden alle Probleme behoben?</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,642.5381,1133.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath7)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="645.5381" y="1126.3984" transform="matrix(1,0,0,1,-637.5381,-1118.3984)" clip-path="url(#clipPath2)" fill="url(#linearGradient7)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="645.5381" y="1126.3984" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="681.3105" y="1146.8008" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Einreichung</text> + <text x="696.7061" y="1160.9336" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">erneut</text> + <text x="685.667" y="1175.0664" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">versenden</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1.7734,0,0,1.7734,287.2132,329.2656)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath8)" width="276" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAAAtCAYAAABvcpSoAAADX0lEQVR4Xu2c124U URAFm2xyziAWYxACEUWOJvP/X0SX7za6Gtuza4sHNK6SjuQN1j5Nqbun70SIiIiI iIiIiIiIiIiIiIj8U/bNs3+eei0isiNKJAczh7ocmH8mIrIUCANxHM4czZyY51jm SDTJIBsRkVGQCcJAHCcz5zIXM5cy5zOnokmGakWpiMi2lExWookDkdzI3M6sZm5l rmTOhFIRkRGGMrmcmWXuZx5lHmceZO5kroZSEZFt2EomVCUPM88zrzNvMi+iyWUt cy1zNpSKiHSMyQSBvM98ynzOfMi8ilatlFSsVERkgzGZvIwmkPXMt3m+ZD5Gq1iU ioj8ZRmZIJDvmR/z8PfXaBVLLxVnKiJ7mDGZ0Ob0Mvk5CGJBKsNKRamI7EEWyYSZ SS+TX4PwHp9V+8NMpQa1vVT4DaUiMmGQCRuwYzJZjzYvoRIpifzuwms+q5lKDWqR yvCWMlLhN0VkglAxsE7PBixLa7NouyUlE+7kIIq+1ellUkKpKoXvrsdmqbD8djra ti0CE5GJUa0OlQPr9DejLa2xZ/IumkyYjfRD2Gp5hkIZDmnXowmJYS7VzixzIXM8 2jzFKkVkYnBRc3FzkVOd0OpQUTBY5a4N7UtVJzsRCv+DVBDS28zTzN1orQ9tFRWR sxSRiVFC4dQwB/1Wo92hYQMWoSCFEkpJZTdCeZa5FwpFZNJUy8MjCDg1zEG/mp/U Alu1PDsRSrU8/RwFWSEt5GXLIzJRGJAyKKVyYHDKABUBIIJ+K3aRUIZD2dpJeRKt 3ant2ZXwgUwik6UfzHLB05asRWt9Sio1SxkTSlUnfLeXCa0Ojztg6EslRHViuyMy YRZJBUEgCoRRQunDewiFVqdW8JWJyB5mGakgjL5K2UomDHSViYhskgpzj5JK3Uou qQyHsCUTbhErExHZYCiVvlJBKtX+MFOp28PKRES2ZSiVvlKpQS07JgTBKBMRGWVM KqzTs7BGEIwzExFZyFAqtD/sqXA2h4qEDVh2VtgzuR7KREQWMJQKy2+zaBKhKlmN Vr0oExFZil4qPIKAg4RUK4R1ekSjTERkaUoqrM5zOplVfcLZHB/xKCI7BqlwDgd5 HI52Boi/PZsjIrsCcRCqkYoyERERERERERERERERERH5L/kDMOdcb46a0KYAAAAA SUVORK5CYII=" height="45" preserveAspectRatio="none"/> + <path fill="url(#linearGradient8)" d="M320.4476 330 L342.9476 352.5 L320.4476 375 L297.9476 352.5 Z" clip-path="url(#clipPath2)" transform="matrix(0.5639,0,0,0.5639,-159.1335,-177.207)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M320.4476 330 L342.9476 352.5 L320.4476 375 L297.9476 352.5 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient9)" d="M325.0706 363.2869 L315.8246 341.7131 M325.0706 341.7131 L315.8246 363.2869" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M325.0706 363.2869 L315.8246 341.7131 M325.0706 341.7131 L315.8246 363.2869" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="348.9476" xml:space="preserve" y="343.6016" clip-path="url(#clipPath2)" stroke="none">Liegt die Einreichung noch vor und könnte erneut versendet werden?</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,642.5381,667)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath9)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="645.5381" y="660" transform="matrix(1,0,0,1,-637.5381,-652)" clip-path="url(#clipPath2)" fill="url(#linearGradient10)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="645.5381" y="660" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="687.7529" y="687.4688" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Korrektur</text> + <text x="682.834" y="701.6016" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">vornehmen</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,442)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath10)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="435" transform="matrix(1,0,0,1,-242.4476,-427)" clip-path="url(#clipPath2)" fill="url(#linearGradient11)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="435" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="268.39" y="462.4688" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Nächstes Problem</text> + <text x="266.9135" y="476.6016" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">in der Liste prüfen</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,667)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath11)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAAEiUlEQVR4Xu3dDW9U VRCH8alUBEQFEt7UKoKCL4kooIKiVnwB9ft/H+fJ6cSTyW27e3e3cy/3P8kvQZfu dtMnc+5tjTXTaDQajUaj0Wg0Go1Gs/7suTeSc7JYfQe0gZ1NxLfv3nTn3VsiR+iB Lugjgtza9PHxYhfdZfeue89dkcWjA3qgC/ogSLbk1kKMAC+4d9w1d9O97z4UcR+4 2+6GtT7ohF7oZuMQeYIIkNqJ7yP3qfvcfem+kkWjgS/cA3fPHViLkc3IyclG3GjY gjwRZRPgJ9Ze9Bv3xH3vfpDFowN6eGgtyDvWQuR45jpx9DaMLcgZz4plAxLgY/ej +9n9MuDXNeSPlfmJr+Nz99Q9shYiG/GqtVOUZTZqiJCKqZmqOYLZgM/coXvhfj/B H8fIf09eD79Zi5EQ2Yh33XV3yTY4kqmXuxzOdi46OfNZuWxAAsxxhT+P/HXkZYd/ jseRP1bmK0JkI3Ja3ne3rC2xfRs5cT3IDQl3P6xYzn5q5wXzJ4E+QKJ7leQY85uQ eclfPyJkSX1n7caV76BwP8GJOmr6CLkN53pwlQj7AP8+8k/354gxh5jfoMzDcRGy tIiQk3SnEfafRGzBPkDiw7/dn/sQFeHrYVIRxhaMAIkv498PbcP8xmQ+SiPsrRMh j+cIFeJ8TSLCOIrHRqgQ5608wohoWxEqxPkpizDCyRH2NyU5wFUjVIjzcuYR8mMa XjBHmL81c1qEQzcnWX6zMk1nGiE/rCbCoQ24yhaMCPM2VIjzVh5hbMD+WvCkCIe2 4UkbMb9hmZ7SCPsjGKsEOBRi/83rHGJ+wzI9ZRHma8DTjuEhEWLEOHSjkt+wTM8k IlxnA+YIw3E3KvkNy/SURdhvwbER9iHmbagI52MyEea41qEI500RSrnJR7jKUa0I 523SEUaAp4WoCOetNMIc4hAeO+nxPkDdHc9TWYT9T0oIaFPxXIpwfkoj7EVE2WmP 938nB6gI56EsQmLZhT5ARTgPpRHmYHYhv2GZnvg6nWmEvKAilBBfpzOJMP/n/fmT kWVShFJOEUo5RSjlFKGUU4RSThFKOUUo5RShlFOEUk4RSjlFKOUUoZRThFJOEUo5 RSjlFKGUU4RSThFKOUUo5RShlFOEUk4RSrnSCBWi9B2URagQlys3sNMI4ze/8+RD EYr0ET6x9pvfb9sWfvP7eWtPwpM9cI/dc/fC/n9hkWjh0P3kHrnP3E132e3byNmz VjBPcsPdcw/dU2vbkOpFwqG1Lcj/r+hrd9ddd5fcORs5e9Y++KK75g6sHclU/sza RuRFRcAGJMBvrR3F3EdcsXZJx6k6evojmW14x1qIbESOZq4RRbgGZDmxAQnwY2tb kFOU05SFNnr4YM7zC9bucgjxwNqqvW/tBYlSlo0O6IEu2IAEyOJiC44+ivvpQ6Ts q9Ze5Ja1W3DunGXZ6IAe6II+6CQC3GgL9hPXhxzNxPi2tdLZjuDbOLJM0QDh0QV9 cARvNcAYnpBrRJ6czcgLEaUILYAudhLfccMLifQ0Go1Go9FoNBqNRqPRjJr/AJps 2+JEljW9AAAAAElFTkSuQmCC" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="660" transform="matrix(1,0,0,1,-242.4476,-652)" clip-path="url(#clipPath2)" fill="url(#linearGradient12)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="660" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <path fill="url(#linearGradient13)" d="M265.4476 665 C262.9734 665 260.9676 667.0057 260.9676 669.48 C260.9676 670.8727 261.6031 672.1169 262.5999 672.9386 L262.5999 672.9386 L261.7676 673.86 Q258.0476 675 255.4476 679.02 L255.4476 685 L275.4476 685 L275.4476 679.02 Q272.8476 675 269.1276 673.86 L268.2954 672.9386 L268.2954 672.9386 C269.2921 672.1169 269.9276 670.8727 269.9276 669.48 C269.9276 667.0057 267.9218 665 265.4476 665 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M265.4476 665 C262.9734 665 260.9676 667.0057 260.9676 669.48 C260.9676 670.8727 261.6031 672.1169 262.5999 672.9386 L262.5999 672.9386 L261.7676 673.86 Q258.0476 675 255.4476 679.02 L255.4476 685 L275.4476 685 L275.4476 679.02 Q272.8476 675 269.1276 673.86 L268.2954 672.9386 L268.2954 672.9386 C269.2921 672.1169 269.9276 670.8727 269.9276 669.48 C269.9276 667.0057 267.9218 665 265.4476 665 Z" clip-path="url(#clipPath2)"/> + <path fill="none" d="M259.2476 685 L259.2476 681.32 M271.6476 685 L271.6476 681.32 M261.7676 673.86 C261.4476 678.44 269.4476 678.44 269.1276 673.86" clip-path="url(#clipPath2)"/> + <path d="M269.8942 668.934 C269.6912 667.2805 268.5875 665.8762 267.0287 665.2883 C265.47 664.7003 263.7138 665.0258 262.4693 666.1333 C261.2249 667.2408 260.6977 668.9474 261.1007 670.5638 L261.1876 670.58 C265.0476 667.06 265.8476 671.06 269.7076 668.74" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="296.3627" xml:space="preserve" y="680.4023" clip-path="url(#clipPath2)" stroke="none">System-</text> + <text x="281.1078" xml:space="preserve" y="694.5352" clip-path="url(#clipPath2)" stroke="none">administrator</text> + <text x="273.722" xml:space="preserve" y="708.668" clip-path="url(#clipPath2)" stroke="none">benachrichtigen</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,689.5381,1278.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath12)" width="59" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAAzCAYAAAApdnDeAAAEvUlEQVR4Xu3ZCY/U RhAF4AosRy5yhyQEEJlZArnJHUhgyMH//0npT+2SOi3PQZC9s8IlPa1st3f61fGq eiZiscUWW2yxl9te2YFzb0nkQsHFgpMBlxrkPc+tO3fkW4IIXSm4WvBawesFbzRw 7b7nl4f1LfGjtiRp4wgg9FbBuwXvF3xYcL3go+Gva/ffKbgWlbz3kvRREs5o2mSS RACZGwW3C1YFpwWfD7g7XH82PP9kWO8978sIKX5UUbaRjKaUfDtq1G4VrAu+KPim 4PuCHwt+auD6wfD8flSH3IxKWkb4fxx4FIRboqLxXtRIIvllVIK/FDws+KPgccGT Bq5/H57/HJU45yAt0tJfavv/CJ+Z9UQ/iBrNewXfRSWJ4Kbgz4K/Cv4egfueI/8o Kulvo6a5KHOg/3+mhH1wEiUy6k5Ufoi66U1UIv8MeLYHiCdpkZYVUpsDERZhKT17 OvtAH6ymbMSGEFWD0vJp1M23JJP0GNo13vM+h3GcTBFhKf1qnIFK+0CqS4zUKHW1 MURFpyeQJLahJ98SFuG7UWuYaMmm2dI5oyp9qe46ao3amA0m0UNI7iO8Kfgtag1r UXRBOp/EDNFNURJV/VB6fRVVjDZRN7iPqDreJlY9YesoNtFSJp9Gja4ePHl0keVV 3tUL11HTTPqmGLW1N0ayR7+uJ6wsZI3sWUUVQ1rB6ZNaKjDvqlXezqi2RHuyPcEe uwh7TqENIcTq44I3YwZl5k0pTBm1GpMPr/N+r6iHEh0j3JJ1TQvU7tdRlZ8wSuXJ yUohqbSKmsIGB5sdi2pPaB+2EeZMpSKV70Rtd5w+Wd329Xoata9KMZubkqxnnKq9 raOqcvbcSSzJZsvR+9RRT/b/Et1F2H2qzLmczNmTilTbX51HDRLIbmJespw8C9lD IvsihMeI9mRniyyybc2qIZuYg6yaJYirqAKpZicTKMaTqcbGN+fPXWr8PIS3EYV2 sKDGWt+kasyQzVFRv9P3HMdsxqb6uj2UcL++Jep6U/Br1NHUiKrPGm4m7bM5Qfly zCnEedPcuqtu9xHu1/VRtSbrlSi2E9Sk1tatXreKmso5RfURGcM2kmNkXZueZE+e fLJeL8YM5kPyLOsUYj5uo9tv9nkwFlWaQPVlkXk8z7STpnBa22+psujyOu9vYnzT Pakx9O8gyoFq1QxOmPLEcxIzmugaxHlZ7eq52kIe4Mc235PbRjKJbqI6kAKfRh1k aIWoTqrCvWXtqh1tgEI6fm37su1QIK/22y/diJJyUTbKh6NnSeHWePdSVLHKL90Q tkHHMQpq4ylGPbGWIFgnK7wndQlfEuXQTN/ZiaZlK0rCIiyl1TDREmVRQiKJ93A/ SYomMVKjp/Ffohw7a/r2xstthG1MDWsRVFp0kBZp59H8VSDhmkM8R5KTqC4x0k8N L0dBNK0lrIaJlh4sKpRaapu0CI2aNhwkpLz7JiPrOEl7obrESI1K3aMg2lqKFpUW ZYKCtEirZ9FaR01Pqe4vZ7gv/UUSyfxBS3mciRgdahnlJG3TRjvE1TTyenPCtfue W2f9Uf5Uucta0tIbASmOjKjnL+4gVT23TiTPDckxS+KATI98dm4JLrbYYosttthg /wKSX8ay1v4aNwAAAABJRU5ErkJggg==" height="51" preserveAspectRatio="none"/> + <circle transform="matrix(1,0,0,1,-684.5381,-1263.3984)" clip-path="url(#clipPath2)" fill="url(#linearGradient14)" image-rendering="auto" r="13.75" cx="715.5381" cy="1286.3984" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(177,31,31)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(177,31,31)" stroke-width="3" stroke-miterlimit="1.45"> + <circle fill="none" r="13.75" clip-path="url(#clipPath2)" cx="715.5381" cy="1286.3984"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1.1953,0,0,1.1953,292.9945,537.9141)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath13)" width="276" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAABMCAYAAACs2khXAAAEX0lEQVR4Xu3ceY8U VRRA8SuLghuyuMYFcASCu3FfWxRUvv8H4p5UX3nzpqq7ipDQTJ1fcjNDG/SvPr73 qvtFSJIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSXrmXuhG khYjHmdyzuaca4bXDIuk2Som53NeyrmY8/L254sxRMaoSNqLUBAMwkFELuVcybma cznntZwLMaxWjIqkSW1MXokhJO/mfJjzUc77OW/FEBmjImlSG5NXY1iREJCjnLs5 n+Xcybme83YYFUkTpmJyK+fLnG9zvs/5JufTnJs574RRkdQZi8kHObdzvsr5MefX nN9yfo4hLqxWjIqkY3bF5Oucn3J+z/kz517OJueXnO/CqEhqzI0JIflrO0ZF0glz YvJHPI7J383w500M2yCjIq3c3Jj0IWHub3/yz9gGGRVpxZbEhHg82P4cG8JiVKSV WhqTf7bTRoXfmXrdqEgrtCsmPBpuz0wqHBWUikf/Wr1eZyoe1EorsC8mfM6knubU OQmx+Hc7fUTa12v1YlSkFZgbE7YtFZNaoVQ4pqYNCn/XR8rSKbYkJvVEpw1KrUb+ 62YqKPw7jIp0CrUx4VvD/QHsWExq5gSljUkFxahIp9SZGC5HqpjwRb9ambQfp+9j 0q9SKigPtzMWlP7v91Gp7/7ciOFbyq/HcGkTwTMq0oHjTcoKgNvV3sh5L+eTmN7m 9NNve5YGZSoqfEv5es6bMWzBWD0RPkkHrFYnvGl587Iy+Dznhzj+3Zw+AH1U+m1P G5Sx7c7Y8N/icTTfUubqgzsxrJa4+Y2tD6sUSQeMoPB/f7YWnFuwOuHchDf1Jk7G YyoozJKg9P+Oeo3VEFcfcJ8KWx9ufmMbxvWS50LSQaugcPcrQTmKkx9eG3vz9zF5 GiuUCkp9kpZtTwWFLZkrFOnAcYbClocD2WsxvIG5wpFzDM4zNrE7Kk8rKBUTtlmc 3RA1Vkuc6fC0h4NZz1CkA1ePjHnDsu3hyQrnKGw3WCXsi0oflHpcvPRQtmLCyogt F0+ZeHTdbnd8yiM9B+pJDwefrAbY+tyM/VGpmFRQanXSzr6gjMWEw9iKCSsnn/BI z5kniUq/OpkKylRUjIl0ii2JylRQpqYPijGRVmBfVHgCs4njqxRi0Qdl7M8VFGMi rciSqPRBqd9r1dK+zmtEiBWOMZFWZE5UWGUQiDYe/N5O+3qtToyJtEJLo1LTP/1p Y8KH5YyJtFJLotKGpJ06hDUmkmZHZeyDb3VmYkwk/W9OVDZx/HMq/PQAVtKoJVFh fDQsaad9UeHDb2xvGK4hMCaSdtoVFb6lTES4T4VLmvov+hkTSSdMRYWrD7h6gJB8 EcZE0kx9VLj6gPtUjnJu5XwcwxWOxkTSLG1UuE+FeLBa4WIkAnM5jImkBYjK2Rgu aeIyJK6TJC785OrG82FMJC1QUWG1wmqEIST82ZhIeiKEhYAw/M5IkiRJkiRJkiRJ kp6ZR5S3zHhlfnmdAAAAAElFTkSuQmCC" height="76" preserveAspectRatio="none"/> + <path fill="url(#linearGradient15)" d="M320.4476 555 L342.9476 577.5 L320.4476 600 L297.9476 577.5 Z" clip-path="url(#clipPath2)" transform="matrix(0.8366,0,0,0.8366,-240.9366,-437.4706)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M320.4476 555 L342.9476 577.5 L320.4476 600 L297.9476 577.5 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient16)" d="M325.0706 588.2869 L315.8246 566.7131 M325.0706 566.7131 L315.8246 588.2869" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M325.0706 588.2869 L315.8246 566.7131 M325.0706 566.7131 L315.8246 588.2869" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="344.9476" xml:space="preserve" y="546.4688" clip-path="url(#clipPath2)" stroke="none">Kann eine automatische Korrektur erfolgen?</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,7,895.1992)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath14)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAAEEUlEQVR4Xu3dC28V VRRA4VOpCIgKJLzUKg/loYkooIKiVhSf////uFdOTzw5tlLmTtkzuWsnX0jg9o5N F/vMNGpLcRzHcRzHcRzHcRzn1WcnvDE4pa3Vd0AbOLFp8e2GN8Pp8JZ0gB7ogj5a kLNNHx8XOxvOh3fDe+GCth4d0ANd0AdBsiVnC7EFeCa8Ey6Fq+H98KEUPgjXw5VS +6ATeqGbjUPkDVqA1E58H4VPwr3wWfhcW40G7oe74XbYKzVGNiMnJxtxo2EL8kaU TYA3S73ol+Fx+CZ8q61HB/TwoNQgb5QaIscz94mTt2HbgpzxrFg2IAE+Ct+FH8KP 2no/Hfz6LDwJD0sNkY14sdRTlGU2aYiQiqmZqjmC2YBPw354Hn6RDvxcaoyEyEa8 FS6Hc2WDI5l6ecrhbOemkzOflcsGJMBfpU4LkY3IaXknXCt1ie2WidPuB3kg4emH FcvZT+1c8EX57z/I3Ma/bVqW8WtFhCypr0t9cOU7KDxPcKJOmj5CHsO5HzRCjfqv VR8hS4sIOUlnjZAnIW5EuWCLkF/nYoTrlBJhH99vnd9fUf+xh4U4frJaptQI+/D+ GPz5P/rXjUH2IY6frJYpLcJ++43R/XUMY5AtxH4jjp+slik1wj7AMbLm7874Z+N2 7EM0wvVIj/CoAPv4RuNrW4hGuE6pEfZb8LC4xiDH3x9DNMJ1WlSEx4mtGV9vhOu1 yAhfFuJhrzXC9VpshEeFOL7GCNdv0REelxGumxEqnREqXWqERPOyb1YfBx/vN6vX Kz3CFuKm+gCNcF3SIiQUoulj3MQYoBGuR2qEc2vxGeG6pEY4RjO38ZPVMrWv1WuJ kH+9nwi5oBGqaV+r1xZh+29MjESNESqdESqdESqdESqdESqdESqdESqdESqdESqd ESqdESqdESqdESqdESqdESqdESqdESqdESqdESqdESqdESqdESqdESqdESqdESqd ESpdaoSGqL6DtAgNcXuNDZxohO0nv/Pmh0Uo9RE+LvUnv18vM/zk99Olvglvdjc8 Cs/C8/LvhaXWwn74PjwMn4ar4XzYLRNnp9SCeZMr4XZ4EJ6Uug2pXmr2S92C/I9U vwi3wuVwLpwqE2en1A8+Gy6FvVKPZCp/WupG5KIS2IAE+FWpRzHPERdKvaXjVJ08 /ZHMNrxRaohsRI5m7hEl7gFZTmxAAvy41C3IKcppykKbPHww5/mZUp9yCHGv1FV7 p9QLEqW2Gx3QA12wAQmQxcUWnHwU99OHSNkXS73ItVIfwXly1najA3qgC/qgkxbg Rluwn3Z/yNFMjG+XWjrbEXwbR9upNUB4dEEfHMGzBtiGN+QekTdnM3IhopRoAXRx IvEdNVxI6jmO4ziO4ziO4ziOM2n+AbUQ2fs+27frAAAAAElFTkSuQmCC" height="81" preserveAspectRatio="none"/> + <rect x="10" y="888.1992" transform="matrix(1,0,0,1,-2,-880.1992)" clip-path="url(#clipPath2)" fill="url(#linearGradient17)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="10" y="888.1992" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path d="M15 896.5292 L25 903.1992 L35 896.5292 ZM15 897.7943 L15 909.8693 L35 909.8693 L35 897.7943 L25 904.4642 L15 897.7943 Z" stroke="none" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="43.8447" xml:space="preserve" y="908.6016" clip-path="url(#clipPath2)" stroke="none">FIT-Connect</text> + <text x="43.4141" xml:space="preserve" y="922.7344" clip-path="url(#clipPath2)" stroke="none">Service Desk</text> + <text x="43.1768" xml:space="preserve" y="936.8672" clip-path="url(#clipPath2)" stroke="none">kontaktieren</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1.1094,0,0,1.1094,293.8539,785.9062)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath15)" width="276" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAAA9CAYAAABspJYzAAAEXklEQVR4Xu2daW/U MBRFHxQoZd83Ifa2CBCbALEz7Mv//0G8i/PAWE7itBIaJudIV9PJSOmnOb22o1cz AAAAAAAAAAAAAAAAAACAf8oez17PWveq6BoAQDMhkn2eA571LvstyQWpAEATkoWk IZFseI56jnuOeQ5bEotEg1QAYJBcJpLHSc95zyXPRc8ZS2I5aEgFAAYImaiBHLEk j8uem54tz6bnqiXBqLEgFQCoUpPJFc+2577nseeh547nhueCIRUAqNAnk9ueR57n nleeF54nnnuGVACgwpBM1EokkbeeheedJbE8NaQCAAUtMpFEPng+dq8Lz2tDKgCQ MSaTl/a3TD510c8LQyoA0DFFJiGSPEgFAH7RIpOF/d1K8nzuXvX5e0MqALNlikwk ji/da5m4LrEgFYAZ0iITLXNCJl+7lFLReyU+QyoAM2OqTEIY37rXkEguk/wz9lQA ZsKYTPKjYbWNXBiRaCuR/Ho0mJAKz6kArChTZVK2k5pUymv5foruszCkArByTJFJ nOjk+yQhj+9dSsHUhKL7IBWAFWMnMhkTSp5SJiEUpAKwYoRMDtg0mdSk0iqU8h5I BWBF2Gt/hiNNlUkpFElDAvmRJYRSayd9UilPfzRPRUOa1KAkP6QCsIToi6m/+hrb qElrGo60bWkEwZBMWpY9uVCG2kl537ypaPTBXc81z1lLDWq/JQkCwJIR7UQzYNUC bloajqR5JhpB0CeT8lpt2RNC6Vvu1O4T0e+VzPS8i5qSGpNkd8LS0kctBQCWDAlF ywjtUWj+65aldqJ2sLD6F74mgt0IpbxXfPbe88bzzFJL0SjJ05baFEIBWEKioWh/ Qpufm5bGNg4td+ILv1uh1O5TCiX2UjRGUns7pwyhACwt2kPRnkRsyKoF6MurvYto KX1SKWWi7HYPJZeJllxaej3w3LLUoGJjlj0UgCUkf/5EX1bto1y3dLqiZtAilbyd xClPKZSWU56aTNSWtAzT/onaySHj6BhgqYmTHm12ai9FS58b1i6VmlBCJrlQxlpK TSY6cZJMtHeiFqU2RTsBWHJ2KpVSJrHcKTMmFGQCsGLsRCpThNInFWQCsKJMkUqf UIZSCgWZAKw4Y1LRUe7C/rSUmkz0Pk9NKMgEYCZMkYrkkIsjfpY4Qjb5Z7omESET gBnRIhVJIW8puUjy5G1FAtKSCZkAzIwpUom9lFjS5MmvIxOAGTNVKpE4xcnfh0z0 aD8yAZgpLVJZWP3BN0XXaSYA8JtWqUgcuVg4zQGAKmNSKR9+QyYAMEiLVDT6QCJB JgAwypBUNPpAk9Y0HEnLIGQCAKP0SUXT1TS2UZPW1Fg0z2TLkAkAjFBKRfNUrlma ASuxKJuGTACgkVwqGtJ0zpJANP1NYxs1aU3DkZAJADSRS0X/6kL/kkONRFFz0aQ1 ZAIAzUgqa5bEIbFsdFm3JBtkAgCTkFQkDoklove6DgAAAAAAAAAAAAAAAAAAAAD/ Lz8B0ETtdsb9DBEAAAAASUVORK5CYII=" height="61" preserveAspectRatio="none"/> + <path fill="url(#linearGradient18)" d="M320.4476 780 L342.9476 802.5 L320.4476 825 L297.9476 802.5 Z" clip-path="url(#clipPath2)" transform="matrix(0.9014,0,0,0.9014,-260.3753,-694.9014)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M320.4476 780 L342.9476 802.5 L320.4476 825 L297.9476 802.5 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient19)" d="M325.0706 813.2869 L315.8246 791.7131 M325.0706 791.7131 L315.8246 813.2869" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M325.0706 813.2869 L315.8246 791.7131 M325.0706 791.7131 L315.8246 813.2869" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="348.9476" xml:space="preserve" y="820.4688" clip-path="url(#clipPath2)" stroke="none">Kann eine manuelle Korrektur erfolgen?</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,92.0004,1018.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath16)" width="268" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQwAAABCCAYAAACiqeg7AAAEoklEQVR4Xu2daW8U RxCGK8FgQu6TnBIkJkEid5SDnJuEnP//B6VeusuUyjM7s94YPDvPI73yzLTZ/dSP q7uXWjMAAAAAAAAAAAAAAAAAAACARfOU52nPlR5d6xkAwCkhiiPPNc9xj671TGMA AA9loWriqucZz/OeF3ue6880hjQAVk7IQpXEs56XPTc9b/e84XnJc8OQBsCqybJQ JfGq5x3P+56Pem5bE4dEgjQAVkqVxWue9zwfej71fNnziefEmkiQBsAKGZOFKorP Pd96fvB87/nGmkDuGNIAWB3bZPGF577nZ8+m5ydrAvnMkAbAqpgri189v/foGmkA rIy5svjNmige9CANgJVxXlkgDYCVMSaLu/ZIFr9Yk0UVBdIAWBFzZRFVxR/9Z42e x5jEomoEaQAcELvIQjL4s6dKI2QR40gD4MAYk0Xes8iy+CslpJGjZ3k8pMHyBGDh zJVF7FmEDP7uP6s08nj8TkiDPQ2ABTNHFnEaEsuNKoQshW1j+rdshAIslF1lMSWM nDoWwtBrIA2AhTFXFprY+URkSBj/pOsqiyFhIA2ABXEeWQydgGRhZGnk+yFZIA2A hbCPLKowopoIQdRMCQNpAFxi9pVFlkYVxr89cR3CCFmMCQNpAFxSNOEkC7XVU6es ubKo97XKyMKIzKku6nsMSSM6d6lH6JE16QHABaOJpgmniacJ+K61TllzZBEZE4bk MCaMWl3U16rvlaWhJjwnnresNRc+tlYhAcAFE9WFunvf9HxgbUJ+Z+P/6zTLoo5l aQwtS8aWI2Ovl8c3nh89X3s+9tzyvG6tMjoyqgyAC0d/ma9b6+atvYG7nq+stdXb 2NkJXGVRJ/mUMIaWI/W16ntGJC99slSVj9r/aWnypjXZSXoIA+CCqcLQ3oUa9mZh 1Am8bXJPCWOfCgNhADxhxpYk2ivQnkHsX9SJPDTBQwL7CKOKIiJZbKyJTEuSe9aW JDrRYUkC8Jiom56qMrTpqdMI7WNMSSPfZ1nsuuk5lqgsNtb2L9R5XF9XILGpumDT E+AxoyrjqrW/1K/Yo5MSlf1T0tgmjH2PVbfJQickWkZxrArwBPg/pFGri7ocmVqW zJHFiSELgEvBPtKo1UUIYyhTVQayAFgI55VGCCNkkYUxdJ+FkaWBLAAWxi7SyMLI 1UUIIq7z8/wsVxnIAmCh7CqNIWGEFHLqWBYGsgBYMHOlsU0YepaTx0MYUV1sDFkA LJopaeRWfSGEnLxPkYUR43ouWUg8yALgAJgrjSyFqChCFlUaubpAFgAHxi7SyJEQ IlkaMSZZaGmDLAAOjLnSyJIYSyxDQha5xwWyADgQ5kijHrnW1A1OZAFwwExJY+zD XXzOAmCl7CoNZAGwcuZKQ6JAFgCwVRrRhEddshQ1v0EWACtnTBpqwiNB3O9Rpyz6 WQDAGWmoc9cda9299ZUFqjjuGbIAgE6Vhr5s6LY1cSi3rLXVQxYA8JCQxg1rYtD3 hqiiUHStHpzIAgBOkTQkhOvWqo0XenR93MeQBQCcIiFcsVZtXOvRtZ4hCwA4g8Sg qOJQ4h4AAAAAAAAAAAAAAAAAAC4X/wGhVCTFVAsVQwAAAABJRU5ErkJggg==" height="66" preserveAspectRatio="none"/> + <path fill="url(#linearGradient20)" d="M320.4476 1011.3984 L342.9476 1033.8984 L320.4476 1056.3984 L297.9476 1033.8984 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-87.0004,-1003.3984)" stroke="none" image-rendering="auto"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(227,139,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(227,139,0)" stroke-miterlimit="1.45"> + <path fill="none" d="M320.4476 1011.3984 L342.9476 1033.8984 L320.4476 1056.3984 L297.9476 1033.8984 Z" clip-path="url(#clipPath2)"/> + <path fill="url(#linearGradient21)" d="M325.0706 1044.6854 L315.8246 1023.1115 M325.0706 1023.1115 L315.8246 1044.6854" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-width="3" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M325.0706 1044.6854 L315.8246 1023.1115 M325.0706 1023.1115 L315.8246 1044.6854" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="97.0004" xml:space="preserve" y="1025" clip-path="url(#clipPath2)" stroke="none">Ist ein erneuter Versand möglich?</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,895.1992)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath17)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAAENElEQVR4Xu3dCU8U SxSG4YOigiuQCG64gLuJuOC+4b79///jeVNULCsDAz0Dp8v+TvLE3JswzYT3nurG q5hpNBqNRqPRaDQajUaj2f/MuCOVozJYZQe0gQObHN+sO+aOuxMi2+iBLugjBzm1 KePjYvPutDvrzrkFGTw6oAe6oA+CZEtOLcQc4Jw745bcirvkroi4y+6iW7bUB53Q C91MHCIvkAOkduK76m66u+6+eyCDRgP33B237lYtxchm5ORkI040bEFeiLIJ8Ial iz5ym+65eyGDRwf0sGEpyOuWQuR45j6x8zbMW5AznhXLBiTAp+61e+fey+B92P71 rXvpnlgKkY24aOkUZZl1GiKkYmqmao5gNuArt+U+uc8i2z5aipEQ2Yhr7rw7aRMc ydTLUw5nOzednPmsXDYgAX4RKeQQ2YiclrfdBUtLbNY6Tr4f5IGEpx9WLGc/tXPB +pPoqv4vStpRfx2JkCX1zNKDK99B4XmCE7XTlBHyGM79YBnhV/v3k+Cfd1PHtxf1 m5b+Kb9WZYQsLSLkJJ1qhDwJcSOao8u/4tsYXYKs37D0U2iEOb7vI/wY8e/qGMcF Wb9Z6aewCPOGy8H9HCNHudN2HBVk/Waln0IjLAP8NUYOsd6QdZCKsD1hEdYB/h6j jLEMst6QZYj1m5V+aibCMsRRQZb3jIqwLU1FWKuPal5TEban6QjLEBVhu/6LCPMm 1HHcpt5E2DVERdi+3kRYx7VXOUI9mLSrNxHmEPcT5G5bUBG2o9kI88fs9O0ZRdiO 0AhHhbhXfEy9BXUUtykswvzbdmWI+1FvQG3BdoVFSDT5t9pyjPu1U4CKsC2hEZZy kHtVfqwCbFtohGU4dZTj1OEpwHYdaoT87/1EyAV3C2kS9RuU/stft0OLsPyDTvUn I8OkCCWcIpRwilDCKUIJpwglnCKUcIpQwilCCacIJZwilHCKUMIpQgmnCCWcIpRw ilDCKUIJpwglnCKUcIpQwilCCacIJZwilHCKUMIpQgmnCCWcIpRwoREqRCk7CItQ IQ5X3cCBRph/8jsvPipCkTLCTUs/+f2iTeEnvx+39CK82B331L11n+zvhUVyC1vu jXvibrkVd9rNWseZsVQwL7Ls1t2Ge2lpG1K9SLZlaQvyF6k+dGvuvDvpjlrHmbH0 wfNuya1aOpKp/JWljchFRcAGJMDHlo5iniMWLN3Scap2nvJIZhtetxQiG5GjmXtE Ee4BWU5sQAK8ZmkLcopymrLQOg8fzHk+Z+kphxBXLa3a25YuSJQybHRAD3TBBiRA FhdbsPNRXE4ZImUvWrrIBUuP4Dw5y7DRAT3QBX3QSQ5woi1YTr4/5GgmxlOWSmc7 gm/jyDDlBgiPLuiDI3iqAebhBblH5MXZjFyIKEVoAXRxIPHtNFxIpKTRaDQajUaj 0Wg0Go2m0/wBkJ7Zqp6dStoAAAAASUVORK5CYII=" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="888.1992" transform="matrix(1,0,0,1,-242.4476,-880.1992)" clip-path="url(#clipPath2)" fill="url(#linearGradient22)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="888.1992" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <path fill="url(#linearGradient23)" d="M255.4476 899.3242 Q256.1854 897.3542 258.3788 896.7192 L267.0926 896.7192 Q267.4515 898.2096 264.4406 899.3242 L260.7516 899.3242 L274.3906 899.3242 Q275.3876 900.6202 274.3906 901.9032 L264.8593 901.9032 L273.6927 901.9032 Q274.6897 903.1992 273.6927 904.4952 L266.0358 904.4952 L272.9749 904.4952 Q273.9719 905.7783 272.9749 907.0743 L265.4575 907.0743 L271.3199 907.0743 Q272.3368 908.3832 271.3199 909.6792 L257.2023 909.6792 Q255.8863 909.2386 255.4476 907.9037 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M255.4476 899.3242 Q256.1854 897.3542 258.3788 896.7192 L267.0926 896.7192 Q267.4515 898.2096 264.4406 899.3242 L260.7516 899.3242 L274.3906 899.3242 Q275.3876 900.6202 274.3906 901.9032 L264.8593 901.9032 L273.6927 901.9032 Q274.6897 903.1992 273.6927 904.4952 L266.0358 904.4952 L272.9749 904.4952 Q273.9719 905.7783 272.9749 907.0743 L265.4575 907.0743 L271.3199 907.0743 Q272.3368 908.3832 271.3199 909.6792 L257.2023 909.6792 Q255.8863 909.2386 255.4476 907.9037 Z" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="294.3646" xml:space="preserve" y="908.6016" clip-path="url(#clipPath2)" stroke="none">Manuelle</text> + <text x="292.6625" xml:space="preserve" y="922.7344" clip-path="url(#clipPath2)" stroke="none">Korrektur</text> + <text x="287.7435" xml:space="preserve" y="936.8672" clip-path="url(#clipPath2)" stroke="none">vornehmen</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,447.4479,892)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath18)" width="271" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ8AAABXCAYAAAAahcAQAAADwElEQVR4Xu3Y245U VRQF0N3cRLkICIK0aIvKRUARRJSLNCr//0uumV0VOx2fVp9TicmYyUg99dpdD3vW OmcMERERERERERERERERWT97G6eOOL2QozNjexawW4snQ3PJz5Rz5aOVZHacHfMs YHeO/pgvUiTb4sil/qRcKp+WKwvLzMtjzr9YLox5HrC+j8v5MX/E8+OdO3+iAjla HLnQ18rNcrt8We5sPpewP+bcW+XzcqNcB3bis3J1zB/wlEnufO5+OymPrDMZluLI Bb9b7pcfyqOFZFY8KPfK9+XbjZwHrOtgzGUgP94pkdz5bCDt7ePU+HfryMaRQx6X Z+XX8nIhmRUvyvMx5/+88RRY1U/lSXk45h1PgWQDySNMOqCV/GEGZFAeKbJx5GK/ Kn+Ud5vPpbwtbzZeb+QsYD2/j/kjnrudAskGku0j70BOXB55mZn3Enm0yIaQi/5n +WshmbX1HtipwzF/uFMg2UAOxnwHkpeoJy6PK2O2Ud5P5IBsHH+XD5vPNR0vGmBZ +dHOnc4GkkeYb8aC5fFfm0cOdbnh/095AC3KA2hRHkCL8gBalAfQojyAFuUBtCgP oEV5AC3KA2hRHkCL8gBalAfQojyAFuUBtCgPoEV5AC3KA2hRHkCL8gBalAfQojyA FuUBtCgPoEV5AC3KA2hRHkCL8gBalAfQojyAFuUBtCgPoEV5AC3KA2hRHkCL8gBa lAfQojyAFuUBtCgPoEV5AC3KA2hRHkCL8gBalAfQojyAFuUBtCgPoEV5AC3KA2hR HkCL8gBalAfQojyAFuUBtOykPB6Vl2MelEM/jFkgazr+RYFl7bw8crGXLI/jXwjY jZ2Ux/ax5e2YB24PXtL7Yw6BVaU4cqezGDwpB2PB8rhc9suD8ry8HvPAw4VkVuRd SuSLvNnIWcC6fhvzbmdBuFOulvPjhOVxrlwqt8p35cfyYswV59VCMivyBbLZZP4v Y34ZYF3PytMxX0vkjn8x5tNGFod2eeyVs+VCuV6+KvfK4zGfjXLgEjIrpZSVKV/g 4Zhbzv0xzwPWldLIu479MR9Zcudz99MBreQPT4/ZQNk+bow5/OsxD7q7+VzCwZhz szLljNtjNmA2HmBdN8e833lcuTjmnc/d3xsnSNaWM2M+/2Ro1plrY7bTkjIz//iV Mc/Ie5YUFrCu3OvItpGXpOfGAsWxTQokw7LGpJFSJDlkSZkZmZ9/PnIesBtZEnLP c98XKY5tMiwyeFsmS9nO3NqeBeyWiIiIiIiIiIiIiIiI7Cz/AIIrC3Xd4klmAAAA AElFTkSuQmCC" height="87" preserveAspectRatio="none"/> + </g> + <g transform="matrix(1,0,0,1,5,15)" fill-opacity="0.902" fill="rgb(255,255,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,255,255)" stroke-opacity="0.902"> + <rect x="450.4479" width="250.0898" height="66.3984" y="885" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M475.4569 885 L450.4479 885 L450.4479 951.3984 L475.4569 951.3984" clip-path="url(#clipPath2)"/> + <text x="497.9294" xml:space="preserve" y="908.6016" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">Hierbei handelt es sich um</text> + <text x="462.4479" xml:space="preserve" y="922.7344" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">Änderungen an der Konfiguration oder</text> + <text x="482.8649" xml:space="preserve" y="936.8672" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">Fehlerkorrekturen der Software.</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,1123.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath19)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABlCAYAAAAlKIMUAAAESUlEQVR4Xu3bDW8W RRRA4alUBAQFEr7EKoICaiIKKKCoFb/1//8f78l04mRspez7lrubPTd5QqJvd216 vLPbaCmO4ziO4ziO4ziO47z67IQ3Bqe0Wn0HtIETmxbfbngznA5vSQfogS7oowW5 tenj42Znw/nwTng3XNTq0QE90AV9ECRbcmshtgDPhAvhcrgW3gvvS+FmuBGultoH ndAL3WwcIhdoAVI78X0QPg73w2fhc60aDXwa7oU7Ya/UGNmMnJxsxI2GLciFKJsA Pyr1pl+Gx+Gb8ESrRwf08KDUIG+VGiLHM8+Jk7dh24Kc8axYNiABPgrfhu/DD1q9 Hw/+fB6ehoelhshGvFTqKcoymzRESMXUTNUcwWzAZ2E/vAg/Swd+KjVGQmQj3g5X wrmywZFMvbzlcLbz0MmZz8plAxLgL1KnhchG5LS8G66XusR2y8Rpz4O8kPD2w4rl 7Kd2bvhr+e8/yLaN/7ZpXsafFRGypL4u9cWV36DwPsGJOmn6CHkN53nQCDXqf1Z9 hCwtIuQk3WqEvAnxIMoNW4T8uS1GuEwpEfbx/db5/RX1X3tYiOM3q3lKjbAP74/B n/+j/9wYZB/i+M1qntIi7LffGN1fxzAG2ULsN+L4zWqeUiPsAxwja/7ujH9v3I59 iEa4HOkRHhVgH99o/GwL0QiXKTXCfgseFtcY5PjXxxCNcJlmFeFxYmvGzxvhcs0y wpeFeNhnjXC5ZhvhUSGOnzHC5Zt1hMdlhMtmhEpnhEqXGiHRvOyX1cfB1/vL6uVK j7CFuKk+QCNclrQICYVo+hg3MQZohMuRGuG2tfiMcFlSIxyj2bbxm9U8tZ/Va4mQ /7yfCLmhEappP6vXFmH7f0yMRI0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0R Kp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0R Kp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0RKp0R Kp0RKp0RKp0RKp0RKl1qhIaovoO0CA1xvcYGTjTCm6VelIsfFqHUR/g43A83woWy YYSnS70IF7sXHoXn4UX598ZSa2E/fBcehk/CtXA+7JaJs1NqwVzkargTHoSnpW5D qpea/VK34JPwRbgdroRz4VSZODulfvHZcDnslXokU/mzUjciN5XABiTAr0o9inmP uFjqIx2n6uTpj2S24a1SQ2QjcjTzjCjxDMhyYgMS4IelbkFOUU5TFtrk4Ys5z8+U +pZDiHulrtq7pd6QKLVudEAPdMEGJEAWF1tw8lHcTx8iZV8q9SbXS30F581Z60YH 9EAX9EEnLcCNtmA/7fmQo5kY3y61dLYj+DWO1qk1QHh0QR8cwVsNsA0X5BmRi7MZ uRFRSrQAujiR+I4abiT1HMdxHMdxHMdxHMeZNP8AAJq81MLlK2oAAAAASUVORK5C YII=" height="101" preserveAspectRatio="none"/> + <rect x="250.4476" y="1116.3984" transform="matrix(1,0,0,1,-242.4476,-1108.3984)" clip-path="url(#clipPath2)" fill="url(#linearGradient24)" width="140" image-rendering="auto" rx="4" ry="4" height="80" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="1116.3984" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="80"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path d="M255.4476 1124.7284 L265.4476 1131.3984 L275.4476 1124.7284 ZM255.4476 1125.9934 L255.4476 1138.0684 L275.4476 1138.0684 L275.4476 1125.9934 L265.4476 1132.6635 L255.4476 1125.9934 Z" stroke="none" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="300.8099" xml:space="preserve" y="1139.7344" clip-path="url(#clipPath2)" stroke="none">Nutzer</text> + <text x="269.4388" xml:space="preserve" y="1153.8672" clip-path="url(#clipPath2)" stroke="none">informieren, dass</text> + <text x="275.4681" xml:space="preserve" y="1168" clip-path="url(#clipPath2)" stroke="none">die Einreichung</text> + <text x="267.7103" xml:space="preserve" y="1182.1328" clip-path="url(#clipPath2)" stroke="none">fehlgeschlagen ist</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,294.4476,1503.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath20)" width="59" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAAzCAYAAAApdnDeAAAEvUlEQVR4Xu3ZCY/U RhAF4AosRy5yhyQEEJlZArnJHUhgyMH//0npT+2SOi3PQZC9s8IlPa1st3f61fGq eiZiscUWW2yxl9te2YFzb0nkQsHFgpMBlxrkPc+tO3fkW4IIXSm4WvBawesFbzRw 7b7nl4f1LfGjtiRp4wgg9FbBuwXvF3xYcL3go+Gva/ffKbgWlbz3kvRREs5o2mSS RACZGwW3C1YFpwWfD7g7XH82PP9kWO8978sIKX5UUbaRjKaUfDtq1G4VrAu+KPim 4PuCHwt+auD6wfD8flSH3IxKWkb4fxx4FIRboqLxXtRIIvllVIK/FDws+KPgccGT Bq5/H57/HJU45yAt0tJfavv/CJ+Z9UQ/iBrNewXfRSWJ4Kbgz4K/Cv4egfueI/8o Kulvo6a5KHOg/3+mhH1wEiUy6k5Ufoi66U1UIv8MeLYHiCdpkZYVUpsDERZhKT17 OvtAH6ymbMSGEFWD0vJp1M23JJP0GNo13vM+h3GcTBFhKf1qnIFK+0CqS4zUKHW1 MURFpyeQJLahJ98SFuG7UWuYaMmm2dI5oyp9qe46ao3amA0m0UNI7iO8Kfgtag1r UXRBOp/EDNFNURJV/VB6fRVVjDZRN7iPqDreJlY9YesoNtFSJp9Gja4ePHl0keVV 3tUL11HTTPqmGLW1N0ayR7+uJ6wsZI3sWUUVQ1rB6ZNaKjDvqlXezqi2RHuyPcEe uwh7TqENIcTq44I3YwZl5k0pTBm1GpMPr/N+r6iHEh0j3JJ1TQvU7tdRlZ8wSuXJ yUohqbSKmsIGB5sdi2pPaB+2EeZMpSKV70Rtd5w+Wd329Xoata9KMZubkqxnnKq9 raOqcvbcSSzJZsvR+9RRT/b/Et1F2H2qzLmczNmTilTbX51HDRLIbmJespw8C9lD IvsihMeI9mRniyyybc2qIZuYg6yaJYirqAKpZicTKMaTqcbGN+fPXWr8PIS3EYV2 sKDGWt+kasyQzVFRv9P3HMdsxqb6uj2UcL++Jep6U/Br1NHUiKrPGm4m7bM5Qfly zCnEedPcuqtu9xHu1/VRtSbrlSi2E9Sk1tatXreKmso5RfURGcM2kmNkXZueZE+e fLJeL8YM5kPyLOsUYj5uo9tv9nkwFlWaQPVlkXk8z7STpnBa22+psujyOu9vYnzT Pakx9O8gyoFq1QxOmPLEcxIzmugaxHlZ7eq52kIe4Mc235PbRjKJbqI6kAKfRh1k aIWoTqrCvWXtqh1tgEI6fm37su1QIK/22y/diJJyUTbKh6NnSeHWePdSVLHKL90Q tkHHMQpq4ylGPbGWIFgnK7wndQlfEuXQTN/ZiaZlK0rCIiyl1TDREmVRQiKJ93A/ SYomMVKjp/Ffohw7a/r2xstthG1MDWsRVFp0kBZp59H8VSDhmkM8R5KTqC4x0k8N L0dBNK0lrIaJlh4sKpRaapu0CI2aNhwkpLz7JiPrOEl7obrESI1K3aMg2lqKFpUW ZYKCtEirZ9FaR01Pqe4vZ7gv/UUSyfxBS3mciRgdahnlJG3TRjvE1TTyenPCtfue W2f9Uf5Uucta0tIbASmOjKjnL+4gVT23TiTPDckxS+KATI98dm4JLrbYYosttthg /wKSX8ay1v4aNwAAAABJRU5ErkJggg==" height="51" preserveAspectRatio="none"/> + <circle transform="matrix(1,0,0,1,-289.4476,-1488.3984)" clip-path="url(#clipPath2)" fill="url(#linearGradient25)" image-rendering="auto" r="13.75" cx="320.4476" cy="1511.3984" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(177,31,31)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(177,31,31)" stroke-width="3" stroke-miterlimit="1.45"> + <circle fill="none" r="13.75" clip-path="url(#clipPath2)" cx="320.4476" cy="1511.3984"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,1263.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath21)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAAENElEQVR4Xu3dCU8U SxSG4YOigiuQCG64gLuJuOC+4b79///jeVNULCsDAz0Dp8v+TvLE3JswzYT3nurG q5hpNBqNRqPRaDQajUaj2f/MuCOVozJYZQe0gQObHN+sO+aOuxMi2+iBLugjBzm1 KePjYvPutDvrzrkFGTw6oAe6oA+CZEtOLcQc4Jw745bcirvkroi4y+6iW7bUB53Q C91MHCIvkAOkduK76m66u+6+eyCDRgP33B237lYtxchm5ORkI040bEFeiLIJ8Ial iz5ym+65eyGDRwf0sGEpyOuWQuR45j6x8zbMW5AznhXLBiTAp+61e+fey+B92P71 rXvpnlgKkY24aOkUZZl1GiKkYmqmao5gNuArt+U+uc8i2z5aipEQ2Yhr7rw7aRMc ydTLUw5nOzednPmsXDYgAX4RKeQQ2YiclrfdBUtLbNY6Tr4f5IGEpx9WLGc/tXPB +pPoqv4vStpRfx2JkCX1zNKDK99B4XmCE7XTlBHyGM79YBnhV/v3k+Cfd1PHtxf1 m5b+Kb9WZYQsLSLkJJ1qhDwJcSOao8u/4tsYXYKs37D0U2iEOb7vI/wY8e/qGMcF Wb9Z6aewCPOGy8H9HCNHudN2HBVk/Waln0IjLAP8NUYOsd6QdZCKsD1hEdYB/h6j jLEMst6QZYj1m5V+aibCMsRRQZb3jIqwLU1FWKuPal5TEban6QjLEBVhu/6LCPMm 1HHcpt5E2DVERdi+3kRYx7VXOUI9mLSrNxHmEPcT5G5bUBG2o9kI88fs9O0ZRdiO 0AhHhbhXfEy9BXUUtykswvzbdmWI+1FvQG3BdoVFSDT5t9pyjPu1U4CKsC2hEZZy kHtVfqwCbFtohGU4dZTj1OEpwHYdaoT87/1EyAV3C2kS9RuU/stft0OLsPyDTvUn I8OkCCWcIpRwilDCKUIJpwglnCKUcIpQwilCCacIJZwilHCKUMIpQgmnCCWcIpRw ilDCKUIJpwglnCKUcIpQwilCCacIJZwilHCKUMIpQgmnCCWcIpRwoREqRCk7CItQ IQ5X3cCBRph/8jsvPipCkTLCTUs/+f2iTeEnvx+39CK82B331L11n+zvhUVyC1vu jXvibrkVd9rNWseZsVQwL7Ls1t2Ge2lpG1K9SLZlaQvyF6k+dGvuvDvpjlrHmbH0 wfNuya1aOpKp/JWljchFRcAGJMDHlo5iniMWLN3Scap2nvJIZhtetxQiG5GjmXtE Ee4BWU5sQAK8ZmkLcopymrLQOg8fzHk+Z+kphxBXLa3a25YuSJQybHRAD3TBBiRA FhdbsPNRXE4ZImUvWrrIBUuP4Dw5y7DRAT3QBX3QSQ5woi1YTr4/5GgmxlOWSmc7 gm/jyDDlBgiPLuiDI3iqAebhBblH5MXZjFyIKEVoAXRxIPHtNFxIpKTRaDQajUaj 0Wg0Go2m0/wBkJ7Zqp6dStoAAAAASUVORK5CYII=" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="1256.3984" transform="matrix(1,0,0,1,-242.4476,-1248.3984)" clip-path="url(#clipPath2)" fill="url(#linearGradient26)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="1256.3984" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <path fill="url(#linearGradient27)" d="M255.4476 1267.5234 Q256.1854 1265.5535 258.3788 1264.9185 L267.0926 1264.9185 Q267.4515 1266.4088 264.4406 1267.5234 L260.7516 1267.5234 L274.3906 1267.5234 Q275.3876 1268.8195 274.3906 1270.1024 L264.8593 1270.1024 L273.6927 1270.1024 Q274.6897 1271.3984 273.6927 1272.6945 L266.0358 1272.6945 L272.9749 1272.6945 Q273.9719 1273.9774 272.9749 1275.2734 L265.4575 1275.2734 L271.3199 1275.2734 Q272.3368 1276.5824 271.3199 1277.8784 L257.2023 1277.8784 Q255.8863 1277.4377 255.4476 1276.1029 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="round" stroke-linejoin="round"> + <path fill="none" d="M255.4476 1267.5234 Q256.1854 1265.5535 258.3788 1264.9185 L267.0926 1264.9185 Q267.4515 1266.4088 264.4406 1267.5234 L260.7516 1267.5234 L274.3906 1267.5234 Q275.3876 1268.8195 274.3906 1270.1024 L264.8593 1270.1024 L273.6927 1270.1024 Q274.6897 1271.3984 273.6927 1272.6945 L266.0358 1272.6945 L272.9749 1272.6945 Q273.9719 1273.9774 272.9749 1275.2734 L265.4575 1275.2734 L271.3199 1275.2734 Q272.3368 1276.5824 271.3199 1277.8784 L257.2023 1277.8784 Q255.8863 1277.4377 255.4476 1276.1029 Z" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <text x="279.2328" xml:space="preserve" y="1276.8008" clip-path="url(#clipPath2)" stroke="none">Nutzer erfasst</text> + <text x="275.4681" xml:space="preserve" y="1290.9336" clip-path="url(#clipPath2)" stroke="none">die Einreichung</text> + <text x="301.6156" xml:space="preserve" y="1305.0664" clip-path="url(#clipPath2)" stroke="none">erneut</text> + </g> + <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,247.4476,1383.3984)" image-rendering="optimizeQuality"> + <image x="0" y="0" clip-path="url(#clipPath22)" width="161" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABRCAYAAAC6w8avAAADPUlEQVR4Xu3dS08U URBA4UIREVGBRBQVH6DgIxEFFPCJ6P//TdbJpWNnogt7ZlKLPpV8YTXdszip281m IhzHcRzHcRzHcRzH+f9ZSFcmXNVo9TugDcxtuvgW07W0lK5Ll+iBLuijC3Jm04+P m91Iq+l2upPWNHp0QA90QR8EyZacWYhdgMvpVtpI99KD9EhKD9NW2ozWB53QC91M HSIX6AKkduJ7nJ6nl+l1eqNRo4FXaT/tpu1oMbIZOTnZiFMNW5ALUTYBPot203fp OH1MJxo9OqCHg2hBPo0WIsczz4mDt2G3BTnjWbFsQAI8Sp/S1/RNo/f98u+XdJoO o4XIRlyPdoqyzAYNEVIxNVM1RzAb8Cydp4v0U7r0I1qMhMhG3El300pMcSRTL285 nO08dHLms3LZgAT4S+rpQmQjclrupfvRlthiDJzueZAXEt5+WLGc/dTODSe/gMZn sgEiZEl9iPbiyn9QeJ/gRB00/Qh5Ded58G8RTn4xjcu/ImRpESEn6VwjnPxCGicj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkj VDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVDkjVLnSCA1R/Q7KIjTE 8ZpsYK4Rdr/8zsX/FqHUj/A42i+/b8UMfvl9KdpFuNh+Okpf0kX8ubHUtXCePqfD 9CLdS6tpMQbOQrSCuchm2k0H6TTaNqR6qXMebQuepLdpJ91NK+lqDJyFaB++kTbS drQjmcrPom1EbiqBDUiA76MdxbxHrEV7pONUHTz9I5lt+DRaiGxEjmaeESWeAVlO bEACfBJtC3KKcpqy0AYPH+Y8X472lkOI29FW7V60GxKlxo0O6IEu2IAEyOJiCw4+ ivvTD5Gy16Pd5H60V3DenDVudEAPdEEfdNIFONUW7E/3fMjRTIw3o5XOdgT/xtE4 dQ0QHl3QB0fwTAPshgvyjMjF2YzciCglWgBdzCW+fw03kvocx3Ecx3Ecx3Ecxxk0 vwG9ftEIsFFuXwAAAABJRU5ErkJggg==" height="81" preserveAspectRatio="none"/> + <rect x="250.4476" y="1376.3984" transform="matrix(1,0,0,1,-242.4476,-1368.3984)" clip-path="url(#clipPath2)" fill="url(#linearGradient28)" width="140" image-rendering="auto" rx="4" ry="4" height="60" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,5,15)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45"> + <rect x="250.4476" y="1376.3984" clip-path="url(#clipPath2)" fill="none" width="140" rx="4" ry="4" height="60"/> + <text x="269.4799" y="1403.8672" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">Neue Einreichung</text> + <text x="290.5765" y="1418" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">versenden</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 29.978 L320.4476 78.9707" clip-path="url(#clipPath2)"/> + <path d="M320.4476 89.9707 L326.4476 77.9707 L314.4476 77.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 150 L320.4476 198.9707" clip-path="url(#clipPath2)"/> + <path d="M320.4476 209.9707 L326.4476 197.9707 L314.4476 197.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M715.5381 824.9973 L715.5381 1115.3617" clip-path="url(#clipPath2)"/> + <path d="M715.5381 1126.3617 L721.5381 1114.3617 L709.5381 1114.3617 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="701.2607" xml:space="preserve" y="848.7266" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">ja</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 270 L320.4476 318.9817" clip-path="url(#clipPath2)"/> + <path d="M320.4476 329.9817 L326.4476 317.9817 L314.4476 317.9817 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M715.5381 720 L715.5381 768.9817" clip-path="url(#clipPath2)"/> + <path d="M715.5381 779.9817 L721.5381 767.9817 L709.5381 767.9817 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 375.0183 L320.4476 423.9707" clip-path="url(#clipPath2)"/> + <path d="M320.4476 434.9707 L326.4476 422.9707 L314.4476 422.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="306.1703" xml:space="preserve" y="398.7266" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">ja</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M738.0309 802.5 L933.302 802.5 L937.677 801.875 L940.802 800 L942.677 796.875 L943.302 792.5 L943.302 520 L942.677 515.625 L940.802 512.5 L937.677 510.625 L933.302 510 L377.1143 510 L369.6143 509.5 L367.1143 508 L367.1143 506" clip-path="url(#clipPath2)"/> + <path d="M367.1143 495 L361.1143 507 L373.1143 507 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="750.1631" xml:space="preserve" y="818.1016" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">nein</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M297.957 352.5 L28.9044 352.5 L24.5294 353.125 L21.4044 355 L19.5294 358.125 L18.9044 362.5 L18.9044 600 L19.5294 604.375 L21.4044 607.5 L24.5294 609.375 L28.9044 610 L263.7809 610 L268.1559 610.625 L271.2809 612.5 L273.1559 615.625 L273.7809 620 L273.7809 648.9512" clip-path="url(#clipPath2)"/> + <path d="M273.7809 659.9512 L279.7809 647.9512 L267.7809 647.9512 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="260.7738" xml:space="preserve" y="345.9688" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">nein</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M715.5381 1186.3984 L715.5381 1260.4082" clip-path="url(#clipPath2)"/> + <path d="M715.5381 1271.4082 L721.5381 1259.4082 L709.5381 1259.4082 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 495 L320.4476 543.9817" clip-path="url(#clipPath2)"/> + <path d="M320.4476 554.9817 L326.4476 542.9817 L314.4476 542.9817 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M342.9705 577.5 L705.5381 577.5 L709.9131 578.125 L713.0381 580 L714.9131 583.125 L715.5381 587.5 L715.5381 648.9597" clip-path="url(#clipPath2)"/> + <path d="M715.5381 659.9597 L721.5381 647.9597 L709.5381 647.9597 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="355.0726" xml:space="preserve" y="593.1016" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">ja</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 600.0183 L320.4476 648.9707" clip-path="url(#clipPath2)"/> + <path d="M320.4476 659.9707 L326.4476 647.9707 L314.4476 647.9707 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="291.3988" xml:space="preserve" y="623.7266" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">nein</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 720 L320.4476 768.9817" clip-path="url(#clipPath2)"/> + <path d="M320.4476 779.9817 L326.4476 767.9817 L314.4476 767.9817 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M297.935 802.5 L90 802.5 L85.625 803.125 L82.5 805 L80.625 808.125 L80 812.5 L80 877.1573" clip-path="url(#clipPath2)"/> + <path d="M80 888.1573 L86 876.1573 L74 876.1573 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="265.8988" xml:space="preserve" y="797.9688" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">nein</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M342.9471 1033.8984 L658.8714 1033.8984 L663.2464 1034.5234 L666.3714 1036.3984 L668.2464 1039.5234 L668.8714 1043.8984 L668.8714 1115.3533" clip-path="url(#clipPath2)"/> + <path d="M668.8714 1126.3533 L674.8714 1114.3533 L662.8714 1114.3533 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="349.9476" xml:space="preserve" y="1029.3672" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">ja</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 824.9709 L320.4476 877.1683" clip-path="url(#clipPath2)"/> + <path d="M320.4476 888.1683 L326.4476 876.1683 L314.4476 876.1683 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="322.4476" xml:space="preserve" y="843.6016" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">ja</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 948.1992 L320.4476 1000.4275" clip-path="url(#clipPath2)"/> + <path d="M320.4476 1011.4275 L326.4476 999.4275 L314.4476 999.4275 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g stroke-linecap="round" transform="matrix(1,0,0,1,5,15)" stroke-dashoffset="2" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke-dasharray="0,8" stroke-width="2" stroke-miterlimit="1.45"> + <path fill="none" d="M450.4879 918.1992 L390.4476 918.1992" clip-path="url(#clipPath2)"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 1056.4167 L320.4476 1105.3691" clip-path="url(#clipPath2)"/> + <path d="M320.4476 1116.3691 L326.4476 1104.3691 L314.4476 1104.3691 Z" clip-path="url(#clipPath2)" stroke="none"/> + <text x="293.3988" xml:space="preserve" y="1075" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">nein</text> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M80 948.1992 L80 1056.3984 L80.625 1060.7734 L82.5 1063.8984 L85.625 1065.7734 L90 1066.3984 L263.7809 1066.3984 L268.1559 1067.0234 L271.2809 1068.8984 L273.1559 1072.0234 L273.7809 1076.3984 L273.7809 1105.3496" clip-path="url(#clipPath2)"/> + <path d="M273.7809 1116.3496 L279.7809 1104.3496 L267.7809 1104.3496 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 1196.3984 L320.4476 1245.3691" clip-path="url(#clipPath2)"/> + <path d="M320.4476 1256.3691 L326.4476 1244.3691 L314.4476 1244.3691 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 1316.3984 L320.4476 1365.3691" clip-path="url(#clipPath2)"/> + <path d="M320.4476 1376.3691 L326.4476 1364.3691 L314.4476 1364.3691 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,5,15)" stroke-linecap="butt"> + <path fill="none" d="M320.4476 1436.3984 L320.4476 1485.4204" clip-path="url(#clipPath2)"/> + <path d="M320.4476 1496.4204 L326.4476 1484.4204 L314.4476 1484.4204 Z" clip-path="url(#clipPath2)" stroke="none"/> + </g> + </g> +</svg> -- GitLab