From 8b650558e23c177e583f2fe27e1526e94916b115 Mon Sep 17 00:00:00 2001 From: brusnitsyn Date: Fri, 31 Oct 2025 16:48:05 +0900 Subject: [PATCH] first commit --- .editorconfig | 18 + .env.example | 65 + .gitattributes | 11 + .gitignore | 24 + README.md | 1 + app/Http/Controllers/Controller.php | 8 + app/Http/Controllers/DocImportController.php | 289 + app/Http/Controllers/DocumentController.php | 90 + .../Controllers/DocumentEditorController.php | 24 + app/Http/Controllers/EditorController.php | 21 + app/Http/Controllers/WorkspaceController.php | 19 + app/Http/Middleware/HandleInertiaRequests.php | 43 + app/Models/DocumentTemplate.php | 68 + app/Models/DocumentTemplateVariable.php | 10 + app/Models/User.php | 48 + app/Providers/AppServiceProvider.php | 24 + app/Services/DocxParser.php | 644 ++ app/Services/DocxTemplateProcessor.php | 56 + app/Services/DocxVariableExtractor.php | 249 + app/Services/PageBreaker.php | 239 + artisan | 18 + bootstrap/app.php | 23 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 5 + composer.json | 79 + composer.lock | 9155 +++++++++++++++++ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 108 + config/database.php | 174 + config/filesystems.php | 80 + config/libreoffice.php | 11 + config/logging.php | 132 + config/mail.php | 118 + config/queue.php | 112 + config/sanctum.php | 84 + config/sentry.php | 135 + config/services.php | 38 + config/session.php | 217 + database/.gitignore | 1 + database/factories/UserFactory.php | 44 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ...064700_create_document_templates_table.php | 32 + ...eate_document_template_variables_table.php | 29 + ...15_create_personal_access_tokens_table.php | 33 + database/seeders/DatabaseSeeder.php | 23 + database/seeders/DocumentTemplateSeeder.php | 208 + nginx.dev.conf | 53 + package-lock.json | 4312 ++++++++ package.json | 28 + phpunit.xml | 34 + public/.htaccess | 25 + public/assets/fonts/Golos-Text_Black.woff2 | Bin 0 -> 40716 bytes public/assets/fonts/Golos-Text_Bold.woff2 | Bin 0 -> 39576 bytes public/assets/fonts/Golos-Text_DemiBold.woff2 | Bin 0 -> 39724 bytes public/assets/fonts/Golos-Text_Medium.woff2 | Bin 0 -> 39932 bytes public/assets/fonts/Golos-Text_Regular.woff2 | Bin 0 -> 39216 bytes public/favicon.ico | 0 public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 62 + .../js/Components/Accordion/Accordion.vue | 38 + resources/js/Components/Badge/Badge.vue | 91 + resources/js/Components/Button/Button.vue | 212 + resources/js/Components/Calendar/Calendar.vue | 433 + resources/js/Components/Card/Card.vue | 65 + resources/js/Components/Card/CardBack.vue | 32 + resources/js/Components/Card/CardBody.vue | 11 + resources/js/Components/Card/CardFooter.vue | 13 + resources/js/Components/Card/CardHeader.vue | 5 + .../js/Components/Collapsible/Collapsible.vue | 130 + resources/js/Components/Document/A4.vue | 45 + .../Components/Document/DocumentElement.vue | 61 + .../Components/Document/DocumentHeading.vue | 54 + .../js/Components/Document/DocumentHtml.vue | 35 + .../Components/Document/DocumentLineBreak.vue | 17 + .../Components/Document/DocumentParagraph.vue | 139 + .../Components/Document/DocumentRenderer.vue | 107 + .../js/Components/Document/DocumentTable.vue | 40 + .../Components/Document/DocumentTableCell.vue | 13 + .../Components/Document/DocumentTableRow.vue | 29 + .../js/Components/Document/DocumentText.vue | 93 + .../Components/Document/DocumentTextRun.vue | 141 + .../Components/Document/DocumentWarning.vue | 24 + .../Document/InputVariable/PriceInput.vue | 136 + resources/js/Components/Editor.vue | 753 ++ resources/js/Components/Form/FormGroup.vue | 43 + resources/js/Components/Input/FileUpload.vue | 35 + resources/js/Components/Input/Input.vue | 27 + .../Components/Input/Search/AnimateSearch.vue | 92 + resources/js/Components/Input/TextArea.vue | 42 + resources/js/Components/List/List.vue | 35 + resources/js/Components/List/ListItem.vue | 31 + resources/js/Components/List/ListStrate.vue | 21 + resources/js/Components/Modal/Modal.vue | 180 + .../Notifications/SentryNotification.vue | 142 + resources/js/Components/Page/Page.vue | 14 + resources/js/Components/Page/PageBody.vue | 13 + resources/js/Components/Page/PageHeader.vue | 16 + resources/js/Components/PageElement.vue | 347 + resources/js/Components/Select/Select.vue | 162 + .../js/Components/Select/SelectOption.vue | 11 + resources/js/Components/Sidebar/Sidebar.vue | 13 + .../js/Components/Sidebar/SidebarBody.vue | 13 + .../js/Components/Sidebar/SidebarFooter.vue | 13 + .../js/Components/Sidebar/SidebarHeader.vue | 13 + .../js/Components/Sidebar/SidebarItem.vue | 19 + .../js/Components/Sidebar/SidebarLabel.vue | 13 + .../js/Components/Sidebar/SidebarSection.vue | 13 + resources/js/Composables/useApiForm.js | 107 + .../js/Composables/useDynamicA4Layout.js | 113 + resources/js/Composables/useFileDownload.js | 66 + resources/js/Layouts/Sections.vue | 38 + resources/js/Layouts/Workspace.vue | 25 + resources/js/Pages/ContractGenerator.vue | 447 + resources/js/Pages/Index.vue | 160 + .../js/Pages/Parts/EditDocumentModal.vue | 681 ++ .../js/Pages/Parts/ImportDocumentModal.vue | 203 + resources/js/Pages/Parts/VariableModal.vue | 97 + resources/js/Pages/TemplateEditor.vue | 406 + resources/js/Utils/heightCalculator.js | 84 + resources/js/Utils/optionsFormatter.js | 78 + resources/js/Utils/pageTransitionMgmt.js | 225 + resources/js/app.js | 18 + resources/js/bootstrap.js | 4 + resources/views/app.blade.php | 15 + routes/api.php | 12 + routes/console.php | 8 + routes/web.php | 34 + storage/app/.gitignore | 4 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + vite.config.js | 17 + 143 files changed, 24664 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/DocImportController.php create mode 100644 app/Http/Controllers/DocumentController.php create mode 100644 app/Http/Controllers/DocumentEditorController.php create mode 100644 app/Http/Controllers/EditorController.php create mode 100644 app/Http/Controllers/WorkspaceController.php create mode 100644 app/Http/Middleware/HandleInertiaRequests.php create mode 100644 app/Models/DocumentTemplate.php create mode 100644 app/Models/DocumentTemplateVariable.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Services/DocxParser.php create mode 100644 app/Services/DocxTemplateProcessor.php create mode 100644 app/Services/DocxVariableExtractor.php create mode 100644 app/Services/PageBreaker.php create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/libreoffice.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/sanctum.php create mode 100644 config/sentry.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2025_09_04_064700_create_document_templates_table.php create mode 100644 database/migrations/2025_09_04_064804_create_document_template_variables_table.php create mode 100644 database/migrations/2025_10_14_062315_create_personal_access_tokens_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/DocumentTemplateSeeder.php create mode 100644 nginx.dev.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 100644 public/assets/fonts/Golos-Text_Black.woff2 create mode 100644 public/assets/fonts/Golos-Text_Bold.woff2 create mode 100644 public/assets/fonts/Golos-Text_DemiBold.woff2 create mode 100644 public/assets/fonts/Golos-Text_Medium.woff2 create mode 100644 public/assets/fonts/Golos-Text_Regular.woff2 create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/Components/Accordion/Accordion.vue create mode 100644 resources/js/Components/Badge/Badge.vue create mode 100644 resources/js/Components/Button/Button.vue create mode 100644 resources/js/Components/Calendar/Calendar.vue create mode 100644 resources/js/Components/Card/Card.vue create mode 100644 resources/js/Components/Card/CardBack.vue create mode 100644 resources/js/Components/Card/CardBody.vue create mode 100644 resources/js/Components/Card/CardFooter.vue create mode 100644 resources/js/Components/Card/CardHeader.vue create mode 100644 resources/js/Components/Collapsible/Collapsible.vue create mode 100644 resources/js/Components/Document/A4.vue create mode 100644 resources/js/Components/Document/DocumentElement.vue create mode 100644 resources/js/Components/Document/DocumentHeading.vue create mode 100644 resources/js/Components/Document/DocumentHtml.vue create mode 100644 resources/js/Components/Document/DocumentLineBreak.vue create mode 100644 resources/js/Components/Document/DocumentParagraph.vue create mode 100644 resources/js/Components/Document/DocumentRenderer.vue create mode 100644 resources/js/Components/Document/DocumentTable.vue create mode 100644 resources/js/Components/Document/DocumentTableCell.vue create mode 100644 resources/js/Components/Document/DocumentTableRow.vue create mode 100644 resources/js/Components/Document/DocumentText.vue create mode 100644 resources/js/Components/Document/DocumentTextRun.vue create mode 100644 resources/js/Components/Document/DocumentWarning.vue create mode 100644 resources/js/Components/Document/InputVariable/PriceInput.vue create mode 100644 resources/js/Components/Editor.vue create mode 100644 resources/js/Components/Form/FormGroup.vue create mode 100644 resources/js/Components/Input/FileUpload.vue create mode 100644 resources/js/Components/Input/Input.vue create mode 100644 resources/js/Components/Input/Search/AnimateSearch.vue create mode 100644 resources/js/Components/Input/TextArea.vue create mode 100644 resources/js/Components/List/List.vue create mode 100644 resources/js/Components/List/ListItem.vue create mode 100644 resources/js/Components/List/ListStrate.vue create mode 100644 resources/js/Components/Modal/Modal.vue create mode 100644 resources/js/Components/Notifications/SentryNotification.vue create mode 100644 resources/js/Components/Page/Page.vue create mode 100644 resources/js/Components/Page/PageBody.vue create mode 100644 resources/js/Components/Page/PageHeader.vue create mode 100644 resources/js/Components/PageElement.vue create mode 100644 resources/js/Components/Select/Select.vue create mode 100644 resources/js/Components/Select/SelectOption.vue create mode 100644 resources/js/Components/Sidebar/Sidebar.vue create mode 100644 resources/js/Components/Sidebar/SidebarBody.vue create mode 100644 resources/js/Components/Sidebar/SidebarFooter.vue create mode 100644 resources/js/Components/Sidebar/SidebarHeader.vue create mode 100644 resources/js/Components/Sidebar/SidebarItem.vue create mode 100644 resources/js/Components/Sidebar/SidebarLabel.vue create mode 100644 resources/js/Components/Sidebar/SidebarSection.vue create mode 100644 resources/js/Composables/useApiForm.js create mode 100644 resources/js/Composables/useDynamicA4Layout.js create mode 100644 resources/js/Composables/useFileDownload.js create mode 100644 resources/js/Layouts/Sections.vue create mode 100644 resources/js/Layouts/Workspace.vue create mode 100644 resources/js/Pages/ContractGenerator.vue create mode 100644 resources/js/Pages/Index.vue create mode 100644 resources/js/Pages/Parts/EditDocumentModal.vue create mode 100644 resources/js/Pages/Parts/ImportDocumentModal.vue create mode 100644 resources/js/Pages/Parts/VariableModal.vue create mode 100644 resources/js/Pages/TemplateEditor.vue create mode 100644 resources/js/Utils/heightCalculator.js create mode 100644 resources/js/Utils/optionsFormatter.js create mode 100644 resources/js/Utils/pageTransitionMgmt.js create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/app.blade.php create mode 100644 routes/api.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f0de65 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..df529c0 --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=psql +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b71b1ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +*.log +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +/.fleet +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..b7da267 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# documenter-mono diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ +source_path, now()->addMinutes(2)); + + return response()->json([ + 'id' => $template->id, + 'name' => $template->name, + 'description' => $template->description, + 'file_url' => $urlFile, + 'variables' => $template->variables, + ]); + } + + public function update(Request $request) + { + $data = $request->validate([ + 'id' => 'required|numeric', + 'file' => 'nullable|file|mimes:docx|max:10240', + 'name' => 'nullable|string|max:255', + 'description' => 'nullable|string', + 'variables' => 'nullable|array', + ]); + + $template = DocumentTemplate::findOrFail($data['id']); + + if ($request->hasFile('file')) { + $dirName = pathinfo($template->source_path, PATHINFO_DIRNAME); + $fileName = pathinfo($template->source_path, PATHINFO_BASENAME); + $file = $request->file('file'); + $file->move("$dirName", $fileName); + $template->update([ + 'source_path' => "$dirName/$fileName", + ]); + } + + $template->update([ + 'name' => $data['name'], + 'description' => $data['description'], + 'variables' => $data['variables'], + ]); + } + + public function store(Request $request, DocxParser $parser) + { + $data = $request->validate([ + 'file' => 'required|file|mimes:docx|max:10240', + 'name' => 'nullable|string|max:255', + 'description' => 'nullable|string', + 'variables' => 'nullable|array', + ]); + + $file = $request->file('file'); + $templateFolderName = md5(uniqid(rand(), true)); + $templateFileName = 'source.' . $file->getClientOriginalExtension(); + $laravelPath = 'templates/' . $templateFolderName; + $file->move("storage/$laravelPath", $templateFileName); + + $template = DocumentTemplate::create([ + 'name' => $data['name'] ?? 'Тест', + 'description' => $data['description'], + 'content' => 'content', + 'variables' => $data['variables'] ?? [], + 'source_path' => "storage/$laravelPath" . '/' . $templateFileName, + ]); + } + + private function cleanHtml($html) : string + { + // Убираем ненужные теги и атрибуты + $html = preg_replace('/]*>/', '', $html); + $html = preg_replace('/]*>/', '', $html); + $html = preg_replace('/<\/html>/', '', $html); + $html = preg_replace('/.*?<\/head>/si', '', $html); + $html = preg_replace('/]*>/', '', $html); + $html = preg_replace('/<\/body>/', '', $html); + + // Убираем пустые теги и лишние пробелы + $html = preg_replace('/]*>(\s| )*<\/p>/', '', $html); + $html = preg_replace('/\s*/', '
', $html); + + // Очищаем ссылки ConsultantPlus + $html = preg_replace('/]*consultantplus[^>]*>([^<]*)<\/a>/', '$1', $html); + + // Упрощаем теги font + $html = preg_replace('/]*face="([^"]*)"[^>]*>/', '', $html); +// $html = preg_replace('/]*size="([^"]*)"[^>]*>/', '', $html); + $html = preg_replace('/]*color="([^"]*)"[^>]*>/', '', $html); + $html = str_replace('', '', $html); + + // Обрабатываем вложенные font теги + $html = preg_replace('/]*>]*>/', '', $html); + $html = preg_replace('/<\/span><\/span>/', '', $html); + + // Заменяем закладки и якоря + $html = preg_replace('/<\/a>/', '', $html); + + // Обрабатываем шаблонные переменные {{ }} + $html = preg_replace('/\{\{<\/b><\/span>/', '{{', $html); + $html = preg_replace('/([^<]*)<\/b><\/span>\}\}<\/b><\/span>/', '$1}}', $html); + + // Улучшаем таблицы + $html = preg_replace('/]*>/', '', $html); + $html = preg_replace('/]*>/', '
', $html); + $html = preg_replace('/]*>/', '', $html); + + // Убираем лишние классы western + $html = str_replace('class="western"', '', $html); + + // Стили для красивого отображения + $styles = ' + + '; + + // Добавляем классы для выравнивания + $html = preg_replace('/]*align="center"[^>]*>/', '

', $html); + $html = preg_replace('/]*align="left"[^>]*>/', '

', $html); + $html = preg_replace('/]*align="right"[^>]*>/', '

', $html); + + // Добавляем классы для отступов + $html = preg_replace('/style="[^"]*text-indent:\s*1\.25cm[^"]*"/', 'class="indent-1"', $html); + $html = preg_replace('/style="[^"]*text-indent:\s*0\.95cm[^"]*"/', 'class="indent-095"', $html); + $html = preg_replace('/style="[^"]*text-indent:\s*1cm[^"]*"/', 'class="indent-1cm"', $html); + + // Обрабатываем шаблонные переменные + $html = preg_replace('/\{\{([^}]+)\}\}/', '{{$1}}', $html); + + return '

' . $html . '
' . $styles; + } + + public function previewVariables(Request $request, DocxVariableExtractor $extractor) + { + $rules = [ + 'name' => 'required|string', + 'doc_file' => 'required|file|mimes:docx,doc|max:10240', + ]; + $messages = [ + 'name.required' => 'Наименование не может быть пустым', + 'doc_file.required' => 'Вы не приложили документ', + ]; + + $validator = \Validator::make($request->all(), $rules, $messages); + + $validator->validate(); + + try { + $file = $request->file('doc_file'); + $tempPath = $file->getRealPath(); + + $variables = $extractor->extractVariables($tempPath); + + return response()->json([ + 'success' => true, + 'variables' => $variables, + 'count' => count($variables) + ]); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Ошибка при анализе файла: ' . $e->getMessage() + ], 500); + } + } +} diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php new file mode 100644 index 0000000..9405428 --- /dev/null +++ b/app/Http/Controllers/DocumentController.php @@ -0,0 +1,90 @@ + $template + ]); + } + + /** + * Предпросмотр документа с подставленными значениями + */ + public function preview(Request $request, $id) + { + $request->validate([ + 'variables' => 'nullable|array' + ]); + + try { + $template = DocumentTemplate::findOrFail($id); + + // Генерируем DOCX с подставленными значениями + $docxPath = $template->generateDocument($request->variables); + + // Конвертируем в PDF + $pdfPath = $template->convertToPdf($docxPath); + + // Регистрируем функцию для удаления после завершения + register_shutdown_function(function () use ($docxPath, $pdfPath) { + File::delete($docxPath); + File::delete($pdfPath); + }); + + // Отдаем PDF + return response()->file($pdfPath, [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'inline; filename="preview.pdf"' + ]); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'error' => $e->getMessage() + ], 500); + } + } + + /** + * Скачивание готового документа + */ + public function download(Request $request, $id) + { + $request->validate([ + 'variables' => 'nullable|array' + ]); + + try { + $template = DocumentTemplate::findOrFail($id); + $docxPath = $template->generateDocument($request->variables); + + return response()->download($docxPath, + $template->name . '.docx', + [ + 'Content-Type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'Content-Disposition' => 'attachment; filename="' . $template->name . '.docx"' + ] + ); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'error' => $e->getMessage() + ], 500); + } + } +} diff --git a/app/Http/Controllers/DocumentEditorController.php b/app/Http/Controllers/DocumentEditorController.php new file mode 100644 index 0000000..6bbd2ab --- /dev/null +++ b/app/Http/Controllers/DocumentEditorController.php @@ -0,0 +1,24 @@ +get('templateId', null); + + $template = null; + if ($templateId !== null) { + $template = DocumentTemplate::find($templateId); + } + + return Inertia::render('TemplateEditor', [ + 'template' => $template, + ]); + } +} diff --git a/app/Http/Controllers/EditorController.php b/app/Http/Controllers/EditorController.php new file mode 100644 index 0000000..e279e54 --- /dev/null +++ b/app/Http/Controllers/EditorController.php @@ -0,0 +1,21 @@ +get('id')); + $data = [ + 'content' => $request->get('content'), + 'variables_config' => $request->get('variables_config'), + ]; + $template->update($data); + + return redirect()->back(); + } +} diff --git a/app/Http/Controllers/WorkspaceController.php b/app/Http/Controllers/WorkspaceController.php new file mode 100644 index 0000000..2076cd5 --- /dev/null +++ b/app/Http/Controllers/WorkspaceController.php @@ -0,0 +1,19 @@ + $activeTemplates + ]); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php new file mode 100644 index 0000000..c19ce18 --- /dev/null +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -0,0 +1,43 @@ + + */ + public function share(Request $request): array + { + return [ + ...parent::share($request), + // + ]; + } +} diff --git a/app/Models/DocumentTemplate.php b/app/Models/DocumentTemplate.php new file mode 100644 index 0000000..fe4394d --- /dev/null +++ b/app/Models/DocumentTemplate.php @@ -0,0 +1,68 @@ + 'array' + ]; + + /** + * Подстановка значений в DOCX шаблон + */ + public function generateDocument($data) + { + $tempDir = storage_path('app/temp/' . uniqid()); + mkdir($tempDir, 0755, true); + + // Копируем исходный шаблон + $templatePath = $tempDir . '/template.docx'; + copy($this->source_path, $templatePath); + + $docx = new DocxTemplateProcessor(); + + // Подставляем значения + $changedDocxPath = $docx->processWithPhpWord($templatePath, $data); + + // Возвращаем путь к сгенерированному файлу + return $changedDocxPath; + } + + /** + * Конвертация в PDF для предпросмотра + */ + public function convertToPdf($docxPath) + { + $pdfPath = str_replace('.docx', '.pdf', $docxPath); + + // Надо добавить.... + $home = config('libreoffice.home'); + $user = config('libreoffice.user'); + putenv("HOME=$home"); + putenv("USER=$user"); + $command = "libreoffice --headless --convert-to pdf --outdir " . + escapeshellarg(dirname($pdfPath)) . " " . + escapeshellarg($docxPath); + + $result = shell_exec($command . " 2>&1"); + + if (!file_exists($pdfPath)) { + throw new \Exception("PDF conversion failed: " . $result); + } + + return $pdfPath; + } +} diff --git a/app/Models/DocumentTemplateVariable.php b/app/Models/DocumentTemplateVariable.php new file mode 100644 index 0000000..eb1aefc --- /dev/null +++ b/app/Models/DocumentTemplateVariable.php @@ -0,0 +1,10 @@ + */ + use HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +getSections(); + + $template = [ + 'metadata' => [ + 'title' => basename($filePath, '.docx'), + 'created_at' => now()->toISOString(), + 'source' => 'docx', + 'total_pages' => 0 + ], + 'structure' => [] + ]; + + $sectionElements = []; + foreach ($sections as $sectionIndex => $section) { + foreach ($section->getElements() as $elementIndex => $element) { +// $sectionElements[] = $this->parseElement($element); + array_push($sectionElements, $this->parseElement($element, $elementIndex)); + } + } + + $template['structure']['elements'] = $sectionElements; + +// dd($template); + + // Извлекаем переменные + $template['variables_config'] = $this->extractVariables($template['structure']); + + return $template; + + } catch (Exception $e) { + \Log::error("Ошибка парсинга DOCX: " . $e->getMessage(), $e->getTrace()); + } + } + + private function parseElement($element, $elementIndex = 0) + { + $parsedElements = []; + + $elementType = get_class($element); + + switch ($elementType) { + case 'PhpOffice\PhpWord\Element\Text': + $parsedElements = $this->parseTextElement($element, $elementIndex++); + break; + + case 'PhpOffice\PhpWord\Element\TextRun': + $textRunElements = $this->parseTextRun($element, $elementIndex); + + // Получаем стиль параграфа для TextRun + $paragraphStyle = $element->getParagraphStyle(); + + // Если TextRun содержит только один элемент, добавляем его напрямую + if (count($textRunElements) === 1) { + $textRunElements[0]['style'] = $this->parseParagraphStyle($paragraphStyle); + $isHeading = $this->isTextRunHeading($textRunElements[0]); + $textRunElements[0]['is_heading'] = $isHeading; + $textRunElements[0]['type'] = $isHeading ? 'heading' : 'paragraph'; + + $parsedElements = $textRunElements[0]; + $elementIndex++; + } else { + // Иначе создаем контейнер TextRun + $parsedElements = [ + 'id' => 'textrun-' . $elementIndex++, + 'type' => 'text_run', + 'elements' => $textRunElements, + 'style' => $this->parseParagraphStyle($paragraphStyle) +// 'formatting' => $this->getTextRunFormatting($element) + ]; + } + break; + + case 'PhpOffice\PhpWord\Element\TextBreak': + $parsedElements = [ + 'id' => 'break-' . $elementIndex++, + 'type' => 'line_break', + 'content' => '
' + ]; + break; + + case 'PhpOffice\PhpWord\Element\Title': + $parsedElements = $this->parseTitleElement($element, $elementIndex++); + break; + + case 'PhpOffice\PhpWord\Element\Table': + $parsedElements = $this->parseTableElement($element, $elementIndex++); + break; + +// case 'PhpOffice\PhpWord\Element\Image': +// $parsedElements[] = $this->parseImageElement($element, $elementIndex++); +// break; + + default: + // Пропускаем неизвестные элементы + break; + } + + return $parsedElements; + } + + private function getTextRunFormatting($textRun) + { + $style = $textRun->getParagraphStyle(); + return $this->parseStyle($style); + } + + private function parseTextElement($element, $index) + { + $text = $element->getText(); + $style = $element->getFontStyle(); + // Ищем переменные в тексте (например: {{variable}} или [VARIABLE]) + $variables = $this->extractVariablesFromText($text); + + return [ + 'id' => 'element-' . $index, + 'type' => empty($variables) ? 'paragraph' : 'variable', + 'content' => $text, + 'formatting' => $this->parseStyle($style), + 'variables' => $variables, + 'is_inline' => true + ]; + } + + public function isTextRunHeading($element) { + if ($element['formatting'] && $element['style']) { + if ($element['formatting']['bold'] && $element['style']['align'] === 'center') { + return true; + } + } + + return false; + } + + public function parseParagraphStyle($style) + { + if (!$style) return null; + + $paragraphStyle = []; + + // Выравнивание + if ($style->getAlignment()) { + $alignment = $style->getAlignment(); + $paragraphStyle['align'] = $this->mapAlignment($alignment); + } + + // Отступы + if ($style->getIndentation()) { + $indentation = $style->getIndentation(); + $paragraphStyle['indent'] = [ + 'left' => $indentation->getLeft(), + 'right' => $indentation->getRight(), + 'firstLine' => ($indentation->getFirstLine() / 1440) * 96, //\PhpOffice\PhpWord\Shared\Converter::twip($indentation->getFirstLine()) + ]; + } + +// dd($style->getLineHeight()); + + // Междустрочный интервал + if ($style->getLineHeight()) { + $paragraphStyle['lineHeight'] = $style->getLineHeight(); + } + + // Интервалы до и после + if ($style->getSpaceBefore()) { + $paragraphStyle['spaceBefore'] = $style->getSpaceBefore(); + } + + if ($style->getSpaceAfter()) { + $paragraphStyle['spaceAfter'] = $style->getSpaceAfter(); + } + + // Табуляция + if ($style->getTabs()) { + $paragraphStyle['tabs'] = $style->getTabs(); + } + + return !empty($paragraphStyle) ? $paragraphStyle : null; + } + + private function mapAlignment($alignment) + { + $mapping = [ + \PhpOffice\PhpWord\SimpleType\Jc::START => 'left', + \PhpOffice\PhpWord\SimpleType\Jc::END => 'right', + \PhpOffice\PhpWord\SimpleType\Jc::CENTER => 'center', + \PhpOffice\PhpWord\SimpleType\Jc::BOTH => 'justify', + \PhpOffice\PhpWord\SimpleType\Jc::DISTRIBUTE => 'distribute' + ]; + + return $mapping[$alignment] ?? 'left'; + } + + public function parseTextRun($textRun, $startIndex) + { + $elements = []; + $index = $startIndex; + + foreach ($textRun->getElements() as $runElement) { + if (get_class($runElement) === 'PhpOffice\PhpWord\Element\Text') { + $elements[] = $this->parseTextElement($runElement, $index++); + } + } + + return $elements; + } + + private function parseTitleElement($element, $index) + { + $text = $element->getText(); + $level = $element->getDepth() + 1; + + return [ + 'id' => 'heading-' . $index, + 'type' => 'heading', + 'level' => $level, + 'content' => $text, + 'formatting' => [ + 'bold' => true, + 'fontSize' => $this->getHeadingSize($level) + ] + ]; + } + + private function parseTableElement($table, $index) + { + $rows = []; + $rowIndex = 0; + $tableIndex = $index; + + foreach ($table->getRows() as $row) { + $cells = []; + $cellIndex = 0; + foreach ($row->getCells() as $cell) { + $styles = $this->getCellStyles($cell); + $cellElements = []; + foreach ($cell->getElements() as $cellElement) { + $cellElements[] = $this->parseElement($cellElement, $index); + $index++; + } + + $cells[] = [ + 'id' => 'cell-' . $rowIndex . '-' . $cellIndex, + 'elements' => $cellElements, +// 'variables' => $this->extra($cellElements), + 'style' => $styles, + 'width' => ($cell->getWidth() / 1440) * 96 + ]; + $cellIndex++; + } + + $rows[] = [ + 'id' => 'row-' . $rowIndex, + 'cells' => $cells + ]; + $rowIndex++; + } + + return [ + 'id' => 'table-' . $tableIndex, + 'type' => 'table', + 'rows' => $rows, + 'cols' => count($rows[0]['cells'] ?? []), +// 'content' => $this->generateTableHTML($rows) + ]; + } + + private function getCellStyles($cell) + { + $style = $cell->getStyle(); + + return [ + 'borderTopSize' => $style->getBorderTopSize(), + 'borderTopColor' => $style->getBorderTopColor(), + 'borderTopStyle' => $style->getBorderTopStyle(), + 'borderLeftSize' => $style->getBorderLeftSize(), + 'borderLeftColor' => $style->getBorderLeftColor(), + 'borderLeftStyle' => $style->getBorderLeftStyle(), + 'borderRightSize' => $style->getBorderRightSize(), + 'borderRightColor' => $style->getBorderRightColor(), + 'borderRightStyle' => $style->getBorderRightStyle(), + 'borderBottomSize' => $style->getBorderBottomSize(), + 'borderBottomColor' => $style->getBorderBottomColor(), + 'borderBottomStyle' => $style->getBorderBottomStyle(), + ]; + } + + private function parseImageElement($element, $index) + { + return [ + 'id' => 'image-' . $index, + 'type' => 'image', + 'src' => $element->getSource(), + 'width' => $element->getWidth(), + 'height' => $element->getHeight(), + 'alt' => $element->getAlt() ?? 'Image' + ]; + } + + private function parseStyle($style) + { + if (!$style) return []; + + return [ + 'bold' => $style->isBold(), + 'italic' => $style->isItalic(), + 'underline' => $style->getUnderline(), + 'fontSize' => $style->getSize(), + 'fontColor' => $style->getColor(), + 'fontFamily' => $style->getName() + ]; + } + + // Формирование HTML + public function generateParagraphStyle($paragraphStyle) + { + if (empty($paragraphStyle)) { + return ''; + } + + $styles = []; + + // Выравнивание + if (!empty($paragraphStyle['align'])) { + $styles[] = "text-align: {$paragraphStyle['align']}"; + } + + // Междустрочный интервал + if (!empty($paragraphStyle['lineHeight'])) { + $lineHeight = $paragraphStyle['lineHeight']; + if (is_numeric($lineHeight)) { + $styles[] = "line-height: {$lineHeight}"; + } else { + $styles[] = "line-height: {$lineHeight}"; + } + } + + // Отступы + if (!empty($paragraphStyle['spaceBefore'])) { + $styles[] = "margin-top: {$paragraphStyle['spaceBefore']}pt"; + } + + if (!empty($paragraphStyle['spaceAfter'])) { + $styles[] = "margin-bottom: {$paragraphStyle['spaceAfter']}pt"; + } + + // Отступы первой строки + if (!empty($paragraphStyle['indent'])) { + $indent = $paragraphStyle['indent']; + + if (!empty($indent['left'])) { + $styles[] = "margin-left: {$indent['left']}pt"; + } + + if (!empty($indent['right'])) { + $styles[] = "margin-right: {$indent['right']}pt"; + } + + if (!empty($indent['firstLine'])) { + $styles[] = "text-indent: {$indent['firstLine']}pt"; + } + } + + // Табуляция + if (!empty($paragraphStyle['tabs'])) { + $tabStops = []; + foreach ($paragraphStyle['tabs'] as $tab) { + if (!empty($tab['position'])) { + $position = $tab['position']; + $type = $tab['type'] ?? 'left'; + $tabStops[] = "{$position}pt {$type}"; + } + } + + if (!empty($tabStops)) { + $styles[] = "tab-stops: " . implode(', ', $tabStops); + } + } + + return implode('; ', $styles); + } + + public function generateTextRunStyle($formatting) + { + if (empty($formatting)) { + return ''; + } + + $styles = []; + + // Размер шрифта + if (!empty($formatting['fontSize'])) { + $fontSize = $formatting['fontSize']; + if (is_numeric($fontSize)) { + $styles[] = "font-size: {$fontSize}pt"; + } else { + $styles[] = "font-size: {$fontSize}"; + } + } + + // Цвет шрифта + if (!empty($formatting['fontColor'])) { + $styles[] = "color: {$formatting['fontColor']}"; + } + + // Цвет фона + if (!empty($formatting['backgroundColor'])) { + $styles[] = "background-color: {$formatting['backgroundColor']}"; + } + + // Шрифт + if (!empty($formatting['fontFamily'])) { + $styles[] = "font-family: '{$formatting['fontFamily']}'"; + } + + // Жирный текст + if (!empty($formatting['bold']) && $formatting['bold']) { + $styles[] = "font-weight: bold"; + } + + // Курсив + if (!empty($formatting['italic']) && $formatting['italic']) { + $styles[] = "font-style: italic"; + } + + // Подчеркивание + if (!empty($formatting['underline']) && $formatting['underline']) { + $styles[] = "text-decoration: underline"; + } + + // Зачеркивание + if (!empty($formatting['strikethrough']) && $formatting['strikethrough']) { + $styles[] = "text-decoration: line-through"; + } + + // Надстрочный индекс + if (!empty($formatting['superscript']) && $formatting['superscript']) { + $styles[] = "vertical-align: super"; + $styles[] = "font-size: smaller"; + } + + // Подстрочный индекс + if (!empty($formatting['subscript']) && $formatting['subscript']) { + $styles[] = "vertical-align: sub"; + $styles[] = "font-size: smaller"; + } + + // Тень текста + if (!empty($formatting['shadow']) && $formatting['shadow']) { + $styles[] = "text-shadow: 1px 1px 2px rgba(0,0,0,0.3)"; + } + + // Трансформация текста + if (!empty($formatting['textTransform'])) { + $styles[] = "text-transform: {$formatting['textTransform']}"; + } + + // Межбуквенный интервал + if (!empty($formatting['letterSpacing'])) { + $styles[] = "letter-spacing: {$formatting['letterSpacing']}pt"; + } + + // Межсловный интервал + if (!empty($formatting['wordSpacing'])) { + $styles[] = "word-spacing: {$formatting['wordSpacing']}pt"; + } + + return implode('; ', $styles); + } + + public function replaceVariables($content, $formData) + { + return $content; + if (empty($content)) { + return $content; + } + + // Заменяем плейсхолдеры вида {{variable}} + foreach ($formData as $key => $value) { + if (!empty($value)) { + $content = str_replace("{{{$key}}}", $value, $content); + $content = str_replace("[[{$key}]]", $value, $content); + $content = str_replace("__{$key}__", $value, $content); + } + } + + // Заменяем span-плейсхолдеры с data-variable + $dom = new DOMDocument(); + @$dom->loadHTML('
' . $content . '
'); + + $xpath = new DOMXPath($dom); + $placeholders = $xpath->query('//*[@data-variable]'); + + foreach ($placeholders as $placeholder) { + $variableName = $placeholder->getAttribute('data-variable'); + $value = $formData[$variableName] ?? ''; + + if (!empty($value)) { + // Создаем текстовый узел с значением + $textNode = $dom->createTextNode($value); + $placeholder->parentNode->replaceChild($textNode, $placeholder); + } + } + + // Извлекаем HTML обратно + $html = $dom->saveHTML(); + $html = preg_replace('/^\n?/', '', $html); + $html = preg_replace('/<\?xml encoding="UTF-8"\?>\n?/', '', $html); + $html = preg_replace('/^
/', '', $html); + $html = preg_replace('/<\/div>$/', '', $html); + + return trim($html); + } + + + + private function extractVariablesFromText($text) + { + $variables = []; + + // Ищем шаблоны переменных: {{variable}}, [VARIABLE], ${variable}, etc. + $patterns = [ + '/\{\{(\w+)\}\}/', + '/\[(\w+)\]/', + '/\$(\w+)/', + '/%(\w+)%/' + ]; + + foreach ($patterns as $pattern) { + if (preg_match_all($pattern, $text, $matches)) { + foreach ($matches[1] as $match) { + $variables[] = $match; + } + } + } + + return array_unique($variables); + } + + public function extractVariables($structure) + { + $variables = []; + + foreach ($structure['elements'] as $element) { + if (!empty($element['variables'])) { + foreach ($element['variables'] as $varName) { + if (!isset($variables[$varName])) { + $variables[$varName] = [ + 'type' => 'text', + 'label' => $this->formatVariableLabel($varName), + 'default' => '' + ]; + } + } + } + + if (!array_key_exists('type', $element)) dd($element); + // Для таблиц + if ($element['type'] === 'table' && !empty($element['rows'])) { + foreach ($element['rows'] as $row) { + foreach ($row['cells'] as $cell) { + if (!empty($cell['variables'])) { + foreach ($cell['variables'] as $varName) { + if (!isset($variables[$varName])) { + $variables[$varName] = [ + 'type' => 'text', + 'label' => $this->formatVariableLabel($varName), + 'default' => '' + ]; + } + } + } + } + } + } + } + + return $variables; + } + + private function formatVariableLabel($varName) + { + return ucfirst(str_replace(['_', '-'], ' ', $varName)); + } + + private function getHeadingSize($level) + { + $sizes = [ + 1 => '24pt', + 2 => '20pt', + 3 => '18pt', + 4 => '16pt', + 5 => '14pt', + 6 => '12pt' + ]; + + return $sizes[$level] ?? '16pt'; + } + + private function generateTableHTML($rows) + { + $html = ''; + + foreach ($rows as $row) { + $html .= ''; + foreach ($row['cells'] as $cell) { + $html .= ''; + } + $html .= ''; + } + + $html .= '
'; + $html .= htmlspecialchars($cell['content']); + $html .= '
'; + return $html; + } + + // Метод для обработки загруженного файла + public function parseUploadedFile($uploadedFile) + { + $tempPath = $uploadedFile->getRealPath(); + $extension = $uploadedFile->getClientOriginalExtension(); + + if ($extension !== 'docx') { + throw new Exception("Поддерживаются только файлы .docx"); + } + + return $this->parse($tempPath); + } +} diff --git a/app/Services/DocxTemplateProcessor.php b/app/Services/DocxTemplateProcessor.php new file mode 100644 index 0000000..b6e7be8 --- /dev/null +++ b/app/Services/DocxTemplateProcessor.php @@ -0,0 +1,56 @@ +setValue($value['name'], $value['value']); + } else { + $templateProcessor->setValue($value['value'], $value['value']); + } + } + } + + $outputPath = storage_path('app/temp/' . uniqid() . '.docx'); + $templateProcessor->saveAs($outputPath); + + return $outputPath; + } finally { + $this->cleanupTemplate($templatePath); + } + } + + protected function cleanupTemplate($templatePath): void + { + try { + if (file_exists($templatePath)) { + unlink($templatePath); + } + + $templateDir = dirname($templatePath); + if (is_dir($templateDir) && $this->isDirEmpty($templateDir)) { + rmdir($templateDir); + } + } catch (\Exception $e) { + \Log::warning("Template cleanup warning: " . $e->getMessage()); + } + } + + protected function isDirEmpty($dir): bool + { + return count(scandir($dir)) == 2; // только . и .. + } +} diff --git a/app/Services/DocxVariableExtractor.php b/app/Services/DocxVariableExtractor.php new file mode 100644 index 0000000..3434730 --- /dev/null +++ b/app/Services/DocxVariableExtractor.php @@ -0,0 +1,249 @@ +getSections() as $section) { + $this->extractFromSection($section, $variables, $textBuffer); + } + + // Проверяем остаток в буфере + $this->extractFromText($textBuffer, $variables); + + // Убираем дубликаты по полю 'name' + $uniqueVariables = []; + $seenNames = []; + + foreach ($variables as $variable) { + if (!in_array($variable['name'], $seenNames)) { + $uniqueVariables[] = $variable; + $seenNames[] = $variable['name']; + } + } + + return $uniqueVariables; + } + + private function extractFromSection($section, array &$variables, string &$textBuffer): void + { + foreach ($section->getElements() as $element) { + $this->extractFromElement($element, $variables, $textBuffer); + } + } + + private function extractFromElement($element, array &$variables, string &$textBuffer): void + { + $elementType = get_class($element); + + switch ($elementType) { + case 'PhpOffice\PhpWord\Element\TextRun': + $this->extractFromTextRun($element, $variables, $textBuffer); + break; + + case 'PhpOffice\PhpWord\Element\Text': + $textBuffer .= $element->getText(); + $this->extractFromText($textBuffer, $variables); + break; + + case 'PhpOffice\PhpWord\Element\Table': + $this->extractFromTable($element, $variables, $textBuffer); + break; + + case 'PhpOffice\PhpWord\Element\Header': + case 'PhpOffice\PhpWord\Element\Footer': + $this->extractFromSection($element, $variables, $textBuffer); + break; + + default: + // Сбрасываем буфер при смене типа элемента + $textBuffer = ''; + break; + } + } + + private function extractFromTextRun($textRun, array &$variables, string &$textBuffer): void + { + foreach ($textRun->getElements() as $element) { + if ($element instanceof \PhpOffice\PhpWord\Element\Text) { + $textBuffer .= $element->getText(); + } + } + + // Проверяем буфер после каждого TextRun + $this->extractFromText($textBuffer, $variables); + $textBuffer = ''; // Сбрасываем буфер после TextRun + } + + private function extractFromTable($table, array &$variables, string &$textBuffer): void + { + foreach ($table->getRows() as $row) { + foreach ($row->getCells() as $cell) { + $cellBuffer = ''; + foreach ($cell->getElements() as $element) { + if ($element instanceof \PhpOffice\PhpWord\Element\Text) { + $cellBuffer .= $element->getText(); + } elseif ($element instanceof \PhpOffice\PhpWord\Element\TextRun) { + foreach ($element->getElements() as $textElement) { + if ($textElement instanceof \PhpOffice\PhpWord\Element\Text) { + $cellBuffer .= $textElement->getText(); + } + } + } + } + $this->extractFromText($cellBuffer, $variables); + } + } + } + + private function extractFromText(string $text, array &$variables): void + { + // Ищем переменные в формате ${variable_name} + preg_match_all('/\$\{\s*([a-zA-Zа-яА-ЯёЁ0-9_]+)\s*\}/u', $text, $matches); + if (!empty($matches[1])) { + foreach ($matches[0] as $index => $fullMatch) { + $variables[] = [ + 'name' => $fullMatch, // Полное выражение с ${} + 'label' => $matches[1][$index], // Только содержимое внутри {} + 'type' => 'text' + ]; + } + } + } + + // Альтернативный метод: чтение напрямую из XML + public function extractVariablesFromXml($docxPath): array + { + $variables = []; + + // Временная распаковка DOCX + $zip = new \ZipArchive(); + if ($zip->open($docxPath) === TRUE) { + // Читаем document.xml + $documentXml = $zip->getFromName('word/document.xml'); + + if ($documentXml) { + // Ищем все текстовые узлы + preg_match_all('/(\{\{\s*[a-zA-Zа-яА-ЯёЁ0-9_]+\s*\}\})/u', $documentXml, $matches); + + foreach ($matches[0] as $match) { + // Извлекаем имя переменной + preg_match('/\{\{\s*([a-zA-Zа-яА-ЯёЁ0-9_]+)\s*\}\}/u', $match, $varMatches); + if (isset($varMatches[1])) { + $variables[] = $varMatches[1]; + } + } + } + + // Также проверяем headers и footers + for ($i = 0; $i < $zip->numFiles; $i++) { + $filename = $zip->getNameIndex($i); + if (preg_match('/word\/header\d+\.xml/', $filename) || + preg_match('/word\/footer\d+\.xml/', $filename)) { + $content = $zip->getFromName($filename); + preg_match_all('/(\{\{\s*[a-zA-Zа-яА-ЯёЁ0-9_]+\s*\}\})/u', $content, $matches); + + foreach ($matches[0] as $match) { + preg_match('/\{\{\s*([a-zA-Zа-яА-ЯёЁ0-9_]+)\s*\}\}/u', $match, $varMatches); + if (isset($varMatches[1])) { + $variables[] = $varMatches[1]; + } + } + } + } + + $zip->close(); + } + + return array_unique($variables); + } + + // Комбинированный метод + public function extractVariablesCombined($docxPath): array + { + $variables1 = $this->extractVariables($docxPath); + $variables2 = $this->extractVariablesFromXml($docxPath); + + return array_unique(array_merge($variables1, $variables2)); + } + + public function validateVariables(array $variables): array + { + $validated = []; + + foreach ($variables as $variable) { + if (preg_match('/^[a-zA-Zа-яА-ЯёЁ0-9_]+$/u', $variable)) { + $validated[] = $variable; + } + } + + return array_unique($validated); + } + + public function getVariablesWithExamples($docxPath): array + { + $variables = $this->extractVariablesCombined($docxPath); + $result = []; + + foreach ($variables as $variable) { + $result[$variable] = [ + 'name' => $variable, + 'human_name' => $this->makeHumanReadable($variable), + 'example' => $this->generateExample($variable), + 'type' => $this->detectType($variable) + ]; + } + + return $result; + } + + private function makeHumanReadable(string $variable): string + { + $readable = str_replace('_', ' ', $variable); + $readable = mb_strtolower($readable, 'UTF-8'); + $readable = mb_convert_case($readable, MB_CASE_TITLE, 'UTF-8'); + + return $readable; + } + + private function generateExample(string $variable): string + { + $examples = [ + 'name' => 'Иван Иванов', + 'date' => '15.01.2024', + 'number' => '123-2024', + 'company' => 'ООО "Рога и копыта"', + 'address' => 'г. Москва, ул. Примерная, д. 1', + 'amount' => '100 000 руб.', + 'quantity' => '5', + 'price' => '20 000 руб.' + ]; + + foreach ($examples as $key => $example) { + if (stripos($variable, $key) !== false) { + return $example; + } + } + + return 'Пример значения'; + } + + private function detectType(string $variable): string + { + if (stripos($variable, 'date') !== false) return 'date'; + if (stripos($variable, 'amount') !== false || stripos($variable, 'price') !== false) return 'money'; + if (stripos($variable, 'quantity') !== false || stripos($variable, 'number') !== false) return 'number'; + if (stripos($variable, 'list') !== false || stripos($variable, 'items') !== false) return 'array'; + + return 'text'; + } +} diff --git a/app/Services/PageBreaker.php b/app/Services/PageBreaker.php new file mode 100644 index 0000000..bb00fe1 --- /dev/null +++ b/app/Services/PageBreaker.php @@ -0,0 +1,239 @@ +maxPageHeight = $maxPageHeight; + $this->currentPageHeight = 0; + $this->pages = []; + $this->currentPageContent = ''; + } + + public function splitIntoPages($htmlContent) + { + if (empty($htmlContent)) { + return [['content' => '', 'pageNumber' => 1]]; + } + + $dom = new DOMDocument(); + @$dom->loadHTML('
' . $htmlContent . '
'); + + $this->pages = []; + $this->currentPageHeight = 0; + $this->currentPageContent = ''; + + $body = $dom->getElementById('content'); + if ($body) { + $this->processNode($body); + } + + // Добавляем последнюю страницу + if (!empty($this->currentPageContent)) { + $this->addPage(); + } + + return $this->pages; + } + + private function processNode($node) + { + $nodeName = strtolower($node->nodeName); + + // Элементы, которые нельзя разрывать + $unbreakableElements = ['table', 'tr', 'img', 'pre', 'code']; + + if (in_array($nodeName, $unbreakableElements)) { + $this->processUnbreakableElement($node); + } else { + $this->processBreakableElement($node); + } + } + + private function processUnbreakableElement($node) + { + $elementHtml = $this->getOuterHTML($node); + $estimatedHeight = $this->estimateElementHeight($elementHtml); + + // Если элемент не помещается на текущую страницу + if ($this->currentPageHeight + $estimatedHeight > $this->maxPageHeight && $this->currentPageHeight > 0) { + $this->addPage(); + } + + $this->currentPageContent .= $elementHtml; + $this->currentPageHeight += $estimatedHeight; + } + + private function processBreakableElement($node) + { + if ($node->nodeType === XML_TEXT_NODE) { + $this->processTextNode($node); + return; + } + + // Для breakable элементов обрабатываем детей по отдельности + foreach ($node->childNodes as $child) { + $this->processNode($child); + } + + // Добавляем закрывающий тег после обработки всех детей + if ($node->nodeType === XML_ELEMENT_NODE) { + $this->currentPageContent .= 'nodeName . '>'; + } + } + + private function processTextNode($node) + { + $text = $node->textContent; + $words = preg_split('/(\s+)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE); + + foreach ($words as $word) { + if (trim($word) === '') { + $this->addContent($word, 4); // Примерная высота пробела + continue; + } + + $wordHeight = $this->estimateTextHeight($word); + + // Если слово не помещается на текущую страницу + if ($this->currentPageHeight + $wordHeight > $this->maxPageHeight && $this->currentPageHeight > 0) { + $this->addPage(); + } + + $this->addContent($word, $wordHeight); + } + } + + private function addContent($content, $height) + { + $this->currentPageContent .= $content; + $this->currentPageHeight += $height; + } + + private function addPage() + { + $this->pages[] = [ + 'content' => $this->currentPageContent, + 'pageNumber' => count($this->pages) + 1, + 'height' => $this->currentPageHeight + ]; + + $this->currentPageContent = ''; + $this->currentPageHeight = 0; + } + + private function estimateElementHeight($html) + { + // Упрощенная оценка высоты элемента + $lineHeight = 20; // Примерная высота строки в px + $lines = substr_count($html, 'appendChild($doc->importNode($node, true)); + return $doc->saveHTML(); + } + + // Альтернативный метод: разделение по количеству символов + public function splitByCharacterCount($htmlContent, $charsPerPage = 3000) + { + $pages = []; + $currentPage = ''; + $charCount = 0; + + // Разделяем HTML на теги и текст + $tokens = preg_split('/(<[^>]+>)/', $htmlContent, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + + $openTags = []; + + foreach ($tokens as $token) { + // Если это открывающий тег + if (preg_match('/^<([^\/][^>]*)>$/', $token, $matches)) { + $tagName = strtolower(explode(' ', $matches[1])[0]); + $openTags[] = $tagName; + $currentPage .= $token; + } + // Если это закрывающий тег + elseif (preg_match('/^<\/([^>]+)>$/', $token, $matches)) { + array_pop($openTags); + $currentPage .= $token; + } + // Если это текст + else { + $text = $token; + $textLength = mb_strlen($text); + + if ($charCount + $textLength > $charsPerPage && $charCount > 0) { + // Закрываем открытые теги + $currentPage .= $this->closeOpenTags($openTags); + + $pages[] = [ + 'content' => $currentPage, + 'pageNumber' => count($pages) + 1 + ]; + + $currentPage = $this->reopenTags($openTags) . $text; + $charCount = $textLength; + } else { + $currentPage .= $text; + $charCount += $textLength; + } + } + } + + // Добавляем последнюю страницу + if (!empty($currentPage)) { + $pages[] = [ + 'content' => $currentPage, + 'pageNumber' => count($pages) + 1 + ]; + } + + return $pages; + } + + private function closeOpenTags($openTags) + { + $html = ''; + for ($i = count($openTags) - 1; $i >= 0; $i--) { + $html .= ''; + } + return $html; + } + + private function reopenTags($openTags) + { + $html = ''; + foreach ($openTags as $tag) { + $html .= '<' . $tag . '>'; + } + return $html; + } +} diff --git a/artisan b/artisan new file mode 100755 index 0000000..c35e31d --- /dev/null +++ b/artisan @@ -0,0 +1,18 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..a0ecdda --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,23 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware): void { + $middleware->web(append: [ + HandleInertiaRequests::class, + ]); + }) + ->withExceptions(function (Exceptions $exceptions): void { + Integration::handles($exceptions); + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..38b258d --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,5 @@ +=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "inertiajs/inertia-laravel", + "version": "v2.0.6", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "6d0afc3237c370036de4a703927b17a4e7b83298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/6d0afc3237c370036de4a703927b17a4e7b83298", + "reference": "6d0afc3237c370036de4a703927b17a4e7b83298", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^10.0|^11.0|^12.0", + "php": "^8.1.0", + "symfony/console": "^6.2|^7.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.2", + "larastan/larastan": "^3.0", + "laravel/pint": "^1.16", + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^8.0|^9.2|^10.0", + "phpunit/phpunit": "^10.4|^11.5", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./helpers.php" + ], + "psr-4": { + "Inertia\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" + } + ], + "description": "The Laravel adapter for Inertia.js.", + "keywords": [ + "inertia", + "laravel" + ], + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.6" + }, + "time": "2025-08-26T06:17:48+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" + }, + "time": "2025-03-19T14:43:43+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.26.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "085a367a32ba86fcfa647bfc796098ae6f795b09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/085a367a32ba86fcfa647bfc796098ae6f795b09", + "reference": "085a367a32ba86fcfa647bfc796098ae6f795b09", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.7", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^10.6.3", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-08-29T14:15:53+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "86a8b692e8661d0fb308cec64f3d176821323077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/86a8b692e8661d0fb308cec64f3d176821323077", + "reference": "86a8b692e8661d0fb308cec64f3d176821323077", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.6" + }, + "time": "2025-07-07T14:17:42+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "fd6df4f79f48a72992e8d29a9c0ee25422a0d677" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/fd6df4f79f48a72992e8d29a9c0ee25422a0d677", + "reference": "fd6df4f79f48a72992e8d29a9c0ee25422a0d677", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0", + "illuminate/database": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", + "php": "^8.2", + "symfony/console": "^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0|^10.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2025-07-09T19:45:24+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2025-03-19T13:51:03+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.1" + }, + "time": "2025-01-27T14:24:01+00:00" + }, + { + "name": "league/commonmark", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-07-20T12:47:49+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" + }, + "time": "2025-06-25T13:29:59+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" + }, + "time": "2025-05-21T10:34:19+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "7.5.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "81fb5145d2644324614cc532b28efd0215bda430" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", + "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.5", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.5.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:40:02+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:18:47+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.10.2", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24", + "reference": "76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.75.0", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.17", + "phpunit/phpunit": "^10.5.46", + "squizlabs/php_codesniffer": "^3.13.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-08-02T09:36:06+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.5", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.8" + }, + "time": "2025-08-06T21:43:34+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + }, + "time": "2025-08-13T20:13:15+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.2.6" + }, + "require-dev": { + "illuminate/console": "^11.44.7", + "laravel/pint": "^1.22.0", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.2", + "phpstan/phpstan": "^1.12.25", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.2.6", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-05-08T08:14:37+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, + { + "name": "phpoffice/math", + "version": "0.3.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/Math.git", + "reference": "fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/Math/zipball/fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a", + "reference": "fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xml": "*", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.88 || ^1.0.0", + "phpunit/phpunit": "^7.0 || ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\Math\\": "src/Math/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Progi1984", + "homepage": "https://lefevre.dev" + } + ], + "description": "Math - Manipulate Math Formula", + "homepage": "https://phpoffice.github.io/Math/", + "keywords": [ + "MathML", + "officemathml", + "php" + ], + "support": { + "issues": "https://github.com/PHPOffice/Math/issues", + "source": "https://github.com/PHPOffice/Math/tree/0.3.0" + }, + "time": "2025-05-29T08:31:49+00:00" + }, + { + "name": "phpoffice/phpword", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PHPWord.git", + "reference": "6d75328229bc93790b37e93741adf70646cea958" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/6d75328229bc93790b37e93741adf70646cea958", + "reference": "6d75328229bc93790b37e93741adf70646cea958", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-gd": "*", + "ext-json": "*", + "ext-xml": "*", + "ext-zip": "*", + "php": "^7.1|^8.0", + "phpoffice/math": "^0.3" + }, + "require-dev": { + "dompdf/dompdf": "^2.0 || ^3.0", + "ext-libxml": "*", + "friendsofphp/php-cs-fixer": "^3.3", + "mpdf/mpdf": "^7.0 || ^8.0", + "phpmd/phpmd": "^2.13", + "phpstan/phpstan": "^0.12.88 || ^1.0.0", + "phpstan/phpstan-phpunit": "^1.0 || ^2.0", + "phpunit/phpunit": ">=7.0", + "symfony/process": "^4.4 || ^5.0", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Allows writing PDF", + "ext-xmlwriter": "Allows writing OOXML and ODF", + "ext-xsl": "Allows applying XSL style sheet to headers, to main document part, and to footers of an OOXML template" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpWord\\": "src/PhpWord" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-only" + ], + "authors": [ + { + "name": "Mark Baker" + }, + { + "name": "Gabriel Bull", + "email": "me@gabrielbull.com", + "homepage": "http://gabrielbull.com/" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net/blog/" + }, + { + "name": "Ivan Lanin", + "homepage": "http://ivan.lanin.org" + }, + { + "name": "Roman Syroeshko", + "homepage": "http://ru.linkedin.com/pub/roman-syroeshko/34/a53/994/" + }, + { + "name": "Antoine de Troostembergh" + } + ], + "description": "PHPWord - A pure PHP library for reading and writing word processing documents (OOXML, ODF, RTF, HTML, PDF)", + "homepage": "https://phpoffice.github.io/PHPWord/", + "keywords": [ + "ISO IEC 29500", + "OOXML", + "Office Open XML", + "OpenDocument", + "OpenXML", + "PhpOffice", + "PhpWord", + "Rich Text Format", + "WordprocessingML", + "doc", + "docx", + "html", + "odf", + "odt", + "office", + "pdf", + "php", + "reader", + "rtf", + "template", + "template processor", + "word", + "writer" + ], + "support": { + "issues": "https://github.com/PHPOffice/PHPWord/issues", + "source": "https://github.com/PHPOffice/PHPWord/tree/1.4.0" + }, + "time": "2025-06-05T10:32:36+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-08-21T11:53:16+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.10", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" + }, + "time": "2025-08-04T12:39:37+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.0" + }, + "time": "2025-06-25T14:20:11+00:00" + }, + { + "name": "sentry/sentry", + "version": "4.16.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "c5b086e4235762da175034bc463b0d31cbb38d2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/c5b086e4235762da175034bc463b0d31cbb38d2e", + "reference": "c5b086e4235762da175034bc463b0d31cbb38d2e", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", + "jean85/pretty-package-versions": "^1.5|^2.0.4", + "php": "^7.2|^8.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/options-resolver": "^4.4.30|^5.0.11|^6.0|^7.0" + }, + "conflict": { + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.4", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", + "monolog/monolog": "^1.6|^2.0|^3.0", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^8.5|^9.6", + "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", + "vimeo/psalm": "^4.17" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "profiling", + "sentry", + "tracing" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/4.16.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2025-09-22T13:38:03+00:00" + }, + { + "name": "sentry/sentry-laravel", + "version": "4.17.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-laravel.git", + "reference": "f321c450f1ff31fc97cf42c249de4a47d593d216" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/f321c450f1ff31fc97cf42c249de4a47d593d216", + "reference": "f321c450f1ff31fc97cf42c249de4a47d593d216", + "shasum": "" + }, + "require": { + "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", + "nyholm/psr7": "^1.0", + "php": "^7.2 | ^8.0", + "sentry/sentry": "^4.15.2", + "symfony/psr-http-message-bridge": "^1.0 | ^2.0 | ^6.0 | ^7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.11", + "guzzlehttp/guzzle": "^7.2", + "laravel/folio": "^1.1", + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", + "livewire/livewire": "^2.0 | ^3.0", + "mockery/mockery": "^1.3", + "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.4 | ^9.3 | ^10.4 | ^11.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Sentry": "Sentry\\Laravel\\Facade" + }, + "providers": [ + "Sentry\\Laravel\\ServiceProvider", + "Sentry\\Laravel\\Tracing\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-0": { + "Sentry\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "Laravel SDK for Sentry (https://sentry.io)", + "homepage": "https://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "laravel", + "log", + "logging", + "profiling", + "sentry", + "tracing" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-laravel/issues", + "source": "https://github.com/getsentry/sentry-laravel/tree/4.17.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2025-10-15T09:58:47+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.3.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/console", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-25T06:35:40+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.3.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-07T08:17:57+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-13T11:49:31+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00", + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-20T08:04:18+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-29T08:23:45+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-13T11:49:31+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-05T10:16:07+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-18T09:42:54+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", + "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^6.4|^7.0" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.3.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": "2024-09-26T08:57:56+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:36:08+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.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": "2025-04-25T09:37:31+00:00" + }, + { + "name": "symfony/string", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-25T06:35:40+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d", + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-01T21:02:37+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.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": "2024-09-27T08:32:26+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.3.1" + }, + "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": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-13T11:49:31+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2025-06-05T13:55:57+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "0345f3b05f136801af8c339f9d16ef29e6b4df8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/0345f3b05f136801af8c339f9d16ef29e6b4df8a", + "reference": "0345f3b05f136801af8c339f9d16ef29e6b4df8a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.82.2", + "illuminate/view": "^11.45.1", + "larastan/larastan": "^3.5.0", + "laravel-zero/framework": "^11.45.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3.1", + "pestphp/pest": "^2.36.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "files": [ + "overrides/Runner/Parallel/ProcessFactory.php" + ], + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2025-07-10T18:09:32+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.45.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "019a2933ff4a9199f098d4259713f9bc266a874e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/019a2933ff4a9199f098d4259713f9bc266a874e", + "reference": "019a2933ff4a9199f098d4259713f9bc266a874e", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2025-08-25T19:28:31+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.8.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", + "php": "^8.2.0", + "symfony/console": "^7.3.0" + }, + "conflict": { + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", + "laravel/tinker": "^2.10.1", + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-06-25T02:12:12+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.2" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-08-27T14:37:49+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.35", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d341ee94ee5007b286fc7907b383aae6b5b3cc91", + "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.11", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.2", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.35" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-08-28T05:13:54+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-08-10T08:07:46+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-05T09:17:50+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:42:22+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:55:48+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-27T11:34:33+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..423eed5 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..7d1eb0d --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..c2d927d --- /dev/null +++ b/config/cache.php @@ -0,0 +1,108 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..5b318f5 --- /dev/null +++ b/config/database.php @@ -0,0 +1,174 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..3d671bd --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/libreoffice.php b/config/libreoffice.php new file mode 100644 index 0000000..b184837 --- /dev/null +++ b/config/libreoffice.php @@ -0,0 +1,11 @@ + env('LIBREOFFICE_HOME', '/tmp'), + 'user' => env('LIBREOFFICE_USER', 'www-data') +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..9e998a4 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..522b284 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..116bd8d --- /dev/null +++ b/config/queue.php @@ -0,0 +1,112 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..44527d6 --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,84 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort(), + // Sanctum::currentRequestHost(), + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/config/sentry.php b/config/sentry.php new file mode 100644 index 0000000..eff8542 --- /dev/null +++ b/config/sentry.php @@ -0,0 +1,135 @@ + env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')), + + // @see https://spotlightjs.com/ + // 'spotlight' => env('SENTRY_SPOTLIGHT', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#logger + // 'logger' => Sentry\Logger\DebugFileLogger::class, // By default this will log to `storage_path('logs/sentry.log')` + + // The release version of your application + // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) + 'release' => env('SENTRY_RELEASE'), + + // When left empty or `null` the Laravel environment will be used (usually discovered from `APP_ENV` in your `.env`) + 'environment' => env('SENTRY_ENVIRONMENT'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#sample_rate + 'sample_rate' => env('SENTRY_SAMPLE_RATE') === null ? 1.0 : (float) env('SENTRY_SAMPLE_RATE'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces_sample_rate + 'traces_sample_rate' => env('SENTRY_TRACES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_TRACES_SAMPLE_RATE'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#profiles-sample-rate + 'profiles_sample_rate' => env('SENTRY_PROFILES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_PROFILES_SAMPLE_RATE'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#enable_logs + 'enable_logs' => env('SENTRY_ENABLE_LOGS', false), + + // The minimum log level that will be sent to Sentry as logs using the `sentry_logs` logging channel + 'logs_channel_level' => env('SENTRY_LOGS_LEVEL', env('LOG_LEVEL', 'debug')), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send_default_pii + 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore_exceptions + // 'ignore_exceptions' => [], + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore_transactions + 'ignore_transactions' => [ + // Ignore Laravel's default health URL + '/up', + ], + + // Breadcrumb specific configuration + 'breadcrumbs' => [ + // Capture Laravel logs as breadcrumbs + 'logs' => env('SENTRY_BREADCRUMBS_LOGS_ENABLED', true), + + // Capture Laravel cache events (hits, writes etc.) as breadcrumbs + 'cache' => env('SENTRY_BREADCRUMBS_CACHE_ENABLED', true), + + // Capture Livewire components like routes as breadcrumbs + 'livewire' => env('SENTRY_BREADCRUMBS_LIVEWIRE_ENABLED', true), + + // Capture SQL queries as breadcrumbs + 'sql_queries' => env('SENTRY_BREADCRUMBS_SQL_QUERIES_ENABLED', true), + + // Capture SQL query bindings (parameters) in SQL query breadcrumbs + 'sql_bindings' => env('SENTRY_BREADCRUMBS_SQL_BINDINGS_ENABLED', false), + + // Capture queue job information as breadcrumbs + 'queue_info' => env('SENTRY_BREADCRUMBS_QUEUE_INFO_ENABLED', true), + + // Capture command information as breadcrumbs + 'command_info' => env('SENTRY_BREADCRUMBS_COMMAND_JOBS_ENABLED', true), + + // Capture HTTP client request information as breadcrumbs + 'http_client_requests' => env('SENTRY_BREADCRUMBS_HTTP_CLIENT_REQUESTS_ENABLED', true), + + // Capture send notifications as breadcrumbs + 'notifications' => env('SENTRY_BREADCRUMBS_NOTIFICATIONS_ENABLED', true), + ], + + // Performance monitoring specific configuration + 'tracing' => [ + // Trace queue jobs as their own transactions (this enables tracing for queue jobs) + 'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', true), + + // Capture queue jobs as spans when executed on the sync driver + 'queue_jobs' => env('SENTRY_TRACE_QUEUE_JOBS_ENABLED', true), + + // Capture SQL queries as spans + 'sql_queries' => env('SENTRY_TRACE_SQL_QUERIES_ENABLED', true), + + // Capture SQL query bindings (parameters) in SQL query spans + 'sql_bindings' => env('SENTRY_TRACE_SQL_BINDINGS_ENABLED', false), + + // Capture where the SQL query originated from on the SQL query spans + 'sql_origin' => env('SENTRY_TRACE_SQL_ORIGIN_ENABLED', true), + + // Define a threshold in milliseconds for SQL queries to resolve their origin + 'sql_origin_threshold_ms' => env('SENTRY_TRACE_SQL_ORIGIN_THRESHOLD_MS', 100), + + // Capture views rendered as spans + 'views' => env('SENTRY_TRACE_VIEWS_ENABLED', true), + + // Capture Livewire components as spans + 'livewire' => env('SENTRY_TRACE_LIVEWIRE_ENABLED', true), + + // Capture HTTP client requests as spans + 'http_client_requests' => env('SENTRY_TRACE_HTTP_CLIENT_REQUESTS_ENABLED', true), + + // Capture Laravel cache events (hits, writes etc.) as spans + 'cache' => env('SENTRY_TRACE_CACHE_ENABLED', true), + + // Capture Redis operations as spans (this enables Redis events in Laravel) + 'redis_commands' => env('SENTRY_TRACE_REDIS_COMMANDS', false), + + // Capture where the Redis command originated from on the Redis command spans + 'redis_origin' => env('SENTRY_TRACE_REDIS_ORIGIN_ENABLED', true), + + // Capture send notifications as spans + 'notifications' => env('SENTRY_TRACE_NOTIFICATIONS_ENABLED', true), + + // Enable tracing for requests without a matching route (404's) + 'missing_routes' => env('SENTRY_TRACE_MISSING_ROUTES_ENABLED', false), + + // Configures if the performance trace should continue after the response has been sent to the user until the application terminates + // This is required to capture any spans that are created after the response has been sent like queue jobs dispatched using `dispatch(...)->afterResponse()` for example + 'continue_after_response' => env('SENTRY_TRACE_CONTINUE_AFTER_RESPONSE', true), + + // Enable the tracing integrations supplied by Sentry (recommended) + 'default_integrations' => env('SENTRY_TRACE_DEFAULT_INTEGRATIONS_ENABLED', true), + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6182e4b --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'resend' => [ + 'key' => env('RESEND_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..f715097 --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..584104c --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..05fb5d9 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..b9c106b --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration'); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2025_09_04_064700_create_document_templates_table.php b/database/migrations/2025_09_04_064700_create_document_templates_table.php new file mode 100644 index 0000000..d80be25 --- /dev/null +++ b/database/migrations/2025_09_04_064700_create_document_templates_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->string('description')->nullable(); + $table->longText('content'); + $table->json('variables'); + $table->string('source_path')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('document_templates'); + } +}; diff --git a/database/migrations/2025_09_04_064804_create_document_template_variables_table.php b/database/migrations/2025_09_04_064804_create_document_template_variables_table.php new file mode 100644 index 0000000..766398f --- /dev/null +++ b/database/migrations/2025_09_04_064804_create_document_template_variables_table.php @@ -0,0 +1,29 @@ +id(); + $table->foreignIdFor(DocumentTemplate::class, 'document_template_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('document_template_variables'); + } +}; diff --git a/database/migrations/2025_10_14_062315_create_personal_access_tokens_table.php b/database/migrations/2025_10_14_062315_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/database/migrations/2025_10_14_062315_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..d01a0ef --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,23 @@ +create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/database/seeders/DocumentTemplateSeeder.php b/database/seeders/DocumentTemplateSeeder.php new file mode 100644 index 0000000..1762908 --- /dev/null +++ b/database/seeders/DocumentTemplateSeeder.php @@ -0,0 +1,208 @@ + 'Договор подряда (упрощенный)', + 'content' => [ + 'metadata' => [ + 'title' => 'Договор подряда', + 'version' => '1.0' + ], + 'structure' => [ + [ + 'id' => 'header', + 'type' => 'section', + 'enabled' => true, + 'elements' => [ + [ + 'id' => 'header_title', + 'type' => 'heading', + 'content' => 'ДОГОВОР ПОДРЯДА № [номер]' + ], + [ + 'id' => 'header_date', + 'type' => 'html', + 'content' => ' + + + + +
г. [город]«[день]» [месяц] [год] г.
', + 'variables' => [ + [ + 'name' => 'city', + 'type' => 'select', + 'label' => 'Город', + 'options' => [ + 'Москва' => 'г. Москва', + 'Санкт-Петербург' => 'г. Санкт-Петербург', + 'Новосибирск' => 'г. Новосибирск', + 'Екатеринбург' => 'г. Екатеринбург' + ], + 'default' => 'Москва' + ], + 'day', 'month', 'year' // простые текстовые поля + ] + ] + ] + ], + [ + 'id' => 'preamble', + 'type' => 'section', + 'enabled' => true, + 'elements' => [ + [ + 'id' => 'preamble_title', + 'type' => 'heading', + 'content' => '1. ПРЕАМБУЛА' + ], + [ + 'id' => 'preamble_text', + 'type' => 'html', + 'content' => '

[Тип заказчика] [Ф.И.О. или наименование Заказчика], именуемый в дальнейшем «Заказчик», с одной стороны, и [Тип подрядчика] [Ф.И.О. или наименование Подрядчика], именуемый в дальнейшем «Подрядчик», с другой стороны, заключили настоящий договор о нижеследующем:

', + 'variables' => [ + [ + 'name' => 'client_type', + 'type' => 'select', + 'label' => 'Тип заказчика', + 'options' => [ + 'Индивидуальный предприниматель' => 'Индивидуальный предприниматель', + 'Общество с ограниченной ответственностью' => 'Общество с ограниченной ответственностью', + 'Физическое лицо' => 'Физическое лицо' + ], + 'default' => 'Индивидуальный предприниматель' + ], + 'client_name', + [ + 'name' => 'contractor_type', + 'type' => 'select', + 'label' => 'Тип подрядчика', + 'options' => [ + 'Индивидуальный предприниматель' => 'Индивидуальный предприниматель', + 'Общество с ограниченной ответственностью' => 'Общество с ограниченной ответственностью', + 'Физическое лицо' => 'Физическое лицо' + ], + 'default' => 'Индивидуальный предприниматель' + ], + 'contractor_name' + ] + ] + ] + ], + [ + 'id' => 'subject', + 'type' => 'section', + 'enabled' => true, + 'elements' => [ + [ + 'id' => 'subject_title', + 'type' => 'heading', + 'content' => '2. ПРЕДМЕТ ДОГОВОРА' + ], + [ + 'id' => 'subject_text', + 'type' => 'html', + 'content' => '

2.1. Подрядчик обязуется выполнить следующие работы: [вид работ], а Заказчик обязуется принять результат работ и оплатить его.

', + 'variables' => [ + [ + 'name' => 'work_type', + 'type' => 'select', + 'label' => 'Вид работ', + 'options' => [ + 'ремонтные' => 'ремонтные работы', + 'строительные' => 'строительные работы', + 'отделочные' => 'отделочные работы', + 'монтажные' => 'монтажные работы', + 'проектные' => 'проектные работы' + ], + 'default' => 'ремонтные' + ] + ] + ], + [ + 'id' => 'subject_details', + 'type' => 'html', + 'content' => '

2.2. Подробное описание работ: [описание работ].

', + 'variables' => ['work_description'] + ] + ] + ], + [ + 'id' => 'payment', + 'type' => 'section', + 'enabled' => true, + 'elements' => [ + [ + 'id' => 'payment_title', + 'type' => 'heading', + 'content' => '3. СТОИМОСТЬ РАБОТ И ПОРЯДОК РАСЧЕТОВ' + ], + [ + 'id' => 'payment_text', + 'type' => 'html', + 'content' => '

3.1. Стоимость работ составляет: [сумма] рублей.

', + 'variables' => ['work_price'] + ], + [ + 'id' => 'payment_method', + 'type' => 'html', + 'content' => '

3.2. Форма оплаты: [форма оплаты].

', + 'variables' => [ + [ + 'name' => 'payment_method', + 'type' => 'radio', + 'label' => 'Форма оплаты', + 'options' => [ + 'cash' => 'Наличный расчет', + 'non-cash' => 'Безналичный расчет', + 'advance' => 'Авансовый платеж' + ], + 'default' => 'non-cash' + ] + ] + ] + ] + ], + [ + 'id' => 'signatures', + 'type' => 'section', + 'enabled' => true, + 'elements' => [ + [ + 'id' => 'signatures_table', + 'type' => 'html', + 'content' => ' + + + + +
+ ЗАКАЗЧИК:
+ [Наименование/Ф.И.О.]
+ Подпись: ________________ / [Ф.И.О.] / +
+ ПОДРЯДЧИК:
+ [Наименование/Ф.И.О.]
+ Подпись: ________________ / [Ф.И.О.] / +
', + 'variables' => ['client_name', 'client_signature', 'contractor_name', 'contractor_signature'] + ] + ] + ] + ] + ] + ]); + } +} diff --git a/nginx.dev.conf b/nginx.dev.conf new file mode 100644 index 0000000..bc3efa9 --- /dev/null +++ b/nginx.dev.conf @@ -0,0 +1,53 @@ +server { + # Enable Gzip + gzip on; + gzip_http_version 1.0; + gzip_comp_level 2; + gzip_min_length 1100; + gzip_buffers 4 8k; + gzip_proxied any; + gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml; + gzip_static on; + gzip_proxied expired no-cache no-store private auth; + gzip_disable "MSIE [1-6]\."; + gzip_vary on; + + listen 30; + listen [::]:30; + server_name documenter.dev.ru; + ssl_certificate /home/user/ssl/certificate.crt; + ssl_certificate_key /home/user/ssl/certificate.key; + root /documenter-mono/public; + + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + + access_log /home/user/logs/documenter-mono/nginx.access.log; + error_log /home/user/logs/documenter-mono/nginx.error.log; + + index index.php; + + charset utf-8; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + # error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_buffers 16 16k; + fastcgi_buffer_size 32k; + fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_hide_header X-Powered-By; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..94bb920 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4312 @@ +{ + "name": "backend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@heroicons/vue": "^2.2.0", + "@inertiajs/vue3": "^2.1.3", + "@vueuse/core": "^13.9.0", + "date-fns": "^4.1.0", + "vue": "^3.5.20", + "vue-pdf-embed": "^2.1.3" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.12", + "@vitejs/plugin-vue": "^6.0.1", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwind-scrollbar": "^4.0.2", + "tailwindcss": "^4.1.12", + "vite": "^7.0.4", + "vite-plugin-vue-devtools": "^8.0.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@heroicons/vue": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz", + "integrity": "sha512-G3dbSxoeEKqbi/DFalhRxJU4mTXJn7GwZ7ae8NuEQzd1bqdd0jAbdaBZlHPcvPD2xI1iGzNVB4k20Un2AguYPw==", + "license": "MIT", + "peerDependencies": { + "vue": ">= 3" + } + }, + "node_modules/@inertiajs/core": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.1.3.tgz", + "integrity": "sha512-X8E5sPF0MF69+2kxOHuBqW06Rr/VD51Je37JY8bi5SCoi9wTpzmaurpDDIftnbfCJGYupFL1jky7DjEpD+6ufg==", + "license": "MIT", + "dependencies": { + "@types/lodash-es": "^4.17.12", + "axios": "^1.11.0", + "lodash-es": "^4.17.21", + "qs": "^6.9.0" + } + }, + "node_modules/@inertiajs/vue3": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-2.1.3.tgz", + "integrity": "sha512-n2SoIb6L9pHPw8vMZ+wM8KxFv1GzO04cUG5OxUE3VqpFlqHK+SX/nZIG0xXR7TkwwtlK9IxxeuaIDY6gFOvCqQ==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "2.1.3", + "@types/lodash-es": "^4.17.12", + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/canvas": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", + "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==", + "license": "MIT", + "optional": true, + "workspaces": [ + "e2e/*" + ], + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "0.1.80", + "@napi-rs/canvas-darwin-arm64": "0.1.80", + "@napi-rs/canvas-darwin-x64": "0.1.80", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.80", + "@napi-rs/canvas-linux-arm64-musl": "0.1.80", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80", + "@napi-rs/canvas-linux-x64-gnu": "0.1.80", + "@napi-rs/canvas-linux-x64-musl": "0.1.80", + "@napi-rs/canvas-win32-x64-msvc": "0.1.80" + } + }, + "node_modules/@napi-rs/canvas-android-arm64": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz", + "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-darwin-arm64": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz", + "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-darwin-x64": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz", + "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz", + "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-gnu": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz", + "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-musl": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz", + "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz", + "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-gnu": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", + "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-musl": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", + "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-win32-x64-msvc": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz", + "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.12.tgz", + "integrity": "sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "tailwindcss": "4.1.12" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.20.tgz", + "integrity": "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.20", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", + "integrity": "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", + "integrity": "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/compiler-core": "3.5.20", + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", + "integrity": "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.0.3.tgz", + "integrity": "sha512-gCEQN7aMmeaigEWJQ2Z2o3g7/CMqGTPvNS1U3n/kzpLoAZ1hkAHNgi4ml/POn/9uqGILBk65GGOUdrraHXRj5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.0.3", + "@vue/devtools-shared": "^8.0.3", + "mitt": "^3.0.1", + "nanoid": "^5.1.5", + "pathe": "^2.0.3", + "vite-hot-client": "^2.1.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.3.tgz", + "integrity": "sha512-UF4YUOVGdfzXLCv5pMg2DxocB8dvXz278fpgEE+nJ/DRALQGAva7sj9ton0VWZ9hmXw+SV8yKMrxP2MpMhq9Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.3", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.3.tgz", + "integrity": "sha512-s/QNll7TlpbADFZrPVsaUNPCOF8NvQgtgmmB7Tip6pLf/HcOvBTly0lfLQ0Eylu9FQ4OqBhFpLyBgwykiSf8zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.20.tgz", + "integrity": "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.20.tgz", + "integrity": "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", + "integrity": "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/runtime-core": "3.5.20", + "@vue/shared": "3.5.20", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.20.tgz", + "integrity": "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "vue": "3.5.20" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.20.tgz", + "integrity": "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz", + "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", + "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz", + "integrity": "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/laravel-vite-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.0.1.tgz", + "integrity": "sha512-zQuvzWfUKQu9oNVi1o0RZAJCwhGsdhx4NEOyrVQwJHaWDseGP9tl7XUPLY2T8Cj6+IrZ6lmyxlR1KC8unf3RLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", + "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pdfjs-dist": { + "version": "4.10.38", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz", + "integrity": "sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^0.1.65" + } + }, + "node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwind-scrollbar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-4.0.2.tgz", + "integrity": "sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prism-react-renderer": "^2.4.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "4.x" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", + "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.0.3.tgz", + "integrity": "sha512-yIi3u31xUi28HcLlTpV0BvSLQHgZ2dA8Zqa59kWfIeMdHqbsunt6TCjq4wCNfOcGSju+E7qyHyI09EjRRFMbuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^8.0.3", + "@vue/devtools-kit": "^8.0.3", + "@vue/devtools-shared": "^8.0.3", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^5.3.2" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.2.tgz", + "integrity": "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vue": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", + "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-sfc": "3.5.20", + "@vue/runtime-dom": "3.5.20", + "@vue/server-renderer": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-pdf-embed": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vue-pdf-embed/-/vue-pdf-embed-2.1.3.tgz", + "integrity": "sha512-EGgZNb8HRrAloBpb8p8CugDpJpoPbQ8CFfAYdWZgq2e5qBMP9JSeLzVQIAJkXsclHXRIS3O9fp3WQbP9T5Inwg==", + "license": "MIT", + "dependencies": { + "pdfjs-dist": "^4.10.38" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..21f55f4 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.12", + "@vitejs/plugin-vue": "^6.0.1", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwind-scrollbar": "^4.0.2", + "tailwindcss": "^4.1.12", + "vite": "^7.0.4", + "vite-plugin-vue-devtools": "^8.0.3" + }, + "dependencies": { + "@heroicons/vue": "^2.2.0", + "@inertiajs/vue3": "^2.1.3", + "@vueuse/core": "^13.9.0", + "date-fns": "^4.1.0", + "vue": "^3.5.20", + "vue-pdf-embed": "^2.1.3" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..5fd5bcf --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,34 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/assets/fonts/Golos-Text_Black.woff2 b/public/assets/fonts/Golos-Text_Black.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d04d9684ec85f45f6c5470d4a5abf4791aa3110 GIT binary patch literal 40716 zcmaHxGq5lWkZiAQ`@6Pn+qP}nwr$(CZQHi(`~IyLZL*zA)dUmtNxHhmO-_^%01)6m z<-q_T|2KfF5dZ*k^Zx(tfA;@dSc=#IsjN6rf?)ap;l2>+kU^4&Fi=6I5P=`E&|%~N zfUH2oz_HTE!R5pt_?Tr^DU74d-Jrx}+SkB+9J$7J&{u#Ov_U<0{E4{qNn{?9?apY zB1^kYIhPn%OK6)+;mlU1aN?StnxMTAr5R65r`s`UUMesq_$?4VfL@a0=$h1$F>?cT zLMr8TI_uQ}q=3^GIublN^Mh5*QPWGhQOcpF-$9xXw@q)FtmloR_#IScKV&&-9-TV{ zQFY<+g(J^cM2!-b4}iQ;(cmhg23aVsNJ_PFIV&$qX>m!OmPlMII4Szdzmc#FpO}Lq zXyxu%Lm0|0bsTsmsz*%Mt;d#XDGzmF;zR0Tr~0y-jAd;8sY+ zx*nyLWSCMLpZFbOvra2%Irc`?jNdE*lSu;giYydYl`SdR!p=AQLsMSCn1O32{d9hR z(Uh7`(xExy`I7x)eqBDYXmWgp$|>GuKI|HTm7llvaZ4pDZ6mU=ca;ab?s-1C!iu>M zStOp|8me`R{NHkrC7|yKrBp5nIy?G0@ze?2-2!$JeTe_mrBO?5X*vhePV(vvmdH`P zwSFPRwFCRPa-uV)GQ6HKEa0;{Zzj7>OBwl!aTU8M47N-H z)82JH-aILNAeSFdE4{Mr6V^V#coX#!`ub%<&dg$oKHR2?b=|y^)kDMfn}?R=)~pWS z8@}a^{XFw3u8ltOa2ZfL!S5!lxUBo<9Moj8ZjapIeh{&$2d5gXt8OGhaNRDh*-xXc2nxwmYp*c%ia@M@NC-seT} z^{ePg?m1rhb?(vcBjv|bunYe$XLRME((2x6X{`O4kJzmu?(eztz+&%)?!)h?tnn`) zyTI%*Pl|TF?{*Pm-Y!!G9i)BWxRmWdtWuIL9d-BEJRQR60tY9@(~P7rl2xD z%-`KQwi3zax|O|_CHMVtZpn9k*5_#rM|_uAfGpEk0XAYWRZ;?tkwkH1?60l#*K4ue zKF`?g1JGThT}}YOYjbwOVetcCf5Wm>Hc}WcTEDZeIg28C#2-!fi61#EV-Mi2)wek} zA3m7O2ok;(8a=&>?U*wnPZ-vQg1U#{Tk?>Pd+Sq>%&_=Tf8hZmG?OU`}(BvsOTp8*_X$OF9~+O)Bx5vp+lVGf^qx=EbHB`a+Nl-QOdXIX+% zX$;m+)2XNfDYdo#+lmU-(gj@H13y6j=6CvU&y-`Uv!1)JzqHv!+u{e<&tQ;Vs8suk zRYYVg*B-HP0wWD>uWxG4+NaA1>A`{~fYw?C=NPJ}0SO06RmVX&qottP=cQx zd^RryUyFiua~Ok3Eki&0AeDLdY7)krWsKCT*rLr`*Y&P*Nq2>g4lzCtSi~QlQfPgZ zV2pM3MWsYZ-^z(3%g8sg3%^+K%q%IH76E!MbZ*}367whAJUXq5*xgn z-}~l>E@ljG;K|zV6>PzuCam1wR*mB|ug?v(ISV%^$;{x@%*h&-zFy1$7KxB?QO)cD zu@hiF4m^&Rx;hd#vNB-fh|)sfwY~8AriUo$SPFi9*lHrafd&yuo-skOs`oau+;C-U zjBnt&nIu~i&|~WN74$w1HK$1!UQ?epD06fol*DBWIo{@d6mG=Z>3tfG|0Auzc(HWS z4^Bc=Ui$r2$ps)v<2Jd#ZxoYVeJ?|5Qk&dA*^TIXS{v^2&oApYZ&5S?-xD~1xmcKz zST@Cu_vPYQZuIQhMNRKnuQuayC{xB%wjG?6R_!<*9dyteD*YSn7bOe&gP;DxS{huc zh4Ck$_PY*CUa?AxpU8qa6L04Fmiw*tB6lXw9iE(13>?RJZUJxu9AyK1ST>IAvtPg! z-B@;jgF{V+uH9dmg#>d)jF@{a^)o;>;K+3KQ29+h!dk_6h3QbNY84a=?V7ROCqZ3( zfg+ski{C^ds-y%08X1ugQK9X`kz+tAyXHw47|m7_)_U+<7q8U1f>#s_Y6FE8^04#o zEzm~v0a&GcRT#0Bq`*Tmx*{e%1WU=__=a9Pzil#7a57#1I*ycyON!6c5YoZu<$;4L zydDP*46gPZY5)Ufh&_5(zFI^S&)0S(WU;Qk(Sx8+U;M7EazR{S%ah5pX(>dnmN>Gf zhmytsI2NtI(s&#Yd=uzpt-6N4Hpx{L&9;A5r~G>b*7nd4G~C1+XYv5|G(q?BY60&p z0TJh6;a^*Ow_%C4t|6)UA*p*InfD=?KOuQ&=lS@#9}cJ@@d}O(Ij9l~he^_s60?YM z@Q8Xs%7{ir4yb1FOP1!=W?)oQXS+~_tojbX2YUDYci&~3T}y|13<0!b7=((ih!_m6 zip|Ajk&E|fZ&;XlFr-HDHNoU!7pt8I9zj_wZScCF6#7-_q7W^G-^yQUh2M_f?>}r~ zyX6z)2M>#9KtrAt;+v@IeDi@xduE8FEbwFAzbo*0=5UfO4i%~#y*o!{a#;bV zQ4v~*I>-G!TW{w+Fbbex82oYn<7)Amg?OV1miHYRSO7^a0FFwe7R3~2SJN1mPM*7< z>%ien{B82?DOw0R?%xU8GhFkpT5rO9z#b0z>- zW|)_I=$w%1Npi&lgwdU@c5jg@f4|=|RWmzE8?zf*eh3X}<4pBagbF?pLr}a+yJ4A@ zxJ=Y2k^;-pxC3xG^9(KpE}nyv#{5RjG~3w>|?C5VNk>{Gfc z4(1=OMzB9LJH#o1U`5FbR083TlW3bVXv3xQyoMfGJZMNMgorzDFTQL3zFkJ9wkb48 zdQu3YVF8?I(RAm4ztUd#ziOV54v`|uNC60fV1!W&BWZe4kfblKyzQy%Kl!h<)Yq;n z7$p3(20Eb%EaVI?f~m?#dCEpUQ$6@LSGPM`TR#`9BV{cV`T!7tiR@fXu&`_(&f2N_ z_t#=;bd_UovA*6U=362`g(cy_K*e(MNRFbN9oevo^=pOeXG(39SRsUX({jP)0QlKz zgu@l&iSfZVeka2~ID{F1-7R^LAuCLVLug(_Oan-xdYjoUat;P2Ru1%FEU2#K4bg0F zC)A){Kd~xrvBhWXz-JGDXbg+xHx@zgij1d(7LE)hL&+)upUNT58VMN-O?ZT+;2r4) zyBEsJN36S$pUX|xSLHdGtZ@xC+odYt4S&3ORUfS`RAd$^(gb9yOyn)H=) zS!sAvw5cJ>`ipf!YZ_P7R&XwVo`9Z6pXeX8Fska17y0Q3+|T@reY>tGo4zptc2wGb zYe7y&zoStPp5D;C;C#>p`S{}Sr~+5{fagl*^v*z>&^y7opGV)QznXuZe|Ud$KX#vU zNN7lekQc!?f`A2S^%?a1>rxmb*`)1|a}nx>+zcu0ne6=AQrzO%_?;2(;dK(a#NomO z4&n#Ipb~PG_%%c?Nv?^!WI3ch5}gvC5zlOx_{ifpju0B6stHOHpvO>-G#(TlpdDG= zIozVX(zzsmG6sr*yztK>89Vf z_z)0~;V|Kl>ZtT6_AP$!Bj2CP2FRs5FU#;~G_GvB-HE3urjv{trze?eL`xIWAKOKW zO=>7Bgg-OOPHSsu^OU{NHgB)9y`Y*-QA{ygQh~+Nj6FF0Yfa>3YvDh&AtmNZlTx^m ztaWLouTf}(QTihVD?aE)rnMBXCArSgZY)d@D%5fo=S)6oJB8(-qZ!2M6U?uz_Nbnh z%V1~C+O%M}Vst5`hDw^FbiM#?*^E$7^Z(F1Q!HDdI*>j^zOd6%n-0g>lk*j~NsFY7 zMPgUbH4-Fy?j@KO@`q`F=)RP*qp2rU{R#e$NKsd};g zLq2Re5Y2)SSy(VW{NnIYtdms+6qCZpQ-Sn1e+k@;aD@yuie(+X?TLWw+X(Vpj;5IU zy*XLE4@S&NQ(Dut3e8?FMhb9@Sn;ok3`9@W5z($+Jy4RSHrHJJc+Y*g`_iuwEejF0 zLSjNbY0J`d$|9p=2pFO47E{v49$-Ix91jzK1S0?sklB=2w;eUP;;gHce7_BV8!#Uz zvP!maJ@CVOI;7=DGW8EAhk5mufFTPu6`-TGUAMn)^mQIjd&3r-ZCX=X2Y!oT4 zwlIUcH_9Z?{cWm)9)DQbaiuKVNj!lWocaL8G=!YWDAZj{F-cgbyAWScybB4@42JDc zR7Gc4EE7sbiiL%if^-=4+)M>n4N@f>=OQCbApeN9+$0)D?UW4^>CJfpX<57;1)|Hj z<@sz$f#{FGa|M8_^{#wqH?E!87no0K;!;|aUoqsTF8VhO?Qe?e{Tv(owU2?_ zohvWR;xf>KSMk(5%W5HH1B@!Sv{Ngm#>SYzVPpxlVNrYZLT#5!{ltN}2B*@p@lr@E zkq^p*(rm58`pVpuSjgF~? zb1#^3HF`{YE#dnm=8OAJx%!Ce&5CF4)Dn8t1?Z1FRpl7^U>g12+paj*qLk&r%VDLu zPS(oPyxLkIs0pZM$t}!o2pn3Z>kMfshyWExr|I&H8jS7i+70YK(r^J6IOlyz<>mri z&lBHH{_-$14o%wHQch<(GXJ0&iaHsN03%*fI^&awOJx;w_pM|0VQl^Z22GW*1Hhvy zg^=}-W=;0C7B`4{ieCXE2LE{#5kwuv-*b6mTfE+nU?n{h>`a0xr(vq=ryil(gL;A=sN^6JY7s?#sC9gyIjiF zfz-5S#M3RF#X`NE_sA514S5m;O99p@>+i}yh)eF;7z{?zZI*+w^|2ddi3-dgu$lyXx%jt4AW79hF?$g6tm3Qch(*m$R0qO2;7!|zQBRwsc0_tm0Q?z) zfdqk&v{|Gf2$;;4+nwm&u*i3ie|T{8A`k!oe^dsf`GiU&GiKxQxKh4&1Y=6Mzp$WaM4(1Ggo5Gl5`sTF0Yo4>M+KEr;QEP1wsD!`C`a7+lztMt6M3-Q$yOir zD1lAlXi%XtnnveU&;>+Q7$kNlH%U}XW7?4@CKv!fbP#G7(4goP^O8u}fq7ieAlQ!V ztvy?N8cF|-A5!|+KxN+tM6=o>M`AwSHy`~oaUwQT!P%ZI>9HOF=%#ZfP*+wI!t@Lg zt0Yi~coKnBthdVeD$Lr6SbZ+tYqWR?q|Z^tEgQiOgfo%0^c5Xg>afgz4Q4(n)7HJg zROI@qPJ52#4lROs6EqqpGs8wSsDP``?U^7`g8b{p_p~kt(*IamX8;~*fDx)C98&q8 zfv9lh3T6Ls8SF0&;*>6+N&D9L8~Sny%n6lu(tJlFK>QD8Vzo@;(#?q(7q-o3%wFbG zNS_9P_4B{FdeKm|_ZWzX|L7<(U2uVR$(%BW6xUbPH=#+hd|+`qr@sd;y)xsS`I>l+ zAKZ+{Fg9M4ceU!HEzI}9XBJ%AaPTD>nf6SPk(kSjCg5sdHWLy*x(xV7UN64FY9ga5 zh}_5{-=F%y+(R%*j)p)r(}9&v&kdSzKb!=EC?ybuBzvUrgEMG#BdH^{HHu-_7NDXo zTss0$Rx`;V9!n~K+bv`!2|P>pG=@8B2vFRe)%#u%bT*-y3}WHM-mo=!8`On!Oin^#HiIM~BqboBa;z4YtT?2# z;;UQL3E#Ih0}wzszLmP8%S(`9Lz92{nIzC~W)`DiQ$0wmPL80&Zfp{fs#^j@F2v6Y zMB+3g!XYFgPDo)W1gSiqWnRnzplT$7dm499k5H?A*ceycu-TXrh+Uv?OuZ*g#6VJP zB$T5}RHVFJ-oFsYgMNkGXTayX9C<22nf~6_9dwgInvH=F~_#Uny66 z(~7%u|A-94i z!rVv&98Z_?&1!ppmq&U@>v_PKib@AVbw}1xvrgAHML@>^o4a_ zdH-&u?f&ap?)WPWGK-I?nK_EBn5?ICK2*?9tEA>iH_5qne1}sD z3Y`fOvs9QZ-g>2%t1O%U+3q(l*01dm)KkV(<>a(&I)F)wX$q3`RAgx2#HvRSYW!_d zM%sW<&8E3AY34ZyVXI+H(XEekssqUFJGMwjH7mP{-e1~5_(#tNJ#-ga0 z3T;LD`Pv*}{An?Ol$NPxqiH~V;5x>zhMX<6l#u-BU%LC2FDju*IP0d=kS=JI5<2(C zonZHRW;x)wVDY+PSaQ`;j#0_4s#)D9D4AUbU#T>Lc9%q@vN+z%mk->2rTS2rWQAAW zEP!eoic9HwP{VyjS7SAkgr1LHipr>kv)jN;8k3qD;tcgCgQcWUDdS%)WALeYPG7-D+yG${mFk3Co zASzu+rT1`e;ILOy(Rk)Wo==jQLTc9bD%Z^-Mq1mu32W?ic}&x3a6OcXNvXhvZCdnz zXdAnT?KZnPHf3z~LG93rIcr`i`jE`mO=Hz&Q7miPX!R`{*ilkkT*IBg{=2>ZQ&8Bn zJnOdkUbzJ6DcDrfE8@Xj_5YciQLMxbqi!Wj}-ou)2+Upr>PB_YQ_z(+VdajPXW9ZBNp( z^c)nsj9Jwl0&VU$za~d^V4~L$AB{y>MH)*qy;W}D;M6iSU2{x08KTzU4vd>1I}yP2 zhB6B`Q%%Vw!|Ns5)uMSKn7QZr2J{=$dw(-WLHsk<(fO@Bll44DxrjiC*A+M0_ZT-n z%jDw?k%)4(F(-(u9Z6NUvP3I=WR0r}MT$Nqq++(NLby^*sSluZ z!C}EV%H-&-9faszXJYLJdeK{j{$y zp}N`MG;eH?uw|>Zy2fy+)_(zOf@DKWeU5LL)eHgFP;Wmf87P*x$Zk-|+Ju?2wqZU_ zUlGz;i){!zD`DBH2gX(&oo*XZPHV6Sg~6Z)V8jOpkIsug(C35IKT-l{t7#`;B&XqP z#InEXrpA{KS@j3pYJ-J=qb3f`Hq%6PA@#2fM98;?LRoD^N(iXX=OQvWOx85?p2e8o zr%ZHDHR7m8EpkX&&Zw$HpqDf%o#3kfj3DQ|;t6#~MNvxjx0SfU3Q4I@O23-f^tVXT zTvo}U33-^!?;2e6xtYKj6p;Bnsx<4$wm@k3tff??#Xbe(I zSrojr$xP0-9l$d|t8mn|8EXYpw+j1cwZxu6P4je5<8`THsQqKtT4D;Xef+Z<^wQFd zhVuA>w;ZN+9wnQfhCZ99kgj-9FjWvvO>rYQGE?T*v;-aLbeF;jNei%0B(G;Q$KjwB z;#7DnM6OFM#^i`5^P2mMV_`g|-1S`uyGxOnfazuBs~xx--BX*G+53_hcOoC|AwN+{ zs=$dZv~-trQ~fF$3Exx4IDPwW@D8ZyG<*<~P56B=tFR^Dky1Z+LE3jWIm`Ab@&WZAS3M@ikPmMqZeoT^z?MI)LT)@o)RZs4!7t4!_> zapr37W(ygmK(iEbd@zTht0ItM22Xf33Y z&q0zpurN5lJUG~J{eJTVi%AiV*_EP2DCTXq4-n99-{Jeb^$9k|cWC|yS5@Z36tt(r zHy1=iod(2MoVW!LQl_q1R?WPF1$^VIL=C*dPyl}R;Y;H@R6SR$GlYH%5 zeJTBsyW;=F6=FNM3=Y7}!|4xa^_&@fUCSK?4Vlm%l*UtHH9?<|SREJ$)Ac=l!|f7#jwIJc@KPry;)yII(Yy%HnY2S5 zNP_l*IyZ|)jCK5^FQ985bg_L%*L!bzq+X&*8ZKtY5P>rhMc>_XbtplfEm(+Pvh)0` z@O}aq`6B?+72Ti8!l9Xc{Y!D6vgvy2!v52d+B8dxyQv=`#r81{dg-iISdA zD+NEr1IZ<~W!J}Dg<$Sx=!j#~zW!~YcFMy-2b)yy3Dkhq3sa3*h|8M~nl^m9zyAY| zUm7cwisJzX!d6565BXfPd0#r1;2ao}(`eO$*pkoA20B>1>L8PoIU z7YGd5*DxqiQPnc4aar90V5in8r52f7v0Nqa zW*A!&)A|ebyt3_a=#P?Z=?Q3Uh4r5euPuw)Bot{i<`{lFri!l;rr0mEWU0h)9Y6)@ z$EJ;PK)vt$3$DnqB8GE}dxN=z8Dx@_nMx6+CIY=qN6e~90g(?k#z0bFU>oipNxsA& zWpO>Jfz@xUAU6k5T+4*`(X4Ds5-c3I)dJ&W{0ifro9q|McTxl6aD>?#F^Y-iE1QeU z;kz33=F3KOrFn4$Nt?4!0aJe#Fko6fs8~?hkJ9LY`J~a8_w^-9K0Q+#A~Rw7{Kw_` zKEb%0U|5Hc8+qUq%cF}ysT&_%J5I^YL#ffn<0u>;|M*0nGCMsCdMD+-J$J} zhk0<6{>w~`>hzEx9jzD@Vbn9+9PUv_gU{j&ACWv6~f?TFmW_JTC^I`=_3{i z9#tT+AflMab4{93#pxPZR@k{HK{dr2d&J!u5lM(up<`FwNiT~z zz@V5jtjMZ}cbYjVyeNFz>2KznSaPk_%xuczwzETZHpwVc!*cqapS)aJ`$a&vdR19t z#ThQEY&g)Q6`QPxhc1%K95ddv6FHeOKPsP5&O|~obHBiCHKTx6{g$bm#1lflju2uY{~7quwY8l*Fc$O26D z&!^peVmIqpl1#%~@X0h<4D#O84IR#s)GRP3xM10L-B_z#%Tpaa{#IgapvvYX@4hEzICVXhJALQ1`+~scszh3{$#*C(}JZsn*9Py$eC; zSwQ=Fwrd}8U{FvH9|D@=I5ql@!p3*%U-6_vNs*>y<+A@g(ekgmrhJ)Tfl2^~c|x?O zgu$3Xa(u)?^Cnd>tOhz-bEm9@(W~#DO#$gZ@?wQrv8 z#G1WD3c|R#tD59#CpzCM&<>$c)|_kbn#{4k6`nsIIdZsvot`|FY`f(N()imKBY_Wi zn|UwdAkm_v!+B;;CRk(ZgRrFR_Y|su3O@z-u>=&QwdrlEX}m&jpFKNVn|`uryP=j} z+1TC@_HS->S+|JHPT}d?GwfKuM+v#elPO@QfjkuNMKC#5Ycjub;%&_m_I_T=1g?}D zz?NH+08!K>D7YITY}GAEaV`mv$nRNx-2&owC!A2NAn!j(K!kxgd-7|br388P1dyqy zq;Y4Bd9ag1Y-#GY=}O7|N>LFbvnU_eZ&I#%|NPQX2uJ7Mfc!`^i|4c~D5 zN}o+baIH%gcw&PrOw}(D$|^Mx$GSKno0SXnSl4=+!LNYJgJ7GpoWIp(A^Fny)>IhW zlKX0LeOHf zKTJw|PEWQNo$2i|!Jj~O48lni#>6abH0Y6HW#WHt$dk~o-`z%rU1sXi)M{*vqF7r_ z&YWK2ta|!(5At7+I2y}Dae=4{Z!oEBTmWVlhXkkgM~ny42sY+3wB*Jkz%=8lXwnj7 zMJazJ%eWIm=Zs5kuk8_HEi|LO_v;Bf@2(2b`cksh!T>7{Ay$BrXL&dT0s3ETj`$D- zf~5snP$58))dhBtRb^<a#FbTLjf()=O>-?%u-m&kFHX7szu zh0=)_lKRWJ!B3?WezsCG>~`qYrKh7DV>72I9=@-#{fyQ)0v0Z!8whRbcdyq%EN*;TYO$A{vb)8NX5 zz2w|vhC$6aCb3ATnPk5hW!DJ4Hd zBR#xO8|CFtoI+u%saNy8w;T+(*KoDhFlUqhq+FEzf2(p~_Fv}yVGvhX5ZcK~!xFwa z^GR&K7O%t&iJ>ma>3mH4c{4WKep)$V?-7G+eHcY&d3#ES>rBU79SnQi7iKp*Q8h=1 zJroO*Y_92F-_NEISgj=-2^6yTjT~GsY^829yy_pE)fWr|!{|z~>$QItXx;iTL3ic$ z9(v~NVn?H+>%P^Qr)rM|bHzZ|pRJAG#nh^4(@h=cHU55nLTiWNx)vQzS?*$-ge852 zbtxtiaK>&b5{scVL{0g>DLmVw9b|}tsZWC0gl7@bZdrhSW?qG7tPVO@r0Kh^^8-Aq zoV42;^4xG}YDd7GEG{;rfz3gbyiT2;yl-!Ww{Sd3H*f7gPOdO%B3$ksyKNp>aCFq$ zK}?Oc=6!6^p1tjEcduWk!Ps$>F7mPcTF$!?rBour>^4DmbUMH@c8m{KPMuA01lPA! zxJEEcTp*O#{rA(=X54GRJnZzBLv^%A)r)=R`j4k%`t89D1h?DKx6PL^FjS?`1`Mc@ z6f3!5F-7>9J2}Gf&F~HolvSHmZ#==xTB}(lkw~ZrSWj?uXj1cy*0H zkuc7FV^(_*v)@3Ou|;lqnZ5>(S%8>T@b=kd>G#IoiE#`!DfTGr{#L?Ud#?0y5l$+O ze`5-s;3n0~gs_2;HUt-w-Dl;4NM1Kt?k+9zr+cTO@XB4>FpOyf3N>`PbnI352~N6j zPjYJhB_pdZdk_h_Ey%gg?l$7UQ9(eXh;!V5!twfq$zB{ErmU=!kKJ=&ugS#faSw6t zS*ZKcK16AuO$rt6qVeglZL04v54n=<1u586GY1#Sj|i*PV*E6scc7~dXo)S8O0fGs%YUn>es>-B%c>I< zuArSqHzkYD!6;skM|a7aAt~r~iycC$I=P{TuiP1qXd0^T?4YP5Cb-i4lM*}*F`*d<1ZMhk7Cwd-5d$5C+Xw3{Hc_TYAi1%ncIzRMV+_vPK>`BD`~ zP1M6g<0spvb%E(qBhIXq=#qKQ!LD)ijmmRLRb z{y7>Ev-}|>MI5A+%j3K!90C&_NcM-0;kCRV=P2Z+cKi+Vok2cIN2;iJtfybbY2Ik9 z#P6`1OYm;O#bzdRd)gllLCb1`=uc4mE7||{JhnX0bzO^f=(65(1z+Gz9khR2o?Z(1 zK6yUBjC96Liox*n-Vwx0L3|MyKi&SQj6 zM^82R7V~CksYjNT^PvG}(MY}MR=w6-hBO*OK3JxR8&;N&zfh&o*X>PI%$fMr5JCWV z#aweA`I3Yrpr9EirZUr#jj&6%Lb&JE5%c5aUjmjRBElLZ@^}=!oMN%0k0HcVS`)e% z>t@W7g}y~6)VX^qzkXwEK7!+qlF@`Vuc#4ny6O>YI*YY~9&<&D%GMrrjKGYjf4ei| zfz{F@iQ0TRB1IIyE%P(Wfuq`?_PE5-BdG?6=)k=kx1}m9sY}upALyec_X0`xfRYqF zG<~l({=jyEhM0!zUyCQJ-0E!EJIO%yat~(l;e#x)NL&N0qSMznN{xVyEZ0+`>tRvl z9oDg=EMalNV6x?D)nHU0#D!z}ggYv-A#iCzQv)io+Z%YpYJ&{KagQT!GS85z>tf zX;r5YBo){qiuWXv>wrOofci>)e>2=itIjiOdO}D(K)ED|7eq^eq8X)1fT9#srK$`z zB+7ik?5$L6RUq+iW^X4MgEpkzBP=sn4B?suf1TmFap3PVF-bd29D3=751G$FmXPSq z&@PsvIKokxX^t|MKyg3h9rWcqU8DLjv_LEfK{TFFm`F)5o4!XJN#&#xM6eF{6FD$i zoX0jFfi-=JQ6}Qrx1ri*y&l@I*?FQ9h)LyD6Ylat4to_wKfh)4C7 zxtUnD zdE!|jc~O;N;z_xSWT`_t(HyS1kQYs7;;SMer;+xC|EoMD{wKMKL>`RvLAy&VbjAR( zh?&IAwRghRk$*jMfgb07j5pt{s+>%uVFulnxq7d3?BZ-C=uHt1;VBXUSH>SYJ}e%4 z&F`pZn9Z`Ok=&bjwcq8h2kr|x8qf#!3*;E2J$3D1t}n<@ErqmgEZ%a|*>wYFBzo`Iq)*X!j-s!B+k|J!pY8mHw-0-N8UtLsoYT|GCE*`)*ZIc- zor{fb#8eIPf;)Ift)WI>oZ=!4(H?*4=6G2z$f}{{Fx%w(xK=2ig1P8}5W)N1&Y@g# z*oE|FCmm_Az23@ai?!bhofrRK)Q?8Jz>SfSse8w$t+;4}z|kv0sV#}IMXBVHe`$`K zF*htFUvFhkslGORQ;Yl=4a@>)%W;a6_8l~>CT9-VdbtG+|OrdW+k%# z#W}kmWT~^!{d&Vj$A5A@NW}FV`(hSLJvsqR6a1B2lFUE9nyg^feGRw;NS_vGC z7=(;HsO#V>6>OZ%oHfjo?g2J_SL!u*+9_S?H6U)|S-2*2Nu#B?Asva++PYtduI(Cn zLJ*nxvHP*bcdGS@4fk_wGu?B&1i~mM^xKqFc0>@_-5osu9;Wj9y!Hx2vyNthe>PY_@h2`%j>U~QWkY3 z7h`@H`Lvdi6I5XA;0Y(t6eBnZ<}c8}M(d0hJ09*opWYq}L=qOH$d`XrBo+^S&W^`m z>%Q<>M*k$WG;snmOxGf2I^_Azu|(sLgZgUR@*5x=Y50vQ5;0u2<4moEi%zi~El3J+ zP*nLMXo+ix$^oGqgwZ_+p5;#1BJL1lx$IlvLH$CYdUS zYNR5Nk?&AYf}A?K0~*6zCMORb){hs=C$EHhHL~R4@ID42aQpQ~sS3snleSP`5$|=( zq==RzT5*KHh?=4F@h`6&=NgXIzqM!4=`+63p?=2XWcQQ~MEy`C5l2E?-U99|rdmRf zB+rp}$hez#rQ5%>*GdXvT0?Cvf64$arzA!4AN>5WTNupVE4z-zlsx{y$=*t9%W0KQ zJ^d#zsaTT~H>nk$y11~2BYCWL^%Ef_I+~j*6Er=>&T6xWnd@5@8DTMuZT5qZQMTu_ z!Tr)LFvb1R9RX`8KIpc17hf1>e{<)Tz)6(D*ZS8I@E+xeZ@XV&Fy=FTgdE4Pykd3t z-qVQ46v0OOE+Mp(jHpoz^Igh>9vhpxBYo7#&6#xWMKWhQcSRJ7(1p9!R*=)8g`bvZ zg5$&<%P>265_qfKWF<{SCpQNl&1R+I{yiVLQ&Dv}y0$E-fll5fcK1a>Dx)r0P3QQp z;)97^mm-n^dSg`w=46AD=6La<5FBbj){kZ{d-Xc-`gs)Rd+~zw`%iIYlh?*jn7@>? z7fN;^wf~QS@xciYMUww8wwFrG=kO?@zs zevdx*+KutK>7)L(9-*@l? z=%`_NMnq4x>#zB*kdfyCZ*FD_9iF7oZ$K*7%zckK?8pxN>u!h4U!UK>Xvb-NlE8?{Y>qy_PY~kc`dypG>QaL^COVvP@>ys5x zq&vpeiy=V54C$_D4zC`OM!_DaWE3i7W{1jf0^LFfJyoU_f|zwNP;SV&U+9x^WO9ZB ztUOe&qgb^eglIkhGA0n)4NZvaEVeg5hrBk!o?w&6Uk)Z){ZVw2zafP9{j;$Jh>x;Pu@6p;Me&|Zg-a$U&HOW6NzAeBmd5xO; zlc?akuzdvCTd`C9HV$I+_T@^awo7U}+x*}*@$~3R!%XC}sp)g$5~1HW%{HVOVcLeE zNz(!vsmQUL65Q76!Z69+0k=&uorwP$&4D%a12JAK&`}!G%#{HL$w~b#jTZNKq9@=( z2Gvkz&#bdj(i%d7JWPjddmsfv{C`J5M<9p4;G+K^iiAT~xx;T}6P{e(7^cN|ZeAXZ z!P+rT7{cC>BBzJh5blb=-=y$@e7$$|AY>8ac{5^=jkfZ%Yc|?^tgDxS{)$CH`c)pl zTE4l{ymWhE#&|I*7{*DE$dFmUUzgl=T@az$=)_dq2DgQeR&jA71h+BQfe!$UW`0)ISK~N3evp==gjE*O(af? z^~fgNzw_X)uW7Z)jwD>__{_T`0f9tdZ9ymh;P$$>k6fmkz5hnvMR#&UZmql9f%-yp zu)eBhxvon0X)?Zr#q|~@-2j<@nF1~)F?H6u{~uf50G`>hEE-H~n-kl%ZQHhOJDJ$F zZQIGjwmGq1_TJ~6bI<*5t^V4px>t2|b^ZM}?2Xy<006o>$(}7y-dB{|XZXJ0%O@&Q zwt-wAD$JtNIr+wXbz^}WvKo4y2V&Bcx+!-XmGUHXhi4~t?!n13%VM>M#g-#w>$c|1 zuGRYIIl9lg-k#L)``@y?(5$;2EEXzREQ@~@8k*>m7)d2Rt9V;-Yc$S8RNecb-vnWD z`BjYX9u^Lffy3nHi6A#G10Hb(Dokx~Oj(kF>Wt_g&Gro=!)VhH!6T9pD2S-p5#D>8 z+sSm9Ld_wfrXrGuv(RPTKM;#zSv=F=pUCZOJS!xOX3NWpq=21fnzW10#u(%Ra@vV0 zqYRKSccfI+cdPT=;)LOzvw5)s4d%qpf9|k%Gx~sS+-RT}i$PNK7bDZdPzJM`*b5>i z64{K>S0Q8M`;p=4CK?h>Q3mHLs`RTem(<1HD#iob@pAR11>o+>Sn|xw_wXmtjcBfa z>h{38;L7fV%u19jP6CV2Fe0gr%@VOx&D`KB7wGH;6=h!z@*ETLpPM$SSN7 z&A}I>R2W;5Lr5BN=w9HT=-VW~Kl_bj=m7<0muSvd7pA{3a!VxA#R}d0U=_hgk4jdt zp7Ho4`RFpul*(ijQ1j)W$SoEfR&0+?nDD}HxKXqH>LO^oOyS^gEk8<}seYaWA%4#$ zv#2dUGyA5-|0<<7f-d5H5xkpl*`iH{DupltD(bmuq=aNz1|=F-SBEM&@j~DRjD95e zQEh_o^}rwa<4WNOnVN1LURzkXdwsx@tzMvTM>F}jsn-X5{%ezcBY{~72|KV}cDng< zW9XCd5{SwFpo|tBWjEtZmhq5cMB>8T zq_YLs;yvuWC;SsZo~d`c8qcf;7&MASgpS3SmBT(mjj7o^9)E7?ngb4p08)ToOv~{i zl~OCRzYKb?MBGq2$Il)DsJB$F zXXEA1k5&M&Q1UV7lI1}c;l??8xGjXJ+OA~kt9JZSD%pBY)Sy9T|7W)=JvNh(On5-Zt2 zKtI~5lZ}imC$G@);pF+=qpT4AOBB!W7f+Ejyvkf@e~lkQ)i00=MQ+NSe#93{K9G5$ zuFb9KJIn{{M{-~Zo)hRTNBIQ{=3$TKjI(f_{4y4|4%0UZ*X8Taqrp^a!!$1qEZZuJ zM-NTY10dE%5>M7<@vO`BfCR4%*`%B6CrwZTj*$!j%^DOL6sfSMuul zz(y&@+Hm>6e&#Fd!d(9*nmt$p<9j1`H&Rm=URskc3}=76)4E!cxJ5VBUvL*izLr>> zA4D|7wVN8mj?GZx!)~2H*r&n{OM7MCB~421&Ufc#usd_>yU0P( zpnD%;gu{X}-0tZ}g5&JReCqai)&CpGjFKtm#4UlL3qahw!CbNsRl&Hyp6k^2#)g(lbE^^joi4dXek?L#oNeX3f8&n z;+pCeI5x<`f)54(owaU6@|RXfAvS;2VxZFQk}wOhWjegCB5rV{0PvwaRThvnoAOc= z#xO354m2E<*yS?kYH|tWL+hNsko3XJR#CbJ2b-sb>`$CJ(nfOlLr$G_dcy(serfw@ z!Z$gMV>ZikwQN0XjN`^Y4bm1i?qPFjPGk4p7;i>Au_*E>@zN5~6OLzM40=neIBE-R z{TM}~FAgysU-z#NHPi;JOyM-ld2op&&86*fGs2aQsz1=X;eO=pC|g@t{J%Z&ep0e@ z)Wu%f8KL+~AK~h|t3cb-#hy~k_!FDGY7BCFz1fk_rq+DkAC+8a!IV~-YAoa(ipMc5 z*vKz7B#wI|3!`At#N~DgE5cF6)IF-fCSpUh4y`G==Gx6T*xE|7Rg_0CQldk@aD;M<_4!imYb6#eo3R)DGRz{SVB7ZT2_0Cy`)I))3rqH6ao2pyhx08z>kxbe_}XCP?%c{( zm+A@rQbogP_Y)~7B;-+=65^3BAji+dOc$iXO!9WIuc-c!&M|r)Ssnkd`ZkY)e{v3| zj|2~??mZ{-33+XiZpHBdw>xR{`v60LUpk;^X1oDb-M!9yQOX#53KK_wk-~Tp&>W%j z&Kt=Ez**BsNQg-3Q-0-_0S@s;)scSrqLZFoRfAqTVe>-Upn3#O_$nJZS0-~OXHR$E zN;;y!CNJ5aW)M&h?RKRTnog%NNdPrkEk0n|DAhk2!DQ*%XAu-C{vPR|$D6n^y98M- zXG(^K=xG}PARR6k=QX)=Jj>(c1#_@Htq>TmP;q@vYGu~zax2eek+&-kiB9$f6L|J; zmaV^VXa@hZ(l~Z56C8~(xAn9tcf^vjK_moa--ESkas-$mSb(g49JM4ICj}FQJfjuZ zN^G^e>&r5}G5Yyxw=v!FHLs_zuS9_DX4ZiSyT_KCqJr0Q#;05VbTs>EzhW)R1lP6^ ziir@z{a!UqmLirZwVa%iD4F~6JPY2M4^6*4uaVaGgRaOuSE8neAj1@GRwY<2yt_@B zlj7kuWBvtZ$ZCT|s<92A3AS!P^u^CjztWi!FvBk3*@*Om~Qz>koW$VVktL}sr@ zOwQQr?WKyAOE*9($7WnxLrM6^ozH3Cf7IP#-+*fa z@gu&1U+kpe+cUH}dddLJHFwq2*E6x=I@rvVwFXoe2~0|C%xf_FdBO~p4+6^HyIf0) zV)&%)9rOF}-2b88j9moS9R4{zFf_Bb*tVH8htfRwmdw#j5wC)u z_47Mf!3nYNvFeYZ9Av@Pjvc^Wr~Q)QZp|+H8Es~k1sA63B+2-_ zE)}eBduW7ak3NLFf)l11Jmur|K16(dwG!hmXqFh-P6LeU;%T?RnBfA(4Pnu(=qLQV zz?U~lEkagGyTT1QyXU)AeN{mh+V0<4A==Zh;<&%upLv+b*c`fcb_PHaa;65hRi#UM ztqz!CI$@?_o|!}!g;-NVd10o~cZaAL?`1Od6DaTOo>htu#UPl}N->H9loFP7ZkS07Zc@ff;#82xCWywSh&O6A2yZX`)eX5Q!?Z+x0-bueNE9Wt zaA`y2-H%x2Yqx*0d*1-DkuKW~ZFkJg`a|VEOg=Nuw=}^ETTeTJ6{{pGzkJ~UHjvV@ zJ9KK-|3M*vnuLNf-KN7i3`fZrxp>$hbkj^tm0rQu>t1+&sa|s9+&KE~05VbcoMMEE+G?>bKh1Eq=VFYk_CREVjAlI^ zSc>UA2dDD6D>ds{?HZv{)WV|owAX-z&T0zdu$2c)2z>N?X&&~nP6Y!k13vM3Bb>|( ze?Cqp;EFw||62JxA?Hs!T_;UhfY^q=)pOVm{cV@$fOFT+@yj&gsbVwZ>4Oc@Ix#kxtOt3~!nz9s>Zn)#fkcK)Go%_7gEruc1MwhrkP z!rj~h6rwWwJ|YL#*q^jhOinguJ#X#DPvPeEo&-6a7V8X$%;>;Su3V#ew?P718?2Y5X@nqw;Jq>gh4=pXR0VblaM4wbdLJ3e zX|N@6#I_RBT{Am3Cvj>AV<#cd2{V;5u7Kq@;lOurx%(vs-#bXn->(}kJd58RLwp~G zEiRpt+z(DsiBE{+2g2&Pk@HLmQ$hi~x76oian{6z?FV31OXjp3uJ`1oU}`*YQa2Bi z6hyLIVmymWqv4-wxZIa_j*Ws(0}{2V)ji-5Y(^CTQS6AVZqsA{X#-vFe)}Bg*9sqs zsNCaUBo~FU<9dhlG2kF#ZbHE#4LG1Klh%}Fh9PN*7YTID6#zvEH);*nI^buvTR@a2 zF-#cC!)dsTsZ1&^N90*iw~3*?Drb*GRSp1#Qfi5y^|>A-%ugi+$-WrFR%di%&Tf*$$B`^x zd(Xak^gR>N{_5pvA)L^%=hP6PVuS4ul4p=UU~(feVg;J96~?EQx{yKvq=O8u#XmlK z6piEO2@zAVg7%n2MQ0uOlguBQXi|+|Xb%HH;U}TLBoR7beUO?Uj>b6chHRW6Eb5sgiQxSyF@NYS-0gr)Pmp1x7G|xntz%d=I+!k;VGX`uVEm+v?|PcFi5gQ^5zC z_6-~?|7NtW!zsYFG7a@LQCy)->5g}*_r2#1kJ(Appx^lxl64Mg$ZNfCm!@klBKDVa z=uWOfop=4E_-=@?=qT6Y(BmY1cM1>}3DANcLP`-6DS+gA4^q&H)vFnF1TQo+s^V9I z_lS8XI+@Eq)zsOhE`0(XS*Jf~*X7Zt<~r8(`py!?LPhlyQg!=F9Km|6pQM9k){*sH z`0D2p>2vqjQR9F(ZqIVmX2@oq5DdV$JUyib0jqfZL2}S+&pS-z>|+qICQsY=7&)hH zC>!ML5-(3roKim?eP0=K-1!%V(_Lhn{tq-O7HmAIZZLPM_KEj`{ zc^$HO4MbxpTAuHdU%|2=XM0rU@vTsl1qj^0C7!^Iw_&i|>;*&C&IA3Jn3;kpnaCtl zHM}&g*n}+L1vdm>x_tdPcC4*)OIbPLo1Uf>4JeD@k9ja4`85s|NStAv**y7FfPx7F z`VYsEQ(e}ig(AoxhC0GdLC+b4rTTq0nsWIk?mX$uP=P-z^-ymD2)z1Z7FF0hMJ+^x zpYoNmeDR!s*juE=y!#~yGX-7ArCb`Z-Wrv2dREClBh63}5q*bY5 zNCY+%dzbB{HQxDqq{Kiww#WzrjO_ApQA3TCkXI=a20$3#0$O2L$IEZ7Gj;Z)A-99#@L5fLjiAs1_)~ z-*U{{=bhI8fK4zS*DqPbu#M~fT&tDIV|T3CLugnr%Rvc|ukDsiez^(IfC+KnS{R#(uiQ)5L6-tAOqhu2xX{-s^?*T6i(*;SZc2=>TW^OV2%Zau#)db zY^-6xIoT>oB<7cLG@?>QNUM116h;##D>^F4gt`*WlW=lPs^$EIpGjB)R5Y5~V1w-SYaJ2o; zLNja-_A=Er=Y|e3n$I!VU3Jxp`%BTdDuL@&qI;cIa#_@~;I*-6#<9D(1!K&7Xo}OO zkoA$}J3V&{xJoW}uFW6dOX=<^S z%vYtlI|ZzIKO6od?!ij*knp2jMWd)xMg?1~K+1?IpM2sx+!hM1dfi7uyE*o3$oNfTxIs_$7`N zIfl*C;~FQ~5uEP+j4XRAxChG%my>U9(Y7H-s3eI)sC|b;#at*g_U0LXw|>xpuBh1ah6}DguyVu%(A))NCMPFMwn1qm zvX&xq7J)cH!&J6&FZ-B0C0~*6NfJ}B_2_tnY_PVk%p19F^4VL zlOxk2PlX#rZuC_B2={QMNj`5ppPg@`dSlsTnCcYLmx_FoP91MY?+jhfTFu_8PcJl7 zi&bM;(#*=5MVv0yic-?;od96|zVarkry9SmCD5d<6quSd0JFDs+5!|rF9rfzo(3X# zxDtMRB&Z5MAFZS@S!fZMkXh!0%h0?ta;Swf2_HtXtkg*H$LRoF{vnW7B&yF%MoIDh zDZ^{}JOYx`T=YSSgk63@(Fr$3SzyZ_$h&=8uM3p2f~HXgI-lJcTh)@T70y~bbI&{1 z3(E0ihwMdGnwP6QD8p_nLM4!@JPYn_EGJsLhvwSN5vwIIO7TG6=M|x(dZM%M=><10Tpr{#!F2G>M|vE@ z)?ukhMW;`H+_Skkc{%T%VN+C#8aC8(K0F@5FiHT&oN9wlq&)pkUVN-xk`7(b(g^Rf z)~mW&eP`Q&4rRy#?7U9I2dH>7A2+F6e$O^|=)O6MeNmN?K``D<3%;^qYf(BJXsRE63#yO^2P5P{H^nd_ z!`SZKIIpzvniWl2nV#*oV7fF(Ob7`z$sOKu@BCYpwWQA>DDpquaMGR;B23c1|QXV0! z!D18~n+rSh^TMjUEXtF|Y8hF7FkK(0yA|lC9i1#ZKLYpT1x+?so^-RMpU9K*42;6_ zcq(vD2{EHbxNDLFPI#)mGE{_8Do@Dw*Xp>w_dkFQX9L>f!iz%4Jg+X-Jt;eIwe5|k zqfu3_mOx~he{ObMaE(Y|$up}?5GjEgV)9|`g~;ej7fZoJI2=K|BapGk$3gIeRUXh8 z;FqQdCK^m}rLICyxCCis6;N7jZP3OTX4m`uQXJQQC=qngeveCWNrp`RGb|k|z#!@X z_jpCu)Zdy&X4niF@3!WIHLARLLY3t%1Fy+I!qZNYH z*~$V1j3pm@EiG-r4J?qSU7I5ZWSXOGu;>Tq3nT6n zPx-dZ2Cv&CpE+F1?jt1A2IyqndY^URozLV)9_1mOeaB9Kalf_x+m+Ow6Vy*LzOHx$ zJ<5)J55$iFNit-5VK-S4C=*Ue1sJyyT&I|wRt z0!U;}s_~>XpMCFv^B+v_w=IHtOt%VrsjI_%p%wuBk2J}c7^R%=Y;RjvXk(z3tvl>H z>ovH2S+6d-p6@R|1=qArsV-c1W2dJvDr$~-bLhD;xOZnv3#BASYG!Ki;8VEA&GvD5 zW<{qM`z}vA748?QfE5|@HMpa!s!}|~rpMsKUFPGT00+W83TA4OVxa<4-l|%Wc~RMg zBcpBGm(+E|^4ZSO#1IP_<)F!s$*;}?i)2sV$Rb-y({u(hg!0@_Q zd_v41k>V;#|7px)?FIh_uOi?B&@n9EQD2$cu=fcM?cBaNgzOMU- zemOy3YD8%BvkP&rgpQs55O8Gr$hqtahMh+lJytc$AC8VzwX=J&CViWcQjNy9X9I70 z^Ktp&TGQRkQ>wumM!ky4WQ=%kjjYe}pdQScs-Tx62{Bp(86Rbb&NupnGt$~79^j`6 zj|xtu0S2(qmGo{WXthHPR+WV9`bjyL<8pn+FYhViNP+TGCP3Pwz@`>yyykRX!VYUQ zPb{Z3lRAFemAaI$)x}i}rPe1udW8;|fHCSr2g>M@Yro&U^fVge69M6oPEKV(y494Z zaqBMP4isX;h;}EC1nR=Gm^wuu9O)6b>T!+)uj?8cKPn0|W!@HIdCci`2ApiiQk@Do z%)}08qYC!lPOAk-uaKt4_PFrFCLG(GFahi>0nZPdPn~B*7pyFCoHR@cm~>DOyytWX zEmEokW|>iHH9%P7@1Q=cAp7Rgh}3$VjnA~EYs^Xz2J{hqx_S0QU3EZ?jc!ckLC)vU zzra|tVy$Ee(xj|9j7d$9-0l(jogXjWGAR_@OLNB$l178CwUzs(C}NT-K3nj+*ZB}f z+l2t*96%MH_xE!ZGhrgNTKkvdyBA~!cTH;-P5qh^0KG^YxgG0VRk zBm8B*pZl8)j!M@X2H*Pa^>dhc)IT9^UYoT~9ouwx4P7_+(m!ooj4SmgLK>7}0AF5~ zVAmYdiRIu5vW$ZUuJp5&F;k66&8khnY0RP@jIuAYlW;A!S-m8=x!}FXTHIiRJX{*l zHU`J0m^kiCib2JG@Dq~F@If(Q zW6bh*d3%0+J(7A`~NYAbL3^RW*MNzK@Nwu-xy7|DwK3 zJV;}9e_ypEVoW(Y9#N+<^pW8OgHk1g)oI#Cylf4Y%Gw6wh?U`aLvD9{5Kmm`sOVgD z6W*e6cz*YRO=fj??%aw}U@l71+oI|wj~l-})-(4fIklgMrMXR(CQOsDk4)I?=z``*#Ov-Wv8tG5lepiCj>VoV^TRy1GLI-_oijZq;^)cmZFNxr zB|H~RH{jMy>F!WFKZ$$Sy0m`fzEjOOsr)p!cer?lo9jtoe9G5Vxijm0XwA${QmRaz zcvT4Le1h5gpwV$Fp9muu=>(ke>)kP4<+c z9!-8%kNqwnnLj$U+$h=U9MMUQ=V~oaI;0H0RRY@SM-lxH84ePRrQMnX+>fg%3&Q!0 zd7WES6~>C#a4R0(IPY@&t_o37>iMp9y+#$Gp}p~%By1F?=a&~T_sgUPVtMy=u|gu3 z-!Cs=`)w+}hwrDUhufScfk_tUx!mK?z?dwVBPJG@O}$C-$q0h%H<|Wa#p<_Q@Z;C3 zJ7QP8vaXHFK+s(<&o)u%+#c4HtjazCU%Fr0q27M+vCruDi`Nx)_V>M(C?-t*oy(NgV~r-ZCXWhH$jM|K^kQ%A zUR(Q42-rtsUxX67&eTF{O-q0QY2TYlan(%fPb85+z}B=dv|e_4i$Jkr28iHyTN}q{ zT|R=XUn~jw*=5d|@AcYxIMgCC<8EF&Lim`l*({MZ$4sB;pv2DbL5HV#JCfnhM^MvN~lw@Fakb-rntAOSf;+amOCxW#f5D>?a zxGjj?!#f5XMSH6^E$+ef?p}l7)wp**e^H5Zj{64r|4{aPyJop2rG{1Md$hM~Pev6H z!R~FMAwva6vgVByjU-NrVY%-){kojlGQBtK*^fOr^JOfXW-?u9;#{dx`0ddP06Gw7 zrbxt$X;%XnupB0@4h*CqP=ZXiLuNje*ogHiD)b;kWp&$wqj?ZRjLQi=o@RIE;@!y;LNkGeb1qiwodW59?G_+mmwSrTGIP zdf+_-smk(7GoTbXQ1E0_ps=dU`EstpU!shPF4RsBQ=Kfj2|3MeDu9L%a=-76>35P6 zhUzfTc*D=wR#8+?OOoR6)z)v-GF?LfBhe2Jo2X!M1FyyIEx0xlU>jPKT0v0fUkR(! zF}d+Oc+>5-l2$fqFrM62$Z9KO4Fv}bSuJ`%0PZ@idOM2rtyx*F-W6k$44&J(O zWjALq-WqeH21@<76qXywQZ$Uk!R)?pN*HrF?^(CTP}ZhBZzQ;7!57yt+@j_OuT+ZB zDzFcqkrhi~%vj(sY2b(`i&vGh$6Vw)fl~Yk1PV>BBC97bMr$V)R8)Lnf^~0138k4) zXG`^c)}m(`Ei_apOc!*CQ(rr}i)BTUpAXyTAH1X(Kaqx(vA7xYXlWw%lS&ssd5G); zTV~A6D#*#FDtDA0pg9({tbgK0tg07kUsAhBxzC8IB6o}SpI{~=C1L8gXb||Nx2AHr zx+wb7z^wPp?sJ#@tnVMpY*QGXuq4H=rnSatM#GAqlz%89r(Vocme&;|F92sKg1#%%=rgNb+IbZPQ&ney@&=@EC5ZbO{TtkGy&-e{4xryg0 z|CVCyk-^Ae`8KaWoDkR-hsO<_<&f2==H2%NXA5TwXD3)>u#9 zq_Tuzt)iLzc0_10+Yy2x9UuV&71gC!Zw0Oc}snvEiP)Wv4Cjk*k*OF^0b zky|_O`Ed;GUcpgEtn|})OkwlNobFHT=eoe<0WS$D(woZ0^9q;%pRD z`q2Dd@^WAPiOWdxHY@)y-_JB6FPVeW*IH-r!fPlpo@bQTJDB4!;M#*V+~cGiD~~DX zZY64-kNzoUYSLA*)|Ozycm?yT&6@D1ywfi4i1F9?wi33>iuv`vH#xCf;#mH0Tdmq_ zJh(5v5AzFw>8*$Im3{v3ntJ0n5@Kk)j`yOUHt}H&xL67=0(@^+wME&(clgGPu zmoF+Iw9D1~8zx(;WHK+q#v4Xq%svL_Pk@z7wOX11Ne-ycP>Fv^)A-6Z{)^)O6DG_`aO z@zMr#gW+wF3WC@*suKb&IC9%Z+zc7!BF+3)zSLVbhe@7lZ7r0ps4b392B@O;8F-Qc z)xstB53qx!qO9bM#t{vjq!z4=Hu)PhN-Mb+RQ+?*>RSc3?|Tg*5j^8g?V0L;aW1wS ztlQIPolF*7?3*X|G<$vq`#DjoY1^(yGmf|uJ`~kg7t8hAGg0g{FSKUEwQ7yk8oE_E z8cK5L2=ezUw2{(+J@+%8a6Zk~H)seyhwf1c0WqWCW95xNBqy-F*T7#fVo5Bp+`bpQ zE-FxQBoiSIb7c<>XP1o_D$Tz$u#IR#6;&rJ6qson%_n`4QL@#i33Vw`wFte)JdSQy zs`fUPrCOqms4y3A7-6apQ?fzG=B?AoxTc=76<*F_d;$=|IZ`zdF6@d5Rx zP$J#vRZUpj8wh?`Ev@ZMt9?qfI?spTi=GGAm-{R5%eJwL8zlH?70C=QWhTSU?cz&x zx?YuYWNG(!Q8UN>atC!w3F+{Zc>cn3g_YSZ!iN`Jul7ds>$;!lYig_U7=Y*1*HP`Q zV_VSov%q%P-bWfp0UZFy*VB>Dt%m^hDzsNu&6Zh|?X%;h%fpOtnvCza`ADrs>)XI3 z1EKYW(A4rOo(l#umyy31F8rhETU6-d562^PUW0AM!7%ZMA&#Daw@Rx;!nDQ*U|}iR z>t>q(HL$1HkLZ-m;cUxSw2AHU3CB7#$fo1Bl<*n5XSz2hqeFuUO|0~67+CwuQe7;1 zhJ^%RC>6QopjF4xY8k?AkD|wg=UeC`VttzOn4LPUph@~x>*ofQ+Aqx>~Fca&`pc|JSylP*e3p7XyO-D06`{w=aZUIk2QwP z1}->t&3a2vtSHiri=niR31pWA*re-5fiElCwqA>77`-hc<$Qrj0@GmgzK$x=aU+Z2 zwSHc`Rpm~5*8>Vh4!j@3j86fLVDZ83-SKc5Nx|=XTzIa7EfBQ%Fz)4KIC!ySzq=2_{m8j|)!m!K&Ib&}v zf~czEV5!lQ5pj!mqSix$+;4VPLwFU|QpoM!6o}rshZYh;o!pBC08P*koC0~@W_sH~ zTOzp&fCOaDQaWkd(zk!|V{<$V$o_E}dMIpRyAvfh*@10gXsD7b70=ZO)6C&)a>=u) zwFv}sb*izWRbc#`9=PMJ0yiMrsy!)OOs9FmjO4l$ zAig14@eX1j(SR+xMQ@AU@b;k{G2@J7a%yn40&-_W)@*7=?=|OvXkm=fnR2pxzB|2y zmXowjUuS~EGl3Ool2lIS=C|HU)$jrK`<3S4k1BQwII(N~T?kZQF z9-bXQBOSPT$u>EIoFCapuF^pSb3S12J%Tqgo^?weVX2~Y;J{DDa7l}C6X2^qEgRds zl^+RZRQSEF|-WvbD2lK!0yZlc`O#KBA z@VZ!3NKsmJekLwtE)9LkwApsc2+#`Ga4b9UmsVRx4(YXuqNNx2(e{XemYQEUY2jeu zL84Nhi~ur?LZg~J7F4acrnMwhfxwVNQiYRTRXgbSch8%fW?9mTgKg%v=y|io?Mh%t z*Fi*=+)`yzy3x0!Y}`QVNO}$=x*mLJ;Cbe}%zG7eKT5AWO;(w{!Q6N|hx!8=v7Nxj zObX{Qi{Mra?OHzIBZpatNgUuNGEAM&73;Aujjb&VvoOxAHZ-N^cv{XStY@VBv3^^f z>lPH{Z*$a_w+~Nbc7~enS1^Ew2k@@5SK)%Bua^G?PiANUp8G6qwYVN2$e%w3p=&4WEmFx6qmJMOK zoJyXFC|K|-{|6|p6CWPpZ6&bIoDF(5H#qD&oWqAetYfCZ5cXi9ttqTD+=ZT0y zT=D?>X$*uTQCfIbhP7B0Rn`%q6i@QRipG^W`|i|DlPrd8Yq8W zdk&8tfcqJjnwTkYNv%e?P-YjOKQy@5K8Rca^r-N*wxEtyo>I|6Fj#uY{5VpB#O5SR zZWY8K=*K=80HzNGu9%$^V-3W8!!95pB_Wf>Az6!C7;j&)TsX4df`(6;FG?6Mh>IUD zMuZqHMEGy#An275CxJvyNRNX*hk%ZO-W0IWPycX#Wben#55jP%JXCCzZ)Jtv{+w7X zsf+t!S;SOZ>_el#6I`0L0d&SM&t(OC*(oa9KOTbHkqxRfcosc}xps)-Z4}V7TEOPe zpH)}$Gbl2L81Nfe8pr0o>2MSVqse6IORD>Wjq^kCIdq)bs}i)Erm1$z0}SR7rlEm_ zi48lj>3W8sC`S^fr>f89#ltzlJRY6LUo4XghEK44YEbSA{T|};=KXbOBOtB+)6Pr4 zK*3>r;bH4xXlPG&;O5g?qZ48GciufTyNIa)(J#@@piW5 z<0ik1^rGcL<)IrSsneSJ@tQHtQk6%wEbstD?D8MlpF5Tm6Ne`wR$HHsjlLD)2QTQ&@?0g-JXA;t?8%RxO-MunB8wmz^7H-=NM z6Bj2_1vf@jW_p28JXRcxD^L1sJOqRktBkb0eNJYwJ5F_>Pj9SjR56>KaMLiQKVAPo z^tKd=jS2gllbQ4V=b16+??T9*ldZG94d)|@Cs%X~$E^Um)Yo<8b}RVP)spv>D%eh^ zSL%()IO&??6pavb>gNM0DZ)UXK7~CEWJ5ql;uJ~A2}a5acdhcrt2Z_>hwyKnepR>2 z7XXh8iwM`$1=2tyH^*3Y7^NhmAg`#j7|Z^Eby$>Jo?US0WXWx~Qiy$JWVs2U{ILA- zfiZofGcKEQm#z0?0R;fCAfwNo{A5|HO!R8`Z9>BGZ7qVI(e;bMe}#XiVZNE8>sL=+@8-Vo0TWeZeA z$|Cg+hfpZ39j9v5x@u}fh+~SOhUM~I{DKXrIL91iXH4vlSMr<0ixpL}fuIApHQORL zB$kg4i8{7wfi3Pgy{=F$Gtlr{H}ZTp5Z-|NH@)X*H{pSf)x(<#vABg?eFL2)?v&;g z1r2-Djbd8wnD)1kDCAjL} zB`bPkrs~Ho+x~1FTUI=MXwXZavS*lbwos>&_7 zg5qTCV~*2C#$&UZAeld6?GqKM+r6F7-tKyIp&0r;*QP52o~G?+yHDTi>HJU0xPSgW ziCcyGi&tuz>YM<3k-~@=f;H?WxgSS7y28RE!fm^hYa_`1n?=^_uYZ(GbC_<*`+5Oe zgSTBvYP?rIK(oMRa2;uA+8$!?T=FWKvU@Ax(ovmUI-OOK*i%SFMwwQ)+`P6Q>i{Rd zs&?57JfK(Qw?Xw+Ez8$bRpGOqJ!e2e&4%u0S4f8vcA@9hj%KESKt^3 z;t&M+laK<9mNb{b?s`^8NJ#d)y%u-j3Di8~F=ygzc{e8yjuavCb94G3!eSecY~x8~ z)rFL8di{yTp8$8YpgV52Q4vCCz%ExIhru9Yl6aY54 zJl=$34O{hFBcE&lv9w1U-Bz3)gBV7Y8iX;5GV_Dyki8XP?r-fBtg1NqrJ6#gSS{`U zsAYfQ5^DPR2jyS3U)}#K?ceda|I*I>+bR8bIsgF0fBZMOFO)liwYo+BiMr2_d1}zR z3jwhL4w#g&G5k9PK8^W5IRKQD7d=twD!ty-G6Ayx66y=W%HJ^m?<``XUO%WIN6%YE zG<@+UTHm;@FPre*Cac>%&}Dea{OteE=!AO2#$50>uY9wM0zAn-l1J_@RLUs-s^njs z^tVY{jmrA)eB?A;_UMj%8(?N+WNc_y=SrmL>@xD@wp23PcyRoaPM@72`QtC_qdtGX z_xHOSn}37ii6Wu96vV$P`QIMBN4U@#qb}ni*5ARiGw`D)X<^mvrrB8y4F<;)mZQd1 z5wX0@)YE$-MCji`rBoK=nt-1jg3!=lRZ41p^Rm9S9(QTCenEN7ZD$Q!sLRDl-QDd0 zE1X~dQMt-7)Mp+0G#dJv^K*L8a*GPySc+eoe)m2Pus}lM-_S_7G4yCR&3>He_)oRM z{)TU{@C}oHL;uqtg$rjEBiFSZ>*vAK{?ORN+YgEF0|Gz*_?s2|{%Nbk zf1H0x{I>631#{>UWZ>pcLkce+RUSt78UF{reKYcN^VC08I=ig1{>J&=Cd=0t?!Vg# z0017r16#IRf}eJV32 zFuU6F92rZ(ZnT+YWQcD5_waKA0${@B|E(RAzJah90-$4I0RxQUIk!)`atl?Hl5b~( zf6sQCqKD|GPNG3Te_sIif0#~RBIv_FlY-~~MtoheutrWQ`U0P}O__qQ{l>10dp};<*XvG^swwRqV-VsF^?3b(Ut=J2+Wnb}agN zVwDN=^?x9Z%gaO9t}a{$mh;t*hs_iXXvU6Fts;#Ww-EKmC6pIQI6H`Ss&1I=WGq?R z|6glY9aYuy?JpoHAR^t}AYCFQDWG&-y1Nx=>9}-C*QL8#N*biOv;xwdBK0ny{^I-A zdjGt=?wUDg&zU*Hp1tRMX75=HI>xpS3vV+_hk{syz9HN2fr=kdRDguG^kU+eupH+G zd^gkJnp{?~9I+M0F_Gi0hKn5YT677fK+UkN;hb|*FZ7W5RE)t%4Rtz9C5qF^AKc=F zCoK8y^TfIY{ChteC#+m4tqdGVeEV^6qC=x&=ZG{2ieZ{S1}cPe*=hsVcy=mosk!Ku zC>uzTIM^?_LuBRwT$~J4yD<9|Z~I*RNdks1()*PuB51XAm3AJWU&Gs|G z-|$inVh7XHGi#+O=e&-a7=R3+Op?4`;rhkEwY>oBy7Zw?W&V_`AkGZwoN1l1Db^qI zb~AE6f}Vz!-Huf?;a-}Qu%F}eBgE&m^YrENq7yS0`9A+U-Grj zFAZE@>)PznB!wOysrX;Qz@*HK{jan7KlM&n?W*KoUk9VSh{S0jtk-$+}rr088^v(wc6$=q}tBzw54^*B^Oo^EJ*s0vZ7!?U>5YIK5d;$Dkbtg`6Q-4r{kzb%P}$fOXWJ{&1K_Vg ziQ38KdNGEJ<)(YaC}oRUq4B^fP42fP$8!(^(=#VK&OA0B&2_Sz{Q4Z_?jxxvhL*Pz zfv=0kp$DvwWOl+=uCM?ZA4|HlF1W@VU4|)V+I^BEnB)G=HL$*Eqn z*P_bXQL;7kbZ-`_5Vj+{Gy79FZp1zNQ(iW0iI0+dlVO@<+>|l2kd>&pR8#u`HweB|Lt*73`l!6~nF}BKyQ4MAt`* zO`(tzGqVJ2nf+EqpGI1o#&`g2;4)H(GFeStUwlV9PO5;R$Q@mkO;$x-TRyo^DZQv2 zv#bKFWdhb*~hBcS??)pR#dZ*PD+aG5xv>&e)~gLKA#{?*6N&> z^6arDg=QlIpiOo;%uqSz9R!ZAY}09}I;$!zHD-M!%V77p(sz~TP;;Z(0IDkkDZo|@ zIZ|%HX#nLe7-Vgh%3%oscX}#?Yh<+@P04t z9;rakK_(26aFZo`0S>X?G;}iHwhDnHeh6<^!_?`2&n^;iIXodvn+iNDxs=up-|jIt zAfZ-zVKCDz7d($~*Z^-F70c}l)zwC7pXTm%JMezO1RkML`q1M9Ko31*@@jyL`Tzr6|dzYJN}*0Uhe z6$FC?AVYpc_6R@)0}E*9EySPpm_WPWx#e-G*+6rIu(!Dl;6?$^I`%iA* zT@GUFb}_xMmEOO7<}4ngr9}A5ku?LpneMsyS_-&-tHR2nM6Rsmpy^{zWmySySLfP# zJIyyy?>na?4MB3($1-YRR0M4_>ugTsh&Owts9;3rEY8LukgVubZlbp38sD0=qj8b( z!36*3FzY8xp1Z^oqtZSj8u?kv(PQivSRu*$fJ&DrVMkb%DG z=ao$9?vE|pep)^6gQD|F_ap22-n)yt-}}0$rewArH(SV+fGc0Xo;Ln)Qx7ar1RMbH z(@wIL4!ShDBRrvsen-n2l)G!rBbr3R7t_NnS~fx-d1d|+$Nu9kX+)#+@m)RP+GU1+ z;Do#Opd@drLj4y>{`125JWjA?mlFyp|4*tyB7ywpxC-Bjpn3WJ<#}@mwz|~_u%t#G zL_Xl4yL7Y1Kpl|w&>29aSlJ7|&n0s2({wl=U-ZxH!5u89`+lPbiJF{^f3o@9*l4MG zzF@5{XXVl<^|@)P<(s3Qp1he@ZFg*8wQQ|@G+AEh0?&Cii}t?prE#OBLgkHe#85rx zsUZw0Cdf>dKF7H7OBC69Rr>SOg|`W%J-aJvWCU4#CEE+ne+X%&Y7%U<4bfF%oZ}j5HK)#6woqhYU)%Ya!zbBl8VXqMsUj1f6wvRL_A*Hxn$TA(>E-Em0P%in$L`-fEMg})`%cFt zu~VRO<-A1?9>D4i17N*t2@jR#!1qGyO9w~}C>~?E-6ykYnHqp*X;zNk`BBW9DMR=f z2Y1-x!)6ejVuq6zsn;JW?w7b-!S~5i@_o9^)$s4A4-S3`ZGnb73&qbeL z!FY1j6aJKWeMdjPH>FY*fcRh;=%QVXH^q+jX17nZ8}zIfRUS4659`x;z!`;}GL zR~Xe6@4Hl1R!_bmHn43P(?N{eJAjHZbWE6|F|pqOm$whcjUR=8KNRZuSTyy}y_~w- z96P;;4gJChwL>UjeB^+hj(kTJ|0a}&Wz+ApL{6~<{|+k0TB6y^7m)w}-(Xn)-cS!3 zz&kWFbbxG@Kx+>E-PxH7-2RU_DC*w{R;oMY-e{Sdf7z0jeBRSWNogg9;+qG*<`)e< zK2fySCGjHBZ~A(xS$jTn8ArtY&`8Sh3rajw%u4t52 z3(@Yn`alQ4dwRB?{$pC;xhay_(>;EqvoVGEPKcpqX|7r43a@HOXqRy)apvU5MPX(c zk0I{2ZYyS4`wU9qfc%XL1>iD5ex?Gs`4g82kJo$psMO#wE=p^5aU8;Mu5?C?;PpE= z(_bp-hUo0nfv;aGB`a+{bCg4&QkbLDZKIlhR_`WF8Ua*I!UG7Ct~XXfdxzxl`9ZvQ zJvD*>jJ!bv0PHM!{u#Ar`YW z`y=-9dF4>lRJ{|Yq`;T)Mo7CcJbid!GA2R-4qyfl_C)|dC1C~tjNfj!2?9`(<3G$+ zxeXsL>m0dJ*Gfr$+z)#DU(%;(+{gB8eBc0ffMKYy2q*g-|JIIsk+*4K-sg&TDfjvBMCxJr z{x3)h>-7CPK>1iExh(*Y7>_9X){Wacm;hk+VSi(bQb@E`9`gwD zr#9Ki`+qgwcJ8H4%knji=OPy>z-stm(EftSW>`I%gd>I@kU6E9V#%@3XMU=hytbJM%0<_E3=M{QnISn|jluh8Xk9 zDb7k?=P1Xi2qG5Yr922&75k9>%;_!yDRxag0{gA?vd=P z1J8tvn-QyOg;jyJ$5}=;1vT9aMHDs65TQ9_guPoQG{GAtz{x>SFCAxvy$dE9c}346 z4K5u$SD21TuMvuB@0y+s&?VkBRQr`1;{Jx%$13E<;s$ZC@o{Q&N-A7k_UB*b3djDu z81OXMGp&JzYmTUSi8Os)<&Muuw#0e=CkoS6I<-8ARYj%wp^ETQqcnVulwx$Dav_~! zTw$~_whDGg;cv6pfb)7~{rRt+J3Tlepy@7}q?!(3_4Myx5DdOW z<6!g+tYg>Z?Q$iRdHDr1H@Xl=7#al(5i4wgxAf=7hQ`_x>opS+4OH56EOe9kw?$7K zPI>(BYFfH)>OZ%BkDeM_!}DnE&}|Fgg^`wT8g}KBXrM{kTg5&mXgz8bgr8k!MYDBX z#XDE`d9pqE)WL|(pHqV4nUblYM0kRUZ2>q#PDei9mTBOyL^Ach1+k7(yc1x`vs} z**_#MwqQ)8<}R+hrR?^O82Ya%4ZTP4-j>CiI=YRdL|4#jnEYoAjdl?BgIJ-94%uC(ogCuXW~v-ZI};L+biho4C^x<*?Sja4qnGrwujm-UI8#>RlCzYCFSHfeH_WZPjiU z0-OB0Z@(6W(bO78v64qlIA6+q#df{h-LQe}%DjuFy0!Pz;YHmxZk=P3%A}LCjn;yv zkdDCH_lKQr0E_?s?G5YuxZ^#y8SCzjpMA^F{)Geogskp4y-?`!a(?CJq@#j7?OPwc z`3w3yvlBMpyA3= z_QT+v?7g42UF2~KrDfFlWpKm^z>+-)`24f@5#mj8?sG`Txy!1#h41*D& zGi_)!Ur@tlQG9S2WYZ^({-a@!6ANp<-bs*6Yys>O_5M{#JL43pv4OH~a92S~q11s< zDy8(KArC!2Nx`exEOhp2LF3o)QF$nRqld}~p8_ca4!;%o@t!Ul`XzkOrTqCq{E5-V z>$OU%0-jxb;`pp2MN5%u@igvk_-C(^84XNo<{kQ`E>*8dwrMuD*RV8t#yw0=E5^4) zbTZ{c$746$_u)NKvVMg%X5%z=EpIB8%GSDj@`mrF4f#+#@YGD8BdEUv%VI^QQh!{2 z$}7otr!iEWxD4p%T8+d-Q?~S35A+|g!PKJbzkaW=@+cIc_}~!3 zE9f&B5>>qB(<)M?z=roDpQ(b&%aU!Hxv%_0YX&2jB+K$>Gxi*Ij~NY=ukb@yzfm%e zRlBXi{lquSM9uMnt$fZ$r`>>=**}_A6X`EH1?#D9&rq8fbU9F*2vcelgXSL4!#3oQ zpDw?R!TSru6>E}vx!=#Zq8ze}QWQw$0SGm)mKk|vu?bo4IzyC(dos&Rj;$>(=+eS- zkcyXCMTBWAN3b@-lG`J|+J-}hAXS(ku$+;1;*p(3tOcZlwdOoBl(6cVdb0rELzaCvgF4!P&#{Qc2W3kuP}4szlmp~s5EX_gIE7pCXNv|97q!N} zJ!yC^&=^JeLdn^z5tQ1x&D@1hPZngV-R(G#*Or8(T3qG38WUQ-7WOGP0$7x`p1#yy zLOzeXS0bPuTAEOJK`XAASHl9and0~0h8RNHgXiEZtr})7d(jtK4?4}tp6(A`EJRY? ztcPUpz>>!PDjmd~o@d_;NcL3T3!K~I?f(8*ZqM;j(_h!KRtK9Q%Ao%3R&$ixK>HOg z5&w}=s1ofkkoSDX)0#!w@;pX2<=iXcCEHegUYh-fJ^#0)!>xx%%Wg}q>Uy2VjW2c5 zf21=bGN~pne0OSiDbUjF;XXse67d`(q$@U9%z_~%xq(Yfyc`0h-on(d;8nM(jFA)CcuJu>v{-()t+;b!>IcqXli*=(ny-V2RTz#jZ?yMcz-`} zXzYoa3Y;@n8?!l5p|s9tm!DaXms=Wf9+WjSpil<)Qjy+%xGh-uuyilpv+ibx?}sgG#E6o_T<@>-mICR1bsSmmYs$L3R$`p zQHh1sR=?zcgzAB^XMEv;y;2&K%bF^*I26HbS@12_)$@-O-jCy0Wb9a6Rdb_lVTzzV zvr$d(*RuUZw$zPTCnx;{V`?>SyMELvK8NC+#09Sb+y_4{H<1f{P|I1NWxNhzKR?Do z#g=b%yRfxAg)k`7(}K5~3fr%QUnhUwl~JoSue(|!$$&D2h={=aQAokqN^SuqE)u+E;);#hMuzZ`l>v@c~Xvj-yLl3 z2{+Z2HN2j!`piZ#i-qD*_2H4~v4E6}3!+&u+>!6knqI7)aTru3Uqu>0P&`z%qGMMn zWYlv>XF;m3pbNcX3)yIN$)wn`4C5O6z zTD=!W5j+a)I!P2P>|rK8oFJA{i;G%^C||x+J4wWoQ^ZO2Qz8~fReIxV&yKTn{%)9{ zb1gl6ke{hy9SE;4ijS*kz5;2+yw|cg?r_WF{(CJ{p5-kaDgyj|pq{%7#ShsSCizVLQ~q+p1SjmN8Wie!fweB4HR+r+dJSOmxgb_Hsck8=jlq zmgxPJbMPCdb{{JNH@vj|yi663vE<+gf3su+RWCwIi=utsRr7#eV&}R@oxvErX1(V) z=De@Ci*{`9opTaRrY{d2h@VSXs2O6dTC{vs`6ikC!3<}%h=<&1Y>6Eh z`*Wy%=dsn8qbFhA7bEJG5qzxn#HYg)k2o+$L>5=|Jn`6&{150vBLORkZShmoAm!{{ zyAD13P_{_cEx#-z5eAT9cNwhKEUi9o*o~$ZfZhe^sh;Vy$rS_3?1hKAg9!ehA;pM_l1&$4w6QOg9*y=4!lQ$ z4Wj}AW(Oeyjg>_WZU+M+60kLOG2{kMqJ}Ipg$t6>c2Qd7M7;ZQfBP=&d25mE`P_`u zpo7a|N)Hy7g)>44VuB^I4cE)`*KeG$xM+nZU^a^0LA!})bd>y4!b9`$r3c;xJ-4G& z1&xNF{|fj&L758R)!({(M0o23nEh7!nWY17n3#ww2!qn3)H4l*v&s#O!=%}0w-hE$ z(lw2fk)p;#dqmSsX^1B%MNBG=%cw+DTP0ZiJ&{z6iXahdZ#OyAy zi^88OH{Es=A7S7iEz9<#enexi96KHy1S1gRy zVjaopRxSE;xrAmO&0xpRDOpx~9(iowVlgJDHZPTb1cQ&3kXAW7a!Q^u8WB}Ly%%9& z9|$#FrBVE+b03gy!S5}G8xn$Am|@XE<>8V#lbbCafiXsP^@a*>*{mh~yq&*z^JLc` znvkVJk(7g|SzOLZo{QnUQf%`0#56_A=X87AO4Dv}d%6w0Siex-L=*J@p4#rVAziFy zR*e!<$b3f8Q|=dmIZxYcU^t5OH^Lk(X?h)6jBx*&H|GdkU$DBdQsd?o(z^PArNwfi zLKStcvW6_v%%_tyXDlXCeP5qGUCNe45BSo8y`NEG!hLiW3gTHy7q1NE4>2^j8pZTt zN7O7!Dv0L1sO#_NsXyEo$}jG__IuU4{h>YWrHM(reZ!P;Ep@!vFzvhjk^V?usK7+5 z<~&P3n`5~E&6xk4tW~Q!h|Tz#rrkP+#fm$)yLlS+E5fhba`c?k-QnFqA7m1EcS+WO zxBiYe4!YZl@j+qdbmv9q!vnq9I^n+C282Z-hs#wu;o%)@Tftp4P{(reDzYrsfLlre z_dp|1j(8Bn>{CKPj1MY+;g{goU9JVxrz*fm2xfx8RvJO=%aG<;~sea#^n?YR{}u`)(i5*!fDtD4=1 zt@n|xl?c4&VK{NmXWl-H-(&uwe)ly12K*ucjQ2Qv2R*oj;OohB^C>`lk^=Nt_=|t) z%enKTxGB@3Wm){quLnd@0dMCQ#8cFJzH~o#t_9(R8T{bW4rz(!6qy4!n<9d|>}4tu z?1$mBO}RfGXMmgc-?PoK+RuT7uy|m#=h3(nsR}gVbM8VefH@7NC<7Xa0yU)C3R!4uRY!WJ)gp$V8MlfVWWMFhim_wpibUa6Jc;->Mkzzh` z@ucPG*mzd>)|shWjnU}ZWwM*uPh0L(fZvWRn$=L|2iZ-8or!Yql%3ra&M_8Q%FHYo_YIj$@5mJ!rvnU z;jcYIR1QZxNS&bI@aS^**!^_-S@ju>wkY`!x)#6}uYZ(312|~hsyFgGx z&GQ-TkkhN&OtL&IOelm(+Q`+`+-6m;i|lCx-S%Hoau?1hruuW?A#YbGC7AX-7JRyu z+H26QRt{{_=M~HSGCI0wK<75Rv83G#`F;!6W0RMF7 zrEs5FkEFpZ+dW@go@fL`c3Y`!GZ2qr+dtP;m>DC88OQpAUsYLAC{R1OSm(J=0>i#b7$cfHf@U<0ULith|M?6X_jPK&lCI1nm+SvwMFE?6__L|2(BO_wwQ@8npEknS>CQSG&hI9E&F$tCm7z}|``tfLU*{%MPxkMkAL&i%qHMFWiRta`V zKp%VtsL*eH1cS6^bjH)TVmc{GsaNoBsY>2p;GY4o{r}{Nz!bZq1jHma+f&<;cu)fs zUrXqQS8Ptstw7W$LzP6GDw%%)=&#Jra@)Is-aQ*Q0Y)ty8$GDTpmg->X?_ zXOBZ*h&p1V3MW&nd+_`{;5kTBb3Zeq+_$CDG+5_uzi2;QPON;Kj&G9hac`j>JDs)V z1Q@}Bccref82c%8$F2mGfryT_x7J32lmcFBon2)<^t1YsGuWB0am-4X1{i<4IJ|%lH>Z zJBCm*Hw}WS9$3cvN1$|tbfYWFcEbTrFxVg#X8jF9ql^XFN)ihv zLxPWQ9+4B5eInC4kw*|prlAFsF#3|{IOfvOgvuP(=p4Y6`Dq%sNKugWO^Jhp*STRD z0K+}nJZe5Ww=$yjt=e&^K4hhRwzk67O<*Iw^-J$;y=7;=ho}Jw0jUTX1gRV*gP4PG zgxD2#Y?5NiLCA)ue8Ns(PN+_x&)e(6>paNK%(dZ8!au=FEx_ex6p}LjlJJnQINmw_ zFb}NZh9^;&olqEaIjFZkb0hb{&8Nl zK)bLfCJ_Bg{>dW?bQKaabZS^;5LN$X;AXHl5=m)JYR*$4N%zDUsC_@G!CG<+9FUCOJC-e)i;IASGX9ASrk6jM> z88Fn3;sB{|=|_|6`wF96Aq5$M`TGavm*Ayy?T7IPM&9YIwujP)nOIrasLWZtuu@i@37>pZbM&fE7{#@~y^^?RCyoo?$ z0E@{Li_i@5l=qayOnMiBfjCKyFju(;_oEOX&Qdob4BVW6iHy%H-{K(UTQn%yliO6GZquN!o7Ke83jZ>Ab zb<5R;of$5dmkh0jsU>>NMC*-JsqA^();a^e$RC2{%4XU;`ldCW zY~8tig1O>r)weZ>Xl84ke{<3js+5!e>><2NZfjdQ_^&y5wu-2`?5ti~xj!TF&uVR# z2OG7yJ$J^Ye^zZH&RvUMwWw1b7i7Cz@2)&+Fw;cJ8f5U6f{-w}G3;;eTBQh72~%Sb zDsV3<&Y-%TZS1U~r+0T!TBNNoMBIebP2AJxcq@lOX^o{yO(ILn(Gg<{4d-5D3A7Q8 zgmfPfqpwFjkzw#i_CgX~^^|GnrV10%ik%iOUdgYW>}xv`k;jjYwe8mTdY7y6GoLZ7 z3$;pWy>%#-kuN7-5}gX+mK7mB%&MViM=HxZDc?~XEZZI*``x{uP7;8>sR%)#AAMQ{ zE@W;$Q<3JzV#OuPp?I)?Z^_aIJvBtIrxUp64Xc5GM=etcqG5vA&y=`vXvprxri1k^ zZ^n68DIiVn6vfh5m6txl5>Il@&bVL-SoE|fR@CHXY3AGqON!N5ypZle^7{m6v!o#x zOIWP%<_8kW@tOfN@bAmB-I$TvhUU;w7Wo+-t7@K<0)+OA7zlE?6ykV*6l)L}MMV)s zBO?|IZZg@B5{-0{U`32NK0^9qBvb`#E6{A5G|1hL)r?mJzO3}zV#=VxihkT~X_GJE ztm?3K8C@`D2On}X3V+Poc&r}(OV9DiZcFq~^I%e7FMNvv{5MF#uSL_*ICou!ERFE| zhX%?*R0w3`Y4nb@)0YEa(Ew+Z{15;1;9!wTvSllK#Lb&6OK#n#r#PBsiYw8l5%L~C zEn0mzuZh?^I^bXI6DeWKjm?s80I_70b1yb?UVv?!0j&y950 z9mnKr;D@}QWWPw4d2ydru1=iFJ!tNn9h_G4xhjFKjwXrhQKc!43!K=Aa5gp$bnLS` zyp)#nOgb;meYPJqKn_VGgf5%fQR&na&iBgE$R(=a)^V2$lMRnnIX{ez~ZJ# z?&D!l2Te$4sbc53@B{G}6bCvoiD!#hZgJ7{4tj~cX4Ry%M!#RH#q>6M0c~xIMKrlA z+@V7%Jd))6O1Bs!yys-K=;+E1VlIu5l3LTu^?0K(ANa{!ogQxrjlu@HGO0cRid6+kbPFQevGys}V3i_4qsVxU`{7&()UI267VW6RUYt-idx@B%w4J?LaML zVsz~>VP3B36<|l*P983Cl5)|>6>dF_2vwy`5%1n3$aOG36$sUtv;fgc99r}3>sX9S z=ZOt{`=J%m)n9OC3hmyE^=@MJg-gaH7{z)>fGLfxvLP;RZtkB;{+5`Q$(rk{v{S}L zC)Vwixh)wQ9bYg&evpskEGt>~ZVny*fu6ZR)R?E|MMgowK4%U^+3 z&x4}h3}`?c_+H;3P%HOZ4#C~YuYLNM{BPZ1*|m(v4-Mccn@=EDB8=Z$f)Bt4c%m5E z6JrR6qk@dm%(ZR9t^G0kxzs0LvsRk%a``=gz`lA^5MIcxd^I=pIXw=9nRaRhI1?f;^hFKbft5K|nxix#;i1)+VG0hy z5`WW{xizr8daE*;srBhm=!Ntj(vY@GG12_XuAAoC@qEg5-=jd5DtSfce$v9RYqzUu zUY1BE_1`ppOEpSjPIc;eCO!F@7LdcTO7B2azX5sm;b}%bD%N3m3Wzczg48p&l3f^^ z`6Hrw0D-m2Dew`Rq_{?o5qLD?(+E4tggei20erW8TZ?QA{-bT?a|CDEnD*Q+ zwypZP&NFu1c3mB~JW35|t;X%dZ2_C55~{$>?1lWAuo*4L>(U0{2g(=qK|cc`ai0Er zauG08C=3$`JiB)zvB`g=mkynuZ5hQ+y=qf%qo%`^|INvEuX$Bi>7hLwy^2T_*qf9q z9tN#v?%toIkr`duG*&c?chWY~O*K}_)VfXK*iZlAMSm`Z+~S`Z_u6`-Bo2;eczXKr z5;nY`9bo6M$n#>m7JpY*bJg8@<(DULG3l*IU)jt25u%!5pjD?_%@%Sc#7nWi^KtKS zpOAS8%}7`gJok*#*gwlre}_>OjYogNgxrMc^3OujEFH}U zm*aS_0uWA-zw)3&Ix;CFIZZR`Ux+B&N-b!-pp_hotClu%TC{v_ zWK_jXpU6gyTFm#xwy}sqnqJ?gaE+*!a@=a};X3qu(Yy$<98Hx+v_4g|`hBB%B!?)r zN~;=)C{`8t#Yhox^KI^4*kC>qE3DBp#5}q&#DCnH7kJU17{-CF->u!N&MS#oWFORD z8fMhCWey}=vM>vp6eV&SIkE#2OcguIE2X8bRUEE8ZY=e3a>fl@+!wDGU54W3u0x}x z8AD#6S9hI@5}U#~0FSxX(&WXux?U}bs;XK|8T47dBpaGb5m4z=YIdQARjG`L!M(G~ z5d(LaEuQ)jlw8sFtS=RiQAA!iOM(;T#1xVM6^qBEsXo4-cjSw%^;p7LFM zpMrfTrA(GF-&h|R{0mO#vn=ZR7FvVJwhVYOPmF@Jwre9RoSr-(MIZAAR=OQFcAXOV zUY20Z3Hn3ILj`3jQ~|JQf)O5b^zI={;p;v^?w^HoB6)YFFM5_vTQXe%IqUj0GF4Jn zuIdV5?^H!Aur@2ZrG46EiYw(YLXPWdRK|WtFdZ_h@rt!hehMaz$|c;vhxrOwqcHUY z0e?sN=5A5Wo@<*E1Vqus1Oj9T1sePu=Rb$snC5Adkeag-$nQUQl6+n;Dr!XE4_05O zjW#r9NoJn|-Y;#cKz-sjz2-QDv_%*jN$s9^J_U-~#pWHlQc ztZ{t2Kybp=yR zAbhJRu2R<7S`!ee&A|_g1727oKP!kR=L8XI0xfNMSG>!>JS{Y2qR3m{Q9W%&%wD*! zA)E(I(ebGKXmjwOI-j2iHcgBW4=cL}Z2Q66Q|&0Ei4YUPaL>mL1s7BD#W{xM*otbd zxhBjZ`@4UTN}Eae$G<6;DyM`LK~*0cM8w&?81bpMN}Q<-ZbMR}+6|wCXjNM346}(( zll2K3ST9Cg%@6tNs~z6DQPc;feuolBQPrDd@2+L8&|My8T_Z=M?dNlx96QJsuF5@* z;F7WBDh2%+zKvrsR%PSRI=%EHbLY3&ZtPu!Wy!~vf|PSYu_-@B#?utJ4A%{3y%K-3 zZ!7CDmvx46K%~Y8nFJ) zzx`jp`>TKOYrrsqe=$P9vA2+Pn2^;kQH@}{9@97#nh6F%Vl7O(u*9*?Lmlho@i8y+~m@d5n;A^Lu~fzNIcU{U}s7k24>C9Ph zhpYlaypPq8W)-#RwQG$SF~AH2;*#wnQEE-g5<4(reA$-NN&X0Kh(6Y0b8Q1b)=6L@ z_8~TfvgnX4ot#&cHc!|sOWVj@+b{h>@_eMMw_E~@Y5)AyccGsX5Z?T_2d76xKQAE@ z_I{DFV1;bZh7;l&%99d!EM}MkqB_nD+g<$^*vECOmA7=(B080y@*BM4Jre5;)u0t%CL>zOdGk1La*;O*`%S&&UvZ`xkEcM~PaVnBCP)-FfzFso}74 zM%XpIfaP6EY|zObku^vVfaB+etV(DQ58LQjSH z)(|klxN-JZJ&}9nPV;wEMJ2dJxl%&ZU*+;4GAM{iTK{b-#$v;#NUCXH@mJorKq@O?@Pr!DZXREPrdTz)f9oKNfQ_Hef5!6Y;9f(dK9RhAaeUr>eentjd{6C&2O}PS zwdOXDF~gt7EhMG6yMAgdOltAzT1uNsTM927)Bfyq@OtY${Aj&kX^x}h(c1IiqY;6C zSfPQ3qO!WJ@^G4ADd1a~(O*VceC{qzQ%!B-R<*Qlb&1YkB>S|3W=dIJW2b%d;t+m4 z%y)|vjO$WhPqJPx7j$V5Tsj$@`PkGkxdo~fvKa4a6>tjuRNwBaDo2TNkXaQru5kXD zRiWC?_X_;$ogy3yBX_8VA(Oa?6{CFfb*7fni)sT#_42P5HhbLlZHCU0tE+1Y3-{MS z|B8X_ROC6jwO}FW`yqGIkk{*L%8L{ny7pWn?O|y$U&TI1_sWx_bAz6xw-x;b$~BDyIQ$uWTjk^^at)xi0YKM ze2D1D0u+>Oot_AdhCCH4NEJwIP$oEUBS|#|{F*!vV$fA2rjrRi6ZJ`Jz`E$-l6xqI zHL|bNJD06+b~PbCz~iVI@-{dFzBi2Ihd19C#tF^l%|dCU{wf>xUV9(Q;Z56plbD^e zhcTn$PmuL=(o`U5f3^UMjg5){zPm2Uqw`!WmUx7>|i8~ zTWYik#OVU>4qAoX)~W55S_A&hU)vh(xqpsbo$z)=SuS3EGj;+9r@Ebq<4uev)(x6A zeC%PivwE|qsDV)FsKG=Bcn9=GcnPA}M7@$)^1|^(Qdo((#}t2ZYjU9T0%nEH#rjGB zz3*RN`T{?l-*SyO++F*0HY=JYY35t7SCX8kuX95ljl`8KE5=)$ruHk^L;wC=trvDS z!rPE;#oUarxA+JcRBQ01)l96KHBH%$&Js&ycxAKH`8{96mHhlz-E!6&gi8&q322nEZ zu4-84ys)oZB+az0TV>t+1FB0Q6U*csp;@U=y-P2O<+(_PD9c$mucnyMYO!7_kfDqq z=$TEU?zi*8qtZ^t@kLN29v0evkq$6-tz3GAZmH@!dpCyl7H-4pg5t4k4vl?qEym*+ zkya>{_lqD;QS+QA;e_;_PzXU!(+AFPgJx`rejJv;q!g*7+i)_WQGn{!?tn36=sG~~ z+t;>>VuJ8aiqr)O4o9L_?R~05uVk-K2tpz*gk}RWzac3RO&$ejRt`5*z=19)fs*$B zsexY(XgdUXaASA?*h?Kq*;fS=C;MRSD~ljGkikpQgxNeYtBZAP)6X%?t^7EIT2JX{$Fx+L&=Nig$^;wgX+dnP zqs&ZdZ>XRJT#MROi;{^C70m|MM1+eDQ7)^I60zpvDM4-oN6i9`XKQEGy;SO447)^r zKN8GupX&1w{1_t? zk=lpV2hbToI6cWZ+d15?Z-U3JkvL7}jiL>W`f!Z|4S7peVxsu_f{9O#fd;otZ|e%C zOOYE(+$<%B7$M+GM^g?URt-^Y{FDi6le#=9lAR#YnB?rEQVi{rZ5nNe7)C;ABG4f0 zGkV#w;VhLE3N7fSl3LV#%7JfL!E361?M58Jtv`0DTe_;Jz&YV6mNn=#r@>XiMr^&X zD=aciZpMjDT{MFr5%Ib$r7Q5ypEf)A~@w9WtXUYM(CkC=RL@6Q$WClD_#r23#caY#K_A-@d2XHl6m58J@+>t>T7uSCf4W zYUrnISGwtP3QJ1Qy-GWO^o}B5in)#%rVI5EuSyX=Pb2{Q}Kkiwd)u+{^*%$81^q1RSS5XKLf-_Xq zM!KxW}(?y zWUYwj$rrPBR5~;>Ro$=-Hp$0|f4UMSC!lapsybHsq{P)5O#mjDaxFfLaqfAVhGGN3 ztRIKX%E@(A%P{5Q>i|?8J$p;)s8Ugc28Cp5PaI}a?h~AGNPfP&Gr!M!)Pdj9qV!5^xo6K|dgnL`R8 zcy=@ldC1mpOBp}gNxL%F*b|o=Zn>cz|21BmK(iIxx%on-2vot3vrMg^magwqct)T% zV9|6F#fz4uYsFG*B8we(JA)Mp}XoRmwCDW?6(h z{)nM5`Rs<|+LjP<;h+^6cZn=Z_ue2u_kbk8wfRJHE{DR#fh>I^>keXkoEOjNddrsf zaD6i^MVl!N%x96d|Fh+0q&;z5y(INYXIG+dDy{jb)xfv5wbzNCZ|++{V|&t12it{5 zN|RblP*a!ClL=8<>k~7gNxAS$rRAm(*hbboIaSPW$qWDfDLMxdImgxjjS#Y^sG(nW zcNL@+XX!|}Xi7<&Ux4c*$s_94rsN>op=7QsRno5}CBSW$A>1wcGplKT_Oa6+HoZoK zf3p>~imGl}PJ%cz*B|IN+oDG`yEhO@88JAv>;0nZTgEpTH;_w_fp`1%-mm6slPjCF zIoq^#u@l45VLQP8EFzLxm6Hk$+vYt!_qswJG2QpJa3Oa+=qoSdpFe+1@oEI0u*3Cw zYn+*?CZ)t)k?hsz{4-R4{H_kgH}cd_vG zgpo7-;mkauIfLe6j>bfj<$8?pTY7F%0)HviE`XfSzw@AQO{zJHPE<=}Ucb9q#Zh>= z#f+}LHSCX#K}ZEPZ`H$No;R4nEMr7ZzP__vI_|Njlzv;B^p9^EgIjS5uFg0it%rq) zQ9Xv7He!w)nxb{~_hEU+2XKzZ*28&yQIT!dGL$!~I6Njr(F(rwH6RA$>&3pz_?JA<`+$ z0$?Gdw3pgrZcZId*f5D7r@PnEW{vysu91jjfLH;iw|HDH^lqruwv}e$D(CZ;FOI$J zXT20zC1|pieV2O<&xgQ9_g0AZbpxRLP%f3d_a8;b&n|r+?FmqfUMRj{zlX+lt3=DM zaR38uu8SJhTJI)wl}9cLKBMz@0A0hM-V~5*<@dlB3ccSkdG^tfqwR)e&0g;VEH90* zImpG0_HV+_V>BjWi1|pX3IBErztl*Nvy-wlVS%aEJe}9XhqE)AXm!qQf-@hB+`h!c z6Lh70lVqg z*=-lcXK&yxEw+_Q$AQ`<*G;_MjN5J#CZTqXtE7=6a{ZBnOiRG`9_TBh8iz<6b>YJ< zRfH{i{{);VTbB6~|BsypTpGUotZ&G9%XKc{&viiFZXx0Fr;GAnT3&^qE{=j$1}D9X z5&_j`)<9i(zOTK#s0po4;VJ*~v69G|_c@o1#vv!f>*i&f`p8$q@R{0TA2zg0G@_Lc z$g9s5koCC1ZX8HyzHrL3*Ax?FOoMVh`LSXH1N8O^$p(mRpOaoQG?vKJsV|7HYE9`| zLBtCf-;cdqj17WJX)ns`Rf_Ysel|=|Jyh8KF^&ldcwlc8hIx9*^#<{bY+1HbsSLu<9-$=I$S-#jMmppee2i=VtrLHYJ<< z*30v3y5Lucn~yr>d~V@$fi;?foRVlGRb`fV)}vC*br&jo$0>~9!AHx>B*!yP?s`iF zGo+jHF4!x39w5(DQ)ln0|kJgO@ZTp^1avG+7poL+J0BahGFbdE%{ zUqG$Xd5At|;1fVo4{%a^4PFgvpr5rBpozc|^ia1<7pCR+7AhV6rMZs&jAP}^#$NKs zkD?uXdodbYUEDy^1xu(H&sDm-mvGbK|0;{r@^5a<$e&A76NjFi)s(Do(r(VFs*~D2 z!5KV~B~B2vqQ=@$NJII_DH8tF0yISKW1iM}VnAXSfo48O$j(on6^w^XP)|uDEcl)W zG~JruX+oiuac~G?RmssvB^94>w75N8?B4_2_ci&_(V#wecD?yy{B?u*V;{|BpLpKR zrJDfVU6pT-1AHd}^~bv-B44EV$%|=GAv4yH@s+k=q2N8UlnQC*;>jBoq^bmd zmo^YY?avpQ2UvG)rMu~Km~22p?_7GkWaScghMU)glM3!#HKUysz#;&{?c7TxjNrx< zH5V7?4x5_fOku=ZIWh&jWAl`pVuU<{c6LS;2j7f0K+bLPc_}xju<23>;s0i$k(Z}o z>GmMT9x3{bo#MxLL;+XTd z7jDTdGI%+iJ-3P&dl;_^tA~3Ky>wt4+(-MM>5-)rb#q6svESQg==Tnn4i0AGOG8^)_bHn4b+N4xz4=J~poThl z=9(JYk~iB_Ps2NQ<#9mbyKMyaKud`i5?C>g?oeKWmtGVlMRP)Dd^vdPg`_vJvq(>sa8 zlz&FVzD4BZJC4{M`jadhJ}o!Xz#^_Ih;1wryOBdC!ajils8hh+H;O*h*ipFv%g+eQ zK=+3-RU(`$^i!DHT@6uH)A~CWBJB9290fU-6QOu}8vU(gXvCTh~`N3u%_G3#JTvRiw z98)32rlOSV;GHcZ^TJG+{dJ3^3ezfb;sMmnh*j{v6K*VD)Fc+;r&c}Bv3SR(kKDf=;o8G%Z(%SIVz4>3tD6w$f5juh+x&;2E z;@Hf?2oN`7mvl)M?aH!9QZn^v4qDv5yW@Z#_4k#aX!!b@m$R6gxD%hT#jfs3Wn1{n zv>yDY3)2?JkQ!XmKP?b}5`{CQ#SJVGGA?XM_O2~0lx`|EbV#e+v>VYz&JE*Z8D)#r zmOE<3lw2}brkj!LBIKsm35kooYPAIc2G$qlL#${NH&RJX=H(aR zp@CHeZGA!TRs5|MA|F{|pE zFH2ojM0R|K3m(@-=5JFO0vbj$IahOm!ExvKz7bLz0%r4Z*tWRBAQApfZ_5sBIIao` z$C1%}VeYk(X);APL`cuV}@`@M9 zE5wu{3uey>;Pnt>xf~V;l6Z4w!jwIr4}}U9E(P80?`p4Oh#nXX_%F?X{b)u~d#k34 zF9eYoZke`Y`>JKLB8*A?llj*2CelCe=DrfsX20%VJEm^ct+d3&vX+GzExy=@E5n!lb0FBIzEl(tF? zP8i|yPIPfQm_3gc@sEB=-QM`OzOEx_pFisVT8~F z6OQSXDvDVkecVCQYE8F|&?Cz&%0x#$KVWe?^$+^nAD4?|x7#Uc@Vy64qR&ODV9EyAMT|w4nOp$(HtaGWzq^_R@_C@jbv8 zZWrhHcJq3B^NLof+MQamhf*tB{Pl8o216yQpf_+lV=xq!DqSk21KlmE{1ldv>3_`O zMvUCu25fv*W9mj${Ul=FS&%(Srji7R@6w8>3-_MlmDWSNg5IE*oPY>67WR;Vc7{z= znJdr8Tr*oaemt|kD|HG@RKA4^Wn-AU(l!~~xU^Nw#D_FVlB&;@Hmc}~bgMe8drIi>QgsunD#&7>!cw&m z@iK721;a#;&53wykaj0_4tgga2v}lhP$`^i&??%ceDc z5)~;sdZPgG>f-6TE57gwKkQ3Q+h3dX==kqHj|cGG~?*QylLVn!*1H zq4f4KGHh=A+0jXQx%nHBn2;Dih^`w#WB>lvd)-%TM)HnoQT*fFyE18?*H>HiuoCf) zny6n3-*c3COe2J?)cuHiXO!Dv?ku(I$wT^+($lhf`$6!h5b+Kv~oW&y`z1-TJ z9qAcjL#WON@i&RV8`0MhP5(hC*y3hj-(Y6ymmP3_rYxxQ%GwSyhuW|pPZS?9GPdn)uIOAJL zDOmo9Ol+bdIFMONuEoYnC;-EH+t^6kHLQL0MqEw1N5seqLv69qG=aAP!(K1(fBW$6>PNYOk_ZLqSO&v}!F%fDZT3Vo$yPgJoV)3R?D|KPK zGHGgIH~q>ZBQhZ>8b%3KByQ;dj+&b4^4Wcq3&U67$Vpe%BaJh2sJhgunzpsG@W<4K zA1yO3Ch1mOPu(-QJPQAKu8&)aBJcas`SHKFPI+71@ypgx>aGq#OaoQTR&b|&qmofi8{~cl~_a}d8PMc;QLqyGXoTIpQ}`O+wZ?p+ssE%XHA6c*j0@u z?+(kg{$A6reYu8sZ|jL*Rz>~^2}}qqA^;3m*~)UU+i2}!Y>=jID&x(eM zkxd+DN(Podi_JDNRxVmLI%ZcpKhU3CFwJyC=)8DoNLf&~eX~blUuOuN0H&d2ed($% zwe98lt3GS@#2?lghYk23`^#YMe5grKH$}88v3g1|PZ8(#EPU ztW7*rL=`M;Z0iXe9tuZ$sO=?R)@Rj~Q%d3X;z;Uaq@|HTrr%yKYGR5Qd* z3Fve6Ctgkz)w#$_?Seg!k=8RE3>$8aI9TGiwVAPGT@8eqx?i;R+r(Y3h8QsF;G|e+ z0fa)`q4Y`ae34{QcI-8NwwyOjRH;my?yF+P?>#ZKs|2H*%|USgn1r+C^$v>B8O_8# z5lFF%o?8T{JiNqxoRoHc2ez8QNXX+$A+` z#CVC`B@l!VBxv`6A2wiKQ$ap4&brb!MOJBOANv7h#Mj0gR_TZn$6?djN5@jVqILTP z7ZtSY!(|mN%}D}sOr*4i_0lG$$O1ZqdA^1a7&!_m<_e9azS`U}>wm#aYpM8@i*mO1 zIMN$rQRR*HQM+n7 zyn2iPrEuqub2Uie!qk3HBi-J6SX=w-;{Oj@-xwasvb38OCo9Q{trgpLR&3k0ZQHhO z+qP}nc5<`#KIfkEefPdUrUu>B)iu?aex|DkR=4W4jsLt8$2=D;V=vDiN>`wo=*jUt zP4)abxR(6XZX^Os{hXXbAPG9$jzFKcBbC~^#WZ=P`vnDzEtCYMY#Za z12Wo}SM%Qg#EW(SZsClhJ>bY##b&Nkqx0lR7f1+|Gg#^FT*}l^Ws?hPTF9JUT>~shA=9N;0KskE1bPPhT(}HRa}M+=vkRSOW4Bh8~S?%s^?aZ-G|B8;@9 zG+FuNR*_#Mau{La9pxM^q%N0}WOM;P61=$_T^TDu15=Ex0wtlen|<3>8YuY+D=o(2P@!kH~N zWe#5b9{PacrT~j2F-2jhK-bu?vW}utfBp`QK#dE(0H4cr^6KUD8or=gN7V=&UKkbd zK9Z_Be{U79>?0_X8XmqULP4?(9F3l=w?H-{RyZrfci3_D^yn-^rj~0WQv115((Kx} zWojm&ICd6NNZ~p5`Yx^>P3zl|1&J$q=^f+n%dce!P}tDs^rO;j%4BBsH9fGxgD-tx zd+t_4YSQD?Wc(d$qLi6s8MY)Y)gZs&0FW?*eSR{c_q{s7jnB(G_^SCejp&^8Y%@la zPo@PoOHYzRs9Gc%vXxwHk01=pKUUnPT)c4qjw`XR08)b;EOVF{U@O%|zR;FIG+$&! z5s765?t%zrX@0l#CD@UZ=~B_w!h{&?^2!Spz-7i`m&2KFp!dZ49Y-rGXKLxiX&uHu z(*DBZttFYy%#?4duj5x|)R~vn>-Vo2@W`%-Hq1R~&prozbHc-k5|!1pD(aN9*kc|@ z-S!2>X0vvzJSKEZ&{Ru>aa z7m+TUS;1g5U9KR50k}P{^rlCAxY;$RPyn-U&--&e6F&KVNcZ}guQ8s2fjYf3O?cCP zZhZ1~ce%~u0LEyU%`%!MvTbCqB_w247#fV$mtv6@!D?@t13(>r-kh9nnzQsdCb6em z`TnH%nRah_ls2y!$XFYQZgYmD6!ma zR#J)(R_?g*vvlB6YMD#w`aX^@z zGK!yPzDJ_uc&EY8n1E!g=0ve9fNCoH_q%nC*9$$>JuH1zgi=!Hoi8nhD;KVqF$Ij% zt%S~lrx|aUkLnp}C@M?bOtq17>z$c9v$ES#>bMZVu*9Arh~~XOuD->|N|GBpM?2wd0w^M$qki&e4G6SEGtrs#!>_+Vt_gD&IQBjJ z>EYE0>(yurp>a-bxCKBQ{ky{|ozx^73*uK%%HU8M=xF0JCaZ=HZPyw+C3)rH&?eW< zNN{lR5`^flxtzD}E#Di-RulU|j8G1f7ZoCEOj=y7t>qq7WJ0k_N$<;Nl=BrM*AicO z4&YWI_pjoHa=Teq9xlHUVpyS;m^jA0L0bXS7WX&T-;N%+QE(!yAnheUFF-t?i-?gM z(c2=nb3zh7yFISCjHNbq<&XrSwUEUQKBv@n$toWoL&TT@helcI6d@BoRb9`7^R_QB&iukEf~@j3 zEpAxR7hB0n3%hB1r!9)6ezQ5E@q1@>{n>FVM|I)T<9pibp+3OG7KqRRLAh%VBkc80 zh+K{(+0>I6l+&H$;%?d$Q5QSY%j0`X~*4wzEZaz17)3jMm7|E7x zVYJf)G&a2!R*~eyc32taywefY6B&V^Qd{>R5MY@Mcr)w<(c$Si@8A+!+}7-ql{<`j>6c~x$jTG!O5 zU&vhtaT`o}J}Jq~mpGk^V$~7N5YMS_Yrp5WAuK`iaX$sWP>y~rsw`LwMel&n-&9S% zFBS3qc{!dSFR*&&@<>|b9b5ir)liM)28UDV#{dRA16$E#g+ilzI&`Ndqq!d2b&)mt z6G`##$iL9&3IF41%Xu@XmzIQa7?L##J1JNqwq~HYYl3Sy1KN8Ldt? zrw|vzB=ZaqX%~hHa*R0R52L%V2HY-ECg1)NVsF<84%)HjUbD(R7re9Z^gj zanM;fOXH(fHYB>Et?2=+KSP!h?pu};UMl->up3xx%CKz0A=hAMpV(Q==);_^1kGcK zIjHORrFJ;Ay|Za&za`Y$UT4yJpdl39Ajm&#PR)E4>I0{qVn16QO}65sy>JVhRd+zR z%mu#;J5pigG}oieWmsICJ8foBAYW$nm^imL@Z+v-@F39MDLC2vrk0pa6p5PpAN#aF zYD5Q%xP;Hu?hs#UdE!8K#GfOyNPYsNGH|!)xLB~E+&mL4pIhHv_wMIMwJXxEOYcR* z-JK7DiR07YztbAFiY=OgmIxMDFI@*))uynw*kMmf52#86^_cN^+;q!XHiXX&RWH-N zHW#dqb{0AzquL4z6WZ7i=EtN10?j(oh<-IMu0s`9NJPOtx4KX#14x*M8CA)@HfqUH_67eToAJTfv zf_aaZP=B;oS;dH-pdY3b8EK1U?Zfm9;62b4VfXKu-0a~JV0|Q_N+X3sOi}b7NM-O9 zA*~>A&Yz!1_ZWJO__6n(y@JtaG*&W}0<-%T5@05k16or2g&$5RTv>|G`g1c=n?Zk{ zc){uZ6?9OL12T9uBcC!GYWW9>2SZVFWMa>x5S480{7*&(#KIS4d&A}Wm}FHg_IX*O z_&9lXV-z`!{23}T_4~pndLl*8&IT(L2wYpGTuCvFR}-773&!Qtu6RP>g48dAx=6gQ zUFZi~l#K2KlC{Y&M5D*6EI70R6A>Hc-#i79`VSFl&FwWn8Fi^`IH?&l6o}CX{1(Z- zI^S>Ab+@OSAKW-Av=bG>(3N)|Ag22x7K6K%m{FRt~7q|0r_5G*-(1 zu>&WA5)8Y#DM*EE2PER_Ji=!LD;`#LW(SU7BD4hks)8PL3hL8-)>O*;HDtwlsyll9 zaiO*!3?pKOH8U1=0UA=bZ0^`Cu=r~n0+UIDWB#@rQN8n5ioN=a?#(VW7A5y=(iz`R zQTd9IIgBcjcy(d)vcZBu^rT3-^5{pX0r35@5YkSf!rC0vVdi*dI9a1pw#8$Z#^@u3 z0X`gd*`bJ2K5Vx;>yYpww=>tpdg%LN)dachx6V%Opl-c_Fs#%*EKQN2AuEtfJ9*gk zVq&}A-<|^-H#+fib6$NyWlR;#AD2A~7KcC|nO`rp{i+Y;!ES z+0OL8Ek^}E4?%H|fyTSMIZd&-uw)1W|9Z`$vA*mJl2|>!qV}xY=-RX^YB9TRTsFoY z?UO;L_H*jHmbu$`UG%kEu6+9i3O(yl!*}f^5+fuXStb2Kvy@htv7gm(`T}@8gP>Kn z#9~$F$)#^_&5Uwsf@HHW(0~}eVR~JMmc@{j=#;jz)pPHj(O=W76eR_;>RCC-TSAGw zK@B5-T;SV6RrfQIIiisPPz{TS@@TyCjyLmkU!nMrG7{ZRx6-*xSzZN}5mJ)Fi#1PV zpNRR|3*=WvLdd7Net>)BlGST2C_^NAV)~>WlBPtre~qn9)O~!4&lR$*939a zuinnL<q`U8D}^G)tt*&m_D=}!vn7QSVUqK%ssMW6i-U8)Udu0COMB}l zi8k7D@0J*}>$#L=VkbT0X_E_m-ABv#XT_zp1xd%%aU^e}>n0SiGpf0t*HqHMIP87b zu7`Ex*p=jWktjEgdnIYVt+=z)s+^Z&TBwCAh}J(e;VzwV6Z|IcL_vi~vWx{e{3I8jo>H?^3_po6=4opo zm{-gCP5Eev9y<%eEiP)Db8Q_i@)1`Jpb z@^gPXFg7Wr)aB+;_zFZD+vwhJ>3F01k`klbu=aYpMEXaSjg7wQR~bk;pA?I25m+*zsxzMwiNC z?EvS|8<5J|2^`R+DX;`B@ld#W3$f#hf}b>tdYu#H=g}ia5G+~`-h5z_XEhbxe!7AGkBdzhI6$lLt_ZJkz&Lq**tuCN zLGMp8I$nONZt|9sYnqz{M+2kZH#fhvn(2KV%R#EW)v`-B#C96kCMj(mMJ;dLR6=4z zWi6hO9L3B|n!_U@VSfP*W*)BQ`J&O&^l|+3D{xdCfAld>f4`OWCh3o0xYT3+^ZkkM zdB*ia`Fc2<-aIwPay)mVL&)56?N08be}m?BvkSy__vo=U@(~ba*mKi~9|@B)O432Q zyBKsPs%3dfmdIx<2oD^VQb2sBEf@Sjh7ADu2@zRWgV7C9B^|+AsZ+(1u@hR^Ax%S{@ zs^7~a4a5Q0tPtprWOG%oB20kr9aZsH@*<{KJpRlj$qrh|*oe`$%hWXxESwBGk( zv6dxO<4fD97omapqm=$xe_O%Krg~VxL$<{@VP{|Uq$AqdmqwK*Ao*HVT!$@mL^AcV z_eRMn)4X(NgV^v!yfUEt8F^^%CT_>ZFLlV&S%|awj2XW7Vvo;CjxkDN%utD+aWE=W zFj`juEK;qPG_;#Qns@7Dj_#M4xxWS$cMEf}8IgDewgO8K0ZR)Pf z0O4n3+D?~HBRUHNv`y|ru( zdTkv`FwaoCMzp_I2wN*=W`8Nv?F z#76s&2!1h1Q3B*FRMrcXP~neGX$=wG?CveRFlAS*ADUK@vn)}J9&Do$fKHX7)_sR4 zy!V13Y6XlP(}uYVaF6jLDk<$kOAuJme4QT=5`^ z_q*alRTvKDxI0n09G6n8Q-M5eHV#M~I;8B^yT8bRLY7%%3XPFujI_Q|q(Q*-%FDb) ziYZw^ryXI)satKVaFdCv4ugo%NvykvwdRBs`+b<|7Wuu4QRWB<(*d^+wJBF&z^=5+ zCNO!r3$Jg<94|uJz2z)l=*}|@8m{hgL;{K94}$%R7x42AZ*|ILm*yt&RdDQRnS1xL zY+3n1I{R0HZVQ_|jS0wznL=gW)xk_SxY}9*L<|2#<%Ls{vKED0nIt+ZaI&*z!pi^- z{%2!rz~n=0sc<4a(Lh+R@hnilMkWAiS%esAPx>iL2cXyzKL&TcZ~%(p-u2pYnA8$2 zN9Hx$CBQOze_?u{A_l**3>pVw$*Y}w;sbrIH7i~`wl_`vip{w~GJ4M)#rVB|?8p z@;K_IHHJ(a1XifHS~HwA{1X01RRxm?Ma<>(_NX&b9~JAuHDaigKR9K0T#sH?U_pdT zEr=*}Hvf5l@b+T?t&Nb61PF+f-iscTr%2#15WqCCr!%9jM|m{eA_+hP2ADfy zI2t5;!(P@NFP;fK3LUEvoQK*Ma%f4N8 z7KMd0 zeVSkZOA6jpf!&==imEbRYBi2pBT4f2b|H)+foq> zDPnHI$64v>YID|lwq3=iAr;Lmp(}Wr+QY($M=nPp48Wo>d|7bK`?EtWizGu+N>>E9 zIq!QHw5Yc|x~Ow0RvxkbgbHy%b6qV%LI>!LwwGCV6+Sv0t75_7b}>Xfd7l1U>0TQzNOY-+xrgyV9l=!1yCJL zFx-9n`=Q-{cHHL+rh8s=-5M&;Ir9@}vf9gBPqhT+)n%o{8v@3JA74=ik6<_nqlxVf zYI8Cd%dZp{nY~6IX-q-3r6~DgSQbed4@#85^K4gU*H;-1D{dZ*Vpe=&#R`-v(+{*9 zb|*1)$1i-HZY4%G*EW_{ahqfMZI@qTD4AN^IGaIHR6%whXBAhMZ+4RzpUPi#vHJ_| zDoPm?Q*FNWueUC+qzcp|JFzt|aTL+y9y9lY{AUnG;6j=3&LjM~Fs;Z48%ayQKEAz8 zzuvapQweQbj(O|+3I0D|R~X&YGE3UYv>W({HomB-5GKCQ&%9ngV7--k7l zG@tsfI@W&vW-IIlE;Oqq{L=zy*y7k)zHniC69MJ$FF?s;|A*CP~dpQRy^v zV2i555lfMW5nY@HY>`1E18)fBUHpQgI~ zbQf7k6vga1{@_-HB*%-f55=9%K-PtH6@_Hf+cLKSAg>ozJP-{LmUs^^)2l()la#1a z)^b7}!la0xFjF~GQ#&Sf^x3c)ZvmV*mZ=ZR-DPgCgm?p)a2iW?%05{w<+v0`)87TG zlqFw52rUV=16pb-aLTvG|#op zTki1n%g?#f^aN2GNA@0%dsNLw1n+>R2yp|{4lTswTcbsiA6uM_$|2`Jf~LzWjO33^ z#a(Z?+adL%q>&8lj-rEENmr63MfaPL$O{HSVZ9dP`D&8I^oGhuxMU--W&rmKLPy#9 zuJCcKbVA=mc&avMoX_=bkoJYRwn$1^-N3Mj!JnEMo3|tltWt+|#^GtRnAUh%4}{C} zKw(dnlP7T}(hFKVf-RJ*RrYr|N9*wY?PN#5;aah60qfV1cpZf}ppk^bM3Mx3mMH1w z>Fvv*6t?#Ha|I;UFg-#<;8qo7qn{(?>9iN#&&A7f)b_=kWkv$dyHe++4cT&02p6;< z3XT~~W*KQcVq6Q1K`iQB3N;B|uuxlzk(s?*E2&@gPx2gxnko1Ggb`7#Jtu#TMhQ@F znd+A4;TMZ-9J_*)_Hm|wnli2`yEp$*dC>^W{#9w66bCJYzLD$uKp3VLVQ-5Q8c>-u z?Pf>y$Bb6Wpvf#`j6f%%L`Ez`Q50!kCHBJ==akz~!yr@O*@y?yI8~2IPka+(os){% zh+^1K?y?C%!h7eHM)GpF6icuW-v>Eil=Mv~*srozhT5^B255lm(f86DC7}O;cVIyc ziMQ3S1d9A{!cmID(n!9Bi?58Z#_NRAqE2GtXVw}2l7hR07a{soRb#}N-c=q86^^ek zn@mkSe}SLN#Ub1%Tg^m*!5?0^c463MjJ#1;kOL2HF#hz15oHM^T3^daoqU$6_0vdT z%mHbXX4@HS-HR4M)&=5u4c03|&`1%dY#w$xy2rpoJ;zZ@E@^xXb6F(7@+*NqSiLqNOB*76$Sdaz z5;gM%t>SWRGiK51u#vNEQ4Y=7$_;=eA>g9s!Yjb;>&A5ic8%+jqf#+FaA0af+ZcBy zm$zTOu})+nJldtpVDu@v#_#WWO7!~1xvstB7&*aVsbLn`S$E(L+Qx_@=_Amr2#6bZ z{7M$MdZS}ix0pG?V85obpd+GOSCg}Ev}Pg7kF}s<-|}9#4TPn>g1+jqc=U$e>@pAP zlFiMeF32D0Y}j*@95=YT_DcmVYNDN_lsPt*>hx5y45mA4;pb)>*k(mxRXrRm%Sq;| zl^Yf7Ikoj%Q`ttORGKC9PszI*jCx7#n)3R$-51ubvBhr z^+rfLR}{9r>3AiuE-mQ=RopT@jl?za@CKG^LhBtvBjsBQVm!*l%>w+Oh*K%ZL5)MT zVV$0EE!{en!aUQWT$6JT0xXSoE{KJ`=XK%bbyZVKGFg;_d(~uX#80<*nH^&Ca3cAb4k)RSl z1F!n0QbnB3!8dfvO=7jQo#5}Gmv(n2VFMjK?>Zb-%U$2zgM}$lrefVVQ|a(WUAb+t zrTIwZJ?|-1A|0o=NnT_oD!i++deSNr{mzPj4UApX!HnRo)hvPhRA%QO1{Z2XM(H#kwSLLIn86QF}G?)GkA^cT#CcEO$=a3pW2zCk)+upI73RFuWv_=0Q>X9!=no_zL(??L@BjxO@I@`mG z16~9s=wHXdXizv*58$_JZ4Y$Lm;_C>E^peqx4Wa&<^--mVefRL4k3o>J9)@(B-Lk`c41=5QzXJ3@!+;-_2Bg2 zb-HMMHW+KL=uUAQPy8AEOL^&(#EXR?Az~t3yEtkR)B#7rZY_t4IjNThe_CbE;K+*^ z$5CYc2b8ABXurk0xPmPX%R?xprNm_^3{9_2N#FN4uTn3*lO1+*yNu54Y@L`kL$`v3 z@@SScMB6Mw7iJ5*mPhEnY(&M`hhsPZV_GrOPHX!KL{vIU5PHj{)VO@{R!4`Q0BU_!asZjoO7A zBEB$*y3XriGr;#kqfB9k@v7~QmxeOcwtJ={ctnPotJkc_VUu=S<{It<_(O<`Yd-vr z&TYGjoM3h+;}INq!N+(}jpx6~w_m#h_FevJr4d^kpQGJbQ-V(Be9_c!K6)hAF=| z2v_30qkbnt*>u#6TB2fUBJ-n*K$u3c)lLBBQf{acPGd)R9tA`U`A&+IP_|?`5g#wN zEKyV5NiK=ytcdE-;d@4*gv@qT;&$vW18%rD(qnCn0p6z#)A~e%JopwRQ2ynnve~mk$ys?^#KrVpDC&%0tLB zpZwB0AD;)<1@^+mSkz4j3$`rw!l|)3Fw0fK&P>yvkC2)_`UomhSkqI@D+ZbcXU^z_ z&y^5?K;NLp!!1!99uyI4IK=X!iEv=@9vC9poe~?R&LZf~CN6Bgqhfpebc94HEfFDZr_dFHVyd5d`^dr+w0bt|%|xmBuBBlIKJz)*TO zxlN~`SmEjj=s5}7e30XH_%>iF6Z0LqvKzc|>RdbpyAgQ5dTO0C(uEQn`p8>~fV4R{ z{Zv+>dZYq3Pj$uFlNwb1!X%B%knVQ0$Cr?RhP3PYSSJ0tymRSIOWg4T6WAMb+_`Gg z1;a~3IC)pvS?&gd%4YaGNaD;`4xG*MqtwbN$93lmn}b_gcCl_3(;;|CEzejY`EYi(U_-2V zkt4{y8qSB3uU6;rMEL;u;hDGDkW2ty4gIFV}%jiOLl%v#q)tpM`72A4{C`(xP zLBby0BLc0;GG#a+<4?``aT;FI~ zA0j1=L!XvHiR3p;u)??nc@ZO*lhY+aj?3S*PqJHC5f% zew^*qm!wgcrz{=V0sM*Ai;cWkF8@d8G!WtZSL&ToA{7`V#R5YFh!RT^MP{nNPjz++ zjQlDw%lcSalXlMF1cp)_EQMN4V{f~3!IW`j4T+{7+UITt)`s9;o6hhi*OpfsNxAeK z0>5bbpgB&W%-NDE%SGr4&jhsvw02b1_aeM*wmuUZk{p}k`}lWrqpA(iI0bQJMlR|m za`6sU^#w%jxXBV&Z}N%!8$h#W&Y^aN{ha_QK36s_8>eTDJstyI<@ z7sP5LEaa?kuoIpP$v50`+|r(t`-d^j#?a;oWOjXai$*;>W1CvQ=_QI{p=20smF02i zzj!NqA|f0#Clfw53pd&BTISDS;+^K8SDOQ+a)v}&X?a{!yoK{mOC8KDoI<4VuP)(; z$8&9hV|kPlP%XKa)C9_41m<5EM{mt5ouKO0D_t)(6LAM?>hY)FRm4v5`jjIhf3ILd zlfi)Lid32<-(wXUZ|rdmCVRjm#gDXqKsMERwAs^>V(Arq=JdCX)PfBzM`NrnbxYHn zU01II;;1P`=)mwXFoj~58h6ZD-jb?LNJ+^{wBS|AFDjKOB`@!*GB>0h{|Gc#A8;07 zeLnnMaUXr^>i7gQoOi`AnKhA-XZB13we8a?Mb?JuwQKu+tGcU=r`=t(v^&Idoap7X zPih6g&8p#9+qJIw)}{5fwAe{C$??MN+x>cJ3D8)@gha-b1>tgb!ajkE@O5;P#6Bo)H|51k!$7J>nH?uE6Ajtev zSN*Ut(c-OdeQ{8=FK*KFS$!7~WHTJq%O@!&bN9{U?vQH?&MqkqQj#376QkTN0hcYt zk)b5+8BVO-xMRf13BiNl8lp#3pIHM!AX~_A#X&z%K41|0F=E>Bay$OYL3xoVqYv!s@NJx|qhGC`N<} zJAeg8Giha{0=tHTFTPO_s4lP;A!_#XZ4urLVP;G)=<;D0PESYB^RayB!Tx@xTg`2! zY;jK;vNmqtFShIVY|q`VoP;MX&~FbGd)@5<#?wc<9L^(DU(hMy-3hC7BM#D!OE#mK zxc(osk5t{W>%Kw_GwAmc{`e90!}<^>gg`c`dw$VGT`hxp%8$Izd~Ml=Hr-qmAL@4w z-9c9&Sr8^zZ`ScdsxT@{O*Fd3Dd))+)HP_@mXCvT{_*;b2<++6SzHfp!(O#=t_ z^qf4e<3h=eN2G0YB=sBxA*$=fBZ|A?Q?7j`a^34<<-3c8pRU1i!u@IlMzdcv+-&@2 zIW-|!DeeGS9qs%^lr{G8&kdB1HTK_&Zv#{Z}|?53(H4zN{H-AVw<&3Q~7&` zMz?rY8kWwB*RjmNbOmtTFr`)@evI;82xj9PA?T8^OyKPohIX!R*TOl_^Q|GYH2=^T zv|OANq6pNbl}%kSuq4o05wzOqBO>^j)uXZ? z1(RqTc6*BDA+VST%fT1gmUl?dR*1cOlEJ`yMl7fy=MI}z{3wwMdP4Q}XpA#k{RS^q zfGbKOxw=My30k|hrF)sVr%AKA&Upz8R;JmgzgYRCyQVZV7k7GKvPP>gz=B{0Ap2|a zcVol6Qoy6&j1D7Bm0LsHaQ{2_kY9>XD2Kaw^%r0fH^67x5V|1#EA5q^^7#^yF{&-4 zn+ottzm2rwzTdG#^pGXOeng-t<(n%JHvJd7Af3Q={sqO&`SvMx z)Ww>C4h=JflnosjsuvAc*@wa3uF&f1I!BgfhXxq@Qg_B9{>&bzw=J@vfdN)bkPiyh z?At#ldIk1sVSrk&{DJ2Jj1(3TbfCvYn(mnGogW>p`%|UkF~Bu+K#JCx#3Jb14p~qL zxnMFNkVK@hSen7rmynQ`mLtVSHE3CS=<@yo2&wU;TAOfQEr`LQY9q<|KZEZ5eO2)A z!MyGDGk_KeU2IPgW=A7oVHx=C)DrLdn!qYnu9$z;)JT8w)=a~35L3?*L^BzO3^p-$ zH+Gh;PUJNqSlx6E^a;Z{TaWn2f?w~Z{hgm|B6=brJ~4s3G5-%jJ;q{-W?%*rWsMP2 z7z=|kbA5xuMt?M2#lFEYqidXYuIOR4+#2N<{eI0ZUrZWJAbx>AzG+M>`T?f2=(kV* z9tM4RY&C1NXQmn9=%j2Y`I6RDqtcS^e@@LA+sYN#Gh!ylSX*6O=dGrr*DTlbP3jJj z_ivVvq>o)~#mXc??>X?BO0c`$9uwWJFdog=wPE;#B5xQy)}G!-Z`nUa2zUO#cG!`8%xP|3{Pm zT}?){j(E z`eF5;DLRL?)5aruasI!OlWH4^8sAQBWH5an;}(SUGuksu&J zf+K*B**GtN&mgT0hBXfAEhg3T7lre)M)wh|OhGPLR}+v& z_e+WN+PwuuK*xg@%O62ycgvhhb1mxT0T&b{1vlGAg`2yu+o*t6 zELmIGS1cuod0{aa7Pl9jV4}X-)(WW@yyC(fv@XL(wd@=-Q?zwdb64#E*dtC8W2z}SPq|Q@pBcviXmoC9R zL81e^1M@fmO8tolzmLc2h3@rDT)?R7i+dCT7&IrmrI$ZQKz%IYcC!=@yn+uZaSb(W zzd&Nv)E#OO@?yXYGT}SULHG01nhzSi;dnA_n~0^T>{|k)@_cyy!5aIOT7=ivwxdg_0}YqZ@q1X9g+VEj(`HuV{C!-?O zIIQakUQ{ap39FyCC9h~S#KHh#>Y!XR96B$syHta8p(nDwPi2(!aczMqDtuA!Gh!9yvMxtysBi^g3HjzZd2z6Q6x%xKL z(Rm1mBhVu-VETZ+di476laFK|EOyqa*$OvYRNs)lyE_mM@^fBgvW$_#P{Qv{Z^@Wh z%c>hyybOm>pk?)=WVPXOR|2=64(i*9UksDj3hO#m=EM;oWY~A=QQ0#KV(qGWY9Sny zp6WBsUe8S*&w%1fMAZ7K<3RVP5_rA-8q}s*peVAk7>EQS!JsAZXk{_nxL7to2Bwk} zU$|7mQZy|4kxaeA+iiShRpro7G0~)#Yw;rgztINJmhpDMbl!=)ogL6C3}hfaNEtQd zdlvt{76%Ztc~aH#T7&dYMT zvi)3V2lVcC_NEi51uNG#)_94RgoKh2Ph z&~7ap&(9m|bu3};@)Y!Q_}i!@4h!l!JbaWi-S#S+xbl@seqtQsB~qx>m{y#fIRd3M znpeF9^X~>%Nw)X3_EDNK* z+oA^Qpkk-XI?G9HfOx}(XQNK;5gQZT7Z)p77LJxh=&;(vRTd8KpE9YLwvo3!0%83b z`cUHwR&urm7uvQOs9Df(nF9PDWYB17(&-S62bS>^P&Y^JEDd0IpzG1 zgA=v`#MmlR5@ApDQ&VrzI z^4xRt@$$p&%R9WDKEwrWEcH^I4&DIu0Lg{munGlbCq|NE*?LWAhV>V|#}pOV;y*dx z;XX!hed~v~G8#I8ywA!LqBZ}3ox(P~@#j}Wi8%29|7Pm%aotRh`aFnAfy?N~6#U_X z2)R?foDbvBf$iSnNd<(HH=A-;QpC-{$$TGH6&&W>CCCsZ)z=!e@E-%E^Smy8M2p(&%Qwkyx8rMl*Ou?G6FJzIuk(cFps>x2*f zkYqaBSyMnP*u5PD7Q?!G__q4!{b^QB(MPyQRH1x?{Jh^(K8_a_H)llOHtLx1CJWjsJ!4@w4#1L!HDj z%Ka1bB=&nF{3--Ef2e3o5lBLgG+(ZnXddV|^z_MtmWgW@)@qyVU!hT+F#j6+{^BoX z*>!Fw-C)PYX&_9EObX2TqJbCZcluHKSvmp|L>_X94Gk{J`W9E|u zy-8Vj(H-+wTU$HUsWJU<_pB*&d;YxC$6<9lM|{i+UH7ZMAI^uIkLF=C?G^{q6R2ag z0eT3=S&+M4nV(%vRF_6tO+w#bRxK4}RzB94()ZIfa z!^K9%jT!*FXP9UKgLejMEJQB3)MFXq(A`|QWEG?W|7x(}|GDk`&FbHv`A=RRC`%^uxXUt%e?R-1esC#hk#pmi zn*-Q2?*aew$bU`jUuiJ^MPdG-Jd2wr@5qQlE}mLbP3>G$Un6JhueC`xn>y}p?o&T< zXTr!bga3urHR}y!@PFlxKBE7>sQY({Z~C`h{yC)l2V#WXJmcSj2Sda}ykBPiWl}0G ze;d@lm^l57Cx$1TSa({;f0gmS2@T1P-hM|Z#*>7*+)BI3bD~3;IhG^INpZ$BS`w6! z!<>cFhMVwe9Gr{hu?0@++x&H1XxHPL*Zy6cPL4E*dS;hmrR{=6%?8Z&u_Ox^_4;OJ z*TMOpGUAPwaX94fn2B(-M^J{}`1>4A=I?1S$X`j^x6PCmMh+*1Ya0q@ zIYLsmf2ukjHiN1f9-+H@E2Fq4kI1LU>8aiuAyxk=!#gVz$2EYrC}XU0 z=L`_0pVSrVLJ+|>q=S$id9&rd>$jV{I|(2vAs(JsWG@e?2~7jtfu7R&XEUtSb^eIT zsB%JS2?IlMiNY)zBQk62u}l{)U!LP0kwh9}6Rwpf2}ynbr~n(J*L#PSk`B1t?y7eL z&A@{^6g+Y|(WrqF^yhiA7h&YY}IsjXn=p4eagTF`TD0`ltec1=F{{Coh~AXoXGmQ>1c=mL~@Xn%WrTkA#*v znoporn~#%PjK2wDkHQc+&rX3~+QgxRh% zqjdB1A)4Mf<@*pn;=V2R2_;J_h@K_pke3fY^^JQtwC7l(J-4~ila+R%(n|{zT=Vv zRHB%!h{ijG&lXCgu{Vh<;k)!mRNlIpCSbg1GR}`1FaoKinRzrz4nXIY&|H1IYDd?M z?fZs&n+fGkB6r~XIdCH-=-h7gCF0|^l?>6K?sULkTJ~|CapjHy-AM~S6c5GzNT3Cf z<#+S7pOAA6G_gNqHPDZ-b8*R8&TuPVPHJv&-N1PF|Ho2bi(=-JIv4lNL#_O-WOy5r zQbozXcPN$}XdQ~$PrxR-P2K)gnfWp+p1ue`W`@VScXe@7iHUZXu=cuVq7em9+tvz6 zf8(!4$F+DYjuwR>E_H5~TQ&hNIo;I4``1F^k5cMJrt-1vLH-h2InP@F$G- z%x;#vPA2F*39<8r4*U+nLq6R3Zry}v1u)JDkjIa+*xyR8NdNwE^$3&rTixP#Bg5a$ z!{im^7fb;icsAx30yXYUC$D73OpB(5Yege1OE>*rK^Lcm*DD7lQkl#wbJ|~Ovk_Y} zw`R$zj@=VzCFbrc*UoO7)OM(>bu7BMd`MHOrkD8R(2?Da>=Ublc3^|OZ-0=Z`(Z*_ zsF(O(;i1COk(vgqDk`Od9x*L8TKu2Bt^zEo=IbvZBGL^@3ere}ba%IugmiZ)-7Uxp z2*|SZB3;tmA>AoRBOna||3&eA{eRE*ee>LB=FT~Dr{_24oVj~N`K}(&$p{DVM zD=L!DO1jB?@4NFc5^5xtzCs`o^SLZMilo6DJ5Qy}lH1db6o`fAqQ>E0V#wW;=Um0M zx+zR07>wt#wKF$h`AWPpuu^!doZftHQ39JIVpxi8BuumP4K7=+dQ#fsLZ6&Cc1T6H z0dz-WjcdXFCJ5SzEgY2M!2&UXeF{}?p~ajr0S5jwceB=2ilK0A)3_xi*4Ck9>&KtYWu_N%6d0DnL*CNgC( z%=ZTXPO2~f5)VY~Qi~ws0aW0?8O*Y>y{rG1ToJuDv$e)GVIii7u^*V7dK;Kq6GXiw zMa?1u+uhWf?cUtzmy7X+mu0p(3{Lg!96wUX@scEujv0L&u-|D*XWLE@M)lTFf>}*1 zs~mxdUMh?bcIpUU#=jAX@L3=SX%YE|Hk3M2LzTliiH~!NFqx9Aw+{w_QNC7|8mT~H z9xmFrC4807pl7;1b3JGyySu{Z)@dFLXdB;!I#wRkD84IJYTtWocoR=8J9ae|bhoKa z#H1bWn$ulF`Wnfa0-FMEdeuoLS2Iy52pqjOx>b`~HtG>_3%;mVKv*+_~g~ zeV2je3v?3}#(_sphws09@+1UAcfSMD7qHlU_3G?AD>#R}7txIt#tzSpf^5mU+#((< zW=%|>YNxjz>b{2|pI10fz^=*T{k?JQDPLon5a}yCh8180eVANc(wIf*PzAkRz17r> z_jyAQ?gA=DwPrC7sc=T;GCS_6@!O|TEfEq4suKu01(;M+ylW8)yxnHY4-?d&YBrT^ z`hkk12FF&@pRJArMuLkBxNYa;7b4l{T{*5Thb|`L(tNh4H`!U$)7R%HC77?vy%P^)HBt3 zf*!d&Zog^(<%LsR|!^m)p(QudHrJn{TqJkc9YxzGW=^Hmq2vS5KYXdnr zz}stz6)F`;rA}&PPU+Wh^X-iag#w?!@*{YTraD;(Gy~R_RqPvQaJydSyVecnhZS*# z5+w(~nVV12hC&k#Rw$tCF( zWxQ+B$Yf*WQ1PVSKp=pmK|kC`Xc{Q+q8)9O(mmc9S2Ks(Qj)-j*!dxG>ZpKnVx!yI zBVcv9{r-t^o-CPcU-7?1VX`Tc{fWITe0#r$dil5##-nCoo59_+N0+cI2!XM(8@A(< zjQ%8th2c$O-yiN@tdNnE)!-P1;Az!G*e*=Zl+0e6)PY6> zKp#=YOBkM>tZgSYod_~q<;|vksFoU@57jzk(HF(wNE?{Y`IxRQ&7qcBoi`)?KB!No;K9#gD8U6q{Iy~oD`cQdsMMj$I)tj(y_n}agL+OQhinZEbT%9+pKGwW41 zh*>;=z>l!K^7@K{-Cb_h42T6^~dXx13&hA*S5(1&q)cn=86v&hSnLuhh@kB#tV2aLDW8w(rSWj4Km1GF6P z_wv6_Zx7i2Ku8gStC=tL&Rnm5(_QHHYabi{eCDkEmnG(Rdtl@2-h_GA4oe$9a#-vi zcTVy97JRP|!(!P95~|d)@wl?_Ph=AkCDdT|*_Rm~ZYH<^B$rfMUuc6ssOrQ3)_~ST z^4w8?%fxf*=Wfb#Y*if3I84np#)-xpSqG20aAR4{-7S%BeMRS23bIbfrRV&{3K87D z^??ej=k82|x10?6LCJEJq4`d6M5`;Kp{^;;u#bXP9QxpAExGPFIi|x|WomD9T&3PV z$;lELl&XHH4m{d-?$@##Bi%jq^HX}i=ou?0dcYqG+@8V&$OZ3ys@Hdx#Z3jW}1=yK2hC!qJ({;#rN3>f(Qzs`TiM@B-T&Q4SFWMJS^?T!3mV;@{#CYvc! zoE|UAK2$-(gn$W6u^iLP%w^g9sKcYRwDi|8Eyo~@mt@K7vAM+)QHQ2CflcmMd(e>s zLE@hcc{fo0K1D}mc60UEyAv?)#Hl5-p3+GfBzh+h!OcTq>LysSQcn8IOhAI;rzkak}!>olypkW}%m1tA9wvcby3cV3kEB zss=4_Q|+Jv2+P2Ne0*N>R_++>UT*>+MDO3pnElB8q7joHv9%2VD4Zb~d2`=E8cYB- zu>u(N!GKJ?U}$_hW?g5t$Zn4`eFO6PVM~LZ_j$DE@vTYUZK6B;#V4OQ)<1y5Q2{f| z$YtQ62U|vWchcsL_Ec5b&sGUjH8zu;W@7kkijzMhZ!Uk#aVj&F3~gxcKK5Xv6JH^3 zr&tjc3)jug24stPfZ`GQhpvNwQM3sfT%ayg(2Thk%;sb;;m`vrQ;Dff;Ig;Pr^5TkC+Ehq zbaE_ePNz-u10uJ1?fgvBrj=o_is8341CZ{;Q2QDLIe1bv8h6tyg>KwNC$au$b)DQ@ zRN{)hl;;)gI+Zl^L+Gv_fhK7LmLJI{6$7}vs>y`8h{c$^2y0I;P;M>>@N7s$vZ@k# zhF@}-Ru#Q;=H&7Ffp1SwAY`n^_aIj~iq2VZRVjOi;xVyU^F+=ZImy+cp*ft=+HO=4ZfL}P!wBh+P*<`ZS+Ny!4@>&D zqZ}WTd#*`eTDmr`iK08{uS?fCAaxpN)H#29#+f*j$@>N0wHkhicF18Xe@3`4o?RLR zCxWO$xFO&3bPtOS376F)QB)!W3xbT%jkU2AB1Dg5TpOgAD=DUBS^Q9?@jGva`_hPV z<*WEN!nfk8WN05sv)RU{AB`C2_pP0gc`NH}n4l_FxjsInW`3=$CQ<>UHdFKNsOG{P z!1x4~5pxX{Wv2@k9X=3=tWE}FSd0b+cPj!t3&XZW(I!lj_`$nH^3ia4*EU;aN@~#* zgzoGNMua!mSe3{+^o7$avVN=(VtpA^f=ZO@NsjYag=~V%G6iY0AevJ4YE%(K`0zD7 zNh(C<&W+7MZFbS1?>s-tSSROstc&B#f!WI%6MK`(H1HRP$b>D(lJ2dwmam9 z3x|Ob>^TLFYCfDYCo*XbLR`$^@uu1WJGTs6$y}?2x)!KJj+09DrgL^3WI>?|tlJ-U z7H4;2Q|+xPzf_W(Mc3Lip9#r14a0?<|De>^WA*cuqiMZ;Kq=OULnHQCMmpTJ0E;>D zMKngPYyEym(g)7e1GzZa64D(PLxF>N9A!ajyWE+k)1v+BO^fEsg^U~SGe2yKY>0K8 zv2OLMw{MdQ6Nqs_w{gU_ihtpyA1g@=?bytlGW{Z+xrG}?fpnIsx$D+;>9`C5A0$9v z3nm?EtO#V7kO^IxBB3X-kAWd($f$feZ5{tv9Lwgo4jt^x81`C-@*{NUIB}8EQd0AX zY4r=c(;K`;9?tGgZZ2n-R9b20+x!fo5b9pFY`J&O#B-Tus>T`ePWiS!*#w%tD5BD( zRgpg&Dms&=OrQ5o7@za(HVv%or{qZV z>csZ=%m*)^N*@l%DKPtoeF&H+R_+rtH#f{%m)#VJhJr%rt;QlV4zAJg1?;e2)HtvW zG2{^n4zBX+Xq@jf;ntCeteYAM)V*{8@Thzl5IP3kWJ_a6NCf`+Q=D}L^1K@c6xMJY zYO@fbkU3|aT5dYv&*xD5OK?|hczTW&lNtNrlRC)0?@lRqqd~K!zmuRZ^h6{|)hRkMb}CL!Bmi9$U53gZmpMSX$jt9+@bFB5z>p4I#_3B)Vc-y&!_31+H}15@QhGAX?} zQ7v+}F6@xWwdLiB7(Gm6ww*;JNal<^#7;_@b3W(JE7ah6tv{(T^2u_ z>d)quGiT#-vx;tn^x2(y`z``aw)z$&SC%wh&Tr)_oh`GIQn)Z@0=Wkw`y^dl(e&(n zHIhivJq=%PobI~Wndn5;^VxeXsFk)0EaY9;_O0kP6X_=|4{7NYEOLe6GCfTQdqWFy zUSJqnA6)Eykg~PqNwra!QBhKP@sr2O9rN^k0~Jf>1w79qnl;M?TXAD62W+(8TcZz6I4^QY!3963X zTQ9^%L9HEqUv@N(9Xa1ufQ6zU12WJflrwXl!h&($zAq!?F*IOZ6VvS))K;crU9;Y) zS#0uv0jJW$v>tTxp?#20+!L^xPS^J%52DXYc8av-ls*?HSLNx#NnaSvhJ1IQ6?*9P zf4^paU!`eH>RFA!`g3M+aat0|%R+|w~b`JDPUW!D^ z7K6&`vWE7oi;Gx_*j%i&og>)zLC%kAUA;css34`dGZ;skIaDZdsdpu*7JgE?pgnro z2g%>*(?Ie<_z8EGB=_=-r;`JjnA71=@kMgK`}5dy?_ofPGVe`J-YX<91$QYH$R5Mh zquvDiy3+yy;M1& literal 0 HcmV?d00001 diff --git a/public/assets/fonts/Golos-Text_DemiBold.woff2 b/public/assets/fonts/Golos-Text_DemiBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ac1ce7890beb5ddb810965911a3d01bb892e3632 GIT binary patch literal 39724 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 L{r!VZSOEV4If$kE literal 0 HcmV?d00001 diff --git a/public/assets/fonts/Golos-Text_Medium.woff2 b/public/assets/fonts/Golos-Text_Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0b6f698336adec79ff9bbdc68539f187f750be69 GIT binary patch literal 39932 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

2%_ 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::capture()); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..7164b3d --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,62 @@ +@import 'tailwindcss'; +@reference "tailwindcss"; + +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../storage/framework/views/*.php'; +@source '../**/*.blade.php'; +@source '../**/*.js'; + +@plugin 'tailwind-scrollbar'; + +@font-face { + font-family: "Golos Sans"; + font-weight: 400; + src: url("/assets/fonts/Golos-Text_Regular.woff2"); +} + +@font-face { + font-family: "Golos Sans"; + font-weight: 500; + src: url("/assets/fonts/Golos-Text_Medium.woff2"); +} + +@font-face { + font-family: "Golos Sans"; + font-weight: 600; + src: url("/assets/fonts/Golos-Text_DemiBold.woff2"); +} + +@font-face { + font-family: "Golos Sans"; + font-weight: 700; + src: url("/assets/fonts/Golos-Text_Bold.woff2"); +} + +@font-face { + font-family: "Golos Sans"; + font-weight: 800; + src: url("../fonts/Golos-Text_Black.woff2"); +} + +@theme { + --font-sans: 'Golos Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +} + +/*hover:border-zinc-950/20 dark:border-white/10 dark:hover:border-white/20 bg-transparent dark:bg-white/5*/ + +*::-webkit-scrollbar { + @apply w-2; +} + +*::-webkit-scrollbar-track { + @apply bg-transparent; +} + +*::-webkit-scrollbar-thumb { + @apply bg-white/10 dark:bg-white/10 rounded-lg; +} + +*::-webkit-scrollbar-thumb:hover { + @apply bg-white/10 dark:bg-white/10 rounded-lg; +} diff --git a/resources/js/Components/Accordion/Accordion.vue b/resources/js/Components/Accordion/Accordion.vue new file mode 100644 index 0000000..8a3a51e --- /dev/null +++ b/resources/js/Components/Accordion/Accordion.vue @@ -0,0 +1,38 @@ + + + diff --git a/resources/js/Components/Badge/Badge.vue b/resources/js/Components/Badge/Badge.vue new file mode 100644 index 0000000..666bba4 --- /dev/null +++ b/resources/js/Components/Badge/Badge.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/resources/js/Components/Button/Button.vue b/resources/js/Components/Button/Button.vue new file mode 100644 index 0000000..b58fd6c --- /dev/null +++ b/resources/js/Components/Button/Button.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/resources/js/Components/Calendar/Calendar.vue b/resources/js/Components/Calendar/Calendar.vue new file mode 100644 index 0000000..d2d88e0 --- /dev/null +++ b/resources/js/Components/Calendar/Calendar.vue @@ -0,0 +1,433 @@ + + + diff --git a/resources/js/Components/Card/Card.vue b/resources/js/Components/Card/Card.vue new file mode 100644 index 0000000..7e852fb --- /dev/null +++ b/resources/js/Components/Card/Card.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/resources/js/Components/Card/CardBack.vue b/resources/js/Components/Card/CardBack.vue new file mode 100644 index 0000000..67e1cf2 --- /dev/null +++ b/resources/js/Components/Card/CardBack.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/resources/js/Components/Card/CardBody.vue b/resources/js/Components/Card/CardBody.vue new file mode 100644 index 0000000..5176044 --- /dev/null +++ b/resources/js/Components/Card/CardBody.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/resources/js/Components/Card/CardFooter.vue b/resources/js/Components/Card/CardFooter.vue new file mode 100644 index 0000000..f913dc0 --- /dev/null +++ b/resources/js/Components/Card/CardFooter.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Card/CardHeader.vue b/resources/js/Components/Card/CardHeader.vue new file mode 100644 index 0000000..8a71593 --- /dev/null +++ b/resources/js/Components/Card/CardHeader.vue @@ -0,0 +1,5 @@ + diff --git a/resources/js/Components/Collapsible/Collapsible.vue b/resources/js/Components/Collapsible/Collapsible.vue new file mode 100644 index 0000000..746e7bc --- /dev/null +++ b/resources/js/Components/Collapsible/Collapsible.vue @@ -0,0 +1,130 @@ + + + + diff --git a/resources/js/Components/Document/A4.vue b/resources/js/Components/Document/A4.vue new file mode 100644 index 0000000..5a5eef5 --- /dev/null +++ b/resources/js/Components/Document/A4.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentElement.vue b/resources/js/Components/Document/DocumentElement.vue new file mode 100644 index 0000000..6b6f4a2 --- /dev/null +++ b/resources/js/Components/Document/DocumentElement.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentHeading.vue b/resources/js/Components/Document/DocumentHeading.vue new file mode 100644 index 0000000..fd3139d --- /dev/null +++ b/resources/js/Components/Document/DocumentHeading.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentHtml.vue b/resources/js/Components/Document/DocumentHtml.vue new file mode 100644 index 0000000..b845070 --- /dev/null +++ b/resources/js/Components/Document/DocumentHtml.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentLineBreak.vue b/resources/js/Components/Document/DocumentLineBreak.vue new file mode 100644 index 0000000..3756b8b --- /dev/null +++ b/resources/js/Components/Document/DocumentLineBreak.vue @@ -0,0 +1,17 @@ + + + + + + diff --git a/resources/js/Components/Document/DocumentParagraph.vue b/resources/js/Components/Document/DocumentParagraph.vue new file mode 100644 index 0000000..27fc492 --- /dev/null +++ b/resources/js/Components/Document/DocumentParagraph.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentRenderer.vue b/resources/js/Components/Document/DocumentRenderer.vue new file mode 100644 index 0000000..e9f4e67 --- /dev/null +++ b/resources/js/Components/Document/DocumentRenderer.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentTable.vue b/resources/js/Components/Document/DocumentTable.vue new file mode 100644 index 0000000..689d08c --- /dev/null +++ b/resources/js/Components/Document/DocumentTable.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentTableCell.vue b/resources/js/Components/Document/DocumentTableCell.vue new file mode 100644 index 0000000..3107e1f --- /dev/null +++ b/resources/js/Components/Document/DocumentTableCell.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentTableRow.vue b/resources/js/Components/Document/DocumentTableRow.vue new file mode 100644 index 0000000..d47c3a1 --- /dev/null +++ b/resources/js/Components/Document/DocumentTableRow.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentText.vue b/resources/js/Components/Document/DocumentText.vue new file mode 100644 index 0000000..85d50ce --- /dev/null +++ b/resources/js/Components/Document/DocumentText.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/resources/js/Components/Document/DocumentTextRun.vue b/resources/js/Components/Document/DocumentTextRun.vue new file mode 100644 index 0000000..8764efc --- /dev/null +++ b/resources/js/Components/Document/DocumentTextRun.vue @@ -0,0 +1,141 @@ + + + + + + diff --git a/resources/js/Components/Document/DocumentWarning.vue b/resources/js/Components/Document/DocumentWarning.vue new file mode 100644 index 0000000..e6db015 --- /dev/null +++ b/resources/js/Components/Document/DocumentWarning.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/resources/js/Components/Document/InputVariable/PriceInput.vue b/resources/js/Components/Document/InputVariable/PriceInput.vue new file mode 100644 index 0000000..149215b --- /dev/null +++ b/resources/js/Components/Document/InputVariable/PriceInput.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/resources/js/Components/Editor.vue b/resources/js/Components/Editor.vue new file mode 100644 index 0000000..edce38d --- /dev/null +++ b/resources/js/Components/Editor.vue @@ -0,0 +1,753 @@ + + + + + + diff --git a/resources/js/Components/Form/FormGroup.vue b/resources/js/Components/Form/FormGroup.vue new file mode 100644 index 0000000..582d08c --- /dev/null +++ b/resources/js/Components/Form/FormGroup.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/resources/js/Components/Input/FileUpload.vue b/resources/js/Components/Input/FileUpload.vue new file mode 100644 index 0000000..29f8dfb --- /dev/null +++ b/resources/js/Components/Input/FileUpload.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/resources/js/Components/Input/Input.vue b/resources/js/Components/Input/Input.vue new file mode 100644 index 0000000..74aa59f --- /dev/null +++ b/resources/js/Components/Input/Input.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/resources/js/Components/Input/Search/AnimateSearch.vue b/resources/js/Components/Input/Search/AnimateSearch.vue new file mode 100644 index 0000000..a6de3f9 --- /dev/null +++ b/resources/js/Components/Input/Search/AnimateSearch.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/resources/js/Components/Input/TextArea.vue b/resources/js/Components/Input/TextArea.vue new file mode 100644 index 0000000..9ef36a2 --- /dev/null +++ b/resources/js/Components/Input/TextArea.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/resources/js/Components/List/List.vue b/resources/js/Components/List/List.vue new file mode 100644 index 0000000..2041caa --- /dev/null +++ b/resources/js/Components/List/List.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/resources/js/Components/List/ListItem.vue b/resources/js/Components/List/ListItem.vue new file mode 100644 index 0000000..0753911 --- /dev/null +++ b/resources/js/Components/List/ListItem.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/resources/js/Components/List/ListStrate.vue b/resources/js/Components/List/ListStrate.vue new file mode 100644 index 0000000..1f003c7 --- /dev/null +++ b/resources/js/Components/List/ListStrate.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/resources/js/Components/Modal/Modal.vue b/resources/js/Components/Modal/Modal.vue new file mode 100644 index 0000000..2065a70 --- /dev/null +++ b/resources/js/Components/Modal/Modal.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/resources/js/Components/Notifications/SentryNotification.vue b/resources/js/Components/Notifications/SentryNotification.vue new file mode 100644 index 0000000..90bc734 --- /dev/null +++ b/resources/js/Components/Notifications/SentryNotification.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/resources/js/Components/Page/Page.vue b/resources/js/Components/Page/Page.vue new file mode 100644 index 0000000..a5d5c55 --- /dev/null +++ b/resources/js/Components/Page/Page.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/resources/js/Components/Page/PageBody.vue b/resources/js/Components/Page/PageBody.vue new file mode 100644 index 0000000..6322ac7 --- /dev/null +++ b/resources/js/Components/Page/PageBody.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Page/PageHeader.vue b/resources/js/Components/Page/PageHeader.vue new file mode 100644 index 0000000..ae50a56 --- /dev/null +++ b/resources/js/Components/Page/PageHeader.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/resources/js/Components/PageElement.vue b/resources/js/Components/PageElement.vue new file mode 100644 index 0000000..d85e2d8 --- /dev/null +++ b/resources/js/Components/PageElement.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/resources/js/Components/Select/Select.vue b/resources/js/Components/Select/Select.vue new file mode 100644 index 0000000..ae75b82 --- /dev/null +++ b/resources/js/Components/Select/Select.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/resources/js/Components/Select/SelectOption.vue b/resources/js/Components/Select/SelectOption.vue new file mode 100644 index 0000000..5176044 --- /dev/null +++ b/resources/js/Components/Select/SelectOption.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/resources/js/Components/Sidebar/Sidebar.vue b/resources/js/Components/Sidebar/Sidebar.vue new file mode 100644 index 0000000..3eca94e --- /dev/null +++ b/resources/js/Components/Sidebar/Sidebar.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Sidebar/SidebarBody.vue b/resources/js/Components/Sidebar/SidebarBody.vue new file mode 100644 index 0000000..ec52945 --- /dev/null +++ b/resources/js/Components/Sidebar/SidebarBody.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Sidebar/SidebarFooter.vue b/resources/js/Components/Sidebar/SidebarFooter.vue new file mode 100644 index 0000000..3dd04e3 --- /dev/null +++ b/resources/js/Components/Sidebar/SidebarFooter.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Sidebar/SidebarHeader.vue b/resources/js/Components/Sidebar/SidebarHeader.vue new file mode 100644 index 0000000..5648e83 --- /dev/null +++ b/resources/js/Components/Sidebar/SidebarHeader.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Sidebar/SidebarItem.vue b/resources/js/Components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..5143afa --- /dev/null +++ b/resources/js/Components/Sidebar/SidebarItem.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/resources/js/Components/Sidebar/SidebarLabel.vue b/resources/js/Components/Sidebar/SidebarLabel.vue new file mode 100644 index 0000000..07052a2 --- /dev/null +++ b/resources/js/Components/Sidebar/SidebarLabel.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Components/Sidebar/SidebarSection.vue b/resources/js/Components/Sidebar/SidebarSection.vue new file mode 100644 index 0000000..50013ee --- /dev/null +++ b/resources/js/Components/Sidebar/SidebarSection.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/js/Composables/useApiForm.js b/resources/js/Composables/useApiForm.js new file mode 100644 index 0000000..d0c648c --- /dev/null +++ b/resources/js/Composables/useApiForm.js @@ -0,0 +1,107 @@ +// composables/useSmartApiForm.js +import { ref, reactive, watch } from 'vue' +import axios from 'axios' + +export function useApiForm(initialData = {}) { + const loading = ref(false) + const errors = ref({}) + const progress = ref(0) + + // Для обычных полей формы + const formData = ref({ ...initialData }) + // Для файлов + const files = ref({}) + + const setFile = (fieldName, file) => { + files.value[fieldName] = file + // Автоматически очищаем ошибку для этого поля + clearError(fieldName) + } + + const clearError = (field) => { + if (errors.value[field]) { + const newErrors = { ...errors.value } + delete newErrors[field] + errors.value = newErrors + } + } + + const clearAllErrors = () => { + errors.value = {} + } + + const submit = async (url, method = 'post', config = {}) => { + loading.value = true + progress.value = 0 + clearAllErrors() + + try { + // Создаем FormData + const formDataToSend = new FormData() + + // Добавляем обычные поля формы + Object.keys(formData.value).forEach(key => { + if (formData.value[key] !== null && formData.value[key] !== undefined) { + formDataToSend.append(key, formData.value[key]) + } + }) + + // Добавляем файлы + Object.keys(files.value).forEach(key => { + if (files.value[key]) { + formDataToSend.append(key, files.value[key]) + } + }) + + const response = await axios({ + method, + url, + data: formDataToSend, + headers: { + 'Content-Type': 'multipart/form-data', + ...config.headers + }, + onUploadProgress: (progressEvent) => { + if (progressEvent.total) { + progress.value = Math.round( + (progressEvent.loaded * 100) / progressEvent.total + ) + } + }, + ...config + }) + + return response.data + } catch (error) { + if (error.response?.status === 422) { + errors.value = error.response.data.errors || {} + } + throw error + } finally { + loading.value = false + } + } + + const reset = () => { + // Сбрасываем обычные поля + Object.keys(initialData).forEach(key => { + formData.value[key] = initialData[key] + }) + // Сбрасываем файлы + files.value = {} + clearAllErrors() + } + + return { + formData, + files, + errors, + loading, + progress, + submit, + setFile, + clearError, + clearAllErrors, + reset + } +} diff --git a/resources/js/Composables/useDynamicA4Layout.js b/resources/js/Composables/useDynamicA4Layout.js new file mode 100644 index 0000000..87f753a --- /dev/null +++ b/resources/js/Composables/useDynamicA4Layout.js @@ -0,0 +1,113 @@ +import { + ref, + reactive, + onMounted, + onUpdated, + nextTick +} from "vue" +import {useElementSize} from "@vueuse/core"; + +export function useDynamicA4Layout() { + const A4_HEIGHT = 933 + const A4_WIDTH = 623 + const a4Pages = reactive([]) + const isCalculating = ref(false) + const componentHeights = ref(new Map()) + + const waitForComponentRender = (componentRef, itemType) => { + return new Promise((resolve) => { + if (!componentRef) { + resolve(0) + return + } + + const checkRender = () => { + requestAnimationFrame(() => { + if (componentRef.offsetHeight > 0) { + resolve(getComponentHeight(componentRef)) + } else { + resolve(0) + // setTimeout(checkRender, 1000) + } + }) + } + + checkRender() + }) + } + + const getComponentHeight = (element) => { + if (!element) return 0 + + + const styles = getComputedStyle(element) + return element.offsetHeight + + parseInt(styles.marginTop) + + parseInt(styles.marginBottom) + + parseInt(styles.borderTopWidth) + + parseInt(styles.borderBottomWidth) + } + + const calculateDynamicLayout = async(items, getComponentRefs) => { + if (isCalculating.value) return + isCalculating.value = true + + try { + await nextTick() + + const componentRefs = getComponentRefs() + + a4Pages.splice(0, a4Pages.length) + const currentPage = {items: [], totalHeight: 0, id: Date.now()} + a4Pages.push(currentPage) + + const heightPromises = items.map(async (item, index) => { + const componentRef = componentRefs.get(item.id) + const height = await waitForComponentRender(componentRef, item.type) + componentHeights.value.set(item.id || index, height) + return height + }) + + const heights = await Promise.all(heightPromises) + + let currentHeight = 0 + const pageMargin = 0 + + items.forEach((item, index) => { + // console.log(item) + const itemHeight = heights[index] + const availableHeight = A4_HEIGHT - (pageMargin * 2) - currentHeight + + console.log(currentHeight > 0 && availableHeight < itemHeight) + + if (currentHeight > 0 && availableHeight < itemHeight) { + const newPage = { + items: [item], + totalHeight: itemHeight, + id: Date.now() + index + } + a4Pages.push(newPage) + currentHeight = itemHeight + } else { + const page = a4Pages[a4Pages.length - 1] + page.items.push(item) + page.totalHeight += itemHeight + currentHeight += itemHeight + } + }) + } catch(error) { + console.error('Ошибка вычисления размера') + } finally { + isCalculating.value = false + } + } + + return { + a4Pages, + A4_HEIGHT, + A4_WIDTH, + calculateDynamicLayout, + isCalculating, + componentHeights + } +} diff --git a/resources/js/Composables/useFileDownload.js b/resources/js/Composables/useFileDownload.js new file mode 100644 index 0000000..e20e8df --- /dev/null +++ b/resources/js/Composables/useFileDownload.js @@ -0,0 +1,66 @@ +// composables/useFileDownload.js +export const useFileDownload = () => { + const downloadFile = async (url, data, filename = 'file', method = 'post') => { + try { + const response = await axios({ + method, + url, + data: method === 'post' ? data : null, + params: method === 'get' ? data : null, + responseType: 'blob' + }); + + // Проверяем, что это действительно файл, а не ошибка + const contentType = response.headers['content-type']; + if (contentType.includes('application/json')) { + // Это JSON ошибка, а не файл + const errorData = JSON.parse(await response.data.text()); + throw new Error(errorData.error || 'Download failed'); + } + + // Создаем blob URL + const blob = new Blob([response.data], { + type: response.headers['content-type'] + }); + const downloadUrl = window.URL.createObjectURL(blob); + + // Создаем временную ссылку для скачивания + const link = document.createElement('a'); + link.href = downloadUrl; + + link.download = filename; + + // Имитируем клик для скачивания + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + // Очищаем URL + window.URL.revokeObjectURL(downloadUrl); + + return true; + + } catch (error) { + console.error('Download error:', error); + throw error; + } + }; + + const getFileNameFromResponse = (response) => { + const contentDisposition = response.headers['content-disposition']; + let fileName = 'document.docx'; + + if (contentDisposition) { + const filenameMatch = contentDisposition.match(/filename="?(.+)"?/); + if (filenameMatch && filenameMatch[1]) { + fileName = filenameMatch[1].replace(/"/g, ''); + } + } + + return fileName; + }; + + return { + downloadFile + }; +}; diff --git a/resources/js/Layouts/Sections.vue b/resources/js/Layouts/Sections.vue new file mode 100644 index 0000000..752dc1f --- /dev/null +++ b/resources/js/Layouts/Sections.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/resources/js/Layouts/Workspace.vue b/resources/js/Layouts/Workspace.vue new file mode 100644 index 0000000..b7a9586 --- /dev/null +++ b/resources/js/Layouts/Workspace.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/resources/js/Pages/ContractGenerator.vue b/resources/js/Pages/ContractGenerator.vue new file mode 100644 index 0000000..33990fd --- /dev/null +++ b/resources/js/Pages/ContractGenerator.vue @@ -0,0 +1,447 @@ + + +