CVE-2023-46245 (PHP, published 2023-10-31T16:15Z)
Description: value: Kimai is a web-based multi-user time-tracking application. Versions prior to 2.1.0 are vulnerable to a Server-Side Template Injection (SSTI) which can be escalated to Remote Code Execution (RCE). The vulnerability arises when a malicious user uploads a specially crafted Twig file, exploiting the software's PDF and HTML rendering functionalities. Version 2.1.0 enables security measures for custom Twig templates.
Severity: nan (CVSS v3 base score: 7.2)
Weakness: NVD-CWE-Other \u2014 Other
NVD is only using a subset of CWE for mapping instead of the entire CWE, and the weakness type is not covered by that subset.
Repository: https://github.com/kimai/kimai
Files changed:
.gitignore
composer.json
composer.lock
config/packages/doctrine.yaml
config/packages/framework.yaml
config/packages/kimai.yaml
config/packages/security.yaml
config/routes.yaml
config/services.yaml
phpstan.neon
src/API/ActionsController.php
src/API/ActivityController.php
src/API/BaseApiController.php
src/API/CustomerController.php
src/API/ProjectController.php
src/API/TimesheetController.php
src/API/UserController.php
src/Activity/ActivityService.php
src/Calendar/CalendarService.php
src/Command/DemoteUserCommand.php
src/Command/InvoiceCreateCommand.php
src/Command/UserLoginLinkCommand.php
src/Constants.php
src/Controller/AbstractController.php
src/Controller/ActivityController.php
src/Controller/ContractController.php
src/Controller/CustomerController.php
src/Controller/DashboardController.php
src/Controller/HomepageController.php
src/Controller/InvoiceController.php
src/Controller/PermissionController.php
src/Controller/ProfileController.php
src/Controller/ProjectController.php
src/Controller/Reporting/ReportUsersMonthController.php
src/Controller/Reporting/ReportUsersWeekController.php
src/Controller/Reporting/ReportUsersYearController.php
src/Controller/Reporting/UserMonthController.php
src/Controller/Reporting/UserWeekController.php
src/Controller/Reporting/UserYearController.php
src/Controller/Security/LoginLinkController.php
src/Controller/Security/PasswordResetController.php
src/Controller/Security/SelfRegistrationController.php
src/Controller/SystemConfigurationController.php
src/Controller/TimesheetAbstractController.php
src/Controller/UserController.php
src/Controller/WizardController.php
src/Customer/CustomerService.php
src/DependencyInjection/Configuration.php
src/Doctrine/ModifiedSubscriber.php
src/Doctrine/TimesheetSubscriber.php
src/Entity/Activity.php
src/Entity/ActivityMeta.php
src/Entity/ActivityRate.php
src/Entity/Bookmark.php
src/Entity/CommentTableTypeTrait.php
src/Entity/Customer.php
src/Entity/CustomerComment.php
src/Entity/CustomerMeta.php
src/Entity/CustomerRate.php
src/Entity/Invoice.php
src/Entity/InvoiceMeta.php
src/Entity/Project.php
src/Entity/ProjectComment.php
src/Entity/ProjectMeta.php
src/Entity/ProjectRate.php
src/Entity/Rate.php
src/Entity/RolePermission.php
src/Entity/Tag.php
src/Entity/Team.php
src/Entity/TeamMember.php
src/Entity/Timesheet.php
src/Entity/TimesheetMeta.php
src/Entity/User.php
src/EventSubscriber/Actions/InvoiceDocumentSubscriber.php
src/EventSubscriber/MenuBuilderSubscriber.php
src/EventSubscriber/UserPreferenceSubscriber.php
src/EventSubscriber/UserProfileSubscriber.php
src/EventSubscriber/WizardSubscriber.php
src/Export/Base/AbstractSpreadsheetRenderer.php
src/Export/Base/HtmlRenderer.php
src/Export/Base/PDFRenderer.php
src/Export/Renderer/HtmlRendererFactory.php
src/Export/ServiceExport.php
src/Export/Spreadsheet/Extractor/MetaFieldExtractor.php
src/Export/Spreadsheet/Extractor/UserPreferenceExtractor.php
src/Form/MultiUpdate/TimesheetMultiUpdate.php
src/Form/MultiUpdate/TimesheetMultiUpdateDTO.php
src/Form/Type/MenuChoiceType.php
src/Form/Type/SkinType.php
src/Form/UserCreateType.php
src/Invoice/ServiceInvoice.php
src/Kernel.php
src/Project/ProjectService.php
src/Project/ProjectStatisticService.php
src/Reporting/ReportingService.php
src/Repository/TimesheetRepository.php
src/Security/TwoFactorCondition.php
src/Timesheet/TimesheetService.php
src/Twig/Extensions.php
src/Twig/LocaleFormatExtensions.php
src/Twig/PaginationExtension.php
src/Twig/SecurityPolicy/ChainPolicy.php
src/Twig/SecurityPolicy/DefaultPolicy.php
src/Twig/SecurityPolicy/ExportPolicy.php
src/Twig/SecurityPolicy/ForbiddenPolicy.php
src/Twig/SecurityPolicy/InvoicePolicy.php
src/Twig/TwigRendererTrait.php
src/User/LoginManager.php
src/User/UserService.php
src/Widget/Type/AbstractActiveUsers.php
src/Widget/Type/AbstractAmountPeriod.php
src/Widget/Type/AbstractCounterDuration.php
src/Widget/Type/AbstractCounterYear.php
src/Widget/Type/AbstractUserRevenuePeriod.php
src/Widget/Type/AbstractWidget.php
src/Widget/Type/ActiveTimesheets.php
src/Widget/Type/ActiveUsersMonth.php
src/Widget/Type/ActiveUsersToday.php
src/Widget/Type/ActiveUsersTotal.php
src/Widget/Type/ActiveUsersWeek.php
src/Widget/Type/ActiveUsersYear.php
src/Widget/Type/AmountMonth.php
src/Widget/Type/AmountToday.php
src/Widget/Type/AmountTotal.php
src/Widget/Type/AmountWeek.php
src/Widget/Type/AmountYear.php
src/Widget/Type/DailyWorkingTimeChart.php
src/Widget/Type/DurationMonth.php
src/Widget/Type/DurationToday.php
src/Widget/Type/DurationTotal.php
src/Widget/Type/DurationWeek.php
src/Widget/Type/DurationYear.php
src/Widget/Type/PaginatedWorkingTimeChart.php
src/Widget/Type/TotalsActivity.php
src/Widget/Type/TotalsCustomer.php
src/Widget/Type/TotalsProject.php
src/Widget/Type/TotalsUser.php
src/Widget/Type/UserAmountMonth.php
src/Widget/Type/UserAmountToday.php
src/Widget/Type/UserAmountTotal.php
src/Widget/Type/UserAmountWeek.php
src/Widget/Type/UserAmountYear.php
src/Widget/Type/UserDurationMonth.php
src/Widget/Type/UserDurationToday.php
src/Widget/Type/UserDurationTotal.php
src/Widget/Type/UserDurationWeek.php
src/Widget/Type/UserDurationYear.php
src/Widget/Type/UserTeamProjects.php
src/Widget/Type/UserTeams.php
src/Widget/WidgetInterface.php
src/WorkingTime/WorkingTimeService.php
symfony.lock
templates/reporting/report_by_user.html.twig
templates/reporting/report_by_user_data.html.twig
templates/reporting/report_by_user_layout.html.twig
templates/reporting/report_by_user_year.html.twig
templates/reporting/report_by_user_year_export.html.twig
templates/security/password-reset/check_email.html.twig
templates/timesheet/multi-update.html.twig
templates/user/api-token.html.twig
templates/widget/widget-counter.html.twig
templates/wizard/layout.html.twig
templates/wizard/password.html.twig
tests/API/APIControllerBaseTest.php
tests/API/UserControllerTest.php
tests/Command/UserLoginLinkCommandTest.php
tests/DependencyInjection/ConfigurationTest.php
tests/Entity/TimesheetTest.php
tests/Export/Renderer/PdfRendererTest.php
tests/Export/Timesheet/HtmlRendererTest.php
tests/Export/Timesheet/PdfRendererTest.php
tests/Invoice/Renderer/PdfRendererTest.php
tests/Invoice/Renderer/TwigRendererTest.php
tests/Invoice/templates/default.pdf.twig
tests/phpstan.neon
translations/messages.ar.xlf
translations/messages.cs.xlf
translations/messages.da.xlf
translations/messages.de.xlf
translations/messages.de_CH.xlf
translations/messages.el.xlf
translations/messages.en.xlf
translations/messages.eo.xlf
translations/messages.es.xlf
translations/messages.eu.xlf
translations/messages.fa.xlf
translations/messages.fi.xlf
translations/messages.fo.xlf
translations/messages.fr.xlf
translations/messages.he.xlf
translations/messages.hr.xlf
translations/messages.hu.xlf
translations/messages.it.xlf
translations/messages.ko.xlf
translations/messages.nb_NO.xlf
translations/messages.nl.xlf
translations/messages.pl.xlf
translations/messages.pt.xlf
translations/messages.pt_BR.xlf
translations/messages.ro.xlf
translations/messages.ru.xlf
translations/messages.sk.xlf
translations/messages.sv.xlf
translations/messages.tr.xlf
translations/messages.uk.xlf
translations/messages.vi.xlf
translations/messages.zh_CN.xlf
translations/messages.zh_Hant.xlf
translations/wizard.de.xlf
translations/wizard.en.xlf
Commit message: Release 2.1.0 (#4321)

* fix deprecations
* remove unused config
* replace invalid annotation type with attribute
* use AsDoctrineListener to fix deprecation
* new ModifiedSubscriber to support custom logic and fix deprecation
* removed inheritdoc comment
* new ModifiedSubscriber to support custom logic and fix deprecation
* cleanup event dispatcher interface
* re-order annotation params
* one more doctrine based deprecation
* fix query to count active timesheets
* link to "all times" to identify active timesheets
* link icon instead of text
* fix "skin" translation in wizard
* use duration filter to show duration
* added login link command and controller
* bump tabler theme to 1.0
* added wizard to force password reset by user
* allow to configure that new accounts need to reset their password
* prevent uploading twig templates by default
* bump composer packages
* enable sandbox and basic security measures for custom twig templates for invoice and export
* bump to symfony 6.3.5
* allow to export single user reports to excel
* removed broken method to reload twig cache
* added api parameter to fetch user collection fully serialized
* allow to replace or append description via timesheet batch update
* show api username above form

Vulnerable code:
.htaccess
.env-*
.idea/
.DS_Store
rector.php
phpstan.sh
public/.user.ini
php.ini
.php-version
.yarnrc.yml
.yarn
!.gitkeep

/bin/*
!/bin/console
*local.yaml

/templates/invoice/renderer/.~lock*
/translations/branding.*.xlf

/var/coverage/

/var/invoices/*
*.disabled
        "kevinpapst/tabler-bundle": "^0.22",
    "content-hash": "9159cc3cf1d749c412d1353e921de6fc",
            "version": "2.1.3",
                "reference": "3023e150f90a38843856147b58190aa8b46cc155"
                "url": "https://api.github.com/repos/doctrine/collections/zipball/3023e150f90a38843856147b58190aa8b46cc155",
                "reference": "3023e150f90a38843856147b58190aa8b46cc155",
                "doctrine/coding-standard": "^10.0",
                "source": "https://github.com/doctrine/collections/tree/2.1.3"
            "time": "2023-07-06T15:15:36+00:00"
            "version": "3.6.6",
                "reference": "63646ffd71d1676d2f747f871be31b7e921c7864"
                "url": "https://api.github.com/repos/doctrine/dbal/zipball/63646ffd71d1676d2f747f871be31b7e921c7864",
                "reference": "63646ffd71d1676d2f747f871be31b7e921c7864",
                "phpstan/phpstan": "1.10.29",
                "phpunit/phpunit": "9.6.9",
                "source": "https://github.com/doctrine/dbal/tree/3.6.6"
            "time": "2023-08-17T05:38:17+00:00"
            "version": "v1.1.1",
                "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"
                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
                "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
                "source": "https://github.com/doctrine/deprecations/tree/v1.1.1"
            "time": "2023-06-03T09:27:29+00:00"
            "version": "4.0.1",
                "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff"
                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff",
                "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff",
                "phpunit/phpunit": "^9.5.27",
                "vimeo/psalm": "^4.30"
                "source": "https://github.com/egulias/EmailValidator/tree/4.0.1"
            "time": "2023-01-14T14:17:03+00:00"
            "version": "4.8.4",
                "reference": "a122b85d4a5a3257d471257a43ac3e5676a27ffe"
                "url": "https://api.github.com/repos/endroid/qr-code/zipball/a122b85d4a5a3257d471257a43ac3e5676a27ffe",
                "reference": "a122b85d4a5a3257d471257a43ac3e5676a27ffe",
                "source": "https://github.com/endroid/qr-code/tree/4.8.4"
            "time": "2023-08-28T18:12:07+00:00"
            "version": "3.5.0",
                "reference": "893f3a01e4d88789abc399c6f1b3cfff79238734"
                "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/893f3a01e4d88789abc399c6f1b3cfff79238734",
                "reference": "893f3a01e4d88789abc399c6f1b3cfff79238734",
                "symfony/config": "^4.4|^5.3|^6.0",
                "symfony/dependency-injection": "^4.4|^5.3|^6.0",
                "symfony/event-dispatcher": "^4.4|^5.3|^6.0",
                "symfony/http-foundation": "^4.4|^5.3|^6.0",
                "symfony/http-kernel": "^4.4|^5.3|^6.0",
                "symfony/routing": "^4.4|^5.3|^6.0",
                "symfony/security-core": "^4.4|^5.3|^6.0",
                "sensio/framework-extra-bundle": "<6.1",
                "symfony/error-handler": "<4.4.1"
                "doctrine/annotations": "^1.13.2",
                "symfony/asset": "^4.4|^5.3|^6.0",
                "symfony/browser-kit": "^4.4|^5.3|^6.0",
                "symfony/css-selector": "^4.4|^5.3|^6.0",
                "symfony/expression-language": "^4.4|^5.3|^6.0",
                "symfony/form": "^4.4|^5.3|^6.0",
                "symfony/mime": "^4.4|^5.3|^6.0",
                "symfony/phpunit-bridge": "^5.3|^6.0",
                "symfony/security-bundle": "^4.4|^5.3|^6.0",
                "symfony/serializer": "^4.4|^5.3|^6.0",
                "symfony/twig-bundle": "^4.4|^5.3|^6.0",
                "symfony/validator": "^4.4|^5.3|^6.0",
                "symfony/web-profiler-bundle": "^4.4|^5.3|^6.0",
                "symfony/yaml": "^4.4|^5.3|^6.0"
                "source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.5.0"
            "time": "2023-01-06T15:33:47+00:00"
            "version": "0.22",
                "reference": "fdc3c182f13dec439ce5110dededba2895518f8f"
                "url": "https://api.github.com/repos/kevinpapst/TablerBundle/zipball/fdc3c182f13dec439ce5110dededba2895518f8f",
                "reference": "fdc3c182f13dec439ce5110dededba2895518f8f",
                "php": ">=7.4",
                "symfony/asset": "^4.4 || ^5.4 || ^6.0",
                "symfony/config": "^4.4 || ^5.4 || ^6.0",
                "symfony/dependency-injection": "^4.4 || ^5.4 || ^6.0",
                "symfony/event-dispatcher": "^4.4 || ^5.4 || ^6.0",
                "symfony/http-foundation": "^4.4 || ^5.4 || ^6.0",
                "symfony/http-kernel": "^4.4 || ^5.4 || ^6.0",
                "symfony/options-resolver": "^4.4 || ^5.4 || ^6.0",
                "symfony/security-core": "^4.4 || ^5.4 || ^6.0",
                "symfony/translation": "^4.4 || ^5.4 || ^6.0",
                "symfony/twig-bridge": "^4.4 || ^5.4 || ^6.0",
                "phpspec/prophecy": "^1.6",
                "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0"
                "source": "https://github.com/kevinpapst/TablerBundle/tree/0.22"
            "time": "2023-06-15T06:00:11+00:00"
            "version": "2.12.0",
                "reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490"
                "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490",
                "reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490",
                "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0"
                "infection/infection": "^0.26.6",
                "laminas/laminas-coding-standard": "~2.4.0",
                "phpunit/phpunit": "^9.5.18",
                "psalm/plugin-phpunit": "^0.17.0",
                "vimeo/psalm": "^4.22.0"
            "time": "2022-10-10T10:11:09+00:00"
            "version": "9.10.0",
                "reference": "d24b0d484812313b07ab74b0fe4db9661606df6c"
                "url": "https://api.github.com/repos/thephpleague/csv/zipball/d24b0d484812313b07ab74b0fe4db9661606df6c",
                "reference": "d24b0d484812313b07ab74b0fe4db9661606df6c",
            "time": "2023-08-04T15:12:48+00:00"
            "version": "2.0.0",
                "reference": "1cf4c0b68b8461cea27411ff961482ce7687e34f"
                "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/1cf4c0b68b8461cea27411ff961482ce7687e34f",
                "reference": "1cf4c0b68b8461cea27411ff961482ce7687e34f",
                "source": "https://github.com/mpdf/psr-http-message-shim/tree/2.0.0"
            "time": "2023-09-01T06:08:18+00:00"
            "version": "1.24.1",
                "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01"
                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01",
                "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01",
                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.1"
            "time": "2023-09-18T12:18:02+00:00"
            "version": "1.0.2",
                "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
                "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
                "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
                "source": "https://github.com/php-fig/http-client/tree/1.0.2"
            "time": "2023-04-10T20:12:12+00:00"
            "version": "v2.4.1",
                "reference": "f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b"
                "url": "https://api.github.com/repos/Setasign/FPDI/zipball/f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b",
                "reference": "f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b",
                "source": "https://github.com/Setasign/FPDI/tree/v2.4.1"
            "time": "2023-07-27T08:12:09+00:00"
            "version": "v6.3.4",
                "reference": "e60d00b4f633efa4c1ef54e77c12762d9073e7b3"
                "url": "https://api.github.com/repos/symfony/cache/zipball/e60d00b4f633efa4c1ef54e77c12762d9073e7b3",
                "reference": "e60d00b4f633efa4c1ef54e77c12762d9073e7b3",
                "source": "https://github.com/symfony/cache/tree/v6.3.4"
            "time": "2023-08-05T09:10:27+00:00"
            "version": "v6.3.4",
                "reference": "68a5a9570806a087982f383f6109c5e925892a49"
                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/68a5a9570806a087982f383f6109c5e925892a49",
                "reference": "68a5a9570806a087982f383f6109c5e925892a49",
                "source": "https://github.com/symfony/dependency-injection/tree/v6.3.4"
            "time": "2023-08-16T17:55:17+00:00"
            "version": "v6.3.4",
                "reference": "589eeeb93669739ec1d8bd4593e4972d94e0981d"
                "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/589eeeb93669739ec1d8bd4593e4972d94e0981d",
                "reference": "589eeeb93669739ec1d8bd4593e4972d94e0981d",
                "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.4"
            "time": "2023-08-08T10:40:25+00:00"
            "version": "v6.3.2",
                "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a"
                "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a",
                "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a",
                "source": "https://github.com/symfony/error-handler/tree/v6.3.2"
            "time": "2023-07-16T17:05:46+00:00"
            "version": "v6.3.3",
                "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e"
                "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e",
                "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e",
                "source": "https://github.com/symfony/finder/tree/v6.3.3"
            "time": "2023-07-31T08:31:44+00:00"
            "version": "v6.3.2",
                "reference": "afdadf511e08bc6d4752afb869ce084276aca4e2"
                "url": "https://api.github.com/repos/symfony/form/zipball/afdadf511e08bc6d4752afb869ce084276aca4e2",
                "reference": "afdadf511e08bc6d4752afb869ce084276aca4e2",
                "source": "https://github.com/symfony/form/tree/v6.3.2"
            "time": "2023-07-26T17:39:03+00:00"
            "version": "v6.3.4",
                "reference": "f822f54ff05cd88878910b4559f66c12176d952c"
                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/f822f54ff05cd88878910b4559f66c12176d952c",
                "reference": "f822f54ff05cd88878910b4559f66c12176d952c",
                "source": "https://github.com/symfony/framework-bundle/tree/v6.3.4"
            "time": "2023-08-16T18:04:38+00:00"
            "version": "v6.3.2",
                "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00"
                "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00",
                "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00",
                "source": "https://github.com/symfony/http-client/tree/v6.3.2"
            "time": "2023-07-05T08:41:27+00:00"
            "version": "v6.3.4",
                "reference": "cac1556fdfdf6719668181974104e6fcfa60e844"
                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844",
                "reference": "cac1556fdfdf6719668181974104e6fcfa60e844",
                "source": "https://github.com/symfony/http-foundation/tree/v6.3.4"
            "time": "2023-08-22T08:20:46+00:00"
            "version": "v6.3.4",
                "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb"
                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb",
                "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb",
                "source": "https://github.com/symfony/http-kernel/tree/v6.3.4"
            "time": "2023-08-26T13:54:49+00:00"
            "version": "v6.3.0",
                "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435"
                "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435",
                "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435",
                "source": "https://github.com/symfony/mailer/tree/v6.3.0"
            "time": "2023-05-29T12:49:39+00:00"
            "version": "v6.3.3",
                "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98"
                "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98",
                "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98",
                "source": "https://github.com/symfony/mime/tree/v6.3.3"
            "time": "2023-07-31T07:08:24+00:00"
            "version": "v6.3.0",
                "reference": "d23ad221989e6b8278d050cabfd7b569eee84590"
                "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d23ad221989e6b8278d050cabfd7b569eee84590",
                "reference": "d23ad221989e6b8278d050cabfd7b569eee84590",
                "source": "https://github.com/symfony/password-hasher/tree/v6.3.0"
            "time": "2023-02-14T09:04:20+00:00"
        },
        {
            "name": "symfony/polyfill-ctype",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-ctype.git",
                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "provide": {
                "ext-ctype": "*"
            },
            "suggest": {
                "ext-ctype": "For best performance"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Ctype\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Gert de Pagter",
                    "email": "BackEndTea@gmail.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for ctype functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "ctype",
                "polyfill",
                "portable"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-01-26T09:26:14+00:00"
            "version": "v6.3.3",
                "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a"
                "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a",
                "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a",
                "source": "https://github.com/symfony/routing/tree/v6.3.3"
            "time": "2023-07-31T07:08:24+00:00"
            "version": "v6.3.4",
                "reference": "31957477b289220a47880ead3727bf5cc059fa08"
                "url": "https://api.github.com/repos/symfony/security-bundle/zipball/31957477b289220a47880ead3727bf5cc059fa08",
                "reference": "31957477b289220a47880ead3727bf5cc059fa08",
                "symfony/security-http": "^6.3"
                "source": "https://github.com/symfony/security-bundle/tree/v6.3.4"
            "time": "2023-08-25T08:46:23+00:00"
            "version": "v6.3.3",
                "reference": "b86ce012cc9a62a15ed43af5037eebc3e6de4d7f"
                "url": "https://api.github.com/repos/symfony/security-core/zipball/b86ce012cc9a62a15ed43af5037eebc3e6de4d7f",
                "reference": "b86ce012cc9a62a15ed43af5037eebc3e6de4d7f",
                "source": "https://github.com/symfony/security-core/tree/v6.3.3"
            "time": "2023-07-31T07:08:24+00:00"
            "version": "v6.3.4",
                "reference": "0afb37c1120c1c46219bdbd1dd912fb4d48eaf7d"
                "url": "https://api.github.com/repos/symfony/security-http/zipball/0afb37c1120c1c46219bdbd1dd912fb4d48eaf7d",
                "reference": "0afb37c1120c1c46219bdbd1dd912fb4d48eaf7d",
                "source": "https://github.com/symfony/security-http/tree/v6.3.4"
            "time": "2023-08-25T19:43:09+00:00"
            "version": "v6.3.4",
                "reference": "96d28a58d5a128bf77c54534b380eb7c92c8f846"
                "url": "https://api.github.com/repos/symfony/serializer/zipball/96d28a58d5a128bf77c54534b380eb7c92c8f846",
                "reference": "96d28a58d5a128bf77c54534b380eb7c92c8f846",
                "source": "https://github.com/symfony/serializer/tree/v6.3.4"
            "time": "2023-08-24T14:35:28+00:00"
            "version": "v6.3.2",
                "reference": "53d1a83225002635bca3482fcbf963001313fb68"
                "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68",
                "reference": "53d1a83225002635bca3482fcbf963001313fb68",
                "source": "https://github.com/symfony/string/tree/v6.3.2"
            "time": "2023-07-05T08:41:27+00:00"
            "version": "v6.3.2",
                "reference": "6f8435db76a2d79917489a19a82679276c1b4e32"
                "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/6f8435db76a2d79917489a19a82679276c1b4e32",
                "reference": "6f8435db76a2d79917489a19a82679276c1b4e32",
                "source": "https://github.com/symfony/twig-bridge/tree/v6.3.2"
            "time": "2023-07-20T16:42:33+00:00"
            "version": "v6.3.4",
                "reference": "0c8435154920b9bbe93bece675234c244cadf73b"
                "url": "https://api.github.com/repos/symfony/validator/zipball/0c8435154920b9bbe93bece675234c244cadf73b",
                "reference": "0c8435154920b9bbe93bece675234c244cadf73b",
                "source": "https://github.com/symfony/validator/tree/v6.3.4"
            "time": "2023-08-17T15:49:05+00:00"
            "version": "v6.3.4",
                "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45"
                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45",
                "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45",
                "source": "https://github.com/symfony/var-dumper/tree/v6.3.4"
            "time": "2023-08-24T14:51:05+00:00"
            "version": "v2.0.1",
                "reference": "150fe022740fef908f4ca3d5950ce85ab040ec76"
                "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/150fe022740fef908f4ca3d5950ce85ab040ec76",
                "reference": "150fe022740fef908f4ca3d5950ce85ab040ec76",
                "symfony/asset": "^5.4 || ^6.2",
                "symfony/config": "^5.4 || ^6.2",
                "symfony/dependency-injection": "^5.4 || ^6.2",
                "symfony/http-kernel": "^5.4 || ^6.2",
                "symfony/framework-bundle": "^5.4 || ^6.2",
                "symfony/phpunit-bridge": "^5.4 || ^6.2",
                "symfony/twig-bundle": "^5.4 || ^6.2",
                "symfony/web-link": "^5.4 || ^6.2"
                "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.0.1"
            "time": "2023-05-31T14:28:33+00:00"
            "version": "4.7.14",
                "reference": "e53c0c7a6e250c435cc13ab50792247a8eb07da3"
                "url": "https://api.github.com/repos/zircote/swagger-php/zipball/e53c0c7a6e250c435cc13ab50792247a8eb07da3",
                "reference": "e53c0c7a6e250c435cc13ab50792247a8eb07da3",
                "source": "https://github.com/zircote/swagger-php/tree/4.7.14"
            "time": "2023-09-12T00:18:13+00:00"
            "version": "3.1.0",
                "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
                "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
                "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
                "source": "https://github.com/composer/pcre/tree/3.1.0"
            "time": "2022-11-17T09:50:14+00:00"
            "version": "v3.27.0",
                "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6"
                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e73ccaae1208f017bb7860986eebb3da48bd25d6",
                "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6",
                "phpunitgoodpractices/polyfill": "^1.6",
                "phpunitgoodpractices/traits": "^1.9.2",
                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.27.0"
            "time": "2023-09-17T14:37:54+00:00"
            "version": "1.10.34",
                "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901"
                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7f806b6f1403e6914c778140e2ba07c293cb4901",
                "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901",
            "time": "2023-09-13T09:49:47+00:00"
            "version": "1.3.14",
                "reference": "614acc10c522e319639bf38b0698a4a566665f04"
                "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/614acc10c522e319639bf38b0698a4a566665f04",
                "reference": "614acc10c522e319639bf38b0698a4a566665f04",
                "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.14"
            "time": "2023-08-25T09:46:39+00:00"
            "version": "1.3.2",
                "reference": "7332b90dfc291ac5b4b83fbca2081936faa1e3f9"
                "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/7332b90dfc291ac5b4b83fbca2081936faa1e3f9",
                "reference": "7332b90dfc291ac5b4b83fbca2081936faa1e3f9",
                "phpstan/phpstan": "^1.9.18"
                "phpstan/phpstan-phpunit": "^1.0",
                "phpstan/phpstan-strict-rules": "^1.0",
                "symfony/serializer": "^5.4"
                "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.2"
            "time": "2023-05-16T12:46:15+00:00"
            "version": "9.2.28",
                "reference": "7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef"
                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef",
                "reference": "7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef",
                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.28"
            "time": "2023-09-12T14:36:20+00:00"
    #esi: ~
    #fragments: ~
#    invoice:
#        # all files in these directories will be used as invoice documents (if supported by a renderer)
#        documents:
#            - 'var/invoices/'
#            - 'templates/invoice/renderer/'
    type: annotation
    type: annotation
    type: annotation
    type: annotation
    type: annotation
        tags:
            - { name: doctrine.event_subscriber, priority: 50 }
    Gedmo\Timestampable\TimestampableListener:
        class: Gedmo\Timestampable\TimestampableListener
        tags:
            - { name: doctrine.event_subscriber, priority: 60 }
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]
            count: 2
            count: 3
            count: 6
            count: 3
            count: 3
            count: 2
            count: 3
        -
            message: "#^Method App\\\\Utils\\\\MenuItemModel\\:\\:getRouteArgs\\(\\) return type has no value type specified in iterable type array\\.$#"
            count: 1
            path: src/Utils/MenuItemModel.php

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\FormType;
     * @template TData of mixed
     * @param TData|null $data
     * @return FormInterface<TData|null>
    protected function createSearchForm(string $type = FormType::class, mixed $data = null, array $options = []): FormInterface
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
    #[Rest\QueryParam(name: 'full', strict: true, nullable: true, description: 'Allows to fetch fully serialized objects including subresources. Allowed values: true (default: false)')]
        if (null !== $paramFetcher->get('full')) {
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
        $view->getContext()->setGroups(self::GROUPS_COLLECTION);
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
    /**
     * {@inheritdoc}
     */
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
    public const VERSION = '2.0.35';
    public const VERSION_ID = 20035;
     * The Github repository name
use Symfony\Component\Form\Extension\Core\Type\FormType;
     * @template TData of mixed
     * @param TData|null $data
     * @return FormInterface<TData|null>
    protected function createFormWithName(string $name, string $type = FormType::class, mixed $data = null, array $options = []): FormInterface
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
    #[Route(path: '/document_reload/{document}', name: 'admin_invoice_document_reload', methods: ['GET', 'POST'])]
    #[IsGranted('upload_invoice_template')]
    public function reloadDocument(string $document, Environment $twig): Response
    {
        $event = new InvoiceDocumentsEvent($this->service->getDocuments(true));
        $this->dispatcher->dispatch($event);

        $reloaded = false;

        foreach ($event->getInvoiceDocuments() as $doc) {
            if ($document === $doc->getId() && $doc->isTwig()) {
                $reloaded = true;
                try {
                    $twig->enableAutoReload();
                    $twig->load('@invoice/' . basename($doc->getFilename()));
                    $twig->disableAutoReload();
                    $this->flashSuccess('Reloaded template');
                } catch (Exception $ex) {
                    $this->flashException($ex, 'Failed to reload template: ' . $ex->getMessage());
                }
            }
        }

        if (!$reloaded) {
            throw $this->createNotFoundException('Unknown document: ' . $document);
        }

        return $this->redirectToRoute('admin_invoice_document_upload');
    }

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
        $content = $this->container->get('twig')->render('reporting/report_user_list_export.html.twig', $data);
        $content = $this->container->get('twig')->render('reporting/report_user_list_export.html.twig', $data);
use Exception;
    /**
     * @param Request $request
     * @return Response
     * @throws Exception
     */
    /**
     * @param Request $request
     * @return Response
     * @throws Exception
     */
        $content = $this->container->get('twig')->render('reporting/report_user_list_monthly_export.html.twig', $data);
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
            'tokenLifetime' => ceil($this->configuration->getPasswordResetRetryLifetime() / 3600),
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
                    return $this->redirectToRoute('wizard', ['wizard' => 'done', '_locale' => $data['language']]);
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
                    ->defaultTrue()
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: true)]
    #[ORM\OneToMany(targetEntity: ActivityMeta::class, mappedBy: 'activity', cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Team::class, cascade: ['persist'], inversedBy: 'activities')]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\OneToMany(targetEntity: CustomerMeta::class, mappedBy: 'customer', cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Team::class, cascade: ['persist'], inversedBy: 'customers')]
    #[ORM\JoinColumn(onDelete: 'SET NULL', nullable: true)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\OneToMany(targetEntity: InvoiceMeta::class, mappedBy: 'invoice', cascade: ['persist'])]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\OneToMany(targetEntity: ProjectMeta::class, mappedBy: 'project', cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Team::class, cascade: ['persist'], inversedBy: 'projects')]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: true)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[Assert\Regex(pattern: '/,/', match: false, message: 'Tag name cannot contain comma')]
    #[ORM\OneToMany(targetEntity: TeamMember::class, mappedBy: 'team', fetch: 'LAZY', cascade: ['persist', 'remove'], orphanRemoval: true)]
    #[ORM\ManyToMany(targetEntity: Customer::class, mappedBy: 'teams', fetch: 'EXTRA_LAZY', cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Project::class, mappedBy: 'teams', fetch: 'EXTRA_LAZY', cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Activity::class, mappedBy: 'teams', fetch: 'EXTRA_LAZY', cascade: ['persist'])]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
use Gedmo\Mapping\Annotation as Gedmo;
    #[ORM\JoinColumn(name: '`user`', referencedColumnName: 'id', onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    /**
     * @internal used for limiting queries, eg. via API sync
     */
    #[Gedmo\Timestampable]
    private ?\DateTime $modifiedAt = null;
    #[ORM\OneToMany(targetEntity: TimesheetMeta::class, mappedBy: 'timesheet', cascade: ['persist'])]
    public function getModifiedAt(): ?DateTime
        $this->modifiedAt = null;
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
#[Exporter\Expose(name: 'last_login', label: 'lastLogin', exp: 'object.getLastLogin()', type: 'datetime')]
#[Exporter\Expose(name: 'roles', label: 'roles', exp: 'object.getRoles()', type: 'array')]
#[Exporter\Expose(name: 'active', label: 'active', exp: 'object.isEnabled()', type: 'boolean')]
    #[ORM\OneToMany(targetEntity: UserPreference::class, mappedBy: 'user', cascade: ['persist'])]
    #[ORM\OneToMany(targetEntity: TeamMember::class, mappedBy: 'user', fetch: 'LAZY', cascade: ['persist'], orphanRemoval: true)]
    #[ORM\JoinColumn(onDelete: 'CASCADE', nullable: false)]
    #[ORM\JoinColumn(onDelete: 'SET NULL', nullable: true)]
    /**
     * {@inheritdoc}
     */
    /**
     * {@inheritdoc}
     */
    public function setPasswordRequestedAt(\DateTime $date = null): User
        if ($document->isTwig()) {
            $event->addAction('reload', ['url' => $this->path('admin_invoice_document_reload', ['document' => $document->getId()])]);
        }

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
        if (str_starts_with($uri, '/api/') || stripos($uri, '/register/') !== false) {
        if ($user instanceof User) {
            if (stripos($uri, '/wizard/') !== false) {
                return;
            }
            if (!$this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
                return;
            }
            foreach (User::WIZARDS as $wizard) {
                if (!$user->hasSeenWizard($wizard)) {
                    $response = new RedirectResponse($this->urlGenerator->generate('wizard', ['wizard' => $wizard]));
                    $event->setResponse($response);
                    return;
                }
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
                'replaceTags' => true,
                'appendTags' => false,
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
        $container->setParameter('container.dumper.inline_class_loader', true);
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
        $qb->select('COUNT(t)')
            ->orderBy('t.begin', 'DESC');
            $qb->andWhere('t.user = :user');
            $qb->setParameter('user', $user);
use App\Entity\User;
        /** @var User $user */
        $user = $context->getUser();

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
    /**
     * {@inheritdoc}
     */
    /**
     * {@inheritdoc}
     */
    /**
     * {@inheritdoc}
     */
    /**
     * {@inheritdoc}
     */
    /**
     * {@inheritdoc}
     */
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
        return array_merge(['color' => WidgetInterface::COLOR_TOTAL, 'icon' => 'duration'], parent::getOptions($options));
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @param array<string, string|bool|int|null> $options
     * @return array<string, string|bool|int|null>
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
    "symfony/polyfill-ctype": {
        "version": "v1.8.0"
    },
            <th>&nbsp;</th>
                {% block period_name %}{% endblock %}
        {{ 'resetting.check_email'|trans({'%tokenLifetime%': tokenLifetime})|nl2br }}
            <fieldset class="form-fieldset pb-0">
            {{ 'api_password.intro'|trans }}
                {% if not url is empty %}<a href="{{ url }}">{% endif %}
                {% if not url is empty %}</a>{% endif %}
    {{ progress_bar({current: percent, max: 100, min: 0}) }}
    {% if previous is defined %}
        {% if next is defined %}
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
        $result = json_decode($client->getResponse()->getContent(), true);
                'upload_twig' => true,
        self::assertNull($sut->getModifiedAt());
        self::assertNull($sut->getModifiedAt());
        self::assertNull($clone->getModifiedAt());
    public function testConfiguration()
    public function testRender()
    public function testConfiguration()
    public function testRender()
    public function testConfiguration()
    public function testRender()
    public function testSupports()
    public function testRender()
    public function testSupports()
    public function testRender()
        $model->getTemplate()->setLanguage('de');
{% set fallback = app.request is not null ? app.request.locale : 'en' %}
{% set language = model.template.language|default(fallback) %}
        -
            message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#"
            count: 9
            path: API/UserControllerTest.php

            message: "#^Parameter \\#6 \\$eventDispatcher of class App\\\\Command\\\\InvoiceCreateCommand constructor expects Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface, object\\|null given\\.$#"
        -
            message: "#^Cannot call method push\\(\\) on object\\|null\\.$#"
            count: 1
            path: Export/Renderer/PdfRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\PdfRendererTest\\:\\:testConfiguration\\(\\) has no return type specified\\.$#"
            count: 1
            path: Export/Renderer/PdfRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\PdfRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#"
            count: 1
            path: Export/Renderer/PdfRendererTest.php

        -
            message: "#^Parameter \\#2 \\$cacheDirectory of class App\\\\Pdf\\\\MPdfConverter constructor expects string, array\\|bool\\|float\\|int\\|string\\|null given\\.$#"
            count: 1
            path: Export/Renderer/PdfRendererTest.php

        -
            message: "#^Cannot call method push\\(\\) on object\\|null\\.$#"
            count: 1
            path: Export/Timesheet/HtmlRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\HtmlRendererTest\\:\\:testConfiguration\\(\\) has no return type specified\\.$#"
            count: 1
            path: Export/Timesheet/HtmlRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\HtmlRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#"
            count: 1
            path: Export/Timesheet/HtmlRendererTest.php

        -
            message: "#^Cannot call method push\\(\\) on object\\|null\\.$#"
            count: 1
            path: Export/Timesheet/PdfRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\PdfRendererTest\\:\\:testConfiguration\\(\\) has no return type specified\\.$#"
            count: 1
            path: Export/Timesheet/PdfRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\PdfRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#"
            count: 1
            path: Export/Timesheet/PdfRendererTest.php

        -
            message: "#^Parameter \\#2 \\$cacheDirectory of class App\\\\Pdf\\\\MPdfConverter constructor expects string, array\\|bool\\|float\\|int\\|string\\|null given\\.$#"
            count: 1
            path: Export/Timesheet/PdfRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\PdfRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#"
            count: 1
            path: Invoice/Renderer/PdfRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\PdfRendererTest\\:\\:testSupports\\(\\) has no return type specified\\.$#"
            count: 1
            path: Invoice/Renderer/PdfRendererTest.php

            count: 2
        -
            message: "#^Cannot call method push\\(\\) on object\\|null\\.$#"
            count: 1
            path: Invoice/Renderer/TwigRendererTest.php

        -
            message: "#^Cannot call method setLanguage\\(\\) on App\\\\Entity\\\\InvoiceTemplate\\|null\\.$#"
            count: 1
            path: Invoice/Renderer/TwigRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\TwigRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#"
            count: 1
            path: Invoice/Renderer/TwigRendererTest.php

        -
            message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\TwigRendererTest\\:\\:testSupports\\(\\) has no return type specified\\.$#"
            count: 1
            path: Invoice/Renderer/TwigRendererTest.php

      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>استبدل العلامات</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>إلحاق كلمات مفتاحية</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Připojit štítky</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Nahradit štítky</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Erstat etiketter</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Tilføj etiketter</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Schlagworte ersetzen</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Schlagworte hinzufügen</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Schlagworte hinzufügen</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Schlagworte ersetzen</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Αντικατάσταση ετικετών</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Προσάρτηση ετικετών</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Replace tags</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Append tags</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Anstataŭigi etikedojn</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Postglui etikedojn</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Reemplazar etiquetas</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Agregar etiquetas</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Gehitu etiketak</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Ordeztu etiketak</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>جایگزینی برچسب ها</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>پیوست تگ ها</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target state="translated">Vaihda tunnisteet</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target state="translated">Lisää tunnisteita</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Legg aftrat frámerki</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Útskift frámerki</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Ajouter des mots-clés</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Remplacer les mots-clés</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>החלפת תגיות</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>הוספת תגיות</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Zamijeni oznake</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Dodaj oznake</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Címkék megnyitása</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Címkék cseréje</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Sostituisci etichette</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Aggiungi etichette</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>태그 추가</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>태그 교체</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Erstatt etiketter</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Legg til etiketter</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Voeg labels toe</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Vervang labels</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Zamień tagi</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Dodaj tagi</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Anexar etiquetas</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Substituir etiquetas</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Tags de apêndice</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Substituir tags</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Înlocuiește etichetele</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Adaugă etichete</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target state="translated">Добавить метки</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target state="translated">Заменить метки</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Zmeniť značky</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Pridať značky</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Fäst taggar</target>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Ersätt taggar</target>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Etiketleri ekle</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Etiketleri değiştir</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target state="translated">Заміна міток</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target state="translated">Додати мітки</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>Thay thế thẻ</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>Nối các thẻ</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target>替换标签</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target>附加标签</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replaceTags">
        <source>replaceTags</source>
        <target state="translated">替換 tags</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="appendTags">
        <source>appendTags</source>
        <target state="translated">添加 tags</target>
      </trans-unit>

Fixed code:
/public/.htaccess
/.env-*
/.idea/
/.DS_Store
/phpstan.sh
/public/.user.ini
/php.ini
/.php-version
/.yarnrc.yml
/.yarn
/config/packages/local.yaml
/var/invoices*
/var/plugins/*/*.disabled
        "kevinpapst/tabler-bundle": "^1.0",
        "symfony/polyfill-ctype": "*",
    "content-hash": "28da6d01423fca5a17395df418603aa5",
            "version": "2.1.4",
                "reference": "72328a11443a0de79967104ad36ba7b30bded134"
                "url": "https://api.github.com/repos/doctrine/collections/zipball/72328a11443a0de79967104ad36ba7b30bded134",
                "reference": "72328a11443a0de79967104ad36ba7b30bded134",
                "doctrine/coding-standard": "^12",
                "source": "https://github.com/doctrine/collections/tree/2.1.4"
            "time": "2023-10-03T09:22:33+00:00"
            "version": "3.7.1",
                "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2"
                "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b7bd66c9ff58c04c5474ab85edce442f8081cb2",
                "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2",
                "phpstan/phpstan": "1.10.35",
                "phpunit/phpunit": "9.6.13",
                "source": "https://github.com/doctrine/dbal/tree/3.7.1"
            "time": "2023-10-06T05:06:20+00:00"
            "version": "1.1.2",
                "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931"
                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931",
                "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931",
                "source": "https://github.com/doctrine/deprecations/tree/1.1.2"
            "time": "2023-09-27T20:04:15+00:00"
            "version": "4.0.2",
                "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e"
                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e",
                "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e",
                "phpunit/phpunit": "^10.2",
                "vimeo/psalm": "^5.12"
                "source": "https://github.com/egulias/EmailValidator/tree/4.0.2"
            "time": "2023-10-06T06:47:41+00:00"
            "version": "4.8.5",
                "reference": "0db25b506a8411a5e1644ebaa67123a6eb7b6a77"
                "url": "https://api.github.com/repos/endroid/qr-code/zipball/0db25b506a8411a5e1644ebaa67123a6eb7b6a77",
                "reference": "0db25b506a8411a5e1644ebaa67123a6eb7b6a77",
                "source": "https://github.com/endroid/qr-code/tree/4.8.5"
            "time": "2023-09-29T14:03:20+00:00"
            "version": "3.6.0",
                "reference": "e01be8113d4451adb3cbb29d7d2cc96bbc698179"
                "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/e01be8113d4451adb3cbb29d7d2cc96bbc698179",
                "reference": "e01be8113d4451adb3cbb29d7d2cc96bbc698179",
                "symfony/config": "^5.4|^6.0",
                "symfony/dependency-injection": "^5.4|^6.0",
                "symfony/event-dispatcher": "^5.4|^6.0",
                "symfony/http-foundation": "^5.4|^6.0",
                "symfony/http-kernel": "^5.4|^6.0",
                "symfony/routing": "^5.4|^6.0",
                "symfony/security-core": "^5.4|^6.0",
                "sensio/framework-extra-bundle": "<6.1"
                "doctrine/annotations": "^1.13.2|^2.0 ",
                "symfony/asset": "^5.4|^6.0",
                "symfony/browser-kit": "^5.4|^6.0",
                "symfony/css-selector": "^5.4|^6.0",
                "symfony/expression-language": "^5.4|^6.0",
                "symfony/form": "^5.4|^6.0",
                "symfony/mime": "^5.4|^6.0",
                "symfony/phpunit-bridge": "^5.4|^6.0",
                "symfony/security-bundle": "^5.4|^6.0",
                "symfony/serializer": "^5.4|^6.0",
                "symfony/twig-bundle": "^5.4|^6.0",
                "symfony/validator": "^5.4|^6.0",
                "symfony/web-profiler-bundle": "^5.4|^6.0",
                "symfony/yaml": "^5.4|^6.0"
                "source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.6.0"
            "time": "2023-09-27T11:41:02+00:00"
            "version": "1.0.0",
                "reference": "9554efc6f96d757decbc4b52402eb964e9c90786"
                "url": "https://api.github.com/repos/kevinpapst/TablerBundle/zipball/9554efc6f96d757decbc4b52402eb964e9c90786",
                "reference": "9554efc6f96d757decbc4b52402eb964e9c90786",
                "php": "8.1.*||8.2.*",
                "symfony/asset": "^6.0",
                "symfony/config": "^6.0",
                "symfony/dependency-injection": "^6.0",
                "symfony/event-dispatcher": "^6.0",
                "symfony/http-foundation": "^6.0",
                "symfony/http-kernel": "^6.0",
                "symfony/options-resolver": "^6.0",
                "symfony/security-core": "^6.0",
                "symfony/translation": "^6.0",
                "symfony/twig-bridge": "^6.0",
                "symfony/framework-bundle": "^6.0"
                "source": "https://github.com/kevinpapst/TablerBundle/tree/1.0.0"
            "time": "2023-09-27T13:27:36+00:00"
            "version": "2.13.0",
                "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba"
                "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba",
                "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba",
                "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
                "infection/infection": "^0.27.0",
                "laminas/laminas-coding-standard": "~2.5.0",
                "phpunit/phpunit": "^9.6.7",
                "psalm/plugin-phpunit": "^0.18.4",
                "vimeo/psalm": "^5.9"
            "time": "2023-10-10T08:35:13+00:00"
            "version": "9.11.0",
                "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39"
                "url": "https://api.github.com/repos/thephpleague/csv/zipball/33149c4bea4949aa4fa3d03fb11ed28682168b39",
                "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39",
            "time": "2023-09-23T10:09:54+00:00"
            "version": "v2.0.1",
                "reference": "f25a0153d645e234f9db42e5433b16d9b113920f"
                "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f",
                "reference": "f25a0153d645e234f9db42e5433b16d9b113920f",
                "source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1"
            "time": "2023-10-02T14:34:03+00:00"
            "version": "1.24.2",
                "reference": "bcad8d995980440892759db0c32acae7c8e79442"
                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442",
                "reference": "bcad8d995980440892759db0c32acae7c8e79442",
                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2"
            "time": "2023-09-26T12:28:12+00:00"
            "version": "1.0.3",
                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
                "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
                "source": "https://github.com/php-fig/http-client"
            "time": "2023-09-23T14:17:50+00:00"
            "version": "v2.5.0",
                "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4"
                "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4",
                "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4",
                "source": "https://github.com/Setasign/FPDI/tree/v2.5.0"
            "time": "2023-09-28T10:46:27+00:00"
            "version": "v6.3.5",
                "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da"
                "url": "https://api.github.com/repos/symfony/cache/zipball/6c1a3ea078c4d88ee892530945df63a87981b2da",
                "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da",
                "source": "https://github.com/symfony/cache/tree/v6.3.5"
            "time": "2023-09-26T15:48:55+00:00"
            "version": "v6.3.5",
                "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993"
                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed62b3bf98346e1f45529a7b6be2196739bb993",
                "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993",
                "source": "https://github.com/symfony/dependency-injection/tree/v6.3.5"
            "time": "2023-09-25T16:46:40+00:00"
            "version": "v6.3.5",
                "reference": "9977eb1adf999ceded213e88c1ac6dff7a1a0306"
                "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9977eb1adf999ceded213e88c1ac6dff7a1a0306",
                "reference": "9977eb1adf999ceded213e88c1ac6dff7a1a0306",
                "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.5"
            "time": "2023-09-29T16:16:03+00:00"
            "version": "v6.3.5",
                "reference": "1f69476b64fb47105c06beef757766c376b548c4"
                "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4",
                "reference": "1f69476b64fb47105c06beef757766c376b548c4",
                "source": "https://github.com/symfony/error-handler/tree/v6.3.5"
            "time": "2023-09-12T06:57:20+00:00"
            "version": "v6.3.5",
                "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4"
                "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4",
                "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4",
                "source": "https://github.com/symfony/finder/tree/v6.3.5"
            "time": "2023-09-26T12:56:25+00:00"
            "version": "v6.3.5",
                "reference": "0f9ad8600c1021983d096512066ee54332aa3139"
                "url": "https://api.github.com/repos/symfony/form/zipball/0f9ad8600c1021983d096512066ee54332aa3139",
                "reference": "0f9ad8600c1021983d096512066ee54332aa3139",
                "source": "https://github.com/symfony/form/tree/v6.3.5"
            "time": "2023-09-10T17:47:23+00:00"
            "version": "v6.3.5",
                "reference": "567cafcfc08e3076b47290a7558b0ca17a98b0ce"
                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/567cafcfc08e3076b47290a7558b0ca17a98b0ce",
                "reference": "567cafcfc08e3076b47290a7558b0ca17a98b0ce",
                "source": "https://github.com/symfony/framework-bundle/tree/v6.3.5"
            "time": "2023-09-29T10:45:15+00:00"
            "version": "v6.3.5",
                "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d"
                "url": "https://api.github.com/repos/symfony/http-client/zipball/213e564da4cbf61acc9728d97e666bcdb868c10d",
                "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d",
                "source": "https://github.com/symfony/http-client/tree/v6.3.5"
            "time": "2023-09-29T15:57:12+00:00"
            "version": "v6.3.5",
                "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957"
                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957",
                "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957",
                "source": "https://github.com/symfony/http-foundation/tree/v6.3.5"
            "time": "2023-09-04T21:33:54+00:00"
            "version": "v6.3.5",
                "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc"
                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f991a964368bee8d883e8d57ced4fe9fff04dfc",
                "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc",
                "source": "https://github.com/symfony/http-kernel/tree/v6.3.5"
            "time": "2023-09-30T06:37:04+00:00"
            "version": "v6.3.5",
                "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06"
                "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06",
                "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06",
                "source": "https://github.com/symfony/mailer/tree/v6.3.5"
            "time": "2023-09-06T09:47:15+00:00"
            "version": "v6.3.5",
                "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e"
                "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e",
                "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e",
                "source": "https://github.com/symfony/mime/tree/v6.3.5"
            "time": "2023-09-29T06:59:36+00:00"
            "version": "v6.3.5",
                "reference": "278d3a49715073879f75e372ad80b8cfeca949d3"
                "url": "https://api.github.com/repos/symfony/password-hasher/zipball/278d3a49715073879f75e372ad80b8cfeca949d3",
                "reference": "278d3a49715073879f75e372ad80b8cfeca949d3",
                "source": "https://github.com/symfony/password-hasher/tree/v6.3.5"
            "time": "2023-09-25T17:05:16+00:00"
            "version": "v6.3.5",
                "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31"
                "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31",
                "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31",
                "source": "https://github.com/symfony/routing/tree/v6.3.5"
            "time": "2023-09-20T16:05:51+00:00"
            "version": "v6.3.5",
                "reference": "2df460eacceb11b9287cfafddda4d27023dd9001"
                "url": "https://api.github.com/repos/symfony/security-bundle/zipball/2df460eacceb11b9287cfafddda4d27023dd9001",
                "reference": "2df460eacceb11b9287cfafddda4d27023dd9001",
                "symfony/security-http": "^6.3.4"
                "source": "https://github.com/symfony/security-bundle/tree/v6.3.5"
            "time": "2023-09-25T17:05:55+00:00"
            "version": "v6.3.5",
                "reference": "ec8f24dc1195f46483510892271d01a5202bba70"
                "url": "https://api.github.com/repos/symfony/security-core/zipball/ec8f24dc1195f46483510892271d01a5202bba70",
                "reference": "ec8f24dc1195f46483510892271d01a5202bba70",
                "source": "https://github.com/symfony/security-core/tree/v6.3.5"
            "time": "2023-09-10T17:47:23+00:00"
            "version": "v6.3.5",
                "reference": "47058ea557a4c64ba86e9249651222842bd52e2a"
                "url": "https://api.github.com/repos/symfony/security-http/zipball/47058ea557a4c64ba86e9249651222842bd52e2a",
                "reference": "47058ea557a4c64ba86e9249651222842bd52e2a",
                "source": "https://github.com/symfony/security-http/tree/v6.3.5"
            "time": "2023-08-30T06:30:46+00:00"
            "version": "v6.3.5",
                "reference": "855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c"
                "url": "https://api.github.com/repos/symfony/serializer/zipball/855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c",
                "reference": "855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c",
                "source": "https://github.com/symfony/serializer/tree/v6.3.5"
            "time": "2023-09-29T16:18:53+00:00"
            "version": "v6.3.5",
                "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339"
                "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339",
                "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339",
                "source": "https://github.com/symfony/string/tree/v6.3.5"
            "time": "2023-09-18T10:38:32+00:00"
            "version": "v6.3.5",
                "reference": "18f2cbe1d46ad43c4d3bd45e5e6279172068e064"
                "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/18f2cbe1d46ad43c4d3bd45e5e6279172068e064",
                "reference": "18f2cbe1d46ad43c4d3bd45e5e6279172068e064",
                "source": "https://github.com/symfony/twig-bridge/tree/v6.3.5"
            "time": "2023-09-12T06:57:20+00:00"
            "version": "v6.3.5",
                "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47"
                "url": "https://api.github.com/repos/symfony/validator/zipball/48e815ba3b5eb72e632588dbf7ea2dc4e608ee47",
                "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47",
                "source": "https://github.com/symfony/validator/tree/v6.3.5"
            "time": "2023-09-29T07:41:15+00:00"
            "version": "v6.3.5",
                "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5"
                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5",
                "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5",
                "source": "https://github.com/symfony/var-dumper/tree/v6.3.5"
            "time": "2023-09-12T10:11:35+00:00"
            "version": "v2.1.0",
                "reference": "50d4af5cca35dab66a51dfeeb63616937ba96f4a"
                "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/50d4af5cca35dab66a51dfeeb63616937ba96f4a",
                "reference": "50d4af5cca35dab66a51dfeeb63616937ba96f4a",
                "symfony/asset": "^5.4 || ^6.2 || ^7.0",
                "symfony/config": "^5.4 || ^6.2 || ^7.0",
                "symfony/dependency-injection": "^5.4 || ^6.2 || ^7.0",
                "symfony/http-kernel": "^5.4 || ^6.2 || ^7.0",
                "symfony/framework-bundle": "^5.4 || ^6.2 || ^7.0",
                "symfony/phpunit-bridge": "^5.4 || ^6.2 || ^7.0",
                "symfony/twig-bundle": "^5.4 || ^6.2 || ^7.0",
                "symfony/web-link": "^5.4 || ^6.2 || ^7.0"
                "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.1.0"
            "time": "2023-09-26T14:41:29+00:00"
            "version": "4.7.15",
                "reference": "df8de8e484003f68cd2fa68db1e6cfb47a3a92cb"
                "url": "https://api.github.com/repos/zircote/swagger-php/zipball/df8de8e484003f68cd2fa68db1e6cfb47a3a92cb",
                "reference": "df8de8e484003f68cd2fa68db1e6cfb47a3a92cb",
                "source": "https://github.com/zircote/swagger-php/tree/4.7.15"
            "time": "2023-10-12T20:26:34+00:00"
            "version": "3.1.1",
                "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9"
                "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9",
                "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9",
                "source": "https://github.com/composer/pcre/tree/3.1.1"
            "time": "2023-10-11T07:11:09+00:00"
            "version": "v3.35.1",
                "reference": "ec1ccc264994b6764882669973ca435cf05bab08"
                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ec1ccc264994b6764882669973ca435cf05bab08",
                "reference": "ec1ccc264994b6764882669973ca435cf05bab08",
                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.35.1"
            "time": "2023-10-12T13:47:26+00:00"
            "version": "1.10.39",
                "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4"
                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4",
                "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4",
            "time": "2023-10-17T15:46:26+00:00"
            "version": "1.3.15",
                "reference": "70ecacc64fe8090d8d2a33db5a51fe8e88acd93a"
                "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/70ecacc64fe8090d8d2a33db5a51fe8e88acd93a",
                "reference": "70ecacc64fe8090d8d2a33db5a51fe8e88acd93a",
                "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.15"
            "time": "2023-10-09T18:58:39+00:00"
            "version": "1.3.4",
                "reference": "383855999db6a7d65d0bf580ce2762e17188c2a5"
                "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/383855999db6a7d65d0bf580ce2762e17188c2a5",
                "reference": "383855999db6a7d65d0bf580ce2762e17188c2a5",
                "phpstan/phpstan": "^1.10.36"
                "phpstan/phpstan-phpunit": "^1.3.11",
                "phpstan/phpstan-strict-rules": "^1.5.1",
                "symfony/serializer": "^5.4",
                "symfony/service-contracts": "^2.2.0"
                "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.4"
            "time": "2023-09-29T14:10:11+00:00"
            "version": "9.2.29",
                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76"
                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76",
                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76",
                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29"
            "time": "2023-09-19T04:57:46+00:00"
                schema_manager_factory: doctrine.dbal.default_schema_manager_factory
                report_fields_where_declared: true
#   invoice:
#       # all files in these directories will be used as invoice documents (if supported by a renderer)
#       documents:
#           - 'var/invoices/'
#           - 'templates/invoice/renderer/'
#       # allow to upload twig templates as invoice documents
#       upload_twig: true
            login_link:
                check_route: link_login_check
                signature_properties: ['id']
                lifetime: 300
                max_uses: 1

    type: attribute
    type: attribute
    type: attribute
    type: attribute
    type: attribute
    App\Doctrine\ModifiedSubscriber:
        class: App\Doctrine\ModifiedSubscriber
            count: 1
            count: 1
            count: 2
            count: 1
            count: 1
            count: 1
            count: 1
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use App\Repository\Query\BaseQuery;
     * @template TData of BaseQuery
     * @param TData $data
     * @return FormInterface<BaseQuery>
    protected function createSearchForm(string $type, BaseQuery $data, array $options = []): FormInterface
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
    #[Rest\QueryParam(name: 'full', requirements: '0|1|true|false', strict: true, nullable: true, description: 'Allows to fetch full objects including subresources. Allowed values: 0|1|false|true (default: false)')]
        $full = $paramFetcher->get('full');
        if ($full === '1' || $full === 'true') {
use Psr\EventDispatcher\EventDispatcherInterface;
    public const GROUPS_COLLECTION_FULL = ['Default', 'Collection', 'User', 'User_Entity'];
    #[Rest\QueryParam(name: 'full', requirements: '0|1|true|false', strict: true, nullable: true, description: 'Allows to fetch full objects including subresources. Allowed values: 0|1|false|true (default: false)')]

        $full = $paramFetcher->get('full');
        if ($full === '1' || $full === 'true') {
            $view->getContext()->setGroups(self::GROUPS_COLLECTION_FULL);
        } else {
            $view->getContext()->setGroups(self::GROUPS_COLLECTION);
        }
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Command;

use App\Repository\UserRepository;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;

#[AsCommand(name: 'kimai:user:login-link', description: 'Create a URL that can be used to login as that user', hidden: true)]
/**
 * @CloudRequired
 */
final class UserLoginLinkCommand extends Command
{
    public function __construct(
        private LoginLinkHandlerInterface $loginLink,
        private UserRepository $userRepository,
        private RequestStack $requestStack
    )
    {
        parent::__construct();
        $this->addArgument('email', InputArgument::REQUIRED, 'The email of the user');
        $this->addOption('password-reset', null, InputOption::VALUE_NONE, 'Whether the user needs to reset the password afterwards');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        $email = $input->getArgument('email');
        if ($email === null || $email === '') {
            $io->error('Need email to create login URL');

            return Command::FAILURE;
        }

        $user = $this->userRepository->findOneBy(['email' => $email]);

        if ($user === null) {
            $io->error('Need username to create login URL');

            return Command::FAILURE;
        }

        if (!$user->isEnabled()) {
            $io->error('User is not enabled');

            return Command::FAILURE;
        }

        if (!$user->isInternalUser()) {
            $io->error('User does not use internal login');

            return Command::FAILURE;
        }

        $request = new Request();
        $request->setLocale($user->getLocale());
        $this->requestStack->push($request);

        $loginLinkDetails = $this->loginLink->createLoginLink($user, $request);
        $loginLink = $loginLinkDetails->getUrl();

        if ($input->getOption('password-reset') === true) {
            $user->setPasswordRequestedAt(new \DateTime());
            $user->setRequiresPasswordReset(true);
            $this->userRepository->saveUser($user);
        }

        $output->writeln($loginLink);

        return Command::SUCCESS;
    }
}
    public const VERSION = '2.1.0';
    public const VERSION_ID = 20100;
     * The GitHub repository name
     * @template TData of array|object
     * @param TData $data
     * @return FormInterface<TData>
    protected function createFormWithName(string $name, string $type, mixed $data, array $options = []): FormInterface
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
        $content = $this->renderView('reporting/report_user_list_export.html.twig', $data);
        $content = $this->renderView('reporting/report_user_list_export.html.twig', $data);
        $content = $this->renderView('reporting/report_user_list_monthly_export.html.twig', $data);
use App\Export\Spreadsheet\Writer\BinaryFileResponseWriter;
use App\Export\Spreadsheet\Writer\XlsxWriter;
use PhpOffice\PhpSpreadsheet\Reader\Html;
    #[Route(path: '/month_export', name: 'report_user_month_export', methods: ['GET', 'POST'])]
    public function export(Request $request): Response
    {
        $data = $this->getData($request);

        $content = $this->renderView('reporting/report_by_user_data.html.twig', $data);

        $reader = new Html();
        $spreadsheet = $reader->loadFromString($content);

        $writer = new BinaryFileResponseWriter(new XlsxWriter(), 'kimai-export-user-monthly');

        return $writer->getFileResponse($spreadsheet);
    }

            'export_route' => 'report_user_month_export',
use App\Export\Spreadsheet\Writer\BinaryFileResponseWriter;
use App\Export\Spreadsheet\Writer\XlsxWriter;
use PhpOffice\PhpSpreadsheet\Reader\Html;
    #[Route(path: '/week_export', name: 'report_user_week_export', methods: ['GET', 'POST'])]
    public function export(Request $request): Response
    {
        $data = $this->getData($request);

        $content = $this->renderView('reporting/report_by_user_data.html.twig', $data);

        $reader = new Html();
        $spreadsheet = $reader->loadFromString($content);

        $writer = new BinaryFileResponseWriter(new XlsxWriter(), 'kimai-export-user-weekly');

        return $writer->getFileResponse($spreadsheet);
    }

            'export_route' => 'report_user_week_export',
use App\Export\Spreadsheet\Writer\BinaryFileResponseWriter;
use App\Export\Spreadsheet\Writer\XlsxWriter;
use PhpOffice\PhpSpreadsheet\Reader\Html;
    #[Route(path: '/year_export', name: 'report_user_year_export', methods: ['GET', 'POST'])]
    public function export(Request $request, SystemConfiguration $systemConfiguration): Response
    {
        $data = $this->getData($request, $systemConfiguration);

        $content = $this->renderView('reporting/report_by_user_year_export.html.twig', $data);

        $reader = new Html();
        $spreadsheet = $reader->loadFromString($content);

        $writer = new BinaryFileResponseWriter(new XlsxWriter(), 'kimai-export-user-yearly');

        return $writer->getFileResponse($spreadsheet);
    }

            'export_route' => 'report_user_year_export',
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Controller\Security;

use App\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route(path: '/auth/link')]
/**
 * @CloudRequired
 */
final class LoginLinkController extends AbstractController
{
    #[Route(path: '/check', name: 'link_login_check', methods: ['GET'])]
    public function check(): Response
    {
        return new Response();
    }
}
use Psr\EventDispatcher\EventDispatcherInterface;
            'tokenLifetime' => $this->configuration->getPasswordResetRetryLifetime(),
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
                if ($dto->isReplaceDescription()) {
                    $timesheet->setDescription($dto->getDescription());
                    $execute = true;
                } elseif($dto->getDescription() !== null && $dto->getDescription() !== '') {
                    $timesheet->setDescription($timesheet->getDescription() . PHP_EOL . $dto->getDescription());
                    $execute = true;
                }
use Psr\EventDispatcher\EventDispatcherInterface;
use App\Form\UserPasswordType;
            $next = 'done';
            if ($user->requiresPasswordReset()) {
                $next = 'password';
            }

                    return $this->redirectToRoute('wizard', ['wizard' => $next, '_locale' => $data['language']]);
                'next' => $next,
                'form' => $form->createView(),
            ]);
        }

        if ($wizard === 'password' || $user->requiresPasswordReset()) {
            $form = $this->createForm(UserPasswordType::class, $user, [
                'action' => $this->generateUrl('wizard', ['wizard' => 'password']),
                'method' => 'POST',
            ]);

            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $user->setRequiresPasswordReset(false);
                $userService->updateUser($user);

                return $this->redirectToRoute('wizard', ['wizard' => 'done']);
            }

            $previous = 'profile';
            $percent = \intval(100 / \count(User::WIZARDS) * 1);

            if ($user->requiresPasswordReset()) {
                $previous = null;
                $percent = null;
            }

            return $this->render('wizard/password.html.twig', [
                'percent' => $percent,
                'previous' => $previous,
use Psr\EventDispatcher\EventDispatcherInterface;
                    ->defaultFalse()
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Doctrine;

use App\Entity\Timesheet;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;

/**
 * Automatically set the modifiedAt field for all Timesheet entries.
 */
#[AsDoctrineListener(event: Events::onFlush, priority: 60)]
final class ModifiedSubscriber implements EventSubscriber, DataSubscriberInterface
{
    public function getSubscribedEvents(): array
    {
        return [
            Events::onFlush,
        ];
    }

    public function onFlush(OnFlushEventArgs $args): void
    {
        $uow = $args->getObjectManager()->getUnitOfWork();
        $now = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));

        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            if (!($entity instanceof Timesheet)) {
                continue;
            }
            $entity->setModifiedAt($now);
        }

        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            if (!($entity instanceof Timesheet)) {
                continue;
            }
            $entity->setModifiedAt($now);
        }
    }
}
use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
#[AsDoctrineListener(event: Events::onFlush, priority: 50)]
    #[ORM\JoinColumn(nullable: true, onDelete: 'CASCADE')]
    #[ORM\OneToMany(mappedBy: 'activity', targetEntity: ActivityMeta::class, cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Team::class, inversedBy: 'activities', cascade: ['persist'])]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\OneToMany(mappedBy: 'customer', targetEntity: CustomerMeta::class, cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Team::class, inversedBy: 'customers', cascade: ['persist'])]
    #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\OneToMany(mappedBy: 'invoice', targetEntity: InvoiceMeta::class, cascade: ['persist'])]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\OneToMany(mappedBy: 'project', targetEntity: ProjectMeta::class, cascade: ['persist'])]
    #[ORM\ManyToMany(targetEntity: Team::class, inversedBy: 'projects', cascade: ['persist'])]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: true, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[Assert\Regex(pattern: '/,/', message: 'Tag name cannot contain comma', match: false)]
    #[ORM\OneToMany(mappedBy: 'team', targetEntity: TeamMember::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
    #[ORM\ManyToMany(targetEntity: Customer::class, mappedBy: 'teams', cascade: ['persist'], fetch: 'EXTRA_LAZY')]
    #[ORM\ManyToMany(targetEntity: Project::class, mappedBy: 'teams', cascade: ['persist'], fetch: 'EXTRA_LAZY')]
    #[ORM\ManyToMany(targetEntity: Activity::class, mappedBy: 'teams', cascade: ['persist'], fetch: 'EXTRA_LAZY')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(name: '`user`', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    private \DateTimeInterface $modifiedAt;
    #[ORM\OneToMany(mappedBy: 'timesheet', targetEntity: TimesheetMeta::class, cascade: ['persist'])]
        $this->modifiedAt = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
    public function getModifiedAt(): \DateTimeInterface
    public function setModifiedAt(\DateTimeInterface $dateTime): void
    {
        $this->modifiedAt = $dateTime;
    }

        $this->modifiedAt = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
#[Exporter\Expose(name: 'last_login', label: 'lastLogin', type: 'datetime', exp: 'object.getLastLogin()')]
#[Exporter\Expose(name: 'roles', label: 'roles', type: 'array', exp: 'object.getRoles()')]
#[Exporter\Expose(name: 'active', label: 'active', type: 'boolean', exp: 'object.isEnabled()')]
    #[ORM\OneToMany(mappedBy: 'user', targetEntity: UserPreference::class, cascade: ['persist'])]
    #[ORM\OneToMany(mappedBy: 'user', targetEntity: TeamMember::class, cascade: ['persist'], fetch: 'LAZY', orphanRemoval: true)]
    #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
    #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
    #[Serializer\VirtualProperty]
    #[Serializer\SerializedName('apiToken')]
    #[Serializer\Groups(['Default'])]
    public function hasApiToken(): bool
    {
        return $this->apiToken !== null;
    }

    public function setPasswordRequestedAt(?\DateTime $date = null): User
    public function requiresPasswordReset(): bool
    {
        if (!$this->isInternalUser() || !$this->isEnabled()) {
            return false;
        }

        return $this->getPreferenceValue('__pw_reset__') === '1';
    }

    public function setRequiresPasswordReset(bool $require = true): void
    {
        $this->setPreferenceValue('__pw_reset__', ($require ? '1' : '0'));
    }

use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
        if (str_starts_with($uri, '/api/') || stripos($uri, '/register/') !== false || stripos($uri, '/wizard/') !== false) {
        if (!($user instanceof User)) {
            return;
        }
        if (!$this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
            return;
        }
        foreach (User::WIZARDS as $wizard) {
            if (!$user->hasSeenWizard($wizard)) {
                $response = new RedirectResponse($this->urlGenerator->generate('wizard', ['wizard' => $wizard]));
                $event->setResponse($response);
                return;

        if ($user->requiresPasswordReset()) {
            $response = new RedirectResponse($this->urlGenerator->generate('wizard', ['wizard' => 'password']));
            $event->setResponse($response);
        }
use Psr\EventDispatcher\EventDispatcherInterface;
use App\Twig\SecurityPolicy\ExportPolicy;
use Psr\EventDispatcher\EventDispatcherInterface;
use Twig\Extension\SandboxExtension;
        // enable basic security measures
        $sandbox = new SandboxExtension(new ExportPolicy());
        $sandbox->enableSandbox();
        $this->twig->addExtension($sandbox);

use App\Twig\SecurityPolicy\ExportPolicy;
use Twig\Extension\SandboxExtension;

        // enable basic security measures
        $sandbox = new SandboxExtension(new ExportPolicy());
        $sandbox->enableSandbox();
        $this->twig->addExtension($sandbox);

use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use App\Form\Type\DescriptionType;
            'label_attr' => [
                'class' => 'radio-inline',
            ],
                'append' => false,
                'replace' => true,
        $builder->add('replaceDescription', ChoiceType::class, [
            'label' => false,
            'required' => true,
            'expanded' => true,
            'label_attr' => [
                'class' => 'radio-inline',
            ],
            'choices' => [
                'append' => false,
                'replace' => true,
            ]
        ]);

        $builder->add('description', DescriptionType::class, [
            'required' => false,
        ]);

    private bool $replaceDescription = false;
    private ?string $description = null;
    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(?string $description): void
    {
        $this->description = $description;
    }

    public function isReplaceDescription(): bool
    {
        return $this->replaceDescription;
    }

    public function setReplaceDescription(bool $replaceDescription): void
    {
        $this->replaceDescription = $replaceDescription;
    }

use Psr\EventDispatcher\EventDispatcherInterface;
            'label' => 'skin',
use App\Form\Type\YesNoType;

        $builder->add('requiresPasswordReset', YesNoType::class, [
            'label' => 'force_password_change',
            'help' => 'force_password_change_help',
            'required' => false,
        ]);
use Psr\EventDispatcher\EventDispatcherInterface;
        $container->setParameter('.container.dumper.inline_class_loader', true);
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
        $qb->select($qb->expr()->count('t'))
        ;
            $qb
                ->andWhere('t.user = :user')
                ->groupBy('t.user')
                ->setParameter('user', $user)
            ;
use Psr\EventDispatcher\EventDispatcherInterface;
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Twig\SecurityPolicy;

use Twig\Sandbox\SecurityPolicyInterface;

final class ChainPolicy implements SecurityPolicyInterface
{
    /** @var array<SecurityPolicyInterface> */
    private array $policies = [];

    public function __construct()
    {
    }

    public function addPolicy(SecurityPolicyInterface $policy): void
    {
        $this->policies[] = $policy;
    }

    public function checkSecurity($tags, $filters, $functions): void
    {
        foreach ($this->policies as $policy) {
            $policy->checkSecurity($tags, $filters, $functions);
        }
    }

    public function checkMethodAllowed($obj, $method): void
    {
        foreach ($this->policies as $policy) {
            $policy->checkMethodAllowed($obj, $method);
        }
    }

    public function checkPropertyAllowed($obj, $property): void
    {
        foreach ($this->policies as $policy) {
            $policy->checkPropertyAllowed($obj, $property);
        }
    }
}
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Twig\SecurityPolicy;

use Twig\Sandbox\SecurityPolicyInterface;

/**
 * The Twig environment needs the sandbox extension, which itself needs a policy to start working.
 */
final class DefaultPolicy implements SecurityPolicyInterface
{
    public function checkSecurity($tags, $filters, $functions): void
    {
    }

    public function checkMethodAllowed($obj, $method): void
    {
    }

    public function checkPropertyAllowed($obj, $property): void
    {
    }
}
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Twig\SecurityPolicy;

use Twig\Sandbox\SecurityPolicyInterface;

/**
 * Represents the security policy for custom Twig export templates.
 */
final class ExportPolicy implements SecurityPolicyInterface
{
    private ChainPolicy $policy;

    public function __construct()
    {
        $this->policy = new ChainPolicy();
        $this->policy->addPolicy(new DefaultPolicy());
    }

    public function checkSecurity($tags, $filters, $functions): void
    {
        $this->policy->checkSecurity($tags, $filters, $functions);
    }

    public function checkMethodAllowed($obj, $method): void
    {
        $this->policy->checkMethodAllowed($obj, $method);
    }

    public function checkPropertyAllowed($obj, $property): void
    {
        $this->policy->checkPropertyAllowed($obj, $property);
    }
}
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Twig\SecurityPolicy;

use Twig\Markup;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Sandbox\SecurityNotAllowedMethodError;
use Twig\Sandbox\SecurityNotAllowedPropertyError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityPolicyInterface;
use Twig\Template;

/**
 * A blocking approach for Twig templates.
 */
final class ForbiddenPolicy implements SecurityPolicyInterface
{
    /** @var array<string, array<string>> */
    private array $forbiddenMethods = [];

    /**
     * @param array<string> $forbiddenTags
     * @param array<string> $forbiddenFilters
     * @param array<string, array<string>> $forbiddenMethods
     * @param array<string, array<string>> $forbiddenProperties
     * @param array<string> $forbiddenFunctions
     */
    public function __construct(
        private array $forbiddenTags = [],
        private array $forbiddenFilters = [],
        array $forbiddenMethods = [],
        private array $forbiddenProperties = [],
        private array $forbiddenFunctions = []
    )
    {
        $this->forbiddenMethods = [];
        foreach ($forbiddenMethods as $class => $m) {
            $this->forbiddenMethods[$class] = array_map(function ($value) { return strtr($value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); }, \is_array($m) ? $m : [$m]);
        }
    }

    public function checkSecurity($tags, $filters, $functions): void
    {
        foreach ($tags as $tag) {
            if (\in_array($tag, $this->forbiddenTags)) {
                throw new SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag);
            }
        }

        foreach ($filters as $filter) {
            if (\in_array($filter, $this->forbiddenFilters)) {
                throw new SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter);
            }
        }

        foreach ($functions as $function) {
            if (\in_array($function, $this->forbiddenFunctions)) {
                throw new SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function);
            }
        }
    }

    public function checkMethodAllowed($obj, $method): void
    {
        if ($obj instanceof Template || $obj instanceof Markup) {
            return;
        }

        $forbidden = false;
        $method = strtr($method, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
        foreach ($this->forbiddenMethods as $class => $methods) {
            if ($obj instanceof $class) {
                $forbidden = \in_array($method, $methods);

                break;
            }
        }

        if ($forbidden) {
            $class = \get_class($obj);
            throw new SecurityNotAllowedMethodError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, $class), $class, $method);
        }
    }

    public function checkPropertyAllowed($obj, $property): void
    {
        $forbidden = false;
        foreach ($this->forbiddenProperties as $class => $properties) {
            if ($obj instanceof $class) {
                $forbidden = \in_array($property, \is_array($properties) ? $properties : [$properties]);

                break;
            }
        }

        if ($forbidden) {
            $class = \get_class($obj);
            throw new SecurityNotAllowedPropertyError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, $class), $class, $property);
        }
    }
}
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Twig\SecurityPolicy;

use App\Invoice\InvoiceModel;
use App\Pdf\PdfContext;
use Symfony\Component\String\UnicodeString;
use Twig\Markup;
use Twig\Sandbox\SecurityPolicy;
use Twig\Sandbox\SecurityPolicyInterface;
use Twig\Template;

/**
 * Represents the security policy for custom Twig invoice templates.
 */
final class InvoicePolicy implements SecurityPolicyInterface
{
    private ChainPolicy $policy;

    public function __construct()
    {
        $this->policy = new ChainPolicy();
        $this->policy->addPolicy(new DefaultPolicy());
        $this->policy->addPolicy(new SecurityPolicy(
            ['block', 'if', 'for', 'set', 'extends'],
            [
                // Twig core filters
                'map', 'escape', 'trans', 'default', 'nl2br', 'trim', 'raw',
                'join', 'u', 'slice', 'date', 'month_name', 'first', 'country_name',
                'replace', 'length', 'number_format', 'split',

                // Kimai filters
                'md2html', 'desc2html', 'comment2html', 'comment1line', 'multiline_indent', 'nl2str',
                'date_short', 'duration', 'amount', 'money', 'duration_decimal',
            ],
            [
                PdfContext::class => ['setoption'],
                InvoiceModel::class => ['toarray'],
            ],
            [], // properties
            [
                // Twig core functions
                'cycle', 'asset', 'range',

                // Kimai functions
                'encore_entry_css_source', 'qr_code_data_uri', 'config',
            ]
        ));
    }

    public function checkSecurity($tags, $filters, $functions): void
    {
        $this->policy->checkSecurity($tags, $filters, $functions);
    }

    public function checkMethodAllowed($obj, $method): void
    {
        if ($obj instanceof Template || $obj instanceof Markup || $obj instanceof UnicodeString) {
            return;
        }

        $lm = strtolower($method);

        if (str_starts_with($lm, 'get') || str_starts_with($lm, 'is') || str_starts_with($lm, 'has')) {
            return;
        }

        if ($lm === '__tostring') {
            return;
        }

        $this->policy->checkMethodAllowed($obj, $method);
    }

    public function checkPropertyAllowed($obj, $property): void
    {
        $this->policy->checkPropertyAllowed($obj, $property);
    }
}
use App\Twig\SecurityPolicy\InvoicePolicy;
use Twig\Extension\SandboxExtension;
        // enable basic security measures
        if (!$twig->hasExtension(SandboxExtension::class)) {
            $sandbox = new SandboxExtension(new InvoicePolicy());
            $sandbox->enableSandbox();
            $twig->addExtension($sandbox);
        }

use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
use Psr\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
use Psr\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @return array<string, string|bool|int|null|array<string, mixed>>
use App\Repository\Query\TimesheetQuery;
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @return array<string, string|bool|int|null|array<string, mixed>>
        // we can safely assume that the user can see
        $route = 'admin_timesheet';

        return array_merge([
            'color' => WidgetInterface::COLOR_TOTAL,
            'icon' => 'duration',
            'route' => $route,
            'routeOptions' => ['state' => TimesheetQuery::STATE_RUNNING],
        ], parent::getOptions($options));
        // if you ever loosen that check, make sure that the above link is probably removed
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
use Psr\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
use Psr\EventDispatcher\EventDispatcherInterface;
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     @return array<string, string|bool|int|null|array<string, mixed>>
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @param array<string, string|bool|int|null|array<string, mixed>> $options
     * @return array<string, string|bool|int|null|array<string, mixed>>
use Psr\EventDispatcher\EventDispatcherInterface;
        {% block upper_left %}&nbsp;{% endblock %}
            <th>{% block upper_left %}{{ user.displayName }}{% endblock %}</th>
                {% block period_name %}
                    <th>{{ column|date_short }}</th>
                {% endblock %}
    {% from '@theme/components/buttons.html.twig' import submit_button %}
    {{ submit_button('download', {'attr': {'formaction': path(export_route)}, 'icon': 'download', 'combined': false}, 'primary') }}
        {% block upper_left %}&nbsp;{% endblock %}
{% embed 'reporting/report_by_user_data.html.twig' %}
    {% block period_name %}
        <th>{{ column|month_name }} {{ column|date_format('Y') }}</th>
    {% endblock %}
    {% block column_classes_project %}{% endblock %}
    {% block column_classes_activity %}{% endblock %}
    {% block column_classes_total %}{% endblock %}
{% endembed %}
        {{ 'resetting.check_email'|trans({'%tokenLifetime%': tokenLifetime|duration})|nl2br }}
            <fieldset class="form-fieldset pb-0 h-100">
                {{ form_row(form.replaceDescription) }}
                {{ form_row(form.description) }}
            </fieldset>
            <fieldset class="form-fieldset pb-0 h-100">
            <div class="me-auto">
                <p>{{ 'api_password.intro'|trans }}</p>

                <p>{{ 'username'|trans }}: {{ user.userIdentifier }}</p>
            </div>
                {% if not url is empty %}<a href="{{ url }}">{% endif %}
                {% if not url is empty %}</a>{% endif %}

    {% if percent is defined and percent is not null %}
        {{ progress_bar({current: percent, max: 100, min: 0}) }}
    {% endif %}
    {% if previous is defined and previous is not null %}
        {% if next is defined and next is not null %}
{% extends 'wizard/layout.html.twig' %}

{% block wizard_content %}
    <div class="card-body text-center py-4 p-sm-6">
        <h1 class="mt-2">{{ 'wizard.password.title'|trans({}, 'wizard') }}</h1>
        <p class="text-body-secondary">{{ 'wizard.password.description'|trans({}, 'wizard') }}</p>
    </div>
    <div class="hr-text hr-text-center hr-text-spaceless">{{ 'wizard.separator'|trans({}, 'wizard') }}</div>
    <div class="card-body">
        <div class="mb-3">
            {{ form_rest(form) }}
        </div>
    </div>
{% endblock %}
                    'apiToken' => 'bool',
                    'apiToken' => 'bool',
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
    public function testGetCollectionFull(): void
    {
        $client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN);
        $this->assertAccessIsGranted($client, '/api/users?full=true');

        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);

        $this->assertIsArray($result);
        $this->assertNotEmpty($result);
        $this->assertEquals(7, \count($result));
        foreach ($result as $user) {
            self::assertApiResponseTypeStructure('UserEntity', $user);
        }
    }

        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
        $content = $client->getResponse()->getContent();
        $this->assertIsString($content);
        $result = json_decode($content, true);
<?php

/*
 * This file is part of the Kimai time-tracking app.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Tests\Command;

use App\Command\UserLoginLinkCommand;
use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;

/**
 * @covers \App\Command\UserLoginLinkCommand
 * @group integration
 */
class UserLoginLinkCommandTest extends KernelTestCase
{
    private Application $application;

    protected function setUp(): void
    {
        parent::setUp();
        $kernel = self::bootKernel();
        $this->application = new Application($kernel);

        $loginLinkHandler = $this->createMock(LoginLinkHandlerInterface::class);
        $userRepository = $this->createMock(UserRepository::class);
        $requestStack = $this->createMock(RequestStack::class);

        $this->application->add(new UserLoginLinkCommand($loginLinkHandler, $userRepository, $requestStack));
    }

    public function testCommandName(): void
    {
        $application = $this->application;

        $command = $application->find('kimai:user:login-link');
        self::assertInstanceOf(UserLoginLinkCommand::class, $command);
    }
}
                'upload_twig' => false,
        self::assertNotNull($sut->getModifiedAt());
        self::assertNotNull($sut->getModifiedAt());
        self::assertNotNull($clone->getModifiedAt());
use Symfony\Component\HttpFoundation\RequestStack;
    public function testConfiguration(): void
    public function testRenderAttachment(): void
        /** @var RequestStack $stack */
        /** @var string $cacheDir */
    }

    public function testRenderInline(): void
    {
        $kernel = self::bootKernel();
        /** @var Environment $twig */
        $twig = self::getContainer()->get('twig');
        /** @var RequestStack $stack */
        $stack = self::getContainer()->get('request_stack');
        /** @var string $cacheDir */
        $cacheDir = $kernel->getContainer()->getParameter('kernel.cache_dir');
        $converter = new MPdfConverter((new FileHelperFactory($this))->create(), $cacheDir);
        $request = new Request();
        $request->setLocale('en');
        $stack->push($request);

        $sut = new PDFRenderer($twig, $converter, $this->createMock(ProjectStatisticService::class));

        $prefix = date('Ymd');
        $this->assertEquals('application/pdf', $response->headers->get('Content-Type'));
        $this->assertNotEmpty($response->getContent());
use Symfony\Component\HttpFoundation\RequestStack;
    public function testConfiguration(): void
    public function testRender(): void
        /** @var RequestStack $stack */
use Symfony\Component\HttpFoundation\RequestStack;
    public function testConfiguration(): void
    public function testRender(): void
        /** @var RequestStack $stack */
        /** @var string $cacheDir */
use App\Model\InvoiceDocument;
use Symfony\Component\HttpFoundation\RequestStack;
    public function testSupports(): void
    public function testRenderAttachment(): void
        /** @var RequestStack $stack */
    }

    public function testRenderInline(): void
    {
        $kernel = self::bootKernel();
        /** @var Environment $twig */
        $twig = self::getContainer()->get('twig');
        /** @var RequestStack $stack */
        $stack = self::getContainer()->get('request_stack');
        /** @var string $cacheDir */
        $cacheDir = $kernel->getContainer()->getParameter('kernel.cache_dir');

        $request = new Request();
        $request->setLocale('en');
        $stack->push($request);

        /** @var FilesystemLoader $loader */
        $loader = $twig->getLoader();
        $loader->addPath(__DIR__ . '/../templates/', 'invoice');

        $sut = new PdfRenderer($twig, new MPdfConverter((new FileHelperFactory($this))->create(), $cacheDir));
        $model = $this->getInvoiceModel();
        $document = $this->getInvoiceDocument('default.pdf.twig', true);
        $this->assertNotEmpty($response->getContent());
    }

    public function testRenderAll(): void
    {
        $kernel = self::bootKernel();
        /** @var Environment $twig */
        $twig = self::getContainer()->get('twig');
        $stack = self::getContainer()->get('request_stack');
        /** @var string $cacheDir */
        $cacheDir = $kernel->getContainer()->getParameter('kernel.cache_dir');

        $request = new Request();
        $request->setLocale('en');
        $stack->push($request);

        /** @var FilesystemLoader $loader */
        $loader = $twig->getLoader();
        $loader->addPath(__DIR__ . '/../templates/', 'invoice');

        $dirs = [
            __DIR__ . '/../../../templates/invoice/renderer/',
            __DIR__ . '/../../../var/invoices/',
            __DIR__ . '/../../../var/invoices_customer/',
            __DIR__ . '/../../../var/invoices_old/',
        ];

        $files = [];
        foreach ($dirs as $dir) {
            if (!is_dir($dir)) {
                continue;
            }
            $dir = realpath($dir);
            $loader->addPath($dir . '/', 'invoice');
            $found = glob($dir . '/*.pdf.twig');
            if ($found !== false) {
                $files = array_merge($files, $found);
            }
        }

        $sut = new PdfRenderer($twig, new MPdfConverter((new FileHelperFactory($this))->create(), $cacheDir));
        $model = $this->getInvoiceModel();

        foreach ($files as $filename) {
            $document = new InvoiceDocument(new \SplFileInfo($filename));

            $response = $sut->render($document, $model);
            $this->assertEquals('application/pdf', $response->headers->get('Content-Type'));
            $this->assertStringContainsString('attachment; filename', $response->headers->get('Content-Disposition'));
            $this->assertNotEmpty($response->getContent());
        }
use App\Model\InvoiceDocument;
use Symfony\Component\HttpFoundation\RequestStack;
    public function testSupports(): void
    public function testRender(): void
        /** @var RequestStack $stack */
        $model->getTemplate()?->setLanguage('de');

    public function testRenderAll(): void
    {
        $kernel = self::bootKernel();
        /** @var Environment $twig */
        $twig = self::getContainer()->get('twig');
        /** @var RequestStack $stack */
        $stack = self::getContainer()->get('request_stack');
        $request = new Request();
        $request->setLocale('en');
        $stack->push($request);

        /** @var FilesystemLoader $loader */
        $loader = $twig->getLoader();
        $loader->addPath($this->getInvoiceTemplatePath(), 'invoice');

        $dirs = [
            __DIR__ . '/../../../templates/invoice/renderer/',
            __DIR__ . '/../../../var/invoices/',
            __DIR__ . '/../../../var/invoices_customer/',
            __DIR__ . '/../../../var/invoices_old/',
        ];

        $files = [];
        foreach ($dirs as $dir) {
            if (!is_dir($dir)) {
                continue;
            }
            $dir = realpath($dir);
            $loader->addPath($dir . '/', 'invoice');
            $found = glob($dir . '/*.html.twig');
            if ($found !== false) {
                $files = array_merge($files, $found);
            }
        }

        $sut = new TwigRenderer($twig);

        $model = $this->getInvoiceModel();
        $model->getTemplate()?->setLanguage('de');

        foreach ($files as $filename) {
            $document = new InvoiceDocument(new \SplFileInfo($filename));

            $response = $sut->render($document, $model);
            $this->assertEquals('text/html; charset=UTF-8', $response->headers->get('Content-Type'));
            $this->assertNotEmpty($response->getContent());
        }
    }
{% set language = invoice['invoice.language'] %}
            message: "#^Parameter \\#6 \\$eventDispatcher of class App\\\\Command\\\\InvoiceCreateCommand constructor expects Psr\\\\EventDispatcher\\\\EventDispatcherInterface, object\\|null given\\.$#"
            count: 3
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Připojit</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Nahradit</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Erstat</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Tilføj</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Ersetzen</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Hinzufügen</target>
      <trans-unit id=".wmq_rT" resname="force_password_change">
        <source>force_password_change</source>
        <target>Neues Passwort anfordern</target>
      </trans-unit>
      <trans-unit id="0bKwA0k" resname="force_password_change_help">
        <source>force_password_change_help</source>
        <target>Bei der nächsten Anmeldung muss der Benutzer ein neues Passwort hinterlegen</target>
      </trans-unit>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Hinzufügen</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Ersetzen</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Αντικατάσταση</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Προσάρτηση</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Replace</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Append</target>
      <trans-unit id=".wmq_rT" resname="force_password_change">
        <source>force_password_change</source>
        <target>Request new password</target>
      </trans-unit>
      <trans-unit id="0bKwA0k" resname="force_password_change_help">
        <source>force_password_change_help</source>
        <target>The next time the user logs in, they must enter a new password.</target>
      </trans-unit>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Anstataŭigi</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Postglui</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Reemplazar</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Gehitu</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Ordeztu</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target state="translated">Vaihda</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target state="translated">Lisää</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Legg aftrat</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Útskift</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Ajouter</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Remplacer</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Zamijeni</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Dodaj</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Sostituisci</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Aggiungi</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Zamień</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Dodaj</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Anexar</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Substituir</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target state="translated">Добавить</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target state="translated">Заменить</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Zmeniť</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Pridať</target>
      <trans-unit id="ICpl9sx" resname="append">
        <source>append</source>
        <target>Fäst</target>
      <trans-unit id="tl01EdS" resname="replace">
        <source>replace</source>
        <target>Ersätt</target>
      <trans-unit id="7Vipfs7" resname="wizard.password.title">
        <source>wizard.password.title</source>
        <target>Ihr Passwort</target>
      </trans-unit>
      <trans-unit id="zlNbbUg" resname="wizard.password.description">
        <source>wizard.password.description</source>
        <target>Bitte geben Sie ihr neues Passwort ein, das von nun an für die Anmeldung gelten soll.</target>
      </trans-unit>
      <trans-unit id="7Vipfs7" resname="wizard.password.title">
        <source>wizard.password.title</source>
        <target>Your password</target>
      </trans-unit>
      <trans-unit id="zlNbbUg" resname="wizard.password.description">
        <source>wizard.password.description</source>
        <target>Please enter your new password, which will be used for logging in from now on.</target>
      </trans-unit>