Commit Graph

2342 Commits

Author SHA1 Message Date
634043ebd9 Reformat Transforms in yarp.json for readability
Reformatted the `Transforms` sections in `yarp.json` to use
multi-line JSON objects instead of single-line objects.
This change improves the readability and maintainability
of the configuration file without altering its functionality.
2026-06-05 10:26:29 +02:00
1bf1c37296 Update receiver-ui-envelope route and add transforms
The `Path` matching rule for the `receiver-ui-envelope` route was updated to use `/envelope/{EnvelopeKey}` instead of the wildcard `/envelope/{**catch-all}` for more specific routing.

Additionally, a `Transforms` section was added to the route, which includes a transformation to set the path to `/index.html`.
2026-06-03 10:32:03 +02:00
ea6f3e61be Add GetDocumentOfReceiver method to DocumentController
The `GetDocumentOfReceiver` method was introduced to handle
retrieving a document for a specified envelope key. It is
secured with the `[Authorize(Policy = AuthPolicy.Receiver)]`
attribute and responds to HTTP GET requests with a route
parameter `envelopeKey`.

The previous logic for extracting and validating the
`envelopeId` from user claims was removed. This was replaced
with a call to `User.GetEnvelopeIdOfReceiver()` for improved
clarity and maintainability.

The method uses the `mediator` to send a `ReadDocumentQuery`
and returns a `NotFound` response if the document's `ByteData`
is empty.
2026-06-03 10:31:29 +02:00
0c446bba56 Enhance claim handling in ReceiverClaimExtensions
Refactor `ReceiverClaimExtensions` to support multiple claim
type variations by introducing arrays for envelope ID, UUID,
and receiver signature claim types. Updated the
`GetRequiredClaimOfReceiver` method to handle multiple claim
types and provide detailed error messages when claims are
missing. Refactored methods to use the new claim type arrays
for improved flexibility and robustness.
2026-06-03 10:31:14 +02:00
e74c777687 Add COPILOT_CONTEXT_EN.md to SolutionItems section
A new `SolutionItems` section was added to the `EnvelopeGenerator.sln` solution file. This section includes the `COPILOT_CONTEXT_EN.md` file, which is likely intended for documentation or context purposes. The section is marked as `preProject`, ensuring it is processed before other project sections.
2026-06-01 16:16:03 +02:00
d678111f25 Update y-coordinates for annotations in annotations.json
Adjusted the y-coordinate values for annotations with id 1, 2,
and 3 in annotations.json to reposition them on their respective
pages:
- Changed y for id 1 from 980.0 to 380.0.
- Changed y for id 2 from 980.0 to 680.0.
2026-06-01 16:15:53 +02:00
469e335fc3 Set background color and adjust label positioning
Added a `BackColor` property to both `signature` and
`signatureLabel` objects to improve visual consistency.
Adjusted the `BoundsF` property of `signatureLabel` to
slightly move the label upward for better alignment.
2026-06-01 16:15:30 +02:00
8d9dbbea19 Update receiver-ui cluster address in yarp.json
Replaced the `primary` destination address in the `receiver-ui`
cluster from `http://172.24.12.39:1234` to `https://localhost:52936`.
This change likely supports local development or testing by
switching to `localhost` with HTTPS and a different port.
2026-06-01 16:04:05 +02:00
d1088798e5 Add iText library for PDF processing functionality
The `itext` library (version 8.0.5) was added as a package reference to the `EnvelopeGenerator.ReceiverUI.csproj` file. This update introduces support for PDF generation or manipulation, potentially enabling new features or enhancing existing functionality related to PDF handling.
2026-06-01 15:37:15 +02:00
b4353cd9ff Move signature annotations to DetailBand
Updated `AddSignatureAtAnnotation` to use `DetailBand` instead of `BottomMarginBand` for managing signature annotations. Adjusted logic to ensure signatures are placed in the detail section and only displayed on the specified page using the `BeforePrint` event. Reformatted constants for readability and updated `RemoveExistingSignatureById` to operate on `DetailBand`. Removed reliance on bottom margin height for positioning and introduced `annotation?.Y` for vertical placement.
2026-06-01 15:37:03 +02:00
0ea7386cb6 Update project version to 1.3.0
Updated `<Version>` to 1.3.0 to reflect the new application version.
Aligned `<AssemblyVersion>` and `<FileVersion>` to 1.3.0.0
for API compatibility and Windows file version consistency.
2026-06-01 11:32:39 +02:00
161ec6491d Add dynamic typing animation to homepage description
Introduced a dynamic typing effect for the homepage description using the `Typed` library. Replaced hardcoded description text in `Index.razor` with a dynamically rendered `<span>` element. Added a constant for the description text and implemented `OnAfterRenderAsync` to invoke the typing animation on first render.

Included the `typed.umd.js` library in `index.html` and updated `receiver-signature.js` with a `startTyped` function to support typing animations. Registered `startTyped` in the public API for external use.

Enhanced the user experience with dynamic content rendering and improved maintainability by centralizing the description text. Also added a new theme file for improved styling.
2026-06-01 11:32:27 +02:00
6d254281f8 Update ReverseProxy config and adjust destination address
Added a new `ReverseProxy` section in `appsettings.Development.json` to define the `receiver-ui` cluster with a destination pointing to `https://localhost:52936`. Reformatted the `Logging` configuration without changing its values.

Updated the `yarp.json` file to modify the `receiver-ui` cluster's destination address from `https://localhost:52936` to `http://172.24.12.39:1234` to reflect the new backend service location.
2026-06-01 10:43:04 +02:00
5dc32a02a9 Update version to 1.3.1 and simplify YARP proxy logic
Updated the project version in `EnvelopeGenerator.API.csproj`
from `1.3.0` to `1.3.1`, including `<Version>`, `<FileVersion>`,
and `<AssemblyVersion>` properties, indicating a minor update.

Simplified the YARP proxy mapping in `Program.cs` by replacing
the conditional `app.MapWhen` logic with a direct call to
`app.MapReverseProxy()`, allowing all requests to be forwarded
through the reverse proxy without path filtering.
2026-06-01 10:39:44 +02:00
ba468c3f99 Update privacy policy styles and fix stylesheet path
Added new CSS rules in `privacy-policy.css` to improve the styling of the body, header, headings, sections, lists, and links. Minified these styles into `privacy-policy.min.css` for better performance. Updated the stylesheet path in `privacy-policy.de-DE.html` to ensure the correct relative path is used.
2026-06-01 10:39:04 +02:00
bca0b09cf4 Add IIS publish profile for .NET 8.0 deployment
A new publish profile `IISProfileNet8.pubxml` was added to configure deployment settings for a .NET project targeting the `net8.0` framework. Key settings include:

- `WebPublishMethod` set to `Package` for deployment packaging.
- `LastUsedBuildConfiguration` set to `Release`.
- `DesktopBuildPackageLocation` specifies the output path with a version placeholder.
- `PackageAsSingleFile` set to `true` for single-file packaging.
- `DeployIisAppPath` set to `EnvelopeGenerator` for IIS deployment.
- `TargetFramework` specified as `net8.0`.

This profile streamlines the deployment process and ensures compatibility with .NET 8.0.
2026-06-01 10:02:29 +02:00
a6ddc72df3 Update project version to 1.3.0
Updated `Version`, `FileVersion`, and `AssemblyVersion` in the `EnvelopeGenerator.API.csproj` file from `1.2.3` to `1.3.0`, indicating a minor version update with backward-compatible improvements or new features.
2026-06-01 05:00:35 +02:00
759a4e6b75 Update version to 1.2.0 with assembly and file updates
The `<Version>` element was updated from `1.0.1` to `1.2.0`, marking a new release with potential new features or improvements.
The `<AssemblyVersion>` was updated from `1.0.1.0` to `1.2.0.0`, indicating changes that may affect API compatibility.
The `<FileVersion>` was updated from `1.0.1.0` to `1.2.0.0`, reflecting the new build or release version.
2026-06-01 05:00:05 +02:00
cc68f76180 Simplify layout and remove unused styles
Removed styles for `.sidebar` and `.top-row` elements, including their background, layout, and responsive behavior, as they are no longer used. Simplified `main` and `article` elements by standardizing `margin` and `padding` to `0`.

Removed media query styles for `.top-row` and `.sidebar` to streamline responsive design. Updated global styles in `app.css` to ensure consistent spacing and alignment for `html`, `body`, `main`, and `.page`.

Focused on creating a cleaner, more minimal design by removing redundant styles and ensuring uniformity across the layout.
2026-06-01 04:59:46 +02:00
6a03308dc1 Update UI and improve routing and parameter handling
Updated the content in `Index.razor` to describe the digital signature portal's features and removed redundant UI elements, including a document signing button and a feature badge.

Modified `ReportViewer.razor` to remove the `/receiver` route, leaving only `/receiver/{EnvelopeKey}`. Updated the `EnvelopeKey` parameter to be non-nullable with a default value, improving type safety and preventing null reference issues.
2026-06-01 04:44:46 +02:00
4c33b1020a Redesign home page layout and improve user experience
Replaced the old card-based layout in `Index.razor` with a modern, visually appealing home page design. Added a hero header, content section, and call-to-action button for signing documents. Introduced new SVG icons and text elements to enhance the UI.

Removed the `OnAfterRenderAsync` method and automatic redirection logic to simplify user navigation. Added a new stylesheet link for the DevExpress Blazor theme.

Updated `app.css` to support the new design:
- Changed `article` overflow to `overflow-y: auto`.
- Added new classes for layout, buttons, and feature badges.
- Styled the home page with a gradient background, rounded corners, and hover effects.

These changes improve usability, responsiveness, and visual consistency.
2026-06-01 04:39:50 +02:00
5237c91100 Add footer and privacy policy files to ReceiverUI
Introduced a new footer in `MainLayout.razor` with copyright
information, a link to "Digital Data GmbH," and a privacy
policy link. Added two new privacy policy files
(`privacy-policy.en-US.html` and `privacy-policy.fr-FR.html`)
to the project and configured them to always copy to the
output directory.

Updated `app.css` to adjust layout heights to accommodate
the footer. Added new styles for the footer, including a
gradient background, responsive design, and hover effects
for links.
2026-06-01 04:31:12 +02:00
a6f699687c Add privacy policy documents in three locales
Added privacy policy documents in German (de-DE), English (en-US), and French (fr-FR). Each document is structured as an HTML file with sections covering general information, data processing responsibilities, data collection, use of cookies, and rights of affected persons.

Included metadata (title, charset, viewport) and linked a consistent stylesheet (`css/privacy-policy.min.css`). Provided contact details for the manufacturer (Digital Data GmbH) and Data Protection Officer in all locales.

Referenced locale-specific legal frameworks (e.g., GDPR, DSGVO, RGPD) and outlined session cookie usage. Documents are dated November 18, 2025, ensuring clarity and compliance with data protection regulations.
2026-06-01 04:28:09 +02:00
9cb29a0f1c Improve UI, fix signature placement, add documentation
Enhanced `ReportViewer.razor` with new UI elements, including a detailed `receiver-info-header` and `receiver-action-bar` for better signature workflows. Refactored signature logic to ensure accurate placement using `report.AfterPrint` and `PrintingSystem.Pages`. Removed legacy methods and iText7-based workflows.

Added Turkish documentation (`COPILOT_CONTEXT_TR.md`) detailing project structure, workflows, and pending tasks. Updated `MainLayout.razor` to simplify layout. Improved styling in `app.css` for better visual hierarchy and readability.

Documented pending tasks such as adding signature backgrounds, improving checkbox styles, and automating signature workflows.
2026-06-01 04:12:52 +02:00
26e6aea6f7 Add EnvelopeReceiverService to DI container
A new service, `EnvelopeGenerator.ReceiverUI.Services.EnvelopeReceiverService`, was registered in the dependency injection container using `AddScoped`. This ensures the service is available for injection with a scoped lifetime, creating a new instance per HTTP request or scope.
2026-06-01 03:56:23 +02:00
122942a5ff Add EnvelopeReceiverDto and related service class
Introduced `EnvelopeReceiverDto` and its nested models (`EnvelopeClientDto`, `EnvelopeSenderDto`, `DocumentClientDto`, `SignatureClientDto`, `ReceiverClientDto`) to represent client-side data for envelope receivers and their associated entities.

Added `EnvelopeReceiverService` to fetch `EnvelopeReceiverDto` from the API using `HttpClient`. Implemented error handling and JSON deserialization with `JsonSerializerDefaults.Web`. Updated necessary `using` directives.
2026-06-01 03:56:02 +02:00
360a762fb9 Refactor return value in EnvelopeReceiverController
Modified the method to return a single item or null by using
`SingleOrDefault()` on the result of `await _mediator.Send(...)`.
This ensures the response is no longer a collection but a single
object, improving clarity and aligning with expected behavior.
2026-06-01 03:53:01 +02:00
683f1eaf13 Improve signature workflow in ReportViewer.razor
Enhance the user interface and functionality for applying signatures:
- Add detailed display of signature fields and their pages.
- Introduce a progress bar to show marking progress visually.
- Display success message when all fields are marked.
- Automatically submit signatures when all fields are marked.
- Provide guidance for creating a signature if none exists.
- Disable "Export Signed PDF" button until signature is applied.
- Refactor code to simplify logic and remove redundancy.

These changes improve usability and provide clearer feedback to users.
2026-06-01 03:25:35 +02:00
d657f3825c Set initial zoom level for DxReportViewer to 130%
Added a `Zoom` property with a value of `1.3` to the `DxReportViewer` component in `ReportViewer.razor`. This change adjusts the default display scale to improve readability and enhance the user experience.
2026-06-01 03:21:04 +02:00
638c6f3291 Refactor signature popup handling in ReportViewer
Simplified the `OpenSignaturePopupAsync` method by converting it to a synchronous `void` method and removing unnecessary asynchronous calls. Introduced a new `OnPopupShownAsync` method to handle popup initialization logic.

Updated the `<Popup>` component to include the `Shown="OnPopupShownAsync"` attribute and re-added the `CloseOnOutsideClick="false"` attribute. Improved the logic for opening the signature popup by setting the active tab and resetting validation messages inline.

Enhanced the `OnAfterRenderAsync` lifecycle method to include additional checks for `Report`, annotations, and signature state before triggering JavaScript runtime calls. These changes improve the popup's behavior and overall state management.
2026-06-01 02:56:51 +02:00
1bdceb8b42 Update popup behavior and footer button logic
Modified `<DxPopup>` properties to prevent closing via Escape,
outside clicks, or the close button. Updated the "Schliessen"
button to always be enabled, regardless of `_capturedSignature`
state.
2026-06-01 02:51:23 +02:00
164dfacab3 Improve signature UI and refactor ReportViewer.razor
Updated the signature button text and SVG icon for clarity.
Enhanced the `DxPopup` component with better interaction
properties (`CloseOnEscape` and `CloseOnOutsideClick`).
Disabled the "Close" button in the popup when no signature
is captured.

Reformatted and restructured constants and fields in the
`@code` block for readability. Reintroduced previously
removed fields, constants, and methods to ensure
functionality. Added a conditional block in `LogoutAsync`
to open the signature popup when the user has access.

Performed general cleanup and code reorganization to
improve maintainability.
2026-06-01 02:42:32 +02:00
d8781a4b41 Refactor .annot-sig-cb-wrapper styles for modern UI
Updated `.annot-sig-cb-wrapper` and related classes to improve
appearance, interactivity, and hover effects. Key changes include:
- Increased `border-radius` and adjusted `font-size`, `font-weight`,
  and `padding` for a cleaner look.
- Replaced solid background and borders with gradient backgrounds
  and updated `box-shadow` for modern styling.
- Added `cursor` property and refined `transition` effects for
  smoother interactions.
- Updated hover and checked states with dynamic `filter` and
  enhanced `box-shadow`.
- Hid `.annot-sig-cb` checkbox and improved `.annot-sig-cb__label`
  readability with `letter-spacing`.
2026-06-01 02:06:28 +02:00
ee442d35b5 Simplify signature formatting and adjust layout
Simplified the `signatureInformation` string formatting by removing the `"Empfaengerunterschrift\n"` prefix and starting directly with `signerFullName`. Adjusted `infoHeight` from `65F` to `48.75F` to refine layout spacing.

Added a `BackColor` property to both `XRPictureBox` and `XRLabel` for consistent background styling (`Color.FromArgb(219, 219, 219)`). Updated `XRLabel` properties: adjusted `BoundsF` to offset `labelY` by `-5` for better vertical alignment and changed `TextAlignment` from `TopLeft` to `TopCenter`.

Made minor formatting adjustments to improve the visual consistency of signature and label elements.
2026-06-01 01:49:45 +02:00
c9264dc8de Add comprehensive documentation for EnvelopeGenerator
Enhanced documentation for the EnvelopeGenerator system:
- Added purpose section describing its functionality as a digital document signing system.
- Documented solution structure, listing projects, frameworks, and purposes.
- Highlighted key files in `ReceiverUI` and `API` with their roles.
- Explained `AnnotationDto` coordinate system and unit conversions.
- Detailed the signing flow in `ReceiverUI`, including page load, signature popup, and export steps.
- Documented JavaScript checkbox overlay logic for annotations.
- Provided a breakdown of `StampSignaturesOnPdf` using iText7.
- Described `BuildFreshBaseReport` behavior in real and dev modes.
- Listed NuGet packages with versions and purposes.
- Added "Mistakes History" to prevent repeated errors.
- Clarified why DevExpress X.509 signing article does not apply.
- Summarized development sessions in a change log.
2026-06-01 00:34:09 +02:00
6672b902b0 Make AnnotationDto properties non-nullable
Changed the `Page` property from `int?` to `int` to ensure it always has a value. Similarly, changed the `X` and `Y` properties from `double?` to `double` to enforce non-nullable values for horizontal and vertical positions.
2026-05-31 22:26:20 +02:00
614a275740 Enhance signature handling and annotation features
- Added dependency injection for `AnnotationService`, `DocumentService`, and `AuthService` in `ReportViewer.razor`.
- Improved signature button logic with dynamic appearance and feedback.
- Introduced annotation checkbox overlays for marking signature fields.
- Refactored signature saving and application logic into `SaveSignatureAsync` and `SubmitSignaturesAsync`.
- Added `BuildFreshBaseReport` and `AddAnnotationPlaceholders` for dynamic report creation.
- Implemented annotation-specific signature placement with `AddSignatureAtAnnotation`.
- Enhanced state management for annotations and signature overlays.
- Updated `app.css` with styles for annotation checkboxes.
- Added cache-control headers and versioned JavaScript in `index.html`.
- Improved `receiver-signature.js` with annotation checkbox management, optimized signature pad logic, and debugging utilities.
- Performed general code cleanup and optimization for maintainability.
2026-05-31 16:38:41 +02:00
a668dfa3eb Refactor envelope ID retrieval and error handling
Replaced hardcoded `envelopeId` with dynamic retrieval from
user claims. Reintroduced and updated error handling logic
to validate the `envelopeId` and log detailed errors when
parsing fails. Improved robustness by returning a 500 error
for invalid or missing envelope claims.
2026-05-31 16:15:00 +02:00
21c6b65318 Add no-cache headers to receiver-ui responses
Introduce a `Transforms` section in `yarp.json` for the `receiver-ui` route to enforce a no-cache policy. This includes setting the following response headers for all responses:
- `Cache-Control`: `no-cache, no-store, must-revalidate`
- `Pragma`: `no-cache`
- `Expires`: `0`

These changes ensure that client-side caching is disabled for the `receiver-ui` route.
2026-05-31 13:51:40 +02:00
759b60889e Add AnnotationDto and AnnotationService for API integration
Added `AnnotationDto` to represent signature annotation positions,
including properties for ID, page, and coordinates, with detailed
documentation on coordinate systems. Implemented `AnnotationService`
to fetch annotation data from an API endpoint, using `HttpClient`
and supporting cancellation tokens. Registered `AnnotationService`
in the DI container to enable its use across the application.
Provided development setup details for working with fake data
via YARP-proxied routes.
2026-05-31 11:19:03 +02:00
5964ebc088 Add receiver-ui-annotation-fake route to yarp.json
Added a new route configuration `receiver-ui-annotation-fake` to the `yarp.json` file. This route is associated with the `receiver-ui` cluster, has an `Order` value of `10`, and matches requests to `/api/Annotation/{envelopeKey}` with `GET` and `HEAD` methods. A path transformation rewrites the route to `/fake-data/annotations.json`.
2026-05-31 11:11:58 +02:00
dcb3e5d45d Mark Type obsolete; add X and Y properties
The `Type` property in `AnnotationCreateDto` was marked as obsolete with the note: "Not required for DevExpress."

Added `X` and `Y` properties to represent the horizontal and vertical positions of the signature field on the page. Both properties use DevExpress units (hundredths of an inch) with the origin at the top-left corner of the page.

Detailed documentation was added for `X` and `Y`, including differences in coordinate systems and unit conversions between DevExpress, PSPDFKit, and GDPicture.
2026-05-31 11:11:47 +02:00
fb9bc95e5f Add annotations for pages 1-3 in annotations.json
Added three new annotation objects to `annotations.json`.
Each annotation includes an `id`, `page`, `x`, and `y` property.
The annotations are for pages 1, 2, and 3, all with the same
coordinates (390.0, 980.0).
2026-05-31 11:11:30 +02:00
d97268c18c Refactor AnnotationCreateDto and update appsettings.json
Refactored the `AnnotationCreateDto` class:
- Changed `ElementId` from `int` to `long` and made it mutable.
- Marked `Name`, `Value`, and `Type` as `[Obsolete]` with defaults.
- Added `[Obsolete]` attributes to `Width` and `Height`.
- Introduced a new `Page` property to replace `SignatureDto`.

Updated `appsettings.json`:
- Set `Api.BaseUrl` to an empty string.
2026-05-31 11:10:31 +02:00
d9d731ab59 Add logout functionality for envelope sessions
Introduced a "Logout" button in `ReportViewer.razor` that is displayed when an `EnvelopeKey` is present. The button includes a spinner to indicate progress during the logout process.

Added the `LogoutAsync` method in `ReportViewer.razor` to handle the logout operation, preventing multiple attempts and navigating the user to the login page upon success.

Implemented `LogoutEnvelopeReceiverAsync` in `AuthService` to send a POST request to remove the per-envelope receiver cookie. This ensures proper backend handling of the logout process.

Improved user experience by providing a responsive and clear logout mechanism for envelope-based sessions.
2026-05-31 10:29:46 +02:00
1c7ca765cb Add login route and enhance login page functionality
Added a new `/login/{**catch-all}` route in `yarp.json` for the `receiver-ui` cluster. Updated `Login.razor` with a modernized UI, including a gradient header, improved error handling, and a toggle for password visibility. Integrated `AuthService` for API-based login validation.

Refactored `Login.razor` logic to handle login outcomes (`Success`, `InvalidCode`, `NotFound`, `Error`) using the new `EnvelopeLoginResult` enum. Added `LoginEnvelopeReceiverAsync` method in `AuthService` to handle login requests via `POST /api/Auth/envelope-receiver/{key}`. Improved code maintainability and user experience.
2026-05-31 09:23:07 +02:00
de8d363c27 Add authentication for secure document access
Introduced a new login page (`Login.razor`) to handle user authentication via access codes. Implemented `AuthService` to validate access codes through an API. Updated `ReportViewer.razor` to check user access and redirect unauthorized users to the login page. Modified `Program.cs` to register `AuthService` for dependency injection. Enhanced document fetching in `ReportViewer.razor` to ensure secure access control.
2026-05-31 09:01:02 +02:00
390f2d2cae Replace DxPdfViewer with DxReportViewer for PDF handling
Replaced `DxPdfViewer` with `DxReportViewer` to unify handling of
both PDF and report rendering. Removed conditional logic for
`PdfBytes` and directly initialized `XtraReport` with PDF content
using `XRPdfContent`. Simplified `OnInitializedAsync` to fetch
PDF content, create a report, and store it in `ReportStorage`.
Removed unused fields (`PdfViewerUrl`, `PdfBytes`, and
`SignedPdfBytes`) and redundant code related to PDF handling.
2026-05-31 08:14:07 +02:00
697f85f805 Refactor signature handling and PDF export logic
Refactored the signature handling process by introducing a new
`Report` instance creation step in the `SignatureApplied` block
to streamline signed report generation. Added a validation check
in `ExportSignedPdfAsync` to ensure the `Report` object is not
null before proceeding with export. Removed redundant code for
manual signed report creation and simplified the export logic
by directly invoking `reportViewer!.ExportToAsync`. Incremented
`ViewerKey` to refresh the report viewer after signing.
2026-05-31 08:01:10 +02:00
d97172b9cf Add condition to bypass document fetching logic
Updated the `OnInitializedAsync` method in `ReportViewer.razor`
to include a check for `AppOptions.Value.ForceToUseFakeDocument`.
This ensures that the application can bypass fetching the
actual document when the configuration option is enabled.
2026-05-31 07:46:51 +02:00