From 1f6fe70c445bec3d129c08b45d52c805c42741e9 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Sun, 20 Apr 2025 20:55:55 +0200
Subject: [PATCH] Added structured logging

Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at>
---
 .env                                          |   2 +-
 dbrepo-analyse-service/app.py                 |   2 +-
 dbrepo-dashboard-service/app.py               |   2 +-
 dbrepo-dashboard-service/init.py              |   2 +-
 .../dashboards/System/dbrepo.json             |   5 +-
 .../dashboards/System/logging.json            | 694 ++++++++++++++++++
 .../provisioning/datasources/opensearch.yaml  |   2 +-
 .../dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar   | Bin 1118870 -> 1118870 bytes
 .../1.8.1/dbrepo-core-1.8.1.jar.md5           |   2 +-
 .../1.8.1/dbrepo-core-1.8.1.jar.sha1          |   2 +-
 .../ifs/dbrepo/dbrepo-core/maven-metadata.xml |   2 +-
 .../dbrepo/dbrepo-core/maven-metadata.xml.md5 |   2 +-
 .../dbrepo-core/maven-metadata.xml.sha1       |   2 +-
 dbrepo-logging-service/dbrepo_parser.conf     |  35 +
 dbrepo-logging-service/default.conf           |  37 +-
 .../dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar   | Bin 1118870 -> 1118870 bytes
 .../1.8.1/dbrepo-core-1.8.1.jar.md5           |   2 +-
 .../1.8.1/dbrepo-core-1.8.1.jar.sha1          |   2 +-
 .../ifs/dbrepo/dbrepo-core/maven-metadata.xml |   2 +-
 .../dbrepo/dbrepo-core/maven-metadata.xml.md5 |   2 +-
 .../dbrepo-core/maven-metadata.xml.sha1       |   2 +-
 dbrepo-search-service/app.py                  |   2 +-
 dbrepo-search-service/init.py                 |   2 +-
 docker-compose.yml                            | 114 ++-
 helm/dbrepo/files/create-event-listener.jar   | Bin 10140 -> 10142 bytes
 25 files changed, 870 insertions(+), 49 deletions(-)
 create mode 100644 dbrepo-dashboard-ui/dashboards/System/logging.json
 create mode 100644 dbrepo-logging-service/dbrepo_parser.conf

diff --git a/.env b/.env
index e50d4f6b5b..efc3a33939 100644
--- a/.env
+++ b/.env
@@ -2,7 +2,7 @@ MARIADB_VERSION=11.3.2
 POSTGRES_VERSION=17.0.0
 KEYCLOAK_VERSION=26.0.4
 RABBITMQ_VERSION=3.13.7
-OPENSEARCH_VERSION=2.10.0
+OPENSEARCH_VERSION=2.19.0
 NGINX_VERSION=1.27.3-alpine3.20-slim
 OPENLDAP_VERSION=2.6.8
 SEAWEEDFS_VERSION=3.71.0
diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py
index 41e4c128d9..6dd0c082a6 100644
--- a/dbrepo-analyse-service/app.py
+++ b/dbrepo-analyse-service/app.py
@@ -28,7 +28,7 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
         },
     },
     'handlers': {'wsgi': {
diff --git a/dbrepo-dashboard-service/app.py b/dbrepo-dashboard-service/app.py
index fafca139f4..76780711ae 100644
--- a/dbrepo-dashboard-service/app.py
+++ b/dbrepo-dashboard-service/app.py
@@ -29,7 +29,7 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
         },
     },
     'handlers': {'wsgi': {
diff --git a/dbrepo-dashboard-service/init.py b/dbrepo-dashboard-service/init.py
index 54c01f55eb..12d8c24012 100644
--- a/dbrepo-dashboard-service/init.py
+++ b/dbrepo-dashboard-service/init.py
@@ -18,7 +18,7 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
         },
     },
     'handlers': {'wsgi': {
diff --git a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json
index 6ce787d456..e9d03fd40d 100644
--- a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json
+++ b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json
@@ -30,7 +30,7 @@
       "title": "Docs",
       "tooltip": "",
       "type": "link",
-      "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/"
+      "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/"
     }
   ],
   "panels": [
@@ -2428,7 +2428,8 @@
     "gateway",
     "analyse",
     "metrics",
-    "auth"
+    "auth",
+    "search"
   ],
   "templating": {
     "list": []
diff --git a/dbrepo-dashboard-ui/dashboards/System/logging.json b/dbrepo-dashboard-ui/dashboards/System/logging.json
new file mode 100644
index 0000000000..342894446a
--- /dev/null
+++ b/dbrepo-dashboard-ui/dashboards/System/logging.json
@@ -0,0 +1,694 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": {
+          "type": "grafana",
+          "uid": "-- Grafana --"
+        },
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "fiscalYearStartMonth": 0,
+  "graphTooltip": 0,
+  "id": 3,
+  "links": [],
+  "panels": [
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 0
+      },
+      "id": 5,
+      "panels": [],
+      "title": "HTTP Gateway",
+      "type": "row"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "thresholds"
+          },
+          "custom": {
+            "align": "auto",
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              },
+              {
+                "color": "red",
+                "value": 80
+              }
+            ]
+          }
+        },
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byName",
+              "options": "request.method"
+            },
+            "properties": [
+              {
+                "id": "custom.width"
+              }
+            ]
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 0,
+        "y": 1
+      },
+      "id": 7,
+      "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
+        "showHeader": true,
+        "sortBy": []
+      },
+      "pluginVersion": "11.5.3",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "field": "@timestamp",
+              "id": "2",
+              "settings": {
+                "interval": "auto"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "container_name: \"/dbrepo-gateway-service\" AND code: >=400",
+          "queryType": "lucene",
+          "refId": "A",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "HTTP Gateway Errors",
+      "transformations": [
+        {
+          "id": "filterFieldsByName",
+          "options": {
+            "include": {
+              "names": [
+                "code",
+                "method",
+                "path",
+                "size"
+              ]
+            }
+          }
+        },
+        {
+          "id": "organize",
+          "options": {
+            "excludeByName": {},
+            "includeByName": {},
+            "indexByName": {
+              "code": 2,
+              "method": 0,
+              "path": 1,
+              "size": 3
+            },
+            "renameByName": {
+              "@timestamp": "",
+              "code": "response.status",
+              "method": "request.method",
+              "path": "request.url",
+              "size": "body.size"
+            }
+          }
+        },
+        {
+          "id": "calculateField",
+          "options": {
+            "alias": "Count",
+            "mode": "reduceRow",
+            "reduce": {
+              "include": [
+                "request.url",
+                "response.status"
+              ],
+              "reducer": "distinctCount"
+            },
+            "replaceFields": false
+          }
+        },
+        {
+          "id": "sortBy",
+          "options": {
+            "fields": {},
+            "sort": [
+              {
+                "desc": true,
+                "field": "Count"
+              }
+            ]
+          }
+        }
+      ],
+      "type": "table"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "Count",
+            "axisPlacement": "auto",
+            "fillOpacity": 80,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "200"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "green",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "200s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "300"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "purple",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "300s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "400"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "orange",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "400s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "500"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "red",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "500s"
+              }
+            ]
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 9,
+        "w": 24,
+        "x": 0,
+        "y": 9
+      },
+      "id": 3,
+      "options": {
+        "barRadius": 0,
+        "barWidth": 0.97,
+        "fullHighlight": false,
+        "groupWidth": 0.7,
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "right",
+          "showLegend": true
+        },
+        "orientation": "auto",
+        "showValue": "auto",
+        "stacking": "normal",
+        "tooltip": {
+          "hideZeros": false,
+          "mode": "multi",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 100
+      },
+      "pluginVersion": "11.5.3",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "container_name: \"/dbrepo-gateway-service\" AND code: (>=200 AND <300)",
+          "queryType": "lucene",
+          "refId": "200",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "container_name: \"/dbrepo-gateway-service\" AND code: (>=300 AND <400)",
+          "queryType": "lucene",
+          "refId": "300",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "container_name: \"/dbrepo-gateway-service\" AND code: (>=400 AND <500)",
+          "queryType": "lucene",
+          "refId": "400",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "container_name: \"/dbrepo-gateway-service\" AND code: >=500",
+          "queryType": "lucene",
+          "refId": "500",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "HTTP Status Codes over Time",
+      "type": "barchart"
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 18
+      },
+      "id": 6,
+      "panels": [],
+      "title": "Application",
+      "type": "row"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "fillOpacity": 80,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "warn"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "orange",
+                  "mode": "fixed"
+                }
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "error"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "red",
+                  "mode": "fixed"
+                }
+              }
+            ]
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 24,
+        "x": 0,
+        "y": 19
+      },
+      "id": 1,
+      "options": {
+        "barRadius": 0,
+        "barWidth": 0.97,
+        "fullHighlight": false,
+        "groupWidth": 0.7,
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "right",
+          "showLegend": false
+        },
+        "orientation": "auto",
+        "showValue": "auto",
+        "stacking": "none",
+        "tooltip": {
+          "hideZeros": false,
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 100
+      },
+      "pluginVersion": "11.5.3",
+      "targets": [
+        {
+          "alias": "sdfsdf",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "hide": false,
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "level: WARN",
+          "queryType": "lucene",
+          "refId": "warn",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "adadas",
+          "bucketAggs": [
+            {
+              "field": "@timestamp",
+              "id": "2",
+              "settings": {
+                "interval": "auto"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "level: ERROR",
+          "queryType": "lucene",
+          "refId": "error",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Errors and Warnings over Time",
+      "type": "barchart"
+    }
+  ],
+  "preload": false,
+  "refresh": "",
+  "schemaVersion": 40,
+  "tags": [
+    "ui",
+    "dashboard",
+    "metadata",
+    "data",
+    "gateway",
+    "analyse",
+    "metrics",
+    "auth",
+    "search"
+  ],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-30m",
+    "to": "now"
+  },
+  "timepicker": {},
+  "timezone": "browser",
+  "title": "Logging",
+  "uid": "aejhojr0mrpj4c",
+  "version": 23,
+  "weekStart": ""
+}
\ No newline at end of file
diff --git a/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml
index 4fd59bf382..7a589eafa6 100644
--- a/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml
+++ b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml
@@ -10,5 +10,5 @@ datasources:
       flavor: "opensearch"
       logLevelField: "level"
       logMessageField: "message"
-      timeField: "@time"
+      timeField: "@timestamp"
       version: "2.10.0"
diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar
index bcbe378ccfc3fc47f00d0955893325afe482a6b8..b77e2f543a3afa336eaca712c024ed709e85a306 100644
GIT binary patch
delta 12739
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
U1R!R8gVJGwg2zGP@<M{;0CqpB1^@s6

delta 12739
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

diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5
index 45f12e6b49..ef7ffe9dc4 100644
--- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5
+++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5
@@ -1 +1 @@
-dd9863e47bad7b44d48640513a8a3d4b
\ No newline at end of file
+4bb9c10ee8dcc4f05fef0928ec526b5b
\ No newline at end of file
diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1
index 1d0cc7569e..d99c5b6b1d 100644
--- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1
+++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1
@@ -1 +1 @@
-8ade955fe62f8e6cd809f37f3479ddc843882bce
\ No newline at end of file
+f4bc86db3f023f2b9481db399c6d439ba41e5272
\ No newline at end of file
diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml
index a480540488..773bc1fbaa 100644
--- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml
+++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml
@@ -7,6 +7,6 @@
     <versions>
       <version>1.8.1</version>
     </versions>
-    <lastUpdated>20250420103842</lastUpdated>
+    <lastUpdated>20250420181800</lastUpdated>
   </versioning>
 </metadata>
diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5
index 4f96650e0d..5e3334d999 100644
--- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5
+++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5
@@ -1 +1 @@
-779db7a879fe20234417cce3fa298472
\ No newline at end of file
+c77e7629604adca32895fd22fcf85f37
\ No newline at end of file
diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1
index 225b84bd3b..56cd8f8a15 100644
--- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1
+++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1
@@ -1 +1 @@
-1caca64fae673f34667cdb4bda7f739ba9144748
\ No newline at end of file
+33a845a4d64bc82da3fb93f817539603aa7a159d
\ No newline at end of file
diff --git a/dbrepo-logging-service/dbrepo_parser.conf b/dbrepo-logging-service/dbrepo_parser.conf
new file mode 100644
index 0000000000..7c680629f8
--- /dev/null
+++ b/dbrepo-logging-service/dbrepo_parser.conf
@@ -0,0 +1,35 @@
+[PARSER]
+    # https://rubular.com/r/u029eqdrtxeOT9
+    Name        java
+    Format      regex
+    Regex       (?<time>[^ ]* {1,2}[^ ]*) (?<level>[^ ]*)  *(?<message>.*)$
+    Time_Key    time
+    Time_Format %Y-%m-%d %H:%M:%S,%L
+    Time_Keep   On
+
+[PARSER]
+    # https://rubular.com/r/JqOp74qykhKeBJ
+    Name        gunicorn
+    Format      regex
+    Regex       \[(?<time>[^ ]* {1,2}[^ ]*)\] \[(?<level>[a-zA-Z]+)\] *(?<message>.*)$
+    Time_Key    time
+    Time_Format %Y-%m-%d %H:%M:%S %z
+    Time_Keep   On
+
+[PARSER]
+    # https://rubular.com/r/bqLY5HuZfP07p3
+    Name        seaweedfs
+    Format      regex
+    Regex       (?<i>I[0-9]*) (?<time>[^ ]*) (?<golocation>[a-z0-9_\.:]*) (?<message>.*)
+    Time_Key    time
+    Time_Format %H:%M:%S.%L
+    Time_Keep   On
+
+[PARSER]
+    # https://rubular.com/r/SMa7y7BTOOgf9z
+    Name        openldap
+    Format      regex
+    Regex       (?<rnd>[^ ]*) (?<register>[^ ]*) conn=(?<conn>[0-9]+) op=(?<op>[^ ]*) (?<message>.*)
+    Time_Key    time
+    Time_Format %H:%M:%S.%L
+    Time_Keep   On
diff --git a/dbrepo-logging-service/default.conf b/dbrepo-logging-service/default.conf
index eb1156e3c3..8b5af1493a 100644
--- a/dbrepo-logging-service/default.conf
+++ b/dbrepo-logging-service/default.conf
@@ -3,6 +3,7 @@
     Daemon                      Off
     Log_Level                   debug
     Parsers_File                parsers.conf
+    Parsers_File                dbrepo_parser.conf
 
 [INPUT]
     Name                        forward
@@ -11,8 +12,40 @@
 
 [FILTER]
     Name                        parser
-    Parser                      docker
-    Match                       *
+    Parser                      nginx
+    Match                       nginx.*
+    Key_Name                    log
+    Reserve_Data                On
+    Preserve_Key                On
+
+[FILTER]
+    Name                        parser
+    Parser                      java
+    Match                       java.*
+    Key_Name                    log
+    Reserve_Data                On
+    Preserve_Key                On
+
+[FILTER]
+    Name                        parser
+    Parser                      gunicorn
+    Match                       python.*
+    Key_Name                    log
+    Reserve_Data                On
+    Preserve_Key                On
+
+[FILTER]
+    Name                        parser
+    Parser                      seaweedfs
+    Match                       seaweedfs.*
+    Key_Name                    log
+    Reserve_Data                On
+    Preserve_Key                On
+
+[FILTER]
+    Name                        parser
+    Parser                      openldap
+    Match                       openldap.*
     Key_Name                    log
     Reserve_Data                On
     Preserve_Key                On
diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar
index bcbe378ccfc3fc47f00d0955893325afe482a6b8..b77e2f543a3afa336eaca712c024ed709e85a306 100644
GIT binary patch
delta 12739
zcmbQX)MeUI7oGrbW)?061`Y-W+eH(3RGDlSO*G!dWW8wOYk4N?MU#0Ll|YmMqb7)o
zX4C~yU5qA7wu>eoV6<eiSv2`KqXUStW%2}3dpYzcEA)v?4&dYhac?q3gQ$7Tfz#K$
z<LBjqS!T0n@;v4=kQ5tB5{SxT2?tT@S<R*=eBkFnR>;p90Fp{%^#M`qS-n7%pQ!%y
z2ck?ulWo|*7J0C_f`t3ooIy_e&8R;;VJ$QJWG;5FtQfm3NcJJS@$?0^SU8b<ZL?_d
zTy`gjq#KCh=Qp1IU?M9os+x!F=F<c2v9h9y?&a_YX-Q<&pPaxg4D)jgX9P%8g3E8Z
zz#BG>$vj+OH%M?LfP|~K;z87Ht`HDq$Q=u!CUA#>D2PG4(;a?rup!xGy=bz%u<>;N
zpGe_iy=ZbBk1t5mSsqVNq|9YEo^Jn@lXY?cFW9=d?8cM(dHF#qK;Ax}!o@lH4lfr-
zX(Frsbb%!TtkX9badAwar@_TGS&I*>$xqaH`hnm40?5Jd!KOd`gF6@R<o$e{Ak+HU
z^rsj6L2`=CqRIUH;7HlaVLW|9JD1Sp1^i&+*6{m*bo}9u0#Wmr!5X<HCkQDc`Oaq1
z<O2dZAO(7YC44rErbIEo!F0isoa)mb91?JuEG+~!QeCJYq;!XnBgiKpPe178MvE4E
zVRw+4em4Ed0vs&U&)*Y34o#aylg|o!fE4(N8c!18=FdsdN8|!<dN7`T;HLoV<T)Z>
zEB!<*CO;4n2I<IR(Vt$hl~)ec`F^6_phP!Y)DA?=W!Im^&&N8MUyKjLl^1gXQK@3u
zAZn5rIDK9h10|fz8sh$-Al+Q4u%Cm;X3=IVO&(Sd?V<OL4MaPber5*Irj`j{db-U*
zX%OEk;viW5Z(JK#yfsOl4<x><fQ1D_uPK?w4x)W(+`;^*4JBZjyY&g!o{zmkV0&06
z|K<XR`1J2CArdSM3@7-ef2?9xo~+QPG<^XdJNM?edDdW^vlo5k0IR(Jnt$3IW(I~1
zp6Lc0tPqv)-}%|6zvpCU+x%hmFR+8&tltZ^X!VZ8+#rVp9PtEOIQyh6n7(!HJJ^Aj
zuf2m9%NF#yBZ`@U;Tz|4!F`;{lLJ1hProB9Aimk)K?>N!X^%I7P4aqw70g%s{26S5
z*zYDOCYwduXNfWzfdsanlVMaB1BrY$V$=dTV!N_6qa(-@+tchBk4l21bR!vKg+Pp+
zY({ag)Y5#$g#sWEj|N6|P@HTJ>}0G1i(H(^_!Q*m?K|c(J^%&#_F2mqnZb6=U(4t!
z2-5XzA7eGxoaDodY+y$AamMqY)U(~@5@Qos<iIt?2awRNSkiSelbeCTS$6uzT5jd(
z4N3ws+uuH9Y~cn6F?Z;qowu187}9vbVKKcyLqK-=0(k+&?GN5EJ_Y%H`|*#ASHOOo
z`-|}zSfuqI<3lEpQ!*Hte8Ki@XJtwQGvv9LCV;|j`$kcwP_PJx6q6p<OBV7>OTZ%c
zl$m~l%8KnbjhSk}QW2I+{9uzaZJ54-eUjkLG*6z%X3@5ECR?zKeHN1pSSGfFNe(Ph
zTh4S1?26DTCO)u8YAw?uu;rYcOtqjyy1ipMQv%qAS96$xz-sIkF!_KPJ&T!Az}i18
zWikPaXsl$iVg`o_)3hBqPnZ}OzOzn0n8K+%U4f68Yx~?aOq^hKE7mi)fEn*LF}W~v
zf=ZEx9y&hHrx#vlGTNTIjY$A3TfdVj4s5~w-AwLa5sm#!&R|CFAtp~SW5-dZ3?{IZ
z7iRp5VP|4sc)~p0VH=a~^b0?jShpvfVA2K~(R+$19nAQ4hRFxw#s%HZv8+rC3=f&7
z7uGVVOmBF}#I?Qd0#w85OH5f{4dPds0>O-|>r5UHo$~)`_?|K`F#KnQ>*U$~;TF_)
zzwbgr%Ksr#7+B}>$Iy`Cea7Snc6Pu^ra)$1kjH;B%x-03VqmyBozaY0Z~L7$OllDS
zm@KY2#lghD@RoV{#(YMw^EjuUa~5Eqe$GrlYJ1#!CLxGI(WMLC{AOfeIM0j-Yl!bR
zd}NXaJK*eRsAnv{F~u-(fb2CBe>H#ly7f$E)2CSoNKXH|o{4k&*B?yJ!0PY*X37OK
zeEu;xfgL=7kvRzB`Sg2dYagRWtt=}u2Uwjt2Xhpd(ag=912*C#FEb<o8VE8&VzE+$
z*$=Gdq&Rar6FB-+ig|CpnBE}5Y&8AO8z%1Q9$EsD+xw-MKS8{h$E0EPj){Rmm<<vZ
z35Eh(+xN;cOMs2JuE6XMwn{^p*$XUEqQ)EvW}Me#wg)o=beSO`A8f#E&&&l1f%qlq
z&ls4dJAPv_1P9l2T}J_l=?kKnxt4!1W(FJh&6GJ2%!ssLh9vss*37P81K-&(r-7xy
z9GNY_A`@MhW5FUH+?X@LjA&2hd@$pTH`Il)eo$v51VRI2We9UPBw%-iMy~>;Dqg53
z3!DVFw%bH7Lo&8+G;=)ItaY)>kUa1?f!W4~$#&6p!?n!kK7bgE^H})ILB)#TRhB4l
zuFbv0G7-es_JBnTTy*F>VYv=wu)btD0%n|k%c2iv{Q1bT5A2aWUs=|HOU#_VEPWu6
zt$$e6zyc~9tZyNXy}Px*Jc*To;Vb`i#%?Zka6@goKM!j=$hPe_1X(wM&Fm3l6$CTp
zOR??+8MQr5j#U>d(yPP@uIIKhtFu~xb=m8%mVg;s4Ow4+)yy|z<pYbXw`NUZ=CfWj
zCF=XSv$qwP85p8CrcbEkQlI`RSioR=nLVo(*z`qCtgK)SE8STk1-Y&d)CCR!ta4yO
z6GB)Qfz_}?L9KZg$7%_d(oANBR0xLYtUch`V}CB|d$7qH3ZdFBl(L=xi_EHIjRoua
zS<4y<Rvgg6s>lM))!x>h)z>gHFep!-;Kr!|YNAR^Z&<`CFx?@Km1}xki~!sAdmXIX
zz~)TrVHE|tXYE8*bFhKWrm{jRy8km-d%$XX=dvyXOPMZWh13&sm$4dxMJ}vjJr7p1
za2@MBu!!Sk){QLSGV!wC;ebWV3=AvTr#o(B)1ID?%qp_oeh2Gzu!bMIS(U)Gr_52-
zMPQKwCs==j8GFyLCPR#1pLBKpc6J5^G2!X+S8}UQ-(bWhwLSkL>v3>`u(-*3A8e=O
zJ=Tq2kuy(OQ&_>4tDat0$;`~a(8oT#{sEi8^bN^u9MkJs*x0t$yk>=D#{KVDpMgVe
z`BzqEusLgfvd#y)!1pgSR8pAOwB$gEdV&HQ3)qTj>TIcC#$P?QI<VqeBeq76_HE{D
z&v`&<Uplkx12a|zu%&>N@Q1KDvxD8W)T#cJ3JU{+KG$@?mn`a&KX7nvpAgOF2=VXC
zRSD~KnHd<avrlK71Mx5abiQY-oZICR*h0WYl_axqgTt*chiw`-<|K>Qrhr|vzLG5n
z;`@oKmNZ{uVPJT`H9fJ4NqKStH!mavKKx|m-X2uX_6+3U?N%*p_FzVJ2b&4ltc|^F
zoZ!~No~dlk;I<Lt8a5-al<7vcZ(xgcce81LMZyoTEdU4L&tq(kU=f=$Y!|?;<h#I@
z4|Y@ibv7li6^n1PodYw9AFwS3E0%c1wgTc@Bi_?r6IdA-77Kt{it5wK1$3wTR|p7g
zH+jRB1y;M@BU=Pm_ph&P)?g9y-)zNTm#$%Ee*+eo#mT-6tR{$$T@UQ8CJ}asOV>!U
zSAgB6Cd;l1mI_s7-^~inEw?M`>NhbnFvv`A5aHICRx6-1ox4szaeId*`yQ|!H(mCL
zU_CdD*}*N!?HkP5{lOxPcI<*+D@B~xw}V}C){FfSSl32B_CH`}tq);$1FQKS!EOdt
zqo2s04c0y<oqZ!%%0GwwC0LhL0XsBCO4u{NYMxfHZwITHSI@p1tUbDeofXm)?&_Jj
z?+YsfgFi309GvFOE<Sy2y8!R@ofFvqfi2%TjeR9pQ_6hyW^e=S<w|xh2~a9EJ;ZJZ
zwjtvLdlEQe&s=2p;sr@b+-E-uw)6gD_9<ZPrEl2z!3MT{WWNY@Y2;V-g<v&*ezGqB
zNA)~L4jHh>9#)PVuwpH4j-z13ANe?nz>HKO4hgVSy*LL4SaGK`$7`@unLNiDurpLN
zIW~dS+|c8IluhrAIc|W}oHXay2W}#EI&(0BwfDGlKni;Y9}ZElGs1&8oWa`XL~win
zGy38<R5-!8kK^OlgHJ^m7(TjBW)xMQ-td=IaJtNN0nY7=8659Lz)Ftq4Zh39!obkX
zJ)K{j6<p--Z#SvsFaleb(a6Ck2nwQ#NgS8KPV$|`u^i0!Hj`r&n6YRsM-EuAz#@)X
zut@(>4k1YPw~Lx$ZOO*KFo|!vfhLCmxcffcV2%LC^n}?0Y}-Gt;cy1WiN$6PCvYRX
z<`4%r*s#uH9I{~FtT@dv9~>v1S2(o6YRVpS#DS%*z2M*jOFjF*Ap^1S)~ii=&ddx9
z=h#4nu)%hR9~|jmH?925;RVvP^($u+SfG-Hvj80auX#Dof<<--a;8CQloRvv6{oT?
zFkG9yZXu5bB;0ge*f_T5iE-`)nX+A1hO-1xh83P$`gA2f1H*I!cnLRsLNpu8^#AWz
zIk&%2;M@sz^l}5vU64w(o#*pfD|QBk(<0zhJe@z7Q*`>f6#|^wx0rBxu`^jO+GfMq
z3>uEu-s;Ag%)(^7X!|QK&JQ4&?RSDWGg(0*?h%~%V5uE3oWH?RTT?hA1VB>!rJQYS
zAjb4+PA?X4Med{Xc;j>y1_oO`P{&CfZl~(@fCkQm5H*^fskKK~85pKQTNz+?^+#}W
zPH$K#z_#71mGd0fW~pw@vtY){37mVFLG~=4!ubd6gr##hQ@~Q(i#R`nT(@mG=K~(F
z3l6AVn|zp)fk8zI)NnT3F29BI2{`y!_i;`E2kGp?oEcyS>q(HWZ5D0MI?MSBoIKL5
za2^BaX1)8IAHZ>?@R&1=72LK?jGo{zz2GdT+w_190-V#|Z4hAF{`dvwd^T|Mex6kA
zq{Pa=5X=W^%qoLMJtpz;O!wa?Aie$Gdrlp&Yk9tM#)28yzc`yf&ffn1ALkUX*IJpl
z-f@8ZSjx=>X>R=!;3@?>s#KioAy`d>G?y({`*a1aFJO^g6|T#W$gbL|>Ux)zfx&_g
z)KOAK3@&Y-r@_U{1`eA2J^TG~nHd<EIj1)yv#C!94M=Ujug5hTY*vjCmlW8(85UeS
zA?-n>_j~N>Ss55^@l1EP&8<HDz;AxO>Ha$eWVUax;pzm3p|ulN3z%`xol6s(q273N
zDS*x43*v$_rE<f#AX!-~ic1{aq1Vsig0xEC=W?9`moEEDxehaf3V@bMu2!&i?glPM
zcDdEewGb>-+s;)6W_<19S_D=zb0U{5*wPzQxgLTUyJvB6g57g$KG%0JWB*bvcCgfm
zm0at<jEZ$!Ibd_1ZRCPfv>iLRs=x-a?B{9+tLZ(=bqegT$kSZ!!6IH4pdKu}!ZjIe
zGS@9G6)?l#KGX`!$6S#5KK}(5KUi188?NPGlQlncIfA1+=R4O;u$22BE^tM-m6cl-
z5<y*aY7IoW7#Lh+rw3|r>r9ue<L2I;&c>|@&ZK<;+)u$VRVu<Q4>oF=1ougBen?c{
z{s>72)4k>A&SGU?n9ehOA`_R!^n?onoYUu?7vS4IUxj-KIQ6({aZ7Q6l3JoM_j7QX
z^RnTd3(m+dow%oh84aG?Q^9tL`*L?dOrEU3#r%<tfuU6pT>eZya7}=F`@;Zk9<U4E
zhjZTpGtS3zFNWmv7hLc1*KjZ}ut>l)uuY$TLqK5r-W2XVV2i7BxvRiF`CiDqn;o1;
znY?#<?PX?QFyR6<)pVyjTousYE>p#Q9PFH@wcG_@PlPvfp9hO*v~xFuoxHY}n;&e}
zzKPs%V20c@?yF$MUuSbeVt(lY?!A!G^o@G^xoyl03@^c>UFy>n?sE%G-*;0$WBbLW
z+y}s^WAaLFA8^U>a1-}haEwjZ&dmmn@ELo!AAv<`4svgR6c}f?w}KTvy~^ziR%3FT
z8`2_wdyo4s*uXcBxX*%h?S9UE2b?HozT^G}mYVsA`v_Qj{2y)(uv8`!k33kai<M^=
z*a|lRo<MLVJyV)z2iTlo1s+4NU2Up7kiO1AO`g?YsXRTNMG&8wUArK+k)45Ivchym
zMo#tVADnqaw?`TCJOn3iTWg*=aMiZgnFrDkKkUUL3U<M*03I`l5dp$+llHPOFfj0f
zy9<*<xVHy{^4tMiq!-1L1Z_3Fx8T^!!@#iFaQeb?JVx6uB=KAWH`iC>^Mrv$2)A|d
zKr)43ACDN=Qq5^Rf?!YD%;Y%*W^l~qnF%&`@j{*ou-{~t^W=m5-?x$HK3F7wI}fDW
zskfU)1*|w^KMxz&z?kDa=3swKJ;(C`Y+(H*p8sH74L5kMgIi&d&v-6_MfBeAtO1*R
z=NnHwSXb;no*J-$x0!g~fJIJn@n(ZX%=meifpy&z;hhW#mb_;HFP^b8Fsu>*4I)B9
zcKX|gjNH=`-V1PUKQGDq0c^%WMcx!}K&b2SDuT`MGUgQkn;K)zdk-vPW6S#voB(v(
zd1r%z|D-Q(3)lz#fxM8W#f}i(Qm|tEDBg*X68hjT*;rw228K0q(=VRoSDxNb$IH9@
zUo5X0IH9Oz@-~8lWo04n3y21pyFaA=GBGe1u}>D93|7y%{d6g>HP|MON?v!c1%Y+E
z8DNp!jl51^k^gPHDqy2j`+5IBdKWua-cEYS!oVQP4Qc|Zg9hyRr`P@!5ZPWimG?8)
zdwH{XA?@Y71-$3L2HGv*?E*7SE$3B-1Y=9hyv<=O3=A82rWed-2b;sWU4IR46QqsA
zJ5^#1FAD?1>FFP;*fl`5uugRlwB4?;kr&dRcHGL_2Da_wPTniv0H1%57gBZP9p&u@
z2j>6Nyeq)gt~}2R9?0L$eVG@M3Lf0x-3gYOeTNq^h;ixx??14Cr=Ic(gMEMh6)$A8
zmj45<9XJ^LfAD^SjP)@q_AgCkWnl1|-oVWTb|2^V`aisoA>4nAd^IefQJfk!zG@~A
z<0l7S3^Rxk&cjy$7P-jBmj)KG6ynnZi)4!M?E#CZOYm{A@Yyb!66OE#NlH8i14FLx
zWJXbC(Co%^c~w5P?YT01H5?%0UaRnJ0PC5n!IuFxg<YGk1k9+_<*NcQ+JEZvZU3py
zA3co|WMq|Ahk*L@1DE*Cw@*37Zvj%V{oD!uS}?=+G=CWrSXt%w-*?rf^J(*$PoK*t
z$iAKH9KQiriOmImh?jO=;;)9NEx5z;UKMQQ^aK2Y?Axoa^6P`uuDQ-%3Q_W(!;e>g
zdK?d*+4h86{0>ZD-(CNde)<~|14A6^bp2cWhTHGo;b#YX=EZ&fBCr85kN97)GubYh
z?(vF$A&7qcir*AOE4}7-V6t8`J>@mOK8T+Bn%@XSpM1@438Gov@Y{lD=QsSIS)l2i
zZ}>s8q|@hq;+L8J;SIkDlg*;(YH#@?L3HC=e$dq5^ha;`vq5~pfBZ7jv)_Ry&!&Sp
zkD(m<_xwd56?M!4GSkn$=l2G2WIjMtR(#+GO*Bqd{LL>j{o4nA(CqAVnGgIj(?dS;
z+ksRng0yY;$ZrqgeEi4{ntPmnkWoNpddeq$bCAF0e&PqsxlVuoi61n_INk0ue;7!y
z;xB%g>6<?Dn}IlXpZR5`vwh*W0&&0=#C?HSFz*XQdE;Atndw4b`JF*3!0svj3USZY
zulyMx!HM7aWu{wy;|EQKPM`RVzW^l2{GC4^M3;Q$PXW=lzVqjTXwM(~sUR9`(wQHS
zpy&I^9}WuQ^q>5osnqGme)30x_=>;ygTRVGPM-J+$;nTD@mqma{N|4Vs{jSZ?BDR<
zkeUADH$P}<8xkh|fA~QoppYP3@(1EWkk6+5g?P;MFMk}!oTY#Hvp}@qKmIZh-T9Bd
z21K*}=WhYgz5n?qGTAJesvs~QL>&|e1iJ#{J_AMpaFFu-<d>P=!YE)3Qh$(9AQ(i8
zF$sVsl&6EEt%pef9Bts3c*z9OrpPP+nr5F~$1IQz(g9Y<%pzb9ic1$30Y4B8*0F&_
zzzoEB!6Fa>qU~4(tU)w5_NTK7fMXxzx#@3M1;Ei}$R+>|`~_?R<sh>q*#)XW^fYz>
za3ryF2xNlzMH~X9Ao?YT066uAaSDLu_owgU6aYu60T)EwY%YNrAa$nP0&O6AFSo!d
z5S_^*&<Ucy@Cblrc&E4WLe$CgLDVhhgNR%33)F$s?cf*a0nu&(0^m?S0;Qb<1!jW8
z?+OY`2GK=A5O=>866gl;D})8wK{TU?Ks|_V5`oyuD=GkvwN_Dq3Xu4JQHZ&<Vgle;
zeJKVpCrMnO86^K)91_+65(3E}{#FTyyG$hoN<jS8k^*@kT3QN1cS}L!xupfVK;qM-
z1*$-_unZ(z>SP4Ksf0yVpco`xDGLeTSF#ZIq{s<?bIdt8h&$cnA^tco4~ZW;1&BLW
zDL~>uQ4!+bb&8O1a8?p11ev={2@)R~%HT=&>C==U{#R6inBT1e@h6L_Km$m9o2me~
ztofx1iPv;Bi23)_1ZqL@vFZYqAo_+n#2?NY5O;6UfY_s^DG(2mZ`XwA|Dp*|pRWZ8
zr>9yF^<mo3^r8)MmyQl3+~(*&<au==?r+eAxaW&5L_AdwV$N+n2;WB^5`G8uA>n3i
z08zi*0HR;X5W=5k2yq{W5k!5h5yaltMiBXUV~G4kV~9E4CJ_E!6No)}rV#hdGliHd
zXa<Rg1~Z6zzL`Pf)65~}-7<&h_pyNJ-)kXI44$Z3x=X3x@$?1m0;1FXEFn35u_Yvo
z<g6fO^jSgDB9Ar1t&P?YyFOS$%uca^#MxaN2tUvk!arpTaf^c;ME!a@h#zI`1uDRH
zA9G%<`)Innvw-OI&GrI;pm<_)fW%X=14QjZ2Z+0a9U*2Ma)h|a$O+=_rBGVJ86w~A
z3=#k33~_6|3naZfbAgx_;tJ7!#1*2>+znEmY;l9QRm)u<7d+$<@^;Ic=@0b;#HMd`
zhXf0khd>IbuqyBn$N<r|JRnKl%@dMz)_FpVQ1OCfu?=1VeIPG6cteurYHvsu)b@cm
zZGn#fxPD>tg*d&`7ozTgFQjP6^Mg3?p&um5g8U)+FZl~h0-2i@0128K0gxgpArK<}
zAP{1ne-OmHT~JyzSfB}1<gW~dWF3tVNS2!v0*PLMP>B8sp%C$3p%C+P!XQEPGEATY
zWN&e}zzPs88v*g>$_Rl?AbxD5zyc8cKN6y^Fba}|KSx25MS8TrB9J_Hj6f@ho)iP|
zr$Q{mpOa%D=F7%G+%Y!};!c@(fq5YHd*UHcX`BGDcYgxJ-L{Dk`_@Bg#UzM%Q<5M_
zi7^?Xu09zO9<P!i;S-qxao5=t2;U|ZqJCv6r091}gSg{x8bqI7I>g>x>5wAOC<CH?
zeg-7DOJqXK>&X<D0CKNf79?JlWkJGIARCed>#`w5@2_k~x=G4`n141$pb4ZeFc%_!
zHW%V<?>vZohw~s+P)I%`Jsiy!m<3XwSOBRCP8C4RF)f6o%Y}sy`!$Oo;WN7kl5X^i
zAw}-4Vu2+f{Rt(Icws4pR4tvQka!R-gH(<C%OK$qSq?GpVL2q;@+%<XoRtuLeU*?Z
zLA(kQZqutE?$xM<_+wc$B;5qmK*D=}4J1CzY9a1hQ40w-t2zjOO&uit=+#5`3+e?{
zgWT)e012Oy4FaGB&GeW?NLBN)5mNQGG(p0VqgkL4q`tcu;$N{Af$1Rr`W8r)<kAXp
z=aE*3J44$b>Fr7zq-qXrhoqwu?GX37bwG;Z109h3YuX73|BIcFsx!O`V&3&GfoULn
z^1C7F;zc*49H{7l$p7ep=+EtinE#*`60RA25Od!3LHw814~fTX{Sg0qOn|7nFaZ*7
z?h_&A?3oBrr!ff<FWV+T)Y(mjq?7fNA>ryc1ro2Pr$CB#x2X_+U!Mvw&u<#U-c!>c
z>B)FH#J!uRLz);8Ga&pKGayAM$4m%aF%uF#-)2JcN7F2bKR9MX+*JalAIyfBA2SD{
z{?;5w{&AlRap#V?ko==F4<bHu9z?z9e2D+s=R?Bl*L;XSS{6XmeOv(1pR^ES?t_I8
z`_mRd!r|Q_NWO?%EKmU||1K{UC<M`NO9Zk(^yVc3tsvTJsX!ixUbR%98bqrv6KDs~
z8<q(afM})V5cx^V1sXwo(G?JS#tMi!#g!0qr>qpH1<4Dq5-0}I9jgTLLG;g60-Yeb
zWi>=S?;3$j5Wiv#BphF?f#jdUwUG45woYIoxGK_b`{Or#;s#Jvv`zrrR})wd@p9vO
zND}zA9-^gt10*V$HVTx0jov7b2BIHq6sQ8xF`EQxK=iFm0;wR{aWkX}TD}?5O5)f8
z@nXdmfijT%hb;nKAi8F&z$6eYuuY%{M7L}Mn>TGcB&B3-7nsUqvuN55NP@520ddv4
z9gqSqW+%i|mv=%u7_$pfARdF#2D>5Z=Iw?Q47__FzFD*fk|7oMLNe~Iy^x4?*atD^
z<UUA(u-Ol(P!8{hBp~wxkN{nN0HR;*Afy60c2M9tC}Yk)Bya>orydsA1)>#?Knj*~
zM+A<8_|uO<3KFAZ0vka5C&vW#fapcX1!jY2`x63FK=joU0$V_I_en?rC~yj5&xTV1
zi6C*|(~tzwb{Z18&rd@VY{(gbSWqZ#J|mC}q9x7>Oasvy&I(Kb(N5<e32w_dfjJ<4
z(0NE~?K}@rFLyy80VLjV0TN3;E<h4m?nQ8{On(WbQ!hah*o8}wRA6x#qJG0=h`96>
zh&{bm1hPQp{k#HcAk<!ksQY?VpaUdce@!3<M8CZz&;p{1uR~JN$LkPxMcjZCxOZ*{
z^n(1IeG?KtUv5I;Gx-)IeqP;zG$hh*L*nQ9ZAdzByaS2HEq5T|Dt962XzpEzIcoPH
z6=mN&NNW9Z4<es?A7cKU`;dYn;sK;!yZiuBafCjE$RBwKiI<c|ka+v`2$CKPA43Xi
z&L@zHaqbgH!J_^YQsK^j3MtUEpFt{;bx_*yImFxrP@4Y*#QjY#Ao2VD1tfPSyo3~7
zmtI2L6Y>gT@99?%aog9B^nCa=M8DY^NCR@s8%TjA{uWYzHot`w?1Jwg`a9l1)c<}5
z@pt)qNH{)x5Ajds2Z;HvKS07Q_#;I8^+!nli2nqsklufS_%r=8#Gju(L-^TWAnw2O
z1!8a3SBUtduaJBi@C_0V+rB~EtMeUF!R-4EsUYlrK;)PFfK-@rKOyPA{-*$V0Oi?F
zNW-Dw7o>pZ_zh8?_Zy=B-ET-bi2DO^|FJ(1eY$@k{+j<668?PuAm(@cgM<Uie+b?1
zA0qziKe&RM+AX*clq~fa1;JhC&5VNJF0KZXAh@eMk4X^RCDvjV1b4lcFbjga;xa6P
z;4b_|7C~^k%#>9SJiIZFRS-PHz|98Xm#_(fham2=34*)gF6@HfcKs@L!5UCML4!ju
z4n%iA=@(GigA*dYf>SUaB+tnuSOlVLxdanI^aC!zbP(;yEeP&+tmlTP6X1c+g**`b
z7kLC@K<e~)A>tEwA>tpP{6Id4_$DYV%n#w0K<TUeg7M(dPRQ`2K8K*_^dJF2Cy<%b
U1R!R8gVJGwg2zGP@<M{;0CqpB1^@s6

delta 12739
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

diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5
index 45f12e6b49..ef7ffe9dc4 100644
--- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5
+++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5
@@ -1 +1 @@
-dd9863e47bad7b44d48640513a8a3d4b
\ No newline at end of file
+4bb9c10ee8dcc4f05fef0928ec526b5b
\ No newline at end of file
diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1
index 1d0cc7569e..d99c5b6b1d 100644
--- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1
+++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1
@@ -1 +1 @@
-8ade955fe62f8e6cd809f37f3479ddc843882bce
\ No newline at end of file
+f4bc86db3f023f2b9481db399c6d439ba41e5272
\ No newline at end of file
diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml
index 0c7daa29ab..a0a6c1a096 100644
--- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml
+++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml
@@ -7,6 +7,6 @@
     <versions>
       <version>1.8.1</version>
     </versions>
-    <lastUpdated>20250420103843</lastUpdated>
+    <lastUpdated>20250420181801</lastUpdated>
   </versioning>
 </metadata>
diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5
index 614bd5caf1..da7a315b7d 100644
--- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5
+++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5
@@ -1 +1 @@
-89409a86b1aa8f975e87a5a57220ef58
\ No newline at end of file
+9690000f3e5e3480a1e848c01b121660
\ No newline at end of file
diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1
index 23f1f5b995..0b5454ddc4 100644
--- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1
+++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1
@@ -1 +1 @@
-f43ca1a24f845bd78c8552fc80003d126ae7e1d8
\ No newline at end of file
+7931c7834aa370963a4d31537c24f9aa1dc668d6
\ No newline at end of file
diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py
index 5d4f8b09de..ad8d023dd8 100644
--- a/dbrepo-search-service/app.py
+++ b/dbrepo-search-service/app.py
@@ -29,7 +29,7 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
         },
     },
     'handlers': {'wsgi': {
diff --git a/dbrepo-search-service/init.py b/dbrepo-search-service/init.py
index 48a59538e0..c4aef34a47 100644
--- a/dbrepo-search-service/init.py
+++ b/dbrepo-search-service/init.py
@@ -19,7 +19,7 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
         },
     },
     'handlers': {'wsgi': {
diff --git a/docker-compose.yml b/docker-compose.yml
index 75dae591ef..e1fc9f26cf 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -57,12 +57,6 @@ x-healthcheck-params: &healthcheck-params
   timeout: 10s
   retries: 15
 
-x-logging-params: &logging-params
-  driver: fluentd
-  options:
-    fluentd-address: 127.0.0.1:24224
-    tag: dbrepo
-
 volumes:
   metadata-db-data:
   data-db-data:
@@ -98,7 +92,10 @@ services:
     deploy:
       <<: *resources-micro-hm
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: mariadb.metadata
 
   dbrepo-data-db:
     restart: "no"
@@ -124,7 +121,10 @@ services:
     deploy:
       <<: *resources-micro-hm
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: mariadb.data
 
   dbrepo-auth-db:
     restart: "no"
@@ -149,7 +149,10 @@ services:
     deploy:
       <<: *resources-micro
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: postgres.auth
 
   dbrepo-auth-service:
     restart: "no"
@@ -192,7 +195,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: keycloak.auth
 
   dbrepo-auth-service-init:
     init: true
@@ -222,7 +228,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.auth
 
   dbrepo-metadata-service:
     restart: "no"
@@ -293,7 +302,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: java.metadata
 
   dbrepo-analyse-service:
     restart: "no"
@@ -327,7 +339,10 @@ services:
     deploy:
       <<: *resources-micro
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.analyse
 
   dbrepo-broker-service:
     restart: "no"
@@ -357,7 +372,10 @@ services:
     deploy:
       <<: *resources-micro
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: rabbitmq.broker
 
   dbrepo-search-db:
     restart: "no"
@@ -406,7 +424,10 @@ services:
     deploy:
       <<: *resources-micro
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.search
 
   dbrepo-ui:
     restart: "no"
@@ -445,7 +466,10 @@ services:
     extra_hosts:
       - "localhost:host-gateway"
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: nuxt.ui
 
   dbrepo-gateway-service:
     restart: "no"
@@ -479,7 +503,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: nginx.gateway
 
   dbrepo-identity-service:
     restart: "no"
@@ -508,7 +535,10 @@ services:
     deploy:
       <<: *resources-nano
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: openldap.identity
 
   dbrepo-search-service-init:
     restart: "no"
@@ -537,7 +567,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.search-init
 
   dbrepo-dashboard-service-init:
     restart: "no"
@@ -565,7 +598,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.dashboard-init
 
   dbrepo-storage-service:
     restart: "no"
@@ -587,7 +623,10 @@ services:
     deploy:
       <<: *resources-nano
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: seaweedfs.storage
 
   dbrepo-metric-db:
     restart: "no"
@@ -606,7 +645,10 @@ services:
     deploy:
       <<: *resources-nano
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: prometheus.metric
 
   dbrepo-storage-service-init:
     restart: "no"
@@ -630,7 +672,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.storage-init
 
   dbrepo-data-service:
     restart: "no"
@@ -684,7 +729,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: java.data
 
   dbrepo-dashboard-ui:
     restart: "no"
@@ -718,7 +766,10 @@ services:
     extra_hosts:
       - "localhost:host-gateway"
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: opensearch.ui
 
   dbrepo-dashboard-service:
     restart: "no"
@@ -747,7 +798,10 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: python.dashboard
 
   dbrepo-logging-service:
     restart: "no"
@@ -758,6 +812,7 @@ services:
       - "24224:24224"
     volumes:
       - ./dbrepo-logging-service/default.conf:/opt/bitnami/fluent-bit/conf/fluent-bit.conf
+      - ./dbrepo-logging-service/dbrepo_parser.conf:/opt/bitnami/fluent-bit/conf/dbrepo_parser.conf
     deploy:
       <<: *resources-micro
     healthcheck:
@@ -773,7 +828,7 @@ services:
     restart: "no"
     container_name: dbrepo-logging-ui
     hostname: logging-ui
-    image: docker.io/bitnami/opensearch-dashboards:2.10.0
+    image: docker.io/bitnami/opensearch-dashboards:2.19.0
     ports:
       - "5601:5601"
     environment:
@@ -785,4 +840,7 @@ services:
       dbrepo-logging-service:
         condition: service_healthy
     logging:
-      <<: *logging-params
+      driver: fluentd
+      options:
+        fluentd-address: 127.0.0.1:24224
+        tag: fluentbit.logging
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
index 52b6f4daf4c66a7ddd8c594515069e24e3936fae..37865c8fadb7d281ce560b9b1bcf48df35e4a7e8 100644
GIT binary patch
delta 976
zcmbQ^KhIw{z?+#xgn@yBgTZytl&AyKV|SHI6jrQ1?RVHfV2}GL`ycE%%a`~%<%#eG
zY*m<gy!LU<imOLfzVY??FK6DWpv5ASvwrX6xgXbrCzQ1I{osyT9zA(;XUCxjx0D2?
z)zqE1$yH_Y=G3a*cNaHB`1E&FE`L2q|CDb1orRySUox<8+jWWSMEE2BSy^WyBO~r?
zm9e^2(7x?D*ZKO1%HNL${IbbBb?sS>VgB6Yqm64frfhdeEV%wAE9b(6`!(qo@>`O=
zIscnK=ltu`b7n5q)4g}zf8V-p&Vs!47dZl$JhFl#3sS6I=enx<e@c<4SS-9>XF>bK
z_iWs}X*Pe}bZq~2@MAK25u5K!pZ34DCjWMN=kD5`X#Ys~VfBf}ob~??*sW@d-+pYt
zBE|P1llNyywN0tJSJE1gtGvA;pp^Tzp@5y{)eqtp-{LmcTdd!zY?9&Mdi}<0;oOO8
zffN0fi)(eKr%pXG!Pnqi+QlWaQX2wA)Fqd^eERa<=C%9h{Pt~D>DG{buXsyew^=~{
zg>$#L5zjqFP*iX+FmNz1xH2x9yn#`b$z{>x>x_C#u8StKGs%M}4JI`Z6~LqoqH38;
zLDUu|Z;(nx=5rwGB6AOu>!Qu^EOVJa^glKpP7uu_P%8*h+^skpL}@5Z;e<!{<fBTK
zOs<P2Da$Y}n=Gp=q2RJ;N)!VU5Q4J>7~VRbWt{wwS!8miGLJFH2)G;r0|PUh15)^x
zk%1wxL_ffrkx7IZ>a#_YS18NK$T5LsN=nN!Q}fUjJW!TlbesHFSq|h-Srr+^;>nFF
zGTNxdpgK?=#okqu8&&K;VR2AJhUq)gWI<-F$(*V@U~l>SW?7}jz`&rxz`)=H*TulF
zr13cO<cG{IlPgtu6hPkk|EYPmKNADPHC6@&BNT<9ER*wDOeWuiD&+nr_~#Y}1H(E2
z1_m({g<sev^RY`zmQ~{c`9xbyhKWgFaz2at<N`GV#`%*Ms=0#1U#Q72H7ZW-Ws;tJ
qpGj=;8AU#*R}tA#*dydzG6Ms{Mg|53VH7LmCKsryv29WU2?78U=S~9v

delta 901
zcmbQ|KgVA>z?+#xgn@yBgMlG!O4M;@orgt?3=C(O7#Kt*-&GQ??+rQ_bXY-PZ@Sw5
z1N;oLOft`$edTDq_S}|h){VW1vnKH61pWSgY0I&Vk5{lKB+CDm%a7z*>|Njyf6(gg
ztT{28R~ziutRNsVSGH)Ah^<6XcIwjV4Jv7qm6NW$jJmk<)}^m}OZJ=bHYYFf)@A+W
z^~E)r*D|oRHP+j;U9>czTDSh8kY$m(^UKpq0@t2BS#!<Gy^A@rQHh`F@PmyvuU=?4
zxc{f#g8LkipPc{ApELWalDg=lb5G~I|6aY!`}l_2*#<ryY7?@9qaI!;6SC&+oB!ma
z!3VeHbu+u;dTPE0WF#Ite7>(Dd%mn~nS%PFz?UgE>^qOymoN1FZuiE$=2Q)TW_^wC
z`5RkvUc_eec*uP6Gy6IFSYpAu=c}}5<Vf#pZC(?-QI`4H<QTsCMyL0tzuPZIS+g*I
z3#nk;Yj^QbZ;<PhrGYBKrIV)!sRhmv-E>08wDWZ4q+_X5d^ca-+q-uEoZr68?%W5Y
z-z(nG*KHQif3fDMv?QB6C{DN-7&sUh7#PzgZ(>ws`kOlWCZisR;$)I%Vn~~;#iRzJ
zf|#^HR6Ua^h}y>F4N}6)d=5liX6|8PNZXvqGM9<zZ|Wv?9!{peshjx(Y6U@RdlhGc
zC@rNaobZUBd|b&=9>iln0-SKR0K;3yC6ncqB|xTID$6jQo*bsE2;x*K%ZUDFWMD`v
z(GT!uWD;S9x;}04DrFgV878pI<Ukc+4Ac2hOm~_5Us(?1EO`|frb4F4{Y<ixqg1#Q
z(A}huqH6_6q4ebWDoXNyQ>R4znb+pj#lXPufq{WR1Fn#PVM*iH$q!V_LGG1Qm0>(O
z*-SMMWLKxE3{x=6<U$sc$+uN`K+-Q&Wtcv(O%`C6m@Kab7SUCcVPX)NT*#t6xk$}`
zX|C+#ekSS3`_(i-2E0;}VX9YzibzeiRTl$$Q`jTqTrvX#!$t-M24NI;$V@I$S7Y0t
H1QG-Q1I9Io

-- 
GitLab