[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{yml,yaml}]\nindent_size = 2\n\n[docker-compose.yml]\nindent_size = 4\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n\n*.blade.php diff=html\n*.css diff=css\n*.html diff=html\n*.md diff=markdown\n*.php diff=php\n\n/.github export-ignore\nCHANGELOG.md export-ignore\n.styleci.yml export-ignore\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/custom.md",
    "content": "---\nname: Custom issue template\nabout: Describe this issue template's purpose here.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".gitignore",
    "content": "/node_modules\n/public/build\n/public/hot\n/public/storage\n/storage/*.key\n/vendor\n.env\n.env.backup\n.phpunit.result.cache\nHomestead.json\nHomestead.yaml\nauth.json\nnpm-debug.log\nyarn-error.log\n/.idea\n/.vscode\npackage-lock.json\ncomposer.lock\nyarn.lock\n/storage/media-library/temp\n.DS_Store\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nfazrabbi010@gmail.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Contributing\n\nThank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Fazle Rabbi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "## Laravel 11 Vue.js 3 SPA Starter Boilerplate\n\nA simple and clean boilerplate to start a new SPA project with authentication, user, roles, permissions management and more features. This boilerplate uses the following tools:\n\n[![](https://img.shields.io/badge/vue.js-v3.5-04C690.svg)](https://vuejs.org)\n[![](https://img.shields.io/badge/Laravel-v11.x-ff2e21.svg)](https://laravel.com)\n[![](https://img.shields.io/badge/bootstrap-v5.3-712cf9.svg)](https://getbootstrap.com)\n[![](https://img.shields.io/badge/axios-v1.7-5A29E4.svg)](https://axios-http.com)\n[![](https://img.shields.io/badge/vite-v5.0-646cff.svg)](https://vitejs.dev)\n\n- [Laravel 11.x](https://github.com/laravel/laravel)\n- [Laravel Sanctum](https://laravel.com/docs/11.x/sanctum)\n- [Vue 3](https://github.com/vuejs/vue)\n- [Vue Router](https://router.vuejs.org/)\n- [Pinia](https://pinia.vuejs.org/)\n- [Bootstrap](https://getbootstrap.com/)\n- [Vue I18n](https://vue-i18n.intlify.dev)\n- [Laravel API Inspector - API Docs](https://github.com/irabbi360/laravel-api-inspector)\n\nLaravel is accessible, and powerful, and provides tools required for large, robust applications.\n\n## Features\n\nThe following Sanctum features are implemented in this Vue SPA:\n\n- ✅ Laravel 11\n- ✅ Vue 3\n- ✅ VueRouter\n- ✅ Pinia\n- ✅ Vue I18n Multi-Language\n- ✅ Login\n- ✅ Password Reset\n- ✅ Registration\n- ✅ Admin Panel\n- ✅ Profile Management\n- ✅ User Management\n- ✅ Roles Management\n- ✅ Permissions Management\n- ✅ Password Change\n- ✅ E-Mail Verification\n- ✅ Posts Management\n- ✅ Frontend Blog\n- ✅ Bootstrap 5\n- ✅ Automatic Api Documentation  -- route  /api-docs\n- ✅ Browser Sessions - Other Device Logout\n- ✅ User Activity Logs\n\n## How To Use\n#### Clone the repository\n\n```bash\ngit clone https://github.com/irabbi360/laravel-vue3-spa-starter.git\n```\n\n#### Copy .env.example file to .env and edit credentials also set the app URL\n\n#### Install Via Composer\n\n```bash\ncomposer install\n```\n\n#### Generate Application Key\n\n```bash\nphp artisan key:generate\n```\n\n#### Migrate Database\n\n```bash\nphp artisan migrate\n```\n\n#### Run Seeder\n\n```bash\nphp artisan db:seed\n```\n\n#### Install Node Dependencies\n\n```bash\nnpm install or yarn install\n\nnpm run dev or yarn dev\n```\n#### Production\n\n```bash\nnpm run build or yarn build\n```\n\n## Email Verification\n\nTo enable email verification, ensure your `App\\User` model implements the `Illuminate\\Contracts\\Auth\\MustVerifyEmail` contract.\n\n## N.B\n\nIf you want to use Laravel 10 or 9 version, please use laravel_10 or laravel_9 branch.\n\n## Contributing\n\nThank you for considering contributing to the project! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).\n\n## Code of Conduct\n\nTo ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).\n\n## Security Vulnerabilities\n\nIf you discover a security vulnerability within Laravel, please e-mail via [fazrabbi010@gmail.com](mailto:fazrabbi010@gmail.com). All security vulnerabilities will be promptly addressed.\n\n## License\n\nThe Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).    \nThe Vue framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).    \nThis repository is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). \n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Reporting Security Issues\n\nThe Laravel Vue3 SPA Starter highly values the contributions from the security research community. We eagerly anticipate collaborating with you to mitigate and reduce potential risks.\n\n## Where should I report security issues?\n\nIf you think that you have found a security issue in Laravel Vue3 SPA Starter, please do not use the issue tracker and do not post it publicly. Instead, all security issues must be sent to mailto:fazrabbi010@gmail.com.com.\n"
  },
  {
    "path": "app/Console/Kernel.php",
    "content": "<?php\n\nnamespace App\\Console;\n\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Foundation\\Console\\Kernel as ConsoleKernel;\n\nclass Kernel extends ConsoleKernel\n{\n    /**\n     * Define the application's command schedule.\n     *\n     * @param  \\Illuminate\\Console\\Scheduling\\Schedule  $schedule\n     * @return void\n     */\n    protected function schedule(Schedule $schedule)\n    {\n        // $schedule->command('inspire')->hourly();\n    }\n\n    /**\n     * Register the commands for the application.\n     *\n     * @return void\n     */\n    protected function commands()\n    {\n        $this->load(__DIR__.'/Commands');\n\n        require base_path('routes/console.php');\n    }\n}\n"
  },
  {
    "path": "app/Exceptions/Handler.php",
    "content": "<?php\n\nnamespace App\\Exceptions;\n\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Throwable;\n\nclass Handler extends ExceptionHandler\n{\n    /**\n     * A list of exception types with their corresponding custom log levels.\n     *\n     * @var array<class-string<\\Throwable>, \\Psr\\Log\\LogLevel::*>\n     */\n    protected $levels = [\n        //\n    ];\n\n    /**\n     * A list of the exception types that are not reported.\n     *\n     * @var array<int, class-string<\\Throwable>>\n     */\n    protected $dontReport = [\n        //\n    ];\n\n    /**\n     * A list of the inputs that are never flashed to the session on validation exceptions.\n     *\n     * @var array<int, string>\n     */\n    protected $dontFlash = [\n        'current_password',\n        'password',\n        'password_confirmation',\n    ];\n\n    /**\n     * Register the exception handling callbacks for the application.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->reportable(function (Throwable $e) {\n            //\n        });\n    }\n}\n"
  },
  {
    "path": "app/Helpers/Misc.php",
    "content": "<?php\n\nnamespace App\\Helpers;\n\nuse Illuminate\\Support\\Str;\nuse InvalidArgumentException;\n\nclass Misc\n{\n    /**\n     * Recursively converts all keys of a given array to \"headline\" format.\n     *\n     * This function accepts an array or any data type, and applies Laravel's\n     * Str::headline() helper to transform the keys of an array into a \"headline\"\n     * format, which capitalizes each word in a key and adds spaces where\n     * underscores or camel case are found. The transformation is applied\n     * recursively to nested arrays.\n     *\n     * Example:\n     * Input:\n     *   [\n     *     'first_name' => 'John',\n     *     'user_data' => [\n     *         'last_name' => 'Doe',\n     *         'contact_info' => [\n     *             'phone_number' => '1234567890'\n     *         ]\n     *     ]\n     *   ]\n     *\n     * Output:\n     *   [\n     *     'First Name' => 'John',\n     *     'User Data' => [\n     *         'Last Name' => 'Doe',\n     *         'Contact Info' => [\n     *             'Phone Number' => '1234567890'\n     *         ]\n     *     ]\n     *   ]\n     *\n     * @param  array  $data  The data to be processed. If the data is an array, its keys\n     *                       will be transformed. Non-array data types will be returned\n     *                       as-is without modification.\n     * @return array The processed data, with all array keys in \"headline\" format.\n     *               If the input was not an array, it will return the original value.\n     */\n    public static function convertKeysToHeadline(array $data)\n    {\n        $formatted = [];\n\n        // Loop through each key and value\n        foreach ($data as $key => $value) {\n            // Apply Str::headline to the key and recursively process the value if it's an array\n            $formatted[Str::headline($key)] = is_array($value) ? self::convertKeysToHeadline($value) : $value;\n        }\n\n        return $formatted;\n    }\n\n    public static function apiPagination(array $data)\n    {\n        return [\n            'current_page' => $data['current_page'],\n            'from' => $data['from'],\n            'last_page' => $data['last_page'],\n//            'links' => $data['links'],\n//            'path' => $data['path'],\n            'per_page' => $data['per_page'],\n            'to' => $data['to'],\n            'total' => $data['total'],\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/ActivityLogController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Resources\\ActivityLogResource;\nuse Illuminate\\Http\\Request;\nuse Spatie\\Activitylog\\Models\\Activity;\n\nclass ActivityLogController extends Controller\n{\n    public function __invoke(Request $request)\n    {\n        $perPage = $request->get('per_page', 15); // Default pagination size\n        $search = $request->get('search');\n\n        $activity = Activity::query()\n            ->latest()\n            ->where('causer_id', auth()->id())\n            ->when($request->filled('filter'), function ($query) use ($request) {\n                $query->where('event', $request->filter);\n            })\n            ->when($search, function ($query) use ($search) {\n                $query->where(function ($q) use ($search) {\n                    $q->where('description', 'like', '%' . $search . '%')\n                    ->orWhere('event', 'like', '%' . $search . '%');\n                });\n            })\n            ->paginate($perPage);\n\n        return ActivityLogResource::collection($activity);\n    }\n\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/BrowserSessionController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse Cjmellor\\BrowserSessions\\Facades\\BrowserSessions;\n\nclass BrowserSessionController extends Controller\n{\n    public function index()\n    {\n        $sessions = BrowserSessions::sessions();\n\n        return response()->json($sessions);\n    }\n\n    public function logoutOtherDevices()\n    {\n        return BrowserSessions::logoutOtherBrowserSessions();\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/CategoryController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\StoreCategoryRequest;\nuse App\\Http\\Resources\\CategoryResource;\nuse App\\Models\\Category;\nuse Illuminate\\Http\\Request;\n\nclass CategoryController extends Controller\n{\n    public function index()\n    {\n        $orderColumn = request('order_column', 'created_at');\n        if (!in_array($orderColumn, ['id', 'name', 'created_at'])) {\n            $orderColumn = 'created_at';\n        }\n        $orderDirection = request('order_direction', 'desc');\n        if (!in_array($orderDirection, ['asc', 'desc'])) {\n            $orderDirection = 'desc';\n        }\n        $categories = Category::\n            when(request('search_id'), function ($query) {\n                $query->where('id', request('search_id'));\n            })\n            ->when(request('search_title'), function ($query) {\n                $query->where('name', 'like', '%'.request('search_title').'%');\n            })\n            ->when(request('search_global'), function ($query) {\n                $query->where(function($q) {\n                    $q->where('id', request('search_global'))\n                        ->orWhere('name', 'like', '%'.request('search_global').'%');\n\n                });\n            })\n            ->orderBy($orderColumn, $orderDirection)\n            ->paginate(50);\n        return CategoryResource::collection($categories);\n    }\n\n    public function store(StoreCategoryRequest $request)\n    {\n        $this->authorize('category-create');\n        $category = Category::create($request->validated());\n\n        return new CategoryResource($category);\n    }\n\n    public function show(Category $category)\n    {\n        $this->authorize('category-edit');\n        return new CategoryResource($category);\n    }\n\n    public function update(Category $category, StoreCategoryRequest $request)\n    {\n        $this->authorize('category-edit');\n        $category->update($request->validated());\n\n        return new CategoryResource($category);\n    }\n\n    public function destroy(Category $category)\n    {\n        $this->authorize('category-delete');\n        $category->delete();\n\n        return response()->noContent();\n    }\n\n    public function getList()\n    {\n        return CategoryResource::collection(Category::all());\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/PermissionController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\StorePermissionRequest;\nuse App\\Http\\Resources\\PermissionResource;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Auth\\Access\\AuthorizationException;\nuse Illuminate\\Http\\JsonResponse;\nuse Spatie\\Permission\\Models\\Permission;\nuse Spatie\\Permission\\Models\\Role;\n\nclass PermissionController extends Controller\n{\n    /**\n     * Display a listing of the resource.\n     *\n     * @return \\Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection\n     */\n    public function index()\n    {\n        $orderColumn = request('order_column', 'created_at');\n        if (!in_array($orderColumn, ['id', 'name', 'created_at'])) {\n            $orderColumn = 'created_at';\n        }\n        $orderDirection = request('order_direction', 'desc');\n        if (!in_array($orderDirection, ['asc', 'desc'])) {\n            $orderDirection = 'desc';\n        }\n        $permissions = Permission::\n        when(request('search_id'), function ($query) {\n            $query->where('id', request('search_id'));\n        })\n            ->when(request('search_title'), function ($query) {\n                $query->where('name', 'like', '%' . request('search_title') . '%');\n            })\n            ->when(request('search_global'), function ($query) {\n                $query->where(function ($q) {\n                    $q->where('id', request('search_global'))\n                        ->orWhere('name', 'like', '%' . request('search_global') . '%');\n\n                });\n            })\n            ->orderBy($orderColumn, $orderDirection)\n            ->paginate(50);\n\n        return PermissionResource::collection($permissions);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param StorePermissionRequest $request\n     * @return PermissionResource\n     * @throws AuthorizationException\n     */\n    public function store(StorePermissionRequest $request)\n    {\n        $this->authorize('permission-create');\n\n        $permission = new Permission();\n        $permission->name = $request->name;\n        $permission->guard_name = 'web';\n\n        if ($permission->save()) {\n            return new PermissionResource($permission);\n        }\n\n        return response()->json(['status' => 405, 'success' => false]);\n\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param int $id\n     * @return PermissionResource\n     */\n    public function show(Permission $permission)\n    {\n        $this->authorize('permission-edit');\n\n        return new PermissionResource($permission);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param Permission $permission\n     * @param StorePermissionRequest $request\n     * @return JsonResponse|PermissionResource\n     * @throws AuthorizationException\n     */\n    public function update(Permission $permission, StorePermissionRequest $request)\n    {\n        $this->authorize('permission-edit');\n\n        $permission->name = $request->name;\n\n        if ($permission->save()) {\n            return new PermissionResource($permission);\n        }\n\n        return response()->json(['status' => 405, 'success' => false]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param int $id\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function destroy(Permission $permission)\n    {\n        $this->authorize('permission-delete');\n        $permission->delete();\n\n        return response()->noContent();\n    }\n\n    public function getRolePermissions($id)\n    {\n        $permissions = Role::findById($id, 'web')->permissions;\n        return PermissionResource::collection($permissions);\n    }\n\n    public function updateRolePermissions(Request $request)\n    {\n        $this->authorize('role-edit');\n\n        $permissions = json_decode($request->permissions, true);\n        $permissions_where = Permission::whereIn('id', $permissions)->get();\n        $role = Role::findById($request->role_id, 'web');\n        $role->syncPermissions($permissions_where);\n        return PermissionResource::collection($permissions_where);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/PostController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\StorePostRequest;\nuse App\\Http\\Resources\\PostResource;\nuse App\\Models\\Category;\nuse App\\Models\\Post;\nuse App\\Helpers\\Misc;\n\nclass PostController extends Controller\n{\n    /**\n     * Display a listing of the resource.\n     * @LAPIresponsesSchema PostResource\n     * @LAPIpagination\n     * @LAPIQueryParams search_title, page, per_page, order_column, order_direction, search_category, search_id, search_content, search_global\n    */\n    public function index()\n    {\n        $orderColumn = request('order_column', 'created_at');\n        if (!in_array($orderColumn, ['id', 'title', 'created_at'])) {\n            $orderColumn = 'created_at';\n        }\n        $orderDirection = request('order_direction', 'desc');\n        if (!in_array($orderDirection, ['asc', 'desc'])) {\n            $orderDirection = 'desc';\n        }\n        $posts = Post::with('media')\n            ->whereHas('categories', function ($query) {\n                if (request('search_category')) {\n                    $categories = explode(\",\", request('search_category'));\n                    $query->whereIn('id', $categories);\n                }\n            })\n            ->when(request('search_id'), function ($query) {\n                $query->where('id', request('search_id'));\n            })\n            ->when(request('search_title'), function ($query) {\n                $query->where('title', 'like', '%' . request('search_title') . '%');\n            })\n            ->when(request('search_content'), function ($query) {\n                $query->where('content', 'like', '%' . request('search_content') . '%');\n            })\n            ->when(request('search_global'), function ($query) {\n                $query->where(function ($q) {\n                    $q->where('id', request('search_global'))\n                        ->orWhere('title', 'like', '%' . request('search_global') . '%')\n                        ->orWhere('content', 'like', '%' . request('search_global') . '%');\n\n                });\n            })\n            ->when(!auth()->user()->hasPermissionTo('post-all'), function ($query) {\n                $query->where('user_id', auth()->id());\n            })\n            ->orderBy($orderColumn, $orderDirection)\n            ->paginate(50);\n\n        return PostResource::collection($posts);\n    }\n\n    public function store(StorePostRequest $request)\n    {\n        $this->authorize('post-create');\n\n        $validatedData = $request->validated();\n        $validatedData['user_id'] = auth()->id();\n        $post = Post::create($validatedData);\n\n        $categories = explode(\",\", $request->categories);\n        $category = Category::findMany($categories);\n        $post->categories()->attach($category);\n\n        if ($request->hasFile('thumbnail')) {\n            $post->addMediaFromRequest('thumbnail')->preservingOriginal()->toMediaCollection('images');\n        }\n\n        return new PostResource($post);\n    }\n\n    public function show(Post $post): PostResource\n    {\n        $this->authorize('post-edit');\n        if ($post->user_id !== auth()->user()->id && !auth()->user()->hasPermissionTo('post-all')) {\n            return response()->json(['status' => 405, 'success' => false, 'message' => 'You can only edit your own posts']);\n        } else {\n            return new PostResource($post);\n        }\n    }\n\n    public function update(Post $post, StorePostRequest $request)\n    {\n        $this->authorize('post-edit');\n        if ($post->user_id !== auth()->id() && !auth()->user()->hasPermissionTo('post-all')) {\n            return response()->json(['status' => 405, 'success' => false, 'message' => 'You can only edit your own posts']);\n        } else {\n            $post->update($request->validated());\n\n            $category = Category::findMany($request->categories);\n            $post->categories()->sync($category);\n            return new PostResource($post);\n        }\n    }\n\n    public function destroy(Post $post)\n    {\n        $this->authorize('post-delete');\n        if ($post->user_id !== auth()->id() && !auth()->user()->hasPermissionTo('post-all')) {\n            return response()->json(['status' => 405, 'success' => false, 'message' => 'You can only delete your own posts']);\n        } else {\n            $post->delete();\n            return response()->noContent();\n        }\n    }\n\n    /*\n     * Display a listing of the resource.\n    */\n    public function getPosts()\n    {\n        $posts = Post::with('categories')->with('media')->latest()->paginate(1);\n        return PostResource::collection($posts);\n    }\n\n    public function getCategoryByPosts($id)\n    {\n        $posts = Post::whereRelation('categories', 'category_id', '=', $id)->paginate();\n\n        return PostResource::collection($posts);\n    }\n\n    public function getPost($id)\n    {\n        return Post::with('categories', 'user', 'media')->findOrFail($id);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/ProfileController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\UpdateProfileRequest;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\Validation\\ValidationException;\n\nclass ProfileController extends Controller\n{\n    /**\n     * @throws ValidationException\n     */\n    public function update(UpdateProfileRequest $request)\n    {\n        $profile = Auth::user();\n        $profile->name = $request->name;\n        $profile->email = $request->email;\n\n        if ($profile->save()) {\n            return $this->successResponse($profile, 'User updated');;\n        }\n        return response()->json(['status' => 403, 'success' => false]);\n    }\n\n    public function user(Request $request)\n    {\n        $user = $request->user();\n\n        return $this->successResponse($user, 'User Logged In Successfully');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/RoleController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Auth\\Access\\AuthorizationException;\nuse App\\Http\\Requests\\StoreRoleRequest;\nuse App\\Http\\Resources\\RoleResource;\nuse Spatie\\Permission\\Models\\Role;\n\nclass RoleController extends Controller\n{\n    /**\n     * Display a listing of the resource.\n     *\n     * @return \\Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection\n     */\n    public function index()\n    {\n        $orderColumn = request('order_column', 'created_at');\n        if (!in_array($orderColumn, ['id', 'name', 'created_at'])) {\n            $orderColumn = 'created_at';\n        }\n        $orderDirection = request('order_direction', 'desc');\n        if (!in_array($orderDirection, ['asc', 'desc'])) {\n            $orderDirection = 'desc';\n        }\n        $roles = Role::\n            when(request('search_id'), function ($query) {\n                $query->where('id', request('search_id'));\n            })\n            ->when(request('search_title'), function ($query) {\n                $query->where('name', 'like', '%'.request('search_title').'%');\n            })\n            ->when(request('search_global'), function ($query) {\n                $query->where(function($q) {\n                    $q->where('id', request('search_global'))\n                        ->orWhere('name', 'like', '%'.request('search_global').'%');\n\n                });\n            })\n            ->orderBy($orderColumn, $orderDirection)\n            ->paginate(50);\n\n        return RoleResource::collection($roles);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return RoleResource\n     */\n    public function store(StoreRoleRequest $request)\n    {\n        $this->authorize('role-create');\n\n        $role = new Role();\n        $role->name = $request->name;\n        $role->guard_name = 'web';\n\n        if ($role->save()) {\n            return new RoleResource($role);\n        }\n\n        return response()->json(['status' => 405, 'success' => false]);\n\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param  int  $id\n     * @return RoleResource\n     */\n    public function show(Role $role)\n    {\n        $this->authorize('role-edit');\n\n        return new RoleResource($role);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param Role $role\n     * @param StoreRoleRequest $request\n     * @return RoleResource\n     * @throws AuthorizationException\n     */\n    public function update(Role $role, StoreRoleRequest $request)\n    {\n        $this->authorize('role-edit');\n\n        $role->name = $request->name;\n\n        if ($role->save()) {\n            return new RoleResource($role);\n        }\n\n        return response()->json(['status' => 405, 'success' => false]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param  int  $id\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function destroy(Role $role)\n    {\n        $this->authorize('role-delete');\n        $role->delete();\n\n        return response()->noContent();\n    }\n\n    public function getList()\n    {\n        return RoleResource::collection(Role::all());\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Api/UserController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\StoreUserRequest;\nuse App\\Http\\Requests\\UpdateUserRequest;\nuse App\\Http\\Resources\\UserResource;\nuse App\\Models\\User;\nuse Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Spatie\\Permission\\Models\\Role;\n\nclass UserController extends Controller\n{\n    /**\n     * Display a listing of the resource.\n     *\n     * @return AnonymousResourceCollection\n     */\n    public function index()\n    {\n        $orderColumn = request('order_column', 'created_at');\n        if (!in_array($orderColumn, ['id', 'name', 'created_at'])) {\n            $orderColumn = 'created_at';\n        }\n        $orderDirection = request('order_direction', 'desc');\n        if (!in_array($orderDirection, ['asc', 'desc'])) {\n            $orderDirection = 'desc';\n        }\n        $users = User::\n        when(request('search_id'), function ($query) {\n            $query->where('id', request('search_id'));\n        })\n            ->when(request('search_title'), function ($query) {\n                $query->where('name', 'like', '%'.request('search_title').'%');\n            })\n            ->when(request('search_global'), function ($query) {\n                $query->where(function($q) {\n                    $q->where('id', request('search_global'))\n                        ->orWhere('name', 'like', '%'.request('search_global').'%');\n\n                });\n            })\n            ->orderBy($orderColumn, $orderDirection)\n            ->paginate(50);\n\n        return UserResource::collection($users);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return UserResource\n     */\n    public function store(StoreUserRequest $request)\n    {\n        $role = Role::find($request->role_id);\n        $user = new User();\n        $user->name = $request->name;\n        $user->email = $request->email;\n        $user->password = Hash::make($request->password);\n\n        if ($user->save()) {\n            if ($role) {\n                $user->assignRole($role);\n            }\n            return new UserResource($user);\n        }\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param  int  $id\n     * @return UserResource\n     */\n    public function show(User $user)\n    {\n        $user->load('roles');\n        return new UserResource($user);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param UpdateUserRequest $request\n     * @param User $user\n     * @return UserResource\n     */\n    public function update(UpdateUserRequest $request, User $user)\n    {\n        $role = Role::find($request->role_id);\n\n        $user->name = $request->name;\n        $user->email = $request->email;\n        if(!empty($request->password)) {\n            $user->password = Hash::make($request->password) ?? $user->password;\n        }\n\n        if ($user->save()) {\n            if ($role) {\n                $user->syncRoles($role);\n            }\n            return new UserResource($user);\n        }\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param  int  $id\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function destroy(User $user)\n    {\n        $this->authorize('user-delete');\n        $user->delete();\n\n        return response()->noContent();\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/AuthenticatedSessionController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\Auth\\LoginRequest;\nuse App\\Http\\Requests\\Auth\\RegisterRequest;\nuse App\\Models\\User;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Illuminate\\Contracts\\Routing\\ResponseFactory;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\Support\\Facades\\Hash;\n\nclass AuthenticatedSessionController extends Controller\n{\n    /**\n     * Display the login view.\n     *\n     * @return \\Illuminate\\View\\View\n     */\n    public function create()\n    {\n        return view('auth.login');\n    }\n\n    /**\n     * Handle an incoming authentication request.\n     *\n     * @param  \\App\\Http\\Requests\\Auth\\LoginRequest  $request\n     * @return \\Illuminate\\Http\\RedirectResponse\n     */\n    public function login(LoginRequest $request)\n    {\n        $request->authenticate();\n\n//        $token = $request->session()->regenerate();\n        $token = $request->user()->createToken($request->userAgent())->plainTextToken;\n\n        activity()\n            ->performedOn($request->user())\n            ->causedBy(auth()->user())\n            ->event('login')\n            ->withProperties(['ip' => $request->ip()])\n            ->log('User login successfully');\n\n        if ($request->wantsJson()) {\n            $user = $request->user();\n            \n            // Check if email verification is required and if email is verified\n            $emailVerified = !($user instanceof \\Illuminate\\Contracts\\Auth\\MustVerifyEmail) || $user->hasVerifiedEmail();\n            \n            return response()->json([\n                'user' => $user,\n                'token' => $token,\n                'email_verified' => $emailVerified\n            ]);\n        }\n\n        return redirect()->intended(RouteServiceProvider::HOME);\n    }\n\n    /**\n     * Destroy an authenticated session.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\RedirectResponse\n     */\n    public function logout(Request $request)\n    {\n        activity()\n            ->performedOn($request->user())\n            ->causedBy(auth()->user())\n            ->event('logout')\n            ->withProperties(['ip' => $request->ip()])\n            ->log('User logout successfully');\n\n        Auth::guard('web')->logout();\n\n        $request->session()->invalidate();\n\n        $request->session()->regenerateToken();\n\n        if ($request->wantsJson()) {\n            return response()->noContent();\n        }\n\n        return redirect('/');\n    }\n\n    /**\n     * Create User\n     * @param RegisterRequest $request\n     * @return JsonResponse\n     */\n    public function register(RegisterRequest $request)\n    {\n        $user = User::where('email', $request['email'])->first();\n        if ($user) {\n            return response(['error' => 1, 'message' => 'user already exists'], 409);\n        }\n\n        $user = User::create([\n            'email' => $request['email'],\n            'password' => Hash::make($request['password']),\n            'name' => $request['name'],\n        ]);\n\n        // Trigger Registered event which will send verification email\n        if($user instanceof \\Illuminate\\Contracts\\Auth\\MustVerifyEmail) {\n            event(new \\Illuminate\\Auth\\Events\\Registered($user));\n        }\n\n        return $this->successResponse($user, 'Registration Successful. Please verify your email to activate your account.');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/ConfirmPasswordController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Foundation\\Auth\\ConfirmsPasswords;\n\nclass ConfirmPasswordController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Confirm Password Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller is responsible for handling password confirmations and\n    | uses a simple trait to include the behavior. You're free to explore\n    | this trait and override any functions that require customization.\n    |\n    */\n\n    use ConfirmsPasswords;\n\n    /**\n     * Where to redirect users when the intended url fails.\n     *\n     * @var string\n     */\n    protected $redirectTo = RouteServiceProvider::HOME;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('auth');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/ForgotPasswordController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Foundation\\Auth\\SendsPasswordResetEmails;\n\nclass ForgotPasswordController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Password Reset Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller is responsible for handling password reset emails and\n    | includes a trait which assists in sending these notifications from\n    | your application to your users. Feel free to explore this trait.\n    |\n    */\n\n    use SendsPasswordResetEmails;\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/LoginController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Foundation\\Auth\\AuthenticatesUsers;\n\nclass LoginController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Login Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller handles authenticating users for the application and\n    | redirecting them to your home screen. The controller uses a trait\n    | to conveniently provide its functionality to your applications.\n    |\n    */\n\n    use AuthenticatesUsers;\n\n    /**\n     * Where to redirect users after login.\n     *\n     * @var string\n     */\n    protected $redirectTo = RouteServiceProvider::HOME;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('guest')->except('logout');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/RegisterController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider;\nuse App\\Models\\User;\nuse Illuminate\\Foundation\\Auth\\RegistersUsers;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Validator;\n\nclass RegisterController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Register Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller handles the registration of new users as well as their\n    | validation and creation. By default this controller uses a trait to\n    | provide this functionality without requiring any additional code.\n    |\n    */\n\n    use RegistersUsers;\n\n    /**\n     * Where to redirect users after registration.\n     *\n     * @var string\n     */\n    protected $redirectTo = RouteServiceProvider::HOME;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('guest');\n    }\n\n    /**\n     * Get a validator for an incoming registration request.\n     *\n     * @param  array  $data\n     * @return \\Illuminate\\Contracts\\Validation\\Validator\n     */\n    protected function validator(array $data)\n    {\n        return Validator::make($data, [\n            'name' => ['required', 'string', 'max:255'],\n            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],\n            'password' => ['required', 'string', 'min:8', 'confirmed'],\n        ]);\n    }\n\n    /**\n     * Create a new user instance after a valid registration.\n     *\n     * @param  array  $data\n     * @return \\App\\Models\\User\n     */\n    protected function create(array $data)\n    {\n        return User::create([\n            'name' => $data['name'],\n            'email' => $data['email'],\n            'password' => Hash::make($data['password']),\n        ]);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/ResetPasswordController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Foundation\\Auth\\ResetsPasswords;\n\nclass ResetPasswordController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Password Reset Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller is responsible for handling password reset requests\n    | and uses a simple trait to include this behavior. You're free to\n    | explore this trait and override any methods you wish to tweak.\n    |\n    */\n\n    use ResetsPasswords;\n\n    /**\n     * Where to redirect users after resetting their password.\n     *\n     * @var string\n     */\n    protected $redirectTo = RouteServiceProvider::HOME;\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/VerificationController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Foundation\\Auth\\VerifiesEmails;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Routing\\Exceptions\\InvalidSignatureException;\n\nclass VerificationController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Email Verification Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller is responsible for handling email verification for any\n    | user that recently registered with the application. Emails may also\n    | be re-sent if the user didn't receive the original email message.\n    |\n    */\n\n    use VerifiesEmails;\n\n    /**\n     * Where to redirect users after verification.\n     *\n     * @var string\n     */\n    protected $redirectTo = RouteServiceProvider::HOME;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('throttle:6,1')->only('verify', 'resend');\n    }\n\n    /**\n     * Mark the authenticated user's email address as verified.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\JsonResponse|\\Illuminate\\Http\\RedirectResponse\n     */\n    public function verify(Request $request)\n    {\n        $user = \\App\\Models\\User::findOrFail($request->route('id'));\n\n        if ($user->hasVerifiedEmail()) {\n            if ($request->wantsJson()) {\n                return response()->json(['message' => 'Email already verified.'], Response::HTTP_OK);\n            }\n            return redirect()->intended($this->redirectTo);\n        }\n\n        if ($user->markEmailAsVerified()) {\n            event(new \\Illuminate\\Auth\\Events\\Verified($user));\n        }\n\n        if ($request->wantsJson()) {\n            return response()->json(['message' => 'Email has been verified.'], Response::HTTP_OK);\n        }\n\n        return redirect()->intended($this->redirectTo.'?verified=1');\n    }\n\n    /**\n     * Resend the email verification notification.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return \\Illuminate\\Http\\JsonResponse|\\Illuminate\\Http\\RedirectResponse\n     */\n    public function resend(Request $request)\n    {\n        if ($request->user()->hasVerifiedEmail()) {\n            if ($request->wantsJson()) {\n                return response()->json(['message' => 'Email already verified.'], Response::HTTP_OK);\n            }\n            return redirect()->intended($this->redirectTo);\n        }\n\n        $request->user()->sendEmailVerificationNotification();\n\n        if ($request->wantsJson()) {\n            return response()->json(['message' => 'Verification link sent to your email.'], Response::HTTP_OK);\n        }\n\n        return back()->with('resent', true);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Controller.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests;\nuse Illuminate\\Foundation\\Bus\\DispatchesJobs;\nuse Illuminate\\Foundation\\Validation\\ValidatesRequests;\nuse Illuminate\\Routing\\Controller as BaseController;\n\nclass Controller extends BaseController\n{\n    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;\n\n    protected function successResponse($data, $message = null, $code = 200)\n    {\n        return response()->json([\n            'success'=> true,\n            'message' => $message,\n            'data' => $data\n        ], $code);\n    }\n\n    protected function errorResponse($message = null, $code)\n    {\n        return response()->json([\n            'success'=> false,\n            'message' => $message,\n            'data' => null\n        ], $code);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/HomeController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nclass HomeController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('auth');\n    }\n\n    /**\n     * Show the application dashboard.\n     *\n     * @return \\Illuminate\\Contracts\\Support\\Renderable\n     */\n    public function index()\n    {\n        return view('home');\n    }\n}\n"
  },
  {
    "path": "app/Http/Kernel.php",
    "content": "<?php\n\nnamespace App\\Http;\n\nuse Illuminate\\Foundation\\Http\\Kernel as HttpKernel;\n\nclass Kernel extends HttpKernel\n{\n    /**\n     * The application's global HTTP middleware stack.\n     *\n     * These middleware are run during every request to your application.\n     *\n     * @var array<int, class-string|string>\n     */\n    protected $middleware = [\n        // \\App\\Http\\Middleware\\TrustHosts::class,\n        \\App\\Http\\Middleware\\TrustProxies::class,\n        \\Illuminate\\Http\\Middleware\\HandleCors::class,\n        \\App\\Http\\Middleware\\PreventRequestsDuringMaintenance::class,\n        \\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize::class,\n        \\App\\Http\\Middleware\\TrimStrings::class,\n        \\Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull::class,\n    ];\n\n    /**\n     * The application's route middleware groups.\n     *\n     * @var array<string, array<int, class-string|string>>\n     */\n    protected $middlewareGroups = [\n        'web' => [\n            \\App\\Http\\Middleware\\EncryptCookies::class,\n            \\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class,\n            \\Illuminate\\Session\\Middleware\\StartSession::class,\n            \\Illuminate\\View\\Middleware\\ShareErrorsFromSession::class,\n            \\App\\Http\\Middleware\\VerifyCsrfToken::class,\n            \\Illuminate\\Routing\\Middleware\\SubstituteBindings::class,\n        ],\n\n        'api' => [\n             \\Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful::class,\n            'throttle:api',\n            \\Illuminate\\Routing\\Middleware\\SubstituteBindings::class,\n            \\Irabbi360\\LaravelApiInspector\\Http\\Middleware\\ApiInspectorMiddleware::class,\n        ],\n    ];\n\n    /**\n     * The application's route middleware.\n     *\n     * These middleware may be assigned to groups or used individually.\n     *\n     * @var array<string, class-string|string>\n     */\n    protected $middlewareAliases = [\n        'auth' => \\App\\Http\\Middleware\\Authenticate::class,\n        'auth.basic' => \\Illuminate\\Auth\\Middleware\\AuthenticateWithBasicAuth::class,\n        'auth.session' => \\Illuminate\\Session\\Middleware\\AuthenticateSession::class,\n        'cache.headers' => \\Illuminate\\Http\\Middleware\\SetCacheHeaders::class,\n        'can' => \\Illuminate\\Auth\\Middleware\\Authorize::class,\n        'guest' => \\App\\Http\\Middleware\\RedirectIfAuthenticated::class,\n        'password.confirm' => \\Illuminate\\Auth\\Middleware\\RequirePassword::class,\n        'signed' => \\App\\Http\\Middleware\\ValidateSignature::class,\n        'throttle' => \\Illuminate\\Routing\\Middleware\\ThrottleRequests::class,\n        'verified.api' => \\App\\Http\\Middleware\\EnsureEmailIsVerified::class,\n        'role' => \\Spatie\\Permission\\Middlewares\\RoleMiddleware::class,\n        'permission' => \\Spatie\\Permission\\Middlewares\\PermissionMiddleware::class,\n        'role_or_permission' => \\Spatie\\Permission\\Middlewares\\RoleOrPermissionMiddleware::class,\n    ];\n}\n"
  },
  {
    "path": "app/Http/Middleware/Authenticate.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Auth\\Middleware\\Authenticate as Middleware;\n\nclass Authenticate extends Middleware\n{\n    /**\n     * Get the path the user should be redirected to when they are not authenticated.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return string|null\n     */\n    protected function redirectTo($request)\n    {\n        if (! $request->expectsJson()) {\n            return route('login');\n        }\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/EncryptCookies.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies as Middleware;\n\nclass EncryptCookies extends Middleware\n{\n    /**\n     * The names of the cookies that should not be encrypted.\n     *\n     * @var array<int, string>\n     */\n    protected $except = [\n        //\n    ];\n}\n"
  },
  {
    "path": "app/Http/Middleware/EnsureEmailIsVerified.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Contracts\\Auth\\MustVerifyEmail;\nuse Illuminate\\Http\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nclass EnsureEmailIsVerified\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Closure(\\Illuminate\\Http\\Request): (\\Symfony\\Component\\HttpFoundation\\Response)  $next\n     */\n    public function handle(Request $request, Closure $next): Response\n    {\n        if (! $request->user() ||\n            ($request->user() instanceof MustVerifyEmail &&\n            ! $request->user()->hasVerifiedEmail())) {\n            return response()->json([\n                'message' => 'Your email address is not verified.',\n                'email_verified' => false\n            ], 403);\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/HandleInvalidSignature.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Exceptions\\InvalidSignatureException;\n\nclass HandleInvalidSignature\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure(\\Illuminate\\Http\\Request): (\\Illuminate\\Http\\Response|\\Illuminate\\Http\\RedirectResponse)  $next\n     * @return \\Illuminate\\Http\\Response|\\Illuminate\\Http\\RedirectResponse\n     */\n    public function handle(Request $request, Closure $next)\n    {\n        try {\n            // Get user ID from route parameter\n            $userId = $request->route('id');\n            $user = \\App\\Models\\User::find($userId);\n\n            // Check if user exists\n            if (!$user) {\n                return response()->json([\n                    'message' => 'User not found.',\n                ], 404);\n            }\n\n            // Check if authenticated user matches the user being verified\n            if ($request->user() && $request->user()->id != $userId) {\n                return response()->json([\n                    'message' => 'Unauthorized. You can only verify your own email.',\n                ], 403);\n            }\n\n            // If user is already verified, skip signature validation\n            if ($user->hasVerifiedEmail()) {\n                return response()->json([\n                    'message' => 'Email already verified.',\n                ], 200);\n            }\n\n            // Check if signature is valid\n            if (!$request->hasValidSignature()) {\n                return response()->json([\n                    'message' => 'Invalid or expired verification link.',\n                ], 400);\n            }\n            \n            return $next($request);\n        } catch (InvalidSignatureException $e) {\n            if ($request->wantsJson()) {\n                return response()->json([\n                    'message' => 'Invalid or expired verification link.',\n                ], 400);\n            }\n            throw $e;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/PreventRequestsDuringMaintenance.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance as Middleware;\n\nclass PreventRequestsDuringMaintenance extends Middleware\n{\n    /**\n     * The URIs that should be reachable while maintenance mode is enabled.\n     *\n     * @var array<int, string>\n     */\n    protected $except = [\n        //\n    ];\n}\n"
  },
  {
    "path": "app/Http/Middleware/RedirectIfAuthenticated.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse App\\Providers\\RouteServiceProvider;\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Auth;\n\nclass RedirectIfAuthenticated\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure(\\Illuminate\\Http\\Request): (\\Illuminate\\Http\\Response|\\Illuminate\\Http\\RedirectResponse)  $next\n     * @param  string|null  ...$guards\n     * @return \\Illuminate\\Http\\Response|\\Illuminate\\Http\\RedirectResponse\n     */\n    public function handle(Request $request, Closure $next, ...$guards)\n    {\n        $guards = empty($guards) ? [null] : $guards;\n\n        foreach ($guards as $guard) {\n            if (Auth::guard($guard)->check()) {\n                return redirect(RouteServiceProvider::HOME);\n            }\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/TrimStrings.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\TrimStrings as Middleware;\n\nclass TrimStrings extends Middleware\n{\n    /**\n     * The names of the attributes that should not be trimmed.\n     *\n     * @var array<int, string>\n     */\n    protected $except = [\n        'current_password',\n        'password',\n        'password_confirmation',\n    ];\n}\n"
  },
  {
    "path": "app/Http/Middleware/TrustHosts.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Http\\Middleware\\TrustHosts as Middleware;\n\nclass TrustHosts extends Middleware\n{\n    /**\n     * Get the host patterns that should be trusted.\n     *\n     * @return array<int, string|null>\n     */\n    public function hosts()\n    {\n        return [\n            $this->allSubdomainsOfApplicationUrl(),\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/TrustProxies.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Http\\Middleware\\TrustProxies as Middleware;\nuse Illuminate\\Http\\Request;\n\nclass TrustProxies extends Middleware\n{\n    /**\n     * The trusted proxies for this application.\n     *\n     * @var array<int, string>|string|null\n     */\n    protected $proxies;\n\n    /**\n     * The headers that should be used to detect proxies.\n     *\n     * @var int\n     */\n    protected $headers =\n        Request::HEADER_X_FORWARDED_FOR |\n        Request::HEADER_X_FORWARDED_HOST |\n        Request::HEADER_X_FORWARDED_PORT |\n        Request::HEADER_X_FORWARDED_PROTO |\n        Request::HEADER_X_FORWARDED_AWS_ELB;\n}\n"
  },
  {
    "path": "app/Http/Middleware/ValidateSignature.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Routing\\Middleware\\ValidateSignature as Middleware;\n\nclass ValidateSignature extends Middleware\n{\n    /**\n     * The names of the query string parameters that should be ignored.\n     *\n     * @var array<int, string>\n     */\n    protected $except = [\n        // 'fbclid',\n        // 'utm_campaign',\n        // 'utm_content',\n        // 'utm_medium',\n        // 'utm_source',\n        // 'utm_term',\n    ];\n}\n"
  },
  {
    "path": "app/Http/Middleware/VerifyCsrfToken.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken as Middleware;\n\nclass VerifyCsrfToken extends Middleware\n{\n    /**\n     * The URIs that should be excluded from CSRF verification.\n     *\n     * @var array<int, string>\n     */\n    protected $except = [\n        'api/*', 'login','register'\n    ];\n}\n"
  },
  {
    "path": "app/Http/Requests/Auth/LoginRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests\\Auth;\n\nuse Illuminate\\Auth\\Events\\Lockout;\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\Support\\Facades\\RateLimiter;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\Validation\\ValidationException;\n\nclass LoginRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        return [\n            'email' => ['required', 'string', 'email'],\n            'password' => ['required', 'string'],\n        ];\n    }\n\n    /**\n     * Attempt to authenticate the request's credentials.\n     *\n     * @return void\n     *\n     * @throws \\Illuminate\\Validation\\ValidationException\n     */\n    public function authenticate()\n    {\n        $this->ensureIsNotRateLimited();\n\n        if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {\n            RateLimiter::hit($this->throttleKey());\n\n            throw ValidationException::withMessages([\n                'email' => trans('auth.failed'),\n            ]);\n        }\n\n        // Check if email is verified\n        // $user = Auth::user();\n        // if (! $user->hasVerifiedEmail()) {\n        //     Auth::logout();\n        //     throw ValidationException::withMessages([\n        //         'email' => 'Your email address is not verified. Please check your email to verify your account.',\n        //     ]);\n        // }\n\n        RateLimiter::clear($this->throttleKey());\n    }\n\n    /**\n     * Ensure the login request is not rate limited.\n     *\n     * @return void\n     *\n     * @throws \\Illuminate\\Validation\\ValidationException\n     */\n    public function ensureIsNotRateLimited()\n    {\n        if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {\n            return;\n        }\n\n        event(new Lockout($this));\n\n        $seconds = RateLimiter::availableIn($this->throttleKey());\n\n        throw ValidationException::withMessages([\n            'email' => trans('auth.throttle', [\n                'seconds' => $seconds,\n                'minutes' => ceil($seconds / 60),\n            ]),\n        ]);\n    }\n\n    /**\n     * Get the rate limiting throttle key for the request.\n     *\n     * @return string\n     */\n    public function throttleKey()\n    {\n        return Str::lower($this->input('email')).'|'.$this->ip();\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/Auth/RegisterRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests\\Auth;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass RegisterRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, mixed>\n     */\n    public function rules()\n    {\n        return [\n            'name' => ['required', 'string', 'max:255'],\n            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],\n            'password' => ['required', 'string', 'min:8', 'confirmed'],\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/StoreCategoryRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass StoreCategoryRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        return [\n            'name' => 'required'\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/StorePermissionRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass StorePermissionRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, mixed>\n     */\n    public function rules()\n    {\n        return [\n            'name' => 'required'\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/StorePostRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass StorePostRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        return [\n            'title' => 'required',\n            'content' => 'required',\n            'categories' => 'required'\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/StoreRoleRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass StoreRoleRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, mixed>\n     */\n    public function rules()\n    {\n        return [\n            'name' => 'required'\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/StoreUserRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass StoreUserRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     */\n    public function authorize(): bool\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, \\Illuminate\\Contracts\\Validation\\ValidationRule|array|string>\n     */\n    public function rules(): array\n    {\n        return [\n            'name' => ['required', 'string', 'max:255'],\n            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],\n            'password' => ['required', 'string', 'min:8'],\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/UpdateProfileRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass UpdateProfileRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, mixed>\n     */\n    public function rules()\n    {\n        return [\n            'name' => 'required|min:5',\n            'email' => 'required|email|unique:users,email,'.$this->user()->id\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/UpdateUserRequest.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass UpdateUserRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     */\n    public function authorize(): bool\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, \\Illuminate\\Contracts\\Validation\\ValidationRule|array|string>\n     */\n    public function rules(): array\n    {\n        return [\n            'name' => ['required', 'string', 'max:255'],\n            'email' => 'required|string|email|max:255|unique:users,email,'.$this->user->id,\n            'password' => ['nullable', 'string', 'min:8'],\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Resources/ActivityLogResource.php",
    "content": "<?php\n\nnamespace App\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass ActivityLogResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @return array<string, mixed>\n     */\n    public function toArray(Request $request): array\n    {\n        return [\n            'id' => $this->id,\n            'log_name' => $this->log_name,\n            'description' => $this->description,\n            'subject_type' => $this->subject_type,\n            'event' => $this->event,\n            'causer_type' => $this->causer_type,\n            'causer_id' => $this->causer_id,\n            'properties' => $this->properties,\n            'batch_uuid' => $this->batch_uuid,\n            'created_at' => $this->created_at,\n            'format_created_at' => $this->created_at->diffForHumans(),\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Resources/CategoryResource.php",
    "content": "<?php\n\nnamespace App\\Http\\Resources;\n\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass CategoryResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     *\n     * @return array|\\Illuminate\\Contracts\\Support\\Arrayable|\\JsonSerializable\n     */\n    public function toArray($request)\n    {\n        return [\n            'id'   => $this->id,\n            'name' => $this->name,\n            'created_at' => $this->created_at->toDateString()\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Resources/PermissionResource.php",
    "content": "<?php\n\nnamespace App\\Http\\Resources;\n\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass PermissionResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return array|\\Illuminate\\Contracts\\Support\\Arrayable|\\JsonSerializable\n     */\n    public function toArray($request)\n    {\n        return [\n            'id'   => $this->id,\n            'name' => $this->name,\n            'guard_name' => $this->guard_name,\n            'created_at' => $this->created_at->toDateString()\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Resources/PostResource.php",
    "content": "<?php\n\nnamespace App\\Http\\Resources;\n\nuse Exception;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass PostResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return array|\\Illuminate\\Contracts\\Support\\Arrayable|\\JsonSerializable\n     */\n    public function toArray($request)\n    {\n        //if no resize image\n        try {\n            $resized_image = $this->getMedia('*')[0]->getUrl('resized-image');\n        } catch (Exception $e) {\n            $resized_image=\"\";\n        }\n        return [\n            'id' => $this->id,\n            'title' => $this->title,\n            'user_id' => $this->user_id,\n            'categories' => $this->categories,\n            'content' => $this->content,\n            'original_image' => count($this->getMedia('*')) > 0 ? $this->getMedia('*')[0]->getUrl() : null,\n            'resized_image' => $resized_image,\n            'created_at' => $this->created_at->toDateString(),\n            'user' => new UserResource($this->whenLoaded('user')),\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Resources/RoleResource.php",
    "content": "<?php\n\nnamespace App\\Http\\Resources;\n\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass RoleResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return array|\\Illuminate\\Contracts\\Support\\Arrayable|\\JsonSerializable\n     */\n    public function toArray($request)\n    {\n        return [\n            'id'   => $this->id,\n            'name' => $this->name,\n            'guard_name' => $this->guard_name,\n            'created_at' => $this->created_at->toDateString()\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Http/Resources/UserResource.php",
    "content": "<?php\n\nnamespace App\\Http\\Resources;\n\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass UserResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @return array|\\Illuminate\\Contracts\\Support\\Arrayable|\\JsonSerializable\n     */\n    public function toArray($request)\n    {\n        return [\n            'id'   => $this->id,\n            'name' => $this->name,\n            'email' => $this->email,\n            'role_id' => $this->roles,\n            'roles' => $this->roles,\n            'created_at' => $this->created_at->toDateString()\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Models/Category.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Spatie\\Activitylog\\LogOptions;\nuse Spatie\\Activitylog\\Traits\\LogsActivity;\n\nclass Category extends Model\n{\n    use HasFactory, LogsActivity;\n\n    protected $fillable = ['name', 'text'];\n\n    public function getActivitylogOptions(): LogOptions\n    {\n        return LogOptions::defaults()\n            ->logOnly(['name', 'text']);\n        // Chain fluent methods for configuration options\n    }\n\n    /**\n     * Get the posts for the category.\n     */\n    public function posts()\n    {\n        return $this->belongsToMany(Post::class,'category_post');\n    }\n}\n"
  },
  {
    "path": "app/Models/CategoryPost.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass CategoryPost extends Model\n{\n    use HasFactory;\n}\n"
  },
  {
    "path": "app/Models/Post.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Spatie\\Activitylog\\LogOptions;\nuse Spatie\\Activitylog\\Traits\\LogsActivity;\nuse Spatie\\Image\\Manipulations;\nuse Spatie\\MediaLibrary\\HasMedia;\nuse Spatie\\MediaLibrary\\InteractsWithMedia;\nuse Spatie\\MediaLibrary\\MediaCollections\\Models\\Media;\n\n//use Spatie\\MediaLibrary\\MediaCollections\\Models\\Media;\n\n\nclass Post extends Model implements HasMedia\n{\n    use HasFactory, InteractsWithMedia, LogsActivity;\n\n    protected $fillable = ['title', 'content', 'user_id', 'name', 'text',];\n\n    public function getActivitylogOptions(): LogOptions\n    {\n        return LogOptions::defaults()\n            ->logOnly(['name', 'text']);\n        // Chain fluent methods for configuration options\n    }\n\n    public function user()\n    {\n        return $this->belongsTo(User::class);\n    }\n\n    /**\n     * Get the category that owns the post.\n     */\n    public function categories()\n    {\n        return $this->belongsToMany(Category::class, 'category_post');\n    }\n\n    public function registerMediaCollections(): void\n    {\n        $this->addMediaCollection('images')\n            ->useFallbackUrl('/images/placeholder.jpg')\n            ->useFallbackPath(public_path('/images/placeholder.jpg'));\n    }\n\n    public function registerMediaConversions(Media $media = null): void\n    {\n        if (env('RESIZE_IMAGE') === true) {\n\n            $this->addMediaConversion('resized-image')\n                ->width(env('IMAGE_WIDTH', 300))\n                ->height(env('IMAGE_HEIGHT', 300));\n        }\n    }\n}\n"
  },
  {
    "path": "app/Models/User.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Contracts\\Auth\\MustVerifyEmail;\nuse App\\Notifications\\UserResetPasswordNotification;\nuse App\\Notifications\\VerifyEmailNotification;\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Foundation\\Auth\\User as Authenticatable;\nuse Illuminate\\Notifications\\Notifiable;\nuse Laravel\\Sanctum\\HasApiTokens;\nuse Spatie\\Activitylog\\Traits\\LogsActivity;\nuse Spatie\\Permission\\Traits\\HasRoles;\nuse Spatie\\Activitylog\\LogOptions;\n\nclass User extends Authenticatable\n{\n    use HasApiTokens, HasFactory, Notifiable, HasRoles, LogsActivity;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array<int, string>\n     */\n    protected $fillable = [\n        'name',\n        'email',\n        'password',\n        'name',\n        'text',\n    ];\n\n    /**\n     * The attributes that should be hidden for serialization.\n     *\n     * @var array<int, string>\n     */\n    protected $hidden = [\n        'password',\n        'remember_token',\n    ];\n\n    /**\n     * The attributes that should be cast.\n     *\n     * @var array<string, string>\n     */\n    protected $casts = [\n        'email_verified_at' => 'datetime',\n    ];\n\n    public function sendPasswordResetNotification($token)\n    {\n        $this->notify(new UserResetPasswordNotification($token));\n    }\n\n    /**\n     * Send the email verification notification.\n     *\n     * @return void\n     */\n    public function sendEmailVerificationNotification()\n    {\n        $this->notify(new VerifyEmailNotification());\n    }\n\n    public function getActivitylogOptions(): LogOptions\n    {\n        return LogOptions::defaults()\n            ->logOnly(['name', 'text']);\n        // Chain fluent methods for configuration options\n    }\n}\n\n"
  },
  {
    "path": "app/Notifications/UserResetPasswordNotification.php",
    "content": "<?php\n\nnamespace App\\Notifications;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Notifications\\Messages\\MailMessage;\nuse Illuminate\\Auth\\Notifications\\ResetPassword as ResetPasswordNotification;\n\nclass UserResetPasswordNotification extends ResetPasswordNotification\n{\n    use Queueable;\n\n    /**\n     * Get the mail representation of the notification.\n     */\n    public function toMail($notifiable): MailMessage\n    {\n        $resetUrl = url(config('app.url') . '/reset-password/' . $this->token .'?email='. $notifiable->getEmailForPasswordReset());\n        return (new MailMessage)\n            ->line('You are receiving this email because we received a password reset request for your account.')\n            ->action('Reset Password', $resetUrl)\n            ->line('If you did not request a password reset, no further action is required.');\n    }\n\n    /**\n     * Get the array representation of the notification.\n     *\n     * @return array<string, mixed>\n     */\n    public function toArray(object $notifiable): array\n    {\n        return [\n            //\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Notifications/VerifyEmailNotification.php",
    "content": "<?php\n\nnamespace App\\Notifications;\n\nuse Illuminate\\Auth\\Notifications\\VerifyEmail;\nuse Illuminate\\Notifications\\Messages\\MailMessage;\n\nclass VerifyEmailNotification extends VerifyEmail\n{\n    /**\n     * Build the mail message.\n     *\n     * @param  mixed  $notifiable\n     * @return \\Illuminate\\Notifications\\Messages\\MailMessage\n     */\n    public function toMail($notifiable)\n    {\n        $verificationUrl = $this->verificationUrl($notifiable);\n        \n        // Convert /api/email/verify to /verify for the frontend URL\n        $verificationUrl = str_replace('/api/email/verify', '/email/verify', $verificationUrl);\n\n        return (new MailMessage)\n            ->subject('Verify Email Address')\n            ->line('Please click the button below to verify your email address.')\n            ->action('Verify Email Address', $verificationUrl)\n            ->line('If you did not create an account, no further action is required.');\n    }\n}\n"
  },
  {
    "path": "app/Providers/AppServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\Facades\\Vite;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    /**\n     * Register any application services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        //\n    }\n\n    /**\n     * Bootstrap any application services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        Vite::prefetch(concurrency: 3);\n    }\n}\n"
  },
  {
    "path": "app/Providers/AuthServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\n\nuse Illuminate\\Support\\Facades\\Gate;\nuse Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider as ServiceProvider;\nuse Spatie\\Permission\\Models\\Permission;\n\nclass AuthServiceProvider extends ServiceProvider\n{\n    /**\n     * The model to policy mappings for the application.\n     *\n     * @var array<class-string, class-string>\n     */\n    protected $policies = [\n        // 'App\\Models\\Model' => 'App\\Policies\\ModelPolicy',\n    ];\n\n    /**\n     * Register any authentication / authorization services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        $this->registerPolicies();\n        $this->registerUserAccessToGates();\n    }\n\n    protected function registerUserAccessToGates()\n    {\n        try {\n            foreach (Permission::pluck('name') as $permission) {\n                Gate::define($permission, function ($user) use ($permission) {\n                    return $user->roles()->whereHas('permissions', function ($q) use ($permission) {\n                        $q->where('name', $permission);\n                    })->count() > 0;\n                });\n            }\n        } catch (\\Exception $e) {\n            info('registerUserAccessToGates: Database not found or not yet migrated. Ignoring user permissions while booting app.');\n        }\n    }\n}\n"
  },
  {
    "path": "app/Providers/BroadcastServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\Facades\\Broadcast;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass BroadcastServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap any application services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        Broadcast::routes();\n\n        require base_path('routes/channels.php');\n    }\n}\n"
  },
  {
    "path": "app/Providers/EventServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Auth\\Events\\Registered;\nuse Illuminate\\Auth\\Listeners\\SendEmailVerificationNotification;\nuse Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider as ServiceProvider;\nuse Illuminate\\Support\\Facades\\Event;\n\nclass EventServiceProvider extends ServiceProvider\n{\n    /**\n     * The event to listener mappings for the application.\n     *\n     * @var array<class-string, array<int, class-string>>\n     */\n    protected $listen = [\n        Registered::class => [\n            SendEmailVerificationNotification::class,\n        ],\n    ];\n\n    /**\n     * Register any events for your application.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        //\n    }\n\n    /**\n     * Determine if events and listeners should be automatically discovered.\n     *\n     * @return bool\n     */\n    public function shouldDiscoverEvents()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/Providers/RouteServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Cache\\RateLimiting\\Limit;\nuse Illuminate\\Foundation\\Support\\Providers\\RouteServiceProvider as ServiceProvider;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\RateLimiter;\nuse Illuminate\\Support\\Facades\\Route;\n\nclass RouteServiceProvider extends ServiceProvider\n{\n    /**\n     * The path to the \"home\" route for your application.\n     *\n     * Typically, users are redirected here after authentication.\n     *\n     * @var string\n     */\n    public const HOME = '/dashboard';\n\n    /**\n     * Define your route model bindings, pattern filters, and other route configuration.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        $this->configureRateLimiting();\n\n        $this->routes(function () {\n            Route::middleware('api')\n                ->prefix('api')\n                ->group(base_path('routes/api.php'));\n\n            Route::middleware('web')\n                ->group(base_path('routes/web.php'));\n        });\n    }\n\n    /**\n     * Configure the rate limiters for the application.\n     *\n     * @return void\n     */\n    protected function configureRateLimiting()\n    {\n        RateLimiter::for('api', function (Request $request) {\n            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());\n        });\n    }\n}\n"
  },
  {
    "path": "artisan",
    "content": "#!/usr/bin/env php\n<?php\n\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|--------------------------------------------------------------------------\n| Register The Auto Loader\n|--------------------------------------------------------------------------\n|\n| Composer provides a convenient, automatically generated class loader\n| for our application. We just need to utilize it! We'll require it\n| into the script here so that we do not have to worry about the\n| loading of any of our classes manually. It's great to relax.\n|\n*/\n\nrequire __DIR__.'/vendor/autoload.php';\n\n$app = require_once __DIR__.'/bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Run The Artisan Application\n|--------------------------------------------------------------------------\n|\n| When we run the console application, the current CLI command will be\n| executed in this console and the response sent back to a terminal\n| or another output device for the developers. Here goes nothing!\n|\n*/\n\n$kernel = $app->make(Illuminate\\Contracts\\Console\\Kernel::class);\n\n$status = $kernel->handle(\n    $input = new Symfony\\Component\\Console\\Input\\ArgvInput,\n    new Symfony\\Component\\Console\\Output\\ConsoleOutput\n);\n\n/*\n|--------------------------------------------------------------------------\n| Shutdown The Application\n|--------------------------------------------------------------------------\n|\n| Once Artisan has finished running, we will fire off the shutdown events\n| so that any final work may be done by the application before we shut\n| down the process. This is the last thing to happen to the request.\n|\n*/\n\n$kernel->terminate($input, $status);\n\nexit($status);\n"
  },
  {
    "path": "bootstrap/app.php",
    "content": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Create The Application\n|--------------------------------------------------------------------------\n|\n| The first thing we will do is create a new Laravel application instance\n| which serves as the \"glue\" for all the components of Laravel, and is\n| the IoC container for the system binding all of the various parts.\n|\n*/\n\n$app = new Illuminate\\Foundation\\Application(\n    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)\n);\n\n/*\n|--------------------------------------------------------------------------\n| Bind Important Interfaces\n|--------------------------------------------------------------------------\n|\n| Next, we need to bind some important interfaces into the container so\n| we will be able to resolve them when needed. The kernels serve the\n| incoming requests to this application from both the web and CLI.\n|\n*/\n\n$app->singleton(\n    Illuminate\\Contracts\\Http\\Kernel::class,\n    App\\Http\\Kernel::class\n);\n\n$app->singleton(\n    Illuminate\\Contracts\\Console\\Kernel::class,\n    App\\Console\\Kernel::class\n);\n\n$app->singleton(\n    Illuminate\\Contracts\\Debug\\ExceptionHandler::class,\n    App\\Exceptions\\Handler::class\n);\n\n/*\n|--------------------------------------------------------------------------\n| Return The Application\n|--------------------------------------------------------------------------\n|\n| This script returns the application instance. The instance is given to\n| the calling script so we can separate the building of the instances\n| from the actual running of the application and sending responses.\n|\n*/\n\nreturn $app;\n"
  },
  {
    "path": "bootstrap/cache/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"laravel/laravel\",\n    \"type\": \"project\",\n    \"description\": \"A Laravel Vue SPA starter project\",\n    \"keywords\": [\"spa\", \"laravel\", \"vue\"],\n    \"license\": \"MIT\",\n    \"require\": {\n        \"php\": \"^8.2\",\n        \"cjmellor/browser-sessions\": \"^1.3\",\n        \"guzzlehttp/guzzle\": \"^7.2\",\n        \"irabbi360/laravel-api-inspector\": \"^1.2\",\n        \"laravel/framework\": \"^11.0\",\n        \"laravel/sanctum\": \"^4.0\",\n        \"laravel/tinker\": \"^2.9\",\n        \"laravel/ui\": \"^4.2\",\n        \"spatie/laravel-activitylog\": \"^4.9\",\n        \"spatie/laravel-medialibrary\": \"^11.9.2\",\n        \"spatie/laravel-permission\": \"^6.9\"\n    },\n    \"require-dev\": {\n        \"fakerphp/faker\": \"^1.23\",\n        \"laravel/pint\": \"^1.13\",\n        \"laravel/sail\": \"^1.26\",\n        \"mockery/mockery\": \"^1.6\",\n        \"nunomaduro/collision\": \"^8.1\",\n        \"phpunit/phpunit\": \"^11.0.1\",\n        \"spatie/laravel-ignition\": \"^2.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"App\\\\\": \"app/\",\n            \"Database\\\\Factories\\\\\": \"database/factories/\",\n            \"Database\\\\Seeders\\\\\": \"database/seeders/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Tests\\\\\": \"tests/\"\n        }\n    },\n    \"scripts\": {\n        \"post-autoload-dump\": [\n            \"Illuminate\\\\Foundation\\\\ComposerScripts::postAutoloadDump\",\n            \"@php artisan package:discover --ansi\"\n        ],\n        \"post-update-cmd\": [\n            \"@php artisan vendor:publish --tag=laravel-assets --ansi --force\"\n        ],\n        \"post-root-package-install\": [\n            \"@php -r \\\"file_exists('.env') || copy('.env.example', '.env');\\\"\"\n        ],\n        \"post-create-project-cmd\": [\n            \"@php artisan key:generate --ansi\"\n        ]\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"dont-discover\": []\n        }\n    },\n    \"config\": {\n        \"optimize-autoloader\": true,\n        \"preferred-install\": \"dist\",\n        \"sort-packages\": true,\n        \"allow-plugins\": {\n            \"pestphp/pest-plugin\": true\n        }\n    },\n    \"minimum-stability\": \"stable\",\n    \"prefer-stable\": true\n}\n"
  },
  {
    "path": "config/activitylog.php",
    "content": "<?php\n\nreturn [\n\n    /*\n     * If set to false, no activity-log will be saved to the database.\n     */\n    'enabled' => env('ACTIVITY_LOGGER_ENABLED', true),\n\n    /*\n     * When the clean-command is executed, all recording activity-log older than\n     * the number of days specified here will be deleted.\n     */\n    'delete_records_older_than_days' => 365,\n\n    /*\n     * If no log name is passed to the activity-log() helper\n     * we use this default log name.\n     */\n    'default_log_name' => 'default',\n\n    /*\n     * You can specify an auth driver here that gets user models.\n     * If this is null we'll use the current Laravel auth driver.\n     */\n    'default_auth_driver' => null,\n\n    /*\n     * If set to true, the subject returns soft deleted models.\n     */\n    'subject_returns_soft_deleted_models' => false,\n\n    /*\n     * This model will be used to log activity-log.\n     * It should implement the Spatie\\Activitylog\\Contracts\\Activity interface\n     * and extend Illuminate\\Database\\Eloquent\\Model.\n     */\n    'activity_model' => \\Spatie\\Activitylog\\Models\\Activity::class,\n\n    /*\n     * This is the name of the table that will be created by the migration and\n     * used by the Activity model shipped with this package.\n     */\n    'table_name' => env('ACTIVITY_LOGGER_TABLE_NAME', 'activity_log'),\n\n    /*\n     * This is the database connection that will be used by the migration and\n     * the Activity model shipped with this package. In case it's not set\n     * Laravel's database.default will be used instead.\n     */\n    'database_connection' => env('ACTIVITY_LOGGER_DB_CONNECTION'),\n];\n"
  },
  {
    "path": "config/api-inspector.php",
    "content": "<?php\n\n// config for Irabbi360/LaravelApiInspector\nreturn [\n    // changes doc title\n    'title' => 'Laravel API Inspector',\n    'enabled' => true,\n\n    /*\n    * Route where request docs will be served from laravel app.\n    * localhost:8080/api-docs\n    */\n    'route_path' => 'api-docs',\n\n    /*\n    |--------------------------------------------------------------------------\n    | API Inspector Assets Path\n    |--------------------------------------------------------------------------\n    | The path to the API Inspector assets.\n    |\n    */\n\n    'assets_path' => 'vendor/api-inspector',\n\n    'output' => [\n        'openapi' => true,\n        'postman' => true,\n        'html' => true,\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Response Capture Configuration\n    |--------------------------------------------------------------------------\n    | Phase 2: Runtime response capture and caching\n    |\n    */\n\n    'save_responses' => true,\n\n    'save_responses_driver' => 'json', // 'cache' or 'json'\n\n    'middleware_capture' => true,\n\n    'response_ttl' => 3600, // TTL for cached responses in seconds (1 hour)\n\n    'auth' => [\n        'type' => 'bearer',\n        'header' => 'Authorization',\n    ],\n\n    'response_path' => 'api-docs', // Subfolder name\n\n    'storage_path' => 'storage', // 'storage' or 'local'\n\n    // Use only routes where ->uri start with next string Using Str::startWith( . e.g. - /api/mobile\n    'only_route_uri_start_with' => 'api/',\n\n    'hide_matching' => [\n        'api-inspector-docs',\n        'api-inspector',\n        'sanctum',\n        'telescope',\n        'docs',\n        '_ignition',\n    ],\n\n    // By default, LAPI groups your routes by the first /path.\n    // This is a set of regex to group your routes by prefix.\n    'group_by' => [\n        'uri_patterns' => [\n            '^api/v[\\d]+/', // `/api/v1/users/store` group as `/api/v1/users`.\n            '^api/',        // `/api/users/store` group as `/api/users`.\n        ],\n    ],\n\n    /*\n    * Can be used to define default response status codes to be shown in the docs\n    */\n    'default_responses' => ['200', '400', '401', '403', '404', '405', '422', '429', '500', '503'],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Pagination Schema\n    |--------------------------------------------------------------------------\n    | Define the structure of pagination metadata when @LAPIpagination is used.\n    | Matches Laravel's default pagination response structure.\n    |\n    */\n    'pagination_schema' => [\n        'data' => 'array',\n        'links' => [\n            'first' => 'string',\n            'last' => 'string',\n            'prev' => 'string | null',\n            'next' => 'string | null',\n        ],\n        'meta' => [\n            'current_page' => 'integer',\n            'from' => 'integer | null',\n            'last_page' => 'integer',\n            'path' => 'string',\n            'per_page' => 'integer',\n            'to' => 'integer | null',\n            'total' => 'integer',\n            'links' => 'array',\n        ],\n        'show_pagination' => ['links', 'meta'],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Analytics, Dashboard, and Advanced Features\n    |--------------------------------------------------------------------------\n    */\n\n    'analytics' => [\n        'enabled' => true,\n        'track_response_time' => true,\n        'track_memory_usage' => true,\n        'track_errors' => true,\n        'retention_days' => 30, // Keep analytics for 30 days\n        'track_only_uri_start_with' => 'api/',\n        'exclude_routes' => [\n            'api-inspector-docs',\n            'api-inspector',\n            'sanctum',\n            'telescope',\n            'docs',\n            '_ignition',\n        ],\n    ],\n\n    'dashboard' => [\n        'enabled' => true,\n        'auth_middleware' => ['web'], // Middleware for dashboard protection\n    ],\n\n    'webhooks' => [\n        // 'user.created' => [\n        //     'event' => 'user.created',\n        //     'description' => 'Fired when a new user is created',\n        //     'url' => 'https://example.com/webhooks/user/created',\n        //     'method' => 'POST',\n        //     'payload' => [\n        //         'id' => 'integer',\n        //         'email' => 'string',\n        //         'name' => 'string',\n        //     ],\n        //     'examples' => [],\n        //     'active' => true,\n        // ],\n    ],\n\n    'auth_testing' => [\n        'enabled' => true,\n        'schemes' => ['bearer', 'api-key', 'basic', 'oauth2'],\n        'test_endpoint_prefix' => '/api/',\n    ],\n];\n"
  },
  {
    "path": "config/app.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Name\n    |--------------------------------------------------------------------------\n    |\n    | This value is the name of your application. This value is used when the\n    | framework needs to place the application's name in a notification or\n    | any other location as required by the application or its packages.\n    |\n    */\n\n    'name' => env('APP_NAME', 'Laravel Vue 3 Stater'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Environment\n    |--------------------------------------------------------------------------\n    |\n    | This value determines the \"environment\" your application is currently\n    | running in. This may determine how you prefer to configure various\n    | services the application utilizes. Set this in your \".env\" file.\n    |\n    */\n\n    'env' => env('APP_ENV', 'production'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Debug Mode\n    |--------------------------------------------------------------------------\n    |\n    | When your application is in debug mode, detailed error messages with\n    | stack traces will be shown on every error that occurs within your\n    | application. If disabled, a simple generic error page is shown.\n    |\n    */\n\n    'debug' => (bool) env('APP_DEBUG', false),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application URL\n    |--------------------------------------------------------------------------\n    |\n    | This URL is used by the console to properly generate URLs when using\n    | the Artisan command line tool. You should set this to the root of\n    | your application so that it is used when running Artisan tasks.\n    |\n    */\n\n    'url' => env('APP_URL', 'http://localhost'),\n\n    'asset_url' => env('ASSET_URL'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Timezone\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the default timezone for your application, which\n    | will be used by the PHP date and date-time functions. We have gone\n    | ahead and set this to a sensible default for you out of the box.\n    |\n    */\n\n    'timezone' => 'UTC',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Locale Configuration\n    |--------------------------------------------------------------------------\n    |\n    | The application locale determines the default locale that will be used\n    | by the translation service provider. You are free to set this value\n    | to any of the locales which will be supported by the application.\n    |\n    */\n\n    'locale' => 'en',\n    'locales' => [\n        'en' => 'EN',\n        'bn' => 'BN',\n        'es' => 'ES',\n        'fr' => 'FR',\n        'pt-BR' => 'BR',\n        'zh-CN' => '中文',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Fallback Locale\n    |--------------------------------------------------------------------------\n    |\n    | The fallback locale determines the locale to use when the current one\n    | is not available. You may change the value to correspond to any of\n    | the language folders that are provided through your application.\n    |\n    */\n\n    'fallback_locale' => 'en',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Faker Locale\n    |--------------------------------------------------------------------------\n    |\n    | This locale will be used by the Faker PHP library when generating fake\n    | data for your database seeds. For example, this will be used to get\n    | localized telephone numbers, street address information and more.\n    |\n    */\n\n    'faker_locale' => 'en_US',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Encryption Key\n    |--------------------------------------------------------------------------\n    |\n    | This key is used by the Illuminate encrypter service and should be set\n    | to a random, 32 character string, otherwise these encrypted strings\n    | will not be safe. Please do this before deploying an application!\n    |\n    */\n\n    'key' => env('APP_KEY'),\n\n    'cipher' => 'AES-256-CBC',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Maintenance Mode Driver\n    |--------------------------------------------------------------------------\n    |\n    | These configuration options determine the driver used to determine and\n    | manage Laravel's \"maintenance mode\" status. The \"cache\" driver will\n    | allow maintenance mode to be controlled across multiple machines.\n    |\n    | Supported drivers: \"file\", \"cache\"\n    |\n    */\n\n    'maintenance' => [\n        'driver' => 'file',\n        // 'store'  => 'redis',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Autoloaded Service Providers\n    |--------------------------------------------------------------------------\n    |\n    | The service providers listed here will be automatically loaded on the\n    | request to your application. Feel free to add your own services to\n    | this array to grant expanded functionality to your applications.\n    |\n    */\n\n    'providers' => [\n\n        /*\n         * Laravel Framework Service Providers...\n         */\n        Illuminate\\Auth\\AuthServiceProvider::class,\n        Illuminate\\Broadcasting\\BroadcastServiceProvider::class,\n        Illuminate\\Bus\\BusServiceProvider::class,\n        Illuminate\\Cache\\CacheServiceProvider::class,\n        Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider::class,\n        Illuminate\\Cookie\\CookieServiceProvider::class,\n        Illuminate\\Database\\DatabaseServiceProvider::class,\n        Illuminate\\Encryption\\EncryptionServiceProvider::class,\n        Illuminate\\Filesystem\\FilesystemServiceProvider::class,\n        Illuminate\\Foundation\\Providers\\FoundationServiceProvider::class,\n        Illuminate\\Hashing\\HashServiceProvider::class,\n        Illuminate\\Mail\\MailServiceProvider::class,\n        Illuminate\\Notifications\\NotificationServiceProvider::class,\n        Illuminate\\Pagination\\PaginationServiceProvider::class,\n        Illuminate\\Pipeline\\PipelineServiceProvider::class,\n        Illuminate\\Queue\\QueueServiceProvider::class,\n        Illuminate\\Redis\\RedisServiceProvider::class,\n        Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider::class,\n        Illuminate\\Session\\SessionServiceProvider::class,\n        Illuminate\\Translation\\TranslationServiceProvider::class,\n        Illuminate\\Validation\\ValidationServiceProvider::class,\n        Illuminate\\View\\ViewServiceProvider::class,\n\n        /*\n         * Package Service Providers...\n         */\n\n        /*\n         * Application Service Providers...\n         */\n        App\\Providers\\AppServiceProvider::class,\n        App\\Providers\\AuthServiceProvider::class,\n        // App\\Providers\\BroadcastServiceProvider::class,\n        App\\Providers\\EventServiceProvider::class,\n        App\\Providers\\RouteServiceProvider::class,\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Class Aliases\n    |--------------------------------------------------------------------------\n    |\n    | This array of class aliases will be registered when this application\n    | is started. However, feel free to register as many as you wish as\n    | the aliases are \"lazy\" loaded so they don't hinder performance.\n    |\n    */\n\n    'aliases' => Facade::defaultAliases()->merge([\n        // 'ExampleClass' => App\\Example\\ExampleClass::class,\n    ])->toArray(),\n\n];\n"
  },
  {
    "path": "config/auth.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Defaults\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default authentication \"guard\" and password\n    | reset options for your application. You may change these defaults\n    | as required, but they're a perfect start for most applications.\n    |\n    */\n\n    'defaults' => [\n        'guard' => 'web',\n        'passwords' => 'users',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Guards\n    |--------------------------------------------------------------------------\n    |\n    | Next, you may define every authentication guard for your application.\n    | Of course, a great default configuration has been defined for you\n    | here which uses session storage and the Eloquent user provider.\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | Supported: \"session\"\n    |\n    */\n\n    'guards' => [\n        'web' => [\n            'driver' => 'session',\n            'provider' => 'users',\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | User Providers\n    |--------------------------------------------------------------------------\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | If you have multiple user tables or models you may configure multiple\n    | sources which represent each model / table. These sources may then\n    | be assigned to any extra authentication guards you have defined.\n    |\n    | Supported: \"database\", \"eloquent\"\n    |\n    */\n\n    'providers' => [\n        'users' => [\n            'driver' => 'eloquent',\n            'model' => App\\Models\\User::class,\n        ],\n\n        // 'users' => [\n        //     'driver' => 'database',\n        //     'table' => 'users',\n        // ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Resetting Passwords\n    |--------------------------------------------------------------------------\n    |\n    | You may specify multiple password reset configurations if you have more\n    | than one user table or model in the application and you want to have\n    | separate password reset settings based on the specific user types.\n    |\n    | The expire time is the number of minutes that each reset token will be\n    | considered valid. This security feature keeps tokens short-lived so\n    | they have less time to be guessed. You may change this as needed.\n    |\n    */\n\n    'passwords' => [\n        'users' => [\n            'provider' => 'users',\n            'table' => 'password_resets',\n            'expire' => 60,\n            'throttle' => 60,\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Password Confirmation Timeout\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define the amount of seconds before a password confirmation\n    | times out and the user is prompted to re-enter their password via the\n    | confirmation screen. By default, the timeout lasts for three hours.\n    |\n    */\n\n    'password_timeout' => 10800,\n\n];\n"
  },
  {
    "path": "config/broadcasting.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Broadcaster\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default broadcaster that will be used by the\n    | framework when an event needs to be broadcast. You may set this to\n    | any of the connections defined in the \"connections\" array below.\n    |\n    | Supported: \"pusher\", \"ably\", \"redis\", \"log\", \"null\"\n    |\n    */\n\n    'default' => env('BROADCAST_DRIVER', 'null'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Broadcast Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define all of the broadcast connections that will be used\n    | to broadcast events to other systems or over websockets. Samples of\n    | each available type of connection are provided inside this array.\n    |\n    */\n\n    'connections' => [\n\n        'pusher' => [\n            'driver' => 'pusher',\n            'key' => env('PUSHER_APP_KEY'),\n            'secret' => env('PUSHER_APP_SECRET'),\n            'app_id' => env('PUSHER_APP_ID'),\n            'options' => [\n                'host' => env('PUSHER_HOST', 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',\n                'port' => env('PUSHER_PORT', 443),\n                'scheme' => env('PUSHER_SCHEME', 'https'),\n                'encrypted' => true,\n                'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',\n            ],\n            'client_options' => [\n                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html\n            ],\n        ],\n\n        'ably' => [\n            'driver' => 'ably',\n            'key' => env('ABLY_KEY'),\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'default',\n        ],\n\n        'log' => [\n            'driver' => 'log',\n        ],\n\n        'null' => [\n            'driver' => 'null',\n        ],\n\n    ],\n\n];\n"
  },
  {
    "path": "config/browser-sessions.php",
    "content": "<?php\n\nreturn [\n    'include_session_id' => true,\n    'browser_session_guard' => env('BROWSER_SESSION_GUARD', 'web'),\n];\n"
  },
  {
    "path": "config/cache.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Cache Store\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default cache connection that gets used while\n    | using this caching library. This connection is used when another is\n    | not explicitly specified when executing a given caching function.\n    |\n    */\n\n    'default' => env('CACHE_DRIVER', 'file'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Stores\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define all of the cache \"stores\" for your application as\n    | well as their drivers. You may even define multiple stores for the\n    | same cache driver to group types of items stored in your caches.\n    |\n    | Supported drivers: \"apc\", \"array\", \"database\", \"file\",\n    |         \"memcached\", \"redis\", \"dynamodb\", \"octane\", \"null\"\n    |\n    */\n\n    'stores' => [\n\n        'apc' => [\n            'driver' => 'apc',\n        ],\n\n        'array' => [\n            'driver' => 'array',\n            'serialize' => false,\n        ],\n\n        'database' => [\n            'driver' => 'database',\n            'table' => 'cache',\n            'connection' => null,\n            'lock_connection' => null,\n        ],\n\n        'file' => [\n            'driver' => 'file',\n            'path' => storage_path('framework/cache/data'),\n        ],\n\n        'memcached' => [\n            'driver' => 'memcached',\n            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),\n            'sasl' => [\n                env('MEMCACHED_USERNAME'),\n                env('MEMCACHED_PASSWORD'),\n            ],\n            'options' => [\n                // Memcached::OPT_CONNECT_TIMEOUT => 2000,\n            ],\n            'servers' => [\n                [\n                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),\n                    'port' => env('MEMCACHED_PORT', 11211),\n                    'weight' => 100,\n                ],\n            ],\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'cache',\n            'lock_connection' => 'default',\n        ],\n\n        'dynamodb' => [\n            'driver' => 'dynamodb',\n            'key' => env('AWS_ACCESS_KEY_ID'),\n            'secret' => env('AWS_SECRET_ACCESS_KEY'),\n            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),\n            'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),\n            'endpoint' => env('DYNAMODB_ENDPOINT'),\n        ],\n\n        'octane' => [\n            'driver' => 'octane',\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Key Prefix\n    |--------------------------------------------------------------------------\n    |\n    | When utilizing the APC, database, memcached, Redis, or DynamoDB cache\n    | stores there might be other applications using the same cache. For\n    | that reason, you may prefix every cache key to avoid collisions.\n    |\n    */\n\n    'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),\n\n];\n"
  },
  {
    "path": "config/cors.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cross-Origin Resource Sharing (CORS) Configuration\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure your settings for cross-origin resource sharing\n    | or \"CORS\". This determines what cross-origin operations may execute\n    | in web browsers. You are free to adjust these settings as needed.\n    |\n    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\n    |\n    */\n\n    'paths' => ['api/*', 'sanctum/csrf-cookie'],\n\n    'allowed_methods' => ['*'],\n\n    'allowed_origins' => ['*'],\n\n    'allowed_origins_patterns' => [],\n\n    'allowed_headers' => ['*'],\n\n    'exposed_headers' => [],\n\n    'max_age' => 0,\n\n    'supports_credentials' => false,\n\n];\n"
  },
  {
    "path": "config/database.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Database Connection Name\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify which of the database connections below you wish\n    | to use as your default connection for all database work. Of course\n    | you may use many connections at once using the Database library.\n    |\n    */\n\n    'default' => env('DB_CONNECTION', 'mysql'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Database Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here are each of the database connections setup for your application.\n    | Of course, examples of configuring each database platform that is\n    | supported by Laravel is shown below to make development simple.\n    |\n    |\n    | All database work in Laravel is done through the PHP PDO facilities\n    | so make sure you have the driver for your particular database of\n    | choice installed on your machine before you begin development.\n    |\n    */\n\n    'connections' => [\n\n        'sqlite' => [\n            'driver' => 'sqlite',\n            'url' => env('DATABASE_URL'),\n            'database' => env('DB_DATABASE', database_path('database.sqlite')),\n            'prefix' => '',\n            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),\n        ],\n\n        'mysql' => [\n            'driver' => 'mysql',\n            'url' => env('DATABASE_URL'),\n            'host' => env('DB_HOST', '127.0.0.1'),\n            'port' => env('DB_PORT', '3306'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'unix_socket' => env('DB_SOCKET', ''),\n            'charset' => 'utf8mb4',\n            'collation' => 'utf8mb4_unicode_ci',\n            'prefix' => '',\n            'prefix_indexes' => true,\n            'strict' => true,\n            'engine' => null,\n            'options' => extension_loaded('pdo_mysql') ? array_filter([\n                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),\n            ]) : [],\n        ],\n\n        'pgsql' => [\n            'driver' => 'pgsql',\n            'url' => env('DATABASE_URL'),\n            'host' => env('DB_HOST', '127.0.0.1'),\n            'port' => env('DB_PORT', '5432'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'charset' => 'utf8',\n            'prefix' => '',\n            'prefix_indexes' => true,\n            'search_path' => 'public',\n            'sslmode' => 'prefer',\n        ],\n\n        'sqlsrv' => [\n            'driver' => 'sqlsrv',\n            'url' => env('DATABASE_URL'),\n            'host' => env('DB_HOST', 'localhost'),\n            'port' => env('DB_PORT', '1433'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'charset' => 'utf8',\n            'prefix' => '',\n            'prefix_indexes' => true,\n            // 'encrypt' => env('DB_ENCRYPT', 'yes'),\n            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Migration Repository Table\n    |--------------------------------------------------------------------------\n    |\n    | This table keeps track of all the migrations that have already run for\n    | your application. Using this information, we can determine which of\n    | the migrations on disk haven't actually been run in the database.\n    |\n    */\n\n    'migrations' => 'migrations',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Redis Databases\n    |--------------------------------------------------------------------------\n    |\n    | Redis is an open source, fast, and advanced key-value store that also\n    | provides a richer body of commands than a typical key-value system\n    | such as APC or Memcached. Laravel makes it easy to dig right in.\n    |\n    */\n\n    'redis' => [\n\n        'client' => env('REDIS_CLIENT', 'phpredis'),\n\n        'options' => [\n            'cluster' => env('REDIS_CLUSTER', 'redis'),\n            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),\n        ],\n\n        'default' => [\n            'url' => env('REDIS_URL'),\n            'host' => env('REDIS_HOST', '127.0.0.1'),\n            'username' => env('REDIS_USERNAME'),\n            'password' => env('REDIS_PASSWORD'),\n            'port' => env('REDIS_PORT', '6379'),\n            'database' => env('REDIS_DB', '0'),\n        ],\n\n        'cache' => [\n            'url' => env('REDIS_URL'),\n            'host' => env('REDIS_HOST', '127.0.0.1'),\n            'username' => env('REDIS_USERNAME'),\n            'password' => env('REDIS_PASSWORD'),\n            'port' => env('REDIS_PORT', '6379'),\n            'database' => env('REDIS_CACHE_DB', '1'),\n        ],\n\n    ],\n\n];\n"
  },
  {
    "path": "config/filesystems.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Filesystem Disk\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the default filesystem disk that should be used\n    | by the framework. The \"local\" disk, as well as a variety of cloud\n    | based disks are available to your application. Just store away!\n    |\n    */\n\n    'default' => env('FILESYSTEM_DISK', 'local'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Filesystem Disks\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure as many filesystem \"disks\" as you wish, and you\n    | may even configure multiple disks of the same driver. Defaults have\n    | been set up for each driver as an example of the required values.\n    |\n    | Supported Drivers: \"local\", \"ftp\", \"sftp\", \"s3\"\n    |\n    */\n\n    'disks' => [\n\n        'local' => [\n            'driver' => 'local',\n            'root' => storage_path('app'),\n            'throw' => false,\n        ],\n\n        'public' => [\n            'driver' => 'local',\n            'root' => storage_path('app/public'),\n            'url' => env('APP_URL').'/storage',\n            'visibility' => 'public',\n            'throw' => false,\n        ],\n\n        's3' => [\n            'driver' => 's3',\n            'key' => env('AWS_ACCESS_KEY_ID'),\n            'secret' => env('AWS_SECRET_ACCESS_KEY'),\n            'region' => env('AWS_DEFAULT_REGION'),\n            'bucket' => env('AWS_BUCKET'),\n            'url' => env('AWS_URL'),\n            'endpoint' => env('AWS_ENDPOINT'),\n            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),\n            'throw' => false,\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Symbolic Links\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the symbolic links that will be created when the\n    | `storage:link` Artisan command is executed. The array keys should be\n    | the locations of the links and the values should be their targets.\n    |\n    */\n\n    'links' => [\n        public_path('storage') => storage_path('app/public'),\n    ],\n\n];\n"
  },
  {
    "path": "config/hashing.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Hash Driver\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default hash driver that will be used to hash\n    | passwords for your application. By default, the bcrypt algorithm is\n    | used; however, you remain free to modify this option if you wish.\n    |\n    | Supported: \"bcrypt\", \"argon\", \"argon2id\"\n    |\n    */\n\n    'driver' => 'bcrypt',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Bcrypt Options\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the configuration options that should be used when\n    | passwords are hashed using the Bcrypt algorithm. This will allow you\n    | to control the amount of time it takes to hash the given password.\n    |\n    */\n\n    'bcrypt' => [\n        'rounds' => env('BCRYPT_ROUNDS', 10),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Argon Options\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the configuration options that should be used when\n    | passwords are hashed using the Argon algorithm. These will allow you\n    | to control the amount of time it takes to hash the given password.\n    |\n    */\n\n    'argon' => [\n        'memory' => 65536,\n        'threads' => 1,\n        'time' => 4,\n    ],\n\n];\n"
  },
  {
    "path": "config/logging.php",
    "content": "<?php\n\nuse Monolog\\Handler\\NullHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\SyslogUdpHandler;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Log Channel\n    |--------------------------------------------------------------------------\n    |\n    | This option defines the default log channel that gets used when writing\n    | messages to the logs. The name specified in this option should match\n    | one of the channels defined in the \"channels\" configuration array.\n    |\n    */\n\n    'default' => env('LOG_CHANNEL', 'stack'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Deprecations Log Channel\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the log channel that should be used to log warnings\n    | regarding deprecated PHP and library features. This allows you to get\n    | your application ready for upcoming major versions of dependencies.\n    |\n    */\n\n    'deprecations' => [\n        'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),\n        'trace' => false,\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Log Channels\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the log channels for your application. Out of\n    | the box, Laravel uses the Monolog PHP logging library. This gives\n    | you a variety of powerful log handlers / formatters to utilize.\n    |\n    | Available Drivers: \"single\", \"daily\", \"slack\", \"syslog\",\n    |                    \"errorlog\", \"monolog\",\n    |                    \"custom\", \"stack\"\n    |\n    */\n\n    'channels' => [\n        'stack' => [\n            'driver' => 'stack',\n            'channels' => ['single'],\n            'ignore_exceptions' => false,\n        ],\n\n        'single' => [\n            'driver' => 'single',\n            'path' => storage_path('logs/laravel.log'),\n            'level' => env('LOG_LEVEL', 'debug'),\n        ],\n\n        'daily' => [\n            'driver' => 'daily',\n            'path' => storage_path('logs/laravel.log'),\n            'level' => env('LOG_LEVEL', 'debug'),\n            'days' => 14,\n        ],\n\n        'slack' => [\n            'driver' => 'slack',\n            'url' => env('LOG_SLACK_WEBHOOK_URL'),\n            'username' => 'Laravel Log',\n            'emoji' => ':boom:',\n            'level' => env('LOG_LEVEL', 'critical'),\n        ],\n\n        'papertrail' => [\n            'driver' => 'monolog',\n            'level' => env('LOG_LEVEL', 'debug'),\n            'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),\n            'handler_with' => [\n                'host' => env('PAPERTRAIL_URL'),\n                'port' => env('PAPERTRAIL_PORT'),\n                'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),\n            ],\n        ],\n\n        'stderr' => [\n            'driver' => 'monolog',\n            'level' => env('LOG_LEVEL', 'debug'),\n            'handler' => StreamHandler::class,\n            'formatter' => env('LOG_STDERR_FORMATTER'),\n            'with' => [\n                'stream' => 'php://stderr',\n            ],\n        ],\n\n        'syslog' => [\n            'driver' => 'syslog',\n            'level' => env('LOG_LEVEL', 'debug'),\n        ],\n\n        'errorlog' => [\n            'driver' => 'errorlog',\n            'level' => env('LOG_LEVEL', 'debug'),\n        ],\n\n        'null' => [\n            'driver' => 'monolog',\n            'handler' => NullHandler::class,\n        ],\n\n        'emergency' => [\n            'path' => storage_path('logs/laravel.log'),\n        ],\n    ],\n\n];\n"
  },
  {
    "path": "config/mail.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Mailer\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default mailer that is used to send any email\n    | messages sent by your application. Alternative mailers may be setup\n    | and used as needed; however, this mailer will be used by default.\n    |\n    */\n\n    'default' => env('MAIL_MAILER', 'smtp'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Mailer Configurations\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure all of the mailers used by your application plus\n    | their respective settings. Several examples have been configured for\n    | you and you are free to add your own as your application requires.\n    |\n    | Laravel supports a variety of mail \"transport\" drivers to be used while\n    | sending an e-mail. You will specify which one you are using for your\n    | mailers below. You are free to add additional mailers as required.\n    |\n    | Supported: \"smtp\", \"sendmail\", \"mailgun\", \"ses\",\n    |            \"postmark\", \"log\", \"array\", \"failover\"\n    |\n    */\n\n    'mailers' => [\n        'smtp' => [\n            'transport' => 'smtp',\n            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),\n            'port' => env('MAIL_PORT', 587),\n            'encryption' => env('MAIL_ENCRYPTION', 'tls'),\n            'username' => env('MAIL_USERNAME'),\n            'password' => env('MAIL_PASSWORD'),\n            'timeout' => null,\n            'local_domain' => env('MAIL_EHLO_DOMAIN'),\n        ],\n\n        'ses' => [\n            'transport' => 'ses',\n        ],\n\n        'mailgun' => [\n            'transport' => 'mailgun',\n        ],\n\n        'postmark' => [\n            'transport' => 'postmark',\n        ],\n\n        'sendmail' => [\n            'transport' => 'sendmail',\n            'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),\n        ],\n\n        'log' => [\n            'transport' => 'log',\n            'channel' => env('MAIL_LOG_CHANNEL'),\n        ],\n\n        'array' => [\n            'transport' => 'array',\n        ],\n\n        'failover' => [\n            'transport' => 'failover',\n            'mailers' => [\n                'smtp',\n                'log',\n            ],\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Global \"From\" Address\n    |--------------------------------------------------------------------------\n    |\n    | You may wish for all e-mails sent by your application to be sent from\n    | the same address. Here, you may specify a name and address that is\n    | used globally for all e-mails that are sent by your application.\n    |\n    */\n\n    'from' => [\n        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),\n        'name' => env('MAIL_FROM_NAME', 'Example'),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Markdown Mail Settings\n    |--------------------------------------------------------------------------\n    |\n    | If you are using Markdown based email rendering, you may configure your\n    | theme and component paths here, allowing you to customize the design\n    | of the emails. Or, you may simply stick with the Laravel defaults!\n    |\n    */\n\n    'markdown' => [\n        'theme' => 'default',\n\n        'paths' => [\n            resource_path('views/vendor/mail'),\n        ],\n    ],\n\n];\n"
  },
  {
    "path": "config/media-library.php",
    "content": "<?php\n\nreturn [\n\n    /*\n     * The disk on which to store added files and derived images by default. Choose\n     * one or more of the disks you've configured in config/filesystems.php.\n     */\n    'disk_name' => env('MEDIA_DISK', 'public'),\n\n    /*\n     * The maximum file size of an item in bytes.\n     * Adding a larger file will result in an exception.\n     */\n    'max_file_size' => 1024 * 1024 * 10, // 10MB\n\n    /*\n     * This queue connection will be used to generate derived and responsive images.\n     * Leave empty to use the default queue connection.\n     */\n    'queue_connection_name' => env('QUEUE_CONNECTION', 'sync'),\n\n    /*\n     * This queue will be used to generate derived and responsive images.\n     * Leave empty to use the default queue.\n     */\n    'queue_name' => '',\n\n    /*\n     * By default all conversions will be performed on a queue.\n     */\n    'queue_conversions_by_default' => env('QUEUE_CONVERSIONS_BY_DEFAULT', true),\n\n    /*\n     * The fully qualified class name of the media model.\n     */\n    'media_model' => Spatie\\MediaLibrary\\MediaCollections\\Models\\Media::class,\n\n    /*\n     * When enabled, media collections will be serialised using the default\n     * laravel model serialization behaviour.\n     * \n     * Keep this option disabled if using Media Library Pro components (https://medialibrary.pro)\n     */\n    'use_default_collection_serialization' => false,\n\n    /*\n     * The fully qualified class name of the model used for temporary uploads.\n     *\n     * This model is only used in Media Library Pro (https://medialibrary.pro)\n     */\n    'temporary_upload_model' => Spatie\\MediaLibraryPro\\Models\\TemporaryUpload::class,\n\n    /*\n     * When enabled, Media Library Pro will only process temporary uploads that were uploaded\n     * in the same session. You can opt to disable this for stateless usage of\n     * the pro components.\n     */\n    'enable_temporary_uploads_session_affinity' => true,\n\n    /*\n     * When enabled, Media Library pro will generate thumbnails for uploaded file.\n     */\n    'generate_thumbnails_for_temporary_uploads' => true,\n\n    /*\n     * This is the class that is responsible for naming generated files.\n     */\n    'file_namer' => Spatie\\MediaLibrary\\Support\\FileNamer\\DefaultFileNamer::class,\n\n    /*\n     * The class that contains the strategy for determining a media file's path.\n     */\n    'path_generator' => Spatie\\MediaLibrary\\Support\\PathGenerator\\DefaultPathGenerator::class,\n\n    /*\n     * Here you can specify which path generator should be used for the given class.\n     */\n    'custom_path_generators' => [\n        // Model::class => PathGenerator::class\n        // or\n        // 'model_morph_alias' => PathGenerator::class\n    ],\n\n    /*\n     * When urls to files get generated, this class will be called. Use the default\n     * if your files are stored locally above the site root or on s3.\n     */\n    'url_generator' => Spatie\\MediaLibrary\\Support\\UrlGenerator\\DefaultUrlGenerator::class,\n\n    /*\n     * Moves media on updating to keep path consistent. Enable it only with a custom\n     * PathGenerator that uses, for example, the media UUID.\n     */\n    'moves_media_on_update' => false,\n\n    /*\n     * Whether to activate versioning when urls to files get generated.\n     * When activated, this attaches a ?v=xx query string to the URL.\n     */\n    'version_urls' => false,\n\n    /*\n     * The media library will try to optimize all converted images by removing\n     * metadata and applying a little bit of compression. These are\n     * the optimizers that will be used by default.\n     */\n    'image_optimizers' => [\n        Spatie\\ImageOptimizer\\Optimizers\\Jpegoptim::class => [\n            '-m85', // set maximum quality to 85%\n            '--force', // ensure that progressive generation is always done also if a little bigger\n            '--strip-all', // this strips out all text information such as comments and EXIF data\n            '--all-progressive', // this will make sure the resulting image is a progressive one\n        ],\n        Spatie\\ImageOptimizer\\Optimizers\\Pngquant::class => [\n            '--force', // required parameter for this package\n        ],\n        Spatie\\ImageOptimizer\\Optimizers\\Optipng::class => [\n            '-i0', // this will result in a non-interlaced, progressive scanned image\n            '-o2', // this set the optimization level to two (multiple IDAT compression trials)\n            '-quiet', // required parameter for this package\n        ],\n        Spatie\\ImageOptimizer\\Optimizers\\Svgo::class => [\n            '--disable=cleanupIDs', // disabling because it is known to cause troubles\n        ],\n        Spatie\\ImageOptimizer\\Optimizers\\Gifsicle::class => [\n            '-b', // required parameter for this package\n            '-O3', // this produces the slowest but best results\n        ],\n        Spatie\\ImageOptimizer\\Optimizers\\Cwebp::class => [\n            '-m 6', // for the slowest compression method in order to get the best compression.\n            '-pass 10', // for maximizing the amount of analysis pass.\n            '-mt', // multithreading for some speed improvements.\n            '-q 90', //quality factor that brings the least noticeable changes.\n        ],\n        Spatie\\ImageOptimizer\\Optimizers\\Avifenc::class => [\n            '-a cq-level=23', // constant quality level, lower values mean better quality and greater file size (0-63).\n            '-j all', // number of jobs (worker threads, \"all\" uses all available cores).\n            '--min 0', // min quantizer for color (0-63).\n            '--max 63', // max quantizer for color (0-63).\n            '--minalpha 0', // min quantizer for alpha (0-63).\n            '--maxalpha 63', // max quantizer for alpha (0-63).\n            '-a end-usage=q', // rate control mode set to Constant Quality mode.\n            '-a tune=ssim', // SSIM as tune the encoder for distortion metric.\n        ],\n    ],\n\n    /*\n     * These generators will be used to create an image of media files.\n     */\n    'image_generators' => [\n        Spatie\\MediaLibrary\\Conversions\\ImageGenerators\\Image::class,\n        Spatie\\MediaLibrary\\Conversions\\ImageGenerators\\Webp::class,\n        Spatie\\MediaLibrary\\Conversions\\ImageGenerators\\Avif::class,\n        Spatie\\MediaLibrary\\Conversions\\ImageGenerators\\Pdf::class,\n        Spatie\\MediaLibrary\\Conversions\\ImageGenerators\\Svg::class,\n        Spatie\\MediaLibrary\\Conversions\\ImageGenerators\\Video::class,\n    ],\n\n    /*\n     * The path where to store temporary files while performing image conversions.\n     * If set to null, storage_path('media-library/temp') will be used.\n     */\n    'temporary_directory_path' => null,\n\n    /*\n     * The engine that should perform the image conversions.\n     * Should be either `gd` or `imagick`.\n     */\n    'image_driver' => env('IMAGE_DRIVER', 'gd'),\n\n    /*\n     * FFMPEG & FFProbe binaries paths, only used if you try to generate video\n     * thumbnails and have installed the php-ffmpeg/php-ffmpeg composer\n     * dependency.\n     */\n    'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),\n    'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),\n\n    /*\n     * Here you can override the class names of the jobs used by this package. Make sure\n     * your custom jobs extend the ones provided by the package.\n     */\n    'jobs' => [\n        'perform_conversions' => Spatie\\MediaLibrary\\Conversions\\Jobs\\PerformConversionsJob::class,\n        'generate_responsive_images' => Spatie\\MediaLibrary\\ResponsiveImages\\Jobs\\GenerateResponsiveImagesJob::class,\n    ],\n\n    /*\n     * When using the addMediaFromUrl method you may want to replace the default downloader.\n     * This is particularly useful when the url of the image is behind a firewall and\n     * need to add additional flags, possibly using curl.\n     */\n    'media_downloader' => Spatie\\MediaLibrary\\Downloaders\\DefaultDownloader::class,\n\n    'remote' => [\n        /*\n         * Any extra headers that should be included when uploading media to\n         * a remote disk. Even though supported headers may vary between\n         * different drivers, a sensible default has been provided.\n         *\n         * Supported by S3: CacheControl, Expires, StorageClass,\n         * ServerSideEncryption, Metadata, ACL, ContentEncoding\n         */\n        'extra_headers' => [\n            'CacheControl' => 'max-age=604800',\n        ],\n    ],\n\n    'responsive_images' => [\n        /*\n         * This class is responsible for calculating the target widths of the responsive\n         * images. By default we optimize for filesize and create variations that each are 30%\n         * smaller than the previous one. More info in the documentation.\n         *\n         * https://docs.spatie.be/laravel-medialibrary/v9/advanced-usage/generating-responsive-images\n         */\n        'width_calculator' => Spatie\\MediaLibrary\\ResponsiveImages\\WidthCalculator\\FileSizeOptimizedWidthCalculator::class,\n\n        /*\n         * By default rendering media to a responsive image will add some javascript and a tiny placeholder.\n         * This ensures that the browser can already determine the correct layout.\n         */\n        'use_tiny_placeholders' => true,\n\n        /*\n         * This class will generate the tiny placeholder used for progressive image loading. By default\n         * the media library will use a tiny blurred jpg image.\n         */\n        'tiny_placeholder_generator' => Spatie\\MediaLibrary\\ResponsiveImages\\TinyPlaceholderGenerator\\Blurred::class,\n    ],\n\n    /*\n     * When enabling this option, a route will be registered that will enable\n     * the Media Library Pro Vue and React components to move uploaded files\n     * in a S3 bucket to their right place.\n     */\n    'enable_vapor_uploads' => env('ENABLE_MEDIA_LIBRARY_VAPOR_UPLOADS', false),\n\n    /*\n     * When converting Media instances to response the media library will add\n     * a `loading` attribute to the `img` tag. Here you can set the default\n     * value of that attribute.\n     *\n     * Possible values: 'lazy', 'eager', 'auto' or null if you don't want to set any loading instruction.\n     *\n     * More info: https://css-tricks.com/native-lazy-loading/\n     */\n    'default_loading_attribute_value' => null,\n\n    /*\n     * You can specify a prefix for that is used for storing all media.\n     * If you set this to `/my-subdir`, all your media will be stored in a `/my-subdir` directory.\n     */\n    'prefix' => env('MEDIA_PREFIX', ''),\n];\n"
  },
  {
    "path": "config/permission.php",
    "content": "<?php\n\nreturn [\n\n    'models' => [\n\n        /*\n         * When using the \"HasPermissions\" trait from this package, we need to know which\n         * Eloquent model should be used to retrieve your permissions. Of course, it\n         * is often just the \"Permission\" model but you may use whatever you like.\n         *\n         * The model you want to use as a Permission model needs to implement the\n         * `Spatie\\Permission\\Contracts\\Permission` contract.\n         */\n\n        'permission' => Spatie\\Permission\\Models\\Permission::class,\n\n        /*\n         * When using the \"HasRoles\" trait from this package, we need to know which\n         * Eloquent model should be used to retrieve your roles. Of course, it\n         * is often just the \"Role\" model but you may use whatever you like.\n         *\n         * The model you want to use as a Role model needs to implement the\n         * `Spatie\\Permission\\Contracts\\Role` contract.\n         */\n\n        'role' => Spatie\\Permission\\Models\\Role::class,\n\n    ],\n\n    'table_names' => [\n\n        /*\n         * When using the \"HasRoles\" trait from this package, we need to know which\n         * table should be used to retrieve your roles. We have chosen a basic\n         * default value but you may easily change it to any table you like.\n         */\n\n        'roles' => 'roles',\n\n        /*\n         * When using the \"HasPermissions\" trait from this package, we need to know which\n         * table should be used to retrieve your permissions. We have chosen a basic\n         * default value but you may easily change it to any table you like.\n         */\n\n        'permissions' => 'permissions',\n\n        /*\n         * When using the \"HasPermissions\" trait from this package, we need to know which\n         * table should be used to retrieve your models permissions. We have chosen a\n         * basic default value but you may easily change it to any table you like.\n         */\n\n        'model_has_permissions' => 'model_has_permissions',\n\n        /*\n         * When using the \"HasRoles\" trait from this package, we need to know which\n         * table should be used to retrieve your models roles. We have chosen a\n         * basic default value but you may easily change it to any table you like.\n         */\n\n        'model_has_roles' => 'model_has_roles',\n\n        /*\n         * When using the \"HasRoles\" trait from this package, we need to know which\n         * table should be used to retrieve your roles permissions. We have chosen a\n         * basic default value but you may easily change it to any table you like.\n         */\n\n        'role_has_permissions' => 'role_has_permissions',\n    ],\n\n    'column_names' => [\n        /*\n         * Change this if you want to name the related pivots other than defaults\n         */\n        'role_pivot_key' => null, //default 'role_id',\n        'permission_pivot_key' => null, //default 'permission_id',\n\n        /*\n         * Change this if you want to name the related model primary key other than\n         * `model_id`.\n         *\n         * For example, this would be nice if your primary keys are all UUIDs. In\n         * that case, name this `model_uuid`.\n         */\n\n        'model_morph_key' => 'model_id',\n\n        /*\n         * Change this if you want to use the teams feature and your related model's\n         * foreign key is other than `team_id`.\n         */\n\n        'team_foreign_key' => 'team_id',\n    ],\n\n    /*\n     * When set to true, the method for checking permissions will be registered on the gate.\n     * Set this to false, if you want to implement custom logic for checking permissions.\n     */\n\n    'register_permission_check_method' => true,\n\n    /*\n     * When set to true the package implements teams using the 'team_foreign_key'. If you want\n     * the migrations to register the 'team_foreign_key', you must set this to true\n     * before doing the migration. If you already did the migration then you must make a new\n     * migration to also add 'team_foreign_key' to 'roles', 'model_has_roles', and\n     * 'model_has_permissions'(view the latest version of package's migration file)\n     */\n\n    'teams' => false,\n\n    /*\n     * When set to true, the required permission names are added to the exception\n     * message. This could be considered an information leak in some contexts, so\n     * the default setting is false here for optimum safety.\n     */\n\n    'display_permission_in_exception' => false,\n\n    /*\n     * When set to true, the required role names are added to the exception\n     * message. This could be considered an information leak in some contexts, so\n     * the default setting is false here for optimum safety.\n     */\n\n    'display_role_in_exception' => false,\n\n    /*\n     * By default wildcard permission lookups are disabled.\n     */\n\n    'enable_wildcard_permission' => false,\n\n    'cache' => [\n\n        /*\n         * By default all permissions are cached for 24 hours to speed up performance.\n         * When permissions or roles are updated the cache is flushed automatically.\n         */\n\n        'expiration_time' => \\DateInterval::createFromDateString('24 hours'),\n\n        /*\n         * The cache key used to store all permissions.\n         */\n\n        'key' => 'spatie.permission.cache',\n\n        /*\n         * You may optionally indicate a specific cache driver to use for permission and\n         * role caching using any of the `store` drivers listed in the cache.php config\n         * file. Using 'default' here means to use the `default` set in cache.php.\n         */\n\n        'store' => 'default',\n    ],\n];\n"
  },
  {
    "path": "config/queue.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Queue Connection Name\n    |--------------------------------------------------------------------------\n    |\n    | Laravel's queue API supports an assortment of back-ends via a single\n    | API, giving you convenient access to each back-end using the same\n    | syntax for every one. Here you may define a default connection.\n    |\n    */\n\n    'default' => env('QUEUE_CONNECTION', 'sync'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Queue Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the connection information for each server that\n    | is used by your application. A default configuration has been added\n    | for each back-end shipped with Laravel. You are free to add more.\n    |\n    | Drivers: \"sync\", \"database\", \"beanstalkd\", \"sqs\", \"redis\", \"null\"\n    |\n    */\n\n    'connections' => [\n\n        'sync' => [\n            'driver' => 'sync',\n        ],\n\n        'database' => [\n            'driver' => 'database',\n            'table' => 'jobs',\n            'queue' => 'default',\n            'retry_after' => 90,\n            'after_commit' => false,\n        ],\n\n        'beanstalkd' => [\n            'driver' => 'beanstalkd',\n            'host' => 'localhost',\n            'queue' => 'default',\n            'retry_after' => 90,\n            'block_for' => 0,\n            'after_commit' => false,\n        ],\n\n        'sqs' => [\n            'driver' => 'sqs',\n            'key' => env('AWS_ACCESS_KEY_ID'),\n            'secret' => env('AWS_SECRET_ACCESS_KEY'),\n            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),\n            'queue' => env('SQS_QUEUE', 'default'),\n            'suffix' => env('SQS_SUFFIX'),\n            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),\n            'after_commit' => false,\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'default',\n            'queue' => env('REDIS_QUEUE', 'default'),\n            'retry_after' => 90,\n            'block_for' => null,\n            'after_commit' => false,\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Failed Queue Jobs\n    |--------------------------------------------------------------------------\n    |\n    | These options configure the behavior of failed queue job logging so you\n    | can control which database and table are used to store the jobs that\n    | have failed. You may change them to any database / table you wish.\n    |\n    */\n\n    'failed' => [\n        'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),\n        'database' => env('DB_CONNECTION', 'mysql'),\n        'table' => 'failed_jobs',\n    ],\n\n];\n"
  },
  {
    "path": "config/sanctum.php",
    "content": "<?php\n\nuse Laravel\\Sanctum\\Sanctum;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Stateful Domains\n    |--------------------------------------------------------------------------\n    |\n    | Requests from the following domains / hosts will receive stateful API\n    | authentication cookies. Typically, these should include your local\n    | and production domains which access your API via a frontend SPA.\n    |\n    */\n\n    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(\n        '%s%s',\n        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',\n        Sanctum::currentApplicationUrlWithPort()\n    ))),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sanctum Guards\n    |--------------------------------------------------------------------------\n    |\n    | This array contains the authentication guards that will be checked when\n    | Sanctum is trying to authenticate a request. If none of these guards\n    | are able to authenticate the request, Sanctum will use the bearer\n    | token that's present on an incoming request for authentication.\n    |\n    */\n\n    'guard' => ['web'],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Expiration Minutes\n    |--------------------------------------------------------------------------\n    |\n    | This value controls the number of minutes until an issued token will be\n    | considered expired. If this value is null, personal access tokens do\n    | not expire. This won't tweak the lifetime of first-party sessions.\n    |\n    */\n\n    'expiration' => null,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Token Prefix\n    |--------------------------------------------------------------------------\n    |\n    | Sanctum can prefix new tokens in order to take advantage of numerous\n    | security scanning initiatives maintained by open source platforms\n    | that notify developers if they commit tokens into repositories.\n    |\n    | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning\n    |\n    */\n\n    'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sanctum Middleware\n    |--------------------------------------------------------------------------\n    |\n    | When authenticating your first-party SPA with Sanctum you may need to\n    | customize some of the middleware Sanctum uses while processing the\n    | request. You may change the middleware listed below as required.\n    |\n    */\n\n    'middleware' => [\n        'authenticate_session' => Laravel\\Sanctum\\Http\\Middleware\\AuthenticateSession::class,\n        'encrypt_cookies' => Illuminate\\Cookie\\Middleware\\EncryptCookies::class,\n        'validate_csrf_token' => Illuminate\\Foundation\\Http\\Middleware\\ValidateCsrfToken::class,\n    ],\n\n];\n"
  },
  {
    "path": "config/services.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Third Party Services\n    |--------------------------------------------------------------------------\n    |\n    | This file is for storing the credentials for third party services such\n    | as Mailgun, Postmark, AWS and more. This file provides the de facto\n    | location for this type of information, allowing packages to have\n    | a conventional file to locate the various service credentials.\n    |\n    */\n\n    'mailgun' => [\n        'domain' => env('MAILGUN_DOMAIN'),\n        'secret' => env('MAILGUN_SECRET'),\n        'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),\n        'scheme' => 'https',\n    ],\n\n    'postmark' => [\n        'token' => env('POSTMARK_TOKEN'),\n    ],\n\n    'ses' => [\n        'key' => env('AWS_ACCESS_KEY_ID'),\n        'secret' => env('AWS_SECRET_ACCESS_KEY'),\n        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),\n    ],\n\n];\n"
  },
  {
    "path": "config/session.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Session Driver\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default session \"driver\" that will be used on\n    | requests. By default, we will use the lightweight native driver but\n    | you may specify any of the other wonderful drivers provided here.\n    |\n    | Supported: \"file\", \"cookie\", \"database\", \"apc\",\n    |            \"memcached\", \"redis\", \"dynamodb\", \"array\"\n    |\n    */\n\n    'driver' => env('SESSION_DRIVER', 'file'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Lifetime\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the number of minutes that you wish the session\n    | to be allowed to remain idle before it expires. If you want them\n    | to immediately expire on the browser closing, set that option.\n    |\n    */\n\n    'lifetime' => env('SESSION_LIFETIME', 120),\n\n    'expire_on_close' => false,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Encryption\n    |--------------------------------------------------------------------------\n    |\n    | This option allows you to easily specify that all of your session data\n    | should be encrypted before it is stored. All encryption will be run\n    | automatically by Laravel and you can use the Session like normal.\n    |\n    */\n\n    'encrypt' => false,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session File Location\n    |--------------------------------------------------------------------------\n    |\n    | When using the native session driver, we need a location where session\n    | files may be stored. A default has been set for you but a different\n    | location may be specified. This is only needed for file sessions.\n    |\n    */\n\n    'files' => storage_path('framework/sessions'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Database Connection\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"database\" or \"redis\" session drivers, you may specify a\n    | connection that should be used to manage these sessions. This should\n    | correspond to a connection in your database configuration options.\n    |\n    */\n\n    'connection' => env('SESSION_CONNECTION'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Database Table\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"database\" session driver, you may specify the table we\n    | should use to manage the sessions. Of course, a sensible default is\n    | provided for you; however, you are free to change this as needed.\n    |\n    */\n\n    'table' => 'sessions',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cache Store\n    |--------------------------------------------------------------------------\n    |\n    | While using one of the framework's cache driven session backends you may\n    | list a cache store that should be used for these sessions. This value\n    | must match with one of the application's configured cache \"stores\".\n    |\n    | Affects: \"apc\", \"dynamodb\", \"memcached\", \"redis\"\n    |\n    */\n\n    'store' => env('SESSION_STORE'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Sweeping Lottery\n    |--------------------------------------------------------------------------\n    |\n    | Some session drivers must manually sweep their storage location to get\n    | rid of old sessions from storage. Here are the chances that it will\n    | happen on a given request. By default, the odds are 2 out of 100.\n    |\n    */\n\n    'lottery' => [2, 100],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Name\n    |--------------------------------------------------------------------------\n    |\n    | Here you may change the name of the cookie used to identify a session\n    | instance by ID. The name specified here will get used every time a\n    | new session cookie is created by the framework for every driver.\n    |\n    */\n\n    'cookie' => env(\n        'SESSION_COOKIE',\n        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'\n    ),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Path\n    |--------------------------------------------------------------------------\n    |\n    | The session cookie path determines the path for which the cookie will\n    | be regarded as available. Typically, this will be the root path of\n    | your application but you are free to change this when necessary.\n    |\n    */\n\n    'path' => '/',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Domain\n    |--------------------------------------------------------------------------\n    |\n    | Here you may change the domain of the cookie used to identify a session\n    | in your application. This will determine which domains the cookie is\n    | available to in your application. A sensible default has been set.\n    |\n    */\n\n    'domain' => env('SESSION_DOMAIN'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | HTTPS Only Cookies\n    |--------------------------------------------------------------------------\n    |\n    | By setting this option to true, session cookies will only be sent back\n    | to the server if the browser has a HTTPS connection. This will keep\n    | the cookie from being sent to you when it can't be done securely.\n    |\n    */\n\n    'secure' => env('SESSION_SECURE_COOKIE'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | HTTP Access Only\n    |--------------------------------------------------------------------------\n    |\n    | Setting this value to true will prevent JavaScript from accessing the\n    | value of the cookie and the cookie will only be accessible through\n    | the HTTP protocol. You are free to modify this option if needed.\n    |\n    */\n\n    'http_only' => true,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Same-Site Cookies\n    |--------------------------------------------------------------------------\n    |\n    | This option determines how your cookies behave when cross-site requests\n    | take place, and can be used to mitigate CSRF attacks. By default, we\n    | will set this value to \"lax\" since this is a secure default value.\n    |\n    | Supported: \"lax\", \"strict\", \"none\", null\n    |\n    */\n\n    'same_site' => 'lax',\n\n];\n"
  },
  {
    "path": "config/view.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | View Storage Paths\n    |--------------------------------------------------------------------------\n    |\n    | Most templating systems load templates from disk. Here you may specify\n    | an array of paths that should be checked for your views. Of course\n    | the usual Laravel view path has already been registered for you.\n    |\n    */\n\n    'paths' => [\n        resource_path('views'),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Compiled View Path\n    |--------------------------------------------------------------------------\n    |\n    | This option determines where all the compiled Blade templates will be\n    | stored for your application. Typically, this is within the storage\n    | directory. However, as usual, you are free to change this value.\n    |\n    */\n\n    'compiled' => env(\n        'VIEW_COMPILED_PATH',\n        realpath(storage_path('framework/views'))\n    ),\n\n];\n"
  },
  {
    "path": "database/.gitignore",
    "content": "*.sqlite*\n"
  },
  {
    "path": "database/factories/UserFactory.php",
    "content": "<?php\n\nnamespace Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Illuminate\\Support\\Str;\n\n/**\n * @extends \\Illuminate\\Database\\Eloquent\\Factories\\Factory<\\App\\Models\\User>\n */\nclass UserFactory extends Factory\n{\n    /**\n     * Define the model's default state.\n     *\n     * @return array<string, mixed>\n     */\n    public function definition()\n    {\n        return [\n            'name' => fake()->name(),\n            'email' => fake()->unique()->safeEmail(),\n            'email_verified_at' => now(),\n            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password\n            'remember_token' => Str::random(10),\n        ];\n    }\n\n    /**\n     * Indicate that the model's email address should be unverified.\n     *\n     * @return static\n     */\n    public function unverified()\n    {\n        return $this->state(fn (array $attributes) => [\n            'email_verified_at' => null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "database/migrations/2014_10_12_000000_create_users_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('users', function (Blueprint $table) {\n            $table->id();\n            $table->string('name');\n            $table->string('email')->unique();\n            $table->timestamp('email_verified_at')->nullable();\n            $table->string('password');\n            $table->rememberToken();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('users');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2014_10_12_100000_create_password_resets_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('password_resets', function (Blueprint $table) {\n            $table->string('email')->index();\n            $table->string('token');\n            $table->timestamp('created_at')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('password_resets');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('failed_jobs', function (Blueprint $table) {\n            $table->id();\n            $table->string('uuid')->unique();\n            $table->text('connection');\n            $table->text('queue');\n            $table->longText('payload');\n            $table->longText('exception');\n            $table->timestamp('failed_at')->useCurrent();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('failed_jobs');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('personal_access_tokens', function (Blueprint $table) {\n            $table->id();\n            $table->morphs('tokenable');\n            $table->string('name');\n            $table->string('token', 64)->unique();\n            $table->text('abilities')->nullable();\n            $table->timestamp('last_used_at')->nullable();\n            $table->timestamp('expires_at')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('personal_access_tokens');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2022_09_30_181156_create_posts_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('posts', function (Blueprint $table) {\n            $table->id();\n            $table->string('title');\n            $table->unsignedBigInteger('user_id');\n            $table->longText('content');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('posts');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2022_09_30_181227_create_categories_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('categories', function (Blueprint $table) {\n            $table->id();\n            $table->string('name');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('categories');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2023_09_25_045349_create_jobs_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('jobs', function (Blueprint $table) {\n            $table->bigIncrements('id');\n            $table->string('queue')->index();\n            $table->longText('payload');\n            $table->unsignedTinyInteger('attempts');\n            $table->unsignedInteger('reserved_at')->nullable();\n            $table->unsignedInteger('available_at');\n            $table->unsignedInteger('created_at');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('jobs');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2023_10_02_010617_create_category_post_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('category_post', function (Blueprint $table) {\n            $table->unsignedBigInteger('category_id');\n            $table->unsignedBigInteger('post_id');\n            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');\n            $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');\n            $table->primary(['category_id', 'post_id']);\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('category_post');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2023_10_02_175025_create_media_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    public function up(): void\n    {\n        Schema::create('media', function (Blueprint $table) {\n            $table->id();\n\n            $table->morphs('model');\n            $table->uuid('uuid')->nullable()->unique();\n            $table->string('collection_name');\n            $table->string('name');\n            $table->string('file_name');\n            $table->string('mime_type')->nullable();\n            $table->string('disk');\n            $table->string('conversions_disk')->nullable();\n            $table->unsignedBigInteger('size');\n            $table->json('manipulations');\n            $table->json('custom_properties');\n            $table->json('generated_conversions');\n            $table->json('responsive_images');\n            $table->unsignedInteger('order_column')->nullable()->index();\n\n            $table->nullableTimestamps();\n        });\n    }\n};\n"
  },
  {
    "path": "database/migrations/2024_11_25_022836_create_permission_tables.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        $teams = config('permission.teams');\n        $tableNames = config('permission.table_names');\n        $columnNames = config('permission.column_names');\n        $pivotRole = $columnNames['role_pivot_key'] ?? 'role_id';\n        $pivotPermission = $columnNames['permission_pivot_key'] ?? 'permission_id';\n\n        if (empty($tableNames)) {\n            throw new \\Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.');\n        }\n        if ($teams && empty($columnNames['team_foreign_key'] ?? null)) {\n            throw new \\Exception('Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again.');\n        }\n\n        Schema::create($tableNames['permissions'], function (Blueprint $table) {\n            //$table->engine('InnoDB');\n            $table->bigIncrements('id'); // permission id\n            $table->string('name');       // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format)\n            $table->string('guard_name'); // For MyISAM use string('guard_name', 25);\n            $table->timestamps();\n\n            $table->unique(['name', 'guard_name']);\n        });\n\n        Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) {\n            //$table->engine('InnoDB');\n            $table->bigIncrements('id'); // role id\n            if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing\n                $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable();\n                $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index');\n            }\n            $table->string('name');       // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format)\n            $table->string('guard_name'); // For MyISAM use string('guard_name', 25);\n            $table->timestamps();\n            if ($teams || config('permission.testing')) {\n                $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']);\n            } else {\n                $table->unique(['name', 'guard_name']);\n            }\n        });\n\n        Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) {\n            $table->unsignedBigInteger($pivotPermission);\n\n            $table->string('model_type');\n            $table->unsignedBigInteger($columnNames['model_morph_key']);\n            $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index');\n\n            $table->foreign($pivotPermission)\n                ->references('id') // permission id\n                ->on($tableNames['permissions'])\n                ->onDelete('cascade');\n            if ($teams) {\n                $table->unsignedBigInteger($columnNames['team_foreign_key']);\n                $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index');\n\n                $table->primary([$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'],\n                    'model_has_permissions_permission_model_type_primary');\n            } else {\n                $table->primary([$pivotPermission, $columnNames['model_morph_key'], 'model_type'],\n                    'model_has_permissions_permission_model_type_primary');\n            }\n\n        });\n\n        Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) {\n            $table->unsignedBigInteger($pivotRole);\n\n            $table->string('model_type');\n            $table->unsignedBigInteger($columnNames['model_morph_key']);\n            $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index');\n\n            $table->foreign($pivotRole)\n                ->references('id') // role id\n                ->on($tableNames['roles'])\n                ->onDelete('cascade');\n            if ($teams) {\n                $table->unsignedBigInteger($columnNames['team_foreign_key']);\n                $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index');\n\n                $table->primary([$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'],\n                    'model_has_roles_role_model_type_primary');\n            } else {\n                $table->primary([$pivotRole, $columnNames['model_morph_key'], 'model_type'],\n                    'model_has_roles_role_model_type_primary');\n            }\n        });\n\n        Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) {\n            $table->unsignedBigInteger($pivotPermission);\n            $table->unsignedBigInteger($pivotRole);\n\n            $table->foreign($pivotPermission)\n                ->references('id') // permission id\n                ->on($tableNames['permissions'])\n                ->onDelete('cascade');\n\n            $table->foreign($pivotRole)\n                ->references('id') // role id\n                ->on($tableNames['roles'])\n                ->onDelete('cascade');\n\n            $table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary');\n        });\n\n        app('cache')\n            ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null)\n            ->forget(config('permission.cache.key'));\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        $tableNames = config('permission.table_names');\n\n        if (empty($tableNames)) {\n            throw new \\Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');\n        }\n\n        Schema::drop($tableNames['role_has_permissions']);\n        Schema::drop($tableNames['model_has_roles']);\n        Schema::drop($tableNames['model_has_permissions']);\n        Schema::drop($tableNames['roles']);\n        Schema::drop($tableNames['permissions']);\n    }\n};\n"
  },
  {
    "path": "database/migrations/2025_01_22_091913_create_sessions_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('sessions', function (Blueprint $table) {\n            $table->string('id')->primary();\n            $table->foreignId('user_id')->nullable()->index();\n            $table->string('ip_address', 45)->nullable();\n            $table->text('user_agent')->nullable();\n            $table->longText('payload');\n            $table->integer('last_activity')->index();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('sessions');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2025_01_23_093055_create_activity_log_table.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateActivityLogTable extends Migration\n{\n    public function up()\n    {\n        Schema::connection(config('activitylog.database_connection'))->create(config('activitylog.table_name'), function (Blueprint $table) {\n            $table->bigIncrements('id');\n            $table->string('log_name')->nullable();\n            $table->text('description');\n            $table->nullableMorphs('subject', 'subject');\n            $table->nullableMorphs('causer', 'causer');\n            $table->json('properties')->nullable();\n            $table->timestamps();\n            $table->index('log_name');\n        });\n    }\n\n    public function down()\n    {\n        Schema::connection(config('activitylog.database_connection'))->dropIfExists(config('activitylog.table_name'));\n    }\n}\n"
  },
  {
    "path": "database/migrations/2025_01_23_093056_add_event_column_to_activity_log_table.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass AddEventColumnToActivityLogTable extends Migration\n{\n    public function up()\n    {\n        Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) {\n            $table->string('event')->nullable()->after('subject_type');\n        });\n    }\n\n    public function down()\n    {\n        Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) {\n            $table->dropColumn('event');\n        });\n    }\n}\n"
  },
  {
    "path": "database/migrations/2025_01_23_093057_add_batch_uuid_column_to_activity_log_table.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass AddBatchUuidColumnToActivityLogTable extends Migration\n{\n    public function up()\n    {\n        Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) {\n            $table->uuid('batch_uuid')->nullable()->after('properties');\n        });\n    }\n\n    public function down()\n    {\n        Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) {\n            $table->dropColumn('batch_uuid');\n        });\n    }\n}\n"
  },
  {
    "path": "database/migrations/2026_01_05_114017_create_api_inspector_analytics_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    public function up(): void\n    {\n        Schema::create('api_inspector_analytics', function (Blueprint $table) {\n            $table->id();\n            $table->string('route')->index();\n            $table->string('method');\n            $table->string('uri');\n            $table->unsignedInteger('status_code');\n            $table->float('duration_ms')->default(0);\n            $table->bigInteger('memory_usage')->default(0);\n            $table->ipAddress('ip_address')->nullable();\n            $table->text('user_agent')->nullable();\n            $table->text('error')->nullable();\n            $table->timestamp('recorded_at')->index();\n            $table->timestamps();\n\n            // Indexes for common queries\n            $table->index(['route', 'recorded_at']);\n            $table->index(['status_code', 'recorded_at']);\n            $table->index(['created_at']);\n        });\n    }\n\n    public function down(): void\n    {\n        Schema::dropIfExists('api_inspector_analytics');\n    }\n};\n"
  },
  {
    "path": "database/seeders/CreateAdminUserSeeder.php",
    "content": "<?php\n\nnamespace Database\\Seeders;\n\nuse App\\Models\\Category;\nuse App\\Models\\User;\nuse Illuminate\\Database\\Console\\Seeds\\WithoutModelEvents;\nuse Illuminate\\Database\\Seeder;\nuse Spatie\\Permission\\Models\\Permission;\nuse Spatie\\Permission\\Models\\Role;\n\nclass CreateAdminUserSeeder extends Seeder\n{\n    /**\n     * Run the database seeds.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        $user = User::create([\n            'name' => 'Fazle',\n            'email' => 'admin@demo.com',\n            'password' => bcrypt('12345678')\n        ]);\n\n        $role = Role::create(['name' => 'admin']);\n        $role2 = Role::create(['name' => 'user']);\n        $permissions = [\n            'post-list',\n            'post-create',\n            'post-edit',\n            'post-delete'\n            ];\n        $role2->syncPermissions($permissions);\n        Category::create(['name' => 'Vue.js']);\n        Category::create(['name' => 'Cat 2']);\n\n        $permissions = Permission::pluck('id','id')->all();\n\n        $role->syncPermissions($permissions);\n\n        $user->assignRole([$role->id]);\n    }\n}\n"
  },
  {
    "path": "database/seeders/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Database\\Seeders;\n\n// use Illuminate\\Database\\Console\\Seeds\\WithoutModelEvents;\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        $this->call(PermissionTableSeeder::class);\n        $this->call(CreateAdminUserSeeder::class);\n\n//        $this->call(RoleSeeder::class);\n        // \\App\\Models\\User::factory(10)->create();\n\n        // \\App\\Models\\User::factory()->create([\n        //     'name' => 'Test User',\n        //     'email' => 'test@example.com',\n        // ]);\n    }\n}\n"
  },
  {
    "path": "database/seeders/PermissionTableSeeder.php",
    "content": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Console\\Seeds\\WithoutModelEvents;\nuse Illuminate\\Database\\Seeder;\nuse Spatie\\Permission\\Models\\Permission;\n\nclass PermissionTableSeeder extends Seeder\n{\n    /**\n     * Run the database seeds.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        $permissions = [\n            'role-list',\n            'role-create',\n            'role-edit',\n            'role-delete',\n            'permission-list',\n            'permission-create',\n            'permission-edit',\n            'permission-delete',\n            'user-list',\n            'user-create',\n            'user-edit',\n            'user-delete',\n            'post-list',\n            'post-create',\n            'post-edit',\n            'post-all',\n            'post-delete',\n            'category-list',\n            'category-create',\n            'category-edit',\n            'category-delete'\n        ];\n\n        foreach ($permissions as $permission) {\n            Permission::create(['name' => $permission]);\n        }\n    }\n}\n"
  },
  {
    "path": "lang/en/auth.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used during authentication for various\n    | messages that we need to display to the user. You are free to modify\n    | these language lines according to your application's requirements.\n    |\n    */\n\n    'failed' => 'These credentials do not match our records.',\n    'password' => 'The provided password is incorrect.',\n    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',\n\n];\n"
  },
  {
    "path": "lang/en/pagination.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Pagination Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used by the paginator library to build\n    | the simple pagination links. You are free to change them to anything\n    | you want to customize your views to better match your application.\n    |\n    */\n\n    'previous' => '&laquo; Previous',\n    'next' => 'Next &raquo;',\n\n];\n"
  },
  {
    "path": "lang/en/passwords.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Password Reset Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are the default lines which match reasons\n    | that are given by the password broker for a password update attempt\n    | has failed, such as for an invalid token or invalid new password.\n    |\n    */\n\n    'reset' => 'Your password has been reset!',\n    'sent' => 'We have emailed your password reset link!',\n    'throttled' => 'Please wait before retrying.',\n    'token' => 'This password reset token is invalid.',\n    'user' => \"We can't find a user with that email address.\",\n\n];\n"
  },
  {
    "path": "lang/en/validation.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Validation Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines contain the default error messages used by\n    | the validator class. Some of these rules have multiple versions such\n    | as the size rules. Feel free to tweak each of these messages here.\n    |\n    */\n\n    'accepted' => 'The :attribute must be accepted.',\n    'accepted_if' => 'The :attribute must be accepted when :other is :value.',\n    'active_url' => 'The :attribute is not a valid URL.',\n    'after' => 'The :attribute must be a date after :date.',\n    'after_or_equal' => 'The :attribute must be a date after or equal to :date.',\n    'alpha' => 'The :attribute must only contain letters.',\n    'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.',\n    'alpha_num' => 'The :attribute must only contain letters and numbers.',\n    'array' => 'The :attribute must be an array.',\n    'before' => 'The :attribute must be a date before :date.',\n    'before_or_equal' => 'The :attribute must be a date before or equal to :date.',\n    'between' => [\n        'array' => 'The :attribute must have between :min and :max items.',\n        'file' => 'The :attribute must be between :min and :max kilobytes.',\n        'numeric' => 'The :attribute must be between :min and :max.',\n        'string' => 'The :attribute must be between :min and :max characters.',\n    ],\n    'boolean' => 'The :attribute field must be true or false.',\n    'confirmed' => 'The :attribute confirmation does not match.',\n    'current_password' => 'The password is incorrect.',\n    'date' => 'The :attribute is not a valid date.',\n    'date_equals' => 'The :attribute must be a date equal to :date.',\n    'date_format' => 'The :attribute does not match the format :format.',\n    'declined' => 'The :attribute must be declined.',\n    'declined_if' => 'The :attribute must be declined when :other is :value.',\n    'different' => 'The :attribute and :other must be different.',\n    'digits' => 'The :attribute must be :digits digits.',\n    'digits_between' => 'The :attribute must be between :min and :max digits.',\n    'dimensions' => 'The :attribute has invalid image dimensions.',\n    'distinct' => 'The :attribute field has a duplicate value.',\n    'doesnt_end_with' => 'The :attribute may not end with one of the following: :values.',\n    'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.',\n    'email' => 'The :attribute must be a valid email address.',\n    'ends_with' => 'The :attribute must end with one of the following: :values.',\n    'enum' => 'The selected :attribute is invalid.',\n    'exists' => 'The selected :attribute is invalid.',\n    'file' => 'The :attribute must be a file.',\n    'filled' => 'The :attribute field must have a value.',\n    'gt' => [\n        'array' => 'The :attribute must have more than :value items.',\n        'file' => 'The :attribute must be greater than :value kilobytes.',\n        'numeric' => 'The :attribute must be greater than :value.',\n        'string' => 'The :attribute must be greater than :value characters.',\n    ],\n    'gte' => [\n        'array' => 'The :attribute must have :value items or more.',\n        'file' => 'The :attribute must be greater than or equal to :value kilobytes.',\n        'numeric' => 'The :attribute must be greater than or equal to :value.',\n        'string' => 'The :attribute must be greater than or equal to :value characters.',\n    ],\n    'image' => 'The :attribute must be an image.',\n    'in' => 'The selected :attribute is invalid.',\n    'in_array' => 'The :attribute field does not exist in :other.',\n    'integer' => 'The :attribute must be an integer.',\n    'ip' => 'The :attribute must be a valid IP address.',\n    'ipv4' => 'The :attribute must be a valid IPv4 address.',\n    'ipv6' => 'The :attribute must be a valid IPv6 address.',\n    'json' => 'The :attribute must be a valid JSON string.',\n    'lt' => [\n        'array' => 'The :attribute must have less than :value items.',\n        'file' => 'The :attribute must be less than :value kilobytes.',\n        'numeric' => 'The :attribute must be less than :value.',\n        'string' => 'The :attribute must be less than :value characters.',\n    ],\n    'lte' => [\n        'array' => 'The :attribute must not have more than :value items.',\n        'file' => 'The :attribute must be less than or equal to :value kilobytes.',\n        'numeric' => 'The :attribute must be less than or equal to :value.',\n        'string' => 'The :attribute must be less than or equal to :value characters.',\n    ],\n    'mac_address' => 'The :attribute must be a valid MAC address.',\n    'max' => [\n        'array' => 'The :attribute must not have more than :max items.',\n        'file' => 'The :attribute must not be greater than :max kilobytes.',\n        'numeric' => 'The :attribute must not be greater than :max.',\n        'string' => 'The :attribute must not be greater than :max characters.',\n    ],\n    'max_digits' => 'The :attribute must not have more than :max digits.',\n    'mimes' => 'The :attribute must be a file of type: :values.',\n    'mimetypes' => 'The :attribute must be a file of type: :values.',\n    'min' => [\n        'array' => 'The :attribute must have at least :min items.',\n        'file' => 'The :attribute must be at least :min kilobytes.',\n        'numeric' => 'The :attribute must be at least :min.',\n        'string' => 'The :attribute must be at least :min characters.',\n    ],\n    'min_digits' => 'The :attribute must have at least :min digits.',\n    'multiple_of' => 'The :attribute must be a multiple of :value.',\n    'not_in' => 'The selected :attribute is invalid.',\n    'not_regex' => 'The :attribute format is invalid.',\n    'numeric' => 'The :attribute must be a number.',\n    'password' => [\n        'letters' => 'The :attribute must contain at least one letter.',\n        'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.',\n        'numbers' => 'The :attribute must contain at least one number.',\n        'symbols' => 'The :attribute must contain at least one symbol.',\n        'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',\n    ],\n    'present' => 'The :attribute field must be present.',\n    'prohibited' => 'The :attribute field is prohibited.',\n    'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',\n    'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',\n    'prohibits' => 'The :attribute field prohibits :other from being present.',\n    'regex' => 'The :attribute format is invalid.',\n    'required' => 'The :attribute field is required.',\n    'required_array_keys' => 'The :attribute field must contain entries for: :values.',\n    'required_if' => 'The :attribute field is required when :other is :value.',\n    'required_if_accepted' => 'The :attribute field is required when :other is accepted.',\n    'required_unless' => 'The :attribute field is required unless :other is in :values.',\n    'required_with' => 'The :attribute field is required when :values is present.',\n    'required_with_all' => 'The :attribute field is required when :values are present.',\n    'required_without' => 'The :attribute field is required when :values is not present.',\n    'required_without_all' => 'The :attribute field is required when none of :values are present.',\n    'same' => 'The :attribute and :other must match.',\n    'size' => [\n        'array' => 'The :attribute must contain :size items.',\n        'file' => 'The :attribute must be :size kilobytes.',\n        'numeric' => 'The :attribute must be :size.',\n        'string' => 'The :attribute must be :size characters.',\n    ],\n    'starts_with' => 'The :attribute must start with one of the following: :values.',\n    'string' => 'The :attribute must be a string.',\n    'timezone' => 'The :attribute must be a valid timezone.',\n    'unique' => 'The :attribute has already been taken.',\n    'uploaded' => 'The :attribute failed to upload.',\n    'url' => 'The :attribute must be a valid URL.',\n    'uuid' => 'The :attribute must be a valid UUID.',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Custom Validation Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify custom validation messages for attributes using the\n    | convention \"attribute.rule\" to name the lines. This makes it quick to\n    | specify a specific custom language line for a given attribute rule.\n    |\n    */\n\n    'custom' => [\n        'attribute-name' => [\n            'rule-name' => 'custom-message',\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Custom Validation Attributes\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used to swap our attribute placeholder\n    | with something more reader friendly such as \"E-Mail Address\" instead\n    | of \"email\". This simply helps us make our message more expressive.\n    |\n    */\n\n    'attributes' => [],\n\n];\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"private\": true,\n    \"type\": \"module\",\n    \"scripts\": {\n        \"dev\": \"vite\",\n        \"build\": \"vite build\"\n    },\n    \"devDependencies\": {\n        \"@popperjs/core\": \"^2.11.8\",\n        \"@vitejs/plugin-vue\": \"^4.3.4\",\n        \"axios\": \"^1.7.4\",\n        \"concurrently\": \"^9.0.1\",\n        \"bootstrap\": \"^5.3.2\",\n        \"laravel-vite-plugin\": \"^1.0\",\n        \"lodash\": \"^4.17.21\",\n        \"postcss\": \"^8.4.30\",\n        \"sass\": \"^1.68.0\",\n        \"vite\": \"^5.0\",\n        \"vue\": \"^3.5.11\"\n    },\n    \"dependencies\": {\n        \"@casl/ability\": \"^6.5.0\",\n        \"@casl/vue\": \"^2.2.1\",\n        \"@ckeditor/ckeditor5-build-classic\": \"^40.0.0\",\n        \"@ckeditor/ckeditor5-vue\": \"^5.1.0\",\n        \"js-cookie\": \"^3.0.5\",\n        \"laravel-vue-pagination\": \"^4.1.1\",\n        \"pinia\": \"^2.2.4\",\n        \"pinia-plugin-persistedstate\": \"^3.2.1\",\n        \"vee-validate\": \"^4.11.7\",\n        \"vue-i18n\": \"^9.4.1\",\n        \"vue-multiselect-listbox\": \"^0.4.5\",\n        \"vue-router\": \"^4.2.5\",\n        \"vue-select\": \"^4.0.0-beta.5\",\n        \"vue-sweetalert2\": \"^5.0.11\"\n    }\n}\n"
  },
  {
    "path": "phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"./vendor/phpunit/phpunit/phpunit.xsd\"\n         bootstrap=\"vendor/autoload.php\"\n         colors=\"true\"\n>\n    <testsuites>\n        <testsuite name=\"Unit\">\n            <directory suffix=\"Test.php\">./tests/Unit</directory>\n        </testsuite>\n        <testsuite name=\"Feature\">\n            <directory suffix=\"Test.php\">./tests/Feature</directory>\n        </testsuite>\n    </testsuites>\n    <coverage processUncoveredFiles=\"true\">\n        <include>\n            <directory suffix=\".php\">./app</directory>\n        </include>\n    </coverage>\n    <php>\n        <env name=\"APP_ENV\" value=\"testing\"/>\n        <env name=\"BCRYPT_ROUNDS\" value=\"4\"/>\n        <env name=\"CACHE_DRIVER\" value=\"array\"/>\n        <!-- <env name=\"DB_CONNECTION\" value=\"sqlite\"/> -->\n        <!-- <env name=\"DB_DATABASE\" value=\":memory:\"/> -->\n        <env name=\"MAIL_MAILER\" value=\"array\"/>\n        <env name=\"QUEUE_CONNECTION\" value=\"sync\"/>\n        <env name=\"SESSION_DRIVER\" value=\"array\"/>\n        <env name=\"TELESCOPE_ENABLED\" value=\"false\"/>\n    </php>\n</phpunit>\n"
  },
  {
    "path": "public/.htaccess",
    "content": "<IfModule mod_rewrite.c>\n    <IfModule mod_negotiation.c>\n        Options -MultiViews -Indexes\n    </IfModule>\n\n    RewriteEngine On\n\n    # Handle Authorization Header\n    RewriteCond %{HTTP:Authorization} .\n    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n\n    # Redirect Trailing Slashes If Not A Folder...\n    RewriteCond %{REQUEST_FILENAME} !-d\n    RewriteCond %{REQUEST_URI} (.+)/$\n    RewriteRule ^ %1 [L,R=301]\n\n    # Send Requests To Front Controller...\n    RewriteCond %{REQUEST_FILENAME} !-d\n    RewriteCond %{REQUEST_FILENAME} !-f\n    RewriteRule ^ index.php [L]\n</IfModule>\n"
  },
  {
    "path": "public/index.php",
    "content": "<?php\n\nuse Illuminate\\Contracts\\Http\\Kernel;\nuse Illuminate\\Http\\Request;\n\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|--------------------------------------------------------------------------\n| Check If The Application Is Under Maintenance\n|--------------------------------------------------------------------------\n|\n| If the application is in maintenance / demo mode via the \"down\" command\n| we will load this file so that any pre-rendered content can be shown\n| instead of starting the framework, which could cause an exception.\n|\n*/\n\nif (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {\n    require $maintenance;\n}\n\n/*\n|--------------------------------------------------------------------------\n| Register The Auto Loader\n|--------------------------------------------------------------------------\n|\n| Composer provides a convenient, automatically generated class loader for\n| this application. We just need to utilize it! We'll simply require it\n| into the script here so we don't need to manually load our classes.\n|\n*/\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/*\n|--------------------------------------------------------------------------\n| Run The Application\n|--------------------------------------------------------------------------\n|\n| Once we have the application, we can handle the incoming request using\n| the application's HTTP kernel. Then, we will send the response back\n| to this client's browser, allowing them to enjoy our application.\n|\n*/\n\n$app = require_once __DIR__.'/../bootstrap/app.php';\n\n$kernel = $app->make(Kernel::class);\n\n$response = $kernel->handle(\n    $request = Request::capture()\n)->send();\n\n$kernel->terminate($request, $response);\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "public/vendor/api-inspector/.vite/manifest.json",
    "content": "{\n  \"resources/js/app.js\": {\n    \"file\": \"js/app.js\",\n    \"name\": \"app\",\n    \"src\": \"resources/js/app.js\",\n    \"isEntry\": true,\n    \"css\": [\n      \"css/app.css\"\n    ]\n  }\n}"
  },
  {
    "path": "public/vendor/api-inspector/css/app.css",
    "content": ".topbar[data-v-0325c2e2]{background:#1e1e1e;border-bottom:1px solid #3e3e42;position:sticky;top:0;z-index:100}.topbar-top[data-v-0325c2e2]{max-width:1400px;margin:0 auto;padding:16px 20px;display:flex;align-items:center;justify-content:space-between;gap:30px;min-height:70px}.api-branding[data-v-0325c2e2]{display:flex;align-items:center;gap:15px;flex-shrink:0}.api-title[data-v-0325c2e2]{color:#fff;font-size:1.4em;font-weight:600;display:flex;align-items:center;gap:12px;margin:0}.github-link[data-v-0325c2e2]{display:inline-flex;align-items:center;transition:opacity .2s;flex-shrink:0}.github-link[data-v-0325c2e2]:hover{opacity:.8}.github-link svg[data-v-0325c2e2]{width:28px;height:28px}.api-version[data-v-0325c2e2]{color:#999;font-size:.85em;white-space:nowrap}.version-badge[data-v-0325c2e2]{background:#06c;color:#fff;padding:4px 10px;border-radius:3px;font-size:.8em;margin-left:8px;font-weight:600}.topbar-controls[data-v-0325c2e2]{display:flex;gap:12px;align-items:center;flex-shrink:0}.btn-auth[data-v-0325c2e2]{background:#ff9800;padding:10px}.btn-auth[data-v-0325c2e2]:hover{background:#d28006}.btn-auth.authenticated[data-v-0325c2e2]{background:#49cc90}.auth-modal-overlay[data-v-0325c2e2]{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:2000;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.auth-modal[data-v-0325c2e2]{background:#252526;border:1px solid #3e3e42;border-radius:8px;box-shadow:0 20px 60px #00000080;width:100%;max-width:500px;max-height:90vh;overflow-y:auto;animation:modalSlideIn-0325c2e2 .3s ease-out}@keyframes modalSlideIn-0325c2e2{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.auth-modal-header[data-v-0325c2e2]{padding:24px;border-bottom:1px solid #3e3e42;display:flex;justify-content:space-between;align-items:center}.auth-modal-header h3[data-v-0325c2e2]{color:#fff;font-size:1.3em;margin:0;font-weight:600}.btn-modal-close[data-v-0325c2e2]{background:none;border:none;color:#999;font-size:24px;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.btn-modal-close[data-v-0325c2e2]:hover{background:#3e3e42;color:#fff}.auth-modal-body[data-v-0325c2e2]{padding:24px}.auth-method-selector[data-v-0325c2e2]{margin-bottom:24px}.auth-method-label[data-v-0325c2e2]{display:block;color:#fff;font-weight:600;font-size:14px;margin-bottom:12px}.auth-method-options[data-v-0325c2e2]{display:flex;gap:16px}.auth-method-option[data-v-0325c2e2]{display:flex;align-items:center;gap:8px;color:#ccc;cursor:pointer;font-size:14px;flex:1}.auth-method-option input[type=radio][data-v-0325c2e2]{cursor:pointer;width:16px;height:16px}.auth-method-option[data-v-0325c2e2]:hover{color:#fff}.auth-input-section[data-v-0325c2e2]{margin-bottom:24px}.auth-field-label[data-v-0325c2e2]{display:block;color:#fff;font-weight:600;font-size:14px;margin-bottom:8px}.auth-required[data-v-0325c2e2]{color:#f93e3e}.auth-modal-input[data-v-0325c2e2]{width:100%;padding:12px 16px;background:#2a2a2a;border:1px solid #3e3e42;border-radius:4px;color:#fff;font-family:monospace;font-size:14px;transition:all .2s;box-sizing:border-box}.auth-modal-input[data-v-0325c2e2]:focus{outline:none;border-color:#06c;box-shadow:0 0 8px #0066cc4d;background:#333}.auth-input-hint[data-v-0325c2e2]{margin-top:8px;font-size:12px;color:#999;line-height:1.5}.auth-modal-footer[data-v-0325c2e2]{display:flex;gap:12px;justify-content:flex-end}.btn-modal-secondary[data-v-0325c2e2]{padding:12px 24px;background:#3e3e42;color:#ccc;border:1px solid #3e3e42;border-radius:4px;cursor:pointer;font-weight:600;font-size:14px;transition:all .2s}.btn-modal-secondary[data-v-0325c2e2]:hover{background:#4e4e52;color:#fff;border-color:#555}.btn-modal-primary[data-v-0325c2e2]{padding:12px 24px;background:#06c;color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:600;font-size:14px;transition:all .2s}.btn-modal-primary[data-v-0325c2e2]:hover{background:#0052a3}.btn-modal-primary[data-v-0325c2e2]:active{transform:scale(.98)}.auth-modal-divider[data-v-0325c2e2]{margin:24px 0;padding:12px 0;text-align:center;color:#999;font-size:12px;position:relative}.auth-modal-divider[data-v-0325c2e2]:before{content:\"\";position:absolute;top:50%;left:0;right:0;height:1px;background:#3e3e42;z-index:0}.auth-modal-divider span[data-v-0325c2e2]{position:relative;background:#252526;padding:0 12px;z-index:1}.auth-modal-logout[data-v-0325c2e2]{padding:16px;background:#2a2a2a;border:1px solid #3e3e42;border-radius:4px}.auth-logout-text[data-v-0325c2e2]{color:#ccc;font-size:13px;margin:0 0 12px;line-height:1.5}.btn-modal-logout[data-v-0325c2e2]{width:100%;padding:10px 16px;background:#f93e3e;color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:600;font-size:14px;transition:all .2s}.btn-modal-logout[data-v-0325c2e2]:hover{background:#d92e2e}.btn-modal-logout[data-v-0325c2e2]:active{transform:scale(.98);max-width:1400px;margin:0 auto;padding:0 20px 16px;display:flex;gap:8px;align-items:center;border-top:1px solid #2a2a2a}.menu-item[data-v-0325c2e2]{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;color:#bbb;text-decoration:none;border-radius:4px;cursor:pointer;transition:all .2s ease;font-size:14px;border:1px solid transparent;white-space:nowrap;font-weight:500}.menu-item[data-v-0325c2e2]:hover{background:#2a2a2a;color:#fff;border-color:#444}.menu-item.active[data-v-0325c2e2]{background:#06c;color:#fff;border-color:#0052a3}.menu-icon[data-v-0325c2e2]{font-size:16px}.menu-label[data-v-0325c2e2]{font-weight:500}.auth-input-group[data-v-0325c2e2]{display:flex;gap:10px;align-items:center;border-right:1px solid #3e3e42;padding-right:12px}.auth-input-group input[data-v-0325c2e2]{min-height:auto;width:240px;padding:8px 12px;font-size:12px;background:#2a2a2a;border:1px solid #444;color:#ccc;border-radius:4px;font-family:monospace}.auth-input-group input[data-v-0325c2e2]:focus{outline:none;border-color:#06c;box-shadow:0 0 4px #0066cc4d}.auth-input-group input[data-v-0325c2e2]::placeholder{color:#666}.auth-input-group label[data-v-0325c2e2]{color:#999;font-size:12px;margin:0;white-space:nowrap;font-weight:500}.auth-status[data-v-0325c2e2]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#999;white-space:nowrap}.auth-status.active[data-v-0325c2e2]{color:#49cc90}.auth-status-dot[data-v-0325c2e2]{width:8px;height:8px;border-radius:50%;background:#999;flex-shrink:0}.auth-status.active .auth-status-dot[data-v-0325c2e2]{background:#49cc90}.btn-logout[data-v-0325c2e2]{background:#f93e3e;color:#fff;border:none;padding:8px 12px;border-radius:4px;cursor:pointer;font-weight:600;font-size:12px;white-space:nowrap;transition:background .2s,transform .1s;display:inline-flex;align-items:center;gap:6px}.btn-logout[data-v-0325c2e2]:hover{background:#d92e2e;transform:scale(1.05)}.btn-logout[data-v-0325c2e2]:active{transform:scale(.98)}.btn[data-v-0325c2e2]{color:#fff;border:none;padding:10px;border-radius:4px;cursor:pointer;font-weight:600;transition:background .2s;text-decoration:none;display:inline-flex;align-items:center;font-size:14px;white-space:nowrap;flex-shrink:0}.btn[data-v-0325c2e2]:hover:not(:disabled){opacity:.9}.btn[data-v-0325c2e2]:disabled{background:#ccc;cursor:not-allowed}.btn-refresh[data-v-0325c2e2]{background:#666}.btn-feature[data-v-0325c2e2]{background:#389f71;text-decoration:none}.btn-postman[data-v-0325c2e2]{background:#ff6c37}.btn-postman[data-v-0325c2e2]:hover{opacity:.9}.btn-openapi[data-v-0325c2e2]{background:#008c45}.btn-openapi[data-v-0325c2e2]:hover{opacity:.9}.loading-spinner[data-v-0325c2e2]{width:20px;height:20px;border:3px solid #ccc;border-top-color:#06c;border-radius:50%;animation:spin-0325c2e2 1s linear infinite;flex-shrink:0}@keyframes spin-0325c2e2{to{transform:rotate(360deg)}}@media(max-width:1200px){.topbar-top[data-v-0325c2e2]{gap:20px}.api-title[data-v-0325c2e2]{font-size:1.2em}.topbar-controls[data-v-0325c2e2]{gap:10px}.auth-input-group input[data-v-0325c2e2]{width:200px}}@media(max-width:900px){.topbar-top[data-v-0325c2e2]{flex-wrap:wrap;min-height:auto}.api-branding[data-v-0325c2e2]{flex-basis:100%}.topbar-controls[data-v-0325c2e2]{flex-basis:100%;justify-content:flex-end}.topbar-menu[data-v-0325c2e2]{flex-basis:100%;padding:12px 20px;border-top:1px solid #2a2a2a}.menu-item[data-v-0325c2e2]{padding:8px 14px;font-size:13px}.auth-input-group input[data-v-0325c2e2]{width:180px}}@media(max-width:768px){.topbar-top[data-v-0325c2e2]{padding:12px 15px;gap:15px}.api-title[data-v-0325c2e2]{font-size:1.1em}.github-link svg[data-v-0325c2e2]{width:24px;height:24px}.topbar-menu[data-v-0325c2e2]{padding:10px 15px}.menu-item[data-v-0325c2e2]{padding:8px 12px;font-size:12px}.auth-input-group[data-v-0325c2e2]{padding-right:10px}.auth-input-group input[data-v-0325c2e2]{width:150px;padding:6px 10px}.btn-logout[data-v-0325c2e2]{padding:6px 10px;font-size:11px}.btn[data-v-0325c2e2]{padding:8px 15px;font-size:12px}}@media(max-width:600px){.topbar-top[data-v-0325c2e2]{flex-direction:column;align-items:flex-start}.api-branding[data-v-0325c2e2]{width:100%}.topbar-controls[data-v-0325c2e2]{width:100%;gap:8px;flex-wrap:wrap}.topbar-menu[data-v-0325c2e2]{width:100%}.auth-input-group[data-v-0325c2e2]{flex-wrap:wrap;border-right:none;padding-right:0;width:100%}.auth-input-group label[data-v-0325c2e2]{flex-basis:100%}.auth-input-group input[data-v-0325c2e2]{width:100%;min-width:120px}.menu-item[data-v-0325c2e2]{flex:1;justify-content:center;padding:8px 10px}.menu-label[data-v-0325c2e2]{display:none}.menu-icon[data-v-0325c2e2]{font-size:18px}.btn[data-v-0325c2e2]{flex:1;justify-content:center;padding:8px 10px}}@media(max-width:480px){.topbar-top[data-v-0325c2e2]{padding:10px 12px}.api-title[data-v-0325c2e2]{font-size:.95em}.api-version[data-v-0325c2e2]{display:none}.github-link svg[data-v-0325c2e2]{width:20px;height:20px}.topbar-menu[data-v-0325c2e2]{padding:8px 12px}.menu-item[data-v-0325c2e2]{padding:6px 8px;font-size:11px}.auth-input-group[data-v-0325c2e2]{gap:8px}.auth-input-group label[data-v-0325c2e2]{display:none}.auth-input-group input[data-v-0325c2e2]{padding:6px 8px}.auth-status[data-v-0325c2e2]{font-size:10px}.btn-logout[data-v-0325c2e2]{padding:6px 10px;font-size:10px}.btn[data-v-0325c2e2]{padding:6px 12px;font-size:11px}}.sidebar[data-v-a3eda4e9]{width:320px;background:#252526;border-right:1px solid #3e3e42;overflow-y:auto;overflow-x:hidden;padding:0 0 20px;flex-shrink:0;max-height:100%}.sidebar[data-v-a3eda4e9]::-webkit-scrollbar{width:8px}.sidebar[data-v-a3eda4e9]::-webkit-scrollbar-track{background:#252526}.sidebar[data-v-a3eda4e9]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sidebar[data-v-a3eda4e9]::-webkit-scrollbar-thumb:hover{background:#666}.sidebar-search[data-v-a3eda4e9]{padding:15px;border-bottom:1px solid #3e3e42;flex-shrink:0;position:sticky;top:0;background:#252526;z-index:10}.search-input-group[data-v-a3eda4e9]{position:relative;display:flex;align-items:center;gap:8px}.search-icon[data-v-a3eda4e9]{width:18px;height:18px;color:#999;flex-shrink:0;pointer-events:none;position:absolute;left:10px}.search-input[data-v-a3eda4e9]{width:100%;padding:8px 8px 8px 36px;background:#2a2a2a;border:1px solid #3e3e42;border-radius:4px;color:#ccc;font-size:13px;font-family:inherit;transition:border-color .2s,background .2s}.search-input[data-v-a3eda4e9]:focus{outline:none;border-color:#06c;background:#333}.search-input[data-v-a3eda4e9]::placeholder{color:#666}.clear-button[data-v-a3eda4e9]{position:absolute;right:8px;background:none;border:none;color:#999;cursor:pointer;padding:4px 6px;font-size:14px;transition:color .2s;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:2px}.clear-button[data-v-a3eda4e9]:hover{color:#ccc;background:#3e3e42}.no-results[data-v-a3eda4e9]{color:#999;font-size:12px;padding:10px;text-align:center;margin-top:8px}.sidebar>div[data-v-a3eda4e9]:not(.sidebar-search){overflow-y:auto}.sidebar-group[data-v-a3eda4e9]{margin-bottom:0}.sidebar-group-title[data-v-a3eda4e9]{color:#999;font-size:.85em;font-weight:600;padding:10px 20px;text-transform:uppercase;letter-spacing:1px}.sidebar-route[data-v-a3eda4e9]{padding:10px 20px;cursor:pointer;border-left:3px solid transparent;transition:background .2s,border-color .2s;display:flex;align-items:center;gap:10px;color:#ccc}.sidebar-route[data-v-a3eda4e9]:hover{background:#333}.sidebar-route.active[data-v-a3eda4e9]{background:#06c;border-left-color:#06c;color:#fff}.route-method-badge[data-v-a3eda4e9]{font-size:.7em;font-weight:600;padding:3px 6px;border-radius:3px;min-width:40px;text-align:center;text-transform:uppercase}.route-method-badge.get[data-v-a3eda4e9]{background:#61affe;color:#fff}.route-method-badge.post[data-v-a3eda4e9]{background:#49cc90;color:#fff}.route-method-badge.put[data-v-a3eda4e9]{background:#fca130;color:#fff}.route-method-badge.delete[data-v-a3eda4e9]{background:#f93e3e;color:#fff}.route-method-badge.patch[data-v-a3eda4e9]{background:#50e3c2;color:#fff}.route-path[data-v-a3eda4e9]{font-family:Courier New,monospace;font-size:.85em;flex:1;overflow:hidden;text-overflow:ellipsis}.detail-header[data-v-45e22525]{padding:15px 15px 10px;background:#fff;border-bottom:1px solid #e0e0e0;flex-shrink:0}.detail-method-path[data-v-45e22525]{display:flex;align-items:center;gap:15px;margin-bottom:15px}.detail-method-badge[data-v-45e22525]{font-size:.85em;font-weight:600;padding:6px 12px;border-radius:3px;text-transform:uppercase;min-width:50px;text-align:center}.detail-method-badge.get[data-v-45e22525]{background:#61affe;color:#fff}.detail-method-badge.post[data-v-45e22525]{background:#49cc90;color:#fff}.detail-method-badge.put[data-v-45e22525]{background:#fca130;color:#fff}.detail-method-badge.delete[data-v-45e22525]{background:#f93e3e;color:#fff}.detail-method-badge.patch[data-v-45e22525]{background:#50e3c2;color:#fff}.detail-path[data-v-45e22525]{font-family:Courier New,monospace;font-size:1.1em;font-weight:600;color:#3e3e42}.detail-description[data-v-45e22525]{color:#666;font-size:.95em;margin-bottom:10px}.auth-badge[data-v-45e22525]{display:inline-block;background:#fff3cd;color:#856404;padding:1px 5px;border-radius:5px;font-size:.8em;border:1px solid #ffc107}.section[data-v-79f128c3]{margin-bottom:40px}.section-title[data-v-79f128c3]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}.expandable[data-v-79f128c3]{border:1px solid #e0e0e0;border-radius:4px;overflow:hidden}.expandable-header[data-v-79f128c3]{background:#f5f5f5;padding:5px 10px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;-webkit-user-select:none;user-select:none}.expandable-header[data-v-79f128c3]:hover{background:#efefef}.toggle-icon[data-v-79f128c3]{transition:transform .2s;color:#999}.expandable-content[data-v-79f128c3]{padding:10px;background:#fff;border-top:1px solid #e0e0e0}table[data-v-79f128c3]{width:100%;border-collapse:collapse;font-size:.9em}thead[data-v-79f128c3]{background:#fafafa}th[data-v-79f128c3]{text-align:left;padding:5px 10px;font-weight:600;color:#666;border-bottom:1px solid #e0e0e0}td[data-v-79f128c3]{padding:12px;border-bottom:1px solid #f0f0f0}tr[data-v-79f128c3]:hover{background:#fafafa}.param-name[data-v-79f128c3]{font-family:Courier New,monospace;font-weight:600;color:#06c}.param-type[data-v-79f128c3]{font-family:Courier New,monospace;color:#666;background:#f5f5f5;padding:2px 6px;border-radius:3px}.section[data-v-155d9b8e]{margin-bottom:40px}.section-title[data-v-155d9b8e]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}.form-fields-info[data-v-155d9b8e]{display:grid;gap:12px}.form-field-info[data-v-155d9b8e]{padding:12px;background:#f5f5f5;border:1px solid #e0e0e0;border-radius:4px}.field-label-info[data-v-155d9b8e]{display:flex;gap:8px;align-items:center;margin-bottom:8px;font-weight:600;font-size:13px}.field-name-info[data-v-155d9b8e]{color:#2196f3;font-family:monospace;font-weight:700}.field-required-badge[data-v-155d9b8e]{background:#ffebee;color:#c62828;padding:2px 6px;border-radius:3px;font-size:11px;font-weight:700}.field-optional-badge[data-v-155d9b8e]{background:#e3f2fd;color:#1565c0;padding:2px 6px;border-radius:3px;font-size:11px;font-weight:700}.field-meta-info[data-v-155d9b8e]{display:flex;flex-direction:column;gap:4px;font-size:12px;color:#666}.field-type-info[data-v-155d9b8e]{display:block}.field-example-info[data-v-155d9b8e]{display:block;font-family:monospace;background:#fff;padding:4px 6px;border-radius:2px}.field-desc-info[data-v-155d9b8e]{display:block;font-style:italic;color:#888}.section[data-v-def58604]{margin-bottom:40px}.section-title[data-v-def58604]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}.request-tester[data-v-def58604]{background:#fff;border:1px solid #e0e0e0;border-radius:4px;padding:10px}.input-group[data-v-def58604]{position:relative;display:flex;align-items:center;margin-bottom:15px}.input-with-icon[data-v-def58604]{width:100%;padding:10px 40px 10px 10px;border:1px solid #e0e0e0;border-radius:4px;font-family:Courier New,monospace;font-size:13px;background-color:#f9f9f9;transition:border-color .2s}.input-with-icon[data-v-def58604]:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.copy-icon[data-v-def58604]{position:absolute;right:8px;background:none;border:none;cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s}.copy-icon[data-v-def58604]:hover{color:#06c}.tester-tabs[data-v-def58604]{display:flex;gap:0;border-bottom:2px solid #e0e0e0;margin-bottom:20px}.tab-btn[data-v-def58604]{flex:1;padding:12px 16px;border:none;background:#f5f5f5;cursor:pointer;font-size:14px;font-weight:600;color:#666;transition:all .3s ease;border-bottom:3px solid transparent}.tab-btn[data-v-def58604]:hover{background:#e8e8e8}.tab-btn.active[data-v-def58604]{background:#fff;color:#333;border-bottom-color:#2196f3}.form-fields-container[data-v-def58604]{display:grid;gap:15px;margin-bottom:20px}.form-field-minimal[data-v-def58604]{display:flex;flex-direction:column;gap:6px}.field-header-minimal[data-v-def58604]{display:flex;align-items:center;gap:8px}.field-label-minimal[data-v-def58604]{font-weight:600;color:#333;font-size:14px;margin:0;display:flex;align-items:center;gap:8px}.badge-required[data-v-def58604]{display:inline-block;background:#ffebee;color:#c62828;padding:1px 5px;border-radius:3px;font-size:.7em;font-weight:600}.param-description[data-v-def58604]{font-size:12px;color:#666;font-style:italic;margin-top:4px}.input-minimal[data-v-def58604]{width:100%;padding:10px;border:1px solid #e0e0e0;border-radius:4px;font-family:Courier New,monospace;font-size:13px;transition:border-color .2s}.input-minimal[data-v-def58604]:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.json-editor-container[data-v-def58604]{margin-bottom:20px;position:relative}.json-editor-header[data-v-def58604]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.json-editor-header label[data-v-def58604]{display:block;font-weight:600;margin:0}.json-editor-actions[data-v-def58604]{display:flex;gap:8px}.btn-small[data-v-def58604]{padding:4px 12px;font-size:12px;background:#f0f0f0;border:1px solid #d0d0d0;border-radius:4px;cursor:pointer;transition:all .2s}.btn-small[data-v-def58604]:hover{background:#e0e0e0;border-color:#b0b0b0}.saved-examples-panel[data-v-def58604]{position:absolute;top:40px;right:0;background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 4px 12px #00000026;width:350px;max-height:400px;overflow-y:auto;z-index:1000}.saved-examples-header[data-v-def58604]{padding:12px;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center}.saved-examples-header h4[data-v-def58604]{margin:0;font-size:14px;font-weight:600}.btn-close[data-v-def58604]{background:none;border:none;font-size:16px;cursor:pointer;padding:0}.no-examples[data-v-def58604]{padding:16px 12px;text-align:center;color:#999;font-size:13px}.examples-list[data-v-def58604]{max-height:350px;overflow-y:auto}.example-item[data-v-def58604]{padding:10px 12px;border-bottom:1px solid #f0f0f0;display:flex;flex-direction:column;gap:6px}.example-item[data-v-def58604]:last-child{border-bottom:none}.example-name[data-v-def58604]{font-weight:600;font-size:13px;color:#333;word-break:break-word}.example-timestamp[data-v-def58604]{font-size:11px;color:#999}.example-actions[data-v-def58604]{display:flex;gap:6px}.btn-action[data-v-def58604]{flex:1;padding:6px;font-size:12px;background:#f5f5f5;border:1px solid #ddd;border-radius:3px;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:4px}.btn-action[data-v-def58604]:hover{background:#e8e8e8;border-color:#b0b0b0}.btn-action.btn-delete[data-v-def58604]:hover{background:#ffebee;border-color:#ef5350;color:#c62828}.json-editor-footer[data-v-def58604]{margin-top:10px;display:flex;gap:8px}.btn-secondary[data-v-def58604]{flex:1;padding:10px 16px;background:#f0f0f0;color:#333;border:1px solid #ddd;border-radius:4px;cursor:pointer;font-weight:600;transition:all .2s}.btn-secondary[data-v-def58604]:hover{background:#e0e0e0;border-color:#b0b0b0}.json-editor-container label[data-v-def58604]{display:block;margin-bottom:8px;font-weight:600}.json-editor[data-v-def58604]{width:100%;padding:10px;font-family:monospace;border:1px solid #ddd;border-radius:4px;font-size:13px}.json-editor[data-v-def58604]:focus{outline:none;border-color:#2196f3;box-shadow:0 0 4px #2196f333}.btn[data-v-def58604]{background:#06c;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer;font-weight:600;transition:background .2s}.btn[data-v-def58604]:hover:not(:disabled){background:#0052a3}.btn[data-v-def58604]:disabled{background:#ccc;cursor:not-allowed}.section[data-v-4a3ad82c]{margin-bottom:40px}.section-title[data-v-4a3ad82c]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}pre[data-v-4a3ad82c]{font-family:Courier New,monospace;font-size:.85em;line-height:1.5;background-color:#1e1e1e;color:#fff;transition:background-color .2s ease}pre[data-v-4a3ad82c]:hover{background-color:#2a2a2a}.copy-btn[data-v-4a3ad82c]{background-color:#06c;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .3s ease;display:flex;align-items:center;gap:6px;white-space:nowrap}.copy-btn[data-v-4a3ad82c]:hover{background-color:#0052a3;transform:translateY(-2px);box-shadow:0 2px 8px #0066cc4d}.copy-btn[data-v-4a3ad82c]:active{transform:translateY(0);box-shadow:0 1px 4px #06c3}.pre-copy-icon[data-v-4a3ad82c]{position:absolute;top:25px;right:25px;background:none;border:none;font-size:1.2em;cursor:pointer;padding:4px 8px;border-radius:4px;transition:all .2s ease;z-index:10;line-height:1}.pre-copy-icon[data-v-4a3ad82c]:hover{background-color:#0066cc1a;transform:scale(1.15)}.pre-copy-icon[data-v-4a3ad82c]:active{transform:scale(.95)}.section[data-v-ab00471f]{margin-bottom:40px}.section-title[data-v-ab00471f]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}.response-section[data-v-ab00471f]{background:#f5f5f5;border:1px solid #e0e0e0;border-radius:4px;padding:15px;margin-top:20px}.response-status[data-v-ab00471f]{font-weight:600;margin-bottom:15px}.response-status.success[data-v-ab00471f]{color:#27ae60}.response-status.error[data-v-ab00471f]{color:#e74c3c}.response-code[data-v-ab00471f]{background:#fff;border:1px solid #e0e0e0;border-radius:4px;padding:15px;overflow-x:auto;font-family:Courier New,monospace;font-size:.85em;white-space:pre-wrap;word-wrap:break-word}.btn[data-v-ab00471f]{background:#06c;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer;font-weight:600;transition:background .2s}.btn[data-v-ab00471f]:hover{background:#0052a3}.section[data-v-2e6a99d1]{margin-bottom:40px}.section-title[data-v-2e6a99d1]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}.saved-responses[data-v-2e6a99d1]{margin-top:20px}.saved-response-item[data-v-2e6a99d1]{background:#fff;border:1px solid #e0e0e0;border-radius:4px;padding:15px;margin-bottom:10px;display:flex;justify-content:space-between;align-items:center;transition:background .2s}.saved-response-item[data-v-2e6a99d1]:hover{background:#fafafa}.saved-response-content[data-v-2e6a99d1]{flex:1;cursor:pointer}.saved-response-time[data-v-2e6a99d1]{color:#999;font-size:.85em;margin-top:5px}.delete-btn[data-v-2e6a99d1]{background:#ef4444;color:#fff;border:none;border-radius:4px;padding:6px 12px;cursor:pointer;font-size:16px;transition:background .2s;margin-left:10px}.delete-btn[data-v-2e6a99d1]:hover{background:#dc2626}.tabs-component[data-v-cbcf88f8]{width:100%}.tab-header[data-v-cbcf88f8]{display:flex;border-bottom:2px solid #e0e0e0;gap:0;background:#f9f9f9}.tab[data-v-cbcf88f8]{flex:1;padding:12px 16px;border:none;background:transparent;cursor:pointer;font-size:14px;font-weight:500;color:#666;transition:all .3s ease;border-bottom:3px solid transparent;margin-bottom:-2px}.tab[data-v-cbcf88f8]:hover{color:#333;background:#f0f0f0}.tab.active[data-v-cbcf88f8]{color:#2c3e50;border-bottom-color:#42b983}.tab-body[data-v-cbcf88f8]{padding:20px 0;min-height:200px}.api-info-container[data-v-8f8eb8b4]{display:flex;flex-direction:column;gap:40px}.info-section[data-v-8f8eb8b4]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;padding:28px;display:grid;gap:24px}.info-group[data-v-8f8eb8b4]{display:grid;grid-template-columns:140px 1fr;gap:20px;align-items:start}.info-label[data-v-8f8eb8b4]{font-weight:600;color:#1f2937;font-size:14px}.info-value[data-v-8f8eb8b4]{color:#6b7280;font-size:14px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}.method-badge[data-v-8f8eb8b4]{display:inline-block;font-weight:700;padding:4px 12px;border-radius:4px;font-size:13px;font-family:monospace;min-width:60px;text-align:center}.method-get[data-v-8f8eb8b4]{background:#dcfce7;color:#15803d}.method-post[data-v-8f8eb8b4]{background:#fef08a;color:#854d0e}.method-put[data-v-8f8eb8b4]{background:#fecaca;color:#991b1b}.method-delete[data-v-8f8eb8b4]{background:#fee2e2;color:#7f1d1d}.method-patch[data-v-8f8eb8b4]{background:#dbeafe;color:#0c4a6e}.middlewares-value[data-v-8f8eb8b4]{display:flex;gap:8px;flex-wrap:wrap}.middleware-badge[data-v-8f8eb8b4]{background:#f3f4f6;color:#4b5563;padding:4px 10px;border-radius:3px;font-size:12px;border:1px solid #e5e7eb;font-family:monospace}.info-link[data-v-8f8eb8b4]{color:#2563eb;font-size:14px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:color .2s}.info-link[data-v-8f8eb8b4]:hover{color:#1d4ed8}.arrow[data-v-8f8eb8b4]{font-size:18px;font-weight:300;display:inline-block;transition:transform .2s ease}.arrow.expanded[data-v-8f8eb8b4]{transform:rotate(90deg)}.collapsible-content[data-v-8f8eb8b4]{margin-top:12px;padding:12px;background:#f9fafb;border-left:3px solid #2563eb;border-radius:4px;animation:slideDown-8f8eb8b4 .2s ease}@keyframes slideDown-8f8eb8b4{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.response-codes-list[data-v-8f8eb8b4]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}.response[data-v-8f8eb8b4]{padding:10px 16px;background:#fff;border:none;border-radius:4px;font-family:monospace;font-size:13px;font-weight:600;color:#fff;width:100%;display:inline-block}.response-200[data-v-8f8eb8b4],.response-201[data-v-8f8eb8b4],.response-204[data-v-8f8eb8b4]{background:#10b981;color:#fff}.response-400[data-v-8f8eb8b4],.response-401[data-v-8f8eb8b4],.response-403[data-v-8f8eb8b4],.response-404[data-v-8f8eb8b4],.response-405[data-v-8f8eb8b4],.response-409[data-v-8f8eb8b4]{background:#f87171;color:#fff}.response-422[data-v-8f8eb8b4],.response-429[data-v-8f8eb8b4]{background:#fbbf24;color:#78350f}.response-500[data-v-8f8eb8b4],.response-502[data-v-8f8eb8b4],.response-503[data-v-8f8eb8b4]{background:#f87171;color:#fff}.curl-command[data-v-8f8eb8b4]{display:flex;flex-direction:column;gap:12px}.curl-command>div[data-v-8f8eb8b4]{width:100%}.curl-command textarea[data-v-8f8eb8b4]{width:100%;background:#1f2937;padding:12px;border-radius:4px;border:1px solid #374151;font-size:12px;font-family:Monaco,Courier New,monospace;color:#e5e7eb;line-height:1.6;box-sizing:border-box}.curl-command code[data-v-8f8eb8b4]{flex:1;background:#fff;padding:10px;border-radius:4px;border:1px solid #e5e7eb;font-size:12px;overflow-x:auto;white-space:nowrap;color:#374151}.copy-btn[data-v-8f8eb8b4]{align-self:center;width:120px;padding:8px 16px;background:#d1d5db;color:#374151;border:none;border-radius:4px;font-size:12px;font-weight:600;cursor:pointer;transition:background .2s;white-space:nowrap;height:fit-content}.copy-btn[data-v-8f8eb8b4]:hover{background:#bfdbfe}.copy-btn[data-v-8f8eb8b4]:active{background:#93c5fd}.empty-content[data-v-8f8eb8b4]{padding:12px;text-align:center;color:#9ca3af;font-size:13px}.section[data-v-8f8eb8b4]{margin-bottom:40px}.section-title[data-v-8f8eb8b4]{font-size:1.1em;font-weight:600;margin-bottom:15px;color:#1e1e1e;border-bottom:2px solid #0066cc;padding-bottom:10px}.form-fields-info[data-v-8f8eb8b4]{display:grid;gap:12px}.form-field-info[data-v-8f8eb8b4]{padding:12px;background:#f5f5f5;border:1px solid #e0e0e0;border-radius:4px}.field-label-info[data-v-8f8eb8b4]{display:flex;gap:8px;align-items:center;margin-bottom:8px;font-weight:600;font-size:13px}.field-name-info[data-v-8f8eb8b4]{color:#2196f3;font-family:monospace;font-weight:700}.field-required-badge[data-v-8f8eb8b4]{background:#ffebee;color:#c62828;padding:2px 6px;border-radius:3px;font-size:11px;font-weight:700}.field-optional-badge[data-v-8f8eb8b4]{background:#e3f2fd;color:#1565c0;padding:2px 6px;border-radius:3px;font-size:11px;font-weight:700}.field-meta-info[data-v-8f8eb8b4]{display:flex;flex-direction:column;gap:4px;font-size:12px;color:#666}.field-type-info[data-v-8f8eb8b4]{display:block}.field-example-info[data-v-8f8eb8b4]{display:block;font-family:monospace;background:#fff;padding:4px 6px;border-radius:2px}.field-desc-info[data-v-8f8eb8b4]{display:block;font-style:italic;color:#888}code[data-v-8f8eb8b4]{background:#f3f4f6;padding:2px 6px;border-radius:3px;font-family:monospace;font-size:12px;color:#374151}.endpoint-detail[data-v-d0e6e422]{flex:1;display:flex;flex-direction:column;overflow:hidden}.detail-body[data-v-d0e6e422]{flex:1;overflow-y:auto;padding:0;display:flex;gap:0}.detail-body-left[data-v-d0e6e422]{flex:1;overflow-y:auto;padding:10px 20px;border-right:1px solid #e0e0e0;background:#fff}.detail-body-right[data-v-d0e6e422]{flex:1;overflow-y:auto;padding:10px 20px;background:#f9f9f9}.empty-state[data-v-d0e6e422]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#999;padding:40px 20px;min-height:200px}.empty-state-icon[data-v-d0e6e422]{font-size:4em;margin-bottom:20px;opacity:.3}.tab-content[data-v-d0e6e422]{animation:fadeIn-d0e6e422 .3s ease}@keyframes fadeIn-d0e6e422{0%{opacity:0}to{opacity:1}}.app-container[data-v-0a7e40cc]{display:flex;flex-direction:column;height:100vh;overflow:hidden}.main-container[data-v-0a7e40cc]{display:flex;flex:1;overflow:hidden}.content[data-v-0a7e40cc]{flex:1;display:flex;flex-direction:column;overflow:hidden}.empty-state[data-v-0a7e40cc]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#999}.empty-state-icon[data-v-0a7e40cc]{font-size:4em;margin-bottom:20px;opacity:.3}.toasts-container[data-v-40e4e9e9]{position:fixed;top:20px;right:20px;z-index:9999;display:flex;flex-direction:column;gap:10px;pointer-events:none}.toast[data-v-40e4e9e9]{padding:12px 20px;border-radius:6px;box-shadow:0 4px 12px #00000026;animation:slideIn-40e4e9e9 .3s ease-out;font-size:14px;max-width:300px;pointer-events:auto}.toast-content[data-v-40e4e9e9]{display:flex;align-items:center;gap:8px}.toast-icon[data-v-40e4e9e9]{font-weight:700;font-size:16px}.toast.success[data-v-40e4e9e9]{background-color:#10b981;color:#fff;border-left:4px solid #059669}.toast.error[data-v-40e4e9e9]{background-color:#ef4444;color:#fff;border-left:4px solid #dc2626}.toast.info[data-v-40e4e9e9]{background-color:#3b82f6;color:#fff;border-left:4px solid #1d4ed8}@keyframes slideIn-40e4e9e9{0%{transform:translate(400px);opacity:0}to{transform:translate(0);opacity:1}}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Roboto,sans-serif;background:#fafafa;color:#3e3e42;line-height:1.6}#api-inspector{display:flex;flex-direction:column;height:100vh;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#555}.flex-col{flex-direction:column}.gap-3{gap:12px}.gap-4{gap:16px}.items-center{align-items:center}.p-4{padding:16px!important}.p-6{padding:24px!important}.mb-4{margin-bottom:16px!important}.mb-5{margin-bottom:20px!important}.pb-5{padding-bottom:7rem!important}.mt-4{margin-top:16px!important}.me-1{margin-right:5px!important}.bg-white{background:#fff!important}.loading-spinner{width:20px;height:20px;border:3px solid #ccc;border-top-color:#06c;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.badge{display:inline-block;padding:4px 8px;border-radius:3px;font-size:.75em;font-weight:600;text-transform:uppercase}.badge-get{background:#61affe;color:#fff}.badge-post{background:#49cc90;color:#fff}.badge-put{background:#fca130;color:#fff}.badge-delete{background:#f93e3e;color:#fff}.badge-patch{background:#50e3c2;color:#fff}textarea,input,select{width:100%;padding:10px;border:1px solid #e0e0e0;border-radius:4px;font-family:Courier New,monospace;font-size:.9em}textarea:focus,input:focus,select:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.btn{color:#fff;border:none;padding:10px;border-radius:4px;cursor:pointer;font-weight:600;transition:background .2s}.btn:hover:not(:disabled){background:#0052a3}.btn:disabled{background:#ccc;cursor:not-allowed}.btn-sm{padding:6px 12px;font-size:.9em}.auth-bg{background:#ff9800!important}table{width:100%;border-collapse:collapse;font-size:.9em}thead{background:#fafafa}th{text-align:left;padding:12px;font-weight:600;color:#666;border-bottom:1px solid #e0e0e0}td{padding:12px;border-bottom:1px solid #f0f0f0}tr:hover{background:#fafafa}.text-center{text-align:center!important}.mb-4{margin-bottom:16px}.fs-small{font-size:.875em}.fs-20{font-size:20px}.font-bold{font-weight:700}.justify-between{justify-content:space-between}.flex{display:flex}.ml-3{margin-left:12px}.mb-0{margin-bottom:0!important}.me-2{margin-right:8px}.pb-0{padding-bottom:0!important}.app-container{display:flex;flex-direction:column;height:100vh;overflow:hidden}.main-container{display:flex;flex:1;overflow:hidden}.content{flex:1;display:flex;flex-direction:column;overflow:hidden}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#999}.empty-state-icon{font-size:4em;margin-bottom:20px;opacity:.3}.dashboard-container{padding:24px;background:#f9fafb;min-height:100vh;overflow-y:auto}.dashboard-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:32px}.dashboard-header h1{font-size:28px;font-weight:700;color:#1f2937;margin:0}.btn-refresh{padding:8px 16px;background:#2563eb;color:#fff;border:none;border-radius:6px;cursor:pointer;font-weight:600;transition:background .2s}.btn-refresh:hover{background:#1d4ed8}.time-range-select{padding:8px 12px;border:1px solid #d1d5db;border-radius:6px;background:#fff;font-size:14px;cursor:pointer}.overview-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px;margin-bottom:32px}.stat-card{background:#fff;padding:20px;border-radius:8px;border:1px solid #e5e7eb;box-shadow:0 1px 3px #0000000d}.stat-label{font-size:12px;font-weight:600;color:#6b7280;text-transform:uppercase;margin-bottom:8px}.stat-value{font-size:28px;font-weight:700;color:#1f2937;margin-bottom:8px}.stat-value.error{color:#dc2626}.stat-change{font-size:12px;color:#6b7280}.stat-description{font-size:12px;color:#9ca3af;margin-top:4px}.charts-section{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:16px;margin-bottom:32px}.chart-card{background:#fff;padding:20px;border-radius:8px;border:1px solid #e5e7eb;box-shadow:0 1px 3px #0000000d}.chart-card h3{margin-top:0;margin-bottom:16px;color:#1f2937;font-size:16px}.chart-placeholder{height:300px;background:#f9fafb;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#9ca3af}.table-section{margin-bottom:24px}.table-card{background:#fff;padding:20px;border-radius:8px;border:1px solid #e5e7eb;box-shadow:0 1px 3px #0000000d}.table-card h3{margin-top:0;margin-bottom:16px;color:#1f2937;font-size:16px}.data-table{width:100%;border-collapse:collapse;font-size:14px}.data-table thead{background:#f9fafb;border-bottom:1px solid #e5e7eb}.data-table th{padding:12px;text-align:left;font-weight:600;color:#6b7280}.data-table td{padding:12px;border-bottom:1px solid #e5e7eb;color:#374151}.data-table tbody tr:hover{background:#f9fafb}.status-badge{display:inline-block;padding:4px 8px;border-radius:4px;font-weight:600;font-size:12px}.status-200,.status-201,.status-204{background:#dcfce7;color:#15803d}.status-400,.status-401,.status-403,.status-404,.status-405,.status-409{background:#fee2e2;color:#991b1b}.status-422,.status-429{background:#fef08a;color:#854d0e}.status-500,.status-502,.status-503{background:#fee2e2;color:#991b1b}.method-badge{display:inline-block;padding:4px 8px;border-radius:4px;font-weight:600;font-size:12px;color:#fff}.method-GET{background:#10b981}.method-POST{background:#f59e0b}.method-PUT{background:#8b5cf6}.method-DELETE{background:#ef4444}.method-PATCH{background:#0ea5e9}.route-name{font-family:monospace;color:#2563eb;font-weight:500}.duration.slow,.error-rate.high{color:#dc2626;font-weight:600}.error-message{font-family:monospace;font-size:12px;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-container{padding:20px;background:#f8fafc;min-height:100vh}.dashboard-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;background:#fff;padding:20px;border-radius:8px;box-shadow:0 1px 3px #0000001a}.dashboard-header h1{margin:0;font-size:28px;color:#1e293b}.header-actions{display:flex;gap:12px;align-items:center}.btn-refresh{padding:8px 16px;background:#3b82f6;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;transition:all .3s ease}.btn-refresh:hover{background:#2563eb;transform:translateY(-2px);box-shadow:0 4px 12px #3b82f64d}.time-range-select{padding:8px 12px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px;background:#fff;cursor:pointer;transition:all .3s ease}.time-range-select:hover{border-color:#cbd5e1}.time-range-select:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.overview-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin-bottom:30px}.stat-card{background:#fff;padding:20px;border-radius:8px;box-shadow:0 1px 3px #0000001a;transition:all .3s ease}.stat-card:hover{box-shadow:0 4px 12px #00000026;transform:translateY(-2px)}.stat-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.stat-value{font-size:32px;font-weight:700;color:#1e293b;margin-bottom:8px}.stat-value.error{color:#ef4444}.stat-description{font-size:13px;color:#64748b;margin:4px 0}.stat-change{font-size:13px;font-weight:600;color:#64748b;margin-top:4px}.stat-change.positive{color:#10b981}.stat-change.negative{color:#ef4444}.charts-section{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px}.chart-card{background:#fff;padding:20px;border-radius:8px;box-shadow:0 1px 3px #0000001a}.chart-card h3{margin:0 0 15px;font-size:16px;color:#1e293b;font-weight:600}.chart-placeholder{position:relative;height:300px;width:100%}.chart-placeholder canvas{max-height:300px}.table-section{margin-bottom:30px}.table-card{background:#fff;padding:20px;border-radius:8px;box-shadow:0 1px 3px #0000001a}.table-card h3{margin:0 0 15px;font-size:16px;color:#1e293b;font-weight:600}.data-table{width:100%;border-collapse:collapse}.data-table thead{background:#f1f5f9}.data-table th{padding:12px;text-align:left;font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px;border-bottom:2px solid #e2e8f0}.data-table td{padding:12px;border-bottom:1px solid #e2e8f0;font-size:13px;color:#475569}.data-table tbody tr:hover{background:#f8fafc}.status-badge{display:inline-flex;align-items:center;justify-content:center;width:50px;height:30px;border-radius:4px;font-size:12px;font-weight:600;color:#fff}.status-badge.status-200,.status-badge.status-201{background:#10b981}.status-badge.status-400,.status-badge.status-401,.status-badge.status-403,.status-badge.status-404,.status-badge.status-422{background:#f59e0b}.status-badge.status-500,.status-badge.status-503{background:#ef4444}.method-badge{display:inline-flex;align-items:center;justify-content:center;min-width:45px;padding:4px 8px;border-radius:4px;font-size:11px;font-weight:700;color:#fff}.method-badge.method-GET{background:#3b82f6}.method-badge.method-POST{background:#10b981}.method-badge.method-PUT{background:#f59e0b}.method-badge.method-DELETE{background:#ef4444}.method-badge.method-PATCH{background:#8b5cf6}.route-name{font-family:Monaco,Courier New,monospace;font-size:12px;color:#1e293b;font-weight:500}.duration{font-weight:600;color:#1e293b}.duration.slow{color:#ef4444;font-weight:700}.error-rate{font-weight:600}.error-rate.high{color:#ef4444}.error-message{color:#ef4444;font-family:Monaco,Courier New,monospace;font-size:12px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.route-row{transition:background .2s ease}.route-row:hover{background:#f0fdf4}.error-row{background:#fef2f2;transition:background .2s ease}.error-row:hover{background:#fee2e2}@media(max-width:768px){.dashboard-container{padding:12px}.dashboard-header{flex-direction:column;gap:12px;align-items:flex-start}.header-actions{width:100%;flex-wrap:wrap}.overview-grid,.charts-section{grid-template-columns:1fr}.data-table{font-size:12px}.data-table th,.data-table td{padding:8px}}.justify-between{display:flex;justify-content:space-between}.text-truncate{max-width:600px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"
  },
  {
    "path": "public/vendor/api-inspector/js/app.js",
    "content": "function _r(e){const t=Object.create(null);for(const s of e.split(\",\"))t[s]=1;return s=>s in t}const _t={},Ks=[],Le=()=>{},Rc=()=>!1,qi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),yr=e=>e.startsWith(\"onUpdate:\"),Gt=Object.assign,xr=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},sd=Object.prototype.hasOwnProperty,gt=(e,t)=>sd.call(e,t),J=Array.isArray,Gs=e=>Jn(e)===\"[object Map]\",cn=e=>Jn(e)===\"[object Set]\",ra=e=>Jn(e)===\"[object Date]\",st=e=>typeof e==\"function\",It=e=>typeof e==\"string\",Se=e=>typeof e==\"symbol\",yt=e=>e!==null&&typeof e==\"object\",Oc=e=>(yt(e)||st(e))&&st(e.then)&&st(e.catch),Tc=Object.prototype.toString,Jn=e=>Tc.call(e),nd=e=>Jn(e).slice(8,-1),Ec=e=>Jn(e)===\"[object Object]\",vr=e=>It(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,Mn=_r(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),Ui=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},id=/-\\w/g,xe=Ui(e=>e.replace(id,t=>t.slice(1).toUpperCase())),od=/\\B([A-Z])/g,ys=Ui(e=>e.replace(od,\"-$1\").toLowerCase()),Ki=Ui(e=>e.charAt(0).toUpperCase()+e.slice(1)),mo=Ui(e=>e?`on${Ki(e)}`:\"\"),ps=(e,t)=>!Object.is(e,t),vi=(e,...t)=>{for(let s=0;s<e.length;s++)e[s](...t)},Dc=(e,t,s,n=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Gi=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let aa;const Yi=()=>aa||(aa=typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:typeof global<\"u\"?global:{});function wr(e){if(J(e)){const t={};for(let s=0;s<e.length;s++){const n=e[s],i=It(n)?cd(n):wr(n);if(i)for(const o in i)t[o]=i[o]}return t}else if(It(e)||yt(e))return e}const rd=/;(?![^(]*\\))/g,ad=/:([^]+)/,ld=/\\/\\*[^]*?\\*\\//g;function cd(e){const t={};return e.replace(ld,\"\").split(rd).forEach(s=>{if(s){const n=s.split(ad);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function kt(e){let t=\"\";if(It(e))t=e;else if(J(e))for(let s=0;s<e.length;s++){const n=kt(e[s]);n&&(t+=n+\" \")}else if(yt(e))for(const s in e)e[s]&&(t+=s+\" \");return t.trim()}const ud=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",hd=_r(ud);function Ic(e){return!!e||e===\"\"}function dd(e,t){if(e.length!==t.length)return!1;let s=!0;for(let n=0;s&&n<e.length;n++)s=Bs(e[n],t[n]);return s}function Bs(e,t){if(e===t)return!0;let s=ra(e),n=ra(t);if(s||n)return s&&n?e.getTime()===t.getTime():!1;if(s=Se(e),n=Se(t),s||n)return e===t;if(s=J(e),n=J(t),s||n)return s&&n?dd(e,t):!1;if(s=yt(e),n=yt(t),s||n){if(!s||!n)return!1;const i=Object.keys(e).length,o=Object.keys(t).length;if(i!==o)return!1;for(const r in e){const a=e.hasOwnProperty(r),l=t.hasOwnProperty(r);if(a&&!l||!a&&l||!Bs(e[r],t[r]))return!1}}return String(e)===String(t)}function Sr(e,t){return e.findIndex(s=>Bs(s,t))}const Lc=e=>!!(e&&e.__v_isRef===!0),H=e=>It(e)?e:e==null?\"\":J(e)||yt(e)&&(e.toString===Tc||!st(e.toString))?Lc(e)?H(e.value):JSON.stringify(e,Fc,2):String(e),Fc=(e,t)=>Lc(t)?Fc(e,t.value):Gs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,i],o)=>(s[bo(n,o)+\" =>\"]=i,s),{})}:cn(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>bo(s))}:Se(t)?bo(t):yt(t)&&!J(t)&&!Ec(t)?String(t):t,bo=(e,t=\"\")=>{var s;return Se(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let le;class fd{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=le,!t&&le&&(this.index=(le.scopes||(le.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t<s;t++)this.scopes[t].pause();for(t=0,s=this.effects.length;t<s;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t<s;t++)this.scopes[t].resume();for(t=0,s=this.effects.length;t<s;t++)this.effects[t].resume()}}run(t){if(this._active){const s=le;try{return le=this,t()}finally{le=s}}}on(){++this._on===1&&(this.prevScope=le,le=this)}off(){this._on>0&&--this._on===0&&(le=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s<n;s++)this.effects[s].stop();for(this.effects.length=0,s=0,n=this.cleanups.length;s<n;s++)this.cleanups[s]();if(this.cleanups.length=0,this.scopes){for(s=0,n=this.scopes.length;s<n;s++)this.scopes[s].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const i=this.parent.scopes.pop();i&&i!==this&&(this.parent.scopes[this.index]=i,i.index=this.index)}this.parent=void 0}}}function pd(){return le}let wt;const _o=new WeakSet;class Nc{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,le&&le.active&&le.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,_o.has(this)&&(_o.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||$c(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,la(this),Vc(this);const t=wt,s=we;wt=this,we=!0;try{return this.fn()}finally{jc(this),wt=t,we=s,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Cr(t);this.deps=this.depsTail=void 0,la(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?_o.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Wo(this)&&this.run()}get dirty(){return Wo(this)}}let Bc=0,Cn,Pn;function $c(e,t=!1){if(e.flags|=8,t){e.next=Pn,Pn=e;return}e.next=Cn,Cn=e}function kr(){Bc++}function Mr(){if(--Bc>0)return;if(Pn){let t=Pn;for(Pn=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Cn;){let t=Cn;for(Cn=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Vc(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function jc(e){let t,s=e.depsTail,n=s;for(;n;){const i=n.prevDep;n.version===-1?(n===s&&(s=i),Cr(n),gd(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=s}function Wo(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Hc(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Hc(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Nn)||(e.globalVersion=Nn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Wo(e))))return;e.flags|=2;const t=e.dep,s=wt,n=we;wt=e,we=!0;try{Vc(e);const i=e.fn(e._value);(t.version===0||ps(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{wt=s,we=n,jc(e),e.flags&=-3}}function Cr(e,t=!1){const{dep:s,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)Cr(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function gd(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let we=!0;const zc=[];function Ze(){zc.push(we),we=!1}function ts(){const e=zc.pop();we=e===void 0?!0:e}function la(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=wt;wt=void 0;try{t()}finally{wt=s}}}let Nn=0;class md{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Pr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!wt||!we||wt===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==wt)s=this.activeLink=new md(wt,this),wt.deps?(s.prevDep=wt.depsTail,wt.depsTail.nextDep=s,wt.depsTail=s):wt.deps=wt.depsTail=s,Wc(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=wt.depsTail,s.nextDep=void 0,wt.depsTail.nextDep=s,wt.depsTail=s,wt.deps===s&&(wt.deps=n)}return s}trigger(t){this.version++,Nn++,this.notify(t)}notify(t){kr();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Mr()}}}function Wc(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Wc(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const qo=new WeakMap,Ds=Symbol(\"\"),Uo=Symbol(\"\"),Bn=Symbol(\"\");function zt(e,t,s){if(we&&wt){let n=qo.get(e);n||qo.set(e,n=new Map);let i=n.get(s);i||(n.set(s,i=new Pr),i.map=n,i.key=s),i.track()}}function qe(e,t,s,n,i,o){const r=qo.get(e);if(!r){Nn++;return}const a=l=>{l&&l.trigger()};if(kr(),t===\"clear\")r.forEach(a);else{const l=J(e),c=l&&vr(s);if(l&&s===\"length\"){const u=Number(n);r.forEach((h,d)=>{(d===\"length\"||d===Bn||!Se(d)&&d>=u)&&a(h)})}else switch((s!==void 0||r.has(void 0))&&a(r.get(s)),c&&a(r.get(Bn)),t){case\"add\":l?c&&a(r.get(\"length\")):(a(r.get(Ds)),Gs(e)&&a(r.get(Uo)));break;case\"delete\":l||(a(r.get(Ds)),Gs(e)&&a(r.get(Uo)));break;case\"set\":Gs(e)&&a(r.get(Ds));break}}Mr()}function Hs(e){const t=pt(e);return t===e?t:(zt(t,\"iterate\",Bn),be(e)?t:t.map(ke))}function Xi(e){return zt(e=pt(e),\"iterate\",Bn),e}function rs(e,t){return es(e)?Is(e)?tn(ke(t)):tn(t):ke(t)}const bd={__proto__:null,[Symbol.iterator](){return yo(this,Symbol.iterator,e=>rs(this,e))},concat(...e){return Hs(this).concat(...e.map(t=>J(t)?Hs(t):t))},entries(){return yo(this,\"entries\",e=>(e[1]=rs(this,e[1]),e))},every(e,t){return Be(this,\"every\",e,t,void 0,arguments)},filter(e,t){return Be(this,\"filter\",e,t,s=>s.map(n=>rs(this,n)),arguments)},find(e,t){return Be(this,\"find\",e,t,s=>rs(this,s),arguments)},findIndex(e,t){return Be(this,\"findIndex\",e,t,void 0,arguments)},findLast(e,t){return Be(this,\"findLast\",e,t,s=>rs(this,s),arguments)},findLastIndex(e,t){return Be(this,\"findLastIndex\",e,t,void 0,arguments)},forEach(e,t){return Be(this,\"forEach\",e,t,void 0,arguments)},includes(...e){return xo(this,\"includes\",e)},indexOf(...e){return xo(this,\"indexOf\",e)},join(e){return Hs(this).join(e)},lastIndexOf(...e){return xo(this,\"lastIndexOf\",e)},map(e,t){return Be(this,\"map\",e,t,void 0,arguments)},pop(){return hn(this,\"pop\")},push(...e){return hn(this,\"push\",e)},reduce(e,...t){return ca(this,\"reduce\",e,t)},reduceRight(e,...t){return ca(this,\"reduceRight\",e,t)},shift(){return hn(this,\"shift\")},some(e,t){return Be(this,\"some\",e,t,void 0,arguments)},splice(...e){return hn(this,\"splice\",e)},toReversed(){return Hs(this).toReversed()},toSorted(e){return Hs(this).toSorted(e)},toSpliced(...e){return Hs(this).toSpliced(...e)},unshift(...e){return hn(this,\"unshift\",e)},values(){return yo(this,\"values\",e=>rs(this,e))}};function yo(e,t,s){const n=Xi(e),i=n[t]();return n!==e&&!be(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.done||(o.value=s(o.value)),o}),i}const _d=Array.prototype;function Be(e,t,s,n,i,o){const r=Xi(e),a=r!==e&&!be(e),l=r[t];if(l!==_d[t]){const h=l.apply(e,o);return a?ke(h):h}let c=s;r!==e&&(a?c=function(h,d){return s.call(this,rs(e,h),d,e)}:s.length>2&&(c=function(h,d){return s.call(this,h,d,e)}));const u=l.call(r,c,n);return a&&i?i(u):u}function ca(e,t,s,n){const i=Xi(e);let o=s;return i!==e&&(be(e)?s.length>3&&(o=function(r,a,l){return s.call(this,r,a,l,e)}):o=function(r,a,l){return s.call(this,r,rs(e,a),l,e)}),i[t](o,...n)}function xo(e,t,s){const n=pt(e);zt(n,\"iterate\",Bn);const i=n[t](...s);return(i===-1||i===!1)&&Or(s[0])?(s[0]=pt(s[0]),n[t](...s)):i}function hn(e,t,s=[]){Ze(),kr();const n=pt(e)[t].apply(e,s);return Mr(),ts(),n}const yd=_r(\"__proto__,__v_isRef,__isVue\"),qc=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==\"arguments\"&&e!==\"caller\").map(e=>Symbol[e]).filter(Se));function xd(e){Se(e)||(e=String(e));const t=pt(this);return zt(t,\"has\",e),t.hasOwnProperty(e)}class Uc{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s===\"__v_skip\")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(s===\"__v_isReactive\")return!i;if(s===\"__v_isReadonly\")return i;if(s===\"__v_isShallow\")return o;if(s===\"__v_raw\")return n===(i?o?Od:Xc:o?Yc:Gc).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=J(t);if(!i){let l;if(r&&(l=bd[s]))return l;if(s===\"hasOwnProperty\")return xd}const a=Reflect.get(t,s,Kt(t)?t:n);if((Se(s)?qc.has(s):yd(s))||(i||zt(t,\"get\",s),o))return a;if(Kt(a)){const l=r&&vr(s)?a:a.value;return i&&yt(l)?Go(l):l}return yt(a)?i?Go(a):Zs(a):a}}class Kc extends Uc{constructor(t=!1){super(!1,t)}set(t,s,n,i){let o=t[s];const r=J(t)&&vr(s);if(!this._isShallow){const c=es(o);if(!be(n)&&!es(n)&&(o=pt(o),n=pt(n)),!r&&Kt(o)&&!Kt(n))return c||(o.value=n),!0}const a=r?Number(s)<t.length:gt(t,s),l=Reflect.set(t,s,n,Kt(t)?t:i);return t===pt(i)&&(a?ps(n,o)&&qe(t,\"set\",s,n):qe(t,\"add\",s,n)),l}deleteProperty(t,s){const n=gt(t,s);t[s];const i=Reflect.deleteProperty(t,s);return i&&n&&qe(t,\"delete\",s,void 0),i}has(t,s){const n=Reflect.has(t,s);return(!Se(s)||!qc.has(s))&&zt(t,\"has\",s),n}ownKeys(t){return zt(t,\"iterate\",J(t)?\"length\":Ds),Reflect.ownKeys(t)}}class vd extends Uc{constructor(t=!1){super(!0,t)}set(t,s){return!0}deleteProperty(t,s){return!0}}const wd=new Kc,Sd=new vd,kd=new Kc(!0);const Ko=e=>e,si=e=>Reflect.getPrototypeOf(e);function Md(e,t,s){return function(...n){const i=this.__v_raw,o=pt(i),r=Gs(o),a=e===\"entries\"||e===Symbol.iterator&&r,l=e===\"keys\"&&r,c=i[e](...n),u=s?Ko:t?tn:ke;return!t&&zt(o,\"iterate\",l?Uo:Ds),{next(){const{value:h,done:d}=c.next();return d?{value:h,done:d}:{value:a?[u(h[0]),u(h[1])]:u(h),done:d}},[Symbol.iterator](){return this}}}}function ni(e){return function(...t){return e===\"delete\"?!1:e===\"clear\"?void 0:this}}function Cd(e,t){const s={get(i){const o=this.__v_raw,r=pt(o),a=pt(i);e||(ps(i,a)&&zt(r,\"get\",i),zt(r,\"get\",a));const{has:l}=si(r),c=t?Ko:e?tn:ke;if(l.call(r,i))return c(o.get(i));if(l.call(r,a))return c(o.get(a));o!==r&&o.get(i)},get size(){const i=this.__v_raw;return!e&&zt(pt(i),\"iterate\",Ds),i.size},has(i){const o=this.__v_raw,r=pt(o),a=pt(i);return e||(ps(i,a)&&zt(r,\"has\",i),zt(r,\"has\",a)),i===a?o.has(i):o.has(i)||o.has(a)},forEach(i,o){const r=this,a=r.__v_raw,l=pt(a),c=t?Ko:e?tn:ke;return!e&&zt(l,\"iterate\",Ds),a.forEach((u,h)=>i.call(o,c(u),c(h),r))}};return Gt(s,e?{add:ni(\"add\"),set:ni(\"set\"),delete:ni(\"delete\"),clear:ni(\"clear\")}:{add(i){!t&&!be(i)&&!es(i)&&(i=pt(i));const o=pt(this);return si(o).has.call(o,i)||(o.add(i),qe(o,\"add\",i,i)),this},set(i,o){!t&&!be(o)&&!es(o)&&(o=pt(o));const r=pt(this),{has:a,get:l}=si(r);let c=a.call(r,i);c||(i=pt(i),c=a.call(r,i));const u=l.call(r,i);return r.set(i,o),c?ps(o,u)&&qe(r,\"set\",i,o):qe(r,\"add\",i,o),this},delete(i){const o=pt(this),{has:r,get:a}=si(o);let l=r.call(o,i);l||(i=pt(i),l=r.call(o,i)),a&&a.call(o,i);const c=o.delete(i);return l&&qe(o,\"delete\",i,void 0),c},clear(){const i=pt(this),o=i.size!==0,r=i.clear();return o&&qe(i,\"clear\",void 0,void 0),r}}),[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(i=>{s[i]=Md(i,e,t)}),s}function Ar(e,t){const s=Cd(e,t);return(n,i,o)=>i===\"__v_isReactive\"?!e:i===\"__v_isReadonly\"?e:i===\"__v_raw\"?n:Reflect.get(gt(s,i)&&i in n?s:n,i,o)}const Pd={get:Ar(!1,!1)},Ad={get:Ar(!1,!0)},Rd={get:Ar(!0,!1)};const Gc=new WeakMap,Yc=new WeakMap,Xc=new WeakMap,Od=new WeakMap;function Td(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function Ed(e){return e.__v_skip||!Object.isExtensible(e)?0:Td(nd(e))}function Zs(e){return es(e)?e:Rr(e,!1,wd,Pd,Gc)}function Jc(e){return Rr(e,!1,kd,Ad,Yc)}function Go(e){return Rr(e,!0,Sd,Rd,Xc)}function Rr(e,t,s,n,i){if(!yt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=Ed(e);if(o===0)return e;const r=i.get(e);if(r)return r;const a=new Proxy(e,o===2?n:s);return i.set(e,a),a}function Is(e){return es(e)?Is(e.__v_raw):!!(e&&e.__v_isReactive)}function es(e){return!!(e&&e.__v_isReadonly)}function be(e){return!!(e&&e.__v_isShallow)}function Or(e){return e?!!e.__v_raw:!1}function pt(e){const t=e&&e.__v_raw;return t?pt(t):e}function Dd(e){return!gt(e,\"__v_skip\")&&Object.isExtensible(e)&&Dc(e,\"__v_skip\",!0),e}const ke=e=>yt(e)?Zs(e):e,tn=e=>yt(e)?Go(e):e;function Kt(e){return e?e.__v_isRef===!0:!1}function et(e){return Qc(e,!1)}function Id(e){return Qc(e,!0)}function Qc(e,t){return Kt(e)?e:new Ld(e,t)}class Ld{constructor(t,s){this.dep=new Pr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:pt(t),this._value=s?t:ke(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||be(t)||es(t);t=n?t:pt(t),ps(t,s)&&(this._rawValue=t,this._value=n?t:ke(t),this.dep.trigger())}}function _e(e){return Kt(e)?e.value:e}const Fd={get:(e,t,s)=>t===\"__v_raw\"?e:_e(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const i=e[t];return Kt(i)&&!Kt(s)?(i.value=s,!0):Reflect.set(e,t,s,n)}};function Zc(e){return Is(e)?e:new Proxy(e,Fd)}class Nd{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Pr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Nn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&wt!==this)return $c(this,!0),!0}get value(){const t=this.dep.track();return Hc(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Bd(e,t,s=!1){let n,i;return st(e)?n=e:(n=e.get,i=e.set),new Nd(n,i,s)}const ii={},Ri=new WeakMap;let As;function $d(e,t=!1,s=As){if(s){let n=Ri.get(s);n||Ri.set(s,n=[]),n.push(e)}}function Vd(e,t,s=_t){const{immediate:n,deep:i,once:o,scheduler:r,augmentJob:a,call:l}=s,c=S=>i?S:be(S)||i===!1||i===0?Ue(S,1):Ue(S);let u,h,d,f,p=!1,g=!1;if(Kt(e)?(h=()=>e.value,p=be(e)):Is(e)?(h=()=>c(e),p=!0):J(e)?(g=!0,p=e.some(S=>Is(S)||be(S)),h=()=>e.map(S=>{if(Kt(S))return S.value;if(Is(S))return c(S);if(st(S))return l?l(S,2):S()})):st(e)?t?h=l?()=>l(e,2):e:h=()=>{if(d){Ze();try{d()}finally{ts()}}const S=As;As=u;try{return l?l(e,3,[f]):e(f)}finally{As=S}}:h=Le,t&&i){const S=h,w=i===!0?1/0:i;h=()=>Ue(S(),w)}const _=pd(),b=()=>{u.stop(),_&&_.active&&xr(_.effects,u)};if(o&&t){const S=t;t=(...w)=>{S(...w),b()}}let v=g?new Array(e.length).fill(ii):ii;const M=S=>{if(!(!(u.flags&1)||!u.dirty&&!S))if(t){const w=u.run();if(i||p||(g?w.some((R,k)=>ps(R,v[k])):ps(w,v))){d&&d();const R=As;As=u;try{const k=[w,v===ii?void 0:g&&v[0]===ii?[]:v,f];v=w,l?l(t,3,k):t(...k)}finally{As=R}}}else u.run()};return a&&a(M),u=new Nc(h),u.scheduler=r?()=>r(M,!1):M,f=S=>$d(S,!1,u),d=u.onStop=()=>{const S=Ri.get(u);if(S){if(l)l(S,4);else for(const w of S)w();Ri.delete(u)}},t?n?M(!0):v=u.run():r?r(M.bind(null,!0),!0):u.run(),b.pause=u.pause.bind(u),b.resume=u.resume.bind(u),b.stop=b,b}function Ue(e,t=1/0,s){if(t<=0||!yt(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Kt(e))Ue(e.value,t,s);else if(J(e))for(let n=0;n<e.length;n++)Ue(e[n],t,s);else if(cn(e)||Gs(e))e.forEach(n=>{Ue(n,t,s)});else if(Ec(e)){for(const n in e)Ue(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&Ue(e[n],t,s)}return e}function Qn(e,t,s,n){try{return n?e(...n):e()}catch(i){Ji(i,t,s)}}function Ne(e,t,s,n){if(st(e)){const i=Qn(e,t,s,n);return i&&Oc(i)&&i.catch(o=>{Ji(o,t,s)}),i}if(J(e)){const i=[];for(let o=0;o<e.length;o++)i.push(Ne(e[o],t,s,n));return i}}function Ji(e,t,s,n=!0){const i=t?t.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:r}=t&&t.appContext.config||_t;if(t){let a=t.parent;const l=t.proxy,c=`https://vuejs.org/error-reference/#runtime-${s}`;for(;a;){const u=a.ec;if(u){for(let h=0;h<u.length;h++)if(u[h](e,l,c)===!1)return}a=a.parent}if(o){Ze(),Qn(o,null,10,[e,l,c]),ts();return}}jd(e,s,i,n,r)}function jd(e,t,s,n=!0,i=!1){if(i)throw e;console.error(e)}const ee=[];let Te=-1;const Ys=[];let as=null,qs=0;const tu=Promise.resolve();let Oi=null;function Qi(e){const t=Oi||tu;return e?t.then(this?e.bind(this):e):t}function Hd(e){let t=Te+1,s=ee.length;for(;t<s;){const n=t+s>>>1,i=ee[n],o=$n(i);o<e||o===e&&i.flags&2?t=n+1:s=n}return t}function Tr(e){if(!(e.flags&1)){const t=$n(e),s=ee[ee.length-1];!s||!(e.flags&2)&&t>=$n(s)?ee.push(e):ee.splice(Hd(t),0,e),e.flags|=1,eu()}}function eu(){Oi||(Oi=tu.then(nu))}function zd(e){J(e)?Ys.push(...e):as&&e.id===-1?as.splice(qs+1,0,e):e.flags&1||(Ys.push(e),e.flags|=1),eu()}function ua(e,t,s=Te+1){for(;s<ee.length;s++){const n=ee[s];if(n&&n.flags&2){if(e&&n.id!==e.uid)continue;ee.splice(s,1),s--,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function su(e){if(Ys.length){const t=[...new Set(Ys)].sort((s,n)=>$n(s)-$n(n));if(Ys.length=0,as){as.push(...t);return}for(as=t,qs=0;qs<as.length;qs++){const s=as[qs];s.flags&4&&(s.flags&=-2),s.flags&8||s(),s.flags&=-2}as=null,qs=0}}const $n=e=>e.id==null?e.flags&2?-1:1/0:e.id;function nu(e){try{for(Te=0;Te<ee.length;Te++){const t=ee[Te];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Qn(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Te<ee.length;Te++){const t=ee[Te];t&&(t.flags&=-2)}Te=-1,ee.length=0,su(),Oi=null,(ee.length||Ys.length)&&nu()}}let $t=null,iu=null;function Ti(e){const t=$t;return $t=e,iu=e&&e.type.__scopeId||null,t}function Er(e,t=$t,s){if(!t||e._n)return e;const n=(...i)=>{n._d&&Ii(-1);const o=Ti(t);let r;try{r=e(...i)}finally{Ti(o),n._d&&Ii(1)}return r};return n._n=!0,n._c=!0,n._d=!0,n}function se(e,t){if($t===null)return e;const s=no($t),n=e.dirs||(e.dirs=[]);for(let i=0;i<t.length;i++){let[o,r,a,l=_t]=t[i];o&&(st(o)&&(o={mounted:o,updated:o}),o.deep&&Ue(r),n.push({dir:o,instance:s,value:r,oldValue:void 0,arg:a,modifiers:l}))}return e}function ws(e,t,s,n){const i=e.dirs,o=t&&t.dirs;for(let r=0;r<i.length;r++){const a=i[r];o&&(a.oldValue=o[r].value);let l=a.dir[n];l&&(Ze(),Ne(l,s,8,[e.el,a,e,t]),ts())}}function wi(e,t){if(Wt){let s=Wt.provides;const n=Wt.parent&&Wt.parent.provides;n===s&&(s=Wt.provides=Object.create(n)),s[e]=t}}function Je(e,t,s=!1){const n=Uf();if(n||Js){let i=Js?Js._context.provides:n?n.parent==null||n.ce?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return s&&st(t)?t.call(n&&n.proxy):t}}const Wd=Symbol.for(\"v-scx\"),qd=()=>Je(Wd);function Qe(e,t,s){return ou(e,t,s)}function ou(e,t,s=_t){const{immediate:n,deep:i,flush:o,once:r}=s,a=Gt({},s),l=t&&n||!t&&o!==\"post\";let c;if(Hn){if(o===\"sync\"){const f=qd();c=f.__watcherHandles||(f.__watcherHandles=[])}else if(!l){const f=()=>{};return f.stop=Le,f.resume=Le,f.pause=Le,f}}const u=Wt;a.call=(f,p,g)=>Ne(f,u,p,g);let h=!1;o===\"post\"?a.scheduler=f=>{Zt(f,u&&u.suspense)}:o!==\"sync\"&&(h=!0,a.scheduler=(f,p)=>{p?f():Tr(f)}),a.augmentJob=f=>{t&&(f.flags|=4),h&&(f.flags|=2,u&&(f.id=u.uid,f.i=u))};const d=Vd(e,t,a);return Hn&&(c?c.push(d):l&&d()),d}function Ud(e,t,s){const n=this.proxy,i=It(e)?e.includes(\".\")?ru(n,e):()=>n[e]:e.bind(n,n);let o;st(t)?o=t:(o=t.handler,s=t);const r=Zn(this),a=ou(i,o.bind(n),s);return r(),a}function ru(e,t){const s=t.split(\".\");return()=>{let n=e;for(let i=0;i<s.length&&n;i++)n=n[s[i]];return n}}const au=Symbol(\"_vte\"),Kd=e=>e.__isTeleport,An=e=>e&&(e.disabled||e.disabled===\"\"),ha=e=>e&&(e.defer||e.defer===\"\"),da=e=>typeof SVGElement<\"u\"&&e instanceof SVGElement,fa=e=>typeof MathMLElement==\"function\"&&e instanceof MathMLElement,Yo=(e,t)=>{const s=e&&e.to;return It(s)?t?t(s):null:s},lu={name:\"Teleport\",__isTeleport:!0,process(e,t,s,n,i,o,r,a,l,c){const{mc:u,pc:h,pbc:d,o:{insert:f,querySelector:p,createText:g,createComment:_}}=c,b=An(t.props);let{shapeFlag:v,children:M,dynamicChildren:S}=t;if(e==null){const w=t.el=g(\"\"),R=t.anchor=g(\"\");f(w,s,n),f(R,s,n);const k=(C,O)=>{v&16&&u(M,C,O,i,o,r,a,l)},P=()=>{const C=t.target=Yo(t.props,p),O=cu(C,t,g,f);C&&(r!==\"svg\"&&da(C)?r=\"svg\":r!==\"mathml\"&&fa(C)&&(r=\"mathml\"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(C),b||(k(C,O),Si(t,!1)))};b&&(k(s,R),Si(t,!0)),ha(t.props)?(t.el.__isMounted=!1,Zt(()=>{P(),delete t.el.__isMounted},o)):P()}else{if(ha(t.props)&&e.el.__isMounted===!1){Zt(()=>{lu.process(e,t,s,n,i,o,r,a,l,c)},o);return}t.el=e.el,t.targetStart=e.targetStart;const w=t.anchor=e.anchor,R=t.target=e.target,k=t.targetAnchor=e.targetAnchor,P=An(e.props),C=P?s:R,O=P?w:k;if(r===\"svg\"||da(R)?r=\"svg\":(r===\"mathml\"||fa(R))&&(r=\"mathml\"),S?(d(e.dynamicChildren,S,C,i,o,r,a),Fr(e,t,!0)):l||h(e,t,C,O,i,o,r,a,!1),b)P?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):oi(t,s,w,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const B=t.target=Yo(t.props,p);B&&oi(t,B,null,c,0)}else P&&oi(t,R,k,c,1);Si(t,b)}},remove(e,t,s,{um:n,o:{remove:i}},o){const{shapeFlag:r,children:a,anchor:l,targetStart:c,targetAnchor:u,target:h,props:d}=e;if(h&&(i(c),i(u)),o&&i(l),r&16){const f=o||!An(d);for(let p=0;p<a.length;p++){const g=a[p];n(g,t,s,f,!!g.dynamicChildren)}}},move:oi,hydrate:Gd};function oi(e,t,s,{o:{insert:n},m:i},o=2){o===0&&n(e.targetAnchor,t,s);const{el:r,anchor:a,shapeFlag:l,children:c,props:u}=e,h=o===2;if(h&&n(r,t,s),(!h||An(u))&&l&16)for(let d=0;d<c.length;d++)i(c[d],t,s,2);h&&n(a,t,s)}function Gd(e,t,s,n,i,o,{o:{nextSibling:r,parentNode:a,querySelector:l,insert:c,createText:u}},h){function d(g,_,b,v){_.anchor=h(r(g),_,a(g),s,n,i,o),_.targetStart=b,_.targetAnchor=v}const f=t.target=Yo(t.props,l),p=An(t.props);if(f){const g=f._lpa||f.firstChild;if(t.shapeFlag&16)if(p)d(e,t,g,g&&r(g));else{t.anchor=r(e);let _=g;for(;_;){if(_&&_.nodeType===8){if(_.data===\"teleport start anchor\")t.targetStart=_;else if(_.data===\"teleport anchor\"){t.targetAnchor=_,f._lpa=t.targetAnchor&&r(t.targetAnchor);break}}_=r(_)}t.targetAnchor||cu(f,t,u,c),h(g&&r(g),t,f,s,n,i,o)}Si(t,p)}else p&&t.shapeFlag&16&&d(e,t,e,r(e));return t.anchor&&r(t.anchor)}const Yd=lu;function Si(e,t){const s=e.ctx;if(s&&s.ut){let n,i;for(t?(n=e.el,i=e.anchor):(n=e.targetStart,i=e.targetAnchor);n&&n!==i;)n.nodeType===1&&n.setAttribute(\"data-v-owner\",s.uid),n=n.nextSibling;s.ut()}}function cu(e,t,s,n){const i=t.targetStart=s(\"\"),o=t.targetAnchor=s(\"\");return i[au]=o,e&&(n(i,e),n(o,e)),o}const Xd=Symbol(\"_leaveCb\");function Dr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Dr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function uu(e,t){return st(e)?Gt({name:e.name},t,{setup:e}):e}function hu(e){e.ids=[e.ids[0]+e.ids[2]+++\"-\",0,0]}const Ei=new WeakMap;function Rn(e,t,s,n,i=!1){if(J(e)){e.forEach((p,g)=>Rn(p,t&&(J(t)?t[g]:t),s,n,i));return}if(Xs(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Rn(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?no(n.component):n.el,r=i?null:o,{i:a,r:l}=e,c=t&&t.r,u=a.refs===_t?a.refs={}:a.refs,h=a.setupState,d=pt(h),f=h===_t?Rc:p=>gt(d,p);if(c!=null&&c!==l){if(pa(t),It(c))u[c]=null,f(c)&&(h[c]=null);else if(Kt(c)){c.value=null;const p=t;p.k&&(u[p.k]=null)}}if(st(l))Qn(l,a,12,[r,u]);else{const p=It(l),g=Kt(l);if(p||g){const _=()=>{if(e.f){const b=p?f(l)?h[l]:u[l]:l.value;if(i)J(b)&&xr(b,o);else if(J(b))b.includes(o)||b.push(o);else if(p)u[l]=[o],f(l)&&(h[l]=u[l]);else{const v=[o];l.value=v,e.k&&(u[e.k]=v)}}else p?(u[l]=r,f(l)&&(h[l]=r)):g&&(l.value=r,e.k&&(u[e.k]=r))};if(r){const b=()=>{_(),Ei.delete(e)};b.id=-1,Ei.set(e,b),Zt(b,s)}else pa(e),_()}}}function pa(e){const t=Ei.get(e);t&&(t.flags|=8,Ei.delete(e))}Yi().requestIdleCallback;Yi().cancelIdleCallback;const Xs=e=>!!e.type.__asyncLoader,du=e=>e.type.__isKeepAlive;function Jd(e,t){fu(e,\"a\",t)}function Qd(e,t){fu(e,\"da\",t)}function fu(e,t,s=Wt){const n=e.__wdc||(e.__wdc=()=>{let i=s;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Zi(t,n,s),s){let i=s.parent;for(;i&&i.parent;)du(i.parent.vnode)&&Zd(n,t,s,i),i=i.parent}}function Zd(e,t,s,n){const i=Zi(t,e,n,!0);pu(()=>{xr(n[t],i)},s)}function Zi(e,t,s=Wt,n=!1){if(s){const i=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...r)=>{Ze();const a=Zn(s),l=Ne(t,s,e,r);return a(),ts(),l});return n?i.unshift(o):i.push(o),o}}const ns=e=>(t,s=Wt)=>{(!Hn||e===\"sp\")&&Zi(e,(...n)=>t(...n),s)},tf=ns(\"bm\"),to=ns(\"m\"),ef=ns(\"bu\"),sf=ns(\"u\"),nf=ns(\"bum\"),pu=ns(\"um\"),of=ns(\"sp\"),rf=ns(\"rtg\"),af=ns(\"rtc\");function lf(e,t=Wt){Zi(\"ec\",e,t)}const cf=\"components\";function Xo(e,t){return hf(cf,e,!0,t)||e}const uf=Symbol.for(\"v-ndc\");function hf(e,t,s=!0,n=!1){const i=$t||Wt;if(i){const o=i.type;{const a=Jf(o,!1);if(a&&(a===t||a===xe(t)||a===Ki(xe(t))))return o}const r=ga(i[e]||o[e],t)||ga(i.appContext[e],t);return!r&&n?o:r}}function ga(e,t){return e&&(e[t]||e[xe(t)]||e[Ki(xe(t))])}function Vt(e,t,s,n){let i;const o=s,r=J(e);if(r||It(e)){const a=r&&Is(e);let l=!1,c=!1;a&&(l=!be(e),c=es(e),e=Xi(e)),i=new Array(e.length);for(let u=0,h=e.length;u<h;u++)i[u]=t(l?c?tn(ke(e[u])):ke(e[u]):e[u],u,void 0,o)}else if(typeof e==\"number\"){i=new Array(e);for(let a=0;a<e;a++)i[a]=t(a+1,a,void 0,o)}else if(yt(e))if(e[Symbol.iterator])i=Array.from(e,(a,l)=>t(a,l,void 0,o));else{const a=Object.keys(e);i=new Array(a.length);for(let l=0,c=a.length;l<c;l++){const u=a[l];i[l]=t(e[u],u,l,o)}}else i=[];return i}function df(e,t,s={},n,i){if($t.ce||$t.parent&&Xs($t.parent)&&$t.parent.ce){const c=Object.keys(s).length>0;return L(),Ie(ut,null,[Pt(\"slot\",s,n)],c?-2:64)}let o=e[t];o&&o._c&&(o._d=!1),L();const r=o&&gu(o(s)),a=s.key||r&&r.key,l=Ie(ut,{key:(a&&!Se(a)?a:`_${t}`)+(!r&&n?\"_fb\":\"\")},r||[],r&&e._===1?64:-2);return o&&o._c&&(o._d=!0),l}function gu(e){return e.some(t=>jn(t)?!(t.type===ss||t.type===ut&&!gu(t.children)):!0)?e:null}const Jo=e=>e?Du(e)?no(e):Jo(e.parent):null,On=Gt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Jo(e.parent),$root:e=>Jo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>bu(e),$forceUpdate:e=>e.f||(e.f=()=>{Tr(e.update)}),$nextTick:e=>e.n||(e.n=Qi.bind(e.proxy)),$watch:e=>Ud.bind(e)}),vo=(e,t)=>e!==_t&&!e.__isScriptSetup&&gt(e,t),ff={get({_:e},t){if(t===\"__v_skip\")return!0;const{ctx:s,setupState:n,data:i,props:o,accessCache:r,type:a,appContext:l}=e;if(t[0]!==\"$\"){const d=r[t];if(d!==void 0)switch(d){case 1:return n[t];case 2:return i[t];case 4:return s[t];case 3:return o[t]}else{if(vo(n,t))return r[t]=1,n[t];if(i!==_t&&gt(i,t))return r[t]=2,i[t];if(gt(o,t))return r[t]=3,o[t];if(s!==_t&&gt(s,t))return r[t]=4,s[t];Qo&&(r[t]=0)}}const c=On[t];let u,h;if(c)return t===\"$attrs\"&&zt(e.attrs,\"get\",\"\"),c(e);if((u=a.__cssModules)&&(u=u[t]))return u;if(s!==_t&&gt(s,t))return r[t]=4,s[t];if(h=l.config.globalProperties,gt(h,t))return h[t]},set({_:e},t,s){const{data:n,setupState:i,ctx:o}=e;return vo(i,t)?(i[t]=s,!0):n!==_t&&gt(n,t)?(n[t]=s,!0):gt(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:i,props:o,type:r}},a){let l;return!!(s[a]||e!==_t&&a[0]!==\"$\"&&gt(e,a)||vo(t,a)||gt(o,a)||gt(n,a)||gt(On,a)||gt(i.config.globalProperties,a)||(l=r.__cssModules)&&l[a])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:gt(s,\"value\")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function ma(e){return J(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let Qo=!0;function pf(e){const t=bu(e),s=e.proxy,n=e.ctx;Qo=!1,t.beforeCreate&&ba(t.beforeCreate,e,\"bc\");const{data:i,computed:o,methods:r,watch:a,provide:l,inject:c,created:u,beforeMount:h,mounted:d,beforeUpdate:f,updated:p,activated:g,deactivated:_,beforeDestroy:b,beforeUnmount:v,destroyed:M,unmounted:S,render:w,renderTracked:R,renderTriggered:k,errorCaptured:P,serverPrefetch:C,expose:O,inheritAttrs:B,components:U,directives:at,filters:Ct}=t;if(c&&gf(c,n,null),r)for(const Y in r){const nt=r[Y];st(nt)&&(n[Y]=nt.bind(s))}if(i){const Y=i.call(s,s);yt(Y)&&(e.data=Zs(Y))}if(Qo=!0,o)for(const Y in o){const nt=o[Y],xt=st(nt)?nt.bind(s,s):st(nt.get)?nt.get.bind(s,s):Le,Xt=!st(nt)&&st(nt.set)?nt.set.bind(s):Le,Jt=qt({get:xt,set:Xt});Object.defineProperty(n,Y,{enumerable:!0,configurable:!0,get:()=>Jt.value,set:Et=>Jt.value=Et})}if(a)for(const Y in a)mu(a[Y],n,s,Y);if(l){const Y=st(l)?l.call(s):l;Reflect.ownKeys(Y).forEach(nt=>{wi(nt,Y[nt])})}u&&ba(u,e,\"c\");function tt(Y,nt){J(nt)?nt.forEach(xt=>Y(xt.bind(s))):nt&&Y(nt.bind(s))}if(tt(tf,h),tt(to,d),tt(ef,f),tt(sf,p),tt(Jd,g),tt(Qd,_),tt(lf,P),tt(af,R),tt(rf,k),tt(nf,v),tt(pu,S),tt(of,C),J(O))if(O.length){const Y=e.exposed||(e.exposed={});O.forEach(nt=>{Object.defineProperty(Y,nt,{get:()=>s[nt],set:xt=>s[nt]=xt,enumerable:!0})})}else e.exposed||(e.exposed={});w&&e.render===Le&&(e.render=w),B!=null&&(e.inheritAttrs=B),U&&(e.components=U),at&&(e.directives=at),C&&hu(e)}function gf(e,t,s=Le){J(e)&&(e=Zo(e));for(const n in e){const i=e[n];let o;yt(i)?\"default\"in i?o=Je(i.from||n,i.default,!0):o=Je(i.from||n):o=Je(i),Kt(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):t[n]=o}}function ba(e,t,s){Ne(J(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function mu(e,t,s,n){let i=n.includes(\".\")?ru(s,n):()=>s[n];if(It(e)){const o=t[e];st(o)&&Qe(i,o)}else if(st(e))Qe(i,e.bind(s));else if(yt(e))if(J(e))e.forEach(o=>mu(o,t,s,n));else{const o=st(e.handler)?e.handler.bind(s):t[e.handler];st(o)&&Qe(i,o,e)}}function bu(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,a=o.get(t);let l;return a?l=a:!i.length&&!s&&!n?l=t:(l={},i.length&&i.forEach(c=>Di(l,c,r,!0)),Di(l,t,r)),yt(t)&&o.set(t,l),l}function Di(e,t,s,n=!1){const{mixins:i,extends:o}=t;o&&Di(e,o,s,!0),i&&i.forEach(r=>Di(e,r,s,!0));for(const r in t)if(!(n&&r===\"expose\")){const a=mf[r]||s&&s[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const mf={data:_a,props:ya,emits:ya,methods:xn,computed:xn,beforeCreate:Qt,created:Qt,beforeMount:Qt,mounted:Qt,beforeUpdate:Qt,updated:Qt,beforeDestroy:Qt,beforeUnmount:Qt,destroyed:Qt,unmounted:Qt,activated:Qt,deactivated:Qt,errorCaptured:Qt,serverPrefetch:Qt,components:xn,directives:xn,watch:_f,provide:_a,inject:bf};function _a(e,t){return t?e?function(){return Gt(st(e)?e.call(this,this):e,st(t)?t.call(this,this):t)}:t:e}function bf(e,t){return xn(Zo(e),Zo(t))}function Zo(e){if(J(e)){const t={};for(let s=0;s<e.length;s++)t[e[s]]=e[s];return t}return e}function Qt(e,t){return e?[...new Set([].concat(e,t))]:t}function xn(e,t){return e?Gt(Object.create(null),e,t):t}function ya(e,t){return e?J(e)&&J(t)?[...new Set([...e,...t])]:Gt(Object.create(null),ma(e),ma(t??{})):t}function _f(e,t){if(!e)return t;if(!t)return e;const s=Gt(Object.create(null),e);for(const n in t)s[n]=Qt(e[n],t[n]);return s}function _u(){return{app:null,config:{isNativeTag:Rc,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let yf=0;function xf(e,t){return function(n,i=null){st(n)||(n=Gt({},n)),i!=null&&!yt(i)&&(i=null);const o=_u(),r=new WeakSet,a=[];let l=!1;const c=o.app={_uid:yf++,_component:n,_props:i,_container:null,_context:o,_instance:null,version:Zf,get config(){return o.config},set config(u){},use(u,...h){return r.has(u)||(u&&st(u.install)?(r.add(u),u.install(c,...h)):st(u)&&(r.add(u),u(c,...h))),c},mixin(u){return o.mixins.includes(u)||o.mixins.push(u),c},component(u,h){return h?(o.components[u]=h,c):o.components[u]},directive(u,h){return h?(o.directives[u]=h,c):o.directives[u]},mount(u,h,d){if(!l){const f=c._ceVNode||Pt(n,i);return f.appContext=o,d===!0?d=\"svg\":d===!1&&(d=void 0),e(f,u,d),l=!0,c._container=u,u.__vue_app__=c,no(f.component)}},onUnmount(u){a.push(u)},unmount(){l&&(Ne(a,c._instance,16),e(null,c._container),delete c._container.__vue_app__)},provide(u,h){return o.provides[u]=h,c},runWithContext(u){const h=Js;Js=c;try{return u()}finally{Js=h}}};return c}}let Js=null;const vf=(e,t)=>t===\"modelValue\"||t===\"model-value\"?e.modelModifiers:e[`${t}Modifiers`]||e[`${xe(t)}Modifiers`]||e[`${ys(t)}Modifiers`];function wf(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||_t;let i=s;const o=t.startsWith(\"update:\"),r=o&&vf(n,t.slice(7));r&&(r.trim&&(i=s.map(u=>It(u)?u.trim():u)),r.number&&(i=s.map(Gi)));let a,l=n[a=mo(t)]||n[a=mo(xe(t))];!l&&o&&(l=n[a=mo(ys(t))]),l&&Ne(l,e,6,i);const c=n[a+\"Once\"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Ne(c,e,6,i)}}const Sf=new WeakMap;function yu(e,t,s=!1){const n=s?Sf:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let r={},a=!1;if(!st(e)){const l=c=>{const u=yu(c,t,!0);u&&(a=!0,Gt(r,u))};!s&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!a?(yt(e)&&n.set(e,null),null):(J(o)?o.forEach(l=>r[l]=null):Gt(r,o),yt(e)&&n.set(e,r),r)}function eo(e,t){return!e||!qi(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),gt(e,t[0].toLowerCase()+t.slice(1))||gt(e,ys(t))||gt(e,t))}function xa(e){const{type:t,vnode:s,proxy:n,withProxy:i,propsOptions:[o],slots:r,attrs:a,emit:l,render:c,renderCache:u,props:h,data:d,setupState:f,ctx:p,inheritAttrs:g}=e,_=Ti(e);let b,v;try{if(s.shapeFlag&4){const S=i||n,w=S;b=De(c.call(w,S,u,h,f,d,p)),v=a}else{const S=t;b=De(S.length>1?S(h,{attrs:a,slots:r,emit:l}):S(h,null)),v=t.props?a:kf(a)}}catch(S){Tn.length=0,Ji(S,e,1),b=Pt(ss)}let M=b;if(v&&g!==!1){const S=Object.keys(v),{shapeFlag:w}=M;S.length&&w&7&&(o&&S.some(yr)&&(v=Mf(v,o)),M=en(M,v,!1,!0))}return s.dirs&&(M=en(M,null,!1,!0),M.dirs=M.dirs?M.dirs.concat(s.dirs):s.dirs),s.transition&&Dr(M,s.transition),b=M,Ti(_),b}const kf=e=>{let t;for(const s in e)(s===\"class\"||s===\"style\"||qi(s))&&((t||(t={}))[s]=e[s]);return t},Mf=(e,t)=>{const s={};for(const n in e)(!yr(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Cf(e,t,s){const{props:n,children:i,component:o}=e,{props:r,children:a,patchFlag:l}=t,c=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&l>=0){if(l&1024)return!0;if(l&16)return n?va(n,r,c):!!r;if(l&8){const u=t.dynamicProps;for(let h=0;h<u.length;h++){const d=u[h];if(r[d]!==n[d]&&!eo(c,d))return!0}}}else return(i||a)&&(!a||!a.$stable)?!0:n===r?!1:n?r?va(n,r,c):!0:!!r;return!1}function va(e,t,s){const n=Object.keys(t);if(n.length!==Object.keys(e).length)return!0;for(let i=0;i<n.length;i++){const o=n[i];if(t[o]!==e[o]&&!eo(s,o))return!0}return!1}function Pf({vnode:e,parent:t},s){for(;t;){const n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.el=e.el),n===e)(e=t.vnode).el=s,t=t.parent;else break}}const xu={},vu=()=>Object.create(xu),wu=e=>Object.getPrototypeOf(e)===xu;function Af(e,t,s,n=!1){const i={},o=vu();e.propsDefaults=Object.create(null),Su(e,t,i,o);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);s?e.props=n?i:Jc(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Rf(e,t,s,n){const{props:i,attrs:o,vnode:{patchFlag:r}}=e,a=pt(i),[l]=e.propsOptions;let c=!1;if((n||r>0)&&!(r&16)){if(r&8){const u=e.vnode.dynamicProps;for(let h=0;h<u.length;h++){let d=u[h];if(eo(e.emitsOptions,d))continue;const f=t[d];if(l)if(gt(o,d))f!==o[d]&&(o[d]=f,c=!0);else{const p=xe(d);i[p]=tr(l,a,p,f,e,!1)}else f!==o[d]&&(o[d]=f,c=!0)}}}else{Su(e,t,i,o)&&(c=!0);let u;for(const h in a)(!t||!gt(t,h)&&((u=ys(h))===h||!gt(t,u)))&&(l?s&&(s[h]!==void 0||s[u]!==void 0)&&(i[h]=tr(l,a,h,void 0,e,!0)):delete i[h]);if(o!==a)for(const h in o)(!t||!gt(t,h))&&(delete o[h],c=!0)}c&&qe(e.attrs,\"set\",\"\")}function Su(e,t,s,n){const[i,o]=e.propsOptions;let r=!1,a;if(t)for(let l in t){if(Mn(l))continue;const c=t[l];let u;i&&gt(i,u=xe(l))?!o||!o.includes(u)?s[u]=c:(a||(a={}))[u]=c:eo(e.emitsOptions,l)||(!(l in n)||c!==n[l])&&(n[l]=c,r=!0)}if(o){const l=pt(s),c=a||_t;for(let u=0;u<o.length;u++){const h=o[u];s[h]=tr(i,l,h,c[h],e,!gt(c,h))}}return r}function tr(e,t,s,n,i,o){const r=e[s];if(r!=null){const a=gt(r,\"default\");if(a&&n===void 0){const l=r.default;if(r.type!==Function&&!r.skipFactory&&st(l)){const{propsDefaults:c}=i;if(s in c)n=c[s];else{const u=Zn(i);n=c[s]=l.call(null,t),u()}}else n=l;i.ce&&i.ce._setProp(s,n)}r[0]&&(o&&!a?n=!1:r[1]&&(n===\"\"||n===ys(s))&&(n=!0))}return n}const Of=new WeakMap;function ku(e,t,s=!1){const n=s?Of:t.propsCache,i=n.get(e);if(i)return i;const o=e.props,r={},a=[];let l=!1;if(!st(e)){const u=h=>{l=!0;const[d,f]=ku(h,t,!0);Gt(r,d),f&&a.push(...f)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!o&&!l)return yt(e)&&n.set(e,Ks),Ks;if(J(o))for(let u=0;u<o.length;u++){const h=xe(o[u]);wa(h)&&(r[h]=_t)}else if(o)for(const u in o){const h=xe(u);if(wa(h)){const d=o[u],f=r[h]=J(d)||st(d)?{type:d}:Gt({},d),p=f.type;let g=!1,_=!0;if(J(p))for(let b=0;b<p.length;++b){const v=p[b],M=st(v)&&v.name;if(M===\"Boolean\"){g=!0;break}else M===\"String\"&&(_=!1)}else g=st(p)&&p.name===\"Boolean\";f[0]=g,f[1]=_,(g||gt(f,\"default\"))&&a.push(h)}}const c=[r,a];return yt(e)&&n.set(e,c),c}function wa(e){return e[0]!==\"$\"&&!Mn(e)}const Ir=e=>e===\"_\"||e===\"_ctx\"||e===\"$stable\",Lr=e=>J(e)?e.map(De):[De(e)],Tf=(e,t,s)=>{if(t._n)return t;const n=Er((...i)=>Lr(t(...i)),s);return n._c=!1,n},Mu=(e,t,s)=>{const n=e._ctx;for(const i in e){if(Ir(i))continue;const o=e[i];if(st(o))t[i]=Tf(i,o,n);else if(o!=null){const r=Lr(o);t[i]=()=>r}}},Cu=(e,t)=>{const s=Lr(t);e.slots.default=()=>s},Pu=(e,t,s)=>{for(const n in t)(s||!Ir(n))&&(e[n]=t[n])},Ef=(e,t,s)=>{const n=e.slots=vu();if(e.vnode.shapeFlag&32){const i=t._;i?(Pu(n,t,s),s&&Dc(n,\"_\",i,!0)):Mu(t,n)}else t&&Cu(e,t)},Df=(e,t,s)=>{const{vnode:n,slots:i}=e;let o=!0,r=_t;if(n.shapeFlag&32){const a=t._;a?s&&a===1?o=!1:Pu(i,t,s):(o=!t.$stable,Mu(t,i)),r=t}else t&&(Cu(e,t),r={default:1});if(o)for(const a in i)!Ir(a)&&r[a]==null&&delete i[a]},Zt=Bf;function If(e){return Lf(e)}function Lf(e,t){const s=Yi();s.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:r,createText:a,createComment:l,setText:c,setElementText:u,parentNode:h,nextSibling:d,setScopeId:f=Le,insertStaticContent:p}=e,g=(y,x,A,T=null,I=null,E=null,j=void 0,V=null,$=!!x.dynamicChildren)=>{if(y===x)return;y&&!dn(y,x)&&(T=D(y),Et(y,I,E,!0),y=null),x.patchFlag===-2&&($=!1,x.dynamicChildren=null);const{type:F,ref:X,shapeFlag:W}=x;switch(F){case so:_(y,x,A,T);break;case ss:b(y,x,A,T);break;case So:y==null&&v(x,A,T,j);break;case ut:U(y,x,A,T,I,E,j,V,$);break;default:W&1?w(y,x,A,T,I,E,j,V,$):W&6?at(y,x,A,T,I,E,j,V,$):(W&64||W&128)&&F.process(y,x,A,T,I,E,j,V,$,K)}X!=null&&I?Rn(X,y&&y.ref,E,x||y,!x):X==null&&y&&y.ref!=null&&Rn(y.ref,null,E,y,!0)},_=(y,x,A,T)=>{if(y==null)n(x.el=a(x.children),A,T);else{const I=x.el=y.el;x.children!==y.children&&c(I,x.children)}},b=(y,x,A,T)=>{y==null?n(x.el=l(x.children||\"\"),A,T):x.el=y.el},v=(y,x,A,T)=>{[y.el,y.anchor]=p(y.children,x,A,T,y.el,y.anchor)},M=({el:y,anchor:x},A,T)=>{let I;for(;y&&y!==x;)I=d(y),n(y,A,T),y=I;n(x,A,T)},S=({el:y,anchor:x})=>{let A;for(;y&&y!==x;)A=d(y),i(y),y=A;i(x)},w=(y,x,A,T,I,E,j,V,$)=>{if(x.type===\"svg\"?j=\"svg\":x.type===\"math\"&&(j=\"mathml\"),y==null)R(x,A,T,I,E,j,V,$);else{const F=y.el&&y.el._isVueCE?y.el:null;try{F&&F._beginPatch(),C(y,x,I,E,j,V,$)}finally{F&&F._endPatch()}}},R=(y,x,A,T,I,E,j,V)=>{let $,F;const{props:X,shapeFlag:W,transition:G,dirs:Q}=y;if($=y.el=r(y.type,E,X&&X.is,X),W&8?u($,y.children):W&16&&P(y.children,$,null,T,I,wo(y,E),j,V),Q&&ws(y,null,T,\"created\"),k($,y,y.scopeId,j,T),X){for(const vt in X)vt!==\"value\"&&!Mn(vt)&&o($,vt,null,X[vt],E,T);\"value\"in X&&o($,\"value\",null,X.value,E),(F=X.onVnodeBeforeMount)&&Re(F,T,y)}Q&&ws(y,null,T,\"beforeMount\");const ct=Ff(I,G);ct&&G.beforeEnter($),n($,x,A),((F=X&&X.onVnodeMounted)||ct||Q)&&Zt(()=>{F&&Re(F,T,y),ct&&G.enter($),Q&&ws(y,null,T,\"mounted\")},I)},k=(y,x,A,T,I)=>{if(A&&f(y,A),T)for(let E=0;E<T.length;E++)f(y,T[E]);if(I){let E=I.subTree;if(x===E||Ou(E.type)&&(E.ssContent===x||E.ssFallback===x)){const j=I.vnode;k(y,j,j.scopeId,j.slotScopeIds,I.parent)}}},P=(y,x,A,T,I,E,j,V,$=0)=>{for(let F=$;F<y.length;F++){const X=y[F]=V?ls(y[F]):De(y[F]);g(null,X,x,A,T,I,E,j,V)}},C=(y,x,A,T,I,E,j)=>{const V=x.el=y.el;let{patchFlag:$,dynamicChildren:F,dirs:X}=x;$|=y.patchFlag&16;const W=y.props||_t,G=x.props||_t;let Q;if(A&&Ss(A,!1),(Q=G.onVnodeBeforeUpdate)&&Re(Q,A,x,y),X&&ws(x,y,A,\"beforeUpdate\"),A&&Ss(A,!0),(W.innerHTML&&G.innerHTML==null||W.textContent&&G.textContent==null)&&u(V,\"\"),F?O(y.dynamicChildren,F,V,A,T,wo(x,I),E):j||nt(y,x,V,null,A,T,wo(x,I),E,!1),$>0){if($&16)B(V,W,G,A,I);else if($&2&&W.class!==G.class&&o(V,\"class\",null,G.class,I),$&4&&o(V,\"style\",W.style,G.style,I),$&8){const ct=x.dynamicProps;for(let vt=0;vt<ct.length;vt++){const mt=ct[vt],oe=W[mt],re=G[mt];(re!==oe||mt===\"value\")&&o(V,mt,oe,re,I,A)}}$&1&&y.children!==x.children&&u(V,x.children)}else!j&&F==null&&B(V,W,G,A,I);((Q=G.onVnodeUpdated)||X)&&Zt(()=>{Q&&Re(Q,A,x,y),X&&ws(x,y,A,\"updated\")},T)},O=(y,x,A,T,I,E,j)=>{for(let V=0;V<x.length;V++){const $=y[V],F=x[V],X=$.el&&($.type===ut||!dn($,F)||$.shapeFlag&198)?h($.el):A;g($,F,X,null,T,I,E,j,!0)}},B=(y,x,A,T,I)=>{if(x!==A){if(x!==_t)for(const E in x)!Mn(E)&&!(E in A)&&o(y,E,x[E],null,I,T);for(const E in A){if(Mn(E))continue;const j=A[E],V=x[E];j!==V&&E!==\"value\"&&o(y,E,V,j,I,T)}\"value\"in A&&o(y,\"value\",x.value,A.value,I)}},U=(y,x,A,T,I,E,j,V,$)=>{const F=x.el=y?y.el:a(\"\"),X=x.anchor=y?y.anchor:a(\"\");let{patchFlag:W,dynamicChildren:G,slotScopeIds:Q}=x;Q&&(V=V?V.concat(Q):Q),y==null?(n(F,A,T),n(X,A,T),P(x.children||[],A,X,I,E,j,V,$)):W>0&&W&64&&G&&y.dynamicChildren&&y.dynamicChildren.length===G.length?(O(y.dynamicChildren,G,A,I,E,j,V),(x.key!=null||I&&x===I.subTree)&&Fr(y,x,!0)):nt(y,x,A,X,I,E,j,V,$)},at=(y,x,A,T,I,E,j,V,$)=>{x.slotScopeIds=V,y==null?x.shapeFlag&512?I.ctx.activate(x,A,T,j,$):Ct(x,A,T,I,E,j,$):rt(y,x,$)},Ct=(y,x,A,T,I,E,j)=>{const V=y.component=qf(y,T,I);if(du(y)&&(V.ctx.renderer=K),Kf(V,!1,j),V.asyncDep){if(I&&I.registerDep(V,tt,j),!y.el){const $=V.subTree=Pt(ss);b(null,$,x,A),y.placeholder=$.el}}else tt(V,y,x,A,I,E,j)},rt=(y,x,A)=>{const T=x.component=y.component;if(Cf(y,x,A))if(T.asyncDep&&!T.asyncResolved){Y(T,x,A);return}else T.next=x,T.update();else x.el=y.el,T.vnode=x},tt=(y,x,A,T,I,E,j)=>{const V=()=>{if(y.isMounted){let{next:W,bu:G,u:Q,parent:ct,vnode:vt}=y;{const Pe=Au(y);if(Pe){W&&(W.el=vt.el,Y(y,W,j)),Pe.asyncDep.then(()=>{y.isUnmounted||V()});return}}let mt=W,oe;Ss(y,!1),W?(W.el=vt.el,Y(y,W,j)):W=vt,G&&vi(G),(oe=W.props&&W.props.onVnodeBeforeUpdate)&&Re(oe,ct,W,vt),Ss(y,!0);const re=xa(y),Ce=y.subTree;y.subTree=re,g(Ce,re,h(Ce.el),D(Ce),y,I,E),W.el=re.el,mt===null&&Pf(y,re.el),Q&&Zt(Q,I),(oe=W.props&&W.props.onVnodeUpdated)&&Zt(()=>Re(oe,ct,W,vt),I)}else{let W;const{el:G,props:Q}=x,{bm:ct,m:vt,parent:mt,root:oe,type:re}=y,Ce=Xs(x);Ss(y,!1),ct&&vi(ct),!Ce&&(W=Q&&Q.onVnodeBeforeMount)&&Re(W,mt,x),Ss(y,!0);{oe.ce&&oe.ce._def.shadowRoot!==!1&&oe.ce._injectChildStyle(re);const Pe=y.subTree=xa(y);g(null,Pe,A,T,y,I,E),x.el=Pe.el}if(vt&&Zt(vt,I),!Ce&&(W=Q&&Q.onVnodeMounted)){const Pe=x;Zt(()=>Re(W,mt,Pe),I)}(x.shapeFlag&256||mt&&Xs(mt.vnode)&&mt.vnode.shapeFlag&256)&&y.a&&Zt(y.a,I),y.isMounted=!0,x=A=T=null}};y.scope.on();const $=y.effect=new Nc(V);y.scope.off();const F=y.update=$.run.bind($),X=y.job=$.runIfDirty.bind($);X.i=y,X.id=y.uid,$.scheduler=()=>Tr(X),Ss(y,!0),F()},Y=(y,x,A)=>{x.component=y;const T=y.vnode.props;y.vnode=x,y.next=null,Rf(y,x.props,T,A),Df(y,x.children,A),Ze(),ua(y),ts()},nt=(y,x,A,T,I,E,j,V,$=!1)=>{const F=y&&y.children,X=y?y.shapeFlag:0,W=x.children,{patchFlag:G,shapeFlag:Q}=x;if(G>0){if(G&128){Xt(F,W,A,T,I,E,j,V,$);return}else if(G&256){xt(F,W,A,T,I,E,j,V,$);return}}Q&8?(X&16&&Lt(F,I,E),W!==F&&u(A,W)):X&16?Q&16?Xt(F,W,A,T,I,E,j,V,$):Lt(F,I,E,!0):(X&8&&u(A,\"\"),Q&16&&P(W,A,T,I,E,j,V,$))},xt=(y,x,A,T,I,E,j,V,$)=>{y=y||Ks,x=x||Ks;const F=y.length,X=x.length,W=Math.min(F,X);let G;for(G=0;G<W;G++){const Q=x[G]=$?ls(x[G]):De(x[G]);g(y[G],Q,A,null,I,E,j,V,$)}F>X?Lt(y,I,E,!0,!1,W):P(x,A,T,I,E,j,V,$,W)},Xt=(y,x,A,T,I,E,j,V,$)=>{let F=0;const X=x.length;let W=y.length-1,G=X-1;for(;F<=W&&F<=G;){const Q=y[F],ct=x[F]=$?ls(x[F]):De(x[F]);if(dn(Q,ct))g(Q,ct,A,null,I,E,j,V,$);else break;F++}for(;F<=W&&F<=G;){const Q=y[W],ct=x[G]=$?ls(x[G]):De(x[G]);if(dn(Q,ct))g(Q,ct,A,null,I,E,j,V,$);else break;W--,G--}if(F>W){if(F<=G){const Q=G+1,ct=Q<X?x[Q].el:T;for(;F<=G;)g(null,x[F]=$?ls(x[F]):De(x[F]),A,ct,I,E,j,V,$),F++}}else if(F>G)for(;F<=W;)Et(y[F],I,E,!0),F++;else{const Q=F,ct=F,vt=new Map;for(F=ct;F<=G;F++){const he=x[F]=$?ls(x[F]):De(x[F]);he.key!=null&&vt.set(he.key,F)}let mt,oe=0;const re=G-ct+1;let Ce=!1,Pe=0;const un=new Array(re);for(F=0;F<re;F++)un[F]=0;for(F=Q;F<=W;F++){const he=y[F];if(oe>=re){Et(he,I,E,!0);continue}let Ae;if(he.key!=null)Ae=vt.get(he.key);else for(mt=ct;mt<=G;mt++)if(un[mt-ct]===0&&dn(he,x[mt])){Ae=mt;break}Ae===void 0?Et(he,I,E,!0):(un[Ae-ct]=F+1,Ae>=Pe?Pe=Ae:Ce=!0,g(he,x[Ae],A,null,I,E,j,V,$),oe++)}const na=Ce?Nf(un):Ks;for(mt=na.length-1,F=re-1;F>=0;F--){const he=ct+F,Ae=x[he],ia=x[he+1],oa=he+1<X?ia.el||Ru(ia):T;un[F]===0?g(null,Ae,A,oa,I,E,j,V,$):Ce&&(mt<0||F!==na[mt]?Jt(Ae,A,oa,2):mt--)}}},Jt=(y,x,A,T,I=null)=>{const{el:E,type:j,transition:V,children:$,shapeFlag:F}=y;if(F&6){Jt(y.component.subTree,x,A,T);return}if(F&128){y.suspense.move(x,A,T);return}if(F&64){j.move(y,x,A,K);return}if(j===ut){n(E,x,A);for(let W=0;W<$.length;W++)Jt($[W],x,A,T);n(y.anchor,x,A);return}if(j===So){M(y,x,A);return}if(T!==2&&F&1&&V)if(T===0)V.beforeEnter(E),n(E,x,A),Zt(()=>V.enter(E),I);else{const{leave:W,delayLeave:G,afterLeave:Q}=V,ct=()=>{y.ctx.isUnmounted?i(E):n(E,x,A)},vt=()=>{E._isLeaving&&E[Xd](!0),W(E,()=>{ct(),Q&&Q()})};G?G(E,ct,vt):vt()}else n(E,x,A)},Et=(y,x,A,T=!1,I=!1)=>{const{type:E,props:j,ref:V,children:$,dynamicChildren:F,shapeFlag:X,patchFlag:W,dirs:G,cacheIndex:Q}=y;if(W===-2&&(I=!1),V!=null&&(Ze(),Rn(V,null,A,y,!0),ts()),Q!=null&&(x.renderCache[Q]=void 0),X&256){x.ctx.deactivate(y);return}const ct=X&1&&G,vt=!Xs(y);let mt;if(vt&&(mt=j&&j.onVnodeBeforeUnmount)&&Re(mt,x,y),X&6)ue(y.component,A,T);else{if(X&128){y.suspense.unmount(A,T);return}ct&&ws(y,null,x,\"beforeUnmount\"),X&64?y.type.remove(y,x,A,K,T):F&&!F.hasOnce&&(E!==ut||W>0&&W&64)?Lt(F,x,A,!1,!0):(E===ut&&W&384||!I&&X&16)&&Lt($,x,A),T&&pe(y)}(vt&&(mt=j&&j.onVnodeUnmounted)||ct)&&Zt(()=>{mt&&Re(mt,x,y),ct&&ws(y,null,x,\"unmounted\")},A)},pe=y=>{const{type:x,el:A,anchor:T,transition:I}=y;if(x===ut){ie(A,T);return}if(x===So){S(y);return}const E=()=>{i(A),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(y.shapeFlag&1&&I&&!I.persisted){const{leave:j,delayLeave:V}=I,$=()=>j(A,E);V?V(y.el,E,$):$()}else E()},ie=(y,x)=>{let A;for(;y!==x;)A=d(y),i(y),y=A;i(x)},ue=(y,x,A)=>{const{bum:T,scope:I,job:E,subTree:j,um:V,m:$,a:F}=y;Sa($),Sa(F),T&&vi(T),I.stop(),E&&(E.flags|=8,Et(j,y,x,A)),V&&Zt(V,x),Zt(()=>{y.isUnmounted=!0},x)},Lt=(y,x,A,T=!1,I=!1,E=0)=>{for(let j=E;j<y.length;j++)Et(y[j],x,A,T,I)},D=y=>{if(y.shapeFlag&6)return D(y.component.subTree);if(y.shapeFlag&128)return y.suspense.next();const x=d(y.anchor||y.el),A=x&&x[au];return A?d(A):x};let q=!1;const z=(y,x,A)=>{let T;y==null?x._vnode&&(Et(x._vnode,null,null,!0),T=x._vnode.component):g(x._vnode||null,y,x,null,null,null,A),x._vnode=y,q||(q=!0,ua(T),su(),q=!1)},K={p:g,um:Et,m:Jt,r:pe,mt:Ct,mc:P,pc:nt,pbc:O,n:D,o:e};return{render:z,hydrate:void 0,createApp:xf(z)}}function wo({type:e,props:t},s){return s===\"svg\"&&e===\"foreignObject\"||s===\"mathml\"&&e===\"annotation-xml\"&&t&&t.encoding&&t.encoding.includes(\"html\")?void 0:s}function Ss({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ff(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Fr(e,t,s=!1){const n=e.children,i=t.children;if(J(n)&&J(i))for(let o=0;o<n.length;o++){const r=n[o];let a=i[o];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=i[o]=ls(i[o]),a.el=r.el),!s&&a.patchFlag!==-2&&Fr(r,a)),a.type===so&&(a.patchFlag!==-1?a.el=r.el:a.__elIndex=o+(e.type===ut?1:0)),a.type===ss&&!a.el&&(a.el=r.el)}}function Nf(e){const t=e.slice(),s=[0];let n,i,o,r,a;const l=e.length;for(n=0;n<l;n++){const c=e[n];if(c!==0){if(i=s[s.length-1],e[i]<c){t[n]=i,s.push(n);continue}for(o=0,r=s.length-1;o<r;)a=o+r>>1,e[s[a]]<c?o=a+1:r=a;c<e[s[o]]&&(o>0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,r=s[o-1];o-- >0;)s[o]=r,r=t[r];return s}function Au(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Au(t)}function Sa(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Ru(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?Ru(t.subTree):null}const Ou=e=>e.__isSuspense;function Bf(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):zd(e)}const ut=Symbol.for(\"v-fgt\"),so=Symbol.for(\"v-txt\"),ss=Symbol.for(\"v-cmt\"),So=Symbol.for(\"v-stc\"),Tn=[];let fe=null;function L(e=!1){Tn.push(fe=e?null:[])}function $f(){Tn.pop(),fe=Tn[Tn.length-1]||null}let Vn=1;function Ii(e,t=!1){Vn+=e,e<0&&fe&&t&&(fe.hasOnce=!0)}function Tu(e){return e.dynamicChildren=Vn>0?fe||Ks:null,$f(),Vn>0&&fe&&fe.push(e),e}function N(e,t,s,n,i,o){return Tu(m(e,t,s,n,i,o,!0))}function Ie(e,t,s,n,i){return Tu(Pt(e,t,s,n,i,!0))}function jn(e){return e?e.__v_isVNode===!0:!1}function dn(e,t){return e.type===t.type&&e.key===t.key}const Eu=({key:e})=>e??null,ki=({ref:e,ref_key:t,ref_for:s})=>(typeof e==\"number\"&&(e=\"\"+e),e!=null?It(e)||Kt(e)||st(e)?{i:$t,r:e,k:t,f:!!s}:e:null);function m(e,t=null,s=null,n=0,i=null,o=e===ut?0:1,r=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Eu(t),ref:t&&ki(t),scopeId:iu,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:$t};return a?(Nr(l,s),o&128&&e.normalize(l)):s&&(l.shapeFlag|=It(s)?8:16),Vn>0&&!r&&fe&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&fe.push(l),l}const Pt=Vf;function Vf(e,t=null,s=null,n=0,i=null,o=!1){if((!e||e===uf)&&(e=ss),jn(e)){const a=en(e,t,!0);return s&&Nr(a,s),Vn>0&&!o&&fe&&(a.shapeFlag&6?fe[fe.indexOf(e)]=a:fe.push(a)),a.patchFlag=-2,a}if(Qf(e)&&(e=e.__vccOpts),t){t=jf(t);let{class:a,style:l}=t;a&&!It(a)&&(t.class=kt(a)),yt(l)&&(Or(l)&&!J(l)&&(l=Gt({},l)),t.style=wr(l))}const r=It(e)?1:Ou(e)?128:Kd(e)?64:yt(e)?4:st(e)?2:0;return m(e,t,s,n,i,r,o,!0)}function jf(e){return e?Or(e)||wu(e)?Gt({},e):e:null}function en(e,t,s=!1,n=!1){const{props:i,ref:o,patchFlag:r,children:a,transition:l}=e,c=t?Hf(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Eu(c),ref:t&&t.ref?s&&o?J(o)?o.concat(ki(t)):[o,ki(t)]:ki(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ut?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&en(e.ssContent),ssFallback:e.ssFallback&&en(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&n&&Dr(u,l.clone(u)),u}function me(e=\" \",t=0){return Pt(so,null,e,t)}function dt(e=\"\",t=!1){return t?(L(),Ie(ss,null,e)):Pt(ss,null,e)}function De(e){return e==null||typeof e==\"boolean\"?Pt(ss):J(e)?Pt(ut,null,e.slice()):jn(e)?ls(e):Pt(so,null,String(e))}function ls(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:en(e)}function Nr(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(J(t))s=16;else if(typeof t==\"object\")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),Nr(e,i()),i._c&&(i._d=!0));return}else{s=32;const i=t._;!i&&!wu(t)?t._ctx=$t:i===3&&$t&&($t.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else st(t)?(t={default:t,_ctx:$t},s=32):(t=String(t),n&64?(s=16,t=[me(t)]):s=8);e.children=t,e.shapeFlag|=s}function Hf(...e){const t={};for(let s=0;s<e.length;s++){const n=e[s];for(const i in n)if(i===\"class\")t.class!==n.class&&(t.class=kt([t.class,n.class]));else if(i===\"style\")t.style=wr([t.style,n.style]);else if(qi(i)){const o=t[i],r=n[i];r&&o!==r&&!(J(o)&&o.includes(r))&&(t[i]=o?[].concat(o,r):r)}else i!==\"\"&&(t[i]=n[i])}return t}function Re(e,t,s,n=null){Ne(e,t,7,[s,n])}const zf=_u();let Wf=0;function qf(e,t,s){const n=e.type,i=(t?t.appContext:e.appContext)||zf,o={uid:Wf++,vnode:e,type:n,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new fd(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),ids:t?t.ids:[\"\",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ku(n,i),emitsOptions:yu(n,i),emit:null,emitted:null,propsDefaults:_t,inheritAttrs:n.inheritAttrs,ctx:_t,data:_t,props:_t,attrs:_t,slots:_t,refs:_t,setupState:_t,setupContext:null,suspense:s,suspenseId:s?s.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=t?t.root:o,o.emit=wf.bind(null,o),e.ce&&e.ce(o),o}let Wt=null;const Uf=()=>Wt||$t;let Li,er;{const e=Yi(),t=(s,n)=>{let i;return(i=e[s])||(i=e[s]=[]),i.push(n),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};Li=t(\"__VUE_INSTANCE_SETTERS__\",s=>Wt=s),er=t(\"__VUE_SSR_SETTERS__\",s=>Hn=s)}const Zn=e=>{const t=Wt;return Li(e),e.scope.on(),()=>{e.scope.off(),Li(t)}},ka=()=>{Wt&&Wt.scope.off(),Li(null)};function Du(e){return e.vnode.shapeFlag&4}let Hn=!1;function Kf(e,t=!1,s=!1){t&&er(t);const{props:n,children:i}=e.vnode,o=Du(e);Af(e,n,o,t),Ef(e,i,s||t);const r=o?Gf(e,t):void 0;return t&&er(!1),r}function Gf(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ff);const{setup:n}=s;if(n){Ze();const i=e.setupContext=n.length>1?Xf(e):null,o=Zn(e),r=Qn(n,e,0,[e.props,i]),a=Oc(r);if(ts(),o(),(a||e.sp)&&!Xs(e)&&hu(e),a){if(r.then(ka,ka),t)return r.then(l=>{Ma(e,l)}).catch(l=>{Ji(l,e,0)});e.asyncDep=r}else Ma(e,r)}else Iu(e)}function Ma(e,t,s){st(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:yt(t)&&(e.setupState=Zc(t)),Iu(e)}function Iu(e,t,s){const n=e.type;e.render||(e.render=n.render||Le);{const i=Zn(e);Ze();try{pf(e)}finally{ts(),i()}}}const Yf={get(e,t){return zt(e,\"get\",\"\"),e[t]}};function Xf(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Yf),slots:e.slots,emit:e.emit,expose:t}}function no(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Zc(Dd(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in On)return On[s](e)},has(t,s){return s in t||s in On}})):e.proxy}function Jf(e,t=!0){return st(e)?e.displayName||e.name:e.name||t&&e.__name}function Qf(e){return st(e)&&\"__vccOpts\"in e}const qt=(e,t)=>Bd(e,t,Hn);function Lu(e,t,s){try{Ii(-1);const n=arguments.length;return n===2?yt(t)&&!J(t)?jn(t)?Pt(e,null,[t]):Pt(e,t):Pt(e,null,t):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&jn(s)&&(s=[s]),Pt(e,t,s))}finally{Ii(1)}}const Zf=\"3.5.26\";let sr;const Ca=typeof window<\"u\"&&window.trustedTypes;if(Ca)try{sr=Ca.createPolicy(\"vue\",{createHTML:e=>e})}catch{}const Fu=sr?e=>sr.createHTML(e):e=>e,tp=\"http://www.w3.org/2000/svg\",ep=\"http://www.w3.org/1998/Math/MathML\",ze=typeof document<\"u\"?document:null,Pa=ze&&ze.createElement(\"template\"),sp={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const i=t===\"svg\"?ze.createElementNS(tp,e):t===\"mathml\"?ze.createElementNS(ep,e):s?ze.createElement(e,{is:s}):ze.createElement(e);return e===\"select\"&&n&&n.multiple!=null&&i.setAttribute(\"multiple\",n.multiple),i},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},insertStaticContent(e,t,s,n,i,o){const r=s?s.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),s),!(i===o||!(i=i.nextSibling)););else{Pa.innerHTML=Fu(n===\"svg\"?`<svg>${e}</svg>`:n===\"mathml\"?`<math>${e}</math>`:e);const a=Pa.content;if(n===\"svg\"||n===\"mathml\"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,s)}return[r?r.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},np=Symbol(\"_vtc\");function ip(e,t,s){const n=e[np];n&&(t=(t?[t,...n]:[...n]).join(\" \")),t==null?e.removeAttribute(\"class\"):s?e.setAttribute(\"class\",t):e.className=t}const Fi=Symbol(\"_vod\"),Nu=Symbol(\"_vsh\"),Ts={name:\"show\",beforeMount(e,{value:t},{transition:s}){e[Fi]=e.style.display===\"none\"?\"\":e.style.display,s&&t?s.beforeEnter(e):fn(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:n}){!t!=!s&&(n?t?(n.beforeEnter(e),fn(e,!0),n.enter(e)):n.leave(e,()=>{fn(e,!1)}):fn(e,t))},beforeUnmount(e,{value:t}){fn(e,t)}};function fn(e,t){e.style.display=t?e[Fi]:\"none\",e[Nu]=!t}const op=Symbol(\"\"),rp=/(?:^|;)\\s*display\\s*:/;function ap(e,t,s){const n=e.style,i=It(s);let o=!1;if(s&&!i){if(t)if(It(t))for(const r of t.split(\";\")){const a=r.slice(0,r.indexOf(\":\")).trim();s[a]==null&&Mi(n,a,\"\")}else for(const r in t)s[r]==null&&Mi(n,r,\"\");for(const r in s)r===\"display\"&&(o=!0),Mi(n,r,s[r])}else if(i){if(t!==s){const r=n[op];r&&(s+=\";\"+r),n.cssText=s,o=rp.test(s)}}else t&&e.removeAttribute(\"style\");Fi in e&&(e[Fi]=o?n.display:\"\",e[Nu]&&(n.display=\"none\"))}const Aa=/\\s*!important$/;function Mi(e,t,s){if(J(s))s.forEach(n=>Mi(e,t,n));else if(s==null&&(s=\"\"),t.startsWith(\"--\"))e.setProperty(t,s);else{const n=lp(e,t);Aa.test(s)?e.setProperty(ys(n),s.replace(Aa,\"\"),\"important\"):e[n]=s}}const Ra=[\"Webkit\",\"Moz\",\"ms\"],ko={};function lp(e,t){const s=ko[t];if(s)return s;let n=xe(t);if(n!==\"filter\"&&n in e)return ko[t]=n;n=Ki(n);for(let i=0;i<Ra.length;i++){const o=Ra[i]+n;if(o in e)return ko[t]=o}return t}const Oa=\"http://www.w3.org/1999/xlink\";function Ta(e,t,s,n,i,o=hd(t)){n&&t.startsWith(\"xlink:\")?s==null?e.removeAttributeNS(Oa,t.slice(6,t.length)):e.setAttributeNS(Oa,t,s):s==null||o&&!Ic(s)?e.removeAttribute(t):e.setAttribute(t,o?\"\":Se(s)?String(s):s)}function Ea(e,t,s,n,i){if(t===\"innerHTML\"||t===\"textContent\"){s!=null&&(e[t]=t===\"innerHTML\"?Fu(s):s);return}const o=e.tagName;if(t===\"value\"&&o!==\"PROGRESS\"&&!o.includes(\"-\")){const a=o===\"OPTION\"?e.getAttribute(\"value\")||\"\":e.value,l=s==null?e.type===\"checkbox\"?\"on\":\"\":String(s);(a!==l||!(\"_value\"in e))&&(e.value=l),s==null&&e.removeAttribute(t),e._value=s;return}let r=!1;if(s===\"\"||s==null){const a=typeof e[t];a===\"boolean\"?s=Ic(s):s==null&&a===\"string\"?(s=\"\",r=!0):a===\"number\"&&(s=0,r=!0)}try{e[t]=s}catch{}r&&e.removeAttribute(i||t)}function Ke(e,t,s,n){e.addEventListener(t,s,n)}function cp(e,t,s,n){e.removeEventListener(t,s,n)}const Da=Symbol(\"_vei\");function up(e,t,s,n,i=null){const o=e[Da]||(e[Da]={}),r=o[t];if(n&&r)r.value=n;else{const[a,l]=hp(t);if(n){const c=o[t]=pp(n,i);Ke(e,a,c,l)}else r&&(cp(e,a,r,l),o[t]=void 0)}}const Ia=/(?:Once|Passive|Capture)$/;function hp(e){let t;if(Ia.test(e)){t={};let n;for(;n=e.match(Ia);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[e[2]===\":\"?e.slice(3):ys(e.slice(2)),t]}let Mo=0;const dp=Promise.resolve(),fp=()=>Mo||(dp.then(()=>Mo=0),Mo=Date.now());function pp(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;Ne(gp(n,s.value),t,5,[n])};return s.value=e,s.attached=fp(),s}function gp(e,t){if(J(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>i=>!i._stopped&&n&&n(i))}else return t}const La=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,mp=(e,t,s,n,i,o)=>{const r=i===\"svg\";t===\"class\"?ip(e,n,r):t===\"style\"?ap(e,s,n):qi(t)?yr(t)||up(e,t,s,n,o):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):bp(e,t,n,r))?(Ea(e,t,n),!e.tagName.includes(\"-\")&&(t===\"value\"||t===\"checked\"||t===\"selected\")&&Ta(e,t,n,r,o,t!==\"value\")):e._isVueCE&&(/[A-Z]/.test(t)||!It(n))?Ea(e,xe(t),n,o,t):(t===\"true-value\"?e._trueValue=n:t===\"false-value\"&&(e._falseValue=n),Ta(e,t,n,r))};function bp(e,t,s,n){if(n)return!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&La(t)&&st(s));if(t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"autocorrect\"||t===\"sandbox\"&&e.tagName===\"IFRAME\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\")return!1;if(t===\"width\"||t===\"height\"){const i=e.tagName;if(i===\"IMG\"||i===\"VIDEO\"||i===\"CANVAS\"||i===\"SOURCE\")return!1}return La(t)&&It(s)?!1:t in e}const ms=e=>{const t=e.props[\"onUpdate:modelValue\"]||!1;return J(t)?s=>vi(t,s):t};function _p(e){e.target.composing=!0}function Fa(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(\"input\")))}const ye=Symbol(\"_assign\");function Na(e,t,s){return t&&(e=e.trim()),s&&(e=Gi(e)),e}const Ls={created(e,{modifiers:{lazy:t,trim:s,number:n}},i){e[ye]=ms(i);const o=n||i.props&&i.props.type===\"number\";Ke(e,t?\"change\":\"input\",r=>{r.target.composing||e[ye](Na(e.value,s,o))}),(s||o)&&Ke(e,\"change\",()=>{e.value=Na(e.value,s,o)}),t||(Ke(e,\"compositionstart\",_p),Ke(e,\"compositionend\",Fa),Ke(e,\"change\",Fa))},mounted(e,{value:t}){e.value=t??\"\"},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:i,number:o}},r){if(e[ye]=ms(r),e.composing)return;const a=(o||e.type===\"number\")&&!/^0\\d/.test(e.value)?Gi(e.value):e.value,l=t??\"\";a!==l&&(document.activeElement===e&&e.type!==\"range\"&&(n&&t===s||i&&e.value.trim()===l)||(e.value=l))}},yp={deep:!0,created(e,t,s){e[ye]=ms(s),Ke(e,\"change\",()=>{const n=e._modelValue,i=sn(e),o=e.checked,r=e[ye];if(J(n)){const a=Sr(n,i),l=a!==-1;if(o&&!l)r(n.concat(i));else if(!o&&l){const c=[...n];c.splice(a,1),r(c)}}else if(cn(n)){const a=new Set(n);o?a.add(i):a.delete(i),r(a)}else r(Vu(e,o))})},mounted:Ba,beforeUpdate(e,t,s){e[ye]=ms(s),Ba(e,t,s)}};function Ba(e,{value:t,oldValue:s},n){e._modelValue=t;let i;if(J(t))i=Sr(t,n.props.value)>-1;else if(cn(t))i=t.has(n.props.value);else{if(t===s)return;i=Bs(t,Vu(e,!0))}e.checked!==i&&(e.checked=i)}const Bu={created(e,{value:t},s){e.checked=Bs(t,s.props.value),e[ye]=ms(s),Ke(e,\"change\",()=>{e[ye](sn(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[ye]=ms(n),t!==s&&(e.checked=Bs(t,n.props.value))}},$u={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const i=cn(t);Ke(e,\"change\",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Gi(sn(r)):sn(r));e[ye](e.multiple?i?new Set(o):o:o[0]),e._assigning=!0,Qi(()=>{e._assigning=!1})}),e[ye]=ms(n)},mounted(e,{value:t}){$a(e,t)},beforeUpdate(e,t,s){e[ye]=ms(s)},updated(e,{value:t}){e._assigning||$a(e,t)}};function $a(e,t){const s=e.multiple,n=J(t);if(!(s&&!n&&!cn(t))){for(let i=0,o=e.options.length;i<o;i++){const r=e.options[i],a=sn(r);if(s)if(n){const l=typeof a;l===\"string\"||l===\"number\"?r.selected=t.some(c=>String(c)===String(a)):r.selected=Sr(t,a)>-1}else r.selected=t.has(a);else if(Bs(sn(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function sn(e){return\"_value\"in e?e._value:e.value}function Vu(e,t){const s=t?\"_trueValue\":\"_falseValue\";return s in e?e[s]:t}const xp={created(e,t,s){ri(e,t,s,null,\"created\")},mounted(e,t,s){ri(e,t,s,null,\"mounted\")},beforeUpdate(e,t,s,n){ri(e,t,s,n,\"beforeUpdate\")},updated(e,t,s,n){ri(e,t,s,n,\"updated\")}};function vp(e,t){switch(e){case\"SELECT\":return $u;case\"TEXTAREA\":return Ls;default:switch(t){case\"checkbox\":return yp;case\"radio\":return Bu;default:return Ls}}}function ri(e,t,s,n,i){const r=vp(e.tagName,s.props&&s.props.type)[i];r&&r(e,t,s,n)}const wp=[\"ctrl\",\"shift\",\"alt\",\"meta\"],Sp={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>wp.some(s=>e[`${s}Key`]&&!t.includes(s))},kp=(e,t)=>{const s=e._withMods||(e._withMods={}),n=t.join(\".\");return s[n]||(s[n]=((i,...o)=>{for(let r=0;r<t.length;r++){const a=Sp[t[r]];if(a&&a(i,t))return}return e(i,...o)}))},Mp={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},ju=(e,t)=>{const s=e._withKeys||(e._withKeys={}),n=t.join(\".\");return s[n]||(s[n]=(i=>{if(!(\"key\"in i))return;const o=ys(i.key);if(t.some(r=>r===o||Mp[r]===o))return e(i)}))},Cp=Gt({patchProp:mp},sp);let Va;function Pp(){return Va||(Va=If(Cp))}const Ap=((...e)=>{const t=Pp().createApp(...e),{mount:s}=t;return t.mount=n=>{const i=Op(n);if(!i)return;const o=t._component;!st(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent=\"\");const r=s(i,!1,Rp(i));return i instanceof Element&&(i.removeAttribute(\"v-cloak\"),i.setAttribute(\"data-v-app\",\"\")),r},t});function Rp(e){if(e instanceof SVGElement)return\"svg\";if(typeof MathMLElement==\"function\"&&e instanceof MathMLElement)return\"mathml\"}function Op(e){return It(e)?document.querySelector(e):e}const ne=(e,t)=>{const s=e.__vccOpts||e;for(const[n,i]of t)s[n]=i;return s},Tp={};function Ep(e,t){const s=Xo(\"Toast\"),n=Xo(\"router-view\");return L(),N(ut,null,[Pt(s),Pt(n)],64)}const Dp=ne(Tp,[[\"render\",Ep]]),ja=et([]),Ha=et(window.ApiInspector);function Hu(){return ja.value=[{id:\"home\",label:\"Home\",icon:\"🏠\",href:Ha.value.basePath},{id:\"api-stats\",label:\"API Stats\",icon:\"📚\",href:Ha.value.basePath+\"/stats\"}],{menus:ja}}const za=\"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20fill='%23ffffff'%20width='18px'%20height='18px'%20viewBox='0%200%201920%201920'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m0%201016.081%20409.186%20409.073%2079.85-79.736-272.867-272.979h1136.415V959.611H216.169l272.866-272.866-79.85-79.85L0%201016.082ZM1465.592%20305.32l315.445%20315.445h-315.445V305.32Zm402.184%20242.372-329.224-329.11C1507.042%20187.07%201463.334%20169%201418.835%20169h-743.83v677.647h112.94V281.941h564.706v451.765h451.765v903.53H787.946V1185.47H675.003v564.705h1242.353V667.522c0-44.498-18.07-88.207-49.581-119.83Z'%20fill-rule='evenodd'/%3e%3c/svg%3e\",Ip={class:\"topbar\"},Lp={class:\"topbar-top pb-0\"},Fp={class:\"api-branding\"},Np={class:\"api-title\"},Bp={class:\"api-version\"},$p={class:\"version-badge\"},Vp={class:\"topbar-controls\"},jp={key:0,xmlns:\"http://www.w3.org/2000/svg\",width:\"18\",height:\"18\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",class:\"me-1 feather-lock\"},Hp={key:1,xmlns:\"http://www.w3.org/2000/svg\",width:\"18\",height:\"18\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",class:\"me-1 feather-unlock\"},zp={class:\"auth-modal-body\"},Wp={class:\"auth-method-selector\"},qp={class:\"auth-method-options\"},Up={class:\"auth-method-option\"},Kp={class:\"auth-input-section\"},Gp={key:0,class:\"auth-field-label\"},Yp=[\"placeholder\"],Xp={class:\"auth-input-hint\"},Jp={key:0},Qp={key:0,class:\"auth-modal-divider\"},Zp={key:1,class:\"auth-modal-logout\"},tg=[\"src\"],eg=[\"src\"],sg={key:1,class:\"loading-spinner\"},ng={class:\"topbar-menu pb-0\"},ig={key:0,class:\"menu-icon\"},og={class:\"menu-label\"},rg={__name:\"Topbar\",props:{apiData:{type:Object,default:()=>({title:\"API Inspector\",version:\"1.0.0\"})},loading:{type:Boolean,default:!1},authToken:{type:String,default:\"\"},menus:{type:Array,default:()=>[]}},emits:[\"refresh\",\"update:authToken\",\"menu-click\"],setup(e,{emit:t}){const s=e,n=t,i=et(null),o=et(!1),r=et(\"\"),a=et(\"bearer\"),l=_=>{i.value=_.id,n(\"menu-click\",_)},c=()=>{n(\"update:authToken\",r.value),h()},u=()=>{r.value=\"\",n(\"update:authToken\",\"\"),h()},h=()=>{o.value=!1,r.value=s.authToken},d=()=>{r.value=s.authToken,o.value=!0},f=()=>{window.open(\"https://github.com/irabbi360/laravel-api-inspector/issues/new\",\"_blank\")},p=async()=>{try{const b=await fetch(\"/api/api-inspector-docs/postman\");if(!b.ok)throw new Error(\"Failed to download Postman collection\");const v=await b.blob(),M=window.URL.createObjectURL(v),S=document.createElement(\"a\");S.href=M,S.download=\"postman_collection.json\",document.body.appendChild(S),S.click(),document.body.removeChild(S),window.URL.revokeObjectURL(M)}catch(_){console.error(\"Error downloading Postman collection:\",_),alert(\"Failed to download Postman collection\")}},g=async()=>{try{const b=await fetch(\"/api/api-inspector-docs/openapi\");if(!b.ok)throw new Error(\"Failed to download OpenAPI specification\");const v=await b.blob(),M=window.URL.createObjectURL(v),S=document.createElement(\"a\");S.href=M,S.download=\"openapi.json\",document.body.appendChild(S),S.click(),document.body.removeChild(S),window.URL.revokeObjectURL(M)}catch(_){console.error(\"Error downloading OpenAPI specification:\",_),alert(\"Failed to download OpenAPI specification\")}};return(_,b)=>{const v=Xo(\"router-link\");return L(),N(\"div\",Ip,[m(\"div\",Lp,[m(\"div\",Fp,[m(\"div\",Np,[me(H(e.apiData.title)+\" \",1),b[5]||(b[5]=m(\"a\",{href:\"https://github.com/irabbi360/laravel-api-inspector\",target:\"_blank\",class:\"github-link\"},[m(\"svg\",{width:\"30\",height:\"30\",viewBox:\"0 0 98 98\",xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\"},[m(\"path\",{fill:\"#fff\",\"fill-rule\":\"evenodd\",\"clip-rule\":\"evenodd\",d:\"M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z\"})])],-1))]),m(\"div\",Bp,[b[6]||(b[6]=me(\" Version \",-1)),m(\"span\",$p,H(e.apiData.version),1)])]),m(\"div\",Vp,[m(\"button\",{onClick:b[0]||(b[0]=M=>d()),class:kt([\"btn\",\"btn-auth\",{authenticated:e.authToken}])},[e.authToken?(L(),N(\"svg\",jp,[...b[7]||(b[7]=[m(\"rect\",{x:\"3\",y:\"11\",width:\"18\",height:\"11\",rx:\"2\",ry:\"2\"},null,-1),m(\"path\",{d:\"M7 11V7a5 5 0 0 1 10 0v4\"},null,-1)])])):(L(),N(\"svg\",Hp,[...b[8]||(b[8]=[m(\"rect\",{x:\"3\",y:\"11\",width:\"18\",height:\"11\",rx:\"2\",ry:\"2\"},null,-1),m(\"path\",{d:\"M7 11V7a5 5 0 0 1 9.9-1\"},null,-1)])])),me(\" \"+H(e.authToken?\"Authenticated\":\"Authorize\"),1)],2),o.value?(L(),N(\"div\",{key:0,class:\"auth-modal-overlay\",onClick:h},[m(\"div\",{class:\"auth-modal\",onClick:b[3]||(b[3]=kp(()=>{},[\"stop\"]))},[m(\"div\",{class:\"auth-modal-header\"},[b[9]||(b[9]=m(\"h3\",null,\"API Authorization\",-1)),m(\"button\",{class:\"btn-modal-close\",onClick:h},\"✕\")]),m(\"div\",zp,[m(\"div\",Wp,[b[11]||(b[11]=m(\"label\",{class:\"auth-method-label\"},\"Authorization Type\",-1)),m(\"div\",qp,[m(\"label\",Up,[se(m(\"input\",{type:\"radio\",\"onUpdate:modelValue\":b[1]||(b[1]=M=>a.value=M),value:\"bearer\"},null,512),[[Bu,a.value]]),b[10]||(b[10]=m(\"span\",null,\"Bearer Token\",-1))])])]),m(\"div\",Kp,[a.value===\"bearer\"?(L(),N(\"label\",Gp,[...b[12]||(b[12]=[me(\" Bearer Token \",-1),m(\"span\",{class:\"auth-required\"},\"*\",-1)])])):dt(\"\",!0),se(m(\"input\",{\"onUpdate:modelValue\":b[2]||(b[2]=M=>r.value=M),type:\"password\",placeholder:a.value===\"bearer\"?\"Enter your Bearer token...\":\"Enter your API key...\",class:\"auth-modal-input\",onKeyup:ju(c,[\"enter\"])},null,40,Yp),[[Ls,r.value]]),m(\"div\",Xp,[a.value===\"bearer\"?(L(),N(\"span\",Jp,\" Enter your API Bearer token for authentication. \")):dt(\"\",!0)])]),m(\"div\",{class:\"auth-modal-footer\"},[m(\"button\",{class:\"btn-modal-secondary\",onClick:h},\"Cancel\"),m(\"button\",{class:\"btn-modal-primary\",onClick:c},\"Apply Authorization\")]),e.authToken?(L(),N(\"div\",Qp,[...b[13]||(b[13]=[m(\"span\",null,\"Currently Authenticated\",-1)])])):dt(\"\",!0),e.authToken?(L(),N(\"div\",Zp,[b[14]||(b[14]=m(\"p\",{class:\"auth-logout-text\"},\"You are currently authenticated. Click below to logout.\",-1)),m(\"button\",{class:\"btn-modal-logout\",onClick:u},\"Logout\")])):dt(\"\",!0)])])])):dt(\"\",!0),m(\"button\",{onClick:p,class:\"btn btn-postman\",title:\"Download Postman Collection\"},[m(\"img\",{src:_e(za),alt:\"Export Icon\",class:\"export-icon me-1\"},null,8,tg),b[15]||(b[15]=me(\" Postman \",-1))]),m(\"button\",{onClick:g,class:\"btn btn-openapi\",title:\"Download OpenAPI Specification\"},[m(\"img\",{src:_e(za),alt:\"Export Icon\",class:\"export-icon me-1\"},null,8,eg),b[16]||(b[16]=me(\" OpenAPI \",-1))]),m(\"button\",{class:\"btn btn-feature\",onClick:f},\" Feature Request \"),e.loading?(L(),N(\"div\",sg)):(L(),N(\"button\",{key:2,onClick:b[4]||(b[4]=M=>_.$emit(\"refresh\")),class:\"btn btn-refresh\"},[...b[17]||(b[17]=[m(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"18\",height:\"18\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",class:\"me-1 feather-refresh-cw\"},[m(\"polyline\",{points:\"23 4 23 10 17 10\"}),m(\"polyline\",{points:\"1 20 1 14 7 14\"}),m(\"path\",{d:\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"})],-1),me(\" Refresh \",-1)])]))])]),m(\"nav\",ng,[(L(!0),N(ut,null,Vt(e.menus,M=>(L(),Ie(v,{key:M.id,to:M.href,class:kt([\"menu-item\",{active:M.active}]),onClick:S=>l(M)},{default:Er(()=>[M.icon?(L(),N(\"span\",ig,H(M.icon),1)):dt(\"\",!0),m(\"span\",og,H(M.label),1)]),_:2},1032,[\"to\",\"class\",\"onClick\"]))),128))])])}}},zu=ne(rg,[[\"__scopeId\",\"data-v-0325c2e2\"]]),ag={class:\"sidebar\"},lg={class:\"sidebar-search\"},cg={class:\"search-input-group\"},ug={key:0,class:\"no-results\"},hg={class:\"sidebar-group-title\"},dg=[\"onClick\"],fg=[\"title\"],pg={__name:\"Sidebar\",props:{groupedRoutes:{type:Object,default:()=>({})},selectedRoute:{type:Object,default:null}},emits:[\"select-endpoint\"],setup(e){const t=e,s=et(\"\"),n=o=>t.selectedRoute?t.selectedRoute.http_method===o.http_method&&t.selectedRoute.uri===o.uri:!1,i=qt(()=>{if(!s.value.trim())return t.groupedRoutes;const o=s.value.toLowerCase().trim(),r={};return Object.entries(t.groupedRoutes).forEach(([a,l])=>{const c=l.filter(u=>{const h=u.uri.toLowerCase().includes(o),d=u.http_method.toLowerCase().includes(o),f=a.toLowerCase().includes(o);return h||d||f});c.length>0&&(r[a]=c)}),r});return(o,r)=>(L(),N(\"div\",ag,[m(\"div\",lg,[m(\"div\",cg,[r[3]||(r[3]=m(\"svg\",{class:\"search-icon\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\"},[m(\"circle\",{cx:\"11\",cy:\"11\",r:\"8\"}),m(\"path\",{d:\"m21 21-4.35-4.35\"})],-1)),se(m(\"input\",{\"onUpdate:modelValue\":r[0]||(r[0]=a=>s.value=a),type:\"text\",class:\"search-input\",placeholder:\"Search endpoints...\",onKeydown:r[1]||(r[1]=ju(a=>s.value=\"\",[\"escape\"]))},null,544),[[Ls,s.value]]),s.value?(L(),N(\"button\",{key:0,class:\"clear-button\",onClick:r[2]||(r[2]=a=>s.value=\"\"),title:\"Clear search\"},\" ✕ \")):dt(\"\",!0)]),s.value&&Object.keys(i.value).length===0?(L(),N(\"div\",ug,\" No endpoints found \")):dt(\"\",!0)]),(L(!0),N(ut,null,Vt(i.value,(a,l)=>(L(),N(\"div\",{key:l,class:\"sidebar-group\"},[m(\"div\",hg,H(l),1),(L(!0),N(ut,null,Vt(a,c=>(L(),N(\"div\",{key:`${c.http_method}-${c.uri}`,class:kt([\"sidebar-route\",{active:n(c)}]),onClick:u=>o.$emit(\"select-endpoint\",c)},[m(\"span\",{class:kt([\"route-method-badge\",c.http_method.toLowerCase()])},H(c.http_method),3),m(\"span\",{class:\"route-path\",title:c.uri},H(c.uri),9,fg)],10,dg))),128))]))),128))]))}},gg=ne(pg,[[\"__scopeId\",\"data-v-a3eda4e9\"]]),mg={class:\"detail-header flex justify-between\"},bg={class:\"detail-description\"},_g={class:\"fs-20 font-bold me-2\"},yg={key:0,class:\"auth-badge\"},xg={class:\"detail-method-path\"},vg={class:\"detail-path text-truncate\"},wg={__name:\"DetailHeader\",props:{route:{type:Object,required:!0}},setup(e){return(t,s)=>(L(),N(\"div\",mg,[m(\"div\",bg,[m(\"span\",_g,H(e.route.description),1),e.route.requires_auth?(L(),N(\"span\",yg,\"Requires Auth\")):dt(\"\",!0)]),m(\"div\",xg,[m(\"span\",{class:kt([\"detail-method-badge\",e.route.http_method.toLowerCase()])},H(e.route.http_method),3),m(\"span\",vg,H(e.route.uri),1)])]))}},Sg=ne(wg,[[\"__scopeId\",\"data-v-45e22525\"]]),kg={key:0,class:\"section mb-4\"},Mg={class:\"expandable\"},Cg={key:0,class:\"expandable-content\"},Pg={class:\"param-name\"},Ag={class:\"param-type\"},Rg={__name:\"ParametersSection\",props:{parameters:{type:Object,default:null}},setup(e){const t=et(!0);return(s,n)=>e.parameters&&Object.keys(e.parameters).length>0?(L(),N(\"div\",kg,[n[3]||(n[3]=m(\"div\",{class:\"section-title\"},\"Parameters\",-1)),m(\"div\",Mg,[m(\"div\",{class:\"expandable-header\",onClick:n[0]||(n[0]=i=>t.value=!t.value)},[...n[1]||(n[1]=[m(\"span\",null,\"Route Parameters\",-1),m(\"span\",{class:\"toggle-icon\"},\"▼\",-1)])]),t.value?(L(),N(\"div\",Cg,[m(\"table\",null,[n[2]||(n[2]=m(\"thead\",null,[m(\"tr\",null,[m(\"th\",null,\"Name\"),m(\"th\",null,\"Type\"),m(\"th\",null,\"Description\")])],-1)),m(\"tbody\",null,[(L(!0),N(ut,null,Vt(e.parameters,(i,o)=>(L(),N(\"tr\",{key:o},[m(\"td\",null,[m(\"span\",Pg,H(o),1)]),m(\"td\",null,[m(\"span\",Ag,H(i.type||\"string\"),1)]),m(\"td\",null,\"@\"+H(i.description||\"\"),1)]))),128))])])])):dt(\"\",!0)])])):dt(\"\",!0)}},Og=ne(Rg,[[\"__scopeId\",\"data-v-79f128c3\"]]),Tg={key:0,class:\"section\"},Eg={class:\"form-fields-info\"},Dg={class:\"field-label-info\"},Ig={class:\"field-name-info\"},Lg={class:\"field-meta-info\"},Fg={class:\"field-type-info\"},Ng={key:0,class:\"field-example-info\"},Bg={key:1,class:\"field-desc-info\"},$g={__name:\"RequestBodySection\",props:{requestRules:{type:Object,default:null}},setup(e){return(t,s)=>e.requestRules&&Object.keys(e.requestRules).length>0?(L(),N(\"div\",Tg,[s[1]||(s[1]=m(\"div\",{class:\"section-title\"},\"Request Body Parameters\",-1)),m(\"div\",Eg,[(L(!0),N(ut,null,Vt(e.requestRules,(n,i)=>(L(),N(\"div\",{key:i,class:\"form-field-info\"},[m(\"div\",Dg,[m(\"span\",Ig,H(i),1),m(\"span\",{class:kt([n.required?\"field-required-badge\":\"field-optional-badge\"])},H(n.required?\"REQUIRED\":\"OPTIONAL\"),3)]),m(\"div\",Lg,[m(\"span\",Fg,[s[0]||(s[0]=me(\"Type: \",-1)),m(\"strong\",null,H(n.type||\"mixed\"),1)]),n.example?(L(),N(\"span\",Ng,\"Example: \"+H(n.example),1)):dt(\"\",!0),n.description?(L(),N(\"span\",Bg,H(n.description),1)):dt(\"\",!0)])]))),128))])])):dt(\"\",!0)}},Vg=ne($g,[[\"__scopeId\",\"data-v-155d9b8e\"]]);let jg=0;const ai=et([]);function io(){const e=(s,n=\"success\",i=3e3)=>{const o=jg++,r={id:o,message:s,type:n,duration:i,visible:!0};return ai.value.push(r),setTimeout(()=>{t(o)},i),o},t=s=>{const n=ai.value.findIndex(i=>i.id===s);n>-1&&ai.value.splice(n,1)};return{toasts:ai,showToast:e,removeToast:t}}function Hg(){const{showToast:e}=io(),t=n=>{const i=document.createElement(\"textarea\");i.value=n,i.style.position=\"fixed\",i.style.left=\"-999999px\",document.body.appendChild(i),i.focus(),i.select();try{document.execCommand(\"copy\"),e(\"Response schema copied to clipboard!\",\"success\")}catch(o){e(\"Failed to copy response schema\",\"error\"),console.error(\"Fallback copy error:\",o)}document.body.removeChild(i)};return{copyToClipboard:n=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(n).then(()=>{e(\"Response schema copied to clipboard!\",\"success\")}).catch(i=>{e(\"Failed to copy response schema\",\"error\"),console.error(\"Clipboard API error:\",i),t(n)}):t(n)}}}const zg={class:\"section\"},Wg={class:\"request-tester\"},qg={class:\"input-group\"},Ug=[\"value\"],Kg={key:0,class:\"form-group\"},Gg={class:\"form-fields-container\"},Yg=[\"onUpdate:modelValue\",\"placeholder\"],Xg={key:1,class:\"form-group\"},Jg={class:\"form-fields-container\"},Qg={key:0,class:\"badge-required\"},Zg=[\"onUpdate:modelValue\",\"placeholder\"],tm={key:0,class:\"param-description\"},em={key:2,class:\"tester-tabs\"},sm={key:3,class:\"json-editor-container\"},nm={class:\"json-editor-header\"},im={class:\"json-editor-actions\"},om={key:0,class:\"saved-examples-panel\"},rm={key:0,class:\"no-examples\"},am={key:1,class:\"examples-list\"},lm={class:\"example-name\"},cm={class:\"example-timestamp\"},um={class:\"example-actions\"},hm=[\"onClick\"],dm=[\"onClick\"],fm=[\"onClick\"],pm={key:4,class:\"form-fields-container\"},gm={class:\"field-header-minimal\"},mm={class:\"field-label-minimal\"},bm={key:0,class:\"badge-required\"},_m=[\"onUpdate:modelValue\",\"type\",\"placeholder\"],ym=[\"disabled\"],xm={__name:\"RequestTester\",props:{requestBody:{type:String,default:\"{}\"},requestRules:{type:Object,default:null},sending:{type:Boolean,default:!1},route:{type:Object,default:null},pathParams:{type:Object,default:()=>({})},queryParams:{type:Object,default:()=>({})}},emits:[\"update:requestBody\",\"send-request\",\"update:pathParams\",\"update:queryParams\",\"update:queryParams\"],setup(e,{emit:t}){const{copyToClipboard:s}=Hg(),n=e,i=t,o=et(!0),r=et({}),a=et(n.pathParams);et(n.queryParams);const l=et(n.queryParams);et(n.queryParams);const c=et(\"{}\"),u=qt(()=>n.requestRules&&Object.keys(n.requestRules).length>0),h=qt(()=>{if(!n.route||!n.route.uri)return{};const k=n.route.uri.match(/{([^}]+)}/g);if(!k)return{};const P={};return k.forEach(C=>{const O=C.replace(/{|}/g,\"\");P[O]=n.pathParams[O]||\"\"}),P}),d=()=>{const k={};Object.keys(r.value).forEach(P=>{k[P]=r.value[P]}),c.value=JSON.stringify(k,null,2),i(\"update:requestBody\",c.value)},f=k=>{c.value=k,i(\"update:requestBody\",k)},p=et(!1),g=et([]),_=()=>{p.value=!p.value,p.value&&v()},b=async()=>{if(!n.route)return;const k=prompt(\"Enter a name for this example:\",\"Example \"+new Date().toLocaleTimeString());if(k)try{(await fetch(`${window.location.origin}/api/api-inspector-docs/save-request-example`,{method:\"POST\",headers:{\"Content-Type\":\"application/json\",\"X-Requested-With\":\"XMLHttpRequest\",\"X-CSRF-TOKEN\":document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute(\"content\")||\"\"},body:JSON.stringify({route_uri:n.route.uri,route_method:n.route.http_method,body:c.value,name:k})})).ok?(alert(\"Example saved successfully!\"),v()):alert(\"Failed to save example\")}catch(P){console.error(\"Error saving example:\",P),alert(\"Error saving example\")}},v=async()=>{if(n.route)try{const k=await fetch(`${window.location.origin}/api/api-inspector-docs/get-request-examples?uri=${encodeURIComponent(n.route.uri)}&method=${n.route.http_method}`,{headers:{\"X-Requested-With\":\"XMLHttpRequest\"}});if(k.ok){const P=await k.json();g.value=P.examples||[]}}catch(k){console.error(\"Error loading examples:\",k)}},M=k=>{c.value=k.body,i(\"update:requestBody\",k.body),p.value=!1},S=k=>{navigator.clipboard.writeText(k.body),alert(\"Example copied to clipboard!\")},w=async k=>{if(n.route&&confirm(\"Are you sure you want to delete this example?\"))try{const P=g.value[k];(await fetch(`${window.location.origin}/api/api-inspector-docs/delete-request-example`,{method:\"POST\",headers:{\"Content-Type\":\"application/json\",\"X-Requested-With\":\"XMLHttpRequest\",\"X-CSRF-TOKEN\":document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute(\"content\")||\"\"},body:JSON.stringify({route_uri:n.route.uri,route_method:n.route.http_method,index:k})})).ok?v():alert(\"Failed to delete example\")}catch(P){console.error(\"Error deleting example:\",P),alert(\"Error deleting example\")}},R=k=>k?new Date(k).toLocaleString():\"\";return Qe(()=>n.requestRules,k=>{if(k){const P={};Object.keys(k).forEach(C=>{P[C]=k[C].example||\"\"}),r.value=P}},{immediate:!0}),Qe(()=>n.requestBody,k=>{c.value=k||\"{}\"},{immediate:!0}),Qe(()=>n.queryParams,k=>{k&&(l.value={...k})},{immediate:!0}),to(()=>{v()}),(k,P)=>(L(),N(\"div\",zg,[P[13]||(P[13]=m(\"div\",{class:\"section-title\"},\"Send Request\",-1)),m(\"div\",Wg,[m(\"div\",null,[m(\"div\",qg,[m(\"input\",{type:\"text\",value:e.route?e.route.uri:\"\",disabled:\"\",class:\"input-with-icon\"},null,8,Ug),m(\"button\",{class:\"copy-icon\",title:\"Copy Endpoint URL\",onClick:P[0]||(P[0]=C=>_e(s)(e.route?e.route.uri:\"\"))},[...P[8]||(P[8]=[m(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"20\",height:\"20\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",class:\"feather feather-copy\"},[m(\"rect\",{x:\"9\",y:\"9\",width:\"13\",height:\"13\",rx:\"2\",ry:\"2\"}),m(\"path\",{d:\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"})],-1)])])])]),h.value&&Object.keys(h.value).length>0?(L(),N(\"div\",Kg,[P[9]||(P[9]=m(\"label\",null,[m(\"strong\",null,\"Path Parameters\")],-1)),m(\"div\",Gg,[(L(!0),N(ut,null,Vt(h.value,(C,O)=>(L(),N(\"div\",{key:O,class:\"form-group\"},[m(\"label\",null,H(O),1),se(m(\"input\",{\"onUpdate:modelValue\":B=>a.value[O]=B,type:\"text\",placeholder:`Enter ${O}`,onInput:P[1]||(P[1]=B=>k.$emit(\"update:pathParams\",a.value))},null,40,Yg),[[Ls,a.value[O]]])]))),128))])])):dt(\"\",!0),Object.keys(l.value).length>0?(L(),N(\"div\",Xg,[P[10]||(P[10]=m(\"label\",null,[m(\"strong\",null,\"Query Parameters\")],-1)),m(\"div\",Jg,[(L(!0),N(ut,null,Vt(l.value,(C,O)=>(L(),N(\"div\",{key:O,class:\"form-group\"},[m(\"label\",null,[me(H(O)+\" \",1),C.required?(L(),N(\"span\",Qg,\"REQUIRED\")):dt(\"\",!0)]),se(m(\"input\",{\"onUpdate:modelValue\":B=>l.value[O]=B,type:\"text\",placeholder:`Enter ${O}`,onInput:P[2]||(P[2]=B=>k.$emit(\"update:queryParams\",l.value))},null,40,Zg),[[Ls,l.value[O]]]),C.description?(L(),N(\"div\",tm,H(C.description),1)):dt(\"\",!0)]))),128))])])):dt(\"\",!0),u.value?(L(),N(\"div\",em,[m(\"button\",{class:kt([\"tab-btn\",{active:o.value}]),onClick:P[3]||(P[3]=C=>o.value=!0)},\" JSON \",2),u.value?(L(),N(\"button\",{key:0,class:kt([\"tab-btn\",{active:!o.value}]),onClick:P[4]||(P[4]=C=>o.value=!1)},\" Form \",2)):dt(\"\",!0)])):dt(\"\",!0),o.value&&u.value?(L(),N(\"div\",sm,[m(\"div\",nm,[P[11]||(P[11]=m(\"label\",null,[m(\"strong\",null,\"Request Body (JSON)\")],-1)),m(\"div\",im,[m(\"button\",{class:\"btn-small\",onClick:_,title:\"Manage saved examples\"},\" 📋 \"+H(g.value.length),1)])]),p.value?(L(),N(\"div\",om,[m(\"div\",{class:\"saved-examples-header\"},[P[12]||(P[12]=m(\"h4\",null,\"Saved Examples\",-1)),m(\"button\",{class:\"btn-close\",onClick:_},\"✕\")]),g.value.length===0?(L(),N(\"div\",rm,\" No saved examples yet. Save your first example below! \")):(L(),N(\"div\",am,[(L(!0),N(ut,null,Vt(g.value,(C,O)=>(L(),N(\"div\",{key:O,class:\"example-item\"},[m(\"div\",lm,H(C.name),1),m(\"div\",cm,H(R(C.timestamp)),1),m(\"div\",um,[m(\"button\",{class:\"btn-action\",onClick:B=>M(C),title:\"Load example\"},\"📥\",8,hm),m(\"button\",{class:\"btn-action\",onClick:B=>S(C),title:\"Copy to clipboard\"},\"📋\",8,dm),m(\"button\",{class:\"btn-action btn-delete\",onClick:B=>w(O),title:\"Delete\"},\"🗑️\",8,fm)])]))),128))]))])):dt(\"\",!0),se(m(\"textarea\",{\"onUpdate:modelValue\":P[5]||(P[5]=C=>c.value=C),class:\"json-editor\",rows:\"8\",placeholder:\"{}\",onInput:P[6]||(P[6]=C=>f(C.target.value))},null,544),[[Ls,c.value]]),m(\"div\",{class:\"json-editor-footer\"},[m(\"button\",{class:\"btn-secondary\",onClick:b,title:\"Save current JSON as example\"},\" 💾 Save as Example \")])])):(L(),N(\"div\",pm,[(L(!0),N(ut,null,Vt(e.requestRules,(C,O)=>(L(),N(\"div\",{key:O,class:\"form-field-minimal\"},[m(\"div\",gm,[m(\"label\",mm,[me(H(O)+\" \",1),C.required?(L(),N(\"span\",bm,\"REQUIRED\")):dt(\"\",!0)])]),se(m(\"input\",{\"onUpdate:modelValue\":B=>r.value[O]=B,type:k.text,placeholder:`Enter ${O}`,class:\"input-minimal\",onInput:d},null,40,_m),[[xp,r.value[O]]])]))),128))])),m(\"button\",{class:\"btn\",disabled:e.sending,onClick:P[7]||(P[7]=C=>k.$emit(\"send-request\"))},H(e.sending?\"Sending...\":\"Send Request\"),9,ym)])]))}},vm=ne(xm,[[\"__scopeId\",\"data-v-def58604\"]]),wm={key:0,class:\"section\"},Sm={class:\"bg-white\",style:{border:\"1px solid #e0e0e0\",\"border-radius\":\"4px\",padding:\"15px\",position:\"relative\"}},km={style:{padding:\"10px\",\"border-radius\":\"4px\",\"overflow-x\":\"auto\",cursor:\"pointer\",margin:\"0\"},title:\"Click to copy\"},Mm={key:1,class:\"section\"},Cm={__name:\"ResponseSchema\",props:{schema:{type:Object,default:null}},setup(e){const{showToast:t}=useToast(),s=e;et(!1),et(\"Copy schema to clipboard\");const n=r=>{const a=[\"resource_class\"],l={};return Object.keys(r).forEach(c=>{if(a.includes(c))return;const u=r[c];typeof u==\"object\"&&u!==null&&u.schema&&typeof u.schema==\"object\"?l[c]=n(u.schema):typeof u==\"object\"&&u!==null?l[c]=n(u):l[c]=u}),l},i=r=>{const a=document.createElement(\"textarea\");a.value=r,a.style.position=\"fixed\",a.style.left=\"-999999px\",document.body.appendChild(a),a.focus(),a.select();try{document.execCommand(\"copy\"),t(\"Response schema copied to clipboard!\",\"success\")}catch(l){t(\"Failed to copy response schema\",\"error\"),console.error(\"Fallback copy error:\",l)}document.body.removeChild(a)},o=()=>{const r=JSON.stringify(n(s.schema),null,2);navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(r).then(()=>{t(\"Response schema copied to clipboard!\",\"success\")}).catch(a=>{t(\"Failed to copy response schema\",\"error\"),console.error(\"Clipboard API error:\",a),i(r)}):i(r)};return(r,a)=>e.schema&&e.schema.data&&Object.keys(e.schema.data).length>0?(L(),N(\"div\",wm,[a[0]||(a[0]=m(\"div\",{class:\"section-title\"},\"Response Schema\",-1)),m(\"div\",Sm,[m(\"button\",{onClick:o,class:\"pre-copy-icon\",title:\"Copy JSON schema\"},\"📋\"),m(\"pre\",km,H(JSON.stringify(n(e.schema),null,2)),1)])])):(L(),N(\"div\",Mm,[...a[1]||(a[1]=[m(\"div\",null,\"No response schema available.\",-1)])]))}},Pm=ne(Cm,[[\"__scopeId\",\"data-v-4a3ad82c\"]]),Am={key:0,class:\"section\"},Rm={class:\"response-section\"},Om={class:\"response-code\"},Tm={__name:\"ResponseViewer\",props:{response:{type:Object,default:null}},emits:[\"save-response\"],setup(e){const t=n=>({200:\"OK\",201:\"Created\",204:\"No Content\",400:\"Bad Request\",401:\"Unauthorized\",403:\"Forbidden\",404:\"Not Found\",500:\"Internal Server Error\"})[n]||\"Unknown\",s=n=>{if(typeof n==\"string\")try{return JSON.stringify(JSON.parse(n),null,2)}catch{return n}return JSON.stringify(n,null,2)};return(n,i)=>e.response?(L(),N(\"div\",Am,[i[1]||(i[1]=m(\"div\",{class:\"section-title\"},\"Response\",-1)),m(\"div\",Rm,[m(\"div\",{class:kt([\"response-status\",e.response.status<400?\"success\":\"error\"])},\" Status: \"+H(e.response.status)+\" \"+H(t(e.response.status)),3),m(\"div\",Om,H(s(e.response.data)),1),e.response?.is_saved?dt(\"\",!0):(L(),N(\"button\",{key:0,class:\"btn\",style:{\"margin-top\":\"15px\"},onClick:i[0]||(i[0]=o=>n.$emit(\"save-response\"))},\" Save Response \"))])])):dt(\"\",!0)}},Em=ne(Tm,[[\"__scopeId\",\"data-v-ab00471f\"]]),Dm={key:0,class:\"section\"},Im={class:\"saved-responses\"},Lm=[\"onClick\"],Fm={class:\"saved-response-time\"},Nm=[\"onClick\"],Bm={__name:\"SavedResponses\",props:{responses:{type:Array,default:()=>[]},route:{type:Object,default:null}},emits:[\"view-response\",\"delete-response\"],setup(e,{emit:t}){const s=e,n=t,{showToast:i}=io(),o=async r=>{if(s.route)try{(await fetch(`${window.location.origin}/api/api-inspector-docs/delete-response`,{method:\"DELETE\",headers:{\"Content-Type\":\"application/json\",\"X-Requested-With\":\"XMLHttpRequest\",\"X-CSRF-TOKEN\":document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute(\"content\")||\"\"},body:JSON.stringify({route_uri:s.route.uri,route_method:s.route.http_method,index:r})})).ok?(n(\"delete-response\",r),i(\"Response deleted successfully\",\"success\")):i(\"Failed to delete response\",\"error\")}catch(a){console.error(\"Error deleting response:\",a),i(\"Error deleting response\",\"error\")}};return(r,a)=>e.responses&&e.responses.length>0?(L(),N(\"div\",Dm,[a[0]||(a[0]=m(\"div\",{class:\"section-title\"},\"Saved Responses History\",-1)),m(\"div\",Im,[(L(!0),N(ut,null,Vt(e.responses,(l,c)=>(L(),N(\"div\",{key:c,class:\"saved-response-item\"},[m(\"div\",{class:\"saved-response-content\",onClick:u=>r.$emit(\"view-response\",{is_saved:!0,...l})},[m(\"div\",null,[m(\"strong\",null,\"Response \"+H(e.responses.length-c),1)]),m(\"div\",Fm,H(new Date(l.timestamp).toLocaleString()),1)],8,Lm),m(\"button\",{class:\"delete-btn\",onClick:u=>o(c),title:\"Delete this response\"},\" ✕ \",8,Nm)]))),128))])])):dt(\"\",!0)}},$m=ne(Bm,[[\"__scopeId\",\"data-v-2e6a99d1\"]]),Vm={class:\"tabs-component\"},jm={class:\"tab-header\"},Hm=[\"onClick\"],zm={class:\"tab-body\"},Wm={__name:\"Tabs\",props:{tabs:{type:Array,required:!0},modelValue:{type:Number,default:0}},emits:[\"update:modelValue\"],setup(e){return(t,s)=>(L(),N(\"div\",Vm,[m(\"div\",jm,[(L(!0),N(ut,null,Vt(e.tabs,(n,i)=>(L(),N(\"button\",{key:i,class:kt([\"tab\",{active:e.modelValue===i}]),onClick:o=>t.$emit(\"update:modelValue\",i)},H(n),11,Hm))),128))]),m(\"div\",zm,[df(t.$slots,\"default\",{activeTab:e.modelValue},void 0)])]))}},qm=ne(Wm,[[\"__scopeId\",\"data-v-cbcf88f8\"]]),Um={class:\"api-info-container\"},Km={key:0,class:\"info-section\"},Gm={class:\"info-group\"},Ym={class:\"info-value\"},Xm={class:\"info-group\"},Jm={class:\"info-value\"},Qm={class:\"info-group\"},Zm={class:\"info-value\"},tb={key:0,class:\"info-group\"},eb={class:\"info-value middlewares-value\"},sb={class:\"info-group\"},nb={class:\"info-link\"},ib={class:\"collapsible-content\"},ob={class:\"response-codes-list\"},rb={key:0,class:\"empty-content\"},ab={class:\"info-group\"},lb={class:\"info-link\"},cb={class:\"collapsible-content\"},ub={class:\"curl-command\"},hb={readonly:\"\",rows:\"6\"},db={__name:\"ApiInfo\",props:{apiInfo:{type:Object,default:null},requestRules:{type:Object,default:null},parameters:{type:Object,default:null}},setup(e){const{showToast:t}=useToast(),s=e,n=et(!1),i=et({statusCodes:!1,curl:!1}),o=h=>{i.value[h]=!i.value[h]},r=qt(()=>{if(!s.apiInfo)return\"\";const h=s.apiInfo.http_method||\"GET\";let d=s.apiInfo.uri||\"/\";const f=window.location.origin,p=d.match(/{([^}]+)}/g)||[],g={};p.forEach(S=>{const w=S.replace(/{|}/g,\"\");g[w]=`{${w}}`});let _=`${f}${d}`;s.parameters&&typeof s.parameters==\"object\"&&Object.keys(s.parameters).forEach(S=>{_=_.replace(`{${S}}`,`{${S}}`)});let b=`curl \\\\\n -X ${h} \\\\\n`;b+=` -H \"Content-Type: application/json\" \\\\\n`,b+=` -H \"Accept: application/json\" \\\\\n`,p.length>0&&(b+=` -H \"# Path Parameters:\" \\\\\n`,Object.keys(g).forEach(S=>{b+=` -H \"# ${S}: <value>\" \\\\\n`})),b+=` \"${_}\"`;const v=[];if(s.requestRules&&Object.entries(s.requestRules).forEach(([S,w])=>{(h===\"GET\"||h===\"DELETE\")&&v.push({name:S,example:w.example||\"\"})}),v.length>0&&(h===\"GET\"||h===\"DELETE\")&&(b+=\"?\",v.forEach((S,w)=>{b+=`${S.name}=${S.example||\"value\"}`,w<v.length-1&&(b+=\"&\")})),[\"POST\",\"PUT\",\"PATCH\"].includes(h.toUpperCase())){if(b+=` \\\\\n -d '{\n`,s.requestRules&&Object.keys(s.requestRules).length>0){const S=Object.entries(s.requestRules);S.forEach(([w,R],k)=>{const P=R.example||\"\",C=typeof P==\"string\"?`\"${P}\"`:P;b+=`  \"${w}\": ${C}`,k<S.length-1?b+=`,\n`:b+=`\n`})}b+=\"}'\"}return b}),a=h=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(h).then(()=>{t(\"Curl command copied to clipboard!\",\"success\")}).catch(d=>{t(\"Failed to copy curl command\",\"error\"),n.value=!0,console.error(\"Clipboard API error:\",d),u(h)}):u(h)},l={200:\"OK\",201:\"Created\",204:\"No Content\",400:\"Bad Request\",401:\"Unauthorized\",403:\"Forbidden\",404:\"Not Found\",405:\"Method Not Allowed\",409:\"Conflict\",422:\"Unprocessable Entity\",429:\"Too Many Requests\",500:\"Internal Server Error\",502:\"Bad Gateway\",503:\"Service Unavailable\"},c=h=>l[h]||\"Unknown Status\",u=h=>{try{const d=document.createElement(\"textarea\");d.value=h,d.style.position=\"fixed\",d.style.opacity=\"0\",d.style.pointerEvents=\"none\",document.body.appendChild(d),d.select(),d.setSelectionRange(0,99999),document.execCommand(\"copy\")?t(\"Curl command copied to clipboard!\",\"success\"):(t(\"Failed to copy curl command\",\"error\"),n.value=!0),document.body.removeChild(d)}catch(d){console.error(\"Fallback copy error:\",d),t(\"Could not copy curl command. Please try again.\",\"error\")}};return(h,d)=>(L(),N(\"div\",Um,[e.apiInfo?(L(),N(\"div\",Km,[m(\"div\",Gm,[d[3]||(d[3]=m(\"div\",{class:\"info-label\"},\"Method\",-1)),m(\"div\",Ym,[m(\"span\",{class:kt([\"method-badge\",`method-${(e.apiInfo.http_method||\"GET\").toLowerCase()}`])},H(e.apiInfo.http_method),3)])]),m(\"div\",Xm,[d[4]||(d[4]=m(\"div\",{class:\"info-label\"},\"Controller\",-1)),m(\"div\",Jm,H(e.apiInfo.controller||\"-\"),1)]),m(\"div\",Qm,[d[5]||(d[5]=m(\"div\",{class:\"info-label\"},\"Function\",-1)),m(\"div\",Zm,H(e.apiInfo.method||\"-\"),1)]),e.apiInfo.middleware&&e.apiInfo.middleware.length>0?(L(),N(\"div\",tb,[d[6]||(d[6]=m(\"div\",{class:\"info-label\"},\"Middlewares\",-1)),m(\"div\",eb,[(L(!0),N(ut,null,Vt(e.apiInfo.middleware,(f,p)=>(L(),N(\"span\",{key:p,class:\"middleware-badge\"},H(f),1))),128))])])):dt(\"\",!0),m(\"div\",sb,[d[7]||(d[7]=m(\"div\",{class:\"info-label\"},\"Status Codes\",-1)),m(\"div\",nb,[m(\"div\",null,[m(\"span\",{class:kt([\"arrow\",{expanded:i.value.statusCodes}])},\"›\",2),m(\"span\",{onClick:d[0]||(d[0]=f=>o(\"statusCodes\"))},H(i.value.statusCodes?\"Hide\":\"Show\")+\" Response codes for this request\",1),se(m(\"div\",ib,[m(\"div\",ob,[(L(!0),N(ut,null,Vt(e.apiInfo.responses||[],f=>(L(),N(\"div\",{key:f,class:kt([\"response\",`response-${f}`])},\" - \"+H(f)+\"   \"+H(c(f)),3))),128))]),!e.apiInfo.responses||e.apiInfo.responses.length===0?(L(),N(\"div\",rb,\" No response codes defined \")):dt(\"\",!0)],512),[[Ts,i.value.statusCodes]])])])]),m(\"div\",ab,[d[8]||(d[8]=m(\"div\",{class:\"info-label\"},\"Curl\",-1)),m(\"div\",lb,[m(\"div\",null,[m(\"span\",{class:kt([\"arrow\",{expanded:i.value.curl}])},\"›\",2),m(\"span\",{onClick:d[1]||(d[1]=f=>o(\"curl\"))},H(i.value.curl?\"Hide\":\"Show\")+\" curl command\",1),se(m(\"div\",cb,[m(\"div\",ub,[m(\"div\",null,[m(\"textarea\",hb,H(r.value),1)]),m(\"button\",{class:\"copy-btn\",onClick:d[2]||(d[2]=f=>a(r.value))},\"Copy\")])],512),[[Ts,i.value.curl]])])])])])):dt(\"\",!0)]))}},fb=ne(db,[[\"__scopeId\",\"data-v-8f8eb8b4\"]]),pb={class:\"endpoint-detail\"},gb={class:\"detail-body\"},mb={class:\"detail-body-left\"},bb={class:\"detail-body-right\"},_b={class:\"tab-content\"},yb={key:1,class:\"empty-state\"},xb={key:1},vb={class:\"tab-content\"},wb={key:1,class:\"empty-state\"},Sb={class:\"tab-content\"},kb={key:1,class:\"empty-state\"},Mb={class:\"tab-content\"},Cb={key:1,class:\"empty-state\"},Pb={class:\"tab-content\"},Ab={__name:\"EndpointDetail\",props:{route:{type:Object,required:!0},requestBody:{type:String,default:\"{}\"},lastResponse:{type:Object,default:null},savedResponses:{type:Array,default:()=>[]},sending:{type:Boolean,default:!1},pathParams:{type:Object,default:()=>({})},queryParams:{type:Object,default:()=>({})}},emits:[\"update:requestBody\",\"send-request\",\"save-response\",\"view-response\",\"update:pathParams\",\"update:queryParams\",\"delete-response\"],setup(e){const t=e,s=et(0);return Qe(()=>t.lastResponse,n=>{n&&(s.value=1)}),(n,i)=>(L(),N(\"div\",pb,[Pt(Sg,{route:e.route},null,8,[\"route\"]),m(\"div\",gb,[m(\"div\",mb,[Pt(Og,{parameters:e.route.parameters},null,8,[\"parameters\"]),Pt(vm,{\"request-body\":e.requestBody,\"request-rules\":e.route.request_rules,sending:e.sending,route:e.route,\"path-params\":e.pathParams,\"query-params\":e.queryParams,\"onUpdate:requestBody\":i[0]||(i[0]=o=>n.$emit(\"update:requestBody\",o)),onSendRequest:i[1]||(i[1]=o=>n.$emit(\"send-request\")),\"onUpdate:pathParams\":i[2]||(i[2]=o=>n.$emit(\"update:pathParams\",o)),\"onUpdate:queryParams\":i[3]||(i[3]=o=>n.$emit(\"update:queryParams\",o))},null,8,[\"request-body\",\"request-rules\",\"sending\",\"route\",\"path-params\",\"query-params\"])]),m(\"div\",bb,[Pt(qm,{modelValue:s.value,\"onUpdate:modelValue\":i[7]||(i[7]=o=>s.value=o),tabs:[\"Request Body\",\"Response\",\"Saved Responses\",\"Response Schema\",\"Info\"]},{default:Er(({activeTab:o})=>[se(m(\"div\",_b,[e.route.request_rules&&Object.keys(e.route.request_rules).length>0?(L(),Ie(Vg,{key:0,\"request-rules\":e.route.request_rules},null,8,[\"request-rules\"])):(L(),N(\"div\",yb,[i[10]||(i[10]=m(\"div\",{class:\"empty-state-icon\"},\"📄\",-1)),e.route.http_method!==\"GET\"&&e.route.http_method!==\"DELETE\"?(L(),N(ut,{key:0},[i[8]||(i[8]=m(\"p\",null,\"Request body not available!\",-1)),i[9]||(i[9]=m(\"p\",null,\"Please use the request rules for expected payload.\",-1))],64)):dt(\"\",!0),e.route.http_method===\"GET\"?(L(),N(\"p\",xb,\" This endpoint does not accept a request body. \")):dt(\"\",!0)]))],512),[[Ts,o===0]]),se(m(\"div\",vb,[e.lastResponse?(L(),Ie(Em,{key:0,response:e.lastResponse,schema:e.route.response_schema,onSaveResponse:i[4]||(i[4]=r=>n.$emit(\"save-response\"))},null,8,[\"response\",\"schema\"])):(L(),N(\"div\",wb,[...i[11]||(i[11]=[m(\"div\",{class:\"empty-state-icon\"},\"📄\",-1),m(\"p\",null,\"Send a request to see the response\",-1)])]))],512),[[Ts,o===1]]),se(m(\"div\",Sb,[e.savedResponses&&e.savedResponses.length>0?(L(),Ie($m,{key:0,responses:e.savedResponses,route:e.route,onViewResponse:i[5]||(i[5]=r=>n.$emit(\"view-response\",r)),onDeleteResponse:i[6]||(i[6]=r=>n.$emit(\"delete-response\",r))},null,8,[\"responses\",\"route\"])):(L(),N(\"div\",kb,[...i[12]||(i[12]=[m(\"div\",{class:\"empty-state-icon\"},\"📄\",-1),m(\"p\",null,\"Saved responses empty!\",-1)])]))],512),[[Ts,o===2]]),se(m(\"div\",Mb,[e.route.response_schema&&Object.keys(e.route.response_schema).length>0?(L(),Ie(Pm,{key:0,schema:e.route.response_schema},null,8,[\"schema\"])):(L(),N(\"div\",Cb,[...i[13]||(i[13]=[m(\"div\",{class:\"empty-state-icon\"},\"📄\",-1),m(\"p\",{class:\"text-center\"},\"Response schema not available!\",-1),m(\"p\",{class:\"text-center\"},\"Please use the resource class to define the response schema.\",-1)])]))],512),[[Ts,o===3]]),se(m(\"div\",Pb,[Pt(fb,{\"api-info\":e.route,\"request-rules\":e.route.request_rules,parameters:e.route.parameters},null,8,[\"api-info\",\"request-rules\",\"parameters\"])],512),[[Ts,o===4]])]),_:1},8,[\"modelValue\"])])])]))}},Rb=ne(Ab,[[\"__scopeId\",\"data-v-d0e6e422\"]]),Ob={class:\"app-container\"},Tb={class:\"main-container\"},Eb={class:\"content\"},Db={key:1,class:\"empty-state\"},Ib={class:\"text-center mb-4\"},Lb={class:\"fs-small\"},Fb={__name:\"Home\",setup(e){const t=et(!0),s=et(!1),n=et({routes:[],...window.ApiInspector}),i=et(null),o=et(\"{}\"),r=et(null),a=et([]),l=et(localStorage.getItem(\"api-docs-auth-token\")||\"\"),c=et({}),u=et({}),{showToast:h}=useToast(),{menus:d}=Hu(),f=qt(()=>n.value.routes?n.value.routes.reduce((w,R)=>{const k=R.group||\"Other\";return w[k]||(w[k]=[]),w[k].push(R),w},{}):{}),p=async()=>{try{t.value=!0;const w=await fetch(`${window.location.origin}/api/api-inspector-docs?groupBy=api_uri`,{headers:{\"X-Requested-With\":\"XMLHttpRequest\",Authorization:l.value?`Bearer ${l.value}`:\"\"}});if(!w.ok)throw new Error(`HTTP error! status: ${w.status}`);const R=await w.json();n.value={routes:R.routes||[],title:R.title||window.apiInspector?.title||\"API Documentation\",version:R.version||\"1.0.0\"}}catch(w){console.error(\"Error fetching API data:\",w),n.value={routes:[],title:\"Error\",version:\"1.0.0\"}}finally{t.value=!1}},g=w=>{if(i.value=JSON.parse(JSON.stringify(w)),w.request_rules&&Object.keys(w.request_rules).length>0){const R={};Object.keys(w.request_rules).forEach(k=>{R[k]=w.request_rules[k].example||\"\"}),o.value=JSON.stringify(R,null,2)}else o.value=\"{}\";w.parameters&&Object.keys(w.parameters).length>0?(c.value={},Object.keys(w.parameters).forEach(R=>{c.value[R]=\"\"})):c.value={},w.query_params&&Object.keys(w.query_params).length>0?(u.value={},Object.keys(w.query_params).forEach(R=>{u.value[R]=\"\"})):u.value={},r.value=null,v()},_=async()=>{if(!i.value)return;const w=Object.entries(c.value).filter(([R,k])=>!k||k.trim()===\"\");if(w.length>0){const R=w.map(([k])=>k).join(\", \");h(`Required path parameters missing: ${R}`,\"error\");return}try{s.value=!0;let R=i.value.uri;Object.keys(c.value).forEach(at=>{R=R.replace(`{${at}}`,c.value[at])}),R=R.split(\"?\")[0];const k=Object.entries(u.value).filter(([at,Ct])=>Ct&&Ct.trim()!==\"\").map(([at,Ct])=>`${encodeURIComponent(at)}=${encodeURIComponent(Ct)}`).join(\"&\");k&&(R=R+\"?\"+k);const P=`${window.location.origin}/${R.replace(/^\\//,\"\")}`,C={method:i.value.http_method,headers:{\"Content-Type\":\"application/json\",Accept:\"application/json\",\"X-Requested-With\":\"XMLHttpRequest\",\"X-CSRF-TOKEN\":document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute(\"content\")||\"\"}};l.value&&(C.headers.Authorization=`Bearer ${l.value}`),i.value.http_method!==\"GET\"&&i.value.http_method!==\"HEAD\"&&(C.body=o.value);const O=await fetch(P,C),B=O.headers.get(\"content-type\");let U=\"\";B?.includes(\"application/json\")?U=await O.json():U=await O.text(),r.value={status:O.status,data:U,timestamp:new Date().toISOString()}}catch(R){console.error(\"Error sending request:\",R),r.value={status:0,data:`Error: ${R.message}`,timestamp:new Date().toISOString()}}finally{s.value=!1}},b=async()=>{if(!(!i.value||!r.value))try{(await fetch(`${window.location.origin}/api/api-inspector-docs/save-response`,{method:\"POST\",headers:{\"Content-Type\":\"application/json\",\"X-Requested-With\":\"XMLHttpRequest\",\"X-CSRF-TOKEN\":document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute(\"content\")||\"\"},body:JSON.stringify({route_uri:i.value.uri,route_method:i.value.http_method,response:r.value.data,status:r.value.status})})).ok?(v(),h(\"Response saved successfully!\",\"success\")):h(\"Failed to save response\",\"error\")}catch(w){console.error(\"Error saving response:\",w),h(\"Error saving response\",\"error\")}},v=async()=>{if(i.value)try{const w=await fetch(`${window.location.origin}/api/api-inspector-docs/get-saved-responses?uri=${encodeURIComponent(i.value.uri)}&method=${i.value.http_method}`,{headers:{\"X-Requested-With\":\"XMLHttpRequest\"}});if(w.ok){const R=await w.json();a.value=R.responses||[]}}catch(w){console.error(\"Error loading saved responses:\",w)}},M=w=>{r.value=w},S=w=>{a.value.length>w&&a.value.splice(w,1)};return Qe(l,w=>{w?localStorage.setItem(\"api-docs-auth-token\",w):localStorage.removeItem(\"api-docs-auth-token\")}),to(()=>{p()}),(w,R)=>(L(),N(\"div\",Ob,[Pt(zu,{\"api-data\":n.value,loading:t.value,\"auth-token\":l.value,menus:_e(d),onRefresh:p,\"onUpdate:authToken\":R[0]||(R[0]=k=>l.value=k)},null,8,[\"api-data\",\"loading\",\"auth-token\",\"menus\"]),m(\"div\",Tb,[Pt(gg,{\"grouped-routes\":f.value,\"selected-route\":i.value,onSelectEndpoint:g},null,8,[\"grouped-routes\",\"selected-route\"]),m(\"div\",Eb,[i.value?(L(),Ie(Rb,{key:0,route:i.value,\"request-body\":o.value,\"last-response\":r.value,\"saved-responses\":a.value,sending:s.value,\"path-params\":c.value,\"query-params\":u.value,\"onUpdate:requestBody\":R[1]||(R[1]=k=>o.value=k),onSendRequest:_,onSaveResponse:b,onViewResponse:M,\"onUpdate:pathParams\":R[2]||(R[2]=k=>c.value=k),\"onUpdate:queryParams\":R[3]||(R[3]=k=>u.value=k),onDeleteResponse:S},null,8,[\"route\",\"request-body\",\"last-response\",\"saved-responses\",\"sending\",\"path-params\",\"query-params\"])):(L(),N(\"div\",Db,[R[6]||(R[6]=m(\"div\",{class:\"empty-state-icon\"},\"🚀\",-1)),m(\"div\",Ib,[m(\"h4\",null,\"Welcome to \"+H(n.value.title),1),R[4]||(R[4]=m(\"p\",{class:\"fs-small\"},[m(\"strong\",null,\"Laravel API Inspector\"),me(\" automatically generates API documentation from your Laravel routes,\")],-1)),R[5]||(R[5]=m(\"p\",{class:\"fs-small\"},\" FormRequest validation rules, and API Resources. It's like Postman + Swagger combined, but deeply integrated with Laravel.\",-1)),m(\"p\",Lb,\"Version: \"+H(n.value.version),1)]),R[7]||(R[7]=m(\"p\",null,\"Select an endpoint from the sidebar to get started\",-1))]))])])]))}},Nb=ne(Fb,[[\"__scopeId\",\"data-v-0a7e40cc\"]]);function ti(e){return e+.5|0}const us=(e,t,s)=>Math.max(Math.min(e,s),t);function vn(e){return us(ti(e*2.55),0,255)}function gs(e){return us(ti(e*255),0,255)}function We(e){return us(ti(e/2.55)/100,0,1)}function Wa(e){return us(ti(e*100),0,100)}const ge={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},nr=[...\"0123456789ABCDEF\"],Bb=e=>nr[e&15],$b=e=>nr[(e&240)>>4]+nr[e&15],li=e=>(e&240)>>4===(e&15),Vb=e=>li(e.r)&&li(e.g)&&li(e.b)&&li(e.a);function jb(e){var t=e.length,s;return e[0]===\"#\"&&(t===4||t===5?s={r:255&ge[e[1]]*17,g:255&ge[e[2]]*17,b:255&ge[e[3]]*17,a:t===5?ge[e[4]]*17:255}:(t===7||t===9)&&(s={r:ge[e[1]]<<4|ge[e[2]],g:ge[e[3]]<<4|ge[e[4]],b:ge[e[5]]<<4|ge[e[6]],a:t===9?ge[e[7]]<<4|ge[e[8]]:255})),s}const Hb=(e,t)=>e<255?t(e):\"\";function zb(e){var t=Vb(e)?Bb:$b;return e?\"#\"+t(e.r)+t(e.g)+t(e.b)+Hb(e.a,t):void 0}const Wb=/^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;function Wu(e,t,s){const n=t*Math.min(s,1-s),i=(o,r=(o+e/30)%12)=>s-n*Math.max(Math.min(r-3,9-r,1),-1);return[i(0),i(8),i(4)]}function qb(e,t,s){const n=(i,o=(i+e/60)%6)=>s-s*t*Math.max(Math.min(o,4-o,1),0);return[n(5),n(3),n(1)]}function Ub(e,t,s){const n=Wu(e,1,.5);let i;for(t+s>1&&(i=1/(t+s),t*=i,s*=i),i=0;i<3;i++)n[i]*=1-t-s,n[i]+=t;return n}function Kb(e,t,s,n,i){return e===i?(t-s)/n+(t<s?6:0):t===i?(s-e)/n+2:(e-t)/n+4}function Br(e){const s=e.r/255,n=e.g/255,i=e.b/255,o=Math.max(s,n,i),r=Math.min(s,n,i),a=(o+r)/2;let l,c,u;return o!==r&&(u=o-r,c=a>.5?u/(2-o-r):u/(o+r),l=Kb(s,n,i,u,o),l=l*60+.5),[l|0,c||0,a]}function $r(e,t,s,n){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,s,n)).map(gs)}function Vr(e,t,s){return $r(Wu,e,t,s)}function Gb(e,t,s){return $r(Ub,e,t,s)}function Yb(e,t,s){return $r(qb,e,t,s)}function qu(e){return(e%360+360)%360}function Xb(e){const t=Wb.exec(e);let s=255,n;if(!t)return;t[5]!==n&&(s=t[6]?vn(+t[5]):gs(+t[5]));const i=qu(+t[2]),o=+t[3]/100,r=+t[4]/100;return t[1]===\"hwb\"?n=Gb(i,o,r):t[1]===\"hsv\"?n=Yb(i,o,r):n=Vr(i,o,r),{r:n[0],g:n[1],b:n[2],a:s}}function Jb(e,t){var s=Br(e);s[0]=qu(s[0]+t),s=Vr(s),e.r=s[0],e.g=s[1],e.b=s[2]}function Qb(e){if(!e)return;const t=Br(e),s=t[0],n=Wa(t[1]),i=Wa(t[2]);return e.a<255?`hsla(${s}, ${n}%, ${i}%, ${We(e.a)})`:`hsl(${s}, ${n}%, ${i}%)`}const qa={x:\"dark\",Z:\"light\",Y:\"re\",X:\"blu\",W:\"gr\",V:\"medium\",U:\"slate\",A:\"ee\",T:\"ol\",S:\"or\",B:\"ra\",C:\"lateg\",D:\"ights\",R:\"in\",Q:\"turquois\",E:\"hi\",P:\"ro\",O:\"al\",N:\"le\",M:\"de\",L:\"yello\",F:\"en\",K:\"ch\",G:\"arks\",H:\"ea\",I:\"ightg\",J:\"wh\"},Ua={OiceXe:\"f0f8ff\",antiquewEte:\"faebd7\",aqua:\"ffff\",aquamarRe:\"7fffd4\",azuY:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"0\",blanKedOmond:\"ffebcd\",Xe:\"ff\",XeviTet:\"8a2be2\",bPwn:\"a52a2a\",burlywood:\"deb887\",caMtXe:\"5f9ea0\",KartYuse:\"7fff00\",KocTate:\"d2691e\",cSO:\"ff7f50\",cSnflowerXe:\"6495ed\",cSnsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"ffff\",xXe:\"8b\",xcyan:\"8b8b\",xgTMnPd:\"b8860b\",xWay:\"a9a9a9\",xgYF:\"6400\",xgYy:\"a9a9a9\",xkhaki:\"bdb76b\",xmagFta:\"8b008b\",xTivegYF:\"556b2f\",xSange:\"ff8c00\",xScEd:\"9932cc\",xYd:\"8b0000\",xsOmon:\"e9967a\",xsHgYF:\"8fbc8f\",xUXe:\"483d8b\",xUWay:\"2f4f4f\",xUgYy:\"2f4f4f\",xQe:\"ced1\",xviTet:\"9400d3\",dAppRk:\"ff1493\",dApskyXe:\"bfff\",dimWay:\"696969\",dimgYy:\"696969\",dodgerXe:\"1e90ff\",fiYbrick:\"b22222\",flSOwEte:\"fffaf0\",foYstWAn:\"228b22\",fuKsia:\"ff00ff\",gaRsbSo:\"dcdcdc\",ghostwEte:\"f8f8ff\",gTd:\"ffd700\",gTMnPd:\"daa520\",Way:\"808080\",gYF:\"8000\",gYFLw:\"adff2f\",gYy:\"808080\",honeyMw:\"f0fff0\",hotpRk:\"ff69b4\",RdianYd:\"cd5c5c\",Rdigo:\"4b0082\",ivSy:\"fffff0\",khaki:\"f0e68c\",lavFMr:\"e6e6fa\",lavFMrXsh:\"fff0f5\",lawngYF:\"7cfc00\",NmoncEffon:\"fffacd\",ZXe:\"add8e6\",ZcSO:\"f08080\",Zcyan:\"e0ffff\",ZgTMnPdLw:\"fafad2\",ZWay:\"d3d3d3\",ZgYF:\"90ee90\",ZgYy:\"d3d3d3\",ZpRk:\"ffb6c1\",ZsOmon:\"ffa07a\",ZsHgYF:\"20b2aa\",ZskyXe:\"87cefa\",ZUWay:\"778899\",ZUgYy:\"778899\",ZstAlXe:\"b0c4de\",ZLw:\"ffffe0\",lime:\"ff00\",limegYF:\"32cd32\",lRF:\"faf0e6\",magFta:\"ff00ff\",maPon:\"800000\",VaquamarRe:\"66cdaa\",VXe:\"cd\",VScEd:\"ba55d3\",VpurpN:\"9370db\",VsHgYF:\"3cb371\",VUXe:\"7b68ee\",VsprRggYF:\"fa9a\",VQe:\"48d1cc\",VviTetYd:\"c71585\",midnightXe:\"191970\",mRtcYam:\"f5fffa\",mistyPse:\"ffe4e1\",moccasR:\"ffe4b5\",navajowEte:\"ffdead\",navy:\"80\",Tdlace:\"fdf5e6\",Tive:\"808000\",TivedBb:\"6b8e23\",Sange:\"ffa500\",SangeYd:\"ff4500\",ScEd:\"da70d6\",pOegTMnPd:\"eee8aa\",pOegYF:\"98fb98\",pOeQe:\"afeeee\",pOeviTetYd:\"db7093\",papayawEp:\"ffefd5\",pHKpuff:\"ffdab9\",peru:\"cd853f\",pRk:\"ffc0cb\",plum:\"dda0dd\",powMrXe:\"b0e0e6\",purpN:\"800080\",YbeccapurpN:\"663399\",Yd:\"ff0000\",Psybrown:\"bc8f8f\",PyOXe:\"4169e1\",saddNbPwn:\"8b4513\",sOmon:\"fa8072\",sandybPwn:\"f4a460\",sHgYF:\"2e8b57\",sHshell:\"fff5ee\",siFna:\"a0522d\",silver:\"c0c0c0\",skyXe:\"87ceeb\",UXe:\"6a5acd\",UWay:\"708090\",UgYy:\"708090\",snow:\"fffafa\",sprRggYF:\"ff7f\",stAlXe:\"4682b4\",tan:\"d2b48c\",teO:\"8080\",tEstN:\"d8bfd8\",tomato:\"ff6347\",Qe:\"40e0d0\",viTet:\"ee82ee\",JHt:\"f5deb3\",wEte:\"ffffff\",wEtesmoke:\"f5f5f5\",Lw:\"ffff00\",LwgYF:\"9acd32\"};function Zb(){const e={},t=Object.keys(Ua),s=Object.keys(qa);let n,i,o,r,a;for(n=0;n<t.length;n++){for(r=a=t[n],i=0;i<s.length;i++)o=s[i],a=a.replace(o,qa[o]);o=parseInt(Ua[r],16),e[a]=[o>>16&255,o>>8&255,o&255]}return e}let ci;function t_(e){ci||(ci=Zb(),ci.transparent=[0,0,0,0]);const t=ci[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}const e_=/^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;function s_(e){const t=e_.exec(e);let s=255,n,i,o;if(t){if(t[7]!==n){const r=+t[7];s=t[8]?vn(r):us(r*255,0,255)}return n=+t[1],i=+t[3],o=+t[5],n=255&(t[2]?vn(n):us(n,0,255)),i=255&(t[4]?vn(i):us(i,0,255)),o=255&(t[6]?vn(o):us(o,0,255)),{r:n,g:i,b:o,a:s}}}function n_(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${We(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}const Co=e=>e<=.0031308?e*12.92:Math.pow(e,1/2.4)*1.055-.055,zs=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);function i_(e,t,s){const n=zs(We(e.r)),i=zs(We(e.g)),o=zs(We(e.b));return{r:gs(Co(n+s*(zs(We(t.r))-n))),g:gs(Co(i+s*(zs(We(t.g))-i))),b:gs(Co(o+s*(zs(We(t.b))-o))),a:e.a+s*(t.a-e.a)}}function ui(e,t,s){if(e){let n=Br(e);n[t]=Math.max(0,Math.min(n[t]+n[t]*s,t===0?360:1)),n=Vr(n),e.r=n[0],e.g=n[1],e.b=n[2]}}function Uu(e,t){return e&&Object.assign(t||{},e)}function Ka(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=gs(e[3]))):(t=Uu(e,{r:0,g:0,b:0,a:1}),t.a=gs(t.a)),t}function o_(e){return e.charAt(0)===\"r\"?s_(e):Xb(e)}class zn{constructor(t){if(t instanceof zn)return t;const s=typeof t;let n;s===\"object\"?n=Ka(t):s===\"string\"&&(n=jb(t)||t_(t)||o_(t)),this._rgb=n,this._valid=!!n}get valid(){return this._valid}get rgb(){var t=Uu(this._rgb);return t&&(t.a=We(t.a)),t}set rgb(t){this._rgb=Ka(t)}rgbString(){return this._valid?n_(this._rgb):void 0}hexString(){return this._valid?zb(this._rgb):void 0}hslString(){return this._valid?Qb(this._rgb):void 0}mix(t,s){if(t){const n=this.rgb,i=t.rgb;let o;const r=s===o?.5:s,a=2*r-1,l=n.a-i.a,c=((a*l===-1?a:(a+l)/(1+a*l))+1)/2;o=1-c,n.r=255&c*n.r+o*i.r+.5,n.g=255&c*n.g+o*i.g+.5,n.b=255&c*n.b+o*i.b+.5,n.a=r*n.a+(1-r)*i.a,this.rgb=n}return this}interpolate(t,s){return t&&(this._rgb=i_(this._rgb,t._rgb,s)),this}clone(){return new zn(this.rgb)}alpha(t){return this._rgb.a=gs(t),this}clearer(t){const s=this._rgb;return s.a*=1-t,this}greyscale(){const t=this._rgb,s=ti(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=s,this}opaquer(t){const s=this._rgb;return s.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return ui(this._rgb,2,t),this}darken(t){return ui(this._rgb,2,-t),this}saturate(t){return ui(this._rgb,1,t),this}desaturate(t){return ui(this._rgb,1,-t),this}rotate(t){return Jb(this._rgb,t),this}}function $e(){}const r_=(()=>{let e=0;return()=>e++})();function it(e){return e==null}function At(e){if(Array.isArray&&Array.isArray(e))return!0;const t=Object.prototype.toString.call(e);return t.slice(0,7)===\"[object\"&&t.slice(-6)===\"Array]\"}function ot(e){return e!==null&&Object.prototype.toString.call(e)===\"[object Object]\"}function Tt(e){return(typeof e==\"number\"||e instanceof Number)&&isFinite(+e)}function de(e,t){return Tt(e)?e:t}function Z(e,t){return typeof e>\"u\"?t:e}const a_=(e,t)=>typeof e==\"string\"&&e.endsWith(\"%\")?parseFloat(e)/100:+e/t,Ku=(e,t)=>typeof e==\"string\"&&e.endsWith(\"%\")?parseFloat(e)/100*t:+e;function St(e,t,s){if(e&&typeof e.call==\"function\")return e.apply(s,t)}function bt(e,t,s,n){let i,o,r;if(At(e))for(o=e.length,i=0;i<o;i++)t.call(s,e[i],i);else if(ot(e))for(r=Object.keys(e),o=r.length,i=0;i<o;i++)t.call(s,e[r[i]],r[i])}function Ni(e,t){let s,n,i,o;if(!e||!t||e.length!==t.length)return!1;for(s=0,n=e.length;s<n;++s)if(i=e[s],o=t[s],i.datasetIndex!==o.datasetIndex||i.index!==o.index)return!1;return!0}function Bi(e){if(At(e))return e.map(Bi);if(ot(e)){const t=Object.create(null),s=Object.keys(e),n=s.length;let i=0;for(;i<n;++i)t[s[i]]=Bi(e[s[i]]);return t}return e}function Gu(e){return[\"__proto__\",\"prototype\",\"constructor\"].indexOf(e)===-1}function l_(e,t,s,n){if(!Gu(e))return;const i=t[e],o=s[e];ot(i)&&ot(o)?Wn(i,o,n):t[e]=Bi(o)}function Wn(e,t,s){const n=At(t)?t:[t],i=n.length;if(!ot(e))return e;s=s||{};const o=s.merger||l_;let r;for(let a=0;a<i;++a){if(r=n[a],!ot(r))continue;const l=Object.keys(r);for(let c=0,u=l.length;c<u;++c)o(l[c],e,r,s)}return e}function En(e,t){return Wn(e,t,{merger:c_})}function c_(e,t,s){if(!Gu(e))return;const n=t[e],i=s[e];ot(n)&&ot(i)?En(n,i):Object.prototype.hasOwnProperty.call(t,e)||(t[e]=Bi(i))}const Ga={\"\":e=>e,x:e=>e.x,y:e=>e.y};function u_(e){const t=e.split(\".\"),s=[];let n=\"\";for(const i of t)n+=i,n.endsWith(\"\\\\\")?n=n.slice(0,-1)+\".\":(s.push(n),n=\"\");return s}function h_(e){const t=u_(e);return s=>{for(const n of t){if(n===\"\")break;s=s&&s[n]}return s}}function bs(e,t){return(Ga[t]||(Ga[t]=h_(t)))(e)}function jr(e){return e.charAt(0).toUpperCase()+e.slice(1)}const qn=e=>typeof e<\"u\",_s=e=>typeof e==\"function\",Ya=(e,t)=>{if(e.size!==t.size)return!1;for(const s of e)if(!t.has(s))return!1;return!0};function d_(e){return e.type===\"mouseup\"||e.type===\"click\"||e.type===\"contextmenu\"}const ht=Math.PI,Mt=2*ht,f_=Mt+ht,$i=Number.POSITIVE_INFINITY,p_=ht/180,Dt=ht/2,ks=ht/4,Xa=ht*2/3,hs=Math.log10,Fe=Math.sign;function Dn(e,t,s){return Math.abs(e-t)<s}function Ja(e){const t=Math.round(e);e=Dn(e,t,e/1e3)?t:e;const s=Math.pow(10,Math.floor(hs(e))),n=e/s;return(n<=1?1:n<=2?2:n<=5?5:10)*s}function g_(e){const t=[],s=Math.sqrt(e);let n;for(n=1;n<s;n++)e%n===0&&(t.push(n),t.push(e/n));return s===(s|0)&&t.push(s),t.sort((i,o)=>i-o).pop(),t}function m_(e){return typeof e==\"symbol\"||typeof e==\"object\"&&e!==null&&!(Symbol.toPrimitive in e||\"toString\"in e||\"valueOf\"in e)}function nn(e){return!m_(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function b_(e,t){const s=Math.round(e);return s-t<=e&&s+t>=e}function Yu(e,t,s){let n,i,o;for(n=0,i=e.length;n<i;n++)o=e[n][s],isNaN(o)||(t.min=Math.min(t.min,o),t.max=Math.max(t.max,o))}function ve(e){return e*(ht/180)}function Hr(e){return e*(180/ht)}function Qa(e){if(!Tt(e))return;let t=1,s=0;for(;Math.round(e*t)/t!==e;)t*=10,s++;return s}function Xu(e,t){const s=t.x-e.x,n=t.y-e.y,i=Math.sqrt(s*s+n*n);let o=Math.atan2(n,s);return o<-.5*ht&&(o+=Mt),{angle:o,distance:i}}function ir(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function __(e,t){return(e-t+f_)%Mt-ht}function Ht(e){return(e%Mt+Mt)%Mt}function Un(e,t,s,n){const i=Ht(e),o=Ht(t),r=Ht(s),a=Ht(o-i),l=Ht(r-i),c=Ht(i-o),u=Ht(i-r);return i===o||i===r||n&&o===r||a>l&&c<u}function Bt(e,t,s){return Math.max(t,Math.min(s,e))}function y_(e){return Bt(e,-32768,32767)}function Ge(e,t,s,n=1e-6){return e>=Math.min(t,s)-n&&e<=Math.max(t,s)+n}function zr(e,t,s){s=s||(r=>e[r]<t);let n=e.length-1,i=0,o;for(;n-i>1;)o=i+n>>1,s(o)?i=o:n=o;return{lo:i,hi:n}}const Ye=(e,t,s,n)=>zr(e,s,n?i=>{const o=e[i][t];return o<s||o===s&&e[i+1][t]===s}:i=>e[i][t]<s),x_=(e,t,s)=>zr(e,s,n=>e[n][t]>=s);function v_(e,t,s){let n=0,i=e.length;for(;n<i&&e[n]<t;)n++;for(;i>n&&e[i-1]>s;)i--;return n>0||i<e.length?e.slice(n,i):e}const Ju=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];function w_(e,t){if(e._chartjs){e._chartjs.listeners.push(t);return}Object.defineProperty(e,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[t]}}),Ju.forEach(s=>{const n=\"_onData\"+jr(s),i=e[s];Object.defineProperty(e,s,{configurable:!0,enumerable:!1,value(...o){const r=i.apply(this,o);return e._chartjs.listeners.forEach(a=>{typeof a[n]==\"function\"&&a[n](...o)}),r}})})}function Za(e,t){const s=e._chartjs;if(!s)return;const n=s.listeners,i=n.indexOf(t);i!==-1&&n.splice(i,1),!(n.length>0)&&(Ju.forEach(o=>{delete e[o]}),delete e._chartjs)}function Qu(e){const t=new Set(e);return t.size===e.length?e:Array.from(t)}const Zu=(function(){return typeof window>\"u\"?function(e){return e()}:window.requestAnimationFrame})();function th(e,t){let s=[],n=!1;return function(...i){s=i,n||(n=!0,Zu.call(window,()=>{n=!1,e.apply(t,s)}))}}function S_(e,t){let s;return function(...n){return t?(clearTimeout(s),s=setTimeout(e,t,n)):e.apply(this,n),t}}const Wr=e=>e===\"start\"?\"left\":e===\"end\"?\"right\":\"center\",jt=(e,t,s)=>e===\"start\"?t:e===\"end\"?s:(t+s)/2,k_=(e,t,s,n)=>e===(n?\"left\":\"right\")?s:e===\"center\"?(t+s)/2:t;function eh(e,t,s){const n=t.length;let i=0,o=n;if(e._sorted){const{iScale:r,vScale:a,_parsed:l}=e,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=r.axis,{min:h,max:d,minDefined:f,maxDefined:p}=r.getUserBounds();if(f){if(i=Math.min(Ye(l,u,h).lo,s?n:Ye(t,u,r.getPixelForValue(h)).lo),c){const g=l.slice(0,i+1).reverse().findIndex(_=>!it(_[a.axis]));i-=Math.max(0,g)}i=Bt(i,0,n-1)}if(p){let g=Math.max(Ye(l,r.axis,d,!0).hi+1,s?0:Ye(t,u,r.getPixelForValue(d),!0).hi+1);if(c){const _=l.slice(g-1).findIndex(b=>!it(b[a.axis]));g+=Math.max(0,_)}o=Bt(g,i,n)-i}else o=n-i}return{start:i,count:o}}function sh(e){const{xScale:t,yScale:s,_scaleRanges:n}=e,i={xmin:t.min,xmax:t.max,ymin:s.min,ymax:s.max};if(!n)return e._scaleRanges=i,!0;const o=n.xmin!==t.min||n.xmax!==t.max||n.ymin!==s.min||n.ymax!==s.max;return Object.assign(n,i),o}const hi=e=>e===0||e===1,tl=(e,t,s)=>-(Math.pow(2,10*(e-=1))*Math.sin((e-t)*Mt/s)),el=(e,t,s)=>Math.pow(2,-10*e)*Math.sin((e-t)*Mt/s)+1,In={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>(e-=1)*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-((e-=1)*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>(e-=1)*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Dt)+1,easeOutSine:e=>Math.sin(e*Dt),easeInOutSine:e=>-.5*(Math.cos(ht*e)-1),easeInExpo:e=>e===0?0:Math.pow(2,10*(e-1)),easeOutExpo:e=>e===1?1:-Math.pow(2,-10*e)+1,easeInOutExpo:e=>hi(e)?e:e<.5?.5*Math.pow(2,10*(e*2-1)):.5*(-Math.pow(2,-10*(e*2-1))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1-(e-=1)*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>hi(e)?e:tl(e,.075,.3),easeOutElastic:e=>hi(e)?e:el(e,.075,.3),easeInOutElastic(e){return hi(e)?e:e<.5?.5*tl(e*2,.1125,.45):.5+.5*el(e*2-1,.1125,.45)},easeInBack(e){return e*e*((1.70158+1)*e-1.70158)},easeOutBack(e){return(e-=1)*e*((1.70158+1)*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-In.easeOutBounce(1-e),easeOutBounce(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},easeInOutBounce:e=>e<.5?In.easeInBounce(e*2)*.5:In.easeOutBounce(e*2-1)*.5+.5};function qr(e){if(e&&typeof e==\"object\"){const t=e.toString();return t===\"[object CanvasPattern]\"||t===\"[object CanvasGradient]\"}return!1}function sl(e){return qr(e)?e:new zn(e)}function Po(e){return qr(e)?e:new zn(e).saturate(.5).darken(.1).hexString()}const M_=[\"x\",\"y\",\"borderWidth\",\"radius\",\"tension\"],C_=[\"color\",\"borderColor\",\"backgroundColor\"];function P_(e){e.set(\"animation\",{delay:void 0,duration:1e3,easing:\"easeOutQuart\",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(\"animation\",{_fallback:!1,_indexable:!1,_scriptable:t=>t!==\"onProgress\"&&t!==\"onComplete\"&&t!==\"fn\"}),e.set(\"animations\",{colors:{type:\"color\",properties:C_},numbers:{type:\"number\",properties:M_}}),e.describe(\"animations\",{_fallback:\"animation\"}),e.set(\"transitions\",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:\"transparent\"},visible:{type:\"boolean\",duration:0}}},hide:{animations:{colors:{to:\"transparent\"},visible:{type:\"boolean\",easing:\"linear\",fn:t=>t|0}}}})}function A_(e){e.set(\"layout\",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const nl=new Map;function R_(e,t){t=t||{};const s=e+JSON.stringify(t);let n=nl.get(s);return n||(n=new Intl.NumberFormat(e,t),nl.set(s,n)),n}function ei(e,t,s){return R_(t,s).format(e)}const nh={values(e){return At(e)?e:\"\"+e},numeric(e,t,s){if(e===0)return\"0\";const n=this.chart.options.locale;let i,o=e;if(s.length>1){const c=Math.max(Math.abs(s[0].value),Math.abs(s[s.length-1].value));(c<1e-4||c>1e15)&&(i=\"scientific\"),o=O_(e,s)}const r=hs(Math.abs(o)),a=isNaN(r)?1:Math.max(Math.min(-1*Math.floor(r),20),0),l={notation:i,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),ei(e,n,l)},logarithmic(e,t,s){if(e===0)return\"0\";const n=s[t].significand||e/Math.pow(10,Math.floor(hs(e)));return[1,2,3,5,10,15].includes(n)||t>.8*s.length?nh.numeric.call(this,e,t,s):\"\"}};function O_(e,t){let s=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(s)>=1&&e!==Math.floor(e)&&(s=e-Math.floor(e)),s}var oo={formatters:nh};function T_(e){e.set(\"scale\",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:\"ticks\",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,s)=>s.lineWidth,tickColor:(t,s)=>s.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:\"\",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:\"\",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:oo.formatters.values,minor:{},major:{},align:\"center\",crossAlign:\"near\",showLabelBackdrop:!1,backdropColor:\"rgba(255, 255, 255, 0.75)\",backdropPadding:2}}),e.route(\"scale.ticks\",\"color\",\"\",\"color\"),e.route(\"scale.grid\",\"color\",\"\",\"borderColor\"),e.route(\"scale.border\",\"color\",\"\",\"borderColor\"),e.route(\"scale.title\",\"color\",\"\",\"color\"),e.describe(\"scale\",{_fallback:!1,_scriptable:t=>!t.startsWith(\"before\")&&!t.startsWith(\"after\")&&t!==\"callback\"&&t!==\"parser\",_indexable:t=>t!==\"borderDash\"&&t!==\"tickBorderDash\"&&t!==\"dash\"}),e.describe(\"scales\",{_fallback:\"scale\"}),e.describe(\"scale.ticks\",{_scriptable:t=>t!==\"backdropPadding\"&&t!==\"callback\",_indexable:t=>t!==\"backdropPadding\"})}const $s=Object.create(null),or=Object.create(null);function Ln(e,t){if(!t)return e;const s=t.split(\".\");for(let n=0,i=s.length;n<i;++n){const o=s[n];e=e[o]||(e[o]=Object.create(null))}return e}function Ao(e,t,s){return typeof t==\"string\"?Wn(Ln(e,t),s):Wn(Ln(e,\"\"),t)}class E_{constructor(t,s){this.animation=void 0,this.backgroundColor=\"rgba(0,0,0,0.1)\",this.borderColor=\"rgba(0,0,0,0.1)\",this.color=\"#666\",this.datasets={},this.devicePixelRatio=n=>n.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],this.font={family:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",size:12,style:\"normal\",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(n,i)=>Po(i.backgroundColor),this.hoverBorderColor=(n,i)=>Po(i.borderColor),this.hoverColor=(n,i)=>Po(i.color),this.indexAxis=\"x\",this.interaction={mode:\"nearest\",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(s)}set(t,s){return Ao(this,t,s)}get(t){return Ln(this,t)}describe(t,s){return Ao(or,t,s)}override(t,s){return Ao($s,t,s)}route(t,s,n,i){const o=Ln(this,t),r=Ln(this,n),a=\"_\"+s;Object.defineProperties(o,{[a]:{value:o[s],writable:!0},[s]:{enumerable:!0,get(){const l=this[a],c=r[i];return ot(l)?Object.assign({},c,l):Z(l,c)},set(l){this[a]=l}}})}apply(t){t.forEach(s=>s(this))}}var Rt=new E_({_scriptable:e=>!e.startsWith(\"on\"),_indexable:e=>e!==\"events\",hover:{_fallback:\"interaction\"},interaction:{_scriptable:!1,_indexable:!1}},[P_,A_,T_]);function D_(e){return!e||it(e.size)||it(e.family)?null:(e.style?e.style+\" \":\"\")+(e.weight?e.weight+\" \":\"\")+e.size+\"px \"+e.family}function Vi(e,t,s,n,i){let o=t[i];return o||(o=t[i]=e.measureText(i).width,s.push(i)),o>n&&(n=o),n}function I_(e,t,s,n){n=n||{};let i=n.data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==t&&(i=n.data={},o=n.garbageCollect=[],n.font=t),e.save(),e.font=t;let r=0;const a=s.length;let l,c,u,h,d;for(l=0;l<a;l++)if(h=s[l],h!=null&&!At(h))r=Vi(e,i,o,r,h);else if(At(h))for(c=0,u=h.length;c<u;c++)d=h[c],d!=null&&!At(d)&&(r=Vi(e,i,o,r,d));e.restore();const f=o.length/2;if(f>s.length){for(l=0;l<f;l++)delete i[o[l]];o.splice(0,f)}return r}function Ms(e,t,s){const n=e.currentDevicePixelRatio,i=s!==0?Math.max(s/2,.5):0;return Math.round((t-i)*n)/n+i}function il(e,t){!t&&!e||(t=t||e.getContext(\"2d\"),t.save(),t.resetTransform(),t.clearRect(0,0,e.width,e.height),t.restore())}function rr(e,t,s,n){ih(e,t,s,n,null)}function ih(e,t,s,n,i){let o,r,a,l,c,u,h,d;const f=t.pointStyle,p=t.rotation,g=t.radius;let _=(p||0)*p_;if(f&&typeof f==\"object\"&&(o=f.toString(),o===\"[object HTMLImageElement]\"||o===\"[object HTMLCanvasElement]\")){e.save(),e.translate(s,n),e.rotate(_),e.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),e.restore();return}if(!(isNaN(g)||g<=0)){switch(e.beginPath(),f){default:i?e.ellipse(s,n,i/2,g,0,0,Mt):e.arc(s,n,g,0,Mt),e.closePath();break;case\"triangle\":u=i?i/2:g,e.moveTo(s+Math.sin(_)*u,n-Math.cos(_)*g),_+=Xa,e.lineTo(s+Math.sin(_)*u,n-Math.cos(_)*g),_+=Xa,e.lineTo(s+Math.sin(_)*u,n-Math.cos(_)*g),e.closePath();break;case\"rectRounded\":c=g*.516,l=g-c,r=Math.cos(_+ks)*l,h=Math.cos(_+ks)*(i?i/2-c:l),a=Math.sin(_+ks)*l,d=Math.sin(_+ks)*(i?i/2-c:l),e.arc(s-h,n-a,c,_-ht,_-Dt),e.arc(s+d,n-r,c,_-Dt,_),e.arc(s+h,n+a,c,_,_+Dt),e.arc(s-d,n+r,c,_+Dt,_+ht),e.closePath();break;case\"rect\":if(!p){l=Math.SQRT1_2*g,u=i?i/2:l,e.rect(s-u,n-l,2*u,2*l);break}_+=ks;case\"rectRot\":h=Math.cos(_)*(i?i/2:g),r=Math.cos(_)*g,a=Math.sin(_)*g,d=Math.sin(_)*(i?i/2:g),e.moveTo(s-h,n-a),e.lineTo(s+d,n-r),e.lineTo(s+h,n+a),e.lineTo(s-d,n+r),e.closePath();break;case\"crossRot\":_+=ks;case\"cross\":h=Math.cos(_)*(i?i/2:g),r=Math.cos(_)*g,a=Math.sin(_)*g,d=Math.sin(_)*(i?i/2:g),e.moveTo(s-h,n-a),e.lineTo(s+h,n+a),e.moveTo(s+d,n-r),e.lineTo(s-d,n+r);break;case\"star\":h=Math.cos(_)*(i?i/2:g),r=Math.cos(_)*g,a=Math.sin(_)*g,d=Math.sin(_)*(i?i/2:g),e.moveTo(s-h,n-a),e.lineTo(s+h,n+a),e.moveTo(s+d,n-r),e.lineTo(s-d,n+r),_+=ks,h=Math.cos(_)*(i?i/2:g),r=Math.cos(_)*g,a=Math.sin(_)*g,d=Math.sin(_)*(i?i/2:g),e.moveTo(s-h,n-a),e.lineTo(s+h,n+a),e.moveTo(s+d,n-r),e.lineTo(s-d,n+r);break;case\"line\":r=i?i/2:Math.cos(_)*g,a=Math.sin(_)*g,e.moveTo(s-r,n-a),e.lineTo(s+r,n+a);break;case\"dash\":e.moveTo(s,n),e.lineTo(s+Math.cos(_)*(i?i/2:g),n+Math.sin(_)*g);break;case!1:e.closePath();break}e.fill(),t.borderWidth>0&&e.stroke()}}function Xe(e,t,s){return s=s||.5,!t||e&&e.x>t.left-s&&e.x<t.right+s&&e.y>t.top-s&&e.y<t.bottom+s}function ro(e,t){e.save(),e.beginPath(),e.rect(t.left,t.top,t.right-t.left,t.bottom-t.top),e.clip()}function ao(e){e.restore()}function L_(e,t,s,n,i){if(!t)return e.lineTo(s.x,s.y);if(i===\"middle\"){const o=(t.x+s.x)/2;e.lineTo(o,t.y),e.lineTo(o,s.y)}else i===\"after\"!=!!n?e.lineTo(t.x,s.y):e.lineTo(s.x,t.y);e.lineTo(s.x,s.y)}function F_(e,t,s,n){if(!t)return e.lineTo(s.x,s.y);e.bezierCurveTo(n?t.cp1x:t.cp2x,n?t.cp1y:t.cp2y,n?s.cp2x:s.cp1x,n?s.cp2y:s.cp1y,s.x,s.y)}function N_(e,t){t.translation&&e.translate(t.translation[0],t.translation[1]),it(t.rotation)||e.rotate(t.rotation),t.color&&(e.fillStyle=t.color),t.textAlign&&(e.textAlign=t.textAlign),t.textBaseline&&(e.textBaseline=t.textBaseline)}function B_(e,t,s,n,i){if(i.strikethrough||i.underline){const o=e.measureText(n),r=t-o.actualBoundingBoxLeft,a=t+o.actualBoundingBoxRight,l=s-o.actualBoundingBoxAscent,c=s+o.actualBoundingBoxDescent,u=i.strikethrough?(l+c)/2:c;e.strokeStyle=e.fillStyle,e.beginPath(),e.lineWidth=i.decorationWidth||2,e.moveTo(r,u),e.lineTo(a,u),e.stroke()}}function $_(e,t){const s=e.fillStyle;e.fillStyle=t.color,e.fillRect(t.left,t.top,t.width,t.height),e.fillStyle=s}function Vs(e,t,s,n,i,o={}){const r=At(t)?t:[t],a=o.strokeWidth>0&&o.strokeColor!==\"\";let l,c;for(e.save(),e.font=i.string,N_(e,o),l=0;l<r.length;++l)c=r[l],o.backdrop&&$_(e,o.backdrop),a&&(o.strokeColor&&(e.strokeStyle=o.strokeColor),it(o.strokeWidth)||(e.lineWidth=o.strokeWidth),e.strokeText(c,s,n,o.maxWidth)),e.fillText(c,s,n,o.maxWidth),B_(e,s,n,c,o),n+=Number(i.lineHeight);e.restore()}function Kn(e,t){const{x:s,y:n,w:i,h:o,radius:r}=t;e.arc(s+r.topLeft,n+r.topLeft,r.topLeft,1.5*ht,ht,!0),e.lineTo(s,n+o-r.bottomLeft),e.arc(s+r.bottomLeft,n+o-r.bottomLeft,r.bottomLeft,ht,Dt,!0),e.lineTo(s+i-r.bottomRight,n+o),e.arc(s+i-r.bottomRight,n+o-r.bottomRight,r.bottomRight,Dt,0,!0),e.lineTo(s+i,n+r.topRight),e.arc(s+i-r.topRight,n+r.topRight,r.topRight,0,-Dt,!0),e.lineTo(s+r.topLeft,n)}const V_=/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/,j_=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function H_(e,t){const s=(\"\"+e).match(V_);if(!s||s[1]===\"normal\")return t*1.2;switch(e=+s[2],s[3]){case\"px\":return e;case\"%\":e/=100;break}return t*e}const z_=e=>+e||0;function Ur(e,t){const s={},n=ot(t),i=n?Object.keys(t):t,o=ot(e)?n?r=>Z(e[r],e[t[r]]):r=>e[r]:()=>e;for(const r of i)s[r]=z_(o(r));return s}function oh(e){return Ur(e,{top:\"y\",right:\"x\",bottom:\"y\",left:\"x\"})}function Fs(e){return Ur(e,[\"topLeft\",\"topRight\",\"bottomLeft\",\"bottomRight\"])}function Yt(e){const t=oh(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function Nt(e,t){e=e||{},t=t||Rt.font;let s=Z(e.size,t.size);typeof s==\"string\"&&(s=parseInt(s,10));let n=Z(e.style,t.style);n&&!(\"\"+n).match(j_)&&(console.warn('Invalid font style specified: \"'+n+'\"'),n=void 0);const i={family:Z(e.family,t.family),lineHeight:H_(Z(e.lineHeight,t.lineHeight),s),size:s,style:n,weight:Z(e.weight,t.weight),string:\"\"};return i.string=D_(i),i}function wn(e,t,s,n){let i,o,r;for(i=0,o=e.length;i<o;++i)if(r=e[i],r!==void 0&&r!==void 0)return r}function W_(e,t,s){const{min:n,max:i}=e,o=Ku(t,(i-n)/2),r=(a,l)=>s&&a===0?0:a+l;return{min:r(n,-Math.abs(o)),max:r(i,o)}}function xs(e,t){return Object.assign(Object.create(e),t)}function Kr(e,t=[\"\"],s,n,i=()=>e[0]){const o=s||e;typeof n>\"u\"&&(n=ch(\"_fallback\",e));const r={[Symbol.toStringTag]:\"Object\",_cacheable:!0,_scopes:e,_rootScopes:o,_fallback:n,_getTarget:i,override:a=>Kr([a,...e],t,o,n)};return new Proxy(r,{deleteProperty(a,l){return delete a[l],delete a._keys,delete e[0][l],!0},get(a,l){return ah(a,l,()=>Q_(l,t,e,a))},getOwnPropertyDescriptor(a,l){return Reflect.getOwnPropertyDescriptor(a._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(a,l){return rl(a).includes(l)},ownKeys(a){return rl(a)},set(a,l,c){const u=a._storage||(a._storage=i());return a[l]=u[l]=c,delete a._keys,!0}})}function on(e,t,s,n){const i={_cacheable:!1,_proxy:e,_context:t,_subProxy:s,_stack:new Set,_descriptors:rh(e,n),setContext:o=>on(e,o,s,n),override:o=>on(e.override(o),t,s,n)};return new Proxy(i,{deleteProperty(o,r){return delete o[r],delete e[r],!0},get(o,r,a){return ah(o,r,()=>U_(o,r,a))},getOwnPropertyDescriptor(o,r){return o._descriptors.allKeys?Reflect.has(e,r)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,r)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(o,r){return Reflect.has(e,r)},ownKeys(){return Reflect.ownKeys(e)},set(o,r,a){return e[r]=a,delete o[r],!0}})}function rh(e,t={scriptable:!0,indexable:!0}){const{_scriptable:s=t.scriptable,_indexable:n=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:s,indexable:n,isScriptable:_s(s)?s:()=>s,isIndexable:_s(n)?n:()=>n}}const q_=(e,t)=>e?e+jr(t):t,Gr=(e,t)=>ot(t)&&e!==\"adapters\"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function ah(e,t,s){if(Object.prototype.hasOwnProperty.call(e,t)||t===\"constructor\")return e[t];const n=s();return e[t]=n,n}function U_(e,t,s){const{_proxy:n,_context:i,_subProxy:o,_descriptors:r}=e;let a=n[t];return _s(a)&&r.isScriptable(t)&&(a=K_(t,a,e,s)),At(a)&&a.length&&(a=G_(t,a,e,r.isIndexable)),Gr(t,a)&&(a=on(a,i,o&&o[t],r)),a}function K_(e,t,s,n){const{_proxy:i,_context:o,_subProxy:r,_stack:a}=s;if(a.has(e))throw new Error(\"Recursion detected: \"+Array.from(a).join(\"->\")+\"->\"+e);a.add(e);let l=t(o,r||n);return a.delete(e),Gr(e,l)&&(l=Yr(i._scopes,i,e,l)),l}function G_(e,t,s,n){const{_proxy:i,_context:o,_subProxy:r,_descriptors:a}=s;if(typeof o.index<\"u\"&&n(e))return t[o.index%t.length];if(ot(t[0])){const l=t,c=i._scopes.filter(u=>u!==l);t=[];for(const u of l){const h=Yr(c,i,e,u);t.push(on(h,o,r&&r[e],a))}}return t}function lh(e,t,s){return _s(e)?e(t,s):e}const Y_=(e,t)=>e===!0?t:typeof e==\"string\"?bs(t,e):void 0;function X_(e,t,s,n,i){for(const o of t){const r=Y_(s,o);if(r){e.add(r);const a=lh(r._fallback,s,i);if(typeof a<\"u\"&&a!==s&&a!==n)return a}else if(r===!1&&typeof n<\"u\"&&s!==n)return null}return!1}function Yr(e,t,s,n){const i=t._rootScopes,o=lh(t._fallback,s,n),r=[...e,...i],a=new Set;a.add(n);let l=ol(a,r,s,o||s,n);return l===null||typeof o<\"u\"&&o!==s&&(l=ol(a,r,o,l,n),l===null)?!1:Kr(Array.from(a),[\"\"],i,o,()=>J_(t,s,n))}function ol(e,t,s,n,i){for(;s;)s=X_(e,t,s,n,i);return s}function J_(e,t,s){const n=e._getTarget();t in n||(n[t]={});const i=n[t];return At(i)&&ot(s)?s:i||{}}function Q_(e,t,s,n){let i;for(const o of t)if(i=ch(q_(o,e),s),typeof i<\"u\")return Gr(e,i)?Yr(s,n,e,i):i}function ch(e,t){for(const s of t){if(!s)continue;const n=s[e];if(typeof n<\"u\")return n}}function rl(e){let t=e._keys;return t||(t=e._keys=Z_(e._scopes)),t}function Z_(e){const t=new Set;for(const s of e)for(const n of Object.keys(s).filter(i=>!i.startsWith(\"_\")))t.add(n);return Array.from(t)}function uh(e,t,s,n){const{iScale:i}=e,{key:o=\"r\"}=this._parsing,r=new Array(n);let a,l,c,u;for(a=0,l=n;a<l;++a)c=a+s,u=t[c],r[a]={r:i.parse(bs(u,o),c)};return r}const t0=Number.EPSILON||1e-14,rn=(e,t)=>t<e.length&&!e[t].skip&&e[t],hh=e=>e===\"x\"?\"y\":\"x\";function e0(e,t,s,n){const i=e.skip?t:e,o=t,r=s.skip?t:s,a=ir(o,i),l=ir(r,o);let c=a/(a+l),u=l/(a+l);c=isNaN(c)?0:c,u=isNaN(u)?0:u;const h=n*c,d=n*u;return{previous:{x:o.x-h*(r.x-i.x),y:o.y-h*(r.y-i.y)},next:{x:o.x+d*(r.x-i.x),y:o.y+d*(r.y-i.y)}}}function s0(e,t,s){const n=e.length;let i,o,r,a,l,c=rn(e,0);for(let u=0;u<n-1;++u)if(l=c,c=rn(e,u+1),!(!l||!c)){if(Dn(t[u],0,t0)){s[u]=s[u+1]=0;continue}i=s[u]/t[u],o=s[u+1]/t[u],a=Math.pow(i,2)+Math.pow(o,2),!(a<=9)&&(r=3/Math.sqrt(a),s[u]=i*r*t[u],s[u+1]=o*r*t[u])}}function n0(e,t,s=\"x\"){const n=hh(s),i=e.length;let o,r,a,l=rn(e,0);for(let c=0;c<i;++c){if(r=a,a=l,l=rn(e,c+1),!a)continue;const u=a[s],h=a[n];r&&(o=(u-r[s])/3,a[`cp1${s}`]=u-o,a[`cp1${n}`]=h-o*t[c]),l&&(o=(l[s]-u)/3,a[`cp2${s}`]=u+o,a[`cp2${n}`]=h+o*t[c])}}function i0(e,t=\"x\"){const s=hh(t),n=e.length,i=Array(n).fill(0),o=Array(n);let r,a,l,c=rn(e,0);for(r=0;r<n;++r)if(a=l,l=c,c=rn(e,r+1),!!l){if(c){const u=c[t]-l[t];i[r]=u!==0?(c[s]-l[s])/u:0}o[r]=a?c?Fe(i[r-1])!==Fe(i[r])?0:(i[r-1]+i[r])/2:i[r-1]:i[r]}s0(e,i,o),n0(e,o,t)}function di(e,t,s){return Math.max(Math.min(e,s),t)}function o0(e,t){let s,n,i,o,r,a=Xe(e[0],t);for(s=0,n=e.length;s<n;++s)r=o,o=a,a=s<n-1&&Xe(e[s+1],t),o&&(i=e[s],r&&(i.cp1x=di(i.cp1x,t.left,t.right),i.cp1y=di(i.cp1y,t.top,t.bottom)),a&&(i.cp2x=di(i.cp2x,t.left,t.right),i.cp2y=di(i.cp2y,t.top,t.bottom)))}function r0(e,t,s,n,i){let o,r,a,l;if(t.spanGaps&&(e=e.filter(c=>!c.skip)),t.cubicInterpolationMode===\"monotone\")i0(e,i);else{let c=n?e[e.length-1]:e[0];for(o=0,r=e.length;o<r;++o)a=e[o],l=e0(c,a,e[Math.min(o+1,r-(n?0:1))%r],t.tension),a.cp1x=l.previous.x,a.cp1y=l.previous.y,a.cp2x=l.next.x,a.cp2y=l.next.y,c=a}t.capBezierPoints&&o0(e,s)}function Xr(){return typeof window<\"u\"&&typeof document<\"u\"}function Jr(e){let t=e.parentNode;return t&&t.toString()===\"[object ShadowRoot]\"&&(t=t.host),t}function ji(e,t,s){let n;return typeof e==\"string\"?(n=parseInt(e,10),e.indexOf(\"%\")!==-1&&(n=n/100*t.parentNode[s])):n=e,n}const lo=e=>e.ownerDocument.defaultView.getComputedStyle(e,null);function a0(e,t){return lo(e).getPropertyValue(t)}const l0=[\"top\",\"right\",\"bottom\",\"left\"];function Ns(e,t,s){const n={};s=s?\"-\"+s:\"\";for(let i=0;i<4;i++){const o=l0[i];n[o]=parseFloat(e[t+\"-\"+o+s])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}const c0=(e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot);function u0(e,t){const s=e.touches,n=s&&s.length?s[0]:e,{offsetX:i,offsetY:o}=n;let r=!1,a,l;if(c0(i,o,e.target))a=i,l=o;else{const c=t.getBoundingClientRect();a=n.clientX-c.left,l=n.clientY-c.top,r=!0}return{x:a,y:l,box:r}}function Rs(e,t){if(\"native\"in e)return e;const{canvas:s,currentDevicePixelRatio:n}=t,i=lo(s),o=i.boxSizing===\"border-box\",r=Ns(i,\"padding\"),a=Ns(i,\"border\",\"width\"),{x:l,y:c,box:u}=u0(e,s),h=r.left+(u&&a.left),d=r.top+(u&&a.top);let{width:f,height:p}=t;return o&&(f-=r.width+a.width,p-=r.height+a.height),{x:Math.round((l-h)/f*s.width/n),y:Math.round((c-d)/p*s.height/n)}}function h0(e,t,s){let n,i;if(t===void 0||s===void 0){const o=e&&Jr(e);if(!o)t=e.clientWidth,s=e.clientHeight;else{const r=o.getBoundingClientRect(),a=lo(o),l=Ns(a,\"border\",\"width\"),c=Ns(a,\"padding\");t=r.width-c.width-l.width,s=r.height-c.height-l.height,n=ji(a.maxWidth,o,\"clientWidth\"),i=ji(a.maxHeight,o,\"clientHeight\")}}return{width:t,height:s,maxWidth:n||$i,maxHeight:i||$i}}const ds=e=>Math.round(e*10)/10;function d0(e,t,s,n){const i=lo(e),o=Ns(i,\"margin\"),r=ji(i.maxWidth,e,\"clientWidth\")||$i,a=ji(i.maxHeight,e,\"clientHeight\")||$i,l=h0(e,t,s);let{width:c,height:u}=l;if(i.boxSizing===\"content-box\"){const d=Ns(i,\"border\",\"width\"),f=Ns(i,\"padding\");c-=f.width+d.width,u-=f.height+d.height}return c=Math.max(0,c-o.width),u=Math.max(0,n?c/n:u-o.height),c=ds(Math.min(c,r,l.maxWidth)),u=ds(Math.min(u,a,l.maxHeight)),c&&!u&&(u=ds(c/2)),(t!==void 0||s!==void 0)&&n&&l.height&&u>l.height&&(u=l.height,c=ds(Math.floor(u*n))),{width:c,height:u}}function al(e,t,s){const n=t||1,i=ds(e.height*n),o=ds(e.width*n);e.height=ds(e.height),e.width=ds(e.width);const r=e.canvas;return r.style&&(s||!r.style.height&&!r.style.width)&&(r.style.height=`${e.height}px`,r.style.width=`${e.width}px`),e.currentDevicePixelRatio!==n||r.height!==i||r.width!==o?(e.currentDevicePixelRatio=n,r.height=i,r.width=o,e.ctx.setTransform(n,0,0,n,0,0),!0):!1}const f0=(function(){let e=!1;try{const t={get passive(){return e=!0,!1}};Xr()&&(window.addEventListener(\"test\",null,t),window.removeEventListener(\"test\",null,t))}catch{}return e})();function ll(e,t){const s=a0(e,t),n=s&&s.match(/^(\\d+)(\\.\\d+)?px$/);return n?+n[1]:void 0}function Os(e,t,s,n){return{x:e.x+s*(t.x-e.x),y:e.y+s*(t.y-e.y)}}function p0(e,t,s,n){return{x:e.x+s*(t.x-e.x),y:n===\"middle\"?s<.5?e.y:t.y:n===\"after\"?s<1?e.y:t.y:s>0?t.y:e.y}}function g0(e,t,s,n){const i={x:e.cp2x,y:e.cp2y},o={x:t.cp1x,y:t.cp1y},r=Os(e,i,s),a=Os(i,o,s),l=Os(o,t,s),c=Os(r,a,s),u=Os(a,l,s);return Os(c,u,s)}const m0=function(e,t){return{x(s){return e+e+t-s},setWidth(s){t=s},textAlign(s){return s===\"center\"?s:s===\"right\"?\"left\":\"right\"},xPlus(s,n){return s-n},leftForLtr(s,n){return s-n}}},b0=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function Qs(e,t,s){return e?m0(t,s):b0()}function dh(e,t){let s,n;(t===\"ltr\"||t===\"rtl\")&&(s=e.canvas.style,n=[s.getPropertyValue(\"direction\"),s.getPropertyPriority(\"direction\")],s.setProperty(\"direction\",t,\"important\"),e.prevTextDirection=n)}function fh(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(\"direction\",t[0],t[1]))}function ph(e){return e===\"angle\"?{between:Un,compare:__,normalize:Ht}:{between:Ge,compare:(t,s)=>t-s,normalize:t=>t}}function cl({start:e,end:t,count:s,loop:n,style:i}){return{start:e%s,end:t%s,loop:n&&(t-e+1)%s===0,style:i}}function _0(e,t,s){const{property:n,start:i,end:o}=s,{between:r,normalize:a}=ph(n),l=t.length;let{start:c,end:u,loop:h}=e,d,f;if(h){for(c+=l,u+=l,d=0,f=l;d<f&&r(a(t[c%l][n]),i,o);++d)c--,u--;c%=l,u%=l}return u<c&&(u+=l),{start:c,end:u,loop:h,style:e.style}}function gh(e,t,s){if(!s)return[e];const{property:n,start:i,end:o}=s,r=t.length,{compare:a,between:l,normalize:c}=ph(n),{start:u,end:h,loop:d,style:f}=_0(e,t,s),p=[];let g=!1,_=null,b,v,M;const S=()=>l(i,M,b)&&a(i,M)!==0,w=()=>a(o,b)===0||l(o,M,b),R=()=>g||S(),k=()=>!g||w();for(let P=u,C=u;P<=h;++P)v=t[P%r],!v.skip&&(b=c(v[n]),b!==M&&(g=l(b,i,o),_===null&&R()&&(_=a(b,i)===0?P:C),_!==null&&k()&&(p.push(cl({start:_,end:P,loop:d,count:r,style:f})),_=null),C=P,M=b));return _!==null&&p.push(cl({start:_,end:h,loop:d,count:r,style:f})),p}function mh(e,t){const s=[],n=e.segments;for(let i=0;i<n.length;i++){const o=gh(n[i],e.points,t);o.length&&s.push(...o)}return s}function y0(e,t,s,n){let i=0,o=t-1;if(s&&!n)for(;i<t&&!e[i].skip;)i++;for(;i<t&&e[i].skip;)i++;for(i%=t,s&&(o+=i);o>i&&e[o%t].skip;)o--;return o%=t,{start:i,end:o}}function x0(e,t,s,n){const i=e.length,o=[];let r=t,a=e[t],l;for(l=t+1;l<=s;++l){const c=e[l%i];c.skip||c.stop?a.skip||(n=!1,o.push({start:t%i,end:(l-1)%i,loop:n}),t=r=c.stop?l:null):(r=l,a.skip&&(t=l)),a=c}return r!==null&&o.push({start:t%i,end:r%i,loop:n}),o}function v0(e,t){const s=e.points,n=e.options.spanGaps,i=s.length;if(!i)return[];const o=!!e._loop,{start:r,end:a}=y0(s,i,o,n);if(n===!0)return ul(e,[{start:r,end:a,loop:o}],s,t);const l=a<r?a+i:a,c=!!e._fullLoop&&r===0&&a===i-1;return ul(e,x0(s,r,l,c),s,t)}function ul(e,t,s,n){return!n||!n.setContext||!s?t:w0(e,t,s,n)}function w0(e,t,s,n){const i=e._chart.getContext(),o=hl(e.options),{_datasetIndex:r,options:{spanGaps:a}}=e,l=s.length,c=[];let u=o,h=t[0].start,d=h;function f(p,g,_,b){const v=a?-1:1;if(p!==g){for(p+=l;s[p%l].skip;)p-=v;for(;s[g%l].skip;)g+=v;p%l!==g%l&&(c.push({start:p%l,end:g%l,loop:_,style:b}),u=b,h=g%l)}}for(const p of t){h=a?h:p.start;let g=s[h%l],_;for(d=h+1;d<=p.end;d++){const b=s[d%l];_=hl(n.setContext(xs(i,{type:\"segment\",p0:g,p1:b,p0DataIndex:(d-1)%l,p1DataIndex:d%l,datasetIndex:r}))),S0(_,u)&&f(h,d-1,p.loop,u),g=b,u=_}h<d-1&&f(h,d-1,p.loop,u)}return c}function hl(e){return{backgroundColor:e.backgroundColor,borderCapStyle:e.borderCapStyle,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderJoinStyle:e.borderJoinStyle,borderWidth:e.borderWidth,borderColor:e.borderColor}}function S0(e,t){if(!t)return!1;const s=[],n=function(i,o){return qr(o)?(s.includes(o)||s.push(o),s.indexOf(o)):o};return JSON.stringify(e,n)!==JSON.stringify(t,n)}function fi(e,t,s){return e.options.clip?e[s]:t[s]}function k0(e,t){const{xScale:s,yScale:n}=e;return s&&n?{left:fi(s,t,\"left\"),right:fi(s,t,\"right\"),top:fi(n,t,\"top\"),bottom:fi(n,t,\"bottom\")}:t}function bh(e,t){const s=t._clip;if(s.disabled)return!1;const n=k0(t,e.chartArea);return{left:s.left===!1?0:n.left-(s.left===!0?0:s.left),right:s.right===!1?e.width:n.right+(s.right===!0?0:s.right),top:s.top===!1?0:n.top-(s.top===!0?0:s.top),bottom:s.bottom===!1?e.height:n.bottom+(s.bottom===!0?0:s.bottom)}}class M0{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,s,n,i){const o=s.listeners[i],r=s.duration;o.forEach(a=>a({chart:t,initial:s.initial,numSteps:r,currentStep:Math.min(n-s.start,r)}))}_refresh(){this._request||(this._running=!0,this._request=Zu.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let s=0;this._charts.forEach((n,i)=>{if(!n.running||!n.items.length)return;const o=n.items;let r=o.length-1,a=!1,l;for(;r>=0;--r)l=o[r],l._active?(l._total>n.duration&&(n.duration=l._total),l.tick(t),a=!0):(o[r]=o[o.length-1],o.pop());a&&(i.draw(),this._notify(i,n,t,\"progress\")),o.length||(n.running=!1,this._notify(i,n,t,\"complete\"),n.initial=!1),s+=o.length}),this._lastDate=t,s===0&&(this._running=!1)}_getAnims(t){const s=this._charts;let n=s.get(t);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},s.set(t,n)),n}listen(t,s,n){this._getAnims(t).listeners[s].push(n)}add(t,s){!s||!s.length||this._getAnims(t).items.push(...s)}has(t){return this._getAnims(t).items.length>0}start(t){const s=this._charts.get(t);s&&(s.running=!0,s.start=Date.now(),s.duration=s.items.reduce((n,i)=>Math.max(n,i._duration),0),this._refresh())}running(t){if(!this._running)return!1;const s=this._charts.get(t);return!(!s||!s.running||!s.items.length)}stop(t){const s=this._charts.get(t);if(!s||!s.items.length)return;const n=s.items;let i=n.length-1;for(;i>=0;--i)n[i].cancel();s.items=[],this._notify(t,s,Date.now(),\"complete\")}remove(t){return this._charts.delete(t)}}var je=new M0;const dl=\"transparent\",C0={boolean(e,t,s){return s>.5?t:e},color(e,t,s){const n=sl(e||dl),i=n.valid&&sl(t||dl);return i&&i.valid?i.mix(n,s).hexString():t},number(e,t,s){return e+(t-e)*s}};class P0{constructor(t,s,n,i){const o=s[n];i=wn([t.to,i,o,t.from]);const r=wn([t.from,o,i]);this._active=!0,this._fn=t.fn||C0[t.type||typeof r],this._easing=In[t.easing]||In.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=s,this._prop=n,this._from=r,this._to=i,this._promises=void 0}active(){return this._active}update(t,s,n){if(this._active){this._notify(!1);const i=this._target[this._prop],o=n-this._start,r=this._duration-o;this._start=n,this._duration=Math.floor(Math.max(r,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=wn([t.to,s,i,t.from]),this._from=wn([t.from,i,s])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const s=t-this._start,n=this._duration,i=this._prop,o=this._from,r=this._loop,a=this._to;let l;if(this._active=o!==a&&(r||s<n),!this._active){this._target[i]=a,this._notify(!0);return}if(s<0){this._target[i]=o;return}l=s/n%2,l=r&&l>1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(o,a,l)}wait(){const t=this._promises||(this._promises=[]);return new Promise((s,n)=>{t.push({res:s,rej:n})})}_notify(t){const s=t?\"res\":\"rej\",n=this._promises||[];for(let i=0;i<n.length;i++)n[i][s]()}}class _h{constructor(t,s){this._chart=t,this._properties=new Map,this.configure(s)}configure(t){if(!ot(t))return;const s=Object.keys(Rt.animation),n=this._properties;Object.getOwnPropertyNames(t).forEach(i=>{const o=t[i];if(!ot(o))return;const r={};for(const a of s)r[a]=o[a];(At(o.properties)&&o.properties||[i]).forEach(a=>{(a===i||!n.has(a))&&n.set(a,r)})})}_animateOptions(t,s){const n=s.options,i=R0(t,n);if(!i)return[];const o=this._createAnimations(i,n);return n.$shared&&A0(t.options.$animations,n).then(()=>{t.options=n},()=>{}),o}_createAnimations(t,s){const n=this._properties,i=[],o=t.$animations||(t.$animations={}),r=Object.keys(s),a=Date.now();let l;for(l=r.length-1;l>=0;--l){const c=r[l];if(c.charAt(0)===\"$\")continue;if(c===\"options\"){i.push(...this._animateOptions(t,s));continue}const u=s[c];let h=o[c];const d=n.get(c);if(h)if(d&&h.active()){h.update(d,u,a);continue}else h.cancel();if(!d||!d.duration){t[c]=u;continue}o[c]=h=new P0(d,t,c,u),i.push(h)}return i}update(t,s){if(this._properties.size===0){Object.assign(t,s);return}const n=this._createAnimations(t,s);if(n.length)return je.add(this._chart,n),!0}}function A0(e,t){const s=[],n=Object.keys(t);for(let i=0;i<n.length;i++){const o=e[n[i]];o&&o.active()&&s.push(o.wait())}return Promise.all(s)}function R0(e,t){if(!t)return;let s=e.options;if(!s){e.options=t;return}return s.$shared&&(e.options=s=Object.assign({},s,{$shared:!1,$animations:{}})),s}function fl(e,t){const s=e&&e.options||{},n=s.reverse,i=s.min===void 0?t:0,o=s.max===void 0?t:0;return{start:n?o:i,end:n?i:o}}function O0(e,t,s){if(s===!1)return!1;const n=fl(e,s),i=fl(t,s);return{top:i.end,right:n.end,bottom:i.start,left:n.start}}function T0(e){let t,s,n,i;return ot(e)?(t=e.top,s=e.right,n=e.bottom,i=e.left):t=s=n=i=e,{top:t,right:s,bottom:n,left:i,disabled:e===!1}}function yh(e,t){const s=[],n=e._getSortedDatasetMetas(t);let i,o;for(i=0,o=n.length;i<o;++i)s.push(n[i].index);return s}function pl(e,t,s,n={}){const i=e.keys,o=n.mode===\"single\";let r,a,l,c;if(t===null)return;let u=!1;for(r=0,a=i.length;r<a;++r){if(l=+i[r],l===s){if(u=!0,n.all)continue;break}c=e.values[l],Tt(c)&&(o||t===0||Fe(t)===Fe(c))&&(t+=c)}return!u&&!n.all?0:t}function E0(e,t){const{iScale:s,vScale:n}=t,i=s.axis===\"x\"?\"x\":\"y\",o=n.axis===\"x\"?\"x\":\"y\",r=Object.keys(e),a=new Array(r.length);let l,c,u;for(l=0,c=r.length;l<c;++l)u=r[l],a[l]={[i]:u,[o]:e[u]};return a}function Ro(e,t){const s=e&&e.options.stacked;return s||s===void 0&&t.stack!==void 0}function D0(e,t,s){return`${e.id}.${t.id}.${s.stack||s.type}`}function I0(e){const{min:t,max:s,minDefined:n,maxDefined:i}=e.getUserBounds();return{min:n?t:Number.NEGATIVE_INFINITY,max:i?s:Number.POSITIVE_INFINITY}}function L0(e,t,s){const n=e[t]||(e[t]={});return n[s]||(n[s]={})}function gl(e,t,s,n){for(const i of t.getMatchingVisibleMetas(n).reverse()){const o=e[i.index];if(s&&o>0||!s&&o<0)return i.index}return null}function ml(e,t){const{chart:s,_cachedMeta:n}=e,i=s._stacks||(s._stacks={}),{iScale:o,vScale:r,index:a}=n,l=o.axis,c=r.axis,u=D0(o,r,n),h=t.length;let d;for(let f=0;f<h;++f){const p=t[f],{[l]:g,[c]:_}=p,b=p._stacks||(p._stacks={});d=b[c]=L0(i,u,g),d[a]=_,d._top=gl(d,r,!0,n.type),d._bottom=gl(d,r,!1,n.type);const v=d._visualValues||(d._visualValues={});v[a]=_}}function Oo(e,t){const s=e.scales;return Object.keys(s).filter(n=>s[n].axis===t).shift()}function F0(e,t){return xs(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:\"default\",type:\"dataset\"})}function N0(e,t,s){return xs(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:s,index:t,mode:\"default\",type:\"data\"})}function pn(e,t){const s=e.controller.index,n=e.vScale&&e.vScale.axis;if(n){t=t||e._parsed;for(const i of t){const o=i._stacks;if(!o||o[n]===void 0||o[n][s]===void 0)return;delete o[n][s],o[n]._visualValues!==void 0&&o[n]._visualValues[s]!==void 0&&delete o[n]._visualValues[s]}}}const To=e=>e===\"reset\"||e===\"none\",bl=(e,t)=>t?e:Object.assign({},e),B0=(e,t,s)=>e&&!t.hidden&&t._stacked&&{keys:yh(s,!0),values:null};class vs{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,s){this.chart=t,this._ctx=t.ctx,this.index=s,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Ro(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(\"filler\")&&console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\")}updateIndex(t){this.index!==t&&pn(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,s=this._cachedMeta,n=this.getDataset(),i=(h,d,f,p)=>h===\"x\"?d:h===\"r\"?p:f,o=s.xAxisID=Z(n.xAxisID,Oo(t,\"x\")),r=s.yAxisID=Z(n.yAxisID,Oo(t,\"y\")),a=s.rAxisID=Z(n.rAxisID,Oo(t,\"r\")),l=s.indexAxis,c=s.iAxisID=i(l,o,r,a),u=s.vAxisID=i(l,r,o,a);s.xScale=this.getScaleForId(o),s.yScale=this.getScaleForId(r),s.rScale=this.getScaleForId(a),s.iScale=this.getScaleForId(c),s.vScale=this.getScaleForId(u)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const s=this._cachedMeta;return t===s.iScale?s.vScale:s.iScale}reset(){this._update(\"reset\")}_destroy(){const t=this._cachedMeta;this._data&&Za(this._data,this),t._stacked&&pn(t)}_dataCheck(){const t=this.getDataset(),s=t.data||(t.data=[]),n=this._data;if(ot(s)){const i=this._cachedMeta;this._data=E0(s,i)}else if(n!==s){if(n){Za(n,this);const i=this._cachedMeta;pn(i),i._parsed=[]}s&&Object.isExtensible(s)&&w_(s,this),this._syncList=[],this._data=s}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const s=this._cachedMeta,n=this.getDataset();let i=!1;this._dataCheck();const o=s._stacked;s._stacked=Ro(s.vScale,s),s.stack!==n.stack&&(i=!0,pn(s),s.stack=n.stack),this._resyncElements(t),(i||o!==s._stacked)&&(ml(this,s._parsed),s._stacked=Ro(s.vScale,s))}configure(){const t=this.chart.config,s=t.datasetScopeKeys(this._type),n=t.getOptionScopes(this.getDataset(),s,!0);this.options=t.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,s){const{_cachedMeta:n,_data:i}=this,{iScale:o,_stacked:r}=n,a=o.axis;let l=t===0&&s===i.length?!0:n._sorted,c=t>0&&n._parsed[t-1],u,h,d;if(this._parsing===!1)n._parsed=i,n._sorted=!0,d=i;else{At(i[t])?d=this.parseArrayData(n,i,t,s):ot(i[t])?d=this.parseObjectData(n,i,t,s):d=this.parsePrimitiveData(n,i,t,s);const f=()=>h[a]===null||c&&h[a]<c[a];for(u=0;u<s;++u)n._parsed[u+t]=h=d[u],l&&(f()&&(l=!1),c=h);n._sorted=l}r&&ml(this,d)}parsePrimitiveData(t,s,n,i){const{iScale:o,vScale:r}=t,a=o.axis,l=r.axis,c=o.getLabels(),u=o===r,h=new Array(i);let d,f,p;for(d=0,f=i;d<f;++d)p=d+n,h[d]={[a]:u||o.parse(c[p],p),[l]:r.parse(s[p],p)};return h}parseArrayData(t,s,n,i){const{xScale:o,yScale:r}=t,a=new Array(i);let l,c,u,h;for(l=0,c=i;l<c;++l)u=l+n,h=s[u],a[l]={x:o.parse(h[0],u),y:r.parse(h[1],u)};return a}parseObjectData(t,s,n,i){const{xScale:o,yScale:r}=t,{xAxisKey:a=\"x\",yAxisKey:l=\"y\"}=this._parsing,c=new Array(i);let u,h,d,f;for(u=0,h=i;u<h;++u)d=u+n,f=s[d],c[u]={x:o.parse(bs(f,a),d),y:r.parse(bs(f,l),d)};return c}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,s,n){const i=this.chart,o=this._cachedMeta,r=s[t.axis],a={keys:yh(i,!0),values:s._stacks[t.axis]._visualValues};return pl(a,r,o.index,{mode:n})}updateRangeFromParsed(t,s,n,i){const o=n[s.axis];let r=o===null?NaN:o;const a=i&&n._stacks[s.axis];i&&a&&(i.values=a,r=pl(i,o,this._cachedMeta.index)),t.min=Math.min(t.min,r),t.max=Math.max(t.max,r)}getMinMax(t,s){const n=this._cachedMeta,i=n._parsed,o=n._sorted&&t===n.iScale,r=i.length,a=this._getOtherScale(t),l=B0(s,n,this.chart),c={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:u,max:h}=I0(a);let d,f;function p(){f=i[d];const g=f[a.axis];return!Tt(f[t.axis])||u>g||h<g}for(d=0;d<r&&!(!p()&&(this.updateRangeFromParsed(c,t,f,l),o));++d);if(o){for(d=r-1;d>=0;--d)if(!p()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){const s=this._cachedMeta._parsed,n=[];let i,o,r;for(i=0,o=s.length;i<o;++i)r=s[i][t.axis],Tt(r)&&n.push(r);return n}getMaxOverflow(){return!1}getLabelAndValue(t){const s=this._cachedMeta,n=s.iScale,i=s.vScale,o=this.getParsed(t);return{label:n?\"\"+n.getLabelForValue(o[n.axis]):\"\",value:i?\"\"+i.getLabelForValue(o[i.axis]):\"\"}}_update(t){const s=this._cachedMeta;this.update(t||\"default\"),s._clip=T0(Z(this.options.clip,O0(s.xScale,s.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,s=this.chart,n=this._cachedMeta,i=n.data||[],o=s.chartArea,r=[],a=this._drawStart||0,l=this._drawCount||i.length-a,c=this.options.drawActiveElementsOnTop;let u;for(n.dataset&&n.dataset.draw(t,o,a,l),u=a;u<a+l;++u){const h=i[u];h.hidden||(h.active&&c?r.push(h):h.draw(t,o))}for(u=0;u<r.length;++u)r[u].draw(t,o)}getStyle(t,s){const n=s?\"active\":\"default\";return t===void 0&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(n):this.resolveDataElementOptions(t||0,n)}getContext(t,s,n){const i=this.getDataset();let o;if(t>=0&&t<this._cachedMeta.data.length){const r=this._cachedMeta.data[t];o=r.$context||(r.$context=N0(this.getContext(),t,r)),o.parsed=this.getParsed(t),o.raw=i.data[t],o.index=o.dataIndex=t}else o=this.$context||(this.$context=F0(this.chart.getContext(),this.index)),o.dataset=i,o.index=o.datasetIndex=this.index;return o.active=!!s,o.mode=n,o}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,s){return this._resolveElementOptions(this.dataElementType.id,s,t)}_resolveElementOptions(t,s=\"default\",n){const i=s===\"active\",o=this._cachedDataOpts,r=t+\"-\"+s,a=o[r],l=this.enableOptionSharing&&qn(n);if(a)return bl(a,l);const c=this.chart.config,u=c.datasetElementScopeKeys(this._type,t),h=i?[`${t}Hover`,\"hover\",t,\"\"]:[t,\"\"],d=c.getOptionScopes(this.getDataset(),u),f=Object.keys(Rt.elements[t]),p=()=>this.getContext(n,i,s),g=c.resolveNamedOptions(d,f,p,h);return g.$shared&&(g.$shared=l,o[r]=Object.freeze(bl(g,l))),g}_resolveAnimations(t,s,n){const i=this.chart,o=this._cachedDataOpts,r=`animation-${s}`,a=o[r];if(a)return a;let l;if(i.options.animation!==!1){const u=this.chart.config,h=u.datasetAnimationScopeKeys(this._type,s),d=u.getOptionScopes(this.getDataset(),h);l=u.createResolver(d,this.getContext(t,n,s))}const c=new _h(i,l&&l.animations);return l&&l._cacheable&&(o[r]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,s){return!s||To(t)||this.chart._animationsDisabled}_getSharedOptions(t,s){const n=this.resolveDataElementOptions(t,s),i=this._sharedOptions,o=this.getSharedOptions(n),r=this.includeOptions(s,o)||o!==i;return this.updateSharedOptions(o,s,n),{sharedOptions:o,includeOptions:r}}updateElement(t,s,n,i){To(i)?Object.assign(t,n):this._resolveAnimations(s,i).update(t,n)}updateSharedOptions(t,s,n){t&&!To(s)&&this._resolveAnimations(void 0,s).update(t,n)}_setStyle(t,s,n,i){t.active=i;const o=this.getStyle(s,i);this._resolveAnimations(s,n,i).update(t,{options:!i&&this.getSharedOptions(o)||o})}removeHoverStyle(t,s,n){this._setStyle(t,n,\"active\",!1)}setHoverStyle(t,s,n){this._setStyle(t,n,\"active\",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!0)}_resyncElements(t){const s=this._data,n=this._cachedMeta.data;for(const[a,l,c]of this._syncList)this[a](l,c);this._syncList=[];const i=n.length,o=s.length,r=Math.min(o,i);r&&this.parse(0,r),o>i?this._insertElements(i,o-i,t):o<i&&this._removeElements(o,i-o)}_insertElements(t,s,n=!0){const i=this._cachedMeta,o=i.data,r=t+s;let a;const l=c=>{for(c.length+=s,a=c.length-1;a>=r;a--)c[a]=c[a-s]};for(l(o),a=t;a<r;++a)o[a]=new this.dataElementType;this._parsing&&l(i._parsed),this.parse(t,s),n&&this.updateElements(o,t,s,\"reset\")}updateElements(t,s,n,i){}_removeElements(t,s){const n=this._cachedMeta;if(this._parsing){const i=n._parsed.splice(t,s);n._stacked&&pn(n,i)}n.data.splice(t,s)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[s,n,i]=t;this[s](n,i)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync([\"_insertElements\",this.getDataset().data.length-t,t])}_onDataPop(){this._sync([\"_removeElements\",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync([\"_removeElements\",0,1])}_onDataSplice(t,s){s&&this._sync([\"_removeElements\",t,s]);const n=arguments.length-2;n&&this._sync([\"_insertElements\",t,n])}_onDataUnshift(){this._sync([\"_insertElements\",0,arguments.length])}}function $0(e,t){if(!e._cache.$bar){const s=e.getMatchingVisibleMetas(t);let n=[];for(let i=0,o=s.length;i<o;i++)n=n.concat(s[i].controller.getAllParsedValues(e));e._cache.$bar=Qu(n.sort((i,o)=>i-o))}return e._cache.$bar}function V0(e){const t=e.iScale,s=$0(t,e.type);let n=t._length,i,o,r,a;const l=()=>{r===32767||r===-32768||(qn(a)&&(n=Math.min(n,Math.abs(r-a)||n)),a=r)};for(i=0,o=s.length;i<o;++i)r=t.getPixelForValue(s[i]),l();for(a=void 0,i=0,o=t.ticks.length;i<o;++i)r=t.getPixelForTick(i),l();return n}function j0(e,t,s,n){const i=s.barThickness;let o,r;return it(i)?(o=t.min*s.categoryPercentage,r=s.barPercentage):(o=i*n,r=1),{chunk:o/n,ratio:r,start:t.pixels[e]-o/2}}function H0(e,t,s,n){const i=t.pixels,o=i[e];let r=e>0?i[e-1]:null,a=e<i.length-1?i[e+1]:null;const l=s.categoryPercentage;r===null&&(r=o-(a===null?t.end-t.start:a-o)),a===null&&(a=o+o-r);const c=o-(o-Math.min(r,a))/2*l;return{chunk:Math.abs(a-r)/2*l/n,ratio:s.barPercentage,start:c}}function z0(e,t,s,n){const i=s.parse(e[0],n),o=s.parse(e[1],n),r=Math.min(i,o),a=Math.max(i,o);let l=r,c=a;Math.abs(r)>Math.abs(a)&&(l=a,c=r),t[s.axis]=c,t._custom={barStart:l,barEnd:c,start:i,end:o,min:r,max:a}}function xh(e,t,s,n){return At(e)?z0(e,t,s,n):t[s.axis]=s.parse(e,n),t}function _l(e,t,s,n){const i=e.iScale,o=e.vScale,r=i.getLabels(),a=i===o,l=[];let c,u,h,d;for(c=s,u=s+n;c<u;++c)d=t[c],h={},h[i.axis]=a||i.parse(r[c],c),l.push(xh(d,h,o,c));return l}function Eo(e){return e&&e.barStart!==void 0&&e.barEnd!==void 0}function W0(e,t,s){return e!==0?Fe(e):(t.isHorizontal()?1:-1)*(t.min>=s?1:-1)}function q0(e){let t,s,n,i,o;return e.horizontal?(t=e.base>e.x,s=\"left\",n=\"right\"):(t=e.base<e.y,s=\"bottom\",n=\"top\"),t?(i=\"end\",o=\"start\"):(i=\"start\",o=\"end\"),{start:s,end:n,reverse:t,top:i,bottom:o}}function U0(e,t,s,n){let i=t.borderSkipped;const o={};if(!i){e.borderSkipped=o;return}if(i===!0){e.borderSkipped={top:!0,right:!0,bottom:!0,left:!0};return}const{start:r,end:a,reverse:l,top:c,bottom:u}=q0(e);i===\"middle\"&&s&&(e.enableBorderRadius=!0,(s._top||0)===n?i=c:(s._bottom||0)===n?i=u:(o[yl(u,r,a,l)]=!0,i=c)),o[yl(i,r,a,l)]=!0,e.borderSkipped=o}function yl(e,t,s,n){return n?(e=K0(e,t,s),e=xl(e,s,t)):e=xl(e,t,s),e}function K0(e,t,s){return e===t?s:e===s?t:e}function xl(e,t,s){return e===\"start\"?t:e===\"end\"?s:e}function G0(e,{inflateAmount:t},s){e.inflateAmount=t===\"auto\"?s===1?.33:0:t}class Y0 extends vs{static id=\"bar\";static defaults={datasetElementType:!1,dataElementType:\"bar\",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"base\",\"width\",\"height\"]}}};static overrides={scales:{_index_:{type:\"category\",offset:!0,grid:{offset:!0}},_value_:{type:\"linear\",beginAtZero:!0}}};parsePrimitiveData(t,s,n,i){return _l(t,s,n,i)}parseArrayData(t,s,n,i){return _l(t,s,n,i)}parseObjectData(t,s,n,i){const{iScale:o,vScale:r}=t,{xAxisKey:a=\"x\",yAxisKey:l=\"y\"}=this._parsing,c=o.axis===\"x\"?a:l,u=r.axis===\"x\"?a:l,h=[];let d,f,p,g;for(d=n,f=n+i;d<f;++d)g=s[d],p={},p[o.axis]=o.parse(bs(g,c),d),h.push(xh(bs(g,u),p,r,d));return h}updateRangeFromParsed(t,s,n,i){super.updateRangeFromParsed(t,s,n,i);const o=n._custom;o&&s===this._cachedMeta.vScale&&(t.min=Math.min(t.min,o.min),t.max=Math.max(t.max,o.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const s=this._cachedMeta,{iScale:n,vScale:i}=s,o=this.getParsed(t),r=o._custom,a=Eo(r)?\"[\"+r.start+\", \"+r.end+\"]\":\"\"+i.getLabelForValue(o[i.axis]);return{label:\"\"+n.getLabelForValue(o[n.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize();const t=this._cachedMeta;t.stack=this.getDataset().stack}update(t){const s=this._cachedMeta;this.updateElements(s.data,0,s.data.length,t)}updateElements(t,s,n,i){const o=i===\"reset\",{index:r,_cachedMeta:{vScale:a}}=this,l=a.getBasePixel(),c=a.isHorizontal(),u=this._getRuler(),{sharedOptions:h,includeOptions:d}=this._getSharedOptions(s,i);for(let f=s;f<s+n;f++){const p=this.getParsed(f),g=o||it(p[a.axis])?{base:l,head:l}:this._calculateBarValuePixels(f),_=this._calculateBarIndexPixels(f,u),b=(p._stacks||{})[a.axis],v={horizontal:c,base:g.base,enableBorderRadius:!b||Eo(p._custom)||r===b._top||r===b._bottom,x:c?g.head:_.center,y:c?_.center:g.head,height:c?_.size:Math.abs(g.size),width:c?Math.abs(g.size):_.size};d&&(v.options=h||this.resolveDataElementOptions(f,t[f].active?\"active\":i));const M=v.options||t[f].options;U0(v,M,b,r),G0(v,M,u.ratio),this.updateElement(t[f],f,v,i)}}_getStacks(t,s){const{iScale:n}=this._cachedMeta,i=n.getMatchingVisibleMetas(this._type).filter(u=>u.controller.options.grouped),o=n.options.stacked,r=[],a=this._cachedMeta.controller.getParsed(s),l=a&&a[n.axis],c=u=>{const h=u._parsed.find(f=>f[n.axis]===l),d=h&&h[u.vScale.axis];if(it(d)||isNaN(d))return!0};for(const u of i)if(!(s!==void 0&&c(u))&&((o===!1||r.indexOf(u.stack)===-1||o===void 0&&u.stack===void 0)&&r.push(u.stack),u.index===t))break;return r.length||r.push(void 0),r}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,s=this.chart.options.indexAxis;return Object.keys(t).filter(n=>t[n].axis===s).shift()}_getAxis(){const t={},s=this.getFirstScaleIdForIndexAxis();for(const n of this.chart.data.datasets)t[Z(this.chart.options.indexAxis===\"x\"?n.xAxisID:n.yAxisID,s)]=!0;return Object.keys(t)}_getStackIndex(t,s,n){const i=this._getStacks(t,n),o=s!==void 0?i.indexOf(s):-1;return o===-1?i.length-1:o}_getRuler(){const t=this.options,s=this._cachedMeta,n=s.iScale,i=[];let o,r;for(o=0,r=s.data.length;o<r;++o)i.push(n.getPixelForValue(this.getParsed(o)[n.axis],o));const a=t.barThickness;return{min:a||V0(s),pixels:i,start:n._startPixel,end:n._endPixel,stackCount:this._getStackCount(),scale:n,grouped:t.grouped,ratio:a?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:s,_stacked:n,index:i},options:{base:o,minBarLength:r}}=this,a=o||0,l=this.getParsed(t),c=l._custom,u=Eo(c);let h=l[s.axis],d=0,f=n?this.applyStack(s,l,n):h,p,g;f!==h&&(d=f-h,f=h),u&&(h=c.barStart,f=c.barEnd-c.barStart,h!==0&&Fe(h)!==Fe(c.barEnd)&&(d=0),d+=h);const _=!it(o)&&!u?o:d;let b=s.getPixelForValue(_);if(this.chart.getDataVisibility(t)?p=s.getPixelForValue(d+f):p=b,g=p-b,Math.abs(g)<r){g=W0(g,s,a)*r,h===a&&(b-=g/2);const v=s.getPixelForDecimal(0),M=s.getPixelForDecimal(1),S=Math.min(v,M),w=Math.max(v,M);b=Math.max(Math.min(b,w),S),p=b+g,n&&!u&&(l._stacks[s.axis]._visualValues[i]=s.getValueForPixel(p)-s.getValueForPixel(b))}if(b===s.getPixelForValue(a)){const v=Fe(g)*s.getLineWidthForValue(a)/2;b+=v,g-=v}return{size:g,base:b,head:p,center:p+g/2}}_calculateBarIndexPixels(t,s){const n=s.scale,i=this.options,o=i.skipNull,r=Z(i.maxBarThickness,1/0);let a,l;const c=this._getAxisCount();if(s.grouped){const u=o?this._getStackCount(t):s.stackCount,h=i.barThickness===\"flex\"?H0(t,s,i,u*c):j0(t,s,i,u*c),d=this.chart.options.indexAxis===\"x\"?this.getDataset().xAxisID:this.getDataset().yAxisID,f=this._getAxis().indexOf(Z(d,this.getFirstScaleIdForIndexAxis())),p=this._getStackIndex(this.index,this._cachedMeta.stack,o?t:void 0)+f;a=h.start+h.chunk*p+h.chunk/2,l=Math.min(r,h.chunk*h.ratio)}else a=n.getPixelForValue(this.getParsed(t)[n.axis],t),l=Math.min(r,s.min*s.ratio);return{base:a-l/2,head:a+l/2,center:a,size:l}}draw(){const t=this._cachedMeta,s=t.vScale,n=t.data,i=n.length;let o=0;for(;o<i;++o)this.getParsed(o)[s.axis]!==null&&!n[o].hidden&&n[o].draw(this._ctx)}}class X0 extends vs{static id=\"bubble\";static defaults={datasetElementType:!1,dataElementType:\"point\",animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"borderWidth\",\"radius\"]}}};static overrides={scales:{x:{type:\"linear\"},y:{type:\"linear\"}}};initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,s,n,i){const o=super.parsePrimitiveData(t,s,n,i);for(let r=0;r<o.length;r++)o[r]._custom=this.resolveDataElementOptions(r+n).radius;return o}parseArrayData(t,s,n,i){const o=super.parseArrayData(t,s,n,i);for(let r=0;r<o.length;r++){const a=s[n+r];o[r]._custom=Z(a[2],this.resolveDataElementOptions(r+n).radius)}return o}parseObjectData(t,s,n,i){const o=super.parseObjectData(t,s,n,i);for(let r=0;r<o.length;r++){const a=s[n+r];o[r]._custom=Z(a&&a.r&&+a.r,this.resolveDataElementOptions(r+n).radius)}return o}getMaxOverflow(){const t=this._cachedMeta.data;let s=0;for(let n=t.length-1;n>=0;--n)s=Math.max(s,t[n].size(this.resolveDataElementOptions(n))/2);return s>0&&s}getLabelAndValue(t){const s=this._cachedMeta,n=this.chart.data.labels||[],{xScale:i,yScale:o}=s,r=this.getParsed(t),a=i.getLabelForValue(r.x),l=o.getLabelForValue(r.y),c=r._custom;return{label:n[t]||\"\",value:\"(\"+a+\", \"+l+(c?\", \"+c:\"\")+\")\"}}update(t){const s=this._cachedMeta.data;this.updateElements(s,0,s.length,t)}updateElements(t,s,n,i){const o=i===\"reset\",{iScale:r,vScale:a}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(s,i),u=r.axis,h=a.axis;for(let d=s;d<s+n;d++){const f=t[d],p=!o&&this.getParsed(d),g={},_=g[u]=o?r.getPixelForDecimal(.5):r.getPixelForValue(p[u]),b=g[h]=o?a.getBasePixel():a.getPixelForValue(p[h]);g.skip=isNaN(_)||isNaN(b),c&&(g.options=l||this.resolveDataElementOptions(d,f.active?\"active\":i),o&&(g.options.radius=0)),this.updateElement(f,d,g,i)}}resolveDataElementOptions(t,s){const n=this.getParsed(t);let i=super.resolveDataElementOptions(t,s);i.$shared&&(i=Object.assign({},i,{$shared:!1}));const o=i.radius;return s!==\"active\"&&(i.radius=0),i.radius+=Z(n&&n._custom,o),i}}function J0(e,t,s){let n=1,i=1,o=0,r=0;if(t<Mt){const a=e,l=a+t,c=Math.cos(a),u=Math.sin(a),h=Math.cos(l),d=Math.sin(l),f=(M,S,w)=>Un(M,a,l,!0)?1:Math.max(S,S*s,w,w*s),p=(M,S,w)=>Un(M,a,l,!0)?-1:Math.min(S,S*s,w,w*s),g=f(0,c,h),_=f(Dt,u,d),b=p(ht,c,h),v=p(ht+Dt,u,d);n=(g-b)/2,i=(_-v)/2,o=-(g+b)/2,r=-(_+v)/2}return{ratioX:n,ratioY:i,offsetX:o,offsetY:r}}class Qr extends vs{static id=\"doughnut\";static defaults={datasetElementType:!1,dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:\"number\",properties:[\"circumference\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"startAngle\",\"x\",\"y\",\"offset\",\"borderWidth\",\"spacing\"]}},cutout:\"50%\",rotation:0,circumference:360,radius:\"100%\",spacing:0,indexAxis:\"r\"};static descriptors={_scriptable:t=>t!==\"spacing\",_indexable:t=>t!==\"spacing\"&&!t.startsWith(\"borderDash\")&&!t.startsWith(\"hoverBorderDash\")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const s=t.data,{labels:{pointStyle:n,textAlign:i,color:o,useBorderRadius:r,borderRadius:a}}=t.legend.options;return s.labels.length&&s.datasets.length?s.labels.map((l,c)=>{const h=t.getDatasetMeta(0).controller.getStyle(c);return{text:l,fillStyle:h.backgroundColor,fontColor:o,hidden:!t.getDataVisibility(c),lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:h.borderWidth,strokeStyle:h.borderColor,textAlign:i,pointStyle:n,borderRadius:r&&(a||h.borderRadius),index:c}}):[]}},onClick(t,s,n){n.chart.toggleDataVisibility(s.index),n.chart.update()}}}};constructor(t,s){super(t,s),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,s){const n=this.getDataset().data,i=this._cachedMeta;if(this._parsing===!1)i._parsed=n;else{let o=l=>+n[l];if(ot(n[t])){const{key:l=\"value\"}=this._parsing;o=c=>+bs(n[c],l)}let r,a;for(r=t,a=t+s;r<a;++r)i._parsed[r]=o(r)}}_getRotation(){return ve(this.options.rotation-90)}_getCircumference(){return ve(this.options.circumference)}_getRotationExtents(){let t=Mt,s=-Mt;for(let n=0;n<this.chart.data.datasets.length;++n)if(this.chart.isDatasetVisible(n)&&this.chart.getDatasetMeta(n).type===this._type){const i=this.chart.getDatasetMeta(n).controller,o=i._getRotation(),r=i._getCircumference();t=Math.min(t,o),s=Math.max(s,o+r)}return{rotation:t,circumference:s-t}}update(t){const s=this.chart,{chartArea:n}=s,i=this._cachedMeta,o=i.data,r=this.getMaxBorderWidth()+this.getMaxOffset(o)+this.options.spacing,a=Math.max((Math.min(n.width,n.height)-r)/2,0),l=Math.min(a_(this.options.cutout,a),1),c=this._getRingWeight(this.index),{circumference:u,rotation:h}=this._getRotationExtents(),{ratioX:d,ratioY:f,offsetX:p,offsetY:g}=J0(h,u,l),_=(n.width-r)/d,b=(n.height-r)/f,v=Math.max(Math.min(_,b)/2,0),M=Ku(this.options.radius,v),S=Math.max(M*l,0),w=(M-S)/this._getVisibleDatasetWeightTotal();this.offsetX=p*M,this.offsetY=g*M,i.total=this.calculateTotal(),this.outerRadius=M-w*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-w*c,0),this.updateElements(o,0,o.length,t)}_circumference(t,s){const n=this.options,i=this._cachedMeta,o=this._getCircumference();return s&&n.animation.animateRotate||!this.chart.getDataVisibility(t)||i._parsed[t]===null||i.data[t].hidden?0:this.calculateCircumference(i._parsed[t]*o/Mt)}updateElements(t,s,n,i){const o=i===\"reset\",r=this.chart,a=r.chartArea,c=r.options.animation,u=(a.left+a.right)/2,h=(a.top+a.bottom)/2,d=o&&c.animateScale,f=d?0:this.innerRadius,p=d?0:this.outerRadius,{sharedOptions:g,includeOptions:_}=this._getSharedOptions(s,i);let b=this._getRotation(),v;for(v=0;v<s;++v)b+=this._circumference(v,o);for(v=s;v<s+n;++v){const M=this._circumference(v,o),S=t[v],w={x:u+this.offsetX,y:h+this.offsetY,startAngle:b,endAngle:b+M,circumference:M,outerRadius:p,innerRadius:f};_&&(w.options=g||this.resolveDataElementOptions(v,S.active?\"active\":i)),b+=M,this.updateElement(S,v,w,i)}}calculateTotal(){const t=this._cachedMeta,s=t.data;let n=0,i;for(i=0;i<s.length;i++){const o=t._parsed[i];o!==null&&!isNaN(o)&&this.chart.getDataVisibility(i)&&!s[i].hidden&&(n+=Math.abs(o))}return n}calculateCircumference(t){const s=this._cachedMeta.total;return s>0&&!isNaN(t)?Mt*(Math.abs(t)/s):0}getLabelAndValue(t){const s=this._cachedMeta,n=this.chart,i=n.data.labels||[],o=ei(s._parsed[t],n.options.locale);return{label:i[t]||\"\",value:o}}getMaxBorderWidth(t){let s=0;const n=this.chart;let i,o,r,a,l;if(!t){for(i=0,o=n.data.datasets.length;i<o;++i)if(n.isDatasetVisible(i)){r=n.getDatasetMeta(i),t=r.data,a=r.controller;break}}if(!t)return 0;for(i=0,o=t.length;i<o;++i)l=a.resolveDataElementOptions(i),l.borderAlign!==\"inner\"&&(s=Math.max(s,l.borderWidth||0,l.hoverBorderWidth||0));return s}getMaxOffset(t){let s=0;for(let n=0,i=t.length;n<i;++n){const o=this.resolveDataElementOptions(n);s=Math.max(s,o.offset||0,o.hoverOffset||0)}return s}_getRingWeightOffset(t){let s=0;for(let n=0;n<t;++n)this.chart.isDatasetVisible(n)&&(s+=this._getRingWeight(n));return s}_getRingWeight(t){return Math.max(Z(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}class Q0 extends vs{static id=\"line\";static defaults={datasetElementType:\"line\",dataElementType:\"point\",showLine:!0,spanGaps:!1};static overrides={scales:{_index_:{type:\"category\"},_value_:{type:\"linear\"}}};initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const s=this._cachedMeta,{dataset:n,data:i=[],_dataset:o}=s,r=this.chart._animationsDisabled;let{start:a,count:l}=eh(s,i,r);this._drawStart=a,this._drawCount=l,sh(s)&&(a=0,l=i.length),n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!o._decimated,n.points=i;const c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(n,void 0,{animated:!r,options:c},t),this.updateElements(i,a,l,t)}updateElements(t,s,n,i){const o=i===\"reset\",{iScale:r,vScale:a,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:u,includeOptions:h}=this._getSharedOptions(s,i),d=r.axis,f=a.axis,{spanGaps:p,segment:g}=this.options,_=nn(p)?p:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||i===\"none\",v=s+n,M=t.length;let S=s>0&&this.getParsed(s-1);for(let w=0;w<M;++w){const R=t[w],k=b?R:{};if(w<s||w>=v){k.skip=!0;continue}const P=this.getParsed(w),C=it(P[f]),O=k[d]=r.getPixelForValue(P[d],w),B=k[f]=o||C?a.getBasePixel():a.getPixelForValue(l?this.applyStack(a,P,l):P[f],w);k.skip=isNaN(O)||isNaN(B)||C,k.stop=w>0&&Math.abs(P[d]-S[d])>_,g&&(k.parsed=P,k.raw=c.data[w]),h&&(k.options=u||this.resolveDataElementOptions(w,R.active?\"active\":i)),b||this.updateElement(R,w,k,i),S=P}}getMaxOverflow(){const t=this._cachedMeta,s=t.dataset,n=s.options&&s.options.borderWidth||0,i=t.data||[];if(!i.length)return n;const o=i[0].size(this.resolveDataElementOptions(0)),r=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(n,o,r)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}class vh extends vs{static id=\"polarArea\";static defaults={dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"]}},indexAxis:\"r\",startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const s=t.data;if(s.labels.length&&s.datasets.length){const{labels:{pointStyle:n,color:i}}=t.legend.options;return s.labels.map((o,r)=>{const l=t.getDatasetMeta(0).controller.getStyle(r);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:i,lineWidth:l.borderWidth,pointStyle:n,hidden:!t.getDataVisibility(r),index:r}})}return[]}},onClick(t,s,n){n.chart.toggleDataVisibility(s.index),n.chart.update()}}},scales:{r:{type:\"radialLinear\",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,s){super(t,s),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const s=this._cachedMeta,n=this.chart,i=n.data.labels||[],o=ei(s._parsed[t].r,n.options.locale);return{label:i[t]||\"\",value:o}}parseObjectData(t,s,n,i){return uh.bind(this)(t,s,n,i)}update(t){const s=this._cachedMeta.data;this._updateRadius(),this.updateElements(s,0,s.length,t)}getMinMax(){const t=this._cachedMeta,s={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((n,i)=>{const o=this.getParsed(i).r;!isNaN(o)&&this.chart.getDataVisibility(i)&&(o<s.min&&(s.min=o),o>s.max&&(s.max=o))}),s}_updateRadius(){const t=this.chart,s=t.chartArea,n=t.options,i=Math.min(s.right-s.left,s.bottom-s.top),o=Math.max(i/2,0),r=Math.max(n.cutoutPercentage?o/100*n.cutoutPercentage:1,0),a=(o-r)/t.getVisibleDatasetCount();this.outerRadius=o-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,s,n,i){const o=i===\"reset\",r=this.chart,l=r.options.animation,c=this._cachedMeta.rScale,u=c.xCenter,h=c.yCenter,d=c.getIndexAngle(0)-.5*ht;let f=d,p;const g=360/this.countVisibleElements();for(p=0;p<s;++p)f+=this._computeAngle(p,i,g);for(p=s;p<s+n;p++){const _=t[p];let b=f,v=f+this._computeAngle(p,i,g),M=r.getDataVisibility(p)?c.getDistanceFromCenterForValue(this.getParsed(p).r):0;f=v,o&&(l.animateScale&&(M=0),l.animateRotate&&(b=v=d));const S={x:u,y:h,innerRadius:0,outerRadius:M,startAngle:b,endAngle:v,options:this.resolveDataElementOptions(p,_.active?\"active\":i)};this.updateElement(_,p,S,i)}}countVisibleElements(){const t=this._cachedMeta;let s=0;return t.data.forEach((n,i)=>{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&s++}),s}_computeAngle(t,s,n){return this.chart.getDataVisibility(t)?ve(this.resolveDataElementOptions(t,s).angle||n):0}}class Z0 extends Qr{static id=\"pie\";static defaults={cutout:0,rotation:0,circumference:360,radius:\"100%\"}}class ty extends vs{static id=\"radar\";static defaults={datasetElementType:\"line\",dataElementType:\"point\",indexAxis:\"r\",showLine:!0,elements:{line:{fill:\"start\"}}};static overrides={aspectRatio:1,scales:{r:{type:\"radialLinear\"}}};getLabelAndValue(t){const s=this._cachedMeta.vScale,n=this.getParsed(t);return{label:s.getLabels()[t],value:\"\"+s.getLabelForValue(n[s.axis])}}parseObjectData(t,s,n,i){return uh.bind(this)(t,s,n,i)}update(t){const s=this._cachedMeta,n=s.dataset,i=s.data||[],o=s.iScale.getLabels();if(n.points=i,t!==\"resize\"){const r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0);const a={_loop:!0,_fullLoop:o.length===i.length,options:r};this.updateElement(n,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,s,n,i){const o=this._cachedMeta.rScale,r=i===\"reset\";for(let a=s;a<s+n;a++){const l=t[a],c=this.resolveDataElementOptions(a,l.active?\"active\":i),u=o.getPointPositionForValue(a,this.getParsed(a).r),h=r?o.xCenter:u.x,d=r?o.yCenter:u.y,f={x:h,y:d,angle:u.angle,skip:isNaN(h)||isNaN(d),options:c};this.updateElement(l,a,f,i)}}}class ey extends vs{static id=\"scatter\";static defaults={datasetElementType:!1,dataElementType:\"point\",showLine:!1,fill:!1};static overrides={interaction:{mode:\"point\"},scales:{x:{type:\"linear\"},y:{type:\"linear\"}}};getLabelAndValue(t){const s=this._cachedMeta,n=this.chart.data.labels||[],{xScale:i,yScale:o}=s,r=this.getParsed(t),a=i.getLabelForValue(r.x),l=o.getLabelForValue(r.y);return{label:n[t]||\"\",value:\"(\"+a+\", \"+l+\")\"}}update(t){const s=this._cachedMeta,{data:n=[]}=s,i=this.chart._animationsDisabled;let{start:o,count:r}=eh(s,n,i);if(this._drawStart=o,this._drawCount=r,sh(s)&&(o=0,r=n.length),this.options.showLine){this.datasetElementType||this.addElements();const{dataset:a,_dataset:l}=s;a._chart=this.chart,a._datasetIndex=this.index,a._decimated=!!l._decimated,a.points=n;const c=this.resolveDatasetElementOptions(t);c.segment=this.options.segment,this.updateElement(a,void 0,{animated:!i,options:c},t)}else this.datasetElementType&&(delete s.dataset,this.datasetElementType=!1);this.updateElements(n,o,r,t)}addElements(){const{showLine:t}=this.options;!this.datasetElementType&&t&&(this.datasetElementType=this.chart.registry.getElement(\"line\")),super.addElements()}updateElements(t,s,n,i){const o=i===\"reset\",{iScale:r,vScale:a,_stacked:l,_dataset:c}=this._cachedMeta,u=this.resolveDataElementOptions(s,i),h=this.getSharedOptions(u),d=this.includeOptions(i,h),f=r.axis,p=a.axis,{spanGaps:g,segment:_}=this.options,b=nn(g)?g:Number.POSITIVE_INFINITY,v=this.chart._animationsDisabled||o||i===\"none\";let M=s>0&&this.getParsed(s-1);for(let S=s;S<s+n;++S){const w=t[S],R=this.getParsed(S),k=v?w:{},P=it(R[p]),C=k[f]=r.getPixelForValue(R[f],S),O=k[p]=o||P?a.getBasePixel():a.getPixelForValue(l?this.applyStack(a,R,l):R[p],S);k.skip=isNaN(C)||isNaN(O)||P,k.stop=S>0&&Math.abs(R[f]-M[f])>b,_&&(k.parsed=R,k.raw=c.data[S]),d&&(k.options=h||this.resolveDataElementOptions(S,w.active?\"active\":i)),v||this.updateElement(w,S,k,i),M=R}this.updateSharedOptions(h,i,u)}getMaxOverflow(){const t=this._cachedMeta,s=t.data||[];if(!this.options.showLine){let a=0;for(let l=s.length-1;l>=0;--l)a=Math.max(a,s[l].size(this.resolveDataElementOptions(l))/2);return a>0&&a}const n=t.dataset,i=n.options&&n.options.borderWidth||0;if(!s.length)return i;const o=s[0].size(this.resolveDataElementOptions(0)),r=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,o,r)/2}}var sy=Object.freeze({__proto__:null,BarController:Y0,BubbleController:X0,DoughnutController:Qr,LineController:Q0,PieController:Z0,PolarAreaController:vh,RadarController:ty,ScatterController:ey});function Cs(){throw new Error(\"This method is not implemented: Check that a complete date adapter is provided.\")}class Zr{static override(t){Object.assign(Zr.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Cs()}parse(){return Cs()}format(){return Cs()}add(){return Cs()}diff(){return Cs()}startOf(){return Cs()}endOf(){return Cs()}}var ny={_date:Zr};function iy(e,t,s,n){const{controller:i,data:o,_sorted:r}=e,a=i._cachedMeta.iScale,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(a&&t===a.axis&&t!==\"r\"&&r&&o.length){const c=a._reversePixels?x_:Ye;if(n){if(i._sharedOptions){const u=o[0],h=typeof u.getRange==\"function\"&&u.getRange(t);if(h){const d=c(o,t,s-h),f=c(o,t,s+h);return{lo:d.lo,hi:f.hi}}}}else{const u=c(o,t,s);if(l){const{vScale:h}=i._cachedMeta,{_parsed:d}=e,f=d.slice(0,u.lo+1).reverse().findIndex(g=>!it(g[h.axis]));u.lo-=Math.max(0,f);const p=d.slice(u.hi).findIndex(g=>!it(g[h.axis]));u.hi+=Math.max(0,p)}return u}}return{lo:0,hi:o.length-1}}function co(e,t,s,n,i){const o=e.getSortedVisibleDatasetMetas(),r=s[t];for(let a=0,l=o.length;a<l;++a){const{index:c,data:u}=o[a],{lo:h,hi:d}=iy(o[a],t,r,i);for(let f=h;f<=d;++f){const p=u[f];p.skip||n(p,c,f)}}}function oy(e){const t=e.indexOf(\"x\")!==-1,s=e.indexOf(\"y\")!==-1;return function(n,i){const o=t?Math.abs(n.x-i.x):0,r=s?Math.abs(n.y-i.y):0;return Math.sqrt(Math.pow(o,2)+Math.pow(r,2))}}function Do(e,t,s,n,i){const o=[];return!i&&!e.isPointInArea(t)||co(e,s,t,function(a,l,c){!i&&!Xe(a,e.chartArea,0)||a.inRange(t.x,t.y,n)&&o.push({element:a,datasetIndex:l,index:c})},!0),o}function ry(e,t,s,n){let i=[];function o(r,a,l){const{startAngle:c,endAngle:u}=r.getProps([\"startAngle\",\"endAngle\"],n),{angle:h}=Xu(r,{x:t.x,y:t.y});Un(h,c,u)&&i.push({element:r,datasetIndex:a,index:l})}return co(e,s,t,o),i}function ay(e,t,s,n,i,o){let r=[];const a=oy(s);let l=Number.POSITIVE_INFINITY;function c(u,h,d){const f=u.inRange(t.x,t.y,i);if(n&&!f)return;const p=u.getCenterPoint(i);if(!(!!o||e.isPointInArea(p))&&!f)return;const _=a(t,p);_<l?(r=[{element:u,datasetIndex:h,index:d}],l=_):_===l&&r.push({element:u,datasetIndex:h,index:d})}return co(e,s,t,c),r}function Io(e,t,s,n,i,o){return!o&&!e.isPointInArea(t)?[]:s===\"r\"&&!n?ry(e,t,s,i):ay(e,t,s,n,i,o)}function vl(e,t,s,n,i){const o=[],r=s===\"x\"?\"inXRange\":\"inYRange\";let a=!1;return co(e,s,t,(l,c,u)=>{l[r]&&l[r](t[s],i)&&(o.push({element:l,datasetIndex:c,index:u}),a=a||l.inRange(t.x,t.y,i))}),n&&!a?[]:o}var ly={modes:{index(e,t,s,n){const i=Rs(t,e),o=s.axis||\"x\",r=s.includeInvisible||!1,a=s.intersect?Do(e,i,o,n,r):Io(e,i,o,!1,n,r),l=[];return a.length?(e.getSortedVisibleDatasetMetas().forEach(c=>{const u=a[0].index,h=c.data[u];h&&!h.skip&&l.push({element:h,datasetIndex:c.index,index:u})}),l):[]},dataset(e,t,s,n){const i=Rs(t,e),o=s.axis||\"xy\",r=s.includeInvisible||!1;let a=s.intersect?Do(e,i,o,n,r):Io(e,i,o,!1,n,r);if(a.length>0){const l=a[0].datasetIndex,c=e.getDatasetMeta(l).data;a=[];for(let u=0;u<c.length;++u)a.push({element:c[u],datasetIndex:l,index:u})}return a},point(e,t,s,n){const i=Rs(t,e),o=s.axis||\"xy\",r=s.includeInvisible||!1;return Do(e,i,o,n,r)},nearest(e,t,s,n){const i=Rs(t,e),o=s.axis||\"xy\",r=s.includeInvisible||!1;return Io(e,i,o,s.intersect,n,r)},x(e,t,s,n){const i=Rs(t,e);return vl(e,i,\"x\",s.intersect,n)},y(e,t,s,n){const i=Rs(t,e);return vl(e,i,\"y\",s.intersect,n)}}};const wh=[\"left\",\"top\",\"right\",\"bottom\"];function gn(e,t){return e.filter(s=>s.pos===t)}function wl(e,t){return e.filter(s=>wh.indexOf(s.pos)===-1&&s.box.axis===t)}function mn(e,t){return e.sort((s,n)=>{const i=t?n:s,o=t?s:n;return i.weight===o.weight?i.index-o.index:i.weight-o.weight})}function cy(e){const t=[];let s,n,i,o,r,a;for(s=0,n=(e||[]).length;s<n;++s)i=e[s],{position:o,options:{stack:r,stackWeight:a=1}}=i,t.push({index:s,box:i,pos:o,horizontal:i.isHorizontal(),weight:i.weight,stack:r&&o+r,stackWeight:a});return t}function uy(e){const t={};for(const s of e){const{stack:n,pos:i,stackWeight:o}=s;if(!n||!wh.includes(i))continue;const r=t[n]||(t[n]={count:0,placed:0,weight:0,size:0});r.count++,r.weight+=o}return t}function hy(e,t){const s=uy(e),{vBoxMaxWidth:n,hBoxMaxHeight:i}=t;let o,r,a;for(o=0,r=e.length;o<r;++o){a=e[o];const{fullSize:l}=a.box,c=s[a.stack],u=c&&a.stackWeight/c.weight;a.horizontal?(a.width=u?u*n:l&&t.availableWidth,a.height=i):(a.width=n,a.height=u?u*i:l&&t.availableHeight)}return s}function dy(e){const t=cy(e),s=mn(t.filter(c=>c.box.fullSize),!0),n=mn(gn(t,\"left\"),!0),i=mn(gn(t,\"right\")),o=mn(gn(t,\"top\"),!0),r=mn(gn(t,\"bottom\")),a=wl(t,\"x\"),l=wl(t,\"y\");return{fullSize:s,leftAndTop:n.concat(o),rightAndBottom:i.concat(l).concat(r).concat(a),chartArea:gn(t,\"chartArea\"),vertical:n.concat(i).concat(l),horizontal:o.concat(r).concat(a)}}function Sl(e,t,s,n){return Math.max(e[s],t[s])+Math.max(e[n],t[n])}function Sh(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function fy(e,t,s,n){const{pos:i,box:o}=s,r=e.maxPadding;if(!ot(i)){s.size&&(e[i]-=s.size);const h=n[s.stack]||{size:0,count:1};h.size=Math.max(h.size,s.horizontal?o.height:o.width),s.size=h.size/h.count,e[i]+=s.size}o.getPadding&&Sh(r,o.getPadding());const a=Math.max(0,t.outerWidth-Sl(r,e,\"left\",\"right\")),l=Math.max(0,t.outerHeight-Sl(r,e,\"top\",\"bottom\")),c=a!==e.w,u=l!==e.h;return e.w=a,e.h=l,s.horizontal?{same:c,other:u}:{same:u,other:c}}function py(e){const t=e.maxPadding;function s(n){const i=Math.max(t[n]-e[n],0);return e[n]+=i,i}e.y+=s(\"top\"),e.x+=s(\"left\"),s(\"right\"),s(\"bottom\")}function gy(e,t){const s=t.maxPadding;function n(i){const o={left:0,top:0,right:0,bottom:0};return i.forEach(r=>{o[r]=Math.max(t[r],s[r])}),o}return n(e?[\"left\",\"right\"]:[\"top\",\"bottom\"])}function Sn(e,t,s,n){const i=[];let o,r,a,l,c,u;for(o=0,r=e.length,c=0;o<r;++o){a=e[o],l=a.box,l.update(a.width||t.w,a.height||t.h,gy(a.horizontal,t));const{same:h,other:d}=fy(t,s,a,n);c|=h&&i.length,u=u||d,l.fullSize||i.push(a)}return c&&Sn(i,t,s,n)||u}function pi(e,t,s,n,i){e.top=s,e.left=t,e.right=t+n,e.bottom=s+i,e.width=n,e.height=i}function kl(e,t,s,n){const i=s.padding;let{x:o,y:r}=t;for(const a of e){const l=a.box,c=n[a.stack]||{placed:0,weight:1},u=a.stackWeight/c.weight||1;if(a.horizontal){const h=t.w*u,d=c.size||l.height;qn(c.start)&&(r=c.start),l.fullSize?pi(l,i.left,r,s.outerWidth-i.right-i.left,d):pi(l,t.left+c.placed,r,h,d),c.start=r,c.placed+=h,r=l.bottom}else{const h=t.h*u,d=c.size||l.width;qn(c.start)&&(o=c.start),l.fullSize?pi(l,o,i.top,d,s.outerHeight-i.bottom-i.top):pi(l,o,t.top+c.placed,d,h),c.start=o,c.placed+=h,o=l.right}}t.x=o,t.y=r}var Ut={addBox(e,t){e.boxes||(e.boxes=[]),t.fullSize=t.fullSize||!1,t.position=t.position||\"top\",t.weight=t.weight||0,t._layers=t._layers||function(){return[{z:0,draw(s){t.draw(s)}}]},e.boxes.push(t)},removeBox(e,t){const s=e.boxes?e.boxes.indexOf(t):-1;s!==-1&&e.boxes.splice(s,1)},configure(e,t,s){t.fullSize=s.fullSize,t.position=s.position,t.weight=s.weight},update(e,t,s,n){if(!e)return;const i=Yt(e.options.layout.padding),o=Math.max(t-i.width,0),r=Math.max(s-i.height,0),a=dy(e.boxes),l=a.vertical,c=a.horizontal;bt(e.boxes,g=>{typeof g.beforeLayout==\"function\"&&g.beforeLayout()});const u=l.reduce((g,_)=>_.box.options&&_.box.options.display===!1?g:g+1,0)||1,h=Object.freeze({outerWidth:t,outerHeight:s,padding:i,availableWidth:o,availableHeight:r,vBoxMaxWidth:o/2/u,hBoxMaxHeight:r/2}),d=Object.assign({},i);Sh(d,Yt(n));const f=Object.assign({maxPadding:d,w:o,h:r,x:i.left,y:i.top},i),p=hy(l.concat(c),h);Sn(a.fullSize,f,h,p),Sn(l,f,h,p),Sn(c,f,h,p)&&Sn(l,f,h,p),py(f),kl(a.leftAndTop,f,h,p),f.x+=f.w,f.y+=f.h,kl(a.rightAndBottom,f,h,p),e.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},bt(a.chartArea,g=>{const _=g.box;Object.assign(_,e.chartArea),_.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}};class kh{acquireContext(t,s){}releaseContext(t){return!1}addEventListener(t,s,n){}removeEventListener(t,s,n){}getDevicePixelRatio(){return 1}getMaximumSize(t,s,n,i){return s=Math.max(0,s||t.width),n=n||t.height,{width:s,height:Math.max(0,i?Math.floor(s/i):n)}}isAttached(t){return!0}updateConfig(t){}}class my extends kh{acquireContext(t){return t&&t.getContext&&t.getContext(\"2d\")||null}updateConfig(t){t.options.animation=!1}}const Ci=\"$chartjs\",by={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"},Ml=e=>e===null||e===\"\";function _y(e,t){const s=e.style,n=e.getAttribute(\"height\"),i=e.getAttribute(\"width\");if(e[Ci]={initial:{height:n,width:i,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||\"block\",s.boxSizing=s.boxSizing||\"border-box\",Ml(i)){const o=ll(e,\"width\");o!==void 0&&(e.width=o)}if(Ml(n))if(e.style.height===\"\")e.height=e.width/(t||2);else{const o=ll(e,\"height\");o!==void 0&&(e.height=o)}return e}const Mh=f0?{passive:!0}:!1;function yy(e,t,s){e&&e.addEventListener(t,s,Mh)}function xy(e,t,s){e&&e.canvas&&e.canvas.removeEventListener(t,s,Mh)}function vy(e,t){const s=by[e.type]||e.type,{x:n,y:i}=Rs(e,t);return{type:s,chart:t,native:e,x:n!==void 0?n:null,y:i!==void 0?i:null}}function Hi(e,t){for(const s of e)if(s===t||s.contains(t))return!0}function wy(e,t,s){const n=e.canvas,i=new MutationObserver(o=>{let r=!1;for(const a of o)r=r||Hi(a.addedNodes,n),r=r&&!Hi(a.removedNodes,n);r&&s()});return i.observe(document,{childList:!0,subtree:!0}),i}function Sy(e,t,s){const n=e.canvas,i=new MutationObserver(o=>{let r=!1;for(const a of o)r=r||Hi(a.removedNodes,n),r=r&&!Hi(a.addedNodes,n);r&&s()});return i.observe(document,{childList:!0,subtree:!0}),i}const Gn=new Map;let Cl=0;function Ch(){const e=window.devicePixelRatio;e!==Cl&&(Cl=e,Gn.forEach((t,s)=>{s.currentDevicePixelRatio!==e&&t()}))}function ky(e,t){Gn.size||window.addEventListener(\"resize\",Ch),Gn.set(e,t)}function My(e){Gn.delete(e),Gn.size||window.removeEventListener(\"resize\",Ch)}function Cy(e,t,s){const n=e.canvas,i=n&&Jr(n);if(!i)return;const o=th((a,l)=>{const c=i.clientWidth;s(a,l),c<i.clientWidth&&s()},window),r=new ResizeObserver(a=>{const l=a[0],c=l.contentRect.width,u=l.contentRect.height;c===0&&u===0||o(c,u)});return r.observe(i),ky(e,o),r}function Lo(e,t,s){s&&s.disconnect(),t===\"resize\"&&My(e)}function Py(e,t,s){const n=e.canvas,i=th(o=>{e.ctx!==null&&s(vy(o,e))},e);return yy(n,t,i),i}class Ay extends kh{acquireContext(t,s){const n=t&&t.getContext&&t.getContext(\"2d\");return n&&n.canvas===t?(_y(t,s),n):null}releaseContext(t){const s=t.canvas;if(!s[Ci])return!1;const n=s[Ci].initial;[\"height\",\"width\"].forEach(o=>{const r=n[o];it(r)?s.removeAttribute(o):s.setAttribute(o,r)});const i=n.style||{};return Object.keys(i).forEach(o=>{s.style[o]=i[o]}),s.width=s.width,delete s[Ci],!0}addEventListener(t,s,n){this.removeEventListener(t,s);const i=t.$proxies||(t.$proxies={}),r={attach:wy,detach:Sy,resize:Cy}[s]||Py;i[s]=r(t,s,n)}removeEventListener(t,s){const n=t.$proxies||(t.$proxies={}),i=n[s];if(!i)return;({attach:Lo,detach:Lo,resize:Lo}[s]||xy)(t,s,i),n[s]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,s,n,i){return d0(t,s,n,i)}isAttached(t){const s=t&&Jr(t);return!!(s&&s.isConnected)}}function Ry(e){return!Xr()||typeof OffscreenCanvas<\"u\"&&e instanceof OffscreenCanvas?my:Ay}let is=class{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(t){const{x:s,y:n}=this.getProps([\"x\",\"y\"],t);return{x:s,y:n}}hasValue(){return nn(this.x)&&nn(this.y)}getProps(t,s){const n=this.$animations;if(!s||!n)return this;const i={};return t.forEach(o=>{i[o]=n[o]&&n[o].active()?n[o]._to:this[o]}),i}};function Oy(e,t){const s=e.options.ticks,n=Ty(e),i=Math.min(s.maxTicksLimit||n,n),o=s.major.enabled?Dy(t):[],r=o.length,a=o[0],l=o[r-1],c=[];if(r>i)return Iy(t,c,o,r/i),c;const u=Ey(o,t,i);if(r>0){let h,d;const f=r>1?Math.round((l-a)/(r-1)):null;for(gi(t,c,u,it(f)?0:a-f,a),h=0,d=r-1;h<d;h++)gi(t,c,u,o[h],o[h+1]);return gi(t,c,u,l,it(f)?t.length:l+f),c}return gi(t,c,u),c}function Ty(e){const t=e.options.offset,s=e._tickSize(),n=e._length/s+(t?0:1),i=e._maxLength/s;return Math.floor(Math.min(n,i))}function Ey(e,t,s){const n=Ly(e),i=t.length/s;if(!n)return Math.max(i,1);const o=g_(n);for(let r=0,a=o.length-1;r<a;r++){const l=o[r];if(l>i)return l}return Math.max(i,1)}function Dy(e){const t=[];let s,n;for(s=0,n=e.length;s<n;s++)e[s].major&&t.push(s);return t}function Iy(e,t,s,n){let i=0,o=s[0],r;for(n=Math.ceil(n),r=0;r<e.length;r++)r===o&&(t.push(e[r]),i++,o=s[i*n])}function gi(e,t,s,n,i){const o=Z(n,0),r=Math.min(Z(i,e.length),e.length);let a=0,l,c,u;for(s=Math.ceil(s),i&&(l=i-n,s=l/Math.floor(l/s)),u=o;u<0;)a++,u=Math.round(o+a*s);for(c=Math.max(o,0);c<r;c++)c===u&&(t.push(e[c]),a++,u=Math.round(o+a*s))}function Ly(e){const t=e.length;let s,n;if(t<2)return!1;for(n=e[0],s=1;s<t;++s)if(e[s]-e[s-1]!==n)return!1;return n}const Fy=e=>e===\"left\"?\"right\":e===\"right\"?\"left\":e,Pl=(e,t,s)=>t===\"top\"||t===\"left\"?e[t]+s:e[t]-s,Al=(e,t)=>Math.min(t||e,e);function Rl(e,t){const s=[],n=e.length/t,i=e.length;let o=0;for(;o<i;o+=n)s.push(e[Math.floor(o)]);return s}function Ny(e,t,s){const n=e.ticks.length,i=Math.min(t,n-1),o=e._startPixel,r=e._endPixel,a=1e-6;let l=e.getPixelForTick(i),c;if(!(s&&(n===1?c=Math.max(l-o,r-l):t===0?c=(e.getPixelForTick(1)-l)/2:c=(l-e.getPixelForTick(i-1))/2,l+=i<t?c:-c,l<o-a||l>r+a)))return l}function By(e,t){bt(e,s=>{const n=s.gc,i=n.length/2;let o;if(i>t){for(o=0;o<i;++o)delete s.data[n[o]];n.splice(0,i)}})}function bn(e){return e.drawTicks?e.tickLength:0}function Ol(e,t){if(!e.display)return 0;const s=Nt(e.font,t),n=Yt(e.padding);return(At(e.text)?e.text.length:1)*s.lineHeight+n.height}function $y(e,t){return xs(e,{scale:t,type:\"scale\"})}function Vy(e,t,s){return xs(e,{tick:s,index:t,type:\"tick\"})}function jy(e,t,s){let n=Wr(e);return(s&&t!==\"right\"||!s&&t===\"right\")&&(n=Fy(n)),n}function Hy(e,t,s,n){const{top:i,left:o,bottom:r,right:a,chart:l}=e,{chartArea:c,scales:u}=l;let h=0,d,f,p;const g=r-i,_=a-o;if(e.isHorizontal()){if(f=jt(n,o,a),ot(s)){const b=Object.keys(s)[0],v=s[b];p=u[b].getPixelForValue(v)+g-t}else s===\"center\"?p=(c.bottom+c.top)/2+g-t:p=Pl(e,s,t);d=a-o}else{if(ot(s)){const b=Object.keys(s)[0],v=s[b];f=u[b].getPixelForValue(v)-_+t}else s===\"center\"?f=(c.left+c.right)/2-_+t:f=Pl(e,s,t);p=jt(n,r,i),h=s===\"left\"?-Dt:Dt}return{titleX:f,titleY:p,maxWidth:d,rotation:h}}class js extends is{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,s){return t}getUserBounds(){let{_userMin:t,_userMax:s,_suggestedMin:n,_suggestedMax:i}=this;return t=de(t,Number.POSITIVE_INFINITY),s=de(s,Number.NEGATIVE_INFINITY),n=de(n,Number.POSITIVE_INFINITY),i=de(i,Number.NEGATIVE_INFINITY),{min:de(t,n),max:de(s,i),minDefined:Tt(t),maxDefined:Tt(s)}}getMinMax(t){let{min:s,max:n,minDefined:i,maxDefined:o}=this.getUserBounds(),r;if(i&&o)return{min:s,max:n};const a=this.getMatchingVisibleMetas();for(let l=0,c=a.length;l<c;++l)r=a[l].controller.getMinMax(this,t),i||(s=Math.min(s,r.min)),o||(n=Math.max(n,r.max));return s=o&&s>n?n:s,n=i&&s>n?s:n,{min:de(s,de(n,s)),max:de(n,de(s,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){St(this.options.beforeUpdate,[this])}update(t,s,n){const{beginAtZero:i,grace:o,ticks:r}=this.options,a=r.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=s,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=W_(this,o,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=a<this.ticks.length;this._convertTicksToLabels(l?Rl(this.ticks,a):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),r.display&&(r.autoSkip||r.source===\"auto\")&&(this.ticks=Oy(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),l&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t=this.options.reverse,s,n;this.isHorizontal()?(s=this.left,n=this.right):(s=this.top,n=this.bottom,t=!t),this._startPixel=s,this._endPixel=n,this._reversePixels=t,this._length=n-s,this._alignToPixels=this.options.alignToPixels}afterUpdate(){St(this.options.afterUpdate,[this])}beforeSetDimensions(){St(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){St(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),St(this.options[t],[this])}beforeDataLimits(){this._callHooks(\"beforeDataLimits\")}determineDataLimits(){}afterDataLimits(){this._callHooks(\"afterDataLimits\")}beforeBuildTicks(){this._callHooks(\"beforeBuildTicks\")}buildTicks(){return[]}afterBuildTicks(){this._callHooks(\"afterBuildTicks\")}beforeTickToLabelConversion(){St(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const s=this.options.ticks;let n,i,o;for(n=0,i=t.length;n<i;n++)o=t[n],o.label=St(s.callback,[o.value,n,t],this)}afterTickToLabelConversion(){St(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){St(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,s=t.ticks,n=Al(this.ticks.length,t.ticks.maxTicksLimit),i=s.minRotation||0,o=s.maxRotation;let r=i,a,l,c;if(!this._isVisible()||!s.display||i>=o||n<=1||!this.isHorizontal()){this.labelRotation=i;return}const u=this._getLabelSizes(),h=u.widest.width,d=u.highest.height,f=Bt(this.chart.width-h,0,this.maxWidth);a=t.offset?this.maxWidth/n:f/(n-1),h+6>a&&(a=f/(n-(t.offset?.5:1)),l=this.maxHeight-bn(t.grid)-s.padding-Ol(t.title,this.chart.options.font),c=Math.sqrt(h*h+d*d),r=Hr(Math.min(Math.asin(Bt((u.highest.height+6)/a,-1,1)),Math.asin(Bt(l/c,-1,1))-Math.asin(Bt(d/c,-1,1)))),r=Math.max(i,Math.min(o,r))),this.labelRotation=r}afterCalculateLabelRotation(){St(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){St(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:s,options:{ticks:n,title:i,grid:o}}=this,r=this._isVisible(),a=this.isHorizontal();if(r){const l=Ol(i,s.options.font);if(a?(t.width=this.maxWidth,t.height=bn(o)+l):(t.height=this.maxHeight,t.width=bn(o)+l),n.display&&this.ticks.length){const{first:c,last:u,widest:h,highest:d}=this._getLabelSizes(),f=n.padding*2,p=ve(this.labelRotation),g=Math.cos(p),_=Math.sin(p);if(a){const b=n.mirror?0:_*h.width+g*d.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{const b=n.mirror?0:g*h.width+_*d.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,u,_,g)}}this._handleMargins(),a?(this.width=this._length=s.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=s.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,s,n,i){const{ticks:{align:o,padding:r},position:a}=this.options,l=this.labelRotation!==0,c=a!==\"top\"&&this.axis===\"x\";if(this.isHorizontal()){const u=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let d=0,f=0;l?c?(d=i*t.width,f=n*s.height):(d=n*t.height,f=i*s.width):o===\"start\"?f=s.width:o===\"end\"?d=t.width:o!==\"inner\"&&(d=t.width/2,f=s.width/2),this.paddingLeft=Math.max((d-u+r)*this.width/(this.width-u),0),this.paddingRight=Math.max((f-h+r)*this.width/(this.width-h),0)}else{let u=s.height/2,h=t.height/2;o===\"start\"?(u=0,h=t.height):o===\"end\"&&(u=s.height,h=0),this.paddingTop=u+r,this.paddingBottom=h+r}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){St(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:s}=this.options;return s===\"top\"||s===\"bottom\"||t===\"x\"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let s,n;for(s=0,n=t.length;s<n;s++)it(t[s].label)&&(t.splice(s,1),n--,s--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const s=this.options.ticks.sampleSize;let n=this.ticks;s<n.length&&(n=Rl(n,s)),this._labelSizes=t=this._computeLabelSizes(n,n.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,s,n){const{ctx:i,_longestTextCache:o}=this,r=[],a=[],l=Math.floor(s/Al(s,n));let c=0,u=0,h,d,f,p,g,_,b,v,M,S,w;for(h=0;h<s;h+=l){if(p=t[h].label,g=this._resolveTickFontOptions(h),i.font=_=g.string,b=o[_]=o[_]||{data:{},gc:[]},v=g.lineHeight,M=S=0,!it(p)&&!At(p))M=Vi(i,b.data,b.gc,M,p),S=v;else if(At(p))for(d=0,f=p.length;d<f;++d)w=p[d],!it(w)&&!At(w)&&(M=Vi(i,b.data,b.gc,M,w),S+=v);r.push(M),a.push(S),c=Math.max(M,c),u=Math.max(S,u)}By(o,s);const R=r.indexOf(c),k=a.indexOf(u),P=C=>({width:r[C]||0,height:a[C]||0});return{first:P(0),last:P(s-1),widest:P(R),highest:P(k),widths:r,heights:a}}getLabelForValue(t){return t}getPixelForValue(t,s){return NaN}getValueForPixel(t){}getPixelForTick(t){const s=this.ticks;return t<0||t>s.length-1?null:this.getPixelForValue(s[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const s=this._startPixel+t*this._length;return y_(this._alignToPixels?Ms(this.chart,s,0):s)}getDecimalForPixel(t){const s=(t-this._startPixel)/this._length;return this._reversePixels?1-s:s}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:s}=this;return t<0&&s<0?s:t>0&&s>0?t:0}getContext(t){const s=this.ticks||[];if(t>=0&&t<s.length){const n=s[t];return n.$context||(n.$context=Vy(this.getContext(),t,n))}return this.$context||(this.$context=$y(this.chart.getContext(),this))}_tickSize(){const t=this.options.ticks,s=ve(this.labelRotation),n=Math.abs(Math.cos(s)),i=Math.abs(Math.sin(s)),o=this._getLabelSizes(),r=t.autoSkipPadding||0,a=o?o.widest.width+r:0,l=o?o.highest.height+r:0;return this.isHorizontal()?l*n>a*i?a/n:l/i:l*i<a*n?l/n:a/i}_isVisible(){const t=this.options.display;return t!==\"auto\"?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const s=this.axis,n=this.chart,i=this.options,{grid:o,position:r,border:a}=i,l=o.offset,c=this.isHorizontal(),h=this.ticks.length+(l?1:0),d=bn(o),f=[],p=a.setContext(this.getContext()),g=p.display?p.width:0,_=g/2,b=function(tt){return Ms(n,tt,g)};let v,M,S,w,R,k,P,C,O,B,U,at;if(r===\"top\")v=b(this.bottom),k=this.bottom-d,C=v-_,B=b(t.top)+_,at=t.bottom;else if(r===\"bottom\")v=b(this.top),B=t.top,at=b(t.bottom)-_,k=v+_,C=this.top+d;else if(r===\"left\")v=b(this.right),R=this.right-d,P=v-_,O=b(t.left)+_,U=t.right;else if(r===\"right\")v=b(this.left),O=t.left,U=b(t.right)-_,R=v+_,P=this.left+d;else if(s===\"x\"){if(r===\"center\")v=b((t.top+t.bottom)/2+.5);else if(ot(r)){const tt=Object.keys(r)[0],Y=r[tt];v=b(this.chart.scales[tt].getPixelForValue(Y))}B=t.top,at=t.bottom,k=v+_,C=k+d}else if(s===\"y\"){if(r===\"center\")v=b((t.left+t.right)/2);else if(ot(r)){const tt=Object.keys(r)[0],Y=r[tt];v=b(this.chart.scales[tt].getPixelForValue(Y))}R=v-_,P=R-d,O=t.left,U=t.right}const Ct=Z(i.ticks.maxTicksLimit,h),rt=Math.max(1,Math.ceil(h/Ct));for(M=0;M<h;M+=rt){const tt=this.getContext(M),Y=o.setContext(tt),nt=a.setContext(tt),xt=Y.lineWidth,Xt=Y.color,Jt=nt.dash||[],Et=nt.dashOffset,pe=Y.tickWidth,ie=Y.tickColor,ue=Y.tickBorderDash||[],Lt=Y.tickBorderDashOffset;S=Ny(this,M,l),S!==void 0&&(w=Ms(n,S,xt),c?R=P=O=U=w:k=C=B=at=w,f.push({tx1:R,ty1:k,tx2:P,ty2:C,x1:O,y1:B,x2:U,y2:at,width:xt,color:Xt,borderDash:Jt,borderDashOffset:Et,tickWidth:pe,tickColor:ie,tickBorderDash:ue,tickBorderDashOffset:Lt}))}return this._ticksLength=h,this._borderValue=v,f}_computeLabelItems(t){const s=this.axis,n=this.options,{position:i,ticks:o}=n,r=this.isHorizontal(),a=this.ticks,{align:l,crossAlign:c,padding:u,mirror:h}=o,d=bn(n.grid),f=d+u,p=h?-u:f,g=-ve(this.labelRotation),_=[];let b,v,M,S,w,R,k,P,C,O,B,U,at=\"middle\";if(i===\"top\")R=this.bottom-p,k=this._getXAxisLabelAlignment();else if(i===\"bottom\")R=this.top+p,k=this._getXAxisLabelAlignment();else if(i===\"left\"){const rt=this._getYAxisLabelAlignment(d);k=rt.textAlign,w=rt.x}else if(i===\"right\"){const rt=this._getYAxisLabelAlignment(d);k=rt.textAlign,w=rt.x}else if(s===\"x\"){if(i===\"center\")R=(t.top+t.bottom)/2+f;else if(ot(i)){const rt=Object.keys(i)[0],tt=i[rt];R=this.chart.scales[rt].getPixelForValue(tt)+f}k=this._getXAxisLabelAlignment()}else if(s===\"y\"){if(i===\"center\")w=(t.left+t.right)/2-f;else if(ot(i)){const rt=Object.keys(i)[0],tt=i[rt];w=this.chart.scales[rt].getPixelForValue(tt)}k=this._getYAxisLabelAlignment(d).textAlign}s===\"y\"&&(l===\"start\"?at=\"top\":l===\"end\"&&(at=\"bottom\"));const Ct=this._getLabelSizes();for(b=0,v=a.length;b<v;++b){M=a[b],S=M.label;const rt=o.setContext(this.getContext(b));P=this.getPixelForTick(b)+o.labelOffset,C=this._resolveTickFontOptions(b),O=C.lineHeight,B=At(S)?S.length:1;const tt=B/2,Y=rt.color,nt=rt.textStrokeColor,xt=rt.textStrokeWidth;let Xt=k;r?(w=P,k===\"inner\"&&(b===v-1?Xt=this.options.reverse?\"left\":\"right\":b===0?Xt=this.options.reverse?\"right\":\"left\":Xt=\"center\"),i===\"top\"?c===\"near\"||g!==0?U=-B*O+O/2:c===\"center\"?U=-Ct.highest.height/2-tt*O+O:U=-Ct.highest.height+O/2:c===\"near\"||g!==0?U=O/2:c===\"center\"?U=Ct.highest.height/2-tt*O:U=Ct.highest.height-B*O,h&&(U*=-1),g!==0&&!rt.showLabelBackdrop&&(w+=O/2*Math.sin(g))):(R=P,U=(1-B)*O/2);let Jt;if(rt.showLabelBackdrop){const Et=Yt(rt.backdropPadding),pe=Ct.heights[b],ie=Ct.widths[b];let ue=U-Et.top,Lt=0-Et.left;switch(at){case\"middle\":ue-=pe/2;break;case\"bottom\":ue-=pe;break}switch(k){case\"center\":Lt-=ie/2;break;case\"right\":Lt-=ie;break;case\"inner\":b===v-1?Lt-=ie:b>0&&(Lt-=ie/2);break}Jt={left:Lt,top:ue,width:ie+Et.width,height:pe+Et.height,color:rt.backdropColor}}_.push({label:S,font:C,textOffset:U,options:{rotation:g,color:Y,strokeColor:nt,strokeWidth:xt,textAlign:Xt,textBaseline:at,translation:[w,R],backdrop:Jt}})}return _}_getXAxisLabelAlignment(){const{position:t,ticks:s}=this.options;if(-ve(this.labelRotation))return t===\"top\"?\"left\":\"right\";let i=\"center\";return s.align===\"start\"?i=\"left\":s.align===\"end\"?i=\"right\":s.align===\"inner\"&&(i=\"inner\"),i}_getYAxisLabelAlignment(t){const{position:s,ticks:{crossAlign:n,mirror:i,padding:o}}=this.options,r=this._getLabelSizes(),a=t+o,l=r.widest.width;let c,u;return s===\"left\"?i?(u=this.right+o,n===\"near\"?c=\"left\":n===\"center\"?(c=\"center\",u+=l/2):(c=\"right\",u+=l)):(u=this.right-a,n===\"near\"?c=\"right\":n===\"center\"?(c=\"center\",u-=l/2):(c=\"left\",u=this.left)):s===\"right\"?i?(u=this.left+o,n===\"near\"?c=\"right\":n===\"center\"?(c=\"center\",u-=l/2):(c=\"left\",u-=l)):(u=this.left+a,n===\"near\"?c=\"left\":n===\"center\"?(c=\"center\",u+=l/2):(c=\"right\",u=this.right)):c=\"right\",{textAlign:c,x:u}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,s=this.options.position;if(s===\"left\"||s===\"right\")return{top:0,left:this.left,bottom:t.height,right:this.right};if(s===\"top\"||s===\"bottom\")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){const{ctx:t,options:{backgroundColor:s},left:n,top:i,width:o,height:r}=this;s&&(t.save(),t.fillStyle=s,t.fillRect(n,i,o,r),t.restore())}getLineWidthForValue(t){const s=this.options.grid;if(!this._isVisible()||!s.display)return 0;const i=this.ticks.findIndex(o=>o.value===t);return i>=0?s.setContext(this.getContext(i)).lineWidth:0}drawGrid(t){const s=this.options.grid,n=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let o,r;const a=(l,c,u)=>{!u.width||!u.color||(n.save(),n.lineWidth=u.width,n.strokeStyle=u.color,n.setLineDash(u.borderDash||[]),n.lineDashOffset=u.borderDashOffset,n.beginPath(),n.moveTo(l.x,l.y),n.lineTo(c.x,c.y),n.stroke(),n.restore())};if(s.display)for(o=0,r=i.length;o<r;++o){const l=i[o];s.drawOnChartArea&&a({x:l.x1,y:l.y1},{x:l.x2,y:l.y2},l),s.drawTicks&&a({x:l.tx1,y:l.ty1},{x:l.tx2,y:l.ty2},{color:l.tickColor,width:l.tickWidth,borderDash:l.tickBorderDash,borderDashOffset:l.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:s,options:{border:n,grid:i}}=this,o=n.setContext(this.getContext()),r=n.display?o.width:0;if(!r)return;const a=i.setContext(this.getContext(0)).lineWidth,l=this._borderValue;let c,u,h,d;this.isHorizontal()?(c=Ms(t,this.left,r)-r/2,u=Ms(t,this.right,a)+a/2,h=d=l):(h=Ms(t,this.top,r)-r/2,d=Ms(t,this.bottom,a)+a/2,c=u=l),s.save(),s.lineWidth=o.width,s.strokeStyle=o.color,s.beginPath(),s.moveTo(c,h),s.lineTo(u,d),s.stroke(),s.restore()}drawLabels(t){if(!this.options.ticks.display)return;const n=this.ctx,i=this._computeLabelArea();i&&ro(n,i);const o=this.getLabelItems(t);for(const r of o){const a=r.options,l=r.font,c=r.label,u=r.textOffset;Vs(n,c,0,u,l,a)}i&&ao(n)}drawTitle(){const{ctx:t,options:{position:s,title:n,reverse:i}}=this;if(!n.display)return;const o=Nt(n.font),r=Yt(n.padding),a=n.align;let l=o.lineHeight/2;s===\"bottom\"||s===\"center\"||ot(s)?(l+=r.bottom,At(n.text)&&(l+=o.lineHeight*(n.text.length-1))):l+=r.top;const{titleX:c,titleY:u,maxWidth:h,rotation:d}=Hy(this,l,s,a);Vs(t,n.text,0,0,o,{color:n.color,maxWidth:h,rotation:d,textAlign:jy(a,s,i),textBaseline:\"middle\",translation:[c,u]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,s=t.ticks&&t.ticks.z||0,n=Z(t.grid&&t.grid.z,-1),i=Z(t.border&&t.border.z,0);return!this._isVisible()||this.draw!==js.prototype.draw?[{z:s,draw:o=>{this.draw(o)}}]:[{z:n,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:s,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){const s=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+\"AxisID\",i=[];let o,r;for(o=0,r=s.length;o<r;++o){const a=s[o];a[n]===this.id&&(!t||a.type===t)&&i.push(a)}return i}_resolveTickFontOptions(t){const s=this.options.ticks.setContext(this.getContext(t));return Nt(s.font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class mi{constructor(t,s,n){this.type=t,this.scope=s,this.override=n,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const s=Object.getPrototypeOf(t);let n;qy(s)&&(n=this.register(s));const i=this.items,o=t.id,r=this.scope+\".\"+o;if(!o)throw new Error(\"class does not have id: \"+t);return o in i||(i[o]=t,zy(t,r,n),this.override&&Rt.override(t.id,t.overrides)),r}get(t){return this.items[t]}unregister(t){const s=this.items,n=t.id,i=this.scope;n in s&&delete s[n],i&&n in Rt[i]&&(delete Rt[i][n],this.override&&delete $s[n])}}function zy(e,t,s){const n=Wn(Object.create(null),[s?Rt.get(s):{},Rt.get(t),e.defaults]);Rt.set(t,n),e.defaultRoutes&&Wy(t,e.defaultRoutes),e.descriptors&&Rt.describe(t,e.descriptors)}function Wy(e,t){Object.keys(t).forEach(s=>{const n=s.split(\".\"),i=n.pop(),o=[e].concat(n).join(\".\"),r=t[s].split(\".\"),a=r.pop(),l=r.join(\".\");Rt.route(o,i,l,a)})}function qy(e){return\"id\"in e&&\"defaults\"in e}class Uy{constructor(){this.controllers=new mi(vs,\"datasets\",!0),this.elements=new mi(is,\"elements\"),this.plugins=new mi(Object,\"plugins\"),this.scales=new mi(js,\"scales\"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each(\"register\",t)}remove(...t){this._each(\"unregister\",t)}addControllers(...t){this._each(\"register\",t,this.controllers)}addElements(...t){this._each(\"register\",t,this.elements)}addPlugins(...t){this._each(\"register\",t,this.plugins)}addScales(...t){this._each(\"register\",t,this.scales)}getController(t){return this._get(t,this.controllers,\"controller\")}getElement(t){return this._get(t,this.elements,\"element\")}getPlugin(t){return this._get(t,this.plugins,\"plugin\")}getScale(t){return this._get(t,this.scales,\"scale\")}removeControllers(...t){this._each(\"unregister\",t,this.controllers)}removeElements(...t){this._each(\"unregister\",t,this.elements)}removePlugins(...t){this._each(\"unregister\",t,this.plugins)}removeScales(...t){this._each(\"unregister\",t,this.scales)}_each(t,s,n){[...s].forEach(i=>{const o=n||this._getRegistryForType(i);n||o.isForType(i)||o===this.plugins&&i.id?this._exec(t,o,i):bt(i,r=>{const a=n||this._getRegistryForType(r);this._exec(t,a,r)})})}_exec(t,s,n){const i=jr(t);St(n[\"before\"+i],[],n),s[t](n),St(n[\"after\"+i],[],n)}_getRegistryForType(t){for(let s=0;s<this._typedRegistries.length;s++){const n=this._typedRegistries[s];if(n.isForType(t))return n}return this.plugins}_get(t,s,n){const i=s.get(t);if(i===void 0)throw new Error('\"'+t+'\" is not a registered '+n+\".\");return i}}var Ee=new Uy;class Ky{constructor(){this._init=void 0}notify(t,s,n,i){if(s===\"beforeInit\"&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,\"install\")),this._init===void 0)return;const o=i?this._descriptors(t).filter(i):this._descriptors(t),r=this._notify(o,t,s,n);return s===\"afterDestroy\"&&(this._notify(o,t,\"stop\"),this._notify(this._init,t,\"uninstall\"),this._init=void 0),r}_notify(t,s,n,i){i=i||{};for(const o of t){const r=o.plugin,a=r[n],l=[s,i,o.options];if(St(a,l,r)===!1&&i.cancelable)return!1}return!0}invalidate(){it(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const s=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),s}_createDescriptors(t,s){const n=t&&t.config,i=Z(n.options&&n.options.plugins,{}),o=Gy(n);return i===!1&&!s?[]:Xy(t,o,i,s)}_notifyStateChanges(t){const s=this._oldCache||[],n=this._cache,i=(o,r)=>o.filter(a=>!r.some(l=>a.plugin.id===l.plugin.id));this._notify(i(s,n),t,\"stop\"),this._notify(i(n,s),t,\"start\")}}function Gy(e){const t={},s=[],n=Object.keys(Ee.plugins.items);for(let o=0;o<n.length;o++)s.push(Ee.getPlugin(n[o]));const i=e.plugins||[];for(let o=0;o<i.length;o++){const r=i[o];s.indexOf(r)===-1&&(s.push(r),t[r.id]=!0)}return{plugins:s,localIds:t}}function Yy(e,t){return!t&&e===!1?null:e===!0?{}:e}function Xy(e,{plugins:t,localIds:s},n,i){const o=[],r=e.getContext();for(const a of t){const l=a.id,c=Yy(n[l],i);c!==null&&o.push({plugin:a,options:Jy(e.config,{plugin:a,local:s[l]},c,r)})}return o}function Jy(e,{plugin:t,local:s},n,i){const o=e.pluginScopeKeys(t),r=e.getOptionScopes(n,o);return s&&t.defaults&&r.push(t.defaults),e.createResolver(r,i,[\"\"],{scriptable:!1,indexable:!1,allKeys:!0})}function ar(e,t){const s=Rt.datasets[e]||{};return((t.datasets||{})[e]||{}).indexAxis||t.indexAxis||s.indexAxis||\"x\"}function Qy(e,t){let s=e;return e===\"_index_\"?s=t:e===\"_value_\"&&(s=t===\"x\"?\"y\":\"x\"),s}function Zy(e,t){return e===t?\"_index_\":\"_value_\"}function Tl(e){if(e===\"x\"||e===\"y\"||e===\"r\")return e}function tx(e){if(e===\"top\"||e===\"bottom\")return\"x\";if(e===\"left\"||e===\"right\")return\"y\"}function lr(e,...t){if(Tl(e))return e;for(const s of t){const n=s.axis||tx(s.position)||e.length>1&&Tl(e[0].toLowerCase());if(n)return n}throw new Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function El(e,t,s){if(s[t+\"AxisID\"]===e)return{axis:t}}function ex(e,t){if(t.data&&t.data.datasets){const s=t.data.datasets.filter(n=>n.xAxisID===e||n.yAxisID===e);if(s.length)return El(e,\"x\",s[0])||El(e,\"y\",s[0])}return{}}function sx(e,t){const s=$s[e.type]||{scales:{}},n=t.scales||{},i=ar(e.type,t),o=Object.create(null);return Object.keys(n).forEach(r=>{const a=n[r];if(!ot(a))return console.error(`Invalid scale configuration for scale: ${r}`);if(a._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${r}`);const l=lr(r,a,ex(r,e),Rt.scales[a.type]),c=Zy(l,i),u=s.scales||{};o[r]=En(Object.create(null),[{axis:l},a,u[l],u[c]])}),e.data.datasets.forEach(r=>{const a=r.type||e.type,l=r.indexAxis||ar(a,t),u=($s[a]||{}).scales||{};Object.keys(u).forEach(h=>{const d=Qy(h,l),f=r[d+\"AxisID\"]||d;o[f]=o[f]||Object.create(null),En(o[f],[{axis:d},n[f],u[h]])})}),Object.keys(o).forEach(r=>{const a=o[r];En(a,[Rt.scales[a.type],Rt.scale])}),o}function Ph(e){const t=e.options||(e.options={});t.plugins=Z(t.plugins,{}),t.scales=sx(e,t)}function Ah(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function nx(e){return e=e||{},e.data=Ah(e.data),Ph(e),e}const Dl=new Map,Rh=new Set;function bi(e,t){let s=Dl.get(e);return s||(s=t(),Dl.set(e,s),Rh.add(s)),s}const _n=(e,t,s)=>{const n=bs(t,s);n!==void 0&&e.add(n)};class ix{constructor(t){this._config=nx(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Ah(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Ph(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return bi(t,()=>[[`datasets.${t}`,\"\"]])}datasetAnimationScopeKeys(t,s){return bi(`${t}.transition.${s}`,()=>[[`datasets.${t}.transitions.${s}`,`transitions.${s}`],[`datasets.${t}`,\"\"]])}datasetElementScopeKeys(t,s){return bi(`${t}-${s}`,()=>[[`datasets.${t}.elements.${s}`,`datasets.${t}`,`elements.${s}`,\"\"]])}pluginScopeKeys(t){const s=t.id,n=this.type;return bi(`${n}-plugin-${s}`,()=>[[`plugins.${s}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,s){const n=this._scopeCache;let i=n.get(t);return(!i||s)&&(i=new Map,n.set(t,i)),i}getOptionScopes(t,s,n){const{options:i,type:o}=this,r=this._cachedScopes(t,n),a=r.get(s);if(a)return a;const l=new Set;s.forEach(u=>{t&&(l.add(t),u.forEach(h=>_n(l,t,h))),u.forEach(h=>_n(l,i,h)),u.forEach(h=>_n(l,$s[o]||{},h)),u.forEach(h=>_n(l,Rt,h)),u.forEach(h=>_n(l,or,h))});const c=Array.from(l);return c.length===0&&c.push(Object.create(null)),Rh.has(s)&&r.set(s,c),c}chartOptionScopes(){const{options:t,type:s}=this;return[t,$s[s]||{},Rt.datasets[s]||{},{type:s},Rt,or]}resolveNamedOptions(t,s,n,i=[\"\"]){const o={$shared:!0},{resolver:r,subPrefixes:a}=Il(this._resolverCache,t,i);let l=r;if(rx(r,s)){o.$shared=!1,n=_s(n)?n():n;const c=this.createResolver(t,n,a);l=on(r,n,c)}for(const c of s)o[c]=l[c];return o}createResolver(t,s,n=[\"\"],i){const{resolver:o}=Il(this._resolverCache,t,n);return ot(s)?on(o,s,void 0,i):o}}function Il(e,t,s){let n=e.get(t);n||(n=new Map,e.set(t,n));const i=s.join();let o=n.get(i);return o||(o={resolver:Kr(t,s),subPrefixes:s.filter(a=>!a.toLowerCase().includes(\"hover\"))},n.set(i,o)),o}const ox=e=>ot(e)&&Object.getOwnPropertyNames(e).some(t=>_s(e[t]));function rx(e,t){const{isScriptable:s,isIndexable:n}=rh(e);for(const i of t){const o=s(i),r=n(i),a=(r||o)&&e[i];if(o&&(_s(a)||ox(a))||r&&At(a))return!0}return!1}var ax=\"4.5.1\";const lx=[\"top\",\"bottom\",\"left\",\"right\",\"chartArea\"];function Ll(e,t){return e===\"top\"||e===\"bottom\"||lx.indexOf(e)===-1&&t===\"x\"}function Fl(e,t){return function(s,n){return s[e]===n[e]?s[t]-n[t]:s[e]-n[e]}}function Nl(e){const t=e.chart,s=t.options.animation;t.notifyPlugins(\"afterRender\"),St(s&&s.onComplete,[e],t)}function cx(e){const t=e.chart,s=t.options.animation;St(s&&s.onProgress,[e],t)}function Oh(e){return Xr()&&typeof e==\"string\"?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}const Pi={},Bl=e=>{const t=Oh(e);return Object.values(Pi).filter(s=>s.canvas===t).pop()};function ux(e,t,s){const n=Object.keys(e);for(const i of n){const o=+i;if(o>=t){const r=e[i];delete e[i],(s>0||o>t)&&(e[o+s]=r)}}}function hx(e,t,s,n){return!s||e.type===\"mouseout\"?null:n?t:e}class Ai{static defaults=Rt;static instances=Pi;static overrides=$s;static registry=Ee;static version=ax;static getChart=Bl;static register(...t){Ee.add(...t),$l()}static unregister(...t){Ee.remove(...t),$l()}constructor(t,s){const n=this.config=new ix(s),i=Oh(t),o=Bl(i);if(o)throw new Error(\"Canvas is already in use. Chart with ID '\"+o.id+\"' must be destroyed before the canvas with ID '\"+o.canvas.id+\"' can be reused.\");const r=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||Ry(i)),this.platform.updateConfig(n);const a=this.platform.acquireContext(i,r.aspectRatio),l=a&&a.canvas,c=l&&l.height,u=l&&l.width;if(this.id=r_(),this.ctx=a,this.canvas=l,this.width=u,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ky,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=S_(h=>this.update(h),r.resizeDelay||0),this._dataChanges=[],Pi[this.id]=this,!a||!l){console.error(\"Failed to create chart: can't acquire context from the given item\");return}je.listen(this,\"complete\",Nl),je.listen(this,\"progress\",cx),this._initialize(),this.attached&&this.update()}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:s},width:n,height:i,_aspectRatio:o}=this;return it(t)?s&&o?o:i?n/i:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Ee}_initialize(){return this.notifyPlugins(\"beforeInit\"),this.options.responsive?this.resize():al(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(\"afterInit\"),this}clear(){return il(this.canvas,this.ctx),this}stop(){return je.stop(this),this}resize(t,s){je.running(this)?this._resizeBeforeDraw={width:t,height:s}:this._resize(t,s)}_resize(t,s){const n=this.options,i=this.canvas,o=n.maintainAspectRatio&&this.aspectRatio,r=this.platform.getMaximumSize(i,t,s,o),a=n.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?\"resize\":\"attach\";this.width=r.width,this.height=r.height,this._aspectRatio=this.aspectRatio,al(this,a,!0)&&(this.notifyPlugins(\"resize\",{size:r}),St(n.onResize,[this,r],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const s=this.options.scales||{};bt(s,(n,i)=>{n.id=i})}buildOrUpdateScales(){const t=this.options,s=t.scales,n=this.scales,i=Object.keys(n).reduce((r,a)=>(r[a]=!1,r),{});let o=[];s&&(o=o.concat(Object.keys(s).map(r=>{const a=s[r],l=lr(r,a),c=l===\"r\",u=l===\"x\";return{options:a,dposition:c?\"chartArea\":u?\"bottom\":\"left\",dtype:c?\"radialLinear\":u?\"category\":\"linear\"}}))),bt(o,r=>{const a=r.options,l=a.id,c=lr(l,a),u=Z(a.type,r.dtype);(a.position===void 0||Ll(a.position,c)!==Ll(r.dposition))&&(a.position=r.dposition),i[l]=!0;let h=null;if(l in n&&n[l].type===u)h=n[l];else{const d=Ee.getScale(u);h=new d({id:l,type:u,ctx:this.ctx,chart:this}),n[h.id]=h}h.init(a,t)}),bt(i,(r,a)=>{r||delete n[a]}),bt(n,r=>{Ut.configure(this,r,r.options),Ut.addBox(this,r)})}_updateMetasets(){const t=this._metasets,s=this.data.datasets.length,n=t.length;if(t.sort((i,o)=>i.index-o.index),n>s){for(let i=s;i<n;++i)this._destroyDatasetMeta(i);t.splice(s,n-s)}this._sortedMetasets=t.slice(0).sort(Fl(\"order\",\"index\"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:s}}=this;t.length>s.length&&delete this._stacks,t.forEach((n,i)=>{s.filter(o=>o===n._dataset).length===0&&this._destroyDatasetMeta(i)})}buildOrUpdateControllers(){const t=[],s=this.data.datasets;let n,i;for(this._removeUnreferencedMetasets(),n=0,i=s.length;n<i;n++){const o=s[n];let r=this.getDatasetMeta(n);const a=o.type||this.config.type;if(r.type&&r.type!==a&&(this._destroyDatasetMeta(n),r=this.getDatasetMeta(n)),r.type=a,r.indexAxis=o.indexAxis||ar(a,this.options),r.order=o.order||0,r.index=n,r.label=\"\"+o.label,r.visible=this.isDatasetVisible(n),r.controller)r.controller.updateIndex(n),r.controller.linkScales();else{const l=Ee.getController(a),{datasetElementType:c,dataElementType:u}=Rt.datasets[a];Object.assign(l,{dataElementType:Ee.getElement(u),datasetElementType:c&&Ee.getElement(c)}),r.controller=new l(this,n),t.push(r.controller)}}return this._updateMetasets(),t}_resetElements(){bt(this.data.datasets,(t,s)=>{this.getDatasetMeta(s).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(\"reset\")}update(t){const s=this.config;s.update();const n=this._options=s.createResolver(s.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(\"beforeUpdate\",{mode:t,cancelable:!0})===!1)return;const o=this.buildOrUpdateControllers();this.notifyPlugins(\"beforeElementsUpdate\");let r=0;for(let c=0,u=this.data.datasets.length;c<u;c++){const{controller:h}=this.getDatasetMeta(c),d=!i&&o.indexOf(h)===-1;h.buildOrUpdateElements(d),r=Math.max(+h.getMaxOverflow(),r)}r=this._minPadding=n.layout.autoPadding?r:0,this._updateLayout(r),i||bt(o,c=>{c.reset()}),this._updateDatasets(t),this.notifyPlugins(\"afterUpdate\",{mode:t}),this._layers.sort(Fl(\"z\",\"_idx\"));const{_active:a,_lastEvent:l}=this;l?this._eventHandler(l,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){bt(this.scales,t=>{Ut.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,s=new Set(Object.keys(this._listeners)),n=new Set(t.events);(!Ya(s,n)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,s=this._getUniformDataChanges()||[];for(const{method:n,start:i,count:o}of s){const r=n===\"_removeElements\"?-o:o;ux(t,i,r)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const s=this.data.datasets.length,n=o=>new Set(t.filter(r=>r[0]===o).map((r,a)=>a+\",\"+r.splice(1).join(\",\"))),i=n(0);for(let o=1;o<s;o++)if(!Ya(i,n(o)))return;return Array.from(i).map(o=>o.split(\",\")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins(\"beforeLayout\",{cancelable:!0})===!1)return;Ut.update(this,this.width,this.height,t);const s=this.chartArea,n=s.width<=0||s.height<=0;this._layers=[],bt(this.boxes,i=>{n&&i.position===\"chartArea\"||(i.configure&&i.configure(),this._layers.push(...i._layers()))},this),this._layers.forEach((i,o)=>{i._idx=o}),this.notifyPlugins(\"afterLayout\")}_updateDatasets(t){if(this.notifyPlugins(\"beforeDatasetsUpdate\",{mode:t,cancelable:!0})!==!1){for(let s=0,n=this.data.datasets.length;s<n;++s)this.getDatasetMeta(s).controller.configure();for(let s=0,n=this.data.datasets.length;s<n;++s)this._updateDataset(s,_s(t)?t({datasetIndex:s}):t);this.notifyPlugins(\"afterDatasetsUpdate\",{mode:t})}}_updateDataset(t,s){const n=this.getDatasetMeta(t),i={meta:n,index:t,mode:s,cancelable:!0};this.notifyPlugins(\"beforeDatasetUpdate\",i)!==!1&&(n.controller._update(s),i.cancelable=!1,this.notifyPlugins(\"afterDatasetUpdate\",i))}render(){this.notifyPlugins(\"beforeRender\",{cancelable:!0})!==!1&&(je.has(this)?this.attached&&!je.running(this)&&je.start(this):(this.draw(),Nl({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:n,height:i}=this._resizeBeforeDraw;this._resizeBeforeDraw=null,this._resize(n,i)}if(this.clear(),this.width<=0||this.height<=0||this.notifyPlugins(\"beforeDraw\",{cancelable:!0})===!1)return;const s=this._layers;for(t=0;t<s.length&&s[t].z<=0;++t)s[t].draw(this.chartArea);for(this._drawDatasets();t<s.length;++t)s[t].draw(this.chartArea);this.notifyPlugins(\"afterDraw\")}_getSortedDatasetMetas(t){const s=this._sortedMetasets,n=[];let i,o;for(i=0,o=s.length;i<o;++i){const r=s[i];(!t||r.visible)&&n.push(r)}return n}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(this.notifyPlugins(\"beforeDatasetsDraw\",{cancelable:!0})===!1)return;const t=this.getSortedVisibleDatasetMetas();for(let s=t.length-1;s>=0;--s)this._drawDataset(t[s]);this.notifyPlugins(\"afterDatasetsDraw\")}_drawDataset(t){const s=this.ctx,n={meta:t,index:t.index,cancelable:!0},i=bh(this,t);this.notifyPlugins(\"beforeDatasetDraw\",n)!==!1&&(i&&ro(s,i),t.controller.draw(),i&&ao(s),n.cancelable=!1,this.notifyPlugins(\"afterDatasetDraw\",n))}isPointInArea(t){return Xe(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,s,n,i){const o=ly.modes[s];return typeof o==\"function\"?o(this,t,n,i):[]}getDatasetMeta(t){const s=this.data.datasets[t],n=this._metasets;let i=n.filter(o=>o&&o._dataset===s).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:s&&s.order||0,index:t,_dataset:s,_parsed:[],_sorted:!1},n.push(i)),i}getContext(){return this.$context||(this.$context=xs(null,{chart:this,type:\"chart\"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const s=this.data.datasets[t];if(!s)return!1;const n=this.getDatasetMeta(t);return typeof n.hidden==\"boolean\"?!n.hidden:!s.hidden}setDatasetVisibility(t,s){const n=this.getDatasetMeta(t);n.hidden=!s}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,s,n){const i=n?\"show\":\"hide\",o=this.getDatasetMeta(t),r=o.controller._resolveAnimations(void 0,i);qn(s)?(o.data[s].hidden=!n,this.update()):(this.setDatasetVisibility(t,n),r.update(o,{visible:n}),this.update(a=>a.datasetIndex===t?i:void 0))}hide(t,s){this._updateVisibility(t,s,!1)}show(t,s){this._updateVisibility(t,s,!0)}_destroyDatasetMeta(t){const s=this._metasets[t];s&&s.controller&&s.controller._destroy(),delete this._metasets[t]}_stop(){let t,s;for(this.stop(),je.remove(this),t=0,s=this.data.datasets.length;t<s;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins(\"beforeDestroy\");const{canvas:t,ctx:s}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),il(t,s),this.platform.releaseContext(s),this.canvas=null,this.ctx=null),delete Pi[this.id],this.notifyPlugins(\"afterDestroy\")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,s=this.platform,n=(o,r)=>{s.addEventListener(this,o,r),t[o]=r},i=(o,r,a)=>{o.offsetX=r,o.offsetY=a,this._eventHandler(o)};bt(this.options.events,o=>n(o,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,s=this.platform,n=(l,c)=>{s.addEventListener(this,l,c),t[l]=c},i=(l,c)=>{t[l]&&(s.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)};let r;const a=()=>{i(\"attach\",a),this.attached=!0,this.resize(),n(\"resize\",o),n(\"detach\",r)};r=()=>{this.attached=!1,i(\"resize\",o),this._stop(),this._resize(0,0),n(\"attach\",a)},s.isAttached(this.canvas)?a():r()}unbindEvents(){bt(this._listeners,(t,s)=>{this.platform.removeEventListener(this,s,t)}),this._listeners={},bt(this._responsiveListeners,(t,s)=>{this.platform.removeEventListener(this,s,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,s,n){const i=n?\"set\":\"remove\";let o,r,a,l;for(s===\"dataset\"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller[\"_\"+i+\"DatasetHoverStyle\"]()),a=0,l=t.length;a<l;++a){r=t[a];const c=r&&this.getDatasetMeta(r.datasetIndex).controller;c&&c[i+\"HoverStyle\"](r.element,r.datasetIndex,r.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const s=this._active||[],n=t.map(({datasetIndex:o,index:r})=>{const a=this.getDatasetMeta(o);if(!a)throw new Error(\"No dataset found at index \"+o);return{datasetIndex:o,element:a.data[r],index:r}});!Ni(n,s)&&(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,s))}notifyPlugins(t,s,n){return this._plugins.notify(this,t,s,n)}isPluginEnabled(t){return this._plugins._cache.filter(s=>s.plugin.id===t).length===1}_updateHoverStyles(t,s,n){const i=this.options.hover,o=(l,c)=>l.filter(u=>!c.some(h=>u.datasetIndex===h.datasetIndex&&u.index===h.index)),r=o(s,t),a=n?t:o(t,s);r.length&&this.updateHoverStyle(r,i.mode,!1),a.length&&i.mode&&this.updateHoverStyle(a,i.mode,!0)}_eventHandler(t,s){const n={event:t,replay:s,cancelable:!0,inChartArea:this.isPointInArea(t)},i=r=>(r.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins(\"beforeEvent\",n,i)===!1)return;const o=this._handleEvent(t,s,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(\"afterEvent\",n,i),(o||n.changed)&&this.render(),this}_handleEvent(t,s,n){const{_active:i=[],options:o}=this,r=s,a=this._getActiveElements(t,i,n,r),l=d_(t),c=hx(t,this._lastEvent,n,l);n&&(this._lastEvent=null,St(o.onHover,[t,a,this],this),l&&St(o.onClick,[t,a,this],this));const u=!Ni(a,i);return(u||s)&&(this._active=a,this._updateHoverStyles(a,i,s)),this._lastEvent=c,u}_getActiveElements(t,s,n,i){if(t.type===\"mouseout\")return[];if(!n)return s;const o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,i)}}function $l(){return bt(Ai.instances,e=>e._plugins.invalidate())}function dx(e,t,s){const{startAngle:n,x:i,y:o,outerRadius:r,innerRadius:a,options:l}=t,{borderWidth:c,borderJoinStyle:u}=l,h=Math.min(c/r,Ht(n-s));if(e.beginPath(),e.arc(i,o,r-c/2,n+h/2,s-h/2),a>0){const d=Math.min(c/a,Ht(n-s));e.arc(i,o,a+c/2,s-d/2,n+d/2,!0)}else{const d=Math.min(c/2,r*Ht(n-s));if(u===\"round\")e.arc(i,o,d,s-ht/2,n+ht/2,!0);else if(u===\"bevel\"){const f=2*d*d,p=-f*Math.cos(s+ht/2)+i,g=-f*Math.sin(s+ht/2)+o,_=f*Math.cos(n+ht/2)+i,b=f*Math.sin(n+ht/2)+o;e.lineTo(p,g),e.lineTo(_,b)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(\"evenodd\")}function fx(e,t,s){const{startAngle:n,pixelMargin:i,x:o,y:r,outerRadius:a,innerRadius:l}=t;let c=i/a;e.beginPath(),e.arc(o,r,a,n-c,s+c),l>i?(c=i/l,e.arc(o,r,l,s+c,n-c,!0)):e.arc(o,r,i,s+Dt,n-Dt),e.closePath(),e.clip()}function px(e){return Ur(e,[\"outerStart\",\"outerEnd\",\"innerStart\",\"innerEnd\"])}function gx(e,t,s,n){const i=px(e.options.borderRadius),o=(s-t)/2,r=Math.min(o,n*t/2),a=l=>{const c=(s-Math.min(o,l))*n/2;return Bt(l,0,Math.min(o,c))};return{outerStart:a(i.outerStart),outerEnd:a(i.outerEnd),innerStart:Bt(i.innerStart,0,r),innerEnd:Bt(i.innerEnd,0,r)}}function Ws(e,t,s,n){return{x:s+e*Math.cos(t),y:n+e*Math.sin(t)}}function zi(e,t,s,n,i,o){const{x:r,y:a,startAngle:l,pixelMargin:c,innerRadius:u}=t,h=Math.max(t.outerRadius+n+s-c,0),d=u>0?u+n+s+c:0;let f=0;const p=i-l;if(n){const rt=u>0?u-n:0,tt=h>0?h-n:0,Y=(rt+tt)/2,nt=Y!==0?p*Y/(Y+n):p;f=(p-nt)/2}const g=Math.max(.001,p*h-s/ht)/h,_=(p-g)/2,b=l+_+f,v=i-_-f,{outerStart:M,outerEnd:S,innerStart:w,innerEnd:R}=gx(t,d,h,v-b),k=h-M,P=h-S,C=b+M/k,O=v-S/P,B=d+w,U=d+R,at=b+w/B,Ct=v-R/U;if(e.beginPath(),o){const rt=(C+O)/2;if(e.arc(r,a,h,C,rt),e.arc(r,a,h,rt,O),S>0){const xt=Ws(P,O,r,a);e.arc(xt.x,xt.y,S,O,v+Dt)}const tt=Ws(U,v,r,a);if(e.lineTo(tt.x,tt.y),R>0){const xt=Ws(U,Ct,r,a);e.arc(xt.x,xt.y,R,v+Dt,Ct+Math.PI)}const Y=(v-R/d+(b+w/d))/2;if(e.arc(r,a,d,v-R/d,Y,!0),e.arc(r,a,d,Y,b+w/d,!0),w>0){const xt=Ws(B,at,r,a);e.arc(xt.x,xt.y,w,at+Math.PI,b-Dt)}const nt=Ws(k,b,r,a);if(e.lineTo(nt.x,nt.y),M>0){const xt=Ws(k,C,r,a);e.arc(xt.x,xt.y,M,b-Dt,C)}}else{e.moveTo(r,a);const rt=Math.cos(C)*h+r,tt=Math.sin(C)*h+a;e.lineTo(rt,tt);const Y=Math.cos(O)*h+r,nt=Math.sin(O)*h+a;e.lineTo(Y,nt)}e.closePath()}function mx(e,t,s,n,i){const{fullCircles:o,startAngle:r,circumference:a}=t;let l=t.endAngle;if(o){zi(e,t,s,n,l,i);for(let c=0;c<o;++c)e.fill();isNaN(a)||(l=r+(a%Mt||Mt))}return zi(e,t,s,n,l,i),e.fill(),l}function bx(e,t,s,n,i){const{fullCircles:o,startAngle:r,circumference:a,options:l}=t,{borderWidth:c,borderJoinStyle:u,borderDash:h,borderDashOffset:d,borderRadius:f}=l,p=l.borderAlign===\"inner\";if(!c)return;e.setLineDash(h||[]),e.lineDashOffset=d,p?(e.lineWidth=c*2,e.lineJoin=u||\"round\"):(e.lineWidth=c,e.lineJoin=u||\"bevel\");let g=t.endAngle;if(o){zi(e,t,s,n,g,i);for(let _=0;_<o;++_)e.stroke();isNaN(a)||(g=r+(a%Mt||Mt))}p&&fx(e,t,g),l.selfJoin&&g-r>=ht&&f===0&&u!==\"miter\"&&dx(e,t,g),o||(zi(e,t,s,n,g,i),e.stroke())}class _x extends is{static id=\"arc\";static defaults={borderAlign:\"center\",borderColor:\"#fff\",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1};static defaultRoutes={backgroundColor:\"backgroundColor\"};static descriptors={_scriptable:!0,_indexable:t=>t!==\"borderDash\"};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,s,n){const i=this.getProps([\"x\",\"y\"],n),{angle:o,distance:r}=Xu(i,{x:t,y:s}),{startAngle:a,endAngle:l,innerRadius:c,outerRadius:u,circumference:h}=this.getProps([\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"circumference\"],n),d=(this.options.spacing+this.options.borderWidth)/2,f=Z(h,l-a),p=Un(o,a,l)&&a!==l,g=f>=Mt||p,_=Ge(r,c+d,u+d);return g&&_}getCenterPoint(t){const{x:s,y:n,startAngle:i,endAngle:o,innerRadius:r,outerRadius:a}=this.getProps([\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"],t),{offset:l,spacing:c}=this.options,u=(i+o)/2,h=(r+a+c+l)/2;return{x:s+Math.cos(u)*h,y:n+Math.sin(u)*h}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:s,circumference:n}=this,i=(s.offset||0)/4,o=(s.spacing||0)/2,r=s.circular;if(this.pixelMargin=s.borderAlign===\"inner\"?.33:0,this.fullCircles=n>Mt?Math.floor(n/Mt):0,n===0||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*i,Math.sin(a)*i);const l=1-Math.sin(Math.min(ht,n||0)),c=i*l;t.fillStyle=s.backgroundColor,t.strokeStyle=s.borderColor,mx(t,this,c,o,r),bx(t,this,c,o,r),t.restore()}}function Th(e,t,s=t){e.lineCap=Z(s.borderCapStyle,t.borderCapStyle),e.setLineDash(Z(s.borderDash,t.borderDash)),e.lineDashOffset=Z(s.borderDashOffset,t.borderDashOffset),e.lineJoin=Z(s.borderJoinStyle,t.borderJoinStyle),e.lineWidth=Z(s.borderWidth,t.borderWidth),e.strokeStyle=Z(s.borderColor,t.borderColor)}function yx(e,t,s){e.lineTo(s.x,s.y)}function xx(e){return e.stepped?L_:e.tension||e.cubicInterpolationMode===\"monotone\"?F_:yx}function Eh(e,t,s={}){const n=e.length,{start:i=0,end:o=n-1}=s,{start:r,end:a}=t,l=Math.max(i,r),c=Math.min(o,a),u=i<r&&o<r||i>a&&o>a;return{count:n,start:l,loop:t.loop,ilen:c<l&&!u?n+c-l:c-l}}function vx(e,t,s,n){const{points:i,options:o}=t,{count:r,start:a,loop:l,ilen:c}=Eh(i,s,n),u=xx(o);let{move:h=!0,reverse:d}=n||{},f,p,g;for(f=0;f<=c;++f)p=i[(a+(d?c-f:f))%r],!p.skip&&(h?(e.moveTo(p.x,p.y),h=!1):u(e,g,p,d,o.stepped),g=p);return l&&(p=i[(a+(d?c:0))%r],u(e,g,p,d,o.stepped)),!!l}function wx(e,t,s,n){const i=t.points,{count:o,start:r,ilen:a}=Eh(i,s,n),{move:l=!0,reverse:c}=n||{};let u=0,h=0,d,f,p,g,_,b;const v=S=>(r+(c?a-S:S))%o,M=()=>{g!==_&&(e.lineTo(u,_),e.lineTo(u,g),e.lineTo(u,b))};for(l&&(f=i[v(0)],e.moveTo(f.x,f.y)),d=0;d<=a;++d){if(f=i[v(d)],f.skip)continue;const S=f.x,w=f.y,R=S|0;R===p?(w<g?g=w:w>_&&(_=w),u=(h*u+S)/++h):(M(),e.lineTo(S,w),p=R,h=0,g=_=w),b=w}M()}function cr(e){const t=e.options,s=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==\"monotone\"&&!t.stepped&&!s?wx:vx}function Sx(e){return e.stepped?p0:e.tension||e.cubicInterpolationMode===\"monotone\"?g0:Os}function kx(e,t,s,n){let i=t._path;i||(i=t._path=new Path2D,t.path(i,s,n)&&i.closePath()),Th(e,t.options),e.stroke(i)}function Mx(e,t,s,n){const{segments:i,options:o}=t,r=cr(t);for(const a of i)Th(e,o,a.style),e.beginPath(),r(e,t,a,{start:s,end:s+n-1})&&e.closePath(),e.stroke()}const Cx=typeof Path2D==\"function\";function Px(e,t,s,n){Cx&&!t.options.segment?kx(e,t,s,n):Mx(e,t,s,n)}class uo extends is{static id=\"line\";static defaults={borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:\"default\",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};static descriptors={_scriptable:!0,_indexable:t=>t!==\"borderDash\"&&t!==\"fill\"};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,s){const n=this.options;if((n.tension||n.cubicInterpolationMode===\"monotone\")&&!n.stepped&&!this._pointsUpdated){const i=n.spanGaps?this._loop:this._fullLoop;r0(this._points,n,t,i,s),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=v0(this,this.options.segment))}first(){const t=this.segments,s=this.points;return t.length&&s[t[0].start]}last(){const t=this.segments,s=this.points,n=t.length;return n&&s[t[n-1].end]}interpolate(t,s){const n=this.options,i=t[s],o=this.points,r=mh(this,{property:s,start:i,end:i});if(!r.length)return;const a=[],l=Sx(n);let c,u;for(c=0,u=r.length;c<u;++c){const{start:h,end:d}=r[c],f=o[h],p=o[d];if(f===p){a.push(f);continue}const g=Math.abs((i-f[s])/(p[s]-f[s])),_=l(f,p,g,n.stepped);_[s]=t[s],a.push(_)}return a.length===1?a[0]:a}pathSegment(t,s,n){return cr(this)(t,this,s,n)}path(t,s,n){const i=this.segments,o=cr(this);let r=this._loop;s=s||0,n=n||this.points.length-s;for(const a of i)r&=o(t,this,a,{start:s,end:s+n-1});return!!r}draw(t,s,n,i){const o=this.options||{};(this.points||[]).length&&o.borderWidth&&(t.save(),Px(t,this,n,i),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function Vl(e,t,s,n){const i=e.options,{[s]:o}=e.getProps([s],n);return Math.abs(t-o)<i.radius+i.hitRadius}class Ax extends is{static id=\"point\";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:\"circle\",radius:3,rotation:0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,s,n){const i=this.options,{x:o,y:r}=this.getProps([\"x\",\"y\"],n);return Math.pow(t-o,2)+Math.pow(s-r,2)<Math.pow(i.hitRadius+i.radius,2)}inXRange(t,s){return Vl(this,t,\"x\",s)}inYRange(t,s){return Vl(this,t,\"y\",s)}getCenterPoint(t){const{x:s,y:n}=this.getProps([\"x\",\"y\"],t);return{x:s,y:n}}size(t){t=t||this.options||{};let s=t.radius||0;s=Math.max(s,s&&t.hoverRadius||0);const n=s&&t.borderWidth||0;return(s+n)*2}draw(t,s){const n=this.options;this.skip||n.radius<.1||!Xe(this,s,this.size(n)/2)||(t.strokeStyle=n.borderColor,t.lineWidth=n.borderWidth,t.fillStyle=n.backgroundColor,rr(t,n,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}function Dh(e,t){const{x:s,y:n,base:i,width:o,height:r}=e.getProps([\"x\",\"y\",\"base\",\"width\",\"height\"],t);let a,l,c,u,h;return e.horizontal?(h=r/2,a=Math.min(s,i),l=Math.max(s,i),c=n-h,u=n+h):(h=o/2,a=s-h,l=s+h,c=Math.min(n,i),u=Math.max(n,i)),{left:a,top:c,right:l,bottom:u}}function fs(e,t,s,n){return e?0:Bt(t,s,n)}function Rx(e,t,s){const n=e.options.borderWidth,i=e.borderSkipped,o=oh(n);return{t:fs(i.top,o.top,0,s),r:fs(i.right,o.right,0,t),b:fs(i.bottom,o.bottom,0,s),l:fs(i.left,o.left,0,t)}}function Ox(e,t,s){const{enableBorderRadius:n}=e.getProps([\"enableBorderRadius\"]),i=e.options.borderRadius,o=Fs(i),r=Math.min(t,s),a=e.borderSkipped,l=n||ot(i);return{topLeft:fs(!l||a.top||a.left,o.topLeft,0,r),topRight:fs(!l||a.top||a.right,o.topRight,0,r),bottomLeft:fs(!l||a.bottom||a.left,o.bottomLeft,0,r),bottomRight:fs(!l||a.bottom||a.right,o.bottomRight,0,r)}}function Tx(e){const t=Dh(e),s=t.right-t.left,n=t.bottom-t.top,i=Rx(e,s/2,n/2),o=Ox(e,s/2,n/2);return{outer:{x:t.left,y:t.top,w:s,h:n,radius:o},inner:{x:t.left+i.l,y:t.top+i.t,w:s-i.l-i.r,h:n-i.t-i.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(i.t,i.l)),topRight:Math.max(0,o.topRight-Math.max(i.t,i.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(i.b,i.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(i.b,i.r))}}}}function Fo(e,t,s,n){const i=t===null,o=s===null,a=e&&!(i&&o)&&Dh(e,n);return a&&(i||Ge(t,a.left,a.right))&&(o||Ge(s,a.top,a.bottom))}function Ex(e){return e.topLeft||e.topRight||e.bottomLeft||e.bottomRight}function Dx(e,t){e.rect(t.x,t.y,t.w,t.h)}function No(e,t,s={}){const n=e.x!==s.x?-t:0,i=e.y!==s.y?-t:0,o=(e.x+e.w!==s.x+s.w?t:0)-n,r=(e.y+e.h!==s.y+s.h?t:0)-i;return{x:e.x+n,y:e.y+i,w:e.w+o,h:e.h+r,radius:e.radius}}class Ix extends is{static id=\"bar\";static defaults={borderSkipped:\"start\",borderWidth:0,borderRadius:0,inflateAmount:\"auto\",pointStyle:void 0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:s,options:{borderColor:n,backgroundColor:i}}=this,{inner:o,outer:r}=Tx(this),a=Ex(r.radius)?Kn:Dx;t.save(),(r.w!==o.w||r.h!==o.h)&&(t.beginPath(),a(t,No(r,s,o)),t.clip(),a(t,No(o,-s,r)),t.fillStyle=n,t.fill(\"evenodd\")),t.beginPath(),a(t,No(o,s)),t.fillStyle=i,t.fill(),t.restore()}inRange(t,s,n){return Fo(this,t,s,n)}inXRange(t,s){return Fo(this,t,null,s)}inYRange(t,s){return Fo(this,null,t,s)}getCenterPoint(t){const{x:s,y:n,base:i,horizontal:o}=this.getProps([\"x\",\"y\",\"base\",\"horizontal\"],t);return{x:o?(s+i)/2:s,y:o?n:(n+i)/2}}getRange(t){return t===\"x\"?this.width/2:this.height/2}}var Lx=Object.freeze({__proto__:null,ArcElement:_x,BarElement:Ix,LineElement:uo,PointElement:Ax});const ur=[\"rgb(54, 162, 235)\",\"rgb(255, 99, 132)\",\"rgb(255, 159, 64)\",\"rgb(255, 205, 86)\",\"rgb(75, 192, 192)\",\"rgb(153, 102, 255)\",\"rgb(201, 203, 207)\"],jl=ur.map(e=>e.replace(\"rgb(\",\"rgba(\").replace(\")\",\", 0.5)\"));function Ih(e){return ur[e%ur.length]}function Lh(e){return jl[e%jl.length]}function Fx(e,t){return e.borderColor=Ih(t),e.backgroundColor=Lh(t),++t}function Nx(e,t){return e.backgroundColor=e.data.map(()=>Ih(t++)),t}function Bx(e,t){return e.backgroundColor=e.data.map(()=>Lh(t++)),t}function $x(e){let t=0;return(s,n)=>{const i=e.getDatasetMeta(n).controller;i instanceof Qr?t=Nx(s,t):i instanceof vh?t=Bx(s,t):i&&(t=Fx(s,t))}}function Hl(e){let t;for(t in e)if(e[t].borderColor||e[t].backgroundColor)return!0;return!1}function Vx(e){return e&&(e.borderColor||e.backgroundColor)}function jx(){return Rt.borderColor!==\"rgba(0,0,0,0.1)\"||Rt.backgroundColor!==\"rgba(0,0,0,0.1)\"}var Hx={id:\"colors\",defaults:{enabled:!0,forceOverride:!1},beforeLayout(e,t,s){if(!s.enabled)return;const{data:{datasets:n},options:i}=e.config,{elements:o}=i,r=Hl(n)||Vx(i)||o&&Hl(o)||jx();if(!s.forceOverride&&r)return;const a=$x(e);n.forEach(a)}};function zx(e,t,s,n,i){const o=i.samples||n;if(o>=s)return e.slice(t,t+s);const r=[],a=(s-2)/(o-2);let l=0;const c=t+s-1;let u=t,h,d,f,p,g;for(r[l++]=e[u],h=0;h<o-2;h++){let _=0,b=0,v;const M=Math.floor((h+1)*a)+1+t,S=Math.min(Math.floor((h+2)*a)+1,s)+t,w=S-M;for(v=M;v<S;v++)_+=e[v].x,b+=e[v].y;_/=w,b/=w;const R=Math.floor(h*a)+1+t,k=Math.min(Math.floor((h+1)*a)+1,s)+t,{x:P,y:C}=e[u];for(f=p=-1,v=R;v<k;v++)p=.5*Math.abs((P-_)*(e[v].y-C)-(P-e[v].x)*(b-C)),p>f&&(f=p,d=e[v],g=v);r[l++]=d,u=g}return r[l++]=e[c],r}function Wx(e,t,s,n){let i=0,o=0,r,a,l,c,u,h,d,f,p,g;const _=[],b=t+s-1,v=e[t].x,S=e[b].x-v;for(r=t;r<t+s;++r){a=e[r],l=(a.x-v)/S*n,c=a.y;const w=l|0;if(w===u)c<p?(p=c,h=r):c>g&&(g=c,d=r),i=(o*i+a.x)/++o;else{const R=r-1;if(!it(h)&&!it(d)){const k=Math.min(h,d),P=Math.max(h,d);k!==f&&k!==R&&_.push({...e[k],x:i}),P!==f&&P!==R&&_.push({...e[P],x:i})}r>0&&R!==f&&_.push(e[R]),_.push(a),u=w,o=0,p=g=c,h=d=f=r}}return _}function Fh(e){if(e._decimated){const t=e._data;delete e._decimated,delete e._data,Object.defineProperty(e,\"data\",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function zl(e){e.data.datasets.forEach(t=>{Fh(t)})}function qx(e,t){const s=t.length;let n=0,i;const{iScale:o}=e,{min:r,max:a,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(n=Bt(Ye(t,o.axis,r).lo,0,s-1)),c?i=Bt(Ye(t,o.axis,a).hi+1,n,s)-n:i=s-n,{start:n,count:i}}var Ux={id:\"decimation\",defaults:{algorithm:\"min-max\",enabled:!1},beforeElementsUpdate:(e,t,s)=>{if(!s.enabled){zl(e);return}const n=e.width;e.data.datasets.forEach((i,o)=>{const{_data:r,indexAxis:a}=i,l=e.getDatasetMeta(o),c=r||i.data;if(wn([a,e.options.indexAxis])===\"y\"||!l.controller.supportsDecimation)return;const u=e.scales[l.xAxisID];if(u.type!==\"linear\"&&u.type!==\"time\"||e.options.parsing)return;let{start:h,count:d}=qx(l,c);const f=s.threshold||4*n;if(d<=f){Fh(i);return}it(r)&&(i._data=c,delete i.data,Object.defineProperty(i,\"data\",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(g){this._data=g}}));let p;switch(s.algorithm){case\"lttb\":p=zx(c,h,d,n,s);break;case\"min-max\":p=Wx(c,h,d,n);break;default:throw new Error(`Unsupported decimation algorithm '${s.algorithm}'`)}i._decimated=p})},destroy(e){zl(e)}};function Kx(e,t,s){const n=e.segments,i=e.points,o=t.points,r=[];for(const a of n){let{start:l,end:c}=a;c=ho(l,c,i);const u=hr(s,i[l],i[c],a.loop);if(!t.segments){r.push({source:a,target:u,start:i[l],end:i[c]});continue}const h=mh(t,u);for(const d of h){const f=hr(s,o[d.start],o[d.end],d.loop),p=gh(a,i,f);for(const g of p)r.push({source:g,target:d,start:{[s]:Wl(u,f,\"start\",Math.max)},end:{[s]:Wl(u,f,\"end\",Math.min)}})}}return r}function hr(e,t,s,n){if(n)return;let i=t[e],o=s[e];return e===\"angle\"&&(i=Ht(i),o=Ht(o)),{property:e,start:i,end:o}}function Gx(e,t){const{x:s=null,y:n=null}=e||{},i=t.points,o=[];return t.segments.forEach(({start:r,end:a})=>{a=ho(r,a,i);const l=i[r],c=i[a];n!==null?(o.push({x:l.x,y:n}),o.push({x:c.x,y:n})):s!==null&&(o.push({x:s,y:l.y}),o.push({x:s,y:c.y}))}),o}function ho(e,t,s){for(;t>e;t--){const n=s[t];if(!isNaN(n.x)&&!isNaN(n.y))break}return t}function Wl(e,t,s,n){return e&&t?n(e[s],t[s]):e?e[s]:t?t[s]:0}function Nh(e,t){let s=[],n=!1;return At(e)?(n=!0,s=e):s=Gx(e,t),s.length?new uo({points:s,options:{tension:0},_loop:n,_fullLoop:n}):null}function ql(e){return e&&e.fill!==!1}function Yx(e,t,s){let i=e[t].fill;const o=[t];let r;if(!s)return i;for(;i!==!1&&o.indexOf(i)===-1;){if(!Tt(i))return i;if(r=e[i],!r)return!1;if(r.visible)return i;o.push(i),i=r.fill}return!1}function Xx(e,t,s){const n=tv(e);if(ot(n))return isNaN(n.value)?!1:n;let i=parseFloat(n);return Tt(i)&&Math.floor(i)===i?Jx(n[0],t,i,s):[\"origin\",\"start\",\"end\",\"stack\",\"shape\"].indexOf(n)>=0&&n}function Jx(e,t,s,n){return(e===\"-\"||e===\"+\")&&(s=t+s),s===t||s<0||s>=n?!1:s}function Qx(e,t){let s=null;return e===\"start\"?s=t.bottom:e===\"end\"?s=t.top:ot(e)?s=t.getPixelForValue(e.value):t.getBasePixel&&(s=t.getBasePixel()),s}function Zx(e,t,s){let n;return e===\"start\"?n=s:e===\"end\"?n=t.options.reverse?t.min:t.max:ot(e)?n=e.value:n=t.getBaseValue(),n}function tv(e){const t=e.options,s=t.fill;let n=Z(s&&s.target,s);return n===void 0&&(n=!!t.backgroundColor),n===!1||n===null?!1:n===!0?\"origin\":n}function ev(e){const{scale:t,index:s,line:n}=e,i=[],o=n.segments,r=n.points,a=sv(t,s);a.push(Nh({x:null,y:t.bottom},n));for(let l=0;l<o.length;l++){const c=o[l];for(let u=c.start;u<=c.end;u++)nv(i,r[u],a)}return new uo({points:i,options:{}})}function sv(e,t){const s=[],n=e.getMatchingVisibleMetas(\"line\");for(let i=0;i<n.length;i++){const o=n[i];if(o.index===t)break;o.hidden||s.unshift(o.dataset)}return s}function nv(e,t,s){const n=[];for(let i=0;i<s.length;i++){const o=s[i],{first:r,last:a,point:l}=iv(o,t,\"x\");if(!(!l||r&&a)){if(r)n.unshift(l);else if(e.push(l),!a)break}}e.push(...n)}function iv(e,t,s){const n=e.interpolate(t,s);if(!n)return{};const i=n[s],o=e.segments,r=e.points;let a=!1,l=!1;for(let c=0;c<o.length;c++){const u=o[c],h=r[u.start][s],d=r[u.end][s];if(Ge(i,h,d)){a=i===h,l=i===d;break}}return{first:a,last:l,point:n}}class Bh{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,s,n){const{x:i,y:o,radius:r}=this;return s=s||{start:0,end:Mt},t.arc(i,o,r,s.end,s.start,!0),!n.bounds}interpolate(t){const{x:s,y:n,radius:i}=this,o=t.angle;return{x:s+Math.cos(o)*i,y:n+Math.sin(o)*i,angle:o}}}function ov(e){const{chart:t,fill:s,line:n}=e;if(Tt(s))return rv(t,s);if(s===\"stack\")return ev(e);if(s===\"shape\")return!0;const i=av(e);return i instanceof Bh?i:Nh(i,n)}function rv(e,t){const s=e.getDatasetMeta(t);return s&&e.isDatasetVisible(t)?s.dataset:null}function av(e){return(e.scale||{}).getPointPositionForValue?cv(e):lv(e)}function lv(e){const{scale:t={},fill:s}=e,n=Qx(s,t);if(Tt(n)){const i=t.isHorizontal();return{x:i?n:null,y:i?null:n}}return null}function cv(e){const{scale:t,fill:s}=e,n=t.options,i=t.getLabels().length,o=n.reverse?t.max:t.min,r=Zx(s,t,o),a=[];if(n.grid.circular){const l=t.getPointPositionForValue(0,o);return new Bh({x:l.x,y:l.y,radius:t.getDistanceFromCenterForValue(r)})}for(let l=0;l<i;++l)a.push(t.getPointPositionForValue(l,r));return a}function Bo(e,t,s){const n=ov(t),{chart:i,index:o,line:r,scale:a,axis:l}=t,c=r.options,u=c.fill,h=c.backgroundColor,{above:d=h,below:f=h}=u||{},p=i.getDatasetMeta(o),g=bh(i,p);n&&r.points.length&&(ro(e,s),uv(e,{line:r,target:n,above:d,below:f,area:s,scale:a,axis:l,clip:g}),ao(e))}function uv(e,t){const{line:s,target:n,above:i,below:o,area:r,scale:a,clip:l}=t,c=s._loop?\"angle\":t.axis;e.save();let u=o;o!==i&&(c===\"x\"?(Ul(e,n,r.top),$o(e,{line:s,target:n,color:i,scale:a,property:c,clip:l}),e.restore(),e.save(),Ul(e,n,r.bottom)):c===\"y\"&&(Kl(e,n,r.left),$o(e,{line:s,target:n,color:o,scale:a,property:c,clip:l}),e.restore(),e.save(),Kl(e,n,r.right),u=i)),$o(e,{line:s,target:n,color:u,scale:a,property:c,clip:l}),e.restore()}function Ul(e,t,s){const{segments:n,points:i}=t;let o=!0,r=!1;e.beginPath();for(const a of n){const{start:l,end:c}=a,u=i[l],h=i[ho(l,c,i)];o?(e.moveTo(u.x,u.y),o=!1):(e.lineTo(u.x,s),e.lineTo(u.x,u.y)),r=!!t.pathSegment(e,a,{move:r}),r?e.closePath():e.lineTo(h.x,s)}e.lineTo(t.first().x,s),e.closePath(),e.clip()}function Kl(e,t,s){const{segments:n,points:i}=t;let o=!0,r=!1;e.beginPath();for(const a of n){const{start:l,end:c}=a,u=i[l],h=i[ho(l,c,i)];o?(e.moveTo(u.x,u.y),o=!1):(e.lineTo(s,u.y),e.lineTo(u.x,u.y)),r=!!t.pathSegment(e,a,{move:r}),r?e.closePath():e.lineTo(s,h.y)}e.lineTo(s,t.first().y),e.closePath(),e.clip()}function $o(e,t){const{line:s,target:n,property:i,color:o,scale:r,clip:a}=t,l=Kx(s,n,i);for(const{source:c,target:u,start:h,end:d}of l){const{style:{backgroundColor:f=o}={}}=c,p=n!==!0;e.save(),e.fillStyle=f,hv(e,r,a,p&&hr(i,h,d)),e.beginPath();const g=!!s.pathSegment(e,c);let _;if(p){g?e.closePath():Gl(e,n,d,i);const b=!!n.pathSegment(e,u,{move:g,reverse:!0});_=g&&b,_||Gl(e,n,h,i)}e.closePath(),e.fill(_?\"evenodd\":\"nonzero\"),e.restore()}}function hv(e,t,s,n){const i=t.chart.chartArea,{property:o,start:r,end:a}=n||{};if(o===\"x\"||o===\"y\"){let l,c,u,h;o===\"x\"?(l=r,c=i.top,u=a,h=i.bottom):(l=i.left,c=r,u=i.right,h=a),e.beginPath(),s&&(l=Math.max(l,s.left),u=Math.min(u,s.right),c=Math.max(c,s.top),h=Math.min(h,s.bottom)),e.rect(l,c,u-l,h-c),e.clip()}}function Gl(e,t,s,n){const i=t.interpolate(s,n);i&&e.lineTo(i.x,i.y)}var dv={id:\"filler\",afterDatasetsUpdate(e,t,s){const n=(e.data.datasets||[]).length,i=[];let o,r,a,l;for(r=0;r<n;++r)o=e.getDatasetMeta(r),a=o.dataset,l=null,a&&a.options&&a instanceof uo&&(l={visible:e.isDatasetVisible(r),index:r,fill:Xx(a,r,n),chart:e,axis:o.controller.options.indexAxis,scale:o.vScale,line:a}),o.$filler=l,i.push(l);for(r=0;r<n;++r)l=i[r],!(!l||l.fill===!1)&&(l.fill=Yx(i,r,s.propagate))},beforeDraw(e,t,s){const n=s.drawTime===\"beforeDraw\",i=e.getSortedVisibleDatasetMetas(),o=e.chartArea;for(let r=i.length-1;r>=0;--r){const a=i[r].$filler;a&&(a.line.updateControlPoints(o,a.axis),n&&a.fill&&Bo(e.ctx,a,o))}},beforeDatasetsDraw(e,t,s){if(s.drawTime!==\"beforeDatasetsDraw\")return;const n=e.getSortedVisibleDatasetMetas();for(let i=n.length-1;i>=0;--i){const o=n[i].$filler;ql(o)&&Bo(e.ctx,o,e.chartArea)}},beforeDatasetDraw(e,t,s){const n=t.meta.$filler;!ql(n)||s.drawTime!==\"beforeDatasetDraw\"||Bo(e.ctx,n,e.chartArea)},defaults:{propagate:!0,drawTime:\"beforeDatasetDraw\"}};const Yl=(e,t)=>{let{boxHeight:s=t,boxWidth:n=t}=e;return e.usePointStyle&&(s=Math.min(s,t),n=e.pointStyleWidth||Math.min(n,t)),{boxWidth:n,boxHeight:s,itemHeight:Math.max(t,s)}},fv=(e,t)=>e!==null&&t!==null&&e.datasetIndex===t.datasetIndex&&e.index===t.index;class Xl extends is{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,s,n){this.maxWidth=t,this.maxHeight=s,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let s=St(t.generateLabels,[this.chart],this)||[];t.filter&&(s=s.filter(n=>t.filter(n,this.chart.data))),t.sort&&(s=s.sort((n,i)=>t.sort(n,i,this.chart.data))),this.options.reverse&&s.reverse(),this.legendItems=s}fit(){const{options:t,ctx:s}=this;if(!t.display){this.width=this.height=0;return}const n=t.labels,i=Nt(n.font),o=i.size,r=this._computeTitleHeight(),{boxWidth:a,itemHeight:l}=Yl(n,o);let c,u;s.font=i.string,this.isHorizontal()?(c=this.maxWidth,u=this._fitRows(r,o,a,l)+10):(u=this.maxHeight,c=this._fitCols(r,i,a,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(u,t.maxHeight||this.maxHeight)}_fitRows(t,s,n,i){const{ctx:o,maxWidth:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],u=i+a;let h=t;o.textAlign=\"left\",o.textBaseline=\"middle\";let d=-1,f=-u;return this.legendItems.forEach((p,g)=>{const _=n+s/2+o.measureText(p.text).width;(g===0||c[c.length-1]+_+2*a>r)&&(h+=u,c[c.length-(g>0?0:1)]=0,f+=u,d++),l[g]={left:0,top:f,row:d,width:_,height:i},c[c.length-1]+=_+a}),h}_fitCols(t,s,n,i){const{ctx:o,maxHeight:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],u=r-t;let h=a,d=0,f=0,p=0,g=0;return this.legendItems.forEach((_,b)=>{const{itemWidth:v,itemHeight:M}=pv(n,s,o,_,i);b>0&&f+M+2*a>u&&(h+=d+a,c.push({width:d,height:f}),p+=d+a,g++,d=f=0),l[b]={left:p,top:f,col:g,width:v,height:M},d=Math.max(d,v),f+=M+a}),h+=d,c.push({width:d,height:f}),h}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:s,options:{align:n,labels:{padding:i},rtl:o}}=this,r=Qs(o,this.left,this.width);if(this.isHorizontal()){let a=0,l=jt(n,this.left+i,this.right-this.lineWidths[a]);for(const c of s)a!==c.row&&(a=c.row,l=jt(n,this.left+i,this.right-this.lineWidths[a])),c.top+=this.top+t+i,c.left=r.leftForLtr(r.x(l),c.width),l+=c.width+i}else{let a=0,l=jt(n,this.top+t+i,this.bottom-this.columnSizes[a].height);for(const c of s)c.col!==a&&(a=c.col,l=jt(n,this.top+t+i,this.bottom-this.columnSizes[a].height)),c.top=l,c.left+=this.left+i,c.left=r.leftForLtr(r.x(c.left),c.width),l+=c.height+i}}isHorizontal(){return this.options.position===\"top\"||this.options.position===\"bottom\"}draw(){if(this.options.display){const t=this.ctx;ro(t,this),this._draw(),ao(t)}}_draw(){const{options:t,columnSizes:s,lineWidths:n,ctx:i}=this,{align:o,labels:r}=t,a=Rt.color,l=Qs(t.rtl,this.left,this.width),c=Nt(r.font),{padding:u}=r,h=c.size,d=h/2;let f;this.drawTitle(),i.textAlign=l.textAlign(\"left\"),i.textBaseline=\"middle\",i.lineWidth=.5,i.font=c.string;const{boxWidth:p,boxHeight:g,itemHeight:_}=Yl(r,h),b=function(R,k,P){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const C=Z(P.lineWidth,1);if(i.fillStyle=Z(P.fillStyle,a),i.lineCap=Z(P.lineCap,\"butt\"),i.lineDashOffset=Z(P.lineDashOffset,0),i.lineJoin=Z(P.lineJoin,\"miter\"),i.lineWidth=C,i.strokeStyle=Z(P.strokeStyle,a),i.setLineDash(Z(P.lineDash,[])),r.usePointStyle){const O={radius:g*Math.SQRT2/2,pointStyle:P.pointStyle,rotation:P.rotation,borderWidth:C},B=l.xPlus(R,p/2),U=k+d;ih(i,O,B,U,r.pointStyleWidth&&p)}else{const O=k+Math.max((h-g)/2,0),B=l.leftForLtr(R,p),U=Fs(P.borderRadius);i.beginPath(),Object.values(U).some(at=>at!==0)?Kn(i,{x:B,y:O,w:p,h:g,radius:U}):i.rect(B,O,p,g),i.fill(),C!==0&&i.stroke()}i.restore()},v=function(R,k,P){Vs(i,P.text,R,k+_/2,c,{strikethrough:P.hidden,textAlign:l.textAlign(P.textAlign)})},M=this.isHorizontal(),S=this._computeTitleHeight();M?f={x:jt(o,this.left+u,this.right-n[0]),y:this.top+u+S,line:0}:f={x:this.left+u,y:jt(o,this.top+S+u,this.bottom-s[0].height),line:0},dh(this.ctx,t.textDirection);const w=_+u;this.legendItems.forEach((R,k)=>{i.strokeStyle=R.fontColor,i.fillStyle=R.fontColor;const P=i.measureText(R.text).width,C=l.textAlign(R.textAlign||(R.textAlign=r.textAlign)),O=p+d+P;let B=f.x,U=f.y;l.setWidth(this.width),M?k>0&&B+O+u>this.right&&(U=f.y+=w,f.line++,B=f.x=jt(o,this.left+u,this.right-n[f.line])):k>0&&U+w>this.bottom&&(B=f.x=B+s[f.line].width+u,f.line++,U=f.y=jt(o,this.top+S+u,this.bottom-s[f.line].height));const at=l.x(B);if(b(at,U,R),B=k_(C,B+p+d,M?B+O:this.right,t.rtl),v(l.x(B),U,R),M)f.x+=O+u;else if(typeof R.text!=\"string\"){const Ct=c.lineHeight;f.y+=$h(R,Ct)+u}else f.y+=w}),fh(this.ctx,t.textDirection)}drawTitle(){const t=this.options,s=t.title,n=Nt(s.font),i=Yt(s.padding);if(!s.display)return;const o=Qs(t.rtl,this.left,this.width),r=this.ctx,a=s.position,l=n.size/2,c=i.top+l;let u,h=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),u=this.top+c,h=jt(t.align,h,this.right-d);else{const p=this.columnSizes.reduce((g,_)=>Math.max(g,_.height),0);u=c+jt(t.align,this.top,this.bottom-p-t.labels.padding-this._computeTitleHeight())}const f=jt(a,h,h+d);r.textAlign=o.textAlign(Wr(a)),r.textBaseline=\"middle\",r.strokeStyle=s.color,r.fillStyle=s.color,r.font=n.string,Vs(r,s.text,f,u,n)}_computeTitleHeight(){const t=this.options.title,s=Nt(t.font),n=Yt(t.padding);return t.display?s.lineHeight+n.height:0}_getLegendItemAt(t,s){let n,i,o;if(Ge(t,this.left,this.right)&&Ge(s,this.top,this.bottom)){for(o=this.legendHitBoxes,n=0;n<o.length;++n)if(i=o[n],Ge(t,i.left,i.left+i.width)&&Ge(s,i.top,i.top+i.height))return this.legendItems[n]}return null}handleEvent(t){const s=this.options;if(!bv(t.type,s))return;const n=this._getLegendItemAt(t.x,t.y);if(t.type===\"mousemove\"||t.type===\"mouseout\"){const i=this._hoveredItem,o=fv(i,n);i&&!o&&St(s.onLeave,[t,i,this],this),this._hoveredItem=n,n&&!o&&St(s.onHover,[t,n,this],this)}else n&&St(s.onClick,[t,n,this],this)}}function pv(e,t,s,n,i){const o=gv(n,e,t,s),r=mv(i,n,t.lineHeight);return{itemWidth:o,itemHeight:r}}function gv(e,t,s,n){let i=e.text;return i&&typeof i!=\"string\"&&(i=i.reduce((o,r)=>o.length>r.length?o:r)),t+s.size/2+n.measureText(i).width}function mv(e,t,s){let n=e;return typeof t.text!=\"string\"&&(n=$h(t,s)),n}function $h(e,t){const s=e.text?e.text.length:0;return t*s}function bv(e,t){return!!((e===\"mousemove\"||e===\"mouseout\")&&(t.onHover||t.onLeave)||t.onClick&&(e===\"click\"||e===\"mouseup\"))}var _v={id:\"legend\",_element:Xl,start(e,t,s){const n=e.legend=new Xl({ctx:e.ctx,options:s,chart:e});Ut.configure(e,n,s),Ut.addBox(e,n)},stop(e){Ut.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,s){const n=e.legend;Ut.configure(e,n,s),n.options=s},afterUpdate(e){const t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:\"top\",align:\"center\",fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,s){const n=t.datasetIndex,i=s.chart;i.isDatasetVisible(n)?(i.hide(n),t.hidden=!0):(i.show(n),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){const t=e.data.datasets,{labels:{usePointStyle:s,pointStyle:n,textAlign:i,color:o,useBorderRadius:r,borderRadius:a}}=e.legend.options;return e._getSortedDatasetMetas().map(l=>{const c=l.controller.getStyle(s?0:void 0),u=Yt(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(u.width+u.height)/4,strokeStyle:c.borderColor,pointStyle:n||c.pointStyle,rotation:c.rotation,textAlign:i||c.textAlign,borderRadius:r&&(a||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:\"center\",text:\"\"}},descriptors:{_scriptable:e=>!e.startsWith(\"on\"),labels:{_scriptable:e=>![\"generateLabels\",\"filter\",\"sort\"].includes(e)}}};class ta extends is{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,s){const n=this.options;if(this.left=0,this.top=0,!n.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=s;const i=At(n.text)?n.text.length:1;this._padding=Yt(n.padding);const o=i*Nt(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return t===\"top\"||t===\"bottom\"}_drawArgs(t){const{top:s,left:n,bottom:i,right:o,options:r}=this,a=r.align;let l=0,c,u,h;return this.isHorizontal()?(u=jt(a,n,o),h=s+t,c=o-n):(r.position===\"left\"?(u=n+t,h=jt(a,i,s),l=ht*-.5):(u=o-t,h=jt(a,s,i),l=ht*.5),c=i-s),{titleX:u,titleY:h,maxWidth:c,rotation:l}}draw(){const t=this.ctx,s=this.options;if(!s.display)return;const n=Nt(s.font),o=n.lineHeight/2+this._padding.top,{titleX:r,titleY:a,maxWidth:l,rotation:c}=this._drawArgs(o);Vs(t,s.text,0,0,n,{color:s.color,maxWidth:l,rotation:c,textAlign:Wr(s.align),textBaseline:\"middle\",translation:[r,a]})}}function yv(e,t){const s=new ta({ctx:e.ctx,options:t,chart:e});Ut.configure(e,s,t),Ut.addBox(e,s),e.titleBlock=s}var xv={id:\"title\",_element:ta,start(e,t,s){yv(e,s)},stop(e){const t=e.titleBlock;Ut.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,s){const n=e.titleBlock;Ut.configure(e,n,s),n.options=s},defaults:{align:\"center\",display:!1,font:{weight:\"bold\"},fullSize:!0,padding:10,position:\"top\",text:\"\",weight:2e3},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const _i=new WeakMap;var vv={id:\"subtitle\",start(e,t,s){const n=new ta({ctx:e.ctx,options:s,chart:e});Ut.configure(e,n,s),Ut.addBox(e,n),_i.set(e,n)},stop(e){Ut.removeBox(e,_i.get(e)),_i.delete(e)},beforeUpdate(e,t,s){const n=_i.get(e);Ut.configure(e,n,s),n.options=s},defaults:{align:\"center\",display:!1,font:{weight:\"normal\"},fullSize:!0,padding:0,position:\"top\",text:\"\",weight:1500},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const kn={average(e){if(!e.length)return!1;let t,s,n=new Set,i=0,o=0;for(t=0,s=e.length;t<s;++t){const a=e[t].element;if(a&&a.hasValue()){const l=a.tooltipPosition();n.add(l.x),i+=l.y,++o}}return o===0||n.size===0?!1:{x:[...n].reduce((a,l)=>a+l)/n.size,y:i/o}},nearest(e,t){if(!e.length)return!1;let s=t.x,n=t.y,i=Number.POSITIVE_INFINITY,o,r,a;for(o=0,r=e.length;o<r;++o){const l=e[o].element;if(l&&l.hasValue()){const c=l.getCenterPoint(),u=ir(t,c);u<i&&(i=u,a=l)}}if(a){const l=a.tooltipPosition();s=l.x,n=l.y}return{x:s,y:n}}};function Oe(e,t){return t&&(At(t)?Array.prototype.push.apply(e,t):e.push(t)),e}function He(e){return(typeof e==\"string\"||e instanceof String)&&e.indexOf(`\n`)>-1?e.split(`\n`):e}function wv(e,t){const{element:s,datasetIndex:n,index:i}=t,o=e.getDatasetMeta(n).controller,{label:r,value:a}=o.getLabelAndValue(i);return{chart:e,label:r,parsed:o.getParsed(i),raw:e.data.datasets[n].data[i],formattedValue:a,dataset:o.getDataset(),dataIndex:i,datasetIndex:n,element:s}}function Jl(e,t){const s=e.chart.ctx,{body:n,footer:i,title:o}=e,{boxWidth:r,boxHeight:a}=t,l=Nt(t.bodyFont),c=Nt(t.titleFont),u=Nt(t.footerFont),h=o.length,d=i.length,f=n.length,p=Yt(t.padding);let g=p.height,_=0,b=n.reduce((S,w)=>S+w.before.length+w.lines.length+w.after.length,0);if(b+=e.beforeBody.length+e.afterBody.length,h&&(g+=h*c.lineHeight+(h-1)*t.titleSpacing+t.titleMarginBottom),b){const S=t.displayColors?Math.max(a,l.lineHeight):l.lineHeight;g+=f*S+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}d&&(g+=t.footerMarginTop+d*u.lineHeight+(d-1)*t.footerSpacing);let v=0;const M=function(S){_=Math.max(_,s.measureText(S).width+v)};return s.save(),s.font=c.string,bt(e.title,M),s.font=l.string,bt(e.beforeBody.concat(e.afterBody),M),v=t.displayColors?r+2+t.boxPadding:0,bt(n,S=>{bt(S.before,M),bt(S.lines,M),bt(S.after,M)}),v=0,s.font=u.string,bt(e.footer,M),s.restore(),_+=p.width,{width:_,height:g}}function Sv(e,t){const{y:s,height:n}=t;return s<n/2?\"top\":s>e.height-n/2?\"bottom\":\"center\"}function kv(e,t,s,n){const{x:i,width:o}=n,r=s.caretSize+s.caretPadding;if(e===\"left\"&&i+o+r>t.width||e===\"right\"&&i-o-r<0)return!0}function Mv(e,t,s,n){const{x:i,width:o}=s,{width:r,chartArea:{left:a,right:l}}=e;let c=\"center\";return n===\"center\"?c=i<=(a+l)/2?\"left\":\"right\":i<=o/2?c=\"left\":i>=r-o/2&&(c=\"right\"),kv(c,e,t,s)&&(c=\"center\"),c}function Ql(e,t,s){const n=s.yAlign||t.yAlign||Sv(e,s);return{xAlign:s.xAlign||t.xAlign||Mv(e,t,s,n),yAlign:n}}function Cv(e,t){let{x:s,width:n}=e;return t===\"right\"?s-=n:t===\"center\"&&(s-=n/2),s}function Pv(e,t,s){let{y:n,height:i}=e;return t===\"top\"?n+=s:t===\"bottom\"?n-=i+s:n-=i/2,n}function Zl(e,t,s,n){const{caretSize:i,caretPadding:o,cornerRadius:r}=e,{xAlign:a,yAlign:l}=s,c=i+o,{topLeft:u,topRight:h,bottomLeft:d,bottomRight:f}=Fs(r);let p=Cv(t,a);const g=Pv(t,l,c);return l===\"center\"?a===\"left\"?p+=c:a===\"right\"&&(p-=c):a===\"left\"?p-=Math.max(u,d)+i:a===\"right\"&&(p+=Math.max(h,f)+i),{x:Bt(p,0,n.width-t.width),y:Bt(g,0,n.height-t.height)}}function yi(e,t,s){const n=Yt(s.padding);return t===\"center\"?e.x+e.width/2:t===\"right\"?e.x+e.width-n.right:e.x+n.left}function tc(e){return Oe([],He(e))}function Av(e,t,s){return xs(e,{tooltip:t,tooltipItems:s,type:\"tooltip\"})}function ec(e,t){const s=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return s?e.override(s):e}const Vh={beforeTitle:$e,title(e){if(e.length>0){const t=e[0],s=t.chart.data.labels,n=s?s.length:0;if(this&&this.options&&this.options.mode===\"dataset\")return t.dataset.label||\"\";if(t.label)return t.label;if(n>0&&t.dataIndex<n)return s[t.dataIndex]}return\"\"},afterTitle:$e,beforeBody:$e,beforeLabel:$e,label(e){if(this&&this.options&&this.options.mode===\"dataset\")return e.label+\": \"+e.formattedValue||e.formattedValue;let t=e.dataset.label||\"\";t&&(t+=\": \");const s=e.formattedValue;return it(s)||(t+=s),t},labelColor(e){const s=e.chart.getDatasetMeta(e.datasetIndex).controller.getStyle(e.dataIndex);return{borderColor:s.borderColor,backgroundColor:s.backgroundColor,borderWidth:s.borderWidth,borderDash:s.borderDash,borderDashOffset:s.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(e){const s=e.chart.getDatasetMeta(e.datasetIndex).controller.getStyle(e.dataIndex);return{pointStyle:s.pointStyle,rotation:s.rotation}},afterLabel:$e,afterBody:$e,beforeFooter:$e,footer:$e,afterFooter:$e};function ae(e,t,s,n){const i=e[t].call(s,n);return typeof i>\"u\"?Vh[t].call(s,n):i}class sc extends is{static positioners=kn;constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const s=this.chart,n=this.options.setContext(this.getContext()),i=n.enabled&&s.options.animation&&n.animations,o=new _h(this.chart,i);return i._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=Av(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,s){const{callbacks:n}=s,i=ae(n,\"beforeTitle\",this,t),o=ae(n,\"title\",this,t),r=ae(n,\"afterTitle\",this,t);let a=[];return a=Oe(a,He(i)),a=Oe(a,He(o)),a=Oe(a,He(r)),a}getBeforeBody(t,s){return tc(ae(s.callbacks,\"beforeBody\",this,t))}getBody(t,s){const{callbacks:n}=s,i=[];return bt(t,o=>{const r={before:[],lines:[],after:[]},a=ec(n,o);Oe(r.before,He(ae(a,\"beforeLabel\",this,o))),Oe(r.lines,ae(a,\"label\",this,o)),Oe(r.after,He(ae(a,\"afterLabel\",this,o))),i.push(r)}),i}getAfterBody(t,s){return tc(ae(s.callbacks,\"afterBody\",this,t))}getFooter(t,s){const{callbacks:n}=s,i=ae(n,\"beforeFooter\",this,t),o=ae(n,\"footer\",this,t),r=ae(n,\"afterFooter\",this,t);let a=[];return a=Oe(a,He(i)),a=Oe(a,He(o)),a=Oe(a,He(r)),a}_createItems(t){const s=this._active,n=this.chart.data,i=[],o=[],r=[];let a=[],l,c;for(l=0,c=s.length;l<c;++l)a.push(wv(this.chart,s[l]));return t.filter&&(a=a.filter((u,h,d)=>t.filter(u,h,d,n))),t.itemSort&&(a=a.sort((u,h)=>t.itemSort(u,h,n))),bt(a,u=>{const h=ec(t.callbacks,u);i.push(ae(h,\"labelColor\",this,u)),o.push(ae(h,\"labelPointStyle\",this,u)),r.push(ae(h,\"labelTextColor\",this,u))}),this.labelColors=i,this.labelPointStyles=o,this.labelTextColors=r,this.dataPoints=a,a}update(t,s){const n=this.options.setContext(this.getContext()),i=this._active;let o,r=[];if(!i.length)this.opacity!==0&&(o={opacity:0});else{const a=kn[n.position].call(this,i,this._eventPosition);r=this._createItems(n),this.title=this.getTitle(r,n),this.beforeBody=this.getBeforeBody(r,n),this.body=this.getBody(r,n),this.afterBody=this.getAfterBody(r,n),this.footer=this.getFooter(r,n);const l=this._size=Jl(this,n),c=Object.assign({},a,l),u=Ql(this.chart,n,c),h=Zl(n,c,u,this.chart);this.xAlign=u.xAlign,this.yAlign=u.yAlign,o={opacity:1,x:h.x,y:h.y,width:l.width,height:l.height,caretX:a.x,caretY:a.y}}this._tooltipItems=r,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:s})}drawCaret(t,s,n,i){const o=this.getCaretPosition(t,n,i);s.lineTo(o.x1,o.y1),s.lineTo(o.x2,o.y2),s.lineTo(o.x3,o.y3)}getCaretPosition(t,s,n){const{xAlign:i,yAlign:o}=this,{caretSize:r,cornerRadius:a}=n,{topLeft:l,topRight:c,bottomLeft:u,bottomRight:h}=Fs(a),{x:d,y:f}=t,{width:p,height:g}=s;let _,b,v,M,S,w;return o===\"center\"?(S=f+g/2,i===\"left\"?(_=d,b=_-r,M=S+r,w=S-r):(_=d+p,b=_+r,M=S-r,w=S+r),v=_):(i===\"left\"?b=d+Math.max(l,u)+r:i===\"right\"?b=d+p-Math.max(c,h)-r:b=this.caretX,o===\"top\"?(M=f,S=M-r,_=b-r,v=b+r):(M=f+g,S=M+r,_=b+r,v=b-r),w=M),{x1:_,x2:b,x3:v,y1:M,y2:S,y3:w}}drawTitle(t,s,n){const i=this.title,o=i.length;let r,a,l;if(o){const c=Qs(n.rtl,this.x,this.width);for(t.x=yi(this,n.titleAlign,n),s.textAlign=c.textAlign(n.titleAlign),s.textBaseline=\"middle\",r=Nt(n.titleFont),a=n.titleSpacing,s.fillStyle=n.titleColor,s.font=r.string,l=0;l<o;++l)s.fillText(i[l],c.x(t.x),t.y+r.lineHeight/2),t.y+=r.lineHeight+a,l+1===o&&(t.y+=n.titleMarginBottom-a)}}_drawColorBox(t,s,n,i,o){const r=this.labelColors[n],a=this.labelPointStyles[n],{boxHeight:l,boxWidth:c}=o,u=Nt(o.bodyFont),h=yi(this,\"left\",o),d=i.x(h),f=l<u.lineHeight?(u.lineHeight-l)/2:0,p=s.y+f;if(o.usePointStyle){const g={radius:Math.min(c,l)/2,pointStyle:a.pointStyle,rotation:a.rotation,borderWidth:1},_=i.leftForLtr(d,c)+c/2,b=p+l/2;t.strokeStyle=o.multiKeyBackground,t.fillStyle=o.multiKeyBackground,rr(t,g,_,b),t.strokeStyle=r.borderColor,t.fillStyle=r.backgroundColor,rr(t,g,_,b)}else{t.lineWidth=ot(r.borderWidth)?Math.max(...Object.values(r.borderWidth)):r.borderWidth||1,t.strokeStyle=r.borderColor,t.setLineDash(r.borderDash||[]),t.lineDashOffset=r.borderDashOffset||0;const g=i.leftForLtr(d,c),_=i.leftForLtr(i.xPlus(d,1),c-2),b=Fs(r.borderRadius);Object.values(b).some(v=>v!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,Kn(t,{x:g,y:p,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=r.backgroundColor,t.beginPath(),Kn(t,{x:_,y:p+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(g,p,c,l),t.strokeRect(g,p,c,l),t.fillStyle=r.backgroundColor,t.fillRect(_,p+1,c-2,l-2))}t.fillStyle=this.labelTextColors[n]}drawBody(t,s,n){const{body:i}=this,{bodySpacing:o,bodyAlign:r,displayColors:a,boxHeight:l,boxWidth:c,boxPadding:u}=n,h=Nt(n.bodyFont);let d=h.lineHeight,f=0;const p=Qs(n.rtl,this.x,this.width),g=function(P){s.fillText(P,p.x(t.x+f),t.y+d/2),t.y+=d+o},_=p.textAlign(r);let b,v,M,S,w,R,k;for(s.textAlign=r,s.textBaseline=\"middle\",s.font=h.string,t.x=yi(this,_,n),s.fillStyle=n.bodyColor,bt(this.beforeBody,g),f=a&&_!==\"right\"?r===\"center\"?c/2+u:c+2+u:0,S=0,R=i.length;S<R;++S){for(b=i[S],v=this.labelTextColors[S],s.fillStyle=v,bt(b.before,g),M=b.lines,a&&M.length&&(this._drawColorBox(s,t,S,p,n),d=Math.max(h.lineHeight,l)),w=0,k=M.length;w<k;++w)g(M[w]),d=h.lineHeight;bt(b.after,g)}f=0,d=h.lineHeight,bt(this.afterBody,g),t.y-=o}drawFooter(t,s,n){const i=this.footer,o=i.length;let r,a;if(o){const l=Qs(n.rtl,this.x,this.width);for(t.x=yi(this,n.footerAlign,n),t.y+=n.footerMarginTop,s.textAlign=l.textAlign(n.footerAlign),s.textBaseline=\"middle\",r=Nt(n.footerFont),s.fillStyle=n.footerColor,s.font=r.string,a=0;a<o;++a)s.fillText(i[a],l.x(t.x),t.y+r.lineHeight/2),t.y+=r.lineHeight+n.footerSpacing}}drawBackground(t,s,n,i){const{xAlign:o,yAlign:r}=this,{x:a,y:l}=t,{width:c,height:u}=n,{topLeft:h,topRight:d,bottomLeft:f,bottomRight:p}=Fs(i.cornerRadius);s.fillStyle=i.backgroundColor,s.strokeStyle=i.borderColor,s.lineWidth=i.borderWidth,s.beginPath(),s.moveTo(a+h,l),r===\"top\"&&this.drawCaret(t,s,n,i),s.lineTo(a+c-d,l),s.quadraticCurveTo(a+c,l,a+c,l+d),r===\"center\"&&o===\"right\"&&this.drawCaret(t,s,n,i),s.lineTo(a+c,l+u-p),s.quadraticCurveTo(a+c,l+u,a+c-p,l+u),r===\"bottom\"&&this.drawCaret(t,s,n,i),s.lineTo(a+f,l+u),s.quadraticCurveTo(a,l+u,a,l+u-f),r===\"center\"&&o===\"left\"&&this.drawCaret(t,s,n,i),s.lineTo(a,l+h),s.quadraticCurveTo(a,l,a+h,l),s.closePath(),s.fill(),i.borderWidth>0&&s.stroke()}_updateAnimationTarget(t){const s=this.chart,n=this.$animations,i=n&&n.x,o=n&&n.y;if(i||o){const r=kn[t.position].call(this,this._active,this._eventPosition);if(!r)return;const a=this._size=Jl(this,t),l=Object.assign({},r,this._size),c=Ql(s,t,l),u=Zl(t,l,c,s);(i._to!==u.x||o._to!==u.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=a.width,this.height=a.height,this.caretX=r.x,this.caretY=r.y,this._resolveAnimations().update(this,u))}}_willRender(){return!!this.opacity}draw(t){const s=this.options.setContext(this.getContext());let n=this.opacity;if(!n)return;this._updateAnimationTarget(s);const i={width:this.width,height:this.height},o={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;const r=Yt(s.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;s.enabled&&a&&(t.save(),t.globalAlpha=n,this.drawBackground(o,t,i,s),dh(t,s.textDirection),o.y+=r.top,this.drawTitle(o,t,s),this.drawBody(o,t,s),this.drawFooter(o,t,s),fh(t,s.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,s){const n=this._active,i=t.map(({datasetIndex:a,index:l})=>{const c=this.chart.getDatasetMeta(a);if(!c)throw new Error(\"Cannot find a dataset at index \"+a);return{datasetIndex:a,element:c.data[l],index:l}}),o=!Ni(n,i),r=this._positionChanged(i,s);(o||r)&&(this._active=i,this._eventPosition=s,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,s,n=!0){if(s&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,o=this._active||[],r=this._getActiveElements(t,o,s,n),a=this._positionChanged(r,t),l=s||!Ni(r,o)||a;return l&&(this._active=r,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,s))),l}_getActiveElements(t,s,n,i){const o=this.options;if(t.type===\"mouseout\")return[];if(!i)return s.filter(a=>this.chart.data.datasets[a.datasetIndex]&&this.chart.getDatasetMeta(a.datasetIndex).controller.getParsed(a.index)!==void 0);const r=this.chart.getElementsAtEventForMode(t,o.mode,o,n);return o.reverse&&r.reverse(),r}_positionChanged(t,s){const{caretX:n,caretY:i,options:o}=this,r=kn[o.position].call(this,t,s);return r!==!1&&(n!==r.x||i!==r.y)}}var Rv={id:\"tooltip\",_element:sc,positioners:kn,afterInit(e,t,s){s&&(e.tooltip=new sc({chart:e,options:s}))},beforeUpdate(e,t,s){e.tooltip&&e.tooltip.initialize(s)},reset(e,t,s){e.tooltip&&e.tooltip.initialize(s)},afterDraw(e){const t=e.tooltip;if(t&&t._willRender()){const s={tooltip:t};if(e.notifyPlugins(\"beforeTooltipDraw\",{...s,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(\"afterTooltipDraw\",s)}},afterEvent(e,t){if(e.tooltip){const s=t.replay;e.tooltip.handleEvent(t.event,s,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:\"average\",backgroundColor:\"rgba(0,0,0,0.8)\",titleColor:\"#fff\",titleFont:{weight:\"bold\"},titleSpacing:2,titleMarginBottom:6,titleAlign:\"left\",bodyColor:\"#fff\",bodySpacing:2,bodyFont:{},bodyAlign:\"left\",footerColor:\"#fff\",footerSpacing:2,footerMarginTop:6,footerFont:{weight:\"bold\"},footerAlign:\"left\",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:\"#fff\",displayColors:!0,boxPadding:0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,animation:{duration:400,easing:\"easeOutQuart\"},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"width\",\"height\",\"caretX\",\"caretY\"]},opacity:{easing:\"linear\",duration:200}},callbacks:Vh},defaultRoutes:{bodyFont:\"font\",footerFont:\"font\",titleFont:\"font\"},descriptors:{_scriptable:e=>e!==\"filter\"&&e!==\"itemSort\"&&e!==\"external\",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:\"animation\"}},additionalOptionScopes:[\"interaction\"]},Ov=Object.freeze({__proto__:null,Colors:Hx,Decimation:Ux,Filler:dv,Legend:_v,SubTitle:vv,Title:xv,Tooltip:Rv});const Tv=(e,t,s,n)=>(typeof t==\"string\"?(s=e.push(t)-1,n.unshift({index:s,label:t})):isNaN(t)&&(s=null),s);function Ev(e,t,s,n){const i=e.indexOf(t);if(i===-1)return Tv(e,t,s,n);const o=e.lastIndexOf(t);return i!==o?s:i}const Dv=(e,t)=>e===null?null:Bt(Math.round(e),0,t);function nc(e){const t=this.getLabels();return e>=0&&e<t.length?t[e]:e}class Iv extends js{static id=\"category\";static defaults={ticks:{callback:nc}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const s=this._addedLabels;if(s.length){const n=this.getLabels();for(const{index:i,label:o}of s)n[i]===o&&n.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,s){if(it(t))return null;const n=this.getLabels();return s=isFinite(s)&&n[s]===t?s:Ev(n,t,Z(s,t),this._addedLabels),Dv(s,n.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:s}=this.getUserBounds();let{min:n,max:i}=this.getMinMax(!0);this.options.bounds===\"ticks\"&&(t||(n=0),s||(i=this.getLabels().length-1)),this.min=n,this.max=i}buildTicks(){const t=this.min,s=this.max,n=this.options.offset,i=[];let o=this.getLabels();o=t===0&&s===o.length-1?o:o.slice(t,s+1),this._valueRange=Math.max(o.length-(n?0:1),1),this._startValue=this.min-(n?.5:0);for(let r=t;r<=s;r++)i.push({value:r});return i}getLabelForValue(t){return nc.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return typeof t!=\"number\"&&(t=this.parse(t)),t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const s=this.ticks;return t<0||t>s.length-1?null:this.getPixelForValue(s[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function Lv(e,t){const s=[],{bounds:i,step:o,min:r,max:a,precision:l,count:c,maxTicks:u,maxDigits:h,includeBounds:d}=e,f=o||1,p=u-1,{min:g,max:_}=t,b=!it(r),v=!it(a),M=!it(c),S=(_-g)/(h+1);let w=Ja((_-g)/p/f)*f,R,k,P,C;if(w<1e-14&&!b&&!v)return[{value:g},{value:_}];C=Math.ceil(_/w)-Math.floor(g/w),C>p&&(w=Ja(C*w/p/f)*f),it(l)||(R=Math.pow(10,l),w=Math.ceil(w*R)/R),i===\"ticks\"?(k=Math.floor(g/w)*w,P=Math.ceil(_/w)*w):(k=g,P=_),b&&v&&o&&b_((a-r)/o,w/1e3)?(C=Math.round(Math.min((a-r)/w,u)),w=(a-r)/C,k=r,P=a):M?(k=b?r:k,P=v?a:P,C=c-1,w=(P-k)/C):(C=(P-k)/w,Dn(C,Math.round(C),w/1e3)?C=Math.round(C):C=Math.ceil(C));const O=Math.max(Qa(w),Qa(k));R=Math.pow(10,it(l)?O:l),k=Math.round(k*R)/R,P=Math.round(P*R)/R;let B=0;for(b&&(d&&k!==r?(s.push({value:r}),k<r&&B++,Dn(Math.round((k+B*w)*R)/R,r,ic(r,S,e))&&B++):k<r&&B++);B<C;++B){const U=Math.round((k+B*w)*R)/R;if(v&&U>a)break;s.push({value:U})}return v&&d&&P!==a?s.length&&Dn(s[s.length-1].value,a,ic(a,S,e))?s[s.length-1].value=a:s.push({value:a}):(!v||P===a)&&s.push({value:P}),s}function ic(e,t,{horizontal:s,minRotation:n}){const i=ve(n),o=(s?Math.sin(i):Math.cos(i))||.001,r=.75*t*(\"\"+e).length;return Math.min(t/o,r)}class Wi extends js{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,s){return it(t)||(typeof t==\"number\"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:s,maxDefined:n}=this.getUserBounds();let{min:i,max:o}=this;const r=l=>i=s?i:l,a=l=>o=n?o:l;if(t){const l=Fe(i),c=Fe(o);l<0&&c<0?a(0):l>0&&c>0&&r(0)}if(i===o){let l=o===0?1:Math.abs(o*.05);a(o+l),t||r(i-l)}this.min=i,this.max=o}getTickLimit(){const t=this.options.ticks;let{maxTicksLimit:s,stepSize:n}=t,i;return n?(i=Math.ceil(this.max/n)-Math.floor(this.min/n)+1,i>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${n} would result generating up to ${i} ticks. Limiting to 1000.`),i=1e3)):(i=this.computeTickLimit(),s=s||11),s&&(i=Math.min(s,i)),i}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,s=t.ticks;let n=this.getTickLimit();n=Math.max(2,n);const i={maxTicks:n,bounds:t.bounds,min:t.min,max:t.max,precision:s.precision,step:s.stepSize,count:s.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:s.minRotation||0,includeBounds:s.includeBounds!==!1},o=this._range||this,r=Lv(i,o);return t.bounds===\"ticks\"&&Yu(r,this,\"value\"),t.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){const t=this.ticks;let s=this.min,n=this.max;if(super.configure(),this.options.offset&&t.length){const i=(n-s)/Math.max(t.length-1,1)/2;s-=i,n+=i}this._startValue=s,this._endValue=n,this._valueRange=n-s}getLabelForValue(t){return ei(t,this.chart.options.locale,this.options.ticks.format)}}class Fv extends Wi{static id=\"linear\";static defaults={ticks:{callback:oo.formatters.numeric}};determineDataLimits(){const{min:t,max:s}=this.getMinMax(!0);this.min=Tt(t)?t:0,this.max=Tt(s)?s:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),s=t?this.width:this.height,n=ve(this.options.ticks.minRotation),i=(t?Math.sin(n):Math.cos(n))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(s/Math.min(40,o.lineHeight/i))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const Yn=e=>Math.floor(hs(e)),Ps=(e,t)=>Math.pow(10,Yn(e)+t);function oc(e){return e/Math.pow(10,Yn(e))===1}function rc(e,t,s){const n=Math.pow(10,s),i=Math.floor(e/n);return Math.ceil(t/n)-i}function Nv(e,t){const s=t-e;let n=Yn(s);for(;rc(e,t,n)>10;)n++;for(;rc(e,t,n)<10;)n--;return Math.min(n,Yn(e))}function Bv(e,{min:t,max:s}){t=de(e.min,t);const n=[],i=Yn(t);let o=Nv(t,s),r=o<0?Math.pow(10,Math.abs(o)):1;const a=Math.pow(10,o),l=i>o?Math.pow(10,i):0,c=Math.round((t-l)*r)/r,u=Math.floor((t-l)/a/10)*a*10;let h=Math.floor((c-u)/Math.pow(10,o)),d=de(e.min,Math.round((l+u+h*Math.pow(10,o))*r)/r);for(;d<s;)n.push({value:d,major:oc(d),significand:h}),h>=10?h=h<15?15:20:h++,h>=20&&(o++,h=2,r=o>=0?1:r),d=Math.round((l+u+h*Math.pow(10,o))*r)/r;const f=de(e.max,d);return n.push({value:f,major:oc(f),significand:h}),n}class $v extends js{static id=\"logarithmic\";static defaults={ticks:{callback:oo.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,s){const n=Wi.prototype.parse.apply(this,[t,s]);if(n===0){this._zero=!0;return}return Tt(n)&&n>0?n:null}determineDataLimits(){const{min:t,max:s}=this.getMinMax(!0);this.min=Tt(t)?Math.max(0,t):null,this.max=Tt(s)?Math.max(0,s):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Tt(this._userMin)&&(this.min=t===Ps(this.min,0)?Ps(this.min,-1):Ps(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:s}=this.getUserBounds();let n=this.min,i=this.max;const o=a=>n=t?n:a,r=a=>i=s?i:a;n===i&&(n<=0?(o(1),r(10)):(o(Ps(n,-1)),r(Ps(i,1)))),n<=0&&o(Ps(i,-1)),i<=0&&r(Ps(n,1)),this.min=n,this.max=i}buildTicks(){const t=this.options,s={min:this._userMin,max:this._userMax},n=Bv(s,this);return t.bounds===\"ticks\"&&Yu(n,this,\"value\"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}getLabelForValue(t){return t===void 0?\"0\":ei(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=hs(t),this._valueRange=hs(this.max)-hs(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(hs(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const s=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+s*this._valueRange)}}function dr(e){const t=e.ticks;if(t.display&&e.display){const s=Yt(t.backdropPadding);return Z(t.font&&t.font.size,Rt.font.size)+s.height}return 0}function Vv(e,t,s){return s=At(s)?s:[s],{w:I_(e,t.string,s),h:s.length*t.lineHeight}}function ac(e,t,s,n,i){return e===n||e===i?{start:t-s/2,end:t+s/2}:e<n||e>i?{start:t-s,end:t}:{start:t,end:t+s}}function jv(e){const t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},s=Object.assign({},t),n=[],i=[],o=e._pointLabels.length,r=e.options.pointLabels,a=r.centerPointLabels?ht/o:0;for(let l=0;l<o;l++){const c=r.setContext(e.getPointLabelContext(l));i[l]=c.padding;const u=e.getPointPosition(l,e.drawingArea+i[l],a),h=Nt(c.font),d=Vv(e.ctx,h,e._pointLabels[l]);n[l]=d;const f=Ht(e.getIndexAngle(l)+a),p=Math.round(Hr(f)),g=ac(p,u.x,d.w,0,180),_=ac(p,u.y,d.h,90,270);Hv(s,t,f,g,_)}e.setCenterPoint(t.l-s.l,s.r-t.r,t.t-s.t,s.b-t.b),e._pointLabelItems=qv(e,n,i)}function Hv(e,t,s,n,i){const o=Math.abs(Math.sin(s)),r=Math.abs(Math.cos(s));let a=0,l=0;n.start<t.l?(a=(t.l-n.start)/o,e.l=Math.min(e.l,t.l-a)):n.end>t.r&&(a=(n.end-t.r)/o,e.r=Math.max(e.r,t.r+a)),i.start<t.t?(l=(t.t-i.start)/r,e.t=Math.min(e.t,t.t-l)):i.end>t.b&&(l=(i.end-t.b)/r,e.b=Math.max(e.b,t.b+l))}function zv(e,t,s){const n=e.drawingArea,{extra:i,additionalAngle:o,padding:r,size:a}=s,l=e.getPointPosition(t,n+i+r,o),c=Math.round(Hr(Ht(l.angle+Dt))),u=Gv(l.y,a.h,c),h=Uv(c),d=Kv(l.x,a.w,h);return{visible:!0,x:l.x,y:u,textAlign:h,left:d,top:u,right:d+a.w,bottom:u+a.h}}function Wv(e,t){if(!t)return!0;const{left:s,top:n,right:i,bottom:o}=e;return!(Xe({x:s,y:n},t)||Xe({x:s,y:o},t)||Xe({x:i,y:n},t)||Xe({x:i,y:o},t))}function qv(e,t,s){const n=[],i=e._pointLabels.length,o=e.options,{centerPointLabels:r,display:a}=o.pointLabels,l={extra:dr(o)/2,additionalAngle:r?ht/i:0};let c;for(let u=0;u<i;u++){l.padding=s[u],l.size=t[u];const h=zv(e,u,l);n.push(h),a===\"auto\"&&(h.visible=Wv(h,c),h.visible&&(c=h))}return n}function Uv(e){return e===0||e===180?\"center\":e<180?\"left\":\"right\"}function Kv(e,t,s){return s===\"right\"?e-=t:s===\"center\"&&(e-=t/2),e}function Gv(e,t,s){return s===90||s===270?e-=t/2:(s>270||s<90)&&(e-=t),e}function Yv(e,t,s){const{left:n,top:i,right:o,bottom:r}=s,{backdropColor:a}=t;if(!it(a)){const l=Fs(t.borderRadius),c=Yt(t.backdropPadding);e.fillStyle=a;const u=n-c.left,h=i-c.top,d=o-n+c.width,f=r-i+c.height;Object.values(l).some(p=>p!==0)?(e.beginPath(),Kn(e,{x:u,y:h,w:d,h:f,radius:l}),e.fill()):e.fillRect(u,h,d,f)}}function Xv(e,t){const{ctx:s,options:{pointLabels:n}}=e;for(let i=t-1;i>=0;i--){const o=e._pointLabelItems[i];if(!o.visible)continue;const r=n.setContext(e.getPointLabelContext(i));Yv(s,r,o);const a=Nt(r.font),{x:l,y:c,textAlign:u}=o;Vs(s,e._pointLabels[i],l,c+a.lineHeight/2,a,{color:r.color,textAlign:u,textBaseline:\"middle\"})}}function jh(e,t,s,n){const{ctx:i}=e;if(s)i.arc(e.xCenter,e.yCenter,t,0,Mt);else{let o=e.getPointPosition(0,t);i.moveTo(o.x,o.y);for(let r=1;r<n;r++)o=e.getPointPosition(r,t),i.lineTo(o.x,o.y)}}function Jv(e,t,s,n,i){const o=e.ctx,r=t.circular,{color:a,lineWidth:l}=t;!r&&!n||!a||!l||s<0||(o.save(),o.strokeStyle=a,o.lineWidth=l,o.setLineDash(i.dash||[]),o.lineDashOffset=i.dashOffset,o.beginPath(),jh(e,s,r,n),o.closePath(),o.stroke(),o.restore())}function Qv(e,t,s){return xs(e,{label:s,index:t,type:\"pointLabel\"})}class Zv extends Wi{static id=\"radialLinear\";static defaults={display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:oo.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}};static defaultRoutes={\"angleLines.color\":\"borderColor\",\"pointLabels.color\":\"color\",\"ticks.color\":\"color\"};static descriptors={angleLines:{_fallback:\"grid\"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Yt(dr(this.options)/2),s=this.width=this.maxWidth-t.width,n=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+s/2+t.left),this.yCenter=Math.floor(this.top+n/2+t.top),this.drawingArea=Math.floor(Math.min(s,n)/2)}determineDataLimits(){const{min:t,max:s}=this.getMinMax(!1);this.min=Tt(t)&&!isNaN(t)?t:0,this.max=Tt(s)&&!isNaN(s)?s:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/dr(this.options))}generateTickLabels(t){Wi.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map((s,n)=>{const i=St(this.options.pointLabels.callback,[s,n],this);return i||i===0?i:\"\"}).filter((s,n)=>this.chart.getDataVisibility(n))}fit(){const t=this.options;t.display&&t.pointLabels.display?jv(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,s,n,i){this.xCenter+=Math.floor((t-s)/2),this.yCenter+=Math.floor((n-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,s,n,i))}getIndexAngle(t){const s=Mt/(this._pointLabels.length||1),n=this.options.startAngle||0;return Ht(t*s+ve(n))}getDistanceFromCenterForValue(t){if(it(t))return NaN;const s=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*s:(t-this.min)*s}getValueForDistanceFromCenter(t){if(it(t))return NaN;const s=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-s:this.min+s}getPointLabelContext(t){const s=this._pointLabels||[];if(t>=0&&t<s.length){const n=s[t];return Qv(this.getContext(),t,n)}}getPointPosition(t,s,n=0){const i=this.getIndexAngle(t)-Dt+n;return{x:Math.cos(i)*s+this.xCenter,y:Math.sin(i)*s+this.yCenter,angle:i}}getPointPositionForValue(t,s){return this.getPointPosition(t,this.getDistanceFromCenterForValue(s))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:s,top:n,right:i,bottom:o}=this._pointLabelItems[t];return{left:s,top:n,right:i,bottom:o}}drawBackground(){const{backgroundColor:t,grid:{circular:s}}=this.options;if(t){const n=this.ctx;n.save(),n.beginPath(),jh(this,this.getDistanceFromCenterForValue(this._endValue),s,this._pointLabels.length),n.closePath(),n.fillStyle=t,n.fill(),n.restore()}}drawGrid(){const t=this.ctx,s=this.options,{angleLines:n,grid:i,border:o}=s,r=this._pointLabels.length;let a,l,c;if(s.pointLabels.display&&Xv(this,r),i.display&&this.ticks.forEach((u,h)=>{if(h!==0||h===0&&this.min<0){l=this.getDistanceFromCenterForValue(u.value);const d=this.getContext(h),f=i.setContext(d),p=o.setContext(d);Jv(this,f,l,r,p)}}),n.display){for(t.save(),a=r-1;a>=0;a--){const u=n.setContext(this.getPointLabelContext(a)),{color:h,lineWidth:d}=u;!d||!h||(t.lineWidth=d,t.strokeStyle=h,t.setLineDash(u.borderDash),t.lineDashOffset=u.borderDashOffset,l=this.getDistanceFromCenterForValue(s.reverse?this.min:this.max),c=this.getPointPosition(a,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(c.x,c.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,s=this.options,n=s.ticks;if(!n.display)return;const i=this.getIndexAngle(0);let o,r;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign=\"center\",t.textBaseline=\"middle\",this.ticks.forEach((a,l)=>{if(l===0&&this.min>=0&&!s.reverse)return;const c=n.setContext(this.getContext(l)),u=Nt(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=u.string,r=t.measureText(a.label).width,t.fillStyle=c.backdropColor;const h=Yt(c.backdropPadding);t.fillRect(-r/2-h.left,-o-u.size/2-h.top,r+h.width,u.size+h.height)}Vs(t,a.label,0,-o,u,{color:c.color,strokeColor:c.textStrokeColor,strokeWidth:c.textStrokeWidth})}),t.restore()}drawTitle(){}}const fo={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ce=Object.keys(fo);function lc(e,t){return e-t}function cc(e,t){if(it(t))return null;const s=e._adapter,{parser:n,round:i,isoWeekday:o}=e._parseOpts;let r=t;return typeof n==\"function\"&&(r=n(r)),Tt(r)||(r=typeof n==\"string\"?s.parse(r,n):s.parse(r)),r===null?null:(i&&(r=i===\"week\"&&(nn(o)||o===!0)?s.startOf(r,\"isoWeek\",o):s.startOf(r,i)),+r)}function uc(e,t,s,n){const i=ce.length;for(let o=ce.indexOf(e);o<i-1;++o){const r=fo[ce[o]],a=r.steps?r.steps:Number.MAX_SAFE_INTEGER;if(r.common&&Math.ceil((s-t)/(a*r.size))<=n)return ce[o]}return ce[i-1]}function t1(e,t,s,n,i){for(let o=ce.length-1;o>=ce.indexOf(s);o--){const r=ce[o];if(fo[r].common&&e._adapter.diff(i,n,r)>=t-1)return r}return ce[s?ce.indexOf(s):0]}function e1(e){for(let t=ce.indexOf(e)+1,s=ce.length;t<s;++t)if(fo[ce[t]].common)return ce[t]}function hc(e,t,s){if(!s)e[t]=!0;else if(s.length){const{lo:n,hi:i}=zr(s,t),o=s[n]>=t?s[n]:s[i];e[o]=!0}}function s1(e,t,s,n){const i=e._adapter,o=+i.startOf(t[0].value,n),r=t[t.length-1].value;let a,l;for(a=o;a<=r;a=+i.add(a,1,n))l=s[a],l>=0&&(t[l].major=!0);return t}function dc(e,t,s){const n=[],i={},o=t.length;let r,a;for(r=0;r<o;++r)a=t[r],i[a]=r,n.push({value:a,major:!1});return o===0||!s?n:s1(e,n,i,s)}class fr extends js{static id=\"time\";static defaults={bounds:\"data\",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{}},ticks:{source:\"auto\",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit=\"day\",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,s={}){const n=t.time||(t.time={}),i=this._adapter=new ny._date(t.adapters.date);i.init(s),En(n.displayFormats,i.formats()),this._parseOpts={parser:n.parser,round:n.round,isoWeekday:n.isoWeekday},super.init(t),this._normalized=s.normalized}parse(t,s){return t===void 0?null:cc(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,s=this._adapter,n=t.time.unit||\"day\";let{min:i,max:o,minDefined:r,maxDefined:a}=this.getUserBounds();function l(c){!r&&!isNaN(c.min)&&(i=Math.min(i,c.min)),!a&&!isNaN(c.max)&&(o=Math.max(o,c.max))}(!r||!a)&&(l(this._getLabelBounds()),(t.bounds!==\"ticks\"||t.ticks.source!==\"labels\")&&l(this.getMinMax(!1))),i=Tt(i)&&!isNaN(i)?i:+s.startOf(Date.now(),n),o=Tt(o)&&!isNaN(o)?o:+s.endOf(Date.now(),n)+1,this.min=Math.min(i,o-1),this.max=Math.max(i+1,o)}_getLabelBounds(){const t=this.getLabelTimestamps();let s=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;return t.length&&(s=t[0],n=t[t.length-1]),{min:s,max:n}}buildTicks(){const t=this.options,s=t.time,n=t.ticks,i=n.source===\"labels\"?this.getLabelTimestamps():this._generate();t.bounds===\"ticks\"&&i.length&&(this.min=this._userMin||i[0],this.max=this._userMax||i[i.length-1]);const o=this.min,r=this.max,a=v_(i,o,r);return this._unit=s.unit||(n.autoSkip?uc(s.minUnit,this.min,this.max,this._getLabelCapacity(o)):t1(this,a.length,s.minUnit,this.min,this.max)),this._majorUnit=!n.major.enabled||this._unit===\"year\"?void 0:e1(this._unit),this.initOffsets(i),t.reverse&&a.reverse(),dc(this,a,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map(t=>+t.value))}initOffsets(t=[]){let s=0,n=0,i,o;this.options.offset&&t.length&&(i=this.getDecimalForValue(t[0]),t.length===1?s=1-i:s=(this.getDecimalForValue(t[1])-i)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?n=o:n=(o-this.getDecimalForValue(t[t.length-2]))/2);const r=t.length<3?.5:.25;s=Bt(s,0,r),n=Bt(n,0,r),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,s=this.min,n=this.max,i=this.options,o=i.time,r=o.unit||uc(o.minUnit,s,n,this._getLabelCapacity(s)),a=Z(i.ticks.stepSize,1),l=r===\"week\"?o.isoWeekday:!1,c=nn(l)||l===!0,u={};let h=s,d,f;if(c&&(h=+t.startOf(h,\"isoWeek\",l)),h=+t.startOf(h,c?\"day\":r),t.diff(n,s,r)>1e5*a)throw new Error(s+\" and \"+n+\" are too far apart with stepSize of \"+a+\" \"+r);const p=i.ticks.source===\"data\"&&this.getDataTimestamps();for(d=h,f=0;d<n;d=+t.add(d,a,r),f++)hc(u,d,p);return(d===n||i.bounds===\"ticks\"||f===1)&&hc(u,d,p),Object.keys(u).sort(lc).map(g=>+g)}getLabelForValue(t){const s=this._adapter,n=this.options.time;return n.tooltipFormat?s.format(t,n.tooltipFormat):s.format(t,n.displayFormats.datetime)}format(t,s){const i=this.options.time.displayFormats,o=this._unit,r=s||i[o];return this._adapter.format(t,r)}_tickFormatFunction(t,s,n,i){const o=this.options,r=o.ticks.callback;if(r)return St(r,[t,s,n],this);const a=o.time.displayFormats,l=this._unit,c=this._majorUnit,u=l&&a[l],h=c&&a[c],d=n[s],f=c&&h&&d&&d.major;return this._adapter.format(t,i||(f?h:u))}generateTickLabels(t){let s,n,i;for(s=0,n=t.length;s<n;++s)i=t[s],i.label=this._tickFormatFunction(i.value,s,t)}getDecimalForValue(t){return t===null?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const s=this._offsets,n=this.getDecimalForValue(t);return this.getPixelForDecimal((s.start+n)*s.factor)}getValueForPixel(t){const s=this._offsets,n=this.getDecimalForPixel(t)/s.factor-s.end;return this.min+n*(this.max-this.min)}_getLabelSize(t){const s=this.options.ticks,n=this.ctx.measureText(t).width,i=ve(this.isHorizontal()?s.maxRotation:s.minRotation),o=Math.cos(i),r=Math.sin(i),a=this._resolveTickFontOptions(0).size;return{w:n*o+a*r,h:n*r+a*o}}_getLabelCapacity(t){const s=this.options.time,n=s.displayFormats,i=n[s.unit]||n.millisecond,o=this._tickFormatFunction(t,0,dc(this,[t],this._majorUnit),i),r=this._getLabelSize(o),a=Math.floor(this.isHorizontal()?this.width/r.w:this.height/r.h)-1;return a>0?a:1}getDataTimestamps(){let t=this._cache.data||[],s,n;if(t.length)return t;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(s=0,n=i.length;s<n;++s)t=t.concat(i[s].controller.getAllParsedValues(this));return this._cache.data=this.normalize(t)}getLabelTimestamps(){const t=this._cache.labels||[];let s,n;if(t.length)return t;const i=this.getLabels();for(s=0,n=i.length;s<n;++s)t.push(cc(this,i[s]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return Qu(t.sort(lc))}}function xi(e,t,s){let n=0,i=e.length-1,o,r,a,l;s?(t>=e[n].pos&&t<=e[i].pos&&({lo:n,hi:i}=Ye(e,\"pos\",t)),{pos:o,time:a}=e[n],{pos:r,time:l}=e[i]):(t>=e[n].time&&t<=e[i].time&&({lo:n,hi:i}=Ye(e,\"time\",t)),{time:o,pos:a}=e[n],{time:r,pos:l}=e[i]);const c=r-o;return c?a+(l-a)*(t-o)/c:a}class n1 extends fr{static id=\"timeseries\";static defaults=fr.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),s=this._table=this.buildLookupTable(t);this._minPos=xi(s,this.min),this._tableRange=xi(s,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:s,max:n}=this,i=[],o=[];let r,a,l,c,u;for(r=0,a=t.length;r<a;++r)c=t[r],c>=s&&c<=n&&i.push(c);if(i.length<2)return[{time:s,pos:0},{time:n,pos:1}];for(r=0,a=i.length;r<a;++r)u=i[r+1],l=i[r-1],c=i[r],Math.round((u+l)/2)!==c&&o.push({time:c,pos:r/(a-1)});return o}_generate(){const t=this.min,s=this.max;let n=super.getDataTimestamps();return(!n.includes(t)||!n.length)&&n.splice(0,0,t),(!n.includes(s)||n.length===1)&&n.push(s),n.sort((i,o)=>i-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const s=this.getDataTimestamps(),n=this.getLabelTimestamps();return s.length&&n.length?t=this.normalize(s.concat(n)):t=s.length?s:n,t=this._cache.all=t,t}getDecimalForValue(t){return(xi(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const s=this._offsets,n=this.getDecimalForPixel(t)/s.factor-s.end;return xi(this._table,n*this._tableRange+this._minPos,!0)}}var i1=Object.freeze({__proto__:null,CategoryScale:Iv,LinearScale:Fv,LogarithmicScale:$v,RadialLinearScale:Zv,TimeScale:fr,TimeSeriesScale:n1});const o1=[sy,Lx,Ov,i1],r1={class:\"app-container\"},a1={class:\"content\"},l1={class:\"dashboard-container pb-5\"},c1={class:\"dashboard-header\"},u1={class:\"header-actions\"},h1={class:\"overview-grid\"},d1={class:\"stat-card\"},f1={class:\"stat-value\"},p1={class:\"stat-card\"},g1={class:\"stat-value\"},m1={class:\"stat-description\"},b1={class:\"stat-card\"},_1={class:\"stat-change\"},y1={class:\"stat-card\"},x1={class:\"stat-value\"},v1={class:\"charts-section\"},w1={class:\"chart-card\"},S1={class:\"chart-placeholder\"},k1={class:\"chart-card\"},M1={class:\"chart-placeholder\"},C1={class:\"table-section\"},P1={class:\"table-card\"},A1={class:\"data-table\"},R1={class:\"table-section\"},O1={class:\"table-card\"},T1={class:\"data-table\"},E1={class:\"route-name\"},D1={key:0,class:\"table-section\"},I1={class:\"table-card\"},L1={class:\"data-table errors-table\"},F1={class:\"error-message\"},N1={__name:\"Dashboard\",setup(e){Ai.register(...o1);const t=et(!1),s=et({routes:[],...window.ApiInspector}),n=et(localStorage.getItem(\"api-docs-auth-token\")||\"\"),{menus:i}=Hu(),o=et(\"24h\"),r=Zs({totalRequests:0,requestsTrend:0,avgResponseTime:0,slowestRoute:\"\",errorRate:0,errorCount:0,avgMemory:0}),a=et({}),l=et([]),c=et([]);Zs({requestTimeline:null,responseDistribution:null});const u=et(null),h=et(null);let d=null,f=null;to(()=>{p()});const p=async()=>{try{const C=await(await fetch(`/api/api-inspector-docs/analytics?range=${o.value}`)).json();r.totalRequests=C.totalRequests,r.requestsTrend=C.requestsTrend,r.avgResponseTime=C.avgResponseTime,r.slowestRoute=C.slowestRoute,r.errorRate=C.errorRate,r.errorCount=C.errorCount,r.avgMemory=C.avgMemory,a.value=C.statusCodeStats,l.value=C.topRoutes,c.value=C.recentErrors,await Qi(),g(C)}catch(P){console.error(\"Failed to fetch dashboard data:\",P)}},g=P=>{_(P),b(P)},_=P=>{if(!u.value)return;const C=v();d&&d.destroy(),d=new Ai(u.value,{type:\"line\",data:{labels:C,datasets:[{label:\"Requests\",data:M(P,C.length),borderColor:\"#3b82f6\",backgroundColor:\"rgba(59, 130, 246, 0.1)\",borderWidth:2,tension:.4,fill:!0,pointRadius:4,pointBackgroundColor:\"#3b82f6\",pointBorderColor:\"#fff\",pointBorderWidth:2}]},options:{responsive:!0,maintainAspectRatio:!0,plugins:{legend:{display:!0,labels:{font:{size:12},usePointStyle:!0}}},scales:{y:{beginAtZero:!0,grid:{color:\"rgba(0, 0, 0, 0.05)\"},ticks:{font:{size:11}}},x:{grid:{display:!1},ticks:{font:{size:11}}}}}})},b=P=>{if(!h.value)return;const C=P.topRoutes.slice(0,8),O=C.map(U=>U.route.substring(0,20)),B=C.map(U=>U.avg_duration);f&&f.destroy(),f=new Ai(h.value,{type:\"bar\",data:{labels:O,datasets:[{label:\"Avg Response Time (ms)\",data:B,backgroundColor:B.map(U=>U>500?\"#ef4444\":U>200?\"#f97316\":\"#10b981\"),borderColor:\"rgba(0, 0, 0, 0.1)\",borderWidth:1}]},options:{indexAxis:\"y\",responsive:!0,maintainAspectRatio:!0,plugins:{legend:{display:!0,labels:{font:{size:12}}}},scales:{x:{beginAtZero:!0,grid:{color:\"rgba(0, 0, 0, 0.05)\"},ticks:{font:{size:11}}},y:{grid:{display:!1},ticks:{font:{size:11}}}}}})},v=()=>{const P=[],C=new Date;for(let O=11;O>=0;O--){const B=new Date(C.getTime()-O*36e5);P.push(B.getHours().toString().padStart(2,\"0\")+\":00\")}return P},M=(P,C)=>{const O=Math.ceil(P.totalRequests/C);return Array.from({length:C},()=>Math.max(1,O+Math.floor(Math.random()*(O*.5)-O*.25)))},S=P=>{const C=Object.values(a.value).reduce((O,B)=>O+B,0);return C>0?(a.value[P]/C*100).toFixed(2):0},w=P=>{const C=l.value.filter(B=>B.status_code===parseInt(P));return C.length===0?\"0\":(C.reduce((B,U)=>B+U.avg_duration,0)/C.length).toFixed(2)},R=P=>{if(P===0)return\"0 B\";const C=1024,O=[\"B\",\"KB\",\"MB\",\"GB\"],B=Math.floor(Math.log(Math.abs(P))/Math.log(C));return(P/Math.pow(C,B)).toFixed(2)+\" \"+O[B]},k=P=>new Date(P).toLocaleTimeString();return(P,C)=>(L(),N(\"div\",r1,[Pt(zu,{\"api-data\":s.value,loading:t.value,\"auth-token\":n.value,menus:_e(i),onRefresh:p,\"onUpdate:authToken\":C[0]||(C[0]=O=>n.value=O)},null,8,[\"api-data\",\"loading\",\"auth-token\",\"menus\"]),m(\"div\",a1,[m(\"div\",l1,[m(\"div\",c1,[C[3]||(C[3]=m(\"h1\",null,\"API Inspector Dashboard\",-1)),m(\"div\",u1,[se(m(\"select\",{\"onUpdate:modelValue\":C[1]||(C[1]=O=>o.value=O),onChange:p,class:\"time-range-select\"},[...C[2]||(C[2]=[m(\"option\",{value:\"1h\"},\"Last 1 Hour\",-1),m(\"option\",{value:\"24h\"},\"Last 24 Hours\",-1),m(\"option\",{value:\"7d\"},\"Last 7 Days\",-1),m(\"option\",{value:\"30d\"},\"Last 30 Days\",-1)])],544),[[$u,o.value]])])]),m(\"div\",h1,[m(\"div\",d1,[C[4]||(C[4]=m(\"div\",{class:\"stat-label\"},\"Total Requests\",-1)),m(\"div\",f1,H(r.totalRequests),1),m(\"div\",{class:kt([\"stat-change\",r.requestsTrend>0?\"positive\":\"negative\"])},H(r.requestsTrend>0?\"↑\":\"↓\")+\" \"+H(Math.abs(r.requestsTrend))+\"% \",3)]),m(\"div\",p1,[C[5]||(C[5]=m(\"div\",{class:\"stat-label\"},\"Avg Response Time\",-1)),m(\"div\",g1,H(r.avgResponseTime.toFixed(2))+\"ms\",1),m(\"div\",m1,H(r.slowestRoute),1)]),m(\"div\",b1,[C[6]||(C[6]=m(\"div\",{class:\"stat-label\"},\"Error Rate\",-1)),m(\"div\",{class:kt([\"stat-value\",r.errorRate>10?\"error\":\"\"])},H(r.errorRate.toFixed(2))+\"% \",3),m(\"div\",_1,H(r.errorCount)+\" errors\",1)]),m(\"div\",y1,[C[7]||(C[7]=m(\"div\",{class:\"stat-label\"},\"Avg Memory Usage\",-1)),m(\"div\",x1,H(R(r.avgMemory)),1),C[8]||(C[8]=m(\"div\",{class:\"stat-description\"},\"Per request\",-1))])]),m(\"div\",v1,[m(\"div\",w1,[C[9]||(C[9]=m(\"h3\",null,\"Request Timeline\",-1)),m(\"div\",S1,[m(\"canvas\",{ref_key:\"requestChart\",ref:u},null,512)])]),m(\"div\",k1,[C[10]||(C[10]=m(\"h3\",null,\"Response Time Distribution\",-1)),m(\"div\",M1,[m(\"canvas\",{ref_key:\"responseTimeChart\",ref:h},null,512)])])]),m(\"div\",C1,[m(\"div\",P1,[C[12]||(C[12]=m(\"h3\",null,\"Status Code Distribution\",-1)),m(\"table\",A1,[C[11]||(C[11]=m(\"thead\",null,[m(\"tr\",null,[m(\"th\",null,\"Status Code\"),m(\"th\",null,\"Count\"),m(\"th\",null,\"Percentage\"),m(\"th\",null,\"Avg Duration\")])],-1)),m(\"tbody\",null,[(L(!0),N(ut,null,Vt(a.value,(O,B)=>(L(),N(\"tr\",{key:B,class:kt(`status-${B}`)},[m(\"td\",null,[m(\"span\",{class:kt([\"status-badge\",`status-${B}`])},H(B),3)]),m(\"td\",null,H(O),1),m(\"td\",null,H(S(B))+\"%\",1),m(\"td\",null,H(w(B))+\"ms\",1)],2))),128))])])])]),m(\"div\",R1,[m(\"div\",O1,[C[14]||(C[14]=m(\"h3\",null,\"Top Routes by Response Time\",-1)),m(\"table\",T1,[C[13]||(C[13]=m(\"thead\",null,[m(\"tr\",null,[m(\"th\",null,\"Route\"),m(\"th\",null,\"Method\"),m(\"th\",null,\"Requests\"),m(\"th\",null,\"Avg Time\"),m(\"th\",null,\"Min/Max\"),m(\"th\",null,\"Error Rate\")])],-1)),m(\"tbody\",null,[(L(!0),N(ut,null,Vt(l.value,O=>(L(),N(\"tr\",{key:O.route,class:\"route-row\"},[m(\"td\",E1,H(O.route),1),m(\"td\",null,[m(\"span\",{class:kt([\"method-badge\",`method-${O.method}`])},H(O.method),3)]),m(\"td\",null,H(O.count),1),m(\"td\",null,[m(\"span\",{class:kt([\"duration\",O.avg_duration>500?\"slow\":\"\"])},H(O.avg_duration.toFixed(2))+\"ms \",3)]),m(\"td\",null,H(O.min)+\"ms / \"+H(O.max)+\"ms\",1),m(\"td\",null,[m(\"span\",{class:kt([\"error-rate\",O.errorRate>10?\"high\":\"\"])},H(O.errorRate.toFixed(2))+\"% \",3)])]))),128))])])])]),c.value.length>0?(L(),N(\"div\",D1,[m(\"div\",I1,[C[16]||(C[16]=m(\"h3\",null,\"Recent Errors (Last 24h)\",-1)),m(\"table\",L1,[C[15]||(C[15]=m(\"thead\",null,[m(\"tr\",null,[m(\"th\",null,\"Time\"),m(\"th\",null,\"Route\"),m(\"th\",null,\"Status\"),m(\"th\",null,\"Error\"),m(\"th\",null,\"IP\")])],-1)),m(\"tbody\",null,[(L(!0),N(ut,null,Vt(c.value.slice(0,10),(O,B)=>(L(),N(\"tr\",{key:B,class:\"error-row\"},[m(\"td\",null,H(k(O.recorded_at)),1),m(\"td\",null,H(O.route),1),m(\"td\",null,[m(\"span\",{class:kt([\"status-badge\",`status-${O.status_code}`])},H(O.status_code),3)]),m(\"td\",F1,H(O.error),1),m(\"td\",null,H(O.ip_address),1)]))),128))])])])])):dt(\"\",!0)])])]))}},B1={class:\"toasts-container\"},$1={class:\"toast-content\"},V1={class:\"toast-icon\"},j1={__name:\"Toast\",setup(e){const{toasts:t}=io(),s=n=>({success:\"✓\",error:\"✕\",info:\"ℹ\"})[n]||\"✓\";return(n,i)=>(L(),Ie(Yd,{to:\"body\"},[m(\"div\",B1,[(L(!0),N(ut,null,Vt(_e(t),o=>(L(),N(\"div\",{key:o.id,class:kt([\"toast\",o.type])},[m(\"div\",$1,[m(\"span\",V1,H(s(o.type)),1),m(\"span\",null,H(o.message),1)])],2))),128))])]))}},H1=ne(j1,[[\"__scopeId\",\"data-v-40e4e9e9\"]]);const Us=typeof document<\"u\";function Hh(e){return typeof e==\"object\"||\"displayName\"in e||\"props\"in e||\"__vccOpts\"in e}function z1(e){return e.__esModule||e[Symbol.toStringTag]===\"Module\"||e.default&&Hh(e.default)}const ft=Object.assign;function Vo(e,t){const s={};for(const n in t){const i=t[n];s[n]=Me(i)?i.map(e):e(i)}return s}const Fn=()=>{},Me=Array.isArray;function fc(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}const zh=/#/g,W1=/&/g,q1=/\\//g,U1=/=/g,K1=/\\?/g,Wh=/\\+/g,G1=/%5B/g,Y1=/%5D/g,qh=/%5E/g,X1=/%60/g,Uh=/%7B/g,J1=/%7C/g,Kh=/%7D/g,Q1=/%20/g;function ea(e){return e==null?\"\":encodeURI(\"\"+e).replace(J1,\"|\").replace(G1,\"[\").replace(Y1,\"]\")}function Z1(e){return ea(e).replace(Uh,\"{\").replace(Kh,\"}\").replace(qh,\"^\")}function pr(e){return ea(e).replace(Wh,\"%2B\").replace(Q1,\"+\").replace(zh,\"%23\").replace(W1,\"%26\").replace(X1,\"`\").replace(Uh,\"{\").replace(Kh,\"}\").replace(qh,\"^\")}function tw(e){return pr(e).replace(U1,\"%3D\")}function ew(e){return ea(e).replace(zh,\"%23\").replace(K1,\"%3F\")}function sw(e){return ew(e).replace(q1,\"%2F\")}function Xn(e){if(e==null)return null;try{return decodeURIComponent(\"\"+e)}catch{}return\"\"+e}const nw=/\\/$/,iw=e=>e.replace(nw,\"\");function jo(e,t,s=\"/\"){let n,i={},o=\"\",r=\"\";const a=t.indexOf(\"#\");let l=t.indexOf(\"?\");return l=a>=0&&l>a?-1:l,l>=0&&(n=t.slice(0,l),o=t.slice(l,a>0?a:t.length),i=e(o.slice(1))),a>=0&&(n=n||t.slice(0,a),r=t.slice(a,t.length)),n=lw(n??t,s),{fullPath:n+o+r,path:n,query:i,hash:Xn(r)}}function ow(e,t){const s=t.query?e(t.query):\"\";return t.path+(s&&\"?\")+s+(t.hash||\"\")}function pc(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||\"/\"}function rw(e,t,s){const n=t.matched.length-1,i=s.matched.length-1;return n>-1&&n===i&&an(t.matched[n],s.matched[i])&&Gh(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function an(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Gh(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!aw(e[s],t[s]))return!1;return!0}function aw(e,t){return Me(e)?gc(e,t):Me(t)?gc(t,e):e?.valueOf()===t?.valueOf()}function gc(e,t){return Me(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function lw(e,t){if(e.startsWith(\"/\"))return e;if(!e)return t;const s=t.split(\"/\"),n=e.split(\"/\"),i=n[n.length-1];(i===\"..\"||i===\".\")&&n.push(\"\");let o=s.length-1,r,a;for(r=0;r<n.length;r++)if(a=n[r],a!==\".\")if(a===\"..\")o>1&&o--;else break;return s.slice(0,o).join(\"/\")+\"/\"+n.slice(r).join(\"/\")}const os={path:\"/\",name:void 0,params:{},query:{},hash:\"\",fullPath:\"/\",matched:[],meta:{},redirectedFrom:void 0};let gr=(function(e){return e.pop=\"pop\",e.push=\"push\",e})({}),Ho=(function(e){return e.back=\"back\",e.forward=\"forward\",e.unknown=\"\",e})({});function cw(e){if(!e)if(Us){const t=document.querySelector(\"base\");e=t&&t.getAttribute(\"href\")||\"/\",e=e.replace(/^\\w+:\\/\\/[^\\/]+/,\"\")}else e=\"/\";return e[0]!==\"/\"&&e[0]!==\"#\"&&(e=\"/\"+e),iw(e)}const uw=/^[^#]+#/;function hw(e,t){return e.replace(uw,\"#\")+t}function dw(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const po=()=>({left:window.scrollX,top:window.scrollY});function fw(e){let t;if(\"el\"in e){const s=e.el,n=typeof s==\"string\"&&s.startsWith(\"#\"),i=typeof s==\"string\"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!i)return;t=dw(i,e)}else t=e;\"scrollBehavior\"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function mc(e,t){return(history.state?history.state.position-t:-1)+e}const mr=new Map;function pw(e,t){mr.set(e,t)}function gw(e){const t=mr.get(e);return mr.delete(e),t}function mw(e){return typeof e==\"string\"||e&&typeof e==\"object\"}function Yh(e){return typeof e==\"string\"||typeof e==\"symbol\"}let Ot=(function(e){return e[e.MATCHER_NOT_FOUND=1]=\"MATCHER_NOT_FOUND\",e[e.NAVIGATION_GUARD_REDIRECT=2]=\"NAVIGATION_GUARD_REDIRECT\",e[e.NAVIGATION_ABORTED=4]=\"NAVIGATION_ABORTED\",e[e.NAVIGATION_CANCELLED=8]=\"NAVIGATION_CANCELLED\",e[e.NAVIGATION_DUPLICATED=16]=\"NAVIGATION_DUPLICATED\",e})({});const Xh=Symbol(\"\");Ot.MATCHER_NOT_FOUND+\"\",Ot.NAVIGATION_GUARD_REDIRECT+\"\",Ot.NAVIGATION_ABORTED+\"\",Ot.NAVIGATION_CANCELLED+\"\",Ot.NAVIGATION_DUPLICATED+\"\";function ln(e,t){return ft(new Error,{type:e,[Xh]:!0},t)}function Ve(e,t){return e instanceof Error&&Xh in e&&(t==null||!!(e.type&t))}const bw=[\"params\",\"query\",\"hash\"];function _w(e){if(typeof e==\"string\")return e;if(e.path!=null)return e.path;const t={};for(const s of bw)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function yw(e){const t={};if(e===\"\"||e===\"?\")return t;const s=(e[0]===\"?\"?e.slice(1):e).split(\"&\");for(let n=0;n<s.length;++n){const i=s[n].replace(Wh,\" \"),o=i.indexOf(\"=\"),r=Xn(o<0?i:i.slice(0,o)),a=o<0?null:Xn(i.slice(o+1));if(r in t){let l=t[r];Me(l)||(l=t[r]=[l]),l.push(a)}else t[r]=a}return t}function bc(e){let t=\"\";for(let s in e){const n=e[s];if(s=tw(s),n==null){n!==void 0&&(t+=(t.length?\"&\":\"\")+s);continue}(Me(n)?n.map(i=>i&&pr(i)):[n&&pr(n)]).forEach(i=>{i!==void 0&&(t+=(t.length?\"&\":\"\")+s,i!=null&&(t+=\"=\"+i))})}return t}function xw(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=Me(n)?n.map(i=>i==null?null:\"\"+i):n==null?n:\"\"+n)}return t}const vw=Symbol(\"\"),_c=Symbol(\"\"),sa=Symbol(\"\"),Jh=Symbol(\"\"),br=Symbol(\"\");function yn(){let e=[];function t(n){return e.push(n),()=>{const i=e.indexOf(n);i>-1&&e.splice(i,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function cs(e,t,s,n,i,o=r=>r()){const r=n&&(n.enterCallbacks[i]=n.enterCallbacks[i]||[]);return()=>new Promise((a,l)=>{const c=d=>{d===!1?l(ln(Ot.NAVIGATION_ABORTED,{from:s,to:t})):d instanceof Error?l(d):mw(d)?l(ln(Ot.NAVIGATION_GUARD_REDIRECT,{from:t,to:d})):(r&&n.enterCallbacks[i]===r&&typeof d==\"function\"&&r.push(d),a())},u=o(()=>e.call(n&&n.instances[i],t,s,c));let h=Promise.resolve(u);e.length<3&&(h=h.then(c)),h.catch(d=>l(d))})}function zo(e,t,s,n,i=o=>o()){const o=[];for(const r of e)for(const a in r.components){let l=r.components[a];if(!(t!==\"beforeRouteEnter\"&&!r.instances[a]))if(Hh(l)){const c=(l.__vccOpts||l)[t];c&&o.push(cs(c,s,n,r,a,i))}else{let c=l();o.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component \"${a}\" at \"${r.path}\"`);const h=z1(u)?u.default:u;r.mods[a]=u,r.components[a]=h;const d=(h.__vccOpts||h)[t];return d&&cs(d,s,n,r,a,i)()}))}}return o}function ww(e,t){const s=[],n=[],i=[],o=Math.max(t.matched.length,e.matched.length);for(let r=0;r<o;r++){const a=t.matched[r];a&&(e.matched.find(c=>an(c,a))?n.push(a):s.push(a));const l=e.matched[r];l&&(t.matched.find(c=>an(c,l))||i.push(l))}return[s,n,i]}let Sw=()=>location.protocol+\"//\"+location.host;function Qh(e,t){const{pathname:s,search:n,hash:i}=t,o=e.indexOf(\"#\");if(o>-1){let r=i.includes(e.slice(o))?e.slice(o).length:1,a=i.slice(r);return a[0]!==\"/\"&&(a=\"/\"+a),pc(a,\"\")}return pc(s,e)+n+i}function kw(e,t,s,n){let i=[],o=[],r=null;const a=({state:d})=>{const f=Qh(e,location),p=s.value,g=t.value;let _=0;if(d){if(s.value=f,t.value=d,r&&r===p){r=null;return}_=g?d.position-g.position:0}else n(f);i.forEach(b=>{b(s.value,p,{delta:_,type:gr.pop,direction:_?_>0?Ho.forward:Ho.back:Ho.unknown})})};function l(){r=s.value}function c(d){i.push(d);const f=()=>{const p=i.indexOf(d);p>-1&&i.splice(p,1)};return o.push(f),f}function u(){if(document.visibilityState===\"hidden\"){const{history:d}=window;if(!d.state)return;d.replaceState(ft({},d.state,{scroll:po()}),\"\")}}function h(){for(const d of o)d();o=[],window.removeEventListener(\"popstate\",a),window.removeEventListener(\"pagehide\",u),document.removeEventListener(\"visibilitychange\",u)}return window.addEventListener(\"popstate\",a),window.addEventListener(\"pagehide\",u),document.addEventListener(\"visibilitychange\",u),{pauseListeners:l,listen:c,destroy:h}}function yc(e,t,s,n=!1,i=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:i?po():null}}function Mw(e){const{history:t,location:s}=window,n={value:Qh(e,s)},i={value:t.state};i.value||o(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(l,c,u){const h=e.indexOf(\"#\"),d=h>-1?(s.host&&document.querySelector(\"base\")?e:e.slice(h))+l:Sw()+e+l;try{t[u?\"replaceState\":\"pushState\"](c,\"\",d),i.value=c}catch(f){console.error(f),s[u?\"replace\":\"assign\"](d)}}function r(l,c){o(l,ft({},t.state,yc(i.value.back,l,i.value.forward,!0),c,{position:i.value.position}),!0),n.value=l}function a(l,c){const u=ft({},i.value,t.state,{forward:l,scroll:po()});o(u.current,u,!0),o(l,ft({},yc(n.value,l,null),{position:u.position+1},c),!1),n.value=l}return{location:n,state:i,push:a,replace:r}}function Cw(e){e=cw(e);const t=Mw(e),s=kw(e,t.state,t.location,t.replace);function n(o,r=!0){r||s.pauseListeners(),history.go(o)}const i=ft({location:\"\",base:e,go:n,createHref:hw.bind(null,e)},t,s);return Object.defineProperty(i,\"location\",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,\"state\",{enumerable:!0,get:()=>t.state.value}),i}let Es=(function(e){return e[e.Static=0]=\"Static\",e[e.Param=1]=\"Param\",e[e.Group=2]=\"Group\",e})({});var Ft=(function(e){return e[e.Static=0]=\"Static\",e[e.Param=1]=\"Param\",e[e.ParamRegExp=2]=\"ParamRegExp\",e[e.ParamRegExpEnd=3]=\"ParamRegExpEnd\",e[e.EscapeNext=4]=\"EscapeNext\",e})(Ft||{});const Pw={type:Es.Static,value:\"\"},Aw=/[a-zA-Z0-9_]/;function Rw(e){if(!e)return[[]];if(e===\"/\")return[[Pw]];if(!e.startsWith(\"/\"))throw new Error(`Invalid path \"${e}\"`);function t(f){throw new Error(`ERR (${s})/\"${c}\": ${f}`)}let s=Ft.Static,n=s;const i=[];let o;function r(){o&&i.push(o),o=[]}let a=0,l,c=\"\",u=\"\";function h(){c&&(s===Ft.Static?o.push({type:Es.Static,value:c}):s===Ft.Param||s===Ft.ParamRegExp||s===Ft.ParamRegExpEnd?(o.length>1&&(l===\"*\"||l===\"+\")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:Es.Param,value:c,regexp:u,repeatable:l===\"*\"||l===\"+\",optional:l===\"*\"||l===\"?\"})):t(\"Invalid state to consume buffer\"),c=\"\")}function d(){c+=l}for(;a<e.length;){if(l=e[a++],l===\"\\\\\"&&s!==Ft.ParamRegExp){n=s,s=Ft.EscapeNext;continue}switch(s){case Ft.Static:l===\"/\"?(c&&h(),r()):l===\":\"?(h(),s=Ft.Param):d();break;case Ft.EscapeNext:d(),s=n;break;case Ft.Param:l===\"(\"?s=Ft.ParamRegExp:Aw.test(l)?d():(h(),s=Ft.Static,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&a--);break;case Ft.ParamRegExp:l===\")\"?u[u.length-1]==\"\\\\\"?u=u.slice(0,-1)+l:s=Ft.ParamRegExpEnd:u+=l;break;case Ft.ParamRegExpEnd:h(),s=Ft.Static,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&a--,u=\"\";break;default:t(\"Unknown state\");break}}return s===Ft.ParamRegExp&&t(`Unfinished custom RegExp for param \"${c}\"`),h(),r(),i}const xc=\"[^/]+?\",Ow={sensitive:!1,strict:!1,start:!0,end:!0};var te=(function(e){return e[e._multiplier=10]=\"_multiplier\",e[e.Root=90]=\"Root\",e[e.Segment=40]=\"Segment\",e[e.SubSegment=30]=\"SubSegment\",e[e.Static=40]=\"Static\",e[e.Dynamic=20]=\"Dynamic\",e[e.BonusCustomRegExp=10]=\"BonusCustomRegExp\",e[e.BonusWildcard=-50]=\"BonusWildcard\",e[e.BonusRepeatable=-20]=\"BonusRepeatable\",e[e.BonusOptional=-8]=\"BonusOptional\",e[e.BonusStrict=.7000000000000001]=\"BonusStrict\",e[e.BonusCaseSensitive=.25]=\"BonusCaseSensitive\",e})(te||{});const Tw=/[.+*?^${}()[\\]/\\\\]/g;function Ew(e,t){const s=ft({},Ow,t),n=[];let i=s.start?\"^\":\"\";const o=[];for(const c of e){const u=c.length?[]:[te.Root];s.strict&&!c.length&&(i+=\"/\");for(let h=0;h<c.length;h++){const d=c[h];let f=te.Segment+(s.sensitive?te.BonusCaseSensitive:0);if(d.type===Es.Static)h||(i+=\"/\"),i+=d.value.replace(Tw,\"\\\\$&\"),f+=te.Static;else if(d.type===Es.Param){const{value:p,repeatable:g,optional:_,regexp:b}=d;o.push({name:p,repeatable:g,optional:_});const v=b||xc;if(v!==xc){f+=te.BonusCustomRegExp;try{`${v}`}catch(S){throw new Error(`Invalid custom RegExp for param \"${p}\" (${v}): `+S.message)}}let M=g?`((?:${v})(?:/(?:${v}))*)`:`(${v})`;h||(M=_&&c.length<2?`(?:/${M})`:\"/\"+M),_&&(M+=\"?\"),i+=M,f+=te.Dynamic,_&&(f+=te.BonusOptional),g&&(f+=te.BonusRepeatable),v===\".*\"&&(f+=te.BonusWildcard)}u.push(f)}n.push(u)}if(s.strict&&s.end){const c=n.length-1;n[c][n[c].length-1]+=te.BonusStrict}s.strict||(i+=\"/?\"),s.end?i+=\"$\":s.strict&&!i.endsWith(\"/\")&&(i+=\"(?:/|$)\");const r=new RegExp(i,s.sensitive?\"\":\"i\");function a(c){const u=c.match(r),h={};if(!u)return null;for(let d=1;d<u.length;d++){const f=u[d]||\"\",p=o[d-1];h[p.name]=f&&p.repeatable?f.split(\"/\"):f}return h}function l(c){let u=\"\",h=!1;for(const d of e){(!h||!u.endsWith(\"/\"))&&(u+=\"/\"),h=!1;for(const f of d)if(f.type===Es.Static)u+=f.value;else if(f.type===Es.Param){const{value:p,repeatable:g,optional:_}=f,b=p in c?c[p]:\"\";if(Me(b)&&!g)throw new Error(`Provided param \"${p}\" is an array but it is not repeatable (* or + modifiers)`);const v=Me(b)?b.join(\"/\"):b;if(!v)if(_)d.length<2&&(u.endsWith(\"/\")?u=u.slice(0,-1):h=!0);else throw new Error(`Missing required param \"${p}\"`);u+=v}}return u||\"/\"}return{re:r,score:n,keys:o,parse:a,stringify:l}}function Dw(e,t){let s=0;for(;s<e.length&&s<t.length;){const n=t[s]-e[s];if(n)return n;s++}return e.length<t.length?e.length===1&&e[0]===te.Static+te.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===te.Static+te.Segment?1:-1:0}function Zh(e,t){let s=0;const n=e.score,i=t.score;for(;s<n.length&&s<i.length;){const o=Dw(n[s],i[s]);if(o)return o;s++}if(Math.abs(i.length-n.length)===1){if(vc(n))return 1;if(vc(i))return-1}return i.length-n.length}function vc(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const Iw={strict:!1,end:!0,sensitive:!1};function Lw(e,t,s){const n=Ew(Rw(e.path),s),i=ft(n,{record:e,parent:t,children:[],alias:[]});return t&&!i.record.aliasOf==!t.record.aliasOf&&t.children.push(i),i}function Fw(e,t){const s=[],n=new Map;t=fc(Iw,t);function i(h){return n.get(h)}function o(h,d,f){const p=!f,g=Sc(h);g.aliasOf=f&&f.record;const _=fc(t,h),b=[g];if(\"alias\"in h){const S=typeof h.alias==\"string\"?[h.alias]:h.alias;for(const w of S)b.push(Sc(ft({},g,{components:f?f.record.components:g.components,path:w,aliasOf:f?f.record:g})))}let v,M;for(const S of b){const{path:w}=S;if(d&&w[0]!==\"/\"){const R=d.record.path,k=R[R.length-1]===\"/\"?\"\":\"/\";S.path=d.record.path+(w&&k+w)}if(v=Lw(S,d,_),f?f.alias.push(v):(M=M||v,M!==v&&M.alias.push(v),p&&h.name&&!kc(v)&&r(h.name)),td(v)&&l(v),g.children){const R=g.children;for(let k=0;k<R.length;k++)o(R[k],v,f&&f.children[k])}f=f||v}return M?()=>{r(M)}:Fn}function r(h){if(Yh(h)){const d=n.get(h);d&&(n.delete(h),s.splice(s.indexOf(d),1),d.children.forEach(r),d.alias.forEach(r))}else{const d=s.indexOf(h);d>-1&&(s.splice(d,1),h.record.name&&n.delete(h.record.name),h.children.forEach(r),h.alias.forEach(r))}}function a(){return s}function l(h){const d=$w(h,s);s.splice(d,0,h),h.record.name&&!kc(h)&&n.set(h.record.name,h)}function c(h,d){let f,p={},g,_;if(\"name\"in h&&h.name){if(f=n.get(h.name),!f)throw ln(Ot.MATCHER_NOT_FOUND,{location:h});_=f.record.name,p=ft(wc(d.params,f.keys.filter(M=>!M.optional).concat(f.parent?f.parent.keys.filter(M=>M.optional):[]).map(M=>M.name)),h.params&&wc(h.params,f.keys.map(M=>M.name))),g=f.stringify(p)}else if(h.path!=null)g=h.path,f=s.find(M=>M.re.test(g)),f&&(p=f.parse(g),_=f.record.name);else{if(f=d.name?n.get(d.name):s.find(M=>M.re.test(d.path)),!f)throw ln(Ot.MATCHER_NOT_FOUND,{location:h,currentLocation:d});_=f.record.name,p=ft({},d.params,h.params),g=f.stringify(p)}const b=[];let v=f;for(;v;)b.unshift(v.record),v=v.parent;return{name:_,path:g,params:p,matched:b,meta:Bw(b)}}e.forEach(h=>o(h));function u(){s.length=0,n.clear()}return{addRoute:o,resolve:c,removeRoute:r,clearRoutes:u,getRoutes:a,getRecordMatcher:i}}function wc(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function Sc(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Nw(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:\"components\"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,\"mods\",{value:{}}),t}function Nw(e){const t={},s=e.props||!1;if(\"component\"in e)t.default=s;else for(const n in e.components)t[n]=typeof s==\"object\"?s[n]:s;return t}function kc(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Bw(e){return e.reduce((t,s)=>ft(t,s.meta),{})}function $w(e,t){let s=0,n=t.length;for(;s!==n;){const o=s+n>>1;Zh(e,t[o])<0?n=o:s=o+1}const i=Vw(e);return i&&(n=t.lastIndexOf(i,n-1)),n}function Vw(e){let t=e;for(;t=t.parent;)if(td(t)&&Zh(e,t)===0)return t}function td({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Mc(e){const t=Je(sa),s=Je(Jh),n=qt(()=>{const l=_e(e.to);return t.resolve(l)}),i=qt(()=>{const{matched:l}=n.value,{length:c}=l,u=l[c-1],h=s.matched;if(!u||!h.length)return-1;const d=h.findIndex(an.bind(null,u));if(d>-1)return d;const f=Cc(l[c-2]);return c>1&&Cc(u)===f&&h[h.length-1].path!==f?h.findIndex(an.bind(null,l[c-2])):d}),o=qt(()=>i.value>-1&&qw(s.params,n.value.params)),r=qt(()=>i.value>-1&&i.value===s.matched.length-1&&Gh(s.params,n.value.params));function a(l={}){if(Ww(l)){const c=t[_e(e.replace)?\"replace\":\"push\"](_e(e.to)).catch(Fn);return e.viewTransition&&typeof document<\"u\"&&\"startViewTransition\"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:n,href:qt(()=>n.value.href),isActive:o,isExactActive:r,navigate:a}}function jw(e){return e.length===1?e[0]:e}const Hw=uu({name:\"RouterLink\",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:\"page\"},viewTransition:Boolean},useLink:Mc,setup(e,{slots:t}){const s=Zs(Mc(e)),{options:n}=Je(sa),i=qt(()=>({[Pc(e.activeClass,n.linkActiveClass,\"router-link-active\")]:s.isActive,[Pc(e.exactActiveClass,n.linkExactActiveClass,\"router-link-exact-active\")]:s.isExactActive}));return()=>{const o=t.default&&jw(t.default(s));return e.custom?o:Lu(\"a\",{\"aria-current\":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:i.value},o)}}}),zw=Hw;function Ww(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute(\"target\");if(/\\b_blank\\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function qw(e,t){for(const s in t){const n=t[s],i=e[s];if(typeof n==\"string\"){if(n!==i)return!1}else if(!Me(i)||i.length!==n.length||n.some((o,r)=>o.valueOf()!==i[r].valueOf()))return!1}return!0}function Cc(e){return e?e.aliasOf?e.aliasOf.path:e.path:\"\"}const Pc=(e,t,s)=>e??t??s,Uw=uu({name:\"RouterView\",inheritAttrs:!1,props:{name:{type:String,default:\"default\"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=Je(br),i=qt(()=>e.route||n.value),o=Je(_c,0),r=qt(()=>{let c=_e(o);const{matched:u}=i.value;let h;for(;(h=u[c])&&!h.components;)c++;return c}),a=qt(()=>i.value.matched[r.value]);wi(_c,qt(()=>r.value+1)),wi(vw,a),wi(br,i);const l=et();return Qe(()=>[l.value,a.value,e.name],([c,u,h],[d,f,p])=>{u&&(u.instances[h]=c,f&&f!==u&&c&&c===d&&(u.leaveGuards.size||(u.leaveGuards=f.leaveGuards),u.updateGuards.size||(u.updateGuards=f.updateGuards))),c&&u&&(!f||!an(u,f)||!d)&&(u.enterCallbacks[h]||[]).forEach(g=>g(c))},{flush:\"post\"}),()=>{const c=i.value,u=e.name,h=a.value,d=h&&h.components[u];if(!d)return Ac(s.default,{Component:d,route:c});const f=h.props[u],p=f?f===!0?c.params:typeof f==\"function\"?f(c):f:null,_=Lu(d,ft({},p,t,{onVnodeUnmounted:b=>{b.component.isUnmounted&&(h.instances[u]=null)},ref:l}));return Ac(s.default,{Component:_,route:c})||_}}});function Ac(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const Kw=Uw;function Gw(e){const t=Fw(e.routes,e),s=e.parseQuery||yw,n=e.stringifyQuery||bc,i=e.history,o=yn(),r=yn(),a=yn(),l=Id(os);let c=os;Us&&e.scrollBehavior&&\"scrollRestoration\"in history&&(history.scrollRestoration=\"manual\");const u=Vo.bind(null,D=>\"\"+D),h=Vo.bind(null,sw),d=Vo.bind(null,Xn);function f(D,q){let z,K;return Yh(D)?(z=t.getRecordMatcher(D),K=q):K=D,t.addRoute(K,z)}function p(D){const q=t.getRecordMatcher(D);q&&t.removeRoute(q)}function g(){return t.getRoutes().map(D=>D.record)}function _(D){return!!t.getRecordMatcher(D)}function b(D,q){if(q=ft({},q||l.value),typeof D==\"string\"){const A=jo(s,D,q.path),T=t.resolve({path:A.path},q),I=i.createHref(A.fullPath);return ft(A,T,{params:d(T.params),hash:Xn(A.hash),redirectedFrom:void 0,href:I})}let z;if(D.path!=null)z=ft({},D,{path:jo(s,D.path,q.path).path});else{const A=ft({},D.params);for(const T in A)A[T]==null&&delete A[T];z=ft({},D,{params:h(A)}),q.params=h(q.params)}const K=t.resolve(z,q),lt=D.hash||\"\";K.params=u(d(K.params));const y=ow(n,ft({},D,{hash:Z1(lt),path:K.path})),x=i.createHref(y);return ft({fullPath:y,hash:lt,query:n===bc?xw(D.query):D.query||{}},K,{redirectedFrom:void 0,href:x})}function v(D){return typeof D==\"string\"?jo(s,D,l.value.path):ft({},D)}function M(D,q){if(c!==D)return ln(Ot.NAVIGATION_CANCELLED,{from:q,to:D})}function S(D){return k(D)}function w(D){return S(ft(v(D),{replace:!0}))}function R(D,q){const z=D.matched[D.matched.length-1];if(z&&z.redirect){const{redirect:K}=z;let lt=typeof K==\"function\"?K(D,q):K;return typeof lt==\"string\"&&(lt=lt.includes(\"?\")||lt.includes(\"#\")?lt=v(lt):{path:lt},lt.params={}),ft({query:D.query,hash:D.hash,params:lt.path!=null?{}:D.params},lt)}}function k(D,q){const z=c=b(D),K=l.value,lt=D.state,y=D.force,x=D.replace===!0,A=R(z,K);if(A)return k(ft(v(A),{state:typeof A==\"object\"?ft({},lt,A.state):lt,force:y,replace:x}),q||z);const T=z;T.redirectedFrom=q;let I;return!y&&rw(n,K,z)&&(I=ln(Ot.NAVIGATION_DUPLICATED,{to:T,from:K}),Jt(K,K,!0,!1)),(I?Promise.resolve(I):O(T,K)).catch(E=>Ve(E)?Ve(E,Ot.NAVIGATION_GUARD_REDIRECT)?E:Xt(E):nt(E,T,K)).then(E=>{if(E){if(Ve(E,Ot.NAVIGATION_GUARD_REDIRECT))return k(ft({replace:x},v(E.to),{state:typeof E.to==\"object\"?ft({},lt,E.to.state):lt,force:y}),q||T)}else E=U(T,K,!0,x,lt);return B(T,K,E),E})}function P(D,q){const z=M(D,q);return z?Promise.reject(z):Promise.resolve()}function C(D){const q=ie.values().next().value;return q&&typeof q.runWithContext==\"function\"?q.runWithContext(D):D()}function O(D,q){let z;const[K,lt,y]=ww(D,q);z=zo(K.reverse(),\"beforeRouteLeave\",D,q);for(const A of K)A.leaveGuards.forEach(T=>{z.push(cs(T,D,q))});const x=P.bind(null,D,q);return z.push(x),Lt(z).then(()=>{z=[];for(const A of o.list())z.push(cs(A,D,q));return z.push(x),Lt(z)}).then(()=>{z=zo(lt,\"beforeRouteUpdate\",D,q);for(const A of lt)A.updateGuards.forEach(T=>{z.push(cs(T,D,q))});return z.push(x),Lt(z)}).then(()=>{z=[];for(const A of y)if(A.beforeEnter)if(Me(A.beforeEnter))for(const T of A.beforeEnter)z.push(cs(T,D,q));else z.push(cs(A.beforeEnter,D,q));return z.push(x),Lt(z)}).then(()=>(D.matched.forEach(A=>A.enterCallbacks={}),z=zo(y,\"beforeRouteEnter\",D,q,C),z.push(x),Lt(z))).then(()=>{z=[];for(const A of r.list())z.push(cs(A,D,q));return z.push(x),Lt(z)}).catch(A=>Ve(A,Ot.NAVIGATION_CANCELLED)?A:Promise.reject(A))}function B(D,q,z){a.list().forEach(K=>C(()=>K(D,q,z)))}function U(D,q,z,K,lt){const y=M(D,q);if(y)return y;const x=q===os,A=Us?history.state:{};z&&(K||x?i.replace(D.fullPath,ft({scroll:x&&A&&A.scroll},lt)):i.push(D.fullPath,lt)),l.value=D,Jt(D,q,z,x),Xt()}let at;function Ct(){at||(at=i.listen((D,q,z)=>{if(!ue.listening)return;const K=b(D),lt=R(K,ue.currentRoute.value);if(lt){k(ft(lt,{replace:!0,force:!0}),K).catch(Fn);return}c=K;const y=l.value;Us&&pw(mc(y.fullPath,z.delta),po()),O(K,y).catch(x=>Ve(x,Ot.NAVIGATION_ABORTED|Ot.NAVIGATION_CANCELLED)?x:Ve(x,Ot.NAVIGATION_GUARD_REDIRECT)?(k(ft(v(x.to),{force:!0}),K).then(A=>{Ve(A,Ot.NAVIGATION_ABORTED|Ot.NAVIGATION_DUPLICATED)&&!z.delta&&z.type===gr.pop&&i.go(-1,!1)}).catch(Fn),Promise.reject()):(z.delta&&i.go(-z.delta,!1),nt(x,K,y))).then(x=>{x=x||U(K,y,!1),x&&(z.delta&&!Ve(x,Ot.NAVIGATION_CANCELLED)?i.go(-z.delta,!1):z.type===gr.pop&&Ve(x,Ot.NAVIGATION_ABORTED|Ot.NAVIGATION_DUPLICATED)&&i.go(-1,!1)),B(K,y,x)}).catch(Fn)}))}let rt=yn(),tt=yn(),Y;function nt(D,q,z){Xt(D);const K=tt.list();return K.length?K.forEach(lt=>lt(D,q,z)):console.error(D),Promise.reject(D)}function xt(){return Y&&l.value!==os?Promise.resolve():new Promise((D,q)=>{rt.add([D,q])})}function Xt(D){return Y||(Y=!D,Ct(),rt.list().forEach(([q,z])=>D?z(D):q()),rt.reset()),D}function Jt(D,q,z,K){const{scrollBehavior:lt}=e;if(!Us||!lt)return Promise.resolve();const y=!z&&gw(mc(D.fullPath,0))||(K||!z)&&history.state&&history.state.scroll||null;return Qi().then(()=>lt(D,q,y)).then(x=>x&&fw(x)).catch(x=>nt(x,D,q))}const Et=D=>i.go(D);let pe;const ie=new Set,ue={currentRoute:l,listening:!0,addRoute:f,removeRoute:p,clearRoutes:t.clearRoutes,hasRoute:_,getRoutes:g,resolve:b,options:e,push:S,replace:w,go:Et,back:()=>Et(-1),forward:()=>Et(1),beforeEach:o.add,beforeResolve:r.add,afterEach:a.add,onError:tt.add,isReady:xt,install(D){D.component(\"RouterLink\",zw),D.component(\"RouterView\",Kw),D.config.globalProperties.$router=ue,Object.defineProperty(D.config.globalProperties,\"$route\",{enumerable:!0,get:()=>_e(l)}),Us&&!pe&&l.value===os&&(pe=!0,S(i.location).catch(K=>{}));const q={};for(const K in os)Object.defineProperty(q,K,{get:()=>l.value[K],enumerable:!0});D.provide(sa,ue),D.provide(Jh,Jc(q)),D.provide(br,l);const z=D.unmount;ie.add(D),D.unmount=function(){ie.delete(D),ie.size<1&&(c=os,at&&at(),at=null,l.value=os,pe=!1,Y=!1),z()}}};function Lt(D){return D.reduce((q,z)=>q.then(()=>C(z)),Promise.resolve())}return ue}window.ApiInspector.basePath=\"/\"+window.ApiInspector.path;window.location.pathname.startsWith(window.ApiInspector.basePath)||(window.ApiInspector.basePath=window.location.pathname);let ed=window.ApiInspector.basePath+\"/\";(window.ApiInspector.path===\"\"||window.ApiInspector.path===\"/\")&&(ed=\"/\",window.ApiInspector.basePath=\"\");const Yw=Gw({routes:[{path:window.ApiInspector.basePath,name:\"home\",component:Nb},{path:window.ApiInspector.basePath+\"/stats\",name:\"dashboard\",component:N1}],history:Cw(),base:ed}),go=Ap(Dp);window.useToast=io;go.component(\"Toast\",H1);go.use(Yw);go.mixin({computed:{ApiInspector:()=>window.ApiInspector}});go.mount(\"#api-inspector\");\n"
  },
  {
    "path": "resources/css/app.css",
    "content": "a {\n    text-decoration: none !important;\n}\n"
  },
  {
    "path": "resources/js/app.js",
    "content": "import './bootstrap';\n\nimport { createApp } from 'vue';\nimport { createPinia } from 'pinia'\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate'\nimport { Bootstrap5Pagination } from 'laravel-vue-pagination';\nimport router from './routes/index'\nimport VueSweetalert2 from \"vue-sweetalert2\";\nimport { abilitiesPlugin } from '@casl/vue';\nimport ability from './services/ability';\nimport vSelect from \"vue-select\";\nimport useAuth from './composables/auth';\nimport i18n from \"./plugins/i18n\";\n\nimport 'sweetalert2/dist/sweetalert2.min.css';\nimport 'vue-select/dist/vue-select.css';\n\nconst pinia = createPinia();\npinia.use(piniaPluginPersistedstate);\n\nconst app = createApp({\n    created() {\n        useAuth().getUser()\n    }\n});\n\nimport ExampleComponent from './components/ExampleComponent.vue';\n\napp.component('example-component', ExampleComponent);\n\napp.use(pinia)\napp.use(router)\napp.use(VueSweetalert2)\napp.use(i18n)\napp.use(abilitiesPlugin, ability)\napp.component('Pagination', Bootstrap5Pagination)\napp.component(\"v-select\", vSelect);\napp.mount('#app')\n"
  },
  {
    "path": "resources/js/bootstrap.js",
    "content": "import _ from 'lodash';\nwindow._ = _;\n\nimport 'bootstrap';\n\n/**\n * We'll load the axios HTTP library which allows us to easily issue requests\n * to our Laravel back-end. This library automatically handles sending the\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\n */\n\nimport axios from 'axios';\nwindow.axios = axios;\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n\nwindow.axios.defaults.withCredentials = true\nwindow.axios.interceptors.response.use(\n    response => response,\n    error => {\n        // Check for email verification required (403 with email_verified: false)\n        // if (error.response?.status === 403 && error.response?.data?.email_verified === false) {\n        //     if (location.pathname !== '/verify') {\n        //         location.assign('/verify')\n        //     }\n        //     return Promise.reject(error)\n        // }\n        \n        if (error.response?.status === 401 || error.response?.status === 419) {\n            if (location.pathname !== '/login'){\n                location.assign('/login')\n            }\n        }\n\n        return Promise.reject(error)\n    }\n)\n\n/**\n * Echo exposes an expressive API for subscribing to channels and listening\n * for events that are broadcast by Laravel. Echo and event broadcasting\n * allows your team to easily build robust real-time web applications.\n */\n\n// import Echo from 'laravel-echo';\n\n// import Pusher from 'pusher-js';\n// window.Pusher = Pusher;\n\n// window.Echo = new Echo({\n//     broadcaster: 'pusher',\n//     key: import.meta.env.VITE_PUSHER_APP_KEY,\n//     wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,\n//     wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,\n//     wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,\n//     forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',\n//     enabledTransports: ['ws', 'wss'],\n// });\n"
  },
  {
    "path": "resources/js/components/Admin/Create.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"post.title\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger-600 mt-1\">\n                                {{ errors.title }}\n                            </div>\n                            <div class=\"invalid-feedback mt-1\">\n                                <div v-for=\"message in validationErrors?.title\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Content -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-content\" class=\"form-label\">\n                                Content\n                            </label>\n                            <textarea v-model=\"post.content\" id=\"post-content\" class=\"form-control\"></textarea>\n                            <div class=\"invalid-feedback mt-1\">\n                                {{ errors.content }}\n                            </div>\n                            <div class=\"text-danger-600 mt-1\">\n                                <div v-for=\"message in validationErrors?.content\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Category -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-category\" class=\"form-label\">\n                                Category\n                            </label>\n                            <v-select v-model=\"post.category_id\" :options=\"categories\" :reduce=\"category => category.id\" label=\"text\" class=\"form-control\" />\n                            <div class=\"invalid-feedback mt-1\">\n                                {{ errors.category_id }}\n                            </div>\n                            <div class=\"invalid-feedback mt-1\">\n                                <div v-for=\"message in validationErrors?.category_id\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"mb-3\">\n                            <label for=\"thumbnail\" class=\"form-label\">\n                                Thumbnail\n                            </label>\n                            <input @change=\"post.thumbnail = $event.target.files[0]\" type=\"file\" class=\"form-control\" id=\"thumbnail\" />\n                            <div class=\"text-danger-600 mt-1\">\n                                <div v-for=\"message in validationErrors?.thumbnail\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { onMounted, reactive } from \"vue\";\n    import useCategories from \"@/composables/categories\";\n    import usePosts from \"@/composables/posts\";\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"../../validation/rules\"\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        title: 'required|min:5',\n        content: 'required|min:50',\n        category_id: 'required'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: title } = useField('title', null, { initialValue: '' });\n    const { value: content } = useField('content', null, { initialValue: '' });\n    const { value: category_id } = useField('category_id', null, { initialValue: '', label: 'category' });\n    const { categories, getCategories } = useCategories()\n    const { storePost, validationErrors, isLoading } = usePosts()\n    const post = reactive({\n        title,\n        content,\n        category_id,\n        thumbnail: ''\n    })\n    function submitForm() {\n        validate().then(form => { if (form.valid) storePost(post) })\n    }\n    onMounted(() => {\n        getCategories()\n    })\n</script>\n"
  },
  {
    "path": "resources/js/components/Admin/Edit.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    Admin Edit\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n"
  },
  {
    "path": "resources/js/components/Admin/Index.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-12\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <div class=\"mb-4\">\n                        <h1>Admin</h1>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\n\nexport default {}\n</script>\n"
  },
  {
    "path": "resources/js/components/DropZone.vue",
    "content": "<template>\n    <div\n        class=\"dropzone-container\"\n        @dragover=\"dragover\"\n        @dragleave=\"dragleave\"\n        @drop=\"drop\"\n    >\n        <input\n            type=\"file\"\n            name=\"file\"\n            id=\"fileInput\"\n            class=\"hidden-input\"\n            @change=\"onChange\"\n            ref=\"refFiles\"\n            accept=\".gif,.webp,.jpg,.jpeg,.png\"\n        />\n\n        <label for=\"fileInput\" class=\"file-label text-center\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"50\" fill=\"currentColor\" class=\"bi bi-image\"\n                 viewBox=\"0 0 16 16\">\n                <path d=\"M6.002 5.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z\"/>\n                <path\n                    d=\"M2.002 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2h-12zm12 1a1 1 0 0 1 1 1v6.5l-3.777-1.947a.5.5 0 0 0-.577.093l-3.71 3.71-2.66-1.772a.5.5 0 0 0-.63.062L1.002 12V3a1 1 0 0 1 1-1h12z\"/>\n            </svg>\n            <div v-if=\"isDragging\">Release to drop files here.</div>\n            <div v-else>Drop files here or <u>click here</u> to upload.</div>\n        </label>\n\n        <div class=\"preview-container mt-4\" v-if=\"thumbnail || modelValue\">\n            <div :key=\"thumbnail.name\" class=\"preview-card\">\n                <div>\n                    <img class=\"preview-img\" :src=\"generateThumbnail(thumbnail)\"/>\n                    <p :title=\"thumbnail.name\">\n                        {{ makeName(thumbnail.name) }}\n                    </p>\n                </div>\n                <div>\n                    <a\n                        href=\"javascript:void(0)\"\n                        class=\"ml-2\"\n                        type=\"button\"\n                        @click=\"remove(index)\"\n                        title=\"Remove file\"\n                    >\n                        <b>&times;</b>\n                    </a>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport {onMounted, ref, watch} from \"vue\";\n\nconst props = defineProps({\n    modelValue: String\n});\n\nconst thumbnail = ref('')\nconst isDragging = ref(false)\nconst refFiles = ref(null)\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst onChange = (() => {\n    thumbnail.value = refFiles.value.files;\n})\n\nconst generateThumbnail = ((file) => {\n    if (props.modelValue) {\n        return props.modelValue\n    } else  {\n        let fileSrc = URL.createObjectURL(file);\n        setTimeout(() => {\n            URL.revokeObjectURL(fileSrc);\n        }, 1000);\n        return fileSrc;\n    }\n})\n\nconst makeName = ((name) => {\n    if (!props.modelValue) {\n        return (\n            name.split(\".\")[0].substring(0, 3) +\n            \"...\" +\n            name.split(\".\")[name.split(\".\").length - 1]\n        );\n    }\n})\n\nconst remove = ((i) => {\n    thumbnail.value = \"\"\n})\n\nconst dragover = ((e) => {\n    e.preventDefault();\n    isDragging.value = true;\n})\n\nconst dragleave = (() => {\n    isDragging.value = false;\n})\n\nconst drop = ((e) => {\n    e.preventDefault();\n    refFiles.value.files = e.dataTransfer.files;\n    onChange();\n    isDragging.value = false;\n})\n\nwatch(thumbnail, () => {\n    emit('update:modelValue', thumbnail.value[0])\n})\n\n/*export default {\n    props: ['thefile'],\n    data() {\n        return {\n            isDragging: false,\n            files: [],\n        };\n    },\n    methods: {\n        onChange() {\n            this.files = [...this.$refs.file.files];\n            console.log(thefile)\n        },\n\n        generateThumbnail(file) {\n            let fileSrc = URL.createObjectURL(file);\n            setTimeout(() => {\n                URL.revokeObjectURL(fileSrc);\n            }, 1000);\n            return fileSrc;\n        },\n\n        makeName(name) {\n            return (\n                name.split(\".\")[0].substring(0, 3) +\n                \"...\" +\n                name.split(\".\")[name.split(\".\").length - 1]\n            );\n        },\n\n        remove(i) {\n            this.files.splice(i, 1);\n        },\n\n        dragover(e) {\n            e.preventDefault();\n            this.isDragging = true;\n        },\n\n        dragleave() {\n            this.isDragging = false;\n        },\n\n        drop(e) {\n            e.preventDefault();\n            this.$refs.file.files = e.dataTransfer.files;\n            this.onChange();\n            this.isDragging = false;\n        },\n    },\n};*/\n</script>\n\n<style scoped>\n.dropzone-container {\n    padding: 4rem;\n    background: #f7fafc;\n    border: 1px solid #e2e8f0;\n}\n\n.hidden-input {\n    opacity: 0;\n    overflow: hidden;\n    position: absolute;\n    width: 1px;\n    height: 1px;\n}\n\n.file-label {\n    font-size: 20px;\n    display: block;\n    cursor: pointer;\n}\n\n.preview-container {\n    display: flex;\n    margin-top: 2rem;\n}\n\n.preview-card {\n    display: flex;\n    border: 1px solid #a2a2a2;\n    padding: 5px;\n    margin-left: 5px;\n}\n\n.preview-img {\n    width: 50px;\n    height: auto;\n    border-radius: 5px;\n    border: 1px solid #a2a2a2;\n    background-color: #a2a2a2;\n}\n</style>\n"
  },
  {
    "path": "resources/js/components/DualListBox.vue",
    "content": "<template>\n  <div class=\"container\">\n    <div>\n      <h2>{{ props.leftLabel }}</h2>\n      <select class=\"form-select\" multiple v-model=\"leftSelectedData\" @dblclick=\"moveRight\">\n          <option v-for=\"(item, index) in props.leftData\"\n                  :value=\"item\"\n                  :key=\"item.id\">\n              {{item.name}}\n          </option>\n      </select>\n    </div>\n\n    <div class=\"middle\">\n      <button class=\"btn btn-primary\" @click.prevent=\"moveRight\">=&gt;</button>\n      <button class=\"btn btn-primary\" @click.prevent=\"moveLeft\">&lt;=</button>\n    </div>\n\n    <div>\n      <h2>{{ props.rightLabel }}</h2>\n      <select class=\"form-select\" multiple v-model=\"rightSelectedData\" @dblclick=\"moveLeft\">\n          <option v-for=\"(item, index) in props.rightData\"\n                  :value=\"item\"\n                  :key=\"item.id\">\n              {{item.name}}\n          </option>\n      </select>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport { defineEmits } from 'vue';\nlet leftSelectedData = []\nlet rightSelectedData = []\nconst emit = defineEmits(['onChangeList'])\nconst props = defineProps({\n  leftLabel: {\n    type: String,\n    required: true\n  },\n  rightLabel: {\n    type: String,\n    required: true\n  },\n  leftData: {\n    type: Array,\n    required: true\n  },\n  rightData: {\n    type: Array,\n    required: true\n  }\n})\n\nfunction moveLeft() {\n  if (!rightSelectedData.length) return;\n  for (let i = rightSelectedData.length; i > 0; i--) {\n    let idx = props.rightData.indexOf(rightSelectedData[i - 1]);\n    props.rightData.splice(idx, 1);\n    props.leftData.push(rightSelectedData[i - 1]);\n    rightSelectedData.pop();\n  }\n  let leftData = props.leftData\n  let rightData = props.rightData\n  emit(\"onChangeList\", {\n    leftData,\n    rightData\n  });\n}\n\nfunction moveRight() {\n  if (!leftSelectedData.length) return;\n  for (let i = leftSelectedData.length; i > 0; i--) {\n    let idx = props.leftData.indexOf(leftSelectedData[i - 1]);\n    props.leftData.splice(idx, 1);\n    props.rightData.push(leftSelectedData[i - 1]);\n    leftSelectedData.pop();\n  }\n  let leftData = props.leftData\n  let rightData = props.rightData\n  emit(\"onChangeList\", {\n    leftData,\n    rightData\n  })\n}\n\n\n</script>\n\n<style scoped>\n#app {\n  font-family: Avenir, Helvetica, Arial, sans-serif;\n  color: #2c3e50;\n  margin-top: 60px;\n}\n\n.container {\n  display: grid;\n  grid-template-columns: 30% 10% 30%;\n  align-items: center;\n}\n\n.container select {\n  height: 200px;\n  width: 100%;\n}\n\n.container .middle {\n  text-align: center;\n}\n\n.container button {\n  width: 80%;\n  margin-bottom: 5px;\n}\n</style>\n"
  },
  {
    "path": "resources/js/components/ExampleComponent.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row justify-content-center\">\n            <div class=\"col-md-8\">\n                <div class=\"card\">\n                    <div class=\"card-header\">Example Component</div>\n\n                    <div class=\"card-body\">\n                        I'm an example component.\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\n    export default {\n        mounted() {\n            console.log('Component mounted.')\n        }\n    }\n</script>\n"
  },
  {
    "path": "resources/js/components/Footer.vue",
    "content": "<template>\n    <footer class=\"footer footer-dark bg-dark\">\n        <div class=\"container text-center py-5\">\n            <p>\n                Laravel and Vue 3 Stater\n            </p>\n        </div>\n    </footer>\n</template>\n\n<script>\nexport default {\n    name: 'Footer'\n}\n</script>\n"
  },
  {
    "path": "resources/js/components/LocaleSwitcher.vue",
    "content": "<template>\n    <li v-if=\"Object.keys(locales).length > 1\" class=\"nav-item dropdown\">\n        <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\"\n           data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"\n        >\n            {{ locales[locale] }}\n        </a>\n        <div class=\"dropdown-menu\">\n            <a v-for=\"(value, key) in locales\" :key=\"key\" class=\"dropdown-item\" href=\"#\"\n               @click.prevent=\"setLocale(key)\"\n            >\n                {{ value }}\n            </a>\n        </div>\n    </li>\n</template>\n\n<script setup>\nimport {computed} from \"vue\";\nimport { useI18n } from 'vue-i18n'\nimport { loadMessages } from '@/plugins/i18n'\nimport {useLangStore} from \"@/store/lang\";\n\nconst store = useLangStore();\nconst i18n = useI18n({useScope: \"global\"});\n\nconst locale = computed(() => store.langLocale)\nconst locales = computed(() => store.langLocales)\n\nfunction setLocale(locale) {\n    if (i18n.locale !== locale) {\n        loadMessages(locale)\n        store.setLocale(locale)\n    }\n}\n\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/components/Nav.vue",
    "content": "<template>\n    <nav class=\"navbar navbar-expand-md navbar-light bg-white shadow-sm\">\n        <div class=\"container\">\n            <router-link to=\"/\" class=\"navbar-brand\">Laravel Vue Stater</router-link>\n            <a class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n            </a>\n            <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                <ul class=\"navbar-nav mt-2 mt-lg-0 me-auto mb-2 mb-lg-0\">\n                    <LocaleSwitcher />\n                </ul>\n                <ul class=\"navbar-nav mt-2 mt-lg-0 ms-auto\">\n                        <li class=\"nav-item\">\n                            <router-link to=\"/\" class=\"nav-link\" aria-current=\"page\">{{ $t('home') }}</router-link>\n                        </li>\n                        <li class=\"nav-item\">\n                            <router-link :to=\"{ name : 'public-posts.index'}\" class=\"nav-link\">Blog</router-link>\n                        </li>\n                    <template v-if=\"!user?.name\">\n                        <li class=\"nav-item\">\n                            <router-link class=\"nav-link\" to=\"/login\"\n                            >{{ $t('login') }}</router-link\n                            >\n                        </li>\n                        <li class=\"nav-item\">\n                            <router-link class=\"nav-link\" to=\"/register\">{{ $t('register') }}</router-link>\n                        </li>\n                    </template>\n                    <li v-if=\"user?.name\" class=\"nav-item dropdown\">\n                        <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                            {{ user.name }}\n                        </a>\n                        <ul class=\"dropdown-menu dropdown-menu-end\">\n                            <li><router-link class=\"dropdown-item\" to=\"/admin\">Admin</router-link></li>\n                            <li><router-link to=\"/admin/posts\" class=\"dropdown-item\">Post</router-link></li>\n                            <li><hr class=\"dropdown-divider\"></li>\n                            <li><a class=\"dropdown-item\" href=\"javascript:void(0)\" @click=\"logout\">Logout</a></li>\n                        </ul>\n                    </li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n</template>\n\n<script setup>\nimport useAuth from \"@/composables/auth\";\nimport {computed} from \"vue\";\nimport LocaleSwitcher from \"../components/LocaleSwitcher.vue\";\nimport {useAuthStore} from \"@/store/auth\";\nconst auth = useAuthStore()\n\nconst user = computed(() => auth.user);\nconst { processing, logout } = useAuth();\n</script>\n"
  },
  {
    "path": "resources/js/components/TextEditorComponent.vue",
    "content": "<script setup>\nimport {onBeforeMount, onMounted, ref, watch} from \"vue\";\nimport ClassicEditor from '@ckeditor/ckeditor5-build-classic';\nimport {component as CKEditor} from '@ckeditor/ckeditor5-vue';\n\nconst props = defineProps({\n    modelValue: String\n})\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst editorConfig = ref({\n    toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote' ],\n    heading: {\n        options: [\n            { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' },\n            { model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' },\n            { model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' }\n        ]\n    }\n})\n\nconst editorData = ref(props.modelValue || '')\n\nonMounted(() => {\n\n})\n\nwatch(editorData, () => {\n    console.log('sdddss')\n    emit('update:modelValue', editorData.value)\n})\n</script>\n\n<template>\n    <CKEditor :editor=\"ClassicEditor\" v-model=\"editorData\" :model-value=\"props.modelValue\" :config=\"editorConfig\"></CKEditor>\n</template>\n\n<style>\n.ck-editor__editable{\n    min-height: 260px;\n}\n</style>\n"
  },
  {
    "path": "resources/js/components/includes/AdminNavbar.vue",
    "content": "<template>\n    <nav class=\"navbar navbar-expand-lg sticky-top flex-md-nowrap shadow-sm\" style=\"background-color: #e3f2fd;\">\n        <div class=\"container-fluid\">\n            <router-link to=\"/\" class=\"navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6 nuxt-link-active mini\">\n                <span>Laravel Vue Stater</span>\n            </router-link>\n            <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\"\n                    data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\"\n                    aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n            </button>\n            <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                <ul class=\"navbar-nav ms-auto mb-2 mb-lg-0\">\n                    <!-- <li class=\"nav-item\">\n                        <router-link :to=\"{ name: 'posts.index' }\" class=\"nav-link active\" aria-current=\"page\">\n                            Posts\n                        </router-link>\n                    </li> -->\n                    <LocaleSwitcher/>\n                    <li class=\"nav-item dropdown\">\n                        <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\"\n                           aria-expanded=\"false\">\n                            Hi, {{ user.name }}\n                        </a>\n                        <ul class=\"dropdown-menu dropdown-menu-end border-0 shadow-sm\">\n                            <li>\n                                <router-link :to=\"{ name: 'profile.index' }\" class=\"dropdown-item\">Profile</router-link>\n                            </li>\n                            <li><a class=\"dropdown-item\" href=\"#\">Setting</a></li>\n                            <li>\n                                <hr class=\"dropdown-divider\">\n                            </li>\n                            <li><a class=\"dropdown-item\" :class=\"{ 'opacity-25': processing }\" :disabled=\"processing\"\n                                   href=\"javascript:void(0)\" @click=\"logout\">Logout</a></li>\n                        </ul>\n                    </li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n</template>\n\n<script setup>\nimport {computed} from \"vue\";\nimport useAuth from \"@/composables/auth\";\nimport LocaleSwitcher from \"../../components/LocaleSwitcher.vue\";\nimport {useAuthStore} from \"@/store/auth\";\n\nconst auth = useAuthStore()\n\nconst user = computed(() => auth.user)\nconst {processing, logout} = useAuth();\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/components/includes/AdminSidebar.vue",
    "content": "<template>\n    <nav class=\"bg-white sidebar\">\n        <div class=\"pt-3 sidebar-sticky\">\n            <ul id=\"menu\" class=\"nav flex-column mb-2\">\n                <li class=\"nav-item\">\n                    <router-link to=\"/admin\" class=\"nav-link\">\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-speedometer2\" viewBox=\"0 0 16 16\">\n                            <path d=\"M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z\"/>\n                            <path fill-rule=\"evenodd\" d=\"M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z\"/>\n                        </svg>\n                        <span class=\"d-none d-sm-inline ps-2\">Dashboard</span>\n                    </router-link>\n                </li>\n                <li v-if=\"can('user-list')\" class=\"nav-item\">\n                    <a href=\"#submenu2\" data-bs-toggle=\"collapse\" class=\"nav-link\">\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-people\" viewBox=\"0 0 16 16\">\n                            <path d=\"M15 14s1 0 1-1-1-4-5-4-5 3-5 4 1 1 1 1h8Zm-7.978-1A.261.261 0 0 1 7 12.996c.001-.264.167-1.03.76-1.72C8.312 10.629 9.282 10 11 10c1.717 0 2.687.63 3.24 1.276.593.69.758 1.457.76 1.72l-.008.002a.274.274 0 0 1-.014.002H7.022ZM11 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm3-2a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM6.936 9.28a5.88 5.88 0 0 0-1.23-.247A7.35 7.35 0 0 0 5 9c-4 0-5 3-5 4 0 .667.333 1 1 1h4.216A2.238 2.238 0 0 1 5 13c0-1.01.377-2.042 1.09-2.904.243-.294.526-.569.846-.816ZM4.92 10A5.493 5.493 0 0 0 4 13H1c0-.26.164-1.03.76-1.724.545-.636 1.492-1.256 3.16-1.275ZM1.5 5.5a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm3-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4Z\"/>\n                        </svg>\n                        <span class=\"d-none d-sm-inline ps-2\">User Manager</span>\n                    </a>\n                    <ul class=\"collapse nav flex-column ms-1\" id=\"submenu2\" data-bs-parent=\"#menu\">\n                        <li v-if=\"can('permission-list')\" class=\"nav-link w-100\">\n                            <router-link :to=\"{ name: 'permissions.index' }\" class=\"nav-link px-0\">\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-square-fill\" viewBox=\"0 0 16 16\">\n                                    <path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2z\"/>\n                                </svg>\n                                <span class=\"d-none d-sm-inline ps-2\">Permissions</span>\n                            </router-link>\n                        </li>\n                        <li v-if=\"can('role-list')\" class=\"nav-link\">\n                            <router-link :to=\"{ name: 'roles.index' }\" class=\"nav-link px-0\">\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-square-fill\" viewBox=\"0 0 16 16\">\n                                    <path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2z\"/>\n                                </svg>\n                                <span class=\"d-none d-sm-inline ps-2\">Roles</span>\n                            </router-link>\n                        </li>\n                        <li v-if=\"can('user-list')\" class=\"nav-link\">\n                            <router-link :to=\"{ name: 'users.index' }\" class=\"nav-link px-0\">\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-square-fill\" viewBox=\"0 0 16 16\">\n                                    <path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2z\"/>\n                                </svg>\n                                <span class=\"d-none d-sm-inline ps-2\">Users</span>\n                            </router-link>\n                        </li>\n                    </ul>\n                </li>\n                <li v-if=\"can('post-list')\" class=\"nav-item\">\n                    <router-link :to=\"{ name: 'posts.index' }\" class=\"nav-link\">\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-list\" viewBox=\"0 0 16 16\">\n                            <path fill-rule=\"evenodd\" d=\"M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z\"/>\n                        </svg>\n                        <span class=\"d-none d-sm-inline ps-2\">Posts</span>\n                    </router-link>\n                </li>\n                <li v-if=\"can('category-list')\" class=\"nav-item\">\n                    <router-link :to=\"{ name: 'categories.index' }\" class=\"nav-link\">\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-list\" viewBox=\"0 0 16 16\">\n                            <path fill-rule=\"evenodd\" d=\"M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z\"/>\n                        </svg>\n                        <span class=\"d-none d-sm-inline ps-2\">Categories</span>\n                    </router-link>\n                </li>\n                <li class=\"nav-item\">\n                    <router-link :to=\"{ name: 'browser_sessions.index' }\" class=\"nav-link\">\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-list\" viewBox=\"0 0 16 16\">\n                            <path fill-rule=\"evenodd\" d=\"M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z\"/>\n                        </svg>\n                        <span class=\"d-none d-sm-inline ps-2\">Browser Sessions</span>\n                    </router-link>\n                </li>\n                <li class=\"nav-item\">\n                    <router-link :to=\"{ name: 'activity_log.index' }\" class=\"nav-link\">\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-list\" viewBox=\"0 0 16 16\">\n                            <path fill-rule=\"evenodd\" d=\"M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z\"/>\n                        </svg>\n                        <span class=\"d-none d-sm-inline ps-2\">Activity Logs</span>\n                    </router-link>\n                </li>\n            </ul>\n        </div>\n    </nav>\n</template>\n\n<script setup>\nimport {useAbility} from '@casl/vue'\nconst {can} = useAbility();\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/components/includes/Breadcrumb.vue",
    "content": "<template>\n    <nav class=\"mx-2\">\n      <ol class=\"breadcrumb border-radius-0\">\n        <li\n          v-for=\"(crumb, ci) in crumbs\"\n          :key=\"ci\"\n          class=\"breadcrumb-item align-items-center\"\n        >\n          <router-link :to=\"crumb.href\" class=\"btn btn-link\" :class=\"{ disabled: isLast(ci) }\" @click=\"selected(crumb)\">\n            {{ crumb.text }}\n          </router-link>\n        </li>\n      </ol>\n    </nav>\n  </template>\n  \n  <script>\n  export default {\n    props: {\n      crumbs: {\n        type: Array,\n        required: true,\n      },\n    },\n    methods: {\n      isLast(index) {\n        return index === this.crumbs.length - 1;\n      },\n      selected(crumb) {\n        this.$emit('selected', crumb);\n      },\n    },\n  };\n  </script>\n   \n  <style scoped>\n  .breadcrumb {\n    background-color: white;\n    border: 1px solid rgba(0, 0, 0, 0.125);\n    border-radius: 0.37rem;\n  }\n  .breadcrumb-item + .breadcrumb-item::before {\n    float: none;\n  }\n  .border-radius-0{\n    border-radius: 0\n  }\n  </style>"
  },
  {
    "path": "resources/js/composables/activityLogs.js",
    "content": "import {ref, inject, computed} from 'vue'\nimport {useRoute, useRouter} from \"vue-router\";\nimport axios from \"axios\";\n\nexport default function useActivityLogs() {\n    const route = useRoute();\n    const router = useRouter();\n\n    const activities = ref();\n    const activeFilter = ref(route.query.filter || 'all');\n    const searchTerm = ref(route.query.search || '');\n    // Pagination\n    const currentPage = ref(parseInt(route.query.page) || 1); // Current page\n    const perPage = ref(15); // Items per page\n    const total = ref(0); // Total number of items\n\n    // Pagination Helpers\n    const totalPages = computed(() => Math.ceil(total.value / perPage.value));\n    const rangeStart = computed(() => (currentPage.value - 1) * perPage.value + 1);\n    const rangeEnd = computed(() =>\n        Math.min(currentPage.value * perPage.value, total.value)\n    );\n\n    const isLoading = ref(false)\n\n    const getActivityLogs = (() => {\n        const params = {\n            filter: activeFilter.value !== 'all' ? activeFilter.value : undefined,\n            search: searchTerm.value || undefined,\n            page: currentPage.value,\n            per_page: perPage.value,\n        };\n\n        axios.get(`/api/activity-logs/`, { params })\n            .then(({data}) => {\n                activities.value = data;\n                total.value = data.meta.total\n            })\n    });\n\n    const changePage = (page) => {\n        if (page >= 1 && page <= totalPages.value) {\n            currentPage.value = page;\n            applyFilters();\n        }\n    };\n\n    const updateFilter = (filter) => {\n        activeFilter.value = filter;\n        applyFilters();\n    };\n\n    const applyFilters = () => {\n        setTimeout(() => {\n            router.push({\n                query: {\n                    filter: activeFilter.value !== 'all' ? activeFilter.value : undefined,\n                    search: searchTerm.value || undefined,\n                    page: currentPage.value,\n                },\n            });\n        }, 300)\n    };\n\n    return {\n        getActivityLogs,\n        activities,\n        activeFilter,\n        isLoading,\n        rangeStart,\n        rangeEnd,\n        total,\n        currentPage,\n        totalPages,\n        changePage,\n        updateFilter,\n        searchTerm,\n        applyFilters,\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/auth.js",
    "content": "import { ref, reactive, inject } from 'vue'\nimport { useRouter } from \"vue-router\";\nimport { AbilityBuilder, createMongoAbility } from '@casl/ability';\nimport { ABILITY_TOKEN } from '@casl/vue';\nimport {useAuthStore} from \"@/store/auth\";\n\nlet user = reactive({\n    name: '',\n    email: '',\n})\n\nexport default function useAuth() {\n    const authStore = useAuthStore();\n    const processing = ref(false)\n    const validationErrors = ref({})\n    const router = useRouter()\n    const swal = inject('$swal')\n    const ability = inject(ABILITY_TOKEN)\n\n    const loginForm = reactive({\n        email: '',\n        password: '',\n        remember: false\n    })\n\n    const forgotForm = reactive({\n        email: '',\n    })\n\n    const resetForm = reactive({\n        email: '',\n        token: '',\n        password: '',\n        password_confirmation: ''\n    })\n\n    const registerForm = reactive({\n        name: '',\n        email: '',\n        password: '',\n        password_confirmation: ''\n    })\n\n    const submitLogin = async () => {\n        if (processing.value) return\n\n        processing.value = true\n        validationErrors.value = {}\n\n        await axios.post('/login', loginForm)\n            .then(async response => {\n                await authStore.getUser()\n                // await authStore.dispatch('auth/getUser')\n                await loginUser()\n                \n                // Check if email verification is required\n                if (response.data.email_verified === false) {\n                    swal({\n                        icon: 'warning',\n                        title: 'Email Verification Required',\n                        text: 'Please verify your email address to continue.',\n                        showConfirmButton: true,\n                    })\n                    await router.push({ name: 'auth.verify' })\n                } else {\n                    swal({\n                        icon: 'success',\n                        title: 'Login successfully',\n                        showConfirmButton: false,\n                        timer: 1500\n                    })\n                    await router.push({ name: 'admin.index' })\n                }\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => processing.value = false)\n    }\n\n    const submitRegister = async () => {\n        if (processing.value) return\n\n        processing.value = true\n        validationErrors.value = {}\n\n        await axios.post('/register', registerForm)\n            .then(async response => {\n                // await store.dispatch('auth/getUser')\n                // await loginUser()\n                swal({\n                    icon: 'success',\n                    title: 'Registration successfully',\n                    showConfirmButton: false,\n                    timer: 1500\n                })\n                await router.push({ name: 'auth.login' })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => processing.value = false)\n    }\n\n    const submitForgotPassword = async () => {\n        if (processing.value) return\n\n        processing.value = true\n        validationErrors.value = {}\n\n        await axios.post('/api/forget-password', forgotForm)\n            .then(async response => {\n                swal({\n                    icon: 'success',\n                    title: 'We have emailed your password reset link! Please check your mail inbox.',\n                    showConfirmButton: false,\n                    timer: 1500\n                })\n                // await router.push({ name: 'admin.index' })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => processing.value = false)\n    }\n\n    const submitResetPassword = async () => {\n        if (processing.value) return\n\n        processing.value = true\n        validationErrors.value = {}\n\n        await axios.post('/api/reset-password', resetForm)\n            .then(async response => {\n                swal({\n                    icon: 'success',\n                    title: 'Password successfully changed.',\n                    showConfirmButton: false,\n                    timer: 1500\n                })\n                await router.push({ name: 'auth.login' })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => processing.value = false)\n    }\n\n    const loginUser = () => {\n        user = authStore.user\n        // Cookies.set('loggedIn', true)\n        getAbilities()\n    }\n\n    const getUser = async () => {\n        if (authStore.authenticated) {\n            await authStore.getUser()\n            await loginUser()\n        }\n    }\n\n    const logout = async () => {\n        if (processing.value) return\n\n        processing.value = true\n\n        axios.post('/logout')\n            .then(response => {\n                user.name = ''\n                user.email = ''\n                authStore.logout()\n                router.push({ name: 'auth.login' })\n            })\n            .catch(error => {\n                // swal({\n                //     icon: 'error',\n                //     title: error.response.status,\n                //     text: error.response.statusText\n                // })\n            })\n            .finally(() => {\n                processing.value = false\n                // Cookies.remove('loggedIn')\n            })\n    }\n\n    const getAbilities = async() => {\n        await axios.get('/api/abilities')\n            .then(response => {\n                const permissions = response.data\n                const { can, rules } = new AbilityBuilder(createMongoAbility)\n\n                can(permissions)\n\n                ability.update(rules)\n            })\n    }\n\n    return {\n        loginForm,\n        registerForm,\n        forgotForm,\n        resetForm,\n        validationErrors,\n        processing,\n        submitLogin,\n        submitRegister,\n        submitForgotPassword,\n        submitResetPassword,\n        user,\n        getUser,\n        logout,\n        getAbilities\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/categories.js",
    "content": "import { ref, inject } from 'vue'\nimport { useRouter } from 'vue-router'\n\nexport default function useCategories() {\n    const categories = ref([])\n    const categoryList = ref([])\n    const category = ref({\n        name: ''\n    })\n\n    const router = useRouter()\n    const validationErrors = ref({})\n    const isLoading = ref(false)\n    const swal = inject('$swal')\n\n    const getCategories = async (\n        page = 1,\n        search_id = '',\n        search_title = '',\n        search_global = '',\n        order_column = 'created_at',\n        order_direction = 'desc'\n    ) => {\n        axios.get('/api/categories?page=' + page +\n            '&search_id=' + search_id +\n            '&search_title=' + search_title +\n            '&search_global=' + search_global +\n            '&order_column=' + order_column +\n            '&order_direction=' + order_direction)\n            .then(response => {\n                categories.value = response.data;\n            })\n    }\n\n    const getCategory = async (id) => {\n        axios.get('/api/categories/' + id)\n            .then(response => {\n                category.value = response.data.data;\n            })\n    }\n\n    const storeCategory = async (category) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.post('/api/categories', category)\n            .then(response => {\n                router.push({name: 'categories.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Category saved successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const updateCategory = async (category) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.put('/api/categories/' + category.id, category)\n            .then(response => {\n                router.push({name: 'categories.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Category updated successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const deleteCategory = async (id) => {\n        swal({\n            title: 'Are you sure?',\n            text: 'You won\\'t be able to revert this action!',\n            icon: 'warning',\n            showCancelButton: true,\n            confirmButtonText: 'Yes, delete it!',\n            confirmButtonColor: '#ef4444',\n            timer: 20000,\n            timerProgressBar: true,\n            reverseButtons: true\n        })\n            .then(result => {\n                if (result.isConfirmed) {\n                    axios.delete('/api/categories/' + id)\n                        .then(response => {\n                            getCategories()\n                            router.push({name: 'categories.index'})\n                            swal({\n                                icon: 'success',\n                                title: 'Category deleted successfully'\n                            })\n                        })\n                        .catch(error => {\n                            swal({\n                                icon: 'error',\n                                title: 'Something went wrong'\n                            })\n                        })\n                }\n            })\n    }\n\n    const getCategoryList = async () => {\n        axios.get('/api/category-list')\n            .then(response => {\n                categoryList.value = response.data.data;\n            })\n    }\n\n    return {\n        categoryList,\n        categories,\n        category,\n        getCategories,\n        getCategoryList,\n        getCategory,\n        storeCategory,\n        updateCategory,\n        deleteCategory,\n        validationErrors,\n        isLoading\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/permissions.js",
    "content": "import { ref, inject,markRaw } from 'vue'\nimport { useRouter } from 'vue-router'\n\nexport default function usePermissions() {\n    const permissions = ref([])\n    const allPermission = ref([])\n    const permission = ref({\n        name: ''\n    })\n\n    const router = useRouter()\n    const validationErrors = ref({})\n    const isLoading = ref(false)\n    const swal = inject('$swal')\n\n    const getPermissions = async (\n        page = 1,\n        search_id = '',\n        search_title = '',\n        search_global = '',\n        order_column = 'created_at',\n        order_direction = 'desc'\n    ) => {\n        axios.get('/api/permissions?page=' + page +\n            '&search_id=' + search_id +\n            '&search_title=' + search_title +\n            '&search_global=' + search_global +\n            '&order_column=' + order_column +\n            '&order_direction=' + order_direction)\n            .then(response => {\n                permissions.value = response.data;\n            })\n    }\n    const getAllPermissions = async () => {\n        axios.get('/api/permissions/')\n            .then(response => {\n                allPermission.value = response.data.data;\n            })\n    }\n    const getPermission = async (id) => {\n        axios.get('/api/permissions/' + id)\n            .then(response => {\n                permission.value = response.data.data;\n            })\n    }\n\n    const storePermission = async (permission) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.post('/api/permissions', permission)\n            .then(response => {\n                router.push({name: 'permissions.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Permission saved successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const updatePermission = async (permission) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.put('/api/permissions/' + permission.id, permission)\n            .then(response => {\n                router.push({name: 'permissions.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Permission updated successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const deletePermission = async (id) => {\n        swal({\n            title: 'Are you sure?',\n            text: 'You won\\'t be able to revert this action!',\n            icon: 'warning',\n            showCancelButton: true,\n            confirmButtonText: 'Yes, delete it!',\n            confirmButtonColor: '#ef4444',\n            timer: 20000,\n            timerProgressBar: true,\n            reverseButtons: true\n        })\n            .then(result => {\n                if (result.isConfirmed) {\n                    axios.delete('/api/permissions/' + id)\n                        .then(response => {\n                            getRoles()\n                            router.push({name: 'permissions.index'})\n                            swal({\n                                icon: 'success',\n                                title: 'Permission deleted successfully'\n                            })\n                        })\n                        .catch(error => {\n                            swal({\n                                icon: 'error',\n                                title: 'Something went wrong'\n                            })\n                        })\n                }\n            })\n    }\n\n    return {\n        permissions,\n        allPermission,\n        permission,\n        getAllPermissions,\n        getPermissions,\n        getPermission,\n        storePermission,\n        updatePermission,\n        deletePermission,\n        validationErrors,\n        isLoading\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/posts.js",
    "content": "import { ref, inject } from 'vue'\nimport { useRouter } from 'vue-router'\n\nexport default function usePosts() {\n    const posts = ref({})\n    const post = ref({\n        title: '',\n        content: '',\n        category_id: '',\n        thumbnail: ''\n    })\n    const router = useRouter()\n    const validationErrors = ref({})\n    const isLoading = ref(false)\n    const swal = inject('$swal')\n\n    const getPosts = async (\n        page = 1,\n        search_category = '',\n        search_id = '',\n        search_title = '',\n        search_content = '',\n        search_global = '',\n        order_column = 'created_at',\n        order_direction = 'desc'\n    ) => {\n        axios.get('/api/posts?page=' + page +\n            '&search_category=' + search_category +\n            '&search_id=' + search_id +\n            '&search_title=' + search_title +\n            '&search_content=' + search_content +\n            '&search_global=' + search_global +\n            '&order_column=' + order_column +\n            '&order_direction=' + order_direction)\n            .then(response => {\n                posts.value = response.data;\n            })\n    }\n\n    const getPost = async (id) => {\n        axios.get('/api/posts/' + id)\n            .then(response => {\n                post.value = response.data.data;\n            })\n    }\n\n    const storePost = async (post) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        let serializedPost = new FormData()\n        for (let item in post) {\n            if (post.hasOwnProperty(item)) {\n                serializedPost.append(item, post[item])\n            }\n        }\n\n        axios.post('/api/posts', serializedPost,{\n            headers: {\n                \"content-type\": \"multipart/form-data\"\n            }\n        })\n            .then(response => {\n                router.push({name: 'posts.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Post saved successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const updatePost = async (post) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.put('/api/posts/' + post.id, post)\n            .then(response => {\n                router.push({name: 'posts.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Post updated successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const deletePost = async (id) => {\n        swal({\n            title: 'Are you sure?',\n            text: 'You won\\'t be able to revert this action!',\n            icon: 'warning',\n            showCancelButton: true,\n            confirmButtonText: 'Yes, delete it!',\n            confirmButtonColor: '#ef4444',\n            timer: 20000,\n            timerProgressBar: true,\n            reverseButtons: true\n        })\n            .then(result => {\n                if (result.isConfirmed) {\n                    axios.delete('/api/posts/' + id)\n                        .then(response => {\n                            getPosts()\n                            router.push({name: 'posts.index'})\n                            swal({\n                                icon: 'success',\n                                title: 'Post deleted successfully'\n                            })\n                        })\n                        .catch(error => {\n                            swal({\n                                icon: 'error',\n                                title: 'Something went wrong'\n                            })\n                        })\n                }\n            })\n\n    }\n\n    return {\n        posts,\n        post,\n        getPosts,\n        getPost,\n        storePost,\n        updatePost,\n        deletePost,\n        validationErrors,\n        isLoading\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/profile.js",
    "content": "import { ref, inject } from 'vue'\nimport { useRouter } from 'vue-router'\nimport {useAuthStore} from \"@/store/auth\";\n\nexport default function useProfile() {\n\n    const profile = ref({\n        name: '',\n        email: '',\n    })\n\n    const store = useAuthStore()\n    const router = useRouter()\n    const validationErrors = ref({})\n    const isLoading = ref(false)\n    const swal = inject('$swal')\n\n    const getProfile = async () => {\n        profile.value = store.user\n        // axios.get('/api/user')\n        //     .then(({data}) => {\n        //         profile.value = data.data;\n        //     })\n    }\n\n    const updateProfile = async (profile) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.put('/api/user', profile)\n            .then(({data}) => {\n                if (data.success) {\n                    store.user = data.data\n                    // router.push({name: 'profile.index'})\n                    swal({\n                        icon: 'success',\n                        title: 'Profile updated successfully'\n                    })\n                }\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    return {\n        profile,\n        getProfile,\n        updateProfile,\n        validationErrors,\n        isLoading\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/roles.js",
    "content": "import {ref, inject} from 'vue'\nimport {useRouter} from 'vue-router'\n\nexport default function useRoles() {\n    const roles = ref([])\n    const role = ref({\n        name: ''\n    })\n    const roleList = ref([])\n    const rolePermissionList = ref([])\n    const router = useRouter()\n    const validationErrors = ref({})\n    const isLoading = ref(false)\n    const swal = inject('$swal')\n\n    const getRoles = async (\n        page = 1,\n        search_id = '',\n        search_title = '',\n        search_global = '',\n        order_column = 'created_at',\n        order_direction = 'desc'\n    ) => {\n        axios.get('/api/roles?page=' + page +\n            '&search_id=' + search_id +\n            '&search_title=' + search_title +\n            '&search_global=' + search_global +\n            '&order_column=' + order_column +\n            '&order_direction=' + order_direction)\n            .then(response => {\n                roles.value = response.data;\n            })\n    }\n\n    const getRole = async (id) => {\n        axios.get('/api/roles/' + id)\n            .then(response => {\n                role.value = response.data.data;\n            })\n    }\n    const getRolePermissions = async (id) => {\n\n        axios.get('/api/role-permissions/' + id)\n            .then(response => {\n                rolePermissionList.value = response.data.data;\n            })\n    }\n    const storeRole = async (role) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.post('/api/roles', role)\n            .then(response => {\n                router.push({name: 'roles.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Role saved successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const updateRole = async (role) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.put('/api/roles/' + role.id, role)\n            .then(response => {\n                router.push({name: 'roles.index'})\n                swal({\n                    icon: 'success',\n                    title: 'Role updated successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const updateRolePermissions = async (role, permissions) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n        axios.put('/api/role-permissions', {permissions: JSON.stringify(permissions), role_id: role.id})\n            // .then(response => {\n            //     router.push({name: 'roles.index'})\n            //     swal({\n            //         icon: 'success',\n            //         title: 'Role updated successfully'\n            //     })\n            // })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => {\n                isLoading.value = false\n                updateRole(role)\n            })\n    }\n\n\n    const deleteRole = async (id) => {\n        swal({\n            title: 'Are you sure?',\n            text: 'You won\\'t be able to revert this action!',\n            icon: 'warning',\n            showCancelButton: true,\n            confirmButtonText: 'Yes, delete it!',\n            confirmButtonColor: '#ef4444',\n            timer: 20000,\n            timerProgressBar: true,\n            reverseButtons: true\n        })\n            .then(result => {\n                if (result.isConfirmed) {\n                    axios.delete('/api/roles/' + id)\n                        .then(response => {\n                            getRoles()\n                            router.push({name: 'roles.index'})\n                            swal({\n                                icon: 'success',\n                                title: 'Role deleted successfully'\n                            })\n                        })\n                        .catch(error => {\n                            swal({\n                                icon: 'error',\n                                title: 'Something went wrong'\n                            })\n                        })\n                }\n            })\n    }\n\n    const getRoleList = async () => {\n        axios.get('/api/role-list')\n            .then(response => {\n                roleList.value = response.data.data;\n            })\n    }\n\n    return {\n        roles,\n        role,\n        roleList,\n        getRoleList,\n        getRoles,\n        rolePermissionList,\n        getRolePermissions,\n        getRole,\n        storeRole,\n        updateRole,\n        updateRolePermissions,\n        deleteRole,\n        validationErrors,\n        isLoading\n    }\n}\n"
  },
  {
    "path": "resources/js/composables/users.js",
    "content": "import { ref, inject } from 'vue'\nimport { useRouter } from 'vue-router'\n\nexport default function useUsers() {\n    const users = ref([])\n    const user = ref({\n        name: ''\n    })\n\n    const router = useRouter()\n    const validationErrors = ref({})\n    const isLoading = ref(false)\n    const swal = inject('$swal')\n\n    const getUsers = async (\n        page = 1,\n        search_id = '',\n        search_title = '',\n        search_global = '',\n        order_column = 'created_at',\n        order_direction = 'desc'\n    ) => {\n        axios.get('/api/users?page=' + page +\n            '&search_id=' + search_id +\n            '&search_title=' + search_title +\n            '&search_global=' + search_global +\n            '&order_column=' + order_column +\n            '&order_direction=' + order_direction)\n            .then(response => {\n                users.value = response.data;\n            })\n    }\n\n    const getUser = async (id) => {\n        axios.get('/api/users/' + id)\n            .then(response => {\n                user.value = response.data.data;\n            })\n    }\n\n    const storeUser = async (user) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        let serializedPost = new FormData()\n        for (let item in user) {\n            if (user.hasOwnProperty(item)) {\n                serializedPost.append(item, user[item])\n            }\n        }\n\n        axios.post('/api/users', serializedPost)\n            .then(response => {\n                router.push({name: 'users.index'})\n                swal({\n                    icon: 'success',\n                    title: 'User saved successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const updateUser = async (user) => {\n        if (isLoading.value) return;\n\n        isLoading.value = true\n        validationErrors.value = {}\n\n        axios.put('/api/users/' + user.id, user)\n            .then(response => {\n                router.push({name: 'users.index'})\n                swal({\n                    icon: 'success',\n                    title: 'User updated successfully'\n                })\n            })\n            .catch(error => {\n                if (error.response?.data) {\n                    validationErrors.value = error.response.data.errors\n                }\n            })\n            .finally(() => isLoading.value = false)\n    }\n\n    const deleteUser = async (id) => {\n        swal({\n            title: 'Are you sure?',\n            text: 'You won\\'t be able to revert this action!',\n            icon: 'warning',\n            showCancelButton: true,\n            confirmButtonText: 'Yes, delete it!',\n            confirmButtonColor: '#ef4444',\n            timer: 20000,\n            timerProgressBar: true,\n            reverseButtons: true\n        })\n            .then(result => {\n                if (result.isConfirmed) {\n                    axios.delete('/api/users/' + id)\n                        .then(response => {\n                            getUsers()\n                            router.push({name: 'users.index'})\n                            swal({\n                                icon: 'success',\n                                title: 'User deleted successfully'\n                            })\n                        })\n                        .catch(error => {\n                            swal({\n                                icon: 'error',\n                                title: 'Something went wrong'\n                            })\n                        })\n                }\n            })\n    }\n\n    return {\n        users,\n        user,\n        getUsers,\n        getUser,\n        storeUser,\n        updateUser,\n        deleteUser,\n        validationErrors,\n        isLoading\n    }\n}\n"
  },
  {
    "path": "resources/js/lang/bn.json",
    "content": "{\n    \"welcome_starter_title\": \"Laravel Vue 3 Starter-এ স্বাগতম\",\n    \"ok\": \"Ok\",\n    \"cancel\": \"Cancel\"\n}\n"
  },
  {
    "path": "resources/js/lang/en.json",
    "content": "{\n    \"welcome_starter_title\": \"Welcome to Laravel Vue 3 Boilerplate\",\n    \"ok\": \"Ok\",\n    \"cancel\": \"Cancel\",\n    \"error_alert_title\": \"Oops...\",\n    \"error_alert_text\": \"Something went wrong! Please try again.\",\n    \"token_expired_alert_title\": \"Session Expired!\",\n    \"token_expired_alert_text\": \"Please log in again to continue.\",\n    \"login\": \"Log In\",\n    \"register\": \"Register\",\n    \"page_not_found\": \"Page Not Found\",\n    \"go_home\": \"Go Home\",\n    \"logout\": \"Logout\",\n    \"email\": \"Email\",\n    \"remember_me\": \"Remember Me\",\n    \"password\": \"Password\",\n    \"forgot_password\": \"Forgot Your Password?\",\n    \"confirm_password\": \"Confirm Password\",\n    \"name\": \"Name\",\n    \"toggle_navigation\": \"Toggle navigation\",\n    \"home\": \"Home\",\n    \"you_are_logged_in\": \"You are logged in!\",\n    \"reset_password\": \"Reset Password\",\n    \"send_password_reset_link\": \"Send Password Reset Link\",\n    \"settings\": \"Settings\",\n    \"profile\": \"Profile\",\n    \"your_info\": \"Your Info\",\n    \"info_updated\": \"Your info has been updated!\",\n    \"update\": \"Update\",\n    \"your_password\": \"Your Password\",\n    \"password_updated\": \"Your password has been updated!\",\n    \"new_password\": \"New Password\",\n    \"login_with\": \"Login with\",\n    \"register_with\": \"Register with\",\n    \"verify_email\": \"Verify Email\",\n    \"send_verification_link\": \"Send Verification Link\",\n    \"resend_verification_link\": \"Resend Verification Link ?\",\n    \"failed_to_verify_email\": \"Failed to verify email.\",\n    \"verify_email_address\": \"We sent you an email with an the verification link.\",\n    \"verify_your_email_address\": \"Verify Your Email Address\",\n    \"fresh_verification_link_sent\": \"A fresh verification link has been sent to your email address.\",\n    \"before_proceeding_check_email\": \"Before proceeding, please check your email for a verification link.\",\n    \"if_you_did_not_receive_the_email\": \"If you did not receive the email\",\n    \"click_here_to_request_another\": \"click here to request another\",\n    \"verifying_email\": \"Verifying your email...\",\n    \"email_verified_successfully\": \"Your email has been verified successfully!\",\n    \"redirecting_to_dashboard\": \"Redirecting to dashboard...\",\n    \"verification_link_invalid\": \"The verification link is invalid or has expired.\"\n}\n"
  },
  {
    "path": "resources/js/lang/es.json",
    "content": "{\n    \"welcome_starter_title\": \"Bienvenido a Laravel Vue 3 Starter\",\n    \"ok\": \"De Acuerdo\",\n    \"cancel\": \"Cancelar\",\n    \"error_alert_title\": \"Ha ocurrido un problema\",\n    \"error_alert_text\": \"¡Algo salió mal! Inténtalo de nuevo.\",\n    \"token_expired_alert_title\": \"!Sesión Expirada!\",\n    \"token_expired_alert_text\": \"Por favor inicie sesión de nuevo para continuar.\",\n    \"login\": \"Iniciar Sesión\",\n    \"register\": \"Registro\",\n    \"page_not_found\": \"Página No Encontrada\",\n    \"go_home\": \"Ir a Inicio\",\n    \"logout\": \"Cerrar Sesión\",\n    \"email\": \"Correo Electrónico\",\n    \"remember_me\": \"Recuérdame\",\n    \"password\": \"Contraseña\",\n    \"forgot_password\": \"¿Olvidaste tu contraseña?\",\n    \"confirm_password\": \"Confirmar Contraseña\",\n    \"name\": \"Nombre\",\n    \"toggle_navigation\": \"Cambiar Navegación\",\n    \"home\": \"Inicio\",\n    \"you_are_logged_in\": \"¡Has iniciado sesión!\",\n    \"reset_password\": \"Restablecer la contraseña\",\n    \"send_password_reset_link\": \"Enviar Enlace de Restablecimiento de Contraseña\",\n    \"settings\": \"Configuraciones\",\n    \"profile\": \"Perfil\",\n    \"your_info\": \"Tu Información\",\n    \"info_updated\": \"¡Tu información ha sido actualizada!\",\n    \"update\": \"Actualizar\",\n    \"your_password\": \"Tu Contraseña\",\n    \"password_updated\": \"¡Tu contraseña ha sido actualizada!\",\n    \"new_password\": \"Nueva Contraseña\",\n    \"login_with\": \"Iniciar Sesión con\",\n    \"register_with\": \"Registro con\"\n}\n"
  },
  {
    "path": "resources/js/lang/fr.json",
    "content": "{\n    \"welcome_starter_title\": \"Bienvenue dans Laravel Vue 3 Starter\",\n    \"ok\": \"Ok\",\n    \"cancel\": \"Annuler\",\n    \"error_alert_title\": \"Oups...\",\n    \"error_alert_text\": \"Quelque chose a mal tourné ! Veuillez réessayer.\",\n    \"token_expired_alert_title\": \"Session expirée !\",\n    \"token_expired_alert_text\": \"Veuillez vous reconnecter pour continuer.\",\n    \"login\": \"Connexion\",\n    \"register\": \"Inscription\",\n    \"page_not_found\": \"Page non trouvée\",\n    \"go_home\": \"Retour à l'accueil\",\n    \"logout\": \"Déconnexion\",\n    \"email\": \"Email\",\n    \"remember_me\": \"Se souvenir de moi\",\n    \"password\": \"Mot de passe\",\n    \"forgot_password\": \"Vous avez oublié votre mot de passe ?\",\n    \"confirm_password\": \"Confirmer le mot de passe\",\n    \"name\": \"Nom\",\n    \"toggle_navigation\": \"Basculer la navigation\",\n    \"home\": \"Accueil\",\n    \"you_are_logged_in\": \"Vous êtes connecté !\",\n    \"reset_password\": \"Réinitialisation du mot de passe\",\n    \"send_password_reset_link\": \"Envoyer le lien de réinitialisation du mot de passe\",\n    \"settings\": \"Paramètres\",\n    \"profile\": \"Profil\",\n    \"your_info\": \"Vos informations\",\n    \"info_updated\": \"Vos informations ont été mises à jour !\",\n    \"update\": \"Mettre à jour\",\n    \"your_password\": \"Votre mot de passe\",\n    \"password_updated\": \"Votre mot de passe a été mis à jour !\",\n    \"new_password\": \"Nouveau mot de passe\",\n    \"login_with\": \"Connectez-vous avec\",\n    \"register_with\": \"S'inscrire avec\",\n    \"verify_email\": \"Vérifier l'e-mail\",\n    \"send_verification_link\": \"Envoyer le lien de vérification\",\n    \"resend_verification_link\": \"Renvoyer le lien de vérification ?\",\n    \"failed_to_verify_email\": \"Nous n'avons pas réussi à vérifier votre email.\",\n    \"verify_email_address\": \"Nous vous avons envoyé un e-mail avec un lien de vérification.\",\n    \"verify_your_email_address\": \"Verify Your Email Address\",\n    \"fresh_verification_link_sent\": \"A fresh verification link has been sent to your email address.\",\n    \"before_proceeding_check_email\": \"Before proceeding, please check your email for a verification link.\",\n    \"if_you_did_not_receive_the_email\": \"If you did not receive the email\",\n    \"click_here_to_request_another\": \"click here to request another\",\n    \"verifying_email\": \"Verifying your email...\",\n    \"email_verified_successfully\": \"Your email has been verified successfully!\",\n    \"redirecting_to_dashboard\": \"Redirecting to dashboard...\",\n    \"verification_link_invalid\": \"The verification link is invalid or has expired.\"\n}\n"
  },
  {
    "path": "resources/js/lang/pt-BR.json",
    "content": "{\n    \"welcome_starter_title\": \"Bem-vindo ao Laravel Vue 3 Starter\",\n    \"ok\": \"Ok\",\n    \"cancel\": \"Cancelar\",\n    \"error_alert_title\": \"Oops...\",\n    \"error_alert_text\": \"Algo deu errado! Por favor, tente novamente.\",\n    \"token_expired_alert_title\": \"Sessão expirada!\",\n    \"token_expired_alert_text\": \"Faça login novamente para continuar.\",\n    \"login\": \"Entrar\",\n    \"register\": \"Cadastrar\",\n    \"page_not_found\": \"Página não encontrada\",\n    \"go_home\": \"Inicio\",\n    \"logout\": \"Sair\",\n    \"email\": \"Email\",\n    \"remember_me\": \"Lembre-me\",\n    \"password\": \"Senha\",\n    \"forgot_password\": \"Esqueceu sua senha?\",\n    \"confirm_password\": \"Confirmar Senha\",\n    \"name\": \"Nome\",\n    \"toggle_navigation\": \"Alternar de navegação\",\n    \"home\": \"Inicio\",\n    \"you_are_logged_in\": \"Você está logado!\",\n    \"reset_password\": \"Trocar Senha\",\n    \"send_password_reset_link\": \"Enviar link de redefinição de senha\",\n    \"settings\": \"Configurações\",\n    \"profile\": \"Perfil\",\n    \"your_info\": \"Suas informações\",\n    \"info_updated\": \"Suas informações foram atualizadas!\",\n    \"update\": \"Atualizar\",\n    \"your_password\": \"Sua senha\",\n    \"password_updated\": \"Sua senha foi atualizada!\",\n    \"new_password\": \"Nova Senha\",\n    \"login_with\": \"Entrar\",\n    \"register_with\": \"Registre-se\",\n    \"verify_email\": \"verificar email\",\n    \"send_verification_link\": \"Enviar link de verificação\",\n    \"resend_verification_link\": \"Reenviar link de verificação?\",\n    \"failed_to_verify_email\": \"Falha ao verificar o email.\",\n    \"verify_email_address\": \"Enviamos um e-mail com o link de verificação.\",\n    \"verify_your_email_address\": \"Verify Your Email Address\",\n    \"fresh_verification_link_sent\": \"A fresh verification link has been sent to your email address.\",\n    \"before_proceeding_check_email\": \"Before proceeding, please check your email for a verification link.\",\n    \"if_you_did_not_receive_the_email\": \"If you did not receive the email\",\n    \"click_here_to_request_another\": \"click here to request another\",\n    \"verifying_email\": \"Verifying your email...\",\n    \"email_verified_successfully\": \"Your email has been verified successfully!\",\n    \"redirecting_to_dashboard\": \"Redirecting to dashboard...\",\n    \"verification_link_invalid\": \"The verification link is invalid or has expired.\"\n}\n"
  },
  {
    "path": "resources/js/lang/zh-CN.json",
    "content": "{\n    \"welcome_starter_title\": \"欢迎来到Laravel Vue 3入门版\",\n    \"ok\": \"确定\",\n    \"cancel\": \"取消\",\n    \"error_alert_title\": \"错误...\",\n    \"error_alert_text\": \"遇到一些错误，请稍后重试~\",\n    \"token_expired_alert_title\": \"验证过期!\",\n    \"token_expired_alert_text\": \"请稍后重新登录系统\",\n    \"login\": \"登录\",\n    \"register\": \"注册\",\n    \"page_not_found\": \"页面不存在\",\n    \"go_home\": \"返回首页\",\n    \"logout\": \"退出\",\n    \"email\": \"邮箱\",\n    \"remember_me\": \"记住我\",\n    \"password\": \"密码\",\n    \"forgot_password\": \"忘记密码？\",\n    \"confirm_password\": \"重复密码\",\n    \"name\": \"用户名\",\n    \"toggle_navigation\": \"切换导航\",\n    \"home\": \"首页\",\n    \"you_are_logged_in\": \"您已经登录!\",\n    \"reset_password\": \"重置密码\",\n    \"send_password_reset_link\": \"发送重置链接\",\n    \"settings\": \"设置\",\n    \"profile\": \"个人设置\",\n    \"your_info\": \"您的个人信息\",\n    \"info_updated\": \"您的个人信息已经更改!\",\n    \"update\": \"更新\",\n    \"your_password\": \"您的密码\",\n    \"password_updated\": \"您的密码已经更新!\",\n    \"new_password\": \"新密码\",\n    \"login_with\": \"登录\",\n    \"register_with\": \"注册\"\n}\n"
  },
  {
    "path": "resources/js/layouts/Admin.vue",
    "content": "<template>\n    <nav class=\"navbar navbar-expand-lg navbar-dark bg-primary\">\n        <div class=\"container-fluid\">\n            <a class=\"navbar-brand\" href=\"#\">Laravel Vue Stater</a>\n            <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n            </button>\n            <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                    <li class=\"nav-item\">\n                        <router-link :to=\"{ name: 'posts.index' }\" class=\"nav-link active\" aria-current=\"page\">\n                            Posts\n                        </router-link>\n                    </li>\n                    <li class=\"nav-item\">\n                        <router-link :to=\"{ name: 'posts.create' }\" class=\"nav-link\">\n                            Create Post\n                        </router-link>\n                    </li>\n                </ul>\n                <form class=\"d-flex\" role=\"search\">\n                    <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n                    <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n                </form>\n                <ul class=\"navbar-nav ms-auto mb-2 mb-lg-0\">\n                    <li class=\"nav-item dropdown\">\n                        <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                            Hi, {{ user.name }}\n                        </a>\n                        <ul class=\"dropdown-menu dropdown-menu-end\">\n                            <li><a class=\"dropdown-item\" href=\"#\">Profile</a></li>\n                            <li><a class=\"dropdown-item\" href=\"#\">Setting</a></li>\n                            <li><hr class=\"dropdown-divider\"></li>\n                            <li><a class=\"dropdown-item\" :class=\"{ 'opacity-25': processing }\" :disabled=\"processing\" href=\"javascript:void(0)\" @click=\"logout\">Logout</a></li>\n                        </ul>\n                    </li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n\n    <div class=\"container my-5\">\n        <h2 class=\"fw-semibold\">\n            {{ currentPageTitle }}\n        </h2>\n        <!-- Page Content -->\n        <div class=\"main\">\n            <router-view></router-view>\n        </div>\n    </div>\n</template>\n\n<script setup>\n    import { computed } from \"vue\";\n    import useAuth from \"@/composables/auth\";\n\n    const { user, processing, logout } = useAuth();\n    const currentPageTitle = computed(() => { return this.$route.meta.title})\n\n</script>\n"
  },
  {
    "path": "resources/js/layouts/Authenticated.vue",
    "content": "<template>\n    <AdminNavbar />\n    <div class=\"d-flex align-items-stretch w-100\">\n        <AdminSidebar />\n        <div class=\"container-fluid\">\n            <Breadcrumb class=\"row justify-content-center mt-4\" :crumbs=\"crumbs\" @selected=\"selected\" />\n            <!-- <h2 class=\"fw-semibold\">\n                {{ crumbs }}\n            </h2> -->\n            <!-- Page Content -->\n            <div class=\"main\">\n                <Suspense>\n                <router-view></router-view>\n                </Suspense>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport {computed} from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport AdminNavbar from \"../components/includes/AdminNavbar.vue\";\nimport AdminSidebar from \"../components/includes/AdminSidebar.vue\";\nimport Breadcrumb from \"../components/includes/Breadcrumb.vue\";\n\nconst route = useRoute();\n\nconst crumbs = computed(() => {\n    let pathArray = route.path.split('/')\n      pathArray.shift()\n      const breadCrumbs = [{ \"href\": \"/admin\", \"disabled\": false, \"text\": \"Dashboard\" }]\n      // needed to handle the intermediary entries for nested vue routes\n      let breadcrumb = ''\n      let lastIndexFound = 0\n      for (let i = 0; i < pathArray.length; ++i) {\n        breadcrumb = `${breadcrumb}${'/'}${pathArray[i]}`\n        if (route.matched[i] &&\n          Object.hasOwnProperty.call(route.matched[i], 'meta') &&\n          Object.hasOwnProperty.call(route.matched[i].meta, 'breadCrumb')) {\n          breadCrumbs.push({\n            href: i !== 0 && pathArray[i - (i - lastIndexFound)]\n              ? '/' + pathArray[i - (i - lastIndexFound)] + breadcrumb\n              : breadcrumb,\n            disabled: i + 1 === pathArray.length,\n            text: route.matched[i].meta.breadCrumb || pathArray[i]\n          })\n          lastIndexFound = i\n          breadcrumb = ''\n        }\n      }\n      return breadCrumbs\n});\n\nfunction selected(crumb) {\n    // console.log(crumb);\n}\n\n</script>\n\n<style scoped>\n.navbar-brand {\n    padding-top: .2rem;\n    padding-bottom: .2rem;\n    min-width: 250px;\n    max-width: 250px;\n    align-self: stretch;\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n    transition: all .3s linear;\n}\n\n.main-content, .sidebar {\n    height: calc(100vh - 56px);\n    overflow-x: hidden;\n    overflow-y: auto;\n}\n\n.sidebar {\n    position: relative;\n    z-index: 100;\n    box-shadow: 1px 0 10px rgba(0, 0, 0, .1);\n    min-width: 250px;\n    max-width: 250px;\n    transition: all .3s linear;\n}\n\n.sidebar.mini {\n    min-width: 60px;\n    max-width: 60px;\n}\n\n.sidebar ul li a.active, .sidebar ul li a:hover {\n    color: #4a6cf7;\n    border-color: rgba(74, 108, 247, 0.15);\n    background: rgba(74, 108, 247, 0.1);\n}\n\n@media (max-width: 767.98px) {\n    .navbar-brand, .sidebar {\n        min-width: 60px;\n        max-width: 60px;\n    }\n\n    .navbar-brand {\n        min-width: 60px;\n        max-width: 60px;\n    }\n\n    .navbar-brand span {\n        min-width: 20px;\n        max-width: 20px;\n        font-weight: 900;\n        overflow: hidden;\n    }\n}\n</style>\n"
  },
  {
    "path": "resources/js/layouts/Error.vue",
    "content": "<template>\n    <nav class=\"navbar navbar-expand-lg bg-light\">\n        <div class=\"container-fluid\">\n            <a class=\"navbar-brand\" href=\"/\">Navbar</a>\n            <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n            </button>\n            <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                    <li class=\"nav-item\">\n                        <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n                    </li>\n                    <li class=\"nav-item\">\n                        <a class=\"nav-link\" href=\"#\">Link</a>\n                    </li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n    <div class=\"container\">\n        <div>\n            <router-view></router-view>\n        </div>\n    </div>\n</template>\n"
  },
  {
    "path": "resources/js/layouts/Guest.vue",
    "content": "<template>\n    <Navbar/>\n    <router-view></router-view>\n</template>\n<script setup>\nimport Navbar from '../components/Nav.vue'\n\n</script>\n"
  },
  {
    "path": "resources/js/plugins/i18n.js",
    "content": "import {createI18n} from 'vue-i18n'\nimport {useLangStore} from \"@/store/lang\";\n\nconst i18n = createI18n({\n    legacy: false, // you must set `false`, to use Composition API\n    globalInjection: true,\n    runtimeOnly: false,\n    locale: 'en', // set locale\n    fallbackLocale: 'en', // set fallback locale\n    messages: {} // set locale messages\n})\n\n/**\n * @param {String} locale\n */\nexport async function loadMessages(locale) {\n    if (Object.keys(i18n.global.getLocaleMessage(locale)).length === 0) {\n        const messages = await import(/* webpackChunkName: '' */ `../lang/${locale}.json`);\n        i18n.global.setLocaleMessage(locale, messages);\n    }\n    if (i18n.locale !== locale) {\n        i18n.locale = locale\n        i18n.global.locale.value = locale;\n    }\n}\n\n(async () => {\n    try {\n        // Load initial locale message (e.g., 'en')\n        await loadMessages('en');\n\n        const store = await useLangStore();\n        const { langLocale } = store;\n\n        // Update messages based on store locale\n        if (langLocale !== i18n.locale) {\n            await loadMessages(langLocale);\n        }\n    } catch (error) {\n        console.error('Error loading messages:', error);\n    }\n})();\n\nexport default i18n;\n"
  },
  {
    "path": "resources/js/routes/index.js",
    "content": "import { createRouter, createWebHistory } from \"vue-router\";\nimport routes from './routes.js'\n\nconst router = createRouter({\n    history: createWebHistory(),\n    routes\n})\n\n/*router.beforeEach((to, from, next) => {\n\n    if (store.getters.user) {\n        if (to.matched.some(route => route.meta.guard === 'guest')) next({ name: 'home' })\n        else next();\n\n    } else {\n        if (to.matched.some(route => route.meta.guard === 'auth')) next({ name: 'login' })\n        else next();\n    }\n})*/\n\nexport default router;\n"
  },
  {
    "path": "resources/js/routes/routes.js",
    "content": "import {useAuthStore} from \"@/store/auth\";\n\nconst AuthenticatedLayout = () => import('../layouts/Authenticated.vue')\nconst GuestLayout = ()  => import('../layouts/Guest.vue');\n\nconst PostsIndex  = ()  => import('../views/admin/posts/Index.vue');\nconst PostsCreate  = ()  => import('../views/admin/posts/Create.vue');\nconst PostsEdit  = ()  => import('../views/admin/posts/Edit.vue');\n\nfunction requireLogin(to, from, next) {\n    const auth = useAuthStore()\n    let isLogin = false;\n    isLogin = !!auth.authenticated;\n\n    if (isLogin) {\n        next()\n    } else {\n        next('/login')\n    }\n}\n\nfunction guest(to, from, next) {\n    const auth = useAuthStore()\n    let isLogin;\n    isLogin = !!auth.authenticated;\n\n    if (isLogin) {\n        next('/')\n    } else {\n        next()\n    }\n}\n\nexport default [\n    {\n        path: '/',\n        // redirect: { name: 'login' },\n        component: GuestLayout,\n        children: [\n            {\n                path: '/',\n                name: 'home',\n                component: () => import('../views/home/index.vue'),\n            },\n            {\n                path: 'posts',\n                name: 'public-posts.index',\n                component: () => import('../views/posts/index.vue'),\n            },\n            {\n                path: 'posts/:id',\n                name: 'public-posts.details',\n                component: () => import('../views/posts/details.vue'),\n            },\n            {\n                path: 'category/:id',\n                name: 'category-posts.index',\n                component: () => import('../views/category/posts.vue'),\n            },\n            {\n                path: 'login',\n                name: 'auth.login',\n                component: () => import('../views/login/Login.vue'),\n                beforeEnter: guest,\n            },\n            {\n                path: 'register',\n                name: 'auth.register',\n                component: () => import('../views/register/index.vue'),\n                beforeEnter: guest,\n            },\n            {\n                path: 'forgot-password',\n                name: 'auth.forgot-password',\n                component: () => import('../views/auth/passwords/Email.vue'),\n                beforeEnter: guest,\n            },\n            {\n                path: 'reset-password/:token',\n                name: 'auth.reset-password',\n                component: () => import('../views/auth/passwords/Reset.vue'),\n                beforeEnter: guest,\n            },\n            {\n                path: 'verify',\n                name: 'auth.verify',\n                component: () => import('../views/auth/Verify.vue'),\n            },\n            {\n                path: 'email/verify/:id/:hash',\n                name: 'auth.verify-email',\n                component: () => import('../views/auth/Verify.vue'),\n                // beforeEnter: requireLogin,\n            },\n        ]\n    },\n    {\n        path: '/admin',\n        component: AuthenticatedLayout,\n        // redirect: {\n        //     name: 'admin.index'\n        // },\n        beforeEnter: requireLogin,\n        children: [\n            {\n                name: 'admin.index',\n                path: '',\n                component: () => import('../views/admin/index.vue'),\n                meta: { breadCrumb: 'Admin' }\n            },\n            {\n                name: 'profile.index',\n                path: 'profile',\n                component: () => import('../views/admin/profile/index.vue'),\n                meta: { breadCrumb: 'Profile' }\n            },\n            {\n                name: 'posts.index',\n                path: 'posts',\n                component: PostsIndex,\n                meta: { breadCrumb: 'Posts' }\n            },\n            {\n                name: 'posts.create',\n                path: 'posts/create',\n                component: PostsCreate,\n                meta: { breadCrumb: 'Add new post' }\n            },\n            {\n                name: 'posts.edit',\n                path: 'posts/edit/:id',\n                component: PostsEdit,\n                meta: { breadCrumb: 'Edit post' }\n            },\n            {\n                name: 'categories.index',\n                path: 'categories',\n                component: () => import('../views/admin/categories/Index.vue'),\n                meta: { breadCrumb: 'Categories' }\n            },\n            {\n                name: 'categories.create',\n                path: 'categories/create',\n                component: () => import('../views/admin/categories/Create.vue'),\n                meta: { breadCrumb: 'Add new category' }\n            },\n            {\n                name: 'categories.edit',\n                path: 'categories/edit/:id',\n                component: () => import('../views/admin/categories/Edit.vue'),\n                meta: { breadCrumb: 'Edit Category' }\n            },\n            {\n                name: 'permissions.index',\n                path: 'permissions',\n                component: () => import('../views/admin/permissions/Index.vue'),\n                meta: { breadCrumb: 'Permissions' }\n            },\n            {\n                name: 'permissions.create',\n                path: 'permissions/create',\n                component: () => import('../views/admin/permissions/Create.vue'),\n                meta: { breadCrumb: 'Create Permission' }\n            },\n            {\n                name: 'permissions.edit',\n                path: 'permissions/edit/:id',\n                component: () => import('../views/admin/permissions/Edit.vue'),\n                meta: { breadCrumb: 'Permission Edit' }\n            },\n            {\n                name: 'roles.index',\n                path: 'roles',\n                component: () => import('../views/admin/roles/Index.vue'),\n                meta: { breadCrumb: 'Roles' }\n            },\n            {\n                name: 'roles.create',\n                path: 'roles/create',\n                component: () => import('../views/admin/roles/Create.vue'),\n                meta: { breadCrumb: 'Create Role' }\n            },\n            {\n                name: 'roles.edit',\n                path: 'roles/edit/:id',\n                component: () => import('../views/admin/roles/Edit.vue'),\n                meta: { breadCrumb: 'Role Edit' }\n            },\n            {\n                name: 'users.index',\n                path: 'users',\n                component: () => import('../views/admin/users/Index.vue'),\n                meta: { breadCrumb: 'Users' }\n            },\n            {\n                name: 'users.create',\n                path: 'users/create',\n                component: () => import('../views/admin/users/Create.vue'),\n                meta: { breadCrumb: 'Add New' }\n            },\n            {\n                name: 'users.edit',\n                path: 'users/edit/:id',\n                component: () => import('../views/admin/users/Edit.vue'),\n                meta: { breadCrumb: 'User Edit' }\n            },\n            {\n                name: 'browser_sessions.index',\n                path: 'browser-sessions',\n                component: () => import('../views/admin/browser-sessions/Index.vue'),\n                meta: { breadCrumb: 'Browser Sessions' }\n            },\n            {\n                name: 'activity_log.index',\n                path: 'activity-log-logs',\n                component: () => import('../views/admin/activity-log/Index.vue'),\n                meta: { breadCrumb: 'Activity Logs' }\n            },\n        ]\n    },\n    {\n        path: \"/:pathMatch(.*)*\",\n        name: 'NotFound',\n        component: () => import(\"../views/errors/404.vue\"),\n    },\n];\n"
  },
  {
    "path": "resources/js/services/ability.js",
    "content": "import { AbilityBuilder, createMongoAbility } from '@casl/ability'\n\nconst { can, cannot, build } = new AbilityBuilder(createMongoAbility);\n\nexport default build();\n"
  },
  {
    "path": "resources/js/store/auth.js",
    "content": "import {defineStore} from 'pinia'\nimport axios from 'axios';\nimport {ref} from \"vue\";\n\nexport const useAuthStore = defineStore('auth', () => {\n    const authenticated = ref(false)\n    const user = ref({})\n\n    const login = (() => {\n        return axios.get('/api/user').then(({data}) => {\n            user.value = data\n            authenticated.value = true\n        }).catch(({res}) => {\n            user.value = {}\n            authenticated.value = false\n        })\n    })\n\n    const getUser = (() => {\n        return axios.get('/api/user').then(({data}) => {\n            if (data.success) {\n                user.value = data.data\n                authenticated.value = true\n                // router.push({name: 'dashboard'})\n            } else {\n                user.value = {}\n                authenticated.value = false\n            }\n        }).catch(({res}) => {\n            user.value = {}\n            authenticated.value = false\n        })\n    })\n\n    const logout = (() => {\n        user.value = {}\n        authenticated.value = false\n    })\n\n    return {authenticated, user, login, getUser, logout}\n}, {\n    persist: true\n})\n"
  },
  {
    "path": "resources/js/store/lang.js",
    "content": "import Cookies from 'js-cookie'\nimport {defineStore} from \"pinia\";\nimport {ref} from \"vue\";\n\nexport const useLangStore = defineStore('lang', () => {\n    const { locale, locales } = window.config\n    const langLocale = ref(getLocale(locales, locale))\n    const langLocales = locales\n\n    const setLocale = (newLocale) => {\n        langLocale.value = newLocale\n        Cookies.set('locale', newLocale, { expires: 365 })\n    }\n\n    return { langLocale, langLocales, setLocale }\n}, {\n    persist: true\n})\n\n/**\n * @param  {String[]} locales\n * @param  {String} fallback\n * @return {String}\n */\nfunction getLocale (locales, fallback) {\n    const locale = Cookies.get('locale')\n\n    if (Object.prototype.hasOwnProperty.call(locales, locale)) {\n        return locale\n    } else if (locale) {\n        Cookies.remove('locale')\n    }\n\n    return fallback\n}\n"
  },
  {
    "path": "resources/js/validation/rules.js",
    "content": "const required = (value, args, { field }) => {\n    if (!value) {\n        return `The ${field} field is required.`\n    }\n\n    return true\n}\n\nconst email = (value, args, { field }) => {\n    if (!value) {\n        return `The ${field} field is required.`\n    }\n\n    return true\n}\n\nconst min = (value, [limit], { field }) => {\n    if (!value || !value.length) {\n        return true\n    }\n\n    if (value.length < limit) {\n        return `The ${field} must be at least ${limit} characters.`\n    }\n\n    return true\n}\n\nexport { required, min, email }\n"
  },
  {
    "path": "resources/js/views/admin/activity-log/Index.vue",
    "content": "<template>\n    <div class=\"container my-2\">\n        <div class=\"row justify-content-center\">\n            <div class=\"col-lg-12\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body p-4\">\n                        <!-- Header -->\n                        <div class=\"d-flex justify-content-between align-items-center mb-4\">\n                            <h4 class=\"mb-0\">Activity Logs</h4>\n                        </div>\n\n                        <!-- Search and Filter -->\n                        <div class=\"row g-3 mb-4\">\n                            <div class=\"col-md-6\">\n                                <div class=\"border-1 bg-white\">\n                                    <i class=\"fas fa-search text-muted me-2\"></i>\n                                    <input type=\"text\" v-model=\"searchTerm\" class=\"search-box\" placeholder=\"Search activities...\"\n                                           @input=\"applyFilters\"\n                                    >\n                                </div>\n                            </div>\n                            <div class=\"col-md-6\">\n                                <div class=\"d-flex gap-2 flex-wrap\">\n                                      <span\n                                          class=\"badge filter-badge px-3 py-2\"\n                                          :class=\"{ active: activeFilter === 'all' }\"\n                                          @click=\"updateFilter('all')\"\n                                      >\n                                        All\n                                      </span>\n                                    <span\n                                        class=\"badge filter-badge px-3 py-2\"\n                                        :class=\"{ active: activeFilter === 'created' }\"\n                                        @click=\"updateFilter('created')\"\n                                    >\n                                        Created\n                                    </span>\n                                    <span\n                                        class=\"badge filter-badge px-3 py-2\"\n                                        :class=\"{ active: activeFilter === 'updated' }\"\n                                        @click=\"updateFilter('updated')\"\n                                    >\n                                        Updated\n                                    </span>\n                                    <span\n                                        class=\"badge filter-badge px-3 py-2\"\n                                        :class=\"{ active: activeFilter === 'login' }\"\n                                        @click=\"updateFilter('login')\"\n                                    >\n                                        Login\n                                    </span>\n                                    <span\n                                        class=\"badge filter-badge px-3 py-2\"\n                                        :class=\"{ active: activeFilter === 'logout' }\"\n                                        @click=\"updateFilter('logout')\"\n                                    >\n                                        Logout\n                                    </span>\n                                </div>\n                            </div>\n                        </div>\n\n                        <!-- Activity Timeline -->\n                        <div class=\"activity-timeline\">\n                            <!-- Activity Item -->\n                            <template v-if=\"activities?.data?.length > 0\">\n                                <div v-for=\"activity in activities?.data\" class=\"activity-item bg-white\">\n                                    <div class=\"d-flex gap-3\">\n                                        <div class=\"activity-icon \"\n                                             :class=\"{\n                                                  'bg-success-soft text-success': activity.event === 'updated' || activity.event === 'created' || activity.event === 'login',\n                                                  'bg-warning-soft text-warning': activity.event === 'logout',\n                                                  'bg-danger-soft text-danger': activity.event === 'error',\n                                                  'bg-info-soft text-info': !['updated', 'created', 'login', 'logout', 'error'].includes(activity.event)\n                                             }\"\n                                        >\n                                            <i class=\"fas fa-user-check\"></i>\n                                        </div>\n                                        <div class=\"flex-grow-1\">\n                                            <div class=\"d-flex justify-content-between align-items-center mb-2\">\n                                                <h6 class=\"mb-0\">{{ activity.event }}</h6>\n                                                <span class=\"activity-date\">{{ activity.format_created_at }}</span>\n                                            </div>\n                                            <p class=\"text-muted mb-2\">{{ activity.description}}</p>\n                                            <div class=\"d-flex align-items-center\">\n                                                <div class=\"activity-user me-3\">\n                                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-person-circle\" viewBox=\"0 0 16 16\">\n                                                        <path d=\"M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0\"/>\n                                                        <path fill-rule=\"evenodd\" d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8m8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1\"/>\n                                                    </svg>\n                                                </div>\n                                                <span class=\"text-muted small\">IP: {{ activity?.properties?.ip }}</span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </template>\n                        </div>\n\n                        <!-- Pagination -->\n                        <!-- Pagination -->\n                        <div class=\"d-flex justify-content-between align-items-center mt-4\">\n                            <span class=\"text-muted small\">\n                              Showing {{ rangeStart }}-{{ rangeEnd }} of {{ total }}\n                            </span>\n                            <nav>\n                                <ul class=\"pagination pagination-sm mb-0\">\n                                    <!-- Previous Button -->\n                                    <li class=\"page-item\" :class=\"{ disabled: currentPage === 1 }\">\n                                        <a class=\"page-link\" href=\"#\" @click.prevent=\"changePage(currentPage - 1)\">\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-left-short\" viewBox=\"0 0 16 16\">\n                                                <path fill-rule=\"evenodd\" d=\"M12 8a.5.5 0 0 1-.5.5H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H11.5a.5.5 0 0 1 .5.5\"/>\n                                            </svg>\n                                        </a>\n                                    </li>\n\n                                    <!-- Page Numbers -->\n                                    <li\n                                        v-for=\"page in totalPages\"\n                                        :key=\"page\"\n                                        class=\"page-item\"\n                                        :class=\"{ active: page === currentPage }\"\n                                    >\n                                        <a class=\"page-link\" href=\"#\" @click.prevent=\"changePage(page)\">{{ page }}</a>\n                                    </li>\n\n                                    <!-- Next Button -->\n                                    <li class=\"page-item\" :class=\"{ disabled: currentPage === totalPages }\">\n                                        <a class=\"page-link\" href=\"#\" @click.prevent=\"changePage(currentPage + 1)\">\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-right-short\" viewBox=\"0 0 16 16\">\n                                                <path fill-rule=\"evenodd\" d=\"M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8\"/>\n                                            </svg>\n                                        </a>\n                                    </li>\n                                </ul>\n                            </nav>\n                        </div>\n\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport {watch} from 'vue'\nimport {useRoute} from \"vue-router\";\nimport useActivityLogs from '@/composables/activityLogs.js'\n\nconst {activities, getActivityLogs, activeFilter, searchTerm, currentPage, rangeStart, rangeEnd, totalPages, total, updateFilter, applyFilters, changePage} = useActivityLogs()\n\nconst route = useRoute();\n\nwatch(\n    () => route.query,\n    (newQuery) => {\n        activeFilter.value = newQuery?.filter || 'all';\n        searchTerm.value = newQuery?.search || '';\n        currentPage.value = parseInt(newQuery.page) || 1;\n        getActivityLogs()\n    },\n    {\n        deep: true,\n        immediate: true\n    }\n);\n\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/browser-sessions/Index.vue",
    "content": "<script setup>\nimport {inject, onMounted, ref} from \"vue\";\nimport axios from \"axios\";\nconst swal = inject('$swal')\n\nconst sessions = ref([])\n\nconst logOutOtherDevices = async () => {\n    const { value: password } = await swal.fire({\n        title: \"Are you sure?\",\n        input: \"password\",\n        inputPlaceholder: \"Enter your current password\",\n        inputAttributes: {\n            autocapitalize: \"off\",\n            autocorrect: \"off\",\n        },\n        icon: \"warning\",\n        showCancelButton: true,\n        confirmButtonText: \"Yes, log out!\",\n        confirmButtonColor: \"#ef4444\",\n        cancelButtonText: \"Cancel\",\n        reverseButtons: true,\n    });\n\n    if (password) {\n        try {\n            await axios.post(\"/api/logout-other-devices\",{\n                password: password\n            });\n            getBrowserSessions();\n            swal.fire({\n                icon: \"success\",\n                title: \"Logged out of other browser sessions.\",\n            });\n        } catch (error) {\n            swal.fire({\n                icon: \"error\",\n                title: \"Something went wrong\",\n            });\n        }\n    }\n};\n\nconst getBrowserSessions = (() => {\n    axios.get('/api/browser-sessions').then(({data}) => {\n        sessions.value = data;\n    })\n})\n\nonMounted(() => {\n    getBrowserSessions()\n})\n</script>\n\n<template>\n    <div class=\"container\">\n        <h2 class=\"text-center my-4\">Browser Sessions</h2>\n        <div class=\"row mb-2\">\n            <div class=\"card shadow-sm\">\n                <div class=\"card-body\">\n                    <p class=\"mb-3\">\n                        If necessary, you may logout of all of your other browser sessions across all of your devices.\n                        Some of your recent sessions are listed below; however, this list may not be exhaustive. If you\n                        feel your account has been compromised, you should also update your password.\n                    </p>\n\n                    <!-- Session List -->\n                    <ul class=\"list-group list-group-flush mb-4\">\n                        <li v-for=\"session in sessions\" class=\"list-group-item d-flex align-items-center\">\n                            <div class=\"flex-grow-1\">\n                                <div>\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" class=\"bi bi-display me-2\" viewBox=\"0 0 16 16\">\n                                        <path d=\"M0 4s0-2 2-2h12s2 0 2 2v6s0 2-2 2h-4q0 1 .25 1.5H11a.5.5 0 0 1 0 1H5a.5.5 0 0 1 0-1h.75Q6 13 6 12H2s-2 0-2-2zm1.398-.855a.76.76 0 0 0-.254.302A1.5 1.5 0 0 0 1 4.01V10c0 .325.078.502.145.602q.105.156.302.254a1.5 1.5 0 0 0 .538.143L2.01 11H14c.325 0 .502-.078.602-.145a.76.76 0 0 0 .254-.302 1.5 1.5 0 0 0 .143-.538L15 9.99V4c0-.325-.078-.502-.145-.602a.76.76 0 0 0-.302-.254A1.5 1.5 0 0 0 13.99 3H2c-.325 0-.502.078-.602.145\"/>\n                                    </svg>\n                                    <strong>{{ session?.device?.platform }} - {{ session?.device?.browser }}</strong></div>\n                                <div class=\"text-muted small\">{{ session?.ip_address }},\n                                    <span v-if=\"session?.is_current_device\" class=\"text-success\">This device</span>\n                                    <span v-else class=\"\">Last active {{ session?.last_active }}</span>\n                                </div>\n                            </div>\n                        </li>\n                    </ul>\n\n                    <!-- Logout Button -->\n                    <div class=\"d-grid\">\n                        <button\n                            class=\"btn btn-dark\"\n                            type=\"button\"\n                            @click=\"logOutOtherDevices\"\n                        >\n                            Logout Other Browser Sessions\n                        </button>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/admin/categories/Create.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-name\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"category.name\" id=\"post-name\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { reactive } from \"vue\";\n    import useCategories from \"../../../composables/categories\";\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\"\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required|min:3'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { storeCategory, validationErrors, isLoading } = useCategories()\n    const category = reactive({\n        name\n    })\n    function submitForm() {\n        validate().then(form => { if (form.valid) storeCategory(category) })\n    }\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/categories/Edit.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"category.name\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\nimport { onMounted, reactive, watchEffect } from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport useCategories from \"../../../composables/categories\";\nimport { useForm, useField, defineRule } from \"vee-validate\";\nimport { required, min } from \"@/validation/rules\"\ndefineRule('required', required)\ndefineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required|min:3'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors, resetForm } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { category: postData, getCategory, updateCategory, validationErrors, isLoading } = useCategories()\n    const category = reactive({\n        name\n    })\n    const route = useRoute()\n    function submitForm() {\n        validate().then(form => { if (form.valid) updateCategory(category) })\n    }\n    onMounted(() => {\n        getCategory(route.params.id)\n    })\n    // https://vuejs.org/api/reactivity-core.html#watcheffect\n    watchEffect(() => {\n        category.id = postData.value.id\n        category.name = postData.value.name\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/categories/Index.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-2\">\n        <div class=\"col-md-12\">\n            <div class=\"card border-0\">\n                <div class=\"card-header bg-transparent\">\n                    <h5 class=\"float-start\">Categories</h5>\n                    <router-link v-if=\"can('category-create')\" :to=\"{ name: 'categories.create' }\" class=\"btn btn-primary btn-sm float-end\">\n                        Create Category\n                    </router-link>\n                </div>\n                <div class=\"card-body shadow-sm\">\n                    <div class=\"mb-4\">\n                        <input v-model=\"search_global\" type=\"text\" placeholder=\"Search...\"\n                               class=\"form-control w-25\">\n                    </div>\n                    <div class=\"table-responsive\">\n                        <table class=\"table\">\n                            <thead>\n                            <tr>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_id\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by ID\">\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_title\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by Title\">\n                                </th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                            </tr>\n                            <tr>\n                                <th class=\"px-6 py-3 text-start\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('id')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'id' }\">\n                                            ID\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'id',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'id',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('title')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'title' }\">\n                                            Title\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'title',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'title',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'title',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'title',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <div class=\"flex flex-row items-center justify-between cursor-pointer\"\n                                         @click=\"updateOrdering('created_at')\">\n                                        <div class=\"leading-4 font-medium text-gray-500 uppercase tracking-wider\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'created_at' }\">\n                                            Created at\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'created_at',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'created_at',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    Actions\n                                </th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr v-for=\"post in categories.data\" :key=\"post.id\">\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.id }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.name }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.created_at }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <router-link v-if=\"can('category-edit')\"\n                                                 :to=\"{ name: 'categories.edit', params: { id: post.id } }\"\n                                                 class=\"badge bg-primary\">Edit\n                                    </router-link>\n                                    <a href=\"#\" v-if=\"can('category-delete')\" @click.prevent=\"deleteCategory(post.id)\"\n                                       class=\"ms-2 badge bg-danger\">Delete</a>\n                                </td>\n                            </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"card-footer\">\n                    <Pagination :data=\"categories\" :limit=\"3\"\n                                @pagination-change-page=\"page => getCategories(page, search_id, search_title, search_global, orderColumn, orderDirection)\"\n                                class=\"mt-4\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n    import {ref, onMounted, watch} from \"vue\";\n    import useCategories from \"../../../composables/categories\";\n    import {useAbility} from '@casl/vue'\n\n    const search_id = ref('')\n    const search_title = ref('')\n    const search_global = ref('')\n    const orderColumn = ref('created_at')\n    const orderDirection = ref('desc')\n    const {categories, getCategories, deleteCategory} = useCategories()\n    const {can} = useAbility()\n    onMounted(() => {\n        getCategories()\n    })\n    const updateOrdering = (column) => {\n        orderColumn.value = column;\n        orderDirection.value = (orderDirection.value === 'asc') ? 'desc' : 'asc';\n        getCategories(\n            1,\n            search_id.value,\n            search_title.value,\n            search_global.value,\n            orderColumn.value,\n            orderDirection.value\n        );\n    }\n    watch(search_id, (current, previous) => {\n        getCategories(\n            1,\n            current,\n            search_title.value,\n            search_global.value\n        )\n    })\n    watch(search_title, (current, previous) => {\n        getCategories(\n            1,\n            search_id.value,\n            current,\n            search_global.value\n        )\n    })\n    watch(search_global, _.debounce((current, previous) => {\n        getCategories(\n            1,\n            search_id.value,\n            search_title.value,\n            current\n        )\n    }, 200))\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/index.vue",
    "content": "<template>\n<h1>Admin</h1>\n</template>\n\n<script setup>\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/admin/permissions/Create.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-name\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"permission.name\" id=\"post-name\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { reactive } from \"vue\";\n    import usePermissions from \"@/composables/permissions\";\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\"\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required|min:3'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors } = useForm({ validationSchema: schema });\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { storePermission, validationErrors, isLoading } = usePermissions();\n    const permission = reactive({\n        name\n    })\n    function submitForm() {\n        validate().then(form => { if (form.valid) storePermission(permission) })\n    }\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/permissions/Edit.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"permission.name\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Update</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { onMounted, reactive, watchEffect } from \"vue\";\n    import { useRoute } from \"vue-router\";\n    import usePermissions from \"@/composables/permissions\";\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\"\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required|min:3'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors, resetForm } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { permission: postData, getPermission, updatePermission, validationErrors, isLoading } = usePermissions()\n    const permission = reactive({\n        name\n    })\n    const route = useRoute()\n    function submitForm() {\n        validate().then(form => { if (form.valid) updatePermission(permission) })\n    }\n    onMounted(() => {\n        getPermission(route.params.id)\n    })\n    // https://vuejs.org/api/reactivity-core.html#watcheffect\n    watchEffect(() => {\n        permission.id = postData.value.id\n        permission.name = postData.value.name\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/permissions/Index.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-2\">\n        <div class=\"col-md-12\">\n            <div class=\"card border-0\">\n                <div class=\"card-header bg-transparent\">\n                    <h5 class=\"float-start\">Permissions</h5>\n                    <router-link v-if=\"can('permission-create')\" :to=\"{ name: 'permissions.create' }\" class=\"btn btn-primary btn-sm float-end\">\n                        Create Permission\n                    </router-link>\n                </div>\n                <div class=\"card-body shadow-sm\">\n                    <div class=\"mb-4\">\n                        <input v-model=\"search_global\" type=\"text\" placeholder=\"Search...\"\n                               class=\"form-control w-25\">\n                    </div>\n                    <div class=\"table-responsive\">\n                        <table class=\"table\">\n                            <thead>\n                            <tr>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_id\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by ID\">\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_title\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by Title\">\n                                </th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                            </tr>\n                            <tr>\n                                <th class=\"px-6 py-3 text-start\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('id')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'id' }\">\n                                            ID\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'id',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'id',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('name')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'name' }\">\n                                            Title\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'name',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'name',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'name',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'name',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <div class=\"flex flex-row items-center justify-between cursor-pointer\"\n                                         @click=\"updateOrdering('created_at')\">\n                                        <div class=\"leading-4 font-medium text-gray-500 uppercase tracking-wider\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'created_at' }\">\n                                            Created at\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'created_at',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'created_at',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    Actions\n                                </th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr v-for=\"post in permissions.data\" :key=\"post.id\">\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.id }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.name }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.created_at }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <router-link v-if=\"can('permission-edit')\"\n                                                 :to=\"{ name: 'permissions.edit', params: { id: post.id } }\" class=\"badge bg-primary\">Edit\n                                    </router-link>\n                                    <a href=\"#\" v-if=\"can('permission-delete')\" @click.prevent=\"deletePermission(post.id)\"\n                                       class=\"ms-2 badge bg-danger\">Delete</a>\n                                </td>\n                            </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"card-footer\">\n                    <Pagination :data=\"permissions\" :limit=\"3\"\n                                @pagination-change-page=\"page => getPermissions(page, search_id, search_title, search_global, orderColumn, orderDirection)\"\n                                class=\"mt-4\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n    import {ref, onMounted, watch} from \"vue\";\n    import usePermissions from \"@/composables/permissions\";\n    import {useAbility} from '@casl/vue';\n\n    const search_id = ref('')\n    const search_title = ref('')\n    const search_global = ref('')\n    const orderColumn = ref('created_at')\n    const orderDirection = ref('desc')\n    const {permissions, getPermissions, deletePermission} = usePermissions()\n    const {can} = useAbility()\n    onMounted(() => {\n        getPermissions()\n    })\n    const updateOrdering = (column) => {\n        orderColumn.value = column;\n        orderDirection.value = (orderDirection.value === 'asc') ? 'desc' : 'asc';\n        getPermissions(\n            1,\n            search_id.value,\n            search_title.value,\n            search_global.value,\n            orderColumn.value,\n            orderDirection.value\n        );\n    }\n    watch(search_id, (current, previous) => {\n        getPermissions(\n            1,\n            current,\n            search_title.value,\n            search_global.value\n        )\n    })\n    watch(search_title, (current, previous) => {\n        getPermissions(\n            1,\n            search_id.value,\n            current,\n            search_global.value\n        )\n    })\n    watch(search_global, _.debounce((current, previous) => {\n        getPermissions(\n            1,\n            search_id.value,\n            search_title.value,\n            current\n        )\n    }, 200))\n\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/admin/posts/Create.vue",
    "content": "<template>\n    <form @submit.prevent=\"submitForm\">\n        <div class=\"row my-5\">\n            <div class=\"col-md-8\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"post.title\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.title }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.title\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Content -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-content\" class=\"form-label\">\n                                Content\n                            </label>\n                            <TextEditorComponent v-model=\"post.content\"/>\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.content }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.content\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"col-md-4\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n                        <h6>\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                            </svg> Action\n                        </h6>\n                        <div class=\"mt-3 text-center\">\n                            <button :disabled=\"isLoading\" class=\"btn btn btn-outline-primary me-2\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save Draft</span>\n                            </button>\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Publish</span>\n                            </button>\n                        </div>\n                        <h6 class=\"mt-3\">\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                            </svg> Category\n                        </h6>\n                        <!-- Category -->\n                        <div class=\"mb-3\">\n                            <v-select multiple v-model=\"post.categories\" :options=\"categoryList\"\n                                      :reduce=\"category => category.id\" label=\"name\" class=\"form-control\" placeholder=\"Select category\"/>\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.categories }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.categories\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n<!--                        <div class=\"mb-3\">\n                            <h6 class=\"mt-3\">\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                    <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                                </svg> Thumbnail\n                            </h6>\n                            <input @change=\"post.thumbnail = $event.target.files[0]\" type=\"file\" class=\"form-control\"\n                                   id=\"thumbnail\"/>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.thumbnail\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>-->\n                        <div class=\"mb-3\">\n                            <h6 class=\"mt-3\">\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                    <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                                </svg> Thumbnail\n                            </h6>\n                            <DropZone v-model=\"post.thumbnail\"/>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.thumbnail\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </form>\n</template>\n<script setup>\nimport {onMounted, reactive, ref} from \"vue\";\nimport TextEditorComponent from \"@/components/TextEditorComponent.vue\";\nimport DropZone from \"@/components/DropZone.vue\";\nimport useCategories from \"@/composables/categories\";\nimport usePosts from \"@/composables/posts\";\nimport {useForm, useField, defineRule} from \"vee-validate\";\nimport {required, min} from \"@/validation/rules\"\n\ndefineRule('required', required)\ndefineRule('min', min);\n\nconst dropZoneActive = ref(true)\n\n// Define a validation schema\nconst schema = {\n    title: 'required|min:5',\n    content: 'required|min:50',\n    categories: 'required'\n}\n// Create a form context with the validation schema\nconst {validate, errors} = useForm({validationSchema: schema})\n// Define actual fields for validation\nconst {value: title} = useField('title', null, {initialValue: ''});\nconst {value: content} = useField('content', null, {initialValue: ''});\nconst {value: categories} = useField('categories', null, {initialValue: '', label: 'category'});\nconst {categoryList, getCategoryList} = useCategories()\nconst {storePost, validationErrors, isLoading} = usePosts()\nconst post = reactive({\n    title,\n    content,\n    categories,\n    thumbnail: ''\n})\n\nconst thefile = ref('')\n\nfunction submitForm() {\n    validate().then(form => {\n        if (form.valid) storePost(post)\n    })\n}\n\nonMounted(() => {\n    getCategoryList()\n})\n\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/posts/Edit.vue",
    "content": "<template>\n    <form @submit.prevent=\"submitForm\">\n        <div class=\"row my-5\">\n            <div class=\"col-md-8\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"post.title\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.title }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.title\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Content -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-content\" class=\"form-label\">\n                                Content\n                            </label>\n                            <TextEditorComponent v-model=\"post.content\"/>\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.content }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.content\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"col-md-4\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n                        <h6>\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                            </svg> Action\n                        </h6>\n                        <div class=\"mt-3 text-center\">\n                            <button :disabled=\"isLoading\" class=\"btn btn btn-outline-primary me-2\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save Draft</span>\n                            </button>\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Publish</span>\n                            </button>\n                        </div>\n                        <h6 class=\"mt-3\">\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                            </svg> Category\n                        </h6>\n                        <!-- Category -->\n                        <div class=\"mb-3\">\n                            <v-select multiple v-model=\"post.categories\" :options=\"categoryList\"\n                                      :reduce=\"category => category.id\" label=\"name\" class=\"form-control\" placeholder=\"Select category\"/>\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.categories }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.categories\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!--                        <div class=\"mb-3\">\n                                                    <h6 class=\"mt-3\">\n                                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                                            <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                                                        </svg> Thumbnail\n                                                    </h6>\n                                                    <input @change=\"post.thumbnail = $event.target.files[0]\" type=\"file\" class=\"form-control\"\n                                                           id=\"thumbnail\"/>\n                                                    <div class=\"text-danger mt-1\">\n                                                        <div v-for=\"message in validationErrors?.thumbnail\">\n                                                            {{ message }}\n                                                        </div>\n                                                    </div>\n                                                </div>-->\n                        <div class=\"mb-3\">\n                            <h6 class=\"mt-3\">\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-arrow-down-square\" viewBox=\"0 0 16 16\">\n                                    <path fill-rule=\"evenodd\" d=\"M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm8.5 2.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                                </svg> Thumbnail\n                            </h6>\n                            <DropZone v-model=\"post.thumbnail\"/>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.thumbnail\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </form>\n</template>\n<script setup>\n    import { onMounted, reactive, watchEffect } from \"vue\";\n    import { useRoute } from \"vue-router\";\n    import useCategories from \"@/composables/categories\";\n    import usePosts from \"@/composables/posts\";\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\"\n    import TextEditorComponent from \"@/components/TextEditorComponent.vue\";\n    import DropZone from \"@/components/DropZone.vue\";\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        title: 'required|min:5',\n        content: 'required|min:50',\n        categories: 'required'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors, resetForm } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: title } = useField('title', null, { initialValue: '' });\n    const { value: content } = useField('content', null, { initialValue: '' });\n    const { value: categories } = useField('categories', null, { initialValue: '', label: 'category' });\n    const { categoryList, getCategoryList } = useCategories()\n    const { post: postData, getPost, updatePost, validationErrors, isLoading } = usePosts()\n    const post = reactive({\n        title,\n        content,\n        categories,\n        thumbnail: ''\n    })\n    const route = useRoute()\n    function submitForm() {\n        validate().then(form => { if (form.valid) updatePost(post) })\n    }\n    onMounted(() => {\n        getPost(route.params.id)\n        getCategoryList()\n    })\n    // https://vuejs.org/api/reactivity-core.html#watcheffect\n    watchEffect(() => {\n        post.id = postData.value.id\n        post.title = postData.value.title\n        post.content = postData.value.content\n        post.thumbnail = postData.value.original_image\n        post.categories = postData.value.categories\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/posts/Index.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-2\">\n        <div class=\"col-md-12\">\n            <div class=\"card border-0\">\n                <div class=\"card-header bg-transparent\">\n                    <h5 class=\"float-start\">Posts</h5>\n                    <router-link v-if=\"can('post-create')\" :to=\"{ name: 'posts.create' }\" class=\"btn btn-primary btn-sm float-end\">\n                        Create Post\n                    </router-link>\n                </div>\n                <div class=\"card-body shadow-sm\">\n                    <div class=\"mb-4\">\n                        <input v-model=\"search_global\" type=\"text\" placeholder=\"Search...\"\n                               class=\"form-control w-25\">\n                    </div>\n                    <div class=\"table-responsive\">\n                        <table class=\"table\">\n                            <thead>\n                            <tr>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_id\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by ID\">\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_title\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by Title\">\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <v-select multiple v-model=\"search_category\" :options=\"categoryList\"\n                                              :reduce=\"category => category.id\" label=\"name\" class=\"form-control w-100\"/>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_content\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by Content\">\n                                </th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                            </tr>\n                            <tr>\n                                <th class=\"px-6 py-3 text-start\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('id')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'id' }\">\n                                            ID\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'id',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'id',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('title')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'title' }\">\n                                            Title\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'title',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'title',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'title',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'title',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\">\n                                        <div class=\"font-medium text-uppercase\">\n                                            Thumbnail\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <span class=\"text-xs leading-4 font-medium text-gray-500 uppercase tracking-wider\">Category</span>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <span class=\"text-xs leading-4 font-medium text-gray-500 uppercase tracking-wider\">Content</span>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <div class=\"flex flex-row items-center justify-between cursor-pointer\"\n                                         @click=\"updateOrdering('created_at')\">\n                                        <div class=\"leading-4 font-medium text-gray-500 uppercase tracking-wider\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'created_at' }\">\n                                            Created at\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'created_at',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'created_at',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    Actions\n                                </th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr v-for=\"post in posts.data\" :key=\"post.id\">\n                                <td class=\"px-6 py-4 text-sm\" width=\"20\">\n                                    {{ post.id }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.title }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <img :src=\"post.original_image\" alt=\"image\" height=\"70\">\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <div v-for=\"category in post.categories\">\n                                        {{ category.name }}\n                                    </div>\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <div v-html=\"post.content.slice(0, 100) + '...'\"></div>\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.created_at }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <router-link v-if=\"can('post-edit')\"\n                                                 :to=\"{ name: 'posts.edit', params: { id: post.id } }\" class=\"badge bg-primary\">Edit\n                                    </router-link>\n                                    <a href=\"#\" v-if=\"can('post-delete')\" @click.prevent=\"deletePost(post.id)\"\n                                       class=\"ms-2 badge bg-danger\">Delete</a>\n                                </td>\n                            </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"card-footer\">\n                    <Pagination :data=\"posts\" :limit=\"3\"\n                                @pagination-change-page=\"page => getPosts(page, search_category, search_id, search_title, search_content, search_global, orderColumn, orderDirection)\"\n                                class=\"mt-4\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n    import {ref, onMounted, watch} from \"vue\";\n    import usePosts from \"@/composables/posts\";\n    import useCategories from \"@/composables/categories\";\n    import {useAbility} from '@casl/vue'\n\n    const search_category = ref('')\n    const search_id = ref('')\n    const search_title = ref('')\n    const search_content = ref('')\n    const search_global = ref('')\n    const orderColumn = ref('created_at')\n    const orderDirection = ref('desc')\n    const {posts, getPosts, deletePost} = usePosts()\n    const {categoryList, getCategoryList} = useCategories()\n    const {can} = useAbility();\n    onMounted(() => {\n        getPosts()\n        getCategoryList()\n    })\n    const updateOrdering = (column) => {\n        orderColumn.value = column;\n        orderDirection.value = (orderDirection.value === 'asc') ? 'desc' : 'asc';\n        getPosts(\n            1,\n            search_category.value,\n            search_id.value,\n            search_title.value,\n            search_content.value,\n            search_global.value,\n            orderColumn.value,\n            orderDirection.value\n        );\n    }\n    watch(search_category, (current, previous) => {\n        getPosts(\n            1,\n            current,\n            search_id.value,\n            search_title.value,\n            search_content.value,\n            search_global.value\n        )\n    })\n    watch(search_id, (current, previous) => {\n        getPosts(\n            1,\n            search_category.value,\n            current,\n            search_title.value,\n            search_content.value,\n            search_global.value\n        )\n    })\n    watch(search_title, (current, previous) => {\n        getPosts(\n            1,\n            search_category.value,\n            search_id.value,\n            current,\n            search_content.value,\n            search_global.value\n        )\n    })\n    watch(search_content, (current, previous) => {\n        getPosts(\n            1,\n            search_category.value,\n            search_id.value,\n            search_title.value,\n            current,\n            search_global.value\n        )\n    })\n    watch(search_global, _.debounce((current, previous) => {\n        getPosts(\n            1,\n            search_category.value,\n            search_id.value,\n            search_title.value,\n            search_content.value,\n            current\n        )\n    }, 200))\n\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/profile/index.vue",
    "content": "<template>\n    <div class=\"card border-0\">\n        <div class=\"card-header bg-transparent\">\n            <h5 class=\"float-start\">Profile</h5>\n        </div>\n        <div class=\"card-body\">\n            <form @submit.prevent=\"submitForm\">\n                <div class=\"mb-3\">\n                    <label for=\"name\" class=\"form-label\">Name</label>\n                    <input type=\"text\" v-model=\"profile.name\" class=\"form-control\" id=\"name\">\n                    <div class=\"text-danger mt-1\">\n                        {{ errors.name }}\n                    </div>\n                    <div class=\"text-danger mt-1\">\n                        <div v-for=\"message in validationErrors?.name\">\n                            {{ message }}\n                        </div>\n                    </div>\n                </div>\n                <div class=\"mb-3\">\n                    <label for=\"email\" class=\"form-label\">Email</label>\n                    <input type=\"email\" v-model=\"profile.email\" class=\"form-control\" id=\"email\">\n                    <div class=\"text-danger mt-1\">\n                        {{ errors.email }}\n                    </div>\n                    <div class=\"text-danger mt-1\">\n                        <div v-for=\"message in validationErrors?.email\">\n                            {{ message }}\n                        </div>\n                    </div>\n                </div>\n                <div class=\"mb-3\">\n                    <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                        <div v-show=\"isLoading\" class=\"\"></div>\n                        <span v-if=\"isLoading\">Processing...</span>\n                        <span v-else>Update</span>\n                    </button>\n                </div>\n            </form>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport { onMounted, reactive, watchEffect } from \"vue\";\nimport { useForm, useField, defineRule } from \"vee-validate\";\nimport { required, min } from \"@/validation/rules\"\nimport useProfile from \"@/composables/profile\";\ndefineRule('required', required)\n// defineRule('email', email)\ndefineRule('min', min);\n\n    const schema = {\n        name: 'required|min:3',\n        email: 'required',\n    }\n    // Create a form context with the validation schema\n    const { validate, errors } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { value: email } = useField('email', null, { initialValue: '' });\n    const { profile: profileData, getProfile, updateProfile, validationErrors, isLoading } = useProfile()\n    const profile = reactive({\n        name,\n        email\n    })\n    function submitForm() {\n        validate().then(form => { if (form.valid) updateProfile(profile) })\n    }\n    onMounted(() => {\n        getProfile()\n    })\n\n    watchEffect(() => {\n        profile.name = profileData.value.name\n        profile.email = profileData.value.email\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/roles/Create.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-6\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-name\" class=\"form-label\">\n                                Title\n                            </label>\n                            <input v-model=\"role.name\" id=\"post-name\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { onMounted, reactive } from \"vue\";\n    import useRoles from \"@/composables/roles\";\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\"\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required|min:3'\n    }\n    // Create a form context with the validation schema\n    const { validate, errors } = useForm({ validationSchema: schema });\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { storeRole, validationErrors, isLoading } = useRoles();\n    const role = reactive({\n        name\n    })\n    function submitForm() {\n        validate().then(form => { if (form.valid) storeRole(role) })\n    }\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/roles/Edit.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <!-- Title -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">\n                                Title\n                            </label>\n                            <div class=\"form-outline w-25\">\n                                <input v-model=\"role.name\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <DualListBox\n                            leftLabel=\"Available Permissions\"\n                            rightLabel=\"Current Permissions\"\n                            :leftData=\"availablePermissions\"\n                            :rightData=\"currentPermissions\"\n                            v-on:onChangeList=\"onChangeList\"\n                        ></DualListBox>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Update</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script async setup>\nimport {isProxy, isRef, unref, onBeforeMount, onMounted, reactive, toRaw, toRefs, watchEffect, ref, markRaw} from \"vue\";\nimport {useRoute} from \"vue-router\";\nimport useRoles from \"@/composables/roles\";\nimport {useForm, useField, defineRule} from \"vee-validate\";\nimport {required, min} from \"@/validation/rules\"\nimport DualListBox from \"../../../components/DualListBox.vue\";\nimport usePermissions from \"@/composables/permissions\";\n\n\ndefineRule('required', required)\ndefineRule('min', min);\n\n// Define a validation schema\nconst schema = {\n    name: 'required|min:3'\n}\n// Create a form context with the validation schema\nconst {validate, errors, resetForm} = useForm({validationSchema: schema})\n// Define actual fields for validation\nconst {value: name} = useField('name', null, {initialValue: ''});\nconst {\n    role: postData,\n    updateRolePermissions,\n    getRole,\n    updateRole,\n    validationErrors,\n    isLoading\n} = useRoles()\n// const {allPermission, getAllPermissions} = usePermissions()\nconst role = reactive({\n    name\n})\nconst route = useRoute()\n\nlet response = await axios.get('/api/permissions/')\nlet allPermission = response.data.data;\n\nresponse = await axios.get('/api/role-permissions/' + route.params.id)\nlet rolePermissionList = response.data.data;\n\nlet diffPermission = getDifference(allPermission, rolePermissionList);\n\nlet availablePermissions = ref(diffPermission)\nlet currentPermissions = ref(rolePermissionList)\n\n\nfunction submitForm() {\n    validate().then(form => {\n        if (form.valid) {\n            let permissions = currentPermissions.value.map(a => a.id);\n            updateRolePermissions(role, permissions)\n            //  updateRole(role)\n        }\n    })\n}\n\nfunction onChangeList(data) {\n    //console.log(data)\n}\n\nonMounted(() => {\n    getRole(route.params.id)\n})\n// https://vuejs.org/api/reactivity-core.html#watcheffect\nwatchEffect(() => {\n    role.id = postData.value.id\n    role.name = postData.value.name\n})\n\n\nfunction getDifference(array1, array2) {\n    return array1.filter(object1 => {\n        return !array2.some(object2 => {\n            return object1.id === object2.id;\n        });\n    });\n}\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/roles/Index.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-2\">\n        <div class=\"col-md-12\">\n            <div class=\"card border-0\">\n                <div class=\"card-header bg-transparent\">\n                    <h5 class=\"float-start\">Roles</h5>\n                    <router-link v-if=\"can('role-list')\" :to=\"{ name: 'roles.create' }\" class=\"btn btn-primary btn-sm float-end\">\n                        Create Role\n                    </router-link>\n                </div>\n                <div class=\"card-body shadow-sm\">\n                    <div class=\"mb-4\">\n                        <input v-model=\"search_global\" type=\"text\" placeholder=\"Search...\"\n                               class=\"form-control w-25\">\n                    </div>\n                    <div class=\"table-responsive\">\n                        <table class=\"table\">\n                            <thead>\n                            <tr>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_id\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by ID\">\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_title\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by Title\">\n                                </th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                            </tr>\n                            <tr>\n                                <th class=\"px-6 py-3 text-start\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('id')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'id' }\">\n                                            ID\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'id',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'id',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('name')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'name' }\">\n                                            Title\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'name',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'name',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'name',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'name',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <div class=\"flex flex-row items-center justify-between cursor-pointer\"\n                                         @click=\"updateOrdering('created_at')\">\n                                        <div class=\"leading-4 font-medium text-gray-500 uppercase tracking-wider\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'created_at' }\">\n                                            Created at\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'created_at',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'created_at',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    Actions\n                                </th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr v-for=\"post in roles.data\" :key=\"post.id\">\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.id }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.name }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.created_at }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <router-link v-if=\"can('role-edit')\"\n                                                 :to=\"{ name: 'roles.edit', params: { id: post.id } }\" class=\"badge bg-primary\">Edit\n                                    </router-link>\n                                    <a href=\"#\" v-if=\"can('role-delete')\" @click.prevent=\"deleteRole(post.id)\"\n                                       class=\"ms-2 badge bg-danger\">Delete</a>\n                                </td>\n                            </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"card-footer\">\n                    <Pagination :data=\"roles\" :limit=\"3\"\n                                @pagination-change-page=\"page => getRoles(page, search_id, search_title, search_global, orderColumn, orderDirection)\"\n                                class=\"mt-4\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n    import {ref, onMounted, watch} from \"vue\";\n    import useRoles from \"../../../composables/roles\";\n    import {useAbility} from '@casl/vue';\n\n    const search_id = ref('')\n    const search_title = ref('')\n    const search_global = ref('')\n    const orderColumn = ref('created_at')\n    const orderDirection = ref('desc')\n    const {roles, getRoles, deleteRole} = useRoles()\n    const {can} = useAbility()\n    onMounted(() => {\n        getRoles()\n    })\n    const updateOrdering = (column) => {\n        orderColumn.value = column;\n        orderDirection.value = (orderDirection.value === 'asc') ? 'desc' : 'asc';\n        getRoles(\n            1,\n            search_id.value,\n            search_title.value,\n            search_global.value,\n            orderColumn.value,\n            orderDirection.value\n        );\n    }\n    watch(search_id, (current, previous) => {\n        getRoles(\n            1,\n            current,\n            search_title.value,\n            search_global.value\n        )\n    })\n    watch(search_title, (current, previous) => {\n        getRoles(\n            1,\n            search_id.value,\n            current,\n            search_global.value\n        )\n    })\n    watch(search_global, _.debounce((current, previous) => {\n        getRoles(\n            1,\n            search_id.value,\n            search_title.value,\n            current\n        )\n    }, 200))\n\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/admin/users/Create.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-10\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <div class=\"mb-3\">\n                            <label for=\"post-title\" class=\"form-label\">Name</label>\n                            <input v-model=\"post.name\" id=\"post-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"mb-3\">\n                            <label for=\"email\" class=\"form-label\">Email</label>\n                            <input v-model=\"post.email\" id=\"email\" type=\"email\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.email }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.email\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"mb-3\">\n                            <label for=\"password\" class=\"form-label\">Password</label>\n                            <input v-model=\"post.password\" id=\"password\" type=\"password\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.password }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.password\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Role -->\n                        <div class=\"mb-3\">\n                            <label for=\"post-category\" class=\"form-label\">\n                                Role\n                            </label>\n                            <v-select multiple v-model=\"post.role_id\" :options=\"roleList\" :reduce=\"role => role.id\" label=\"name\" class=\"form-control\" />\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.role_id }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.role_id\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { onMounted, reactive } from \"vue\";\n    import useRoles from \"@/composables/roles\";\n    import useUsers from \"@/composables/users\";\n\n    const { roleList, getRoleList } = useRoles();\n    const { storeUser, validationErrors, isLoading } = useUsers();\n\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\";\n    defineRule('required', required);\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required',\n        email: 'required',\n        password: 'required|min:8',\n    }\n    // Create a form context with the validation schema\n    const { validate, errors } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { value: email } = useField('email', null, { initialValue: '' });\n    const { value: password } = useField('password', null, { initialValue: '' });\n    const { value: role_id } = useField('role_id', null, { initialValue: '', label: 'role' });\n\n    const post = reactive({\n        name,\n        email,\n        password,\n        role_id,\n    })\n    function submitForm() {\n        validate().then(form => { if (form.valid) storeUser(post) })\n    }\n    onMounted(() => {\n        getRoleList()\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/users/Edit.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-5\">\n        <div class=\"col-md-10\">\n            <div class=\"card border-0 shadow-sm\">\n                <div class=\"card-body\">\n                    <form @submit.prevent=\"submitForm\">\n                        <div class=\"mb-3\">\n                            <label for=\"user-title\" class=\"form-label\">Name</label>\n                            <input v-model=\"user.name\" id=\"user-title\" type=\"text\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.name }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.name\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"mb-3\">\n                            <label for=\"email\" class=\"form-label\">Email</label>\n                            <input v-model=\"user.email\" id=\"email\" type=\"email\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.email }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.email\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"mb-3\">\n                            <label for=\"password\" class=\"form-label\">Password</label>\n                            <input v-model=\"user.password\" id=\"password\" type=\"password\" class=\"form-control\">\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.password }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.password\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Role -->\n                        <div class=\"mb-3\">\n                            <label for=\"user-category\" class=\"form-label\">\n                                Role\n                            </label>\n                            <v-select multiple  v-model=\"user.role_id\" :options=\"roleList\" :reduce=\"role => role.id\" label=\"name\" class=\"form-control\" />\n                            <div class=\"text-danger mt-1\">\n                                {{ errors.role_id }}\n                            </div>\n                            <div class=\"text-danger mt-1\">\n                                <div v-for=\"message in validationErrors?.role_id\">\n                                    {{ message }}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- Buttons -->\n                        <div class=\"mt-4\">\n                            <button :disabled=\"isLoading\" class=\"btn btn-primary\">\n                                <div v-show=\"isLoading\" class=\"\"></div>\n                                <span v-if=\"isLoading\">Processing...</span>\n                                <span v-else>Save</span>\n                            </button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n<script setup>\n    import { onMounted, reactive, watchEffect } from \"vue\";\n    import { useRoute } from \"vue-router\";\n    import useRoles from \"@/composables/roles\";\n    import useUsers from \"@/composables/users\";\n\n    const { roleList, getRoleList } = useRoles();\n    const { updateUser, getUser, user: postData, validationErrors, isLoading } = useUsers();\n\n    import { useForm, useField, defineRule } from \"vee-validate\";\n    import { required, min } from \"@/validation/rules\"\n    defineRule('required', required)\n    defineRule('min', min);\n\n    // Define a validation schema\n    const schema = {\n        name: 'required',\n        email: 'required',\n        password: 'min:8',\n    }\n\n    // Create a form context with the validation schema\n    const { validate, errors, resetForm } = useForm({ validationSchema: schema })\n    // Define actual fields for validation\n    const { value: name } = useField('name', null, { initialValue: '' });\n    const { value: email } = useField('email', null, { initialValue: '' });\n    const { value: password } = useField('password', null, { initialValue: '' });\n    const { value: role_id } = useField('role_id', null, { initialValue: '', label: 'role' });\n\n    const user = reactive({\n        name,\n        email,\n        password,\n        role_id,\n    })\n\n    const route = useRoute()\n    function submitForm() {\n        validate().then(form => { if (form.valid) updateUser(user) })\n    }\n    onMounted(() => {\n        getUser(route.params.id)\n        getRoleList()\n    })\n    // https://vuejs.org/api/reactivity-core.html#watcheffect\n    watchEffect(() => {\n        user.id = postData.value.id\n        user.name = postData.value.name\n        user.email = postData.value.email\n        user.role_id = postData.value.role_id\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/admin/users/Index.vue",
    "content": "<template>\n    <div class=\"row justify-content-center my-2\">\n        <div class=\"col-md-12\">\n            <div class=\"card border-0\">\n                <div class=\"card-header bg-transparent\">\n                    <h5 class=\"float-start\">Users</h5>\n                    <router-link v-if=\"can('user-list')\" :to=\"{ name: 'users.create' }\" class=\"btn btn-primary btn-sm float-end\">\n                        Add New\n                    </router-link>\n                </div>\n                <div class=\"card-body shadow-sm\">\n                    <div class=\"mb-4\">\n                        <input v-model=\"search_global\" type=\"text\" placeholder=\"Search...\"\n                               class=\"form-control w-25\">\n                    </div>\n                    <div class=\"table-responsive\">\n                        <table class=\"table\">\n                            <thead>\n                            <tr>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_id\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by ID\">\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <input v-model=\"search_title\" type=\"text\"\n                                           class=\"inline-block mt-1 form-control\"\n                                           placeholder=\"Filter by Title\">\n                                </th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                                <th class=\"px-6 py-3 text-start\"></th>\n                            </tr>\n                            <tr>\n                                <th class=\"px-6 py-3 text-start\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('id')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'id' }\">\n                                            ID\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'id',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'id',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'id',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('title')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'title' }\">\n                                            Name\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'title',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'title',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'title',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'title',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 text-left\">\n                                    <div class=\"flex flex-row\"\n                                         @click=\"updateOrdering('email')\">\n                                        <div class=\"font-medium text-uppercase\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'email' }\">\n                                            Email\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'email',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'email',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'email',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'email',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    <div class=\"flex flex-row items-center justify-between cursor-pointer\"\n                                         @click=\"updateOrdering('created_at')\">\n                                        <div class=\"leading-4 font-medium text-gray-500 uppercase tracking-wider\"\n                                             :class=\"{ 'font-bold text-blue-600': orderColumn === 'created_at' }\">\n                                            Created at\n                                        </div>\n                                        <div class=\"select-none\">\n                                <span :class=\"{\n                                  'text-blue-600': orderDirection === 'asc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'asc' && orderColumn === 'created_at',\n                                }\">&uarr;</span>\n                                            <span :class=\"{\n                                  'text-blue-600': orderDirection === 'desc' && orderColumn === 'created_at',\n                                  'hidden': orderDirection !== '' && orderDirection !== 'desc' && orderColumn === 'created_at',\n                                }\">&darr;</span>\n                                        </div>\n                                    </div>\n                                </th>\n                                <th class=\"px-6 py-3 bg-gray-50 text-left\">\n                                    Actions\n                                </th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr v-for=\"post in users.data\" :key=\"post.id\">\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.id }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.name }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.email }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    {{ post.created_at }}\n                                </td>\n                                <td class=\"px-6 py-4 text-sm\">\n                                    <router-link v-if=\"can('user-edit')\"\n                                                 :to=\"{ name: 'users.edit', params: { id: post.id } }\"\n                                                 class=\"badge bg-primary\">Edit\n                                    </router-link>\n                                    <a href=\"#\" v-if=\"can('user-delete')\" @click.prevent=\"deleteUser(post.id)\"\n                                       class=\"ms-2 badge bg-danger\">Delete</a>\n                                </td>\n                            </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"card-footer\">\n                    <Pagination :data=\"users\" :limit=\"3\"\n                                @pagination-change-page=\"page => getUsers(page, search_id, search_title, search_global, orderColumn, orderDirection)\"\n                                class=\"mt-4\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport {ref, onMounted, watch} from \"vue\";\nimport useUsers from \"../../../composables/users\";\nimport {useAbility} from '@casl/vue'\n\nconst search_id = ref('')\nconst search_title = ref('')\nconst search_global = ref('')\nconst orderColumn = ref('created_at')\nconst orderDirection = ref('desc')\nconst {users, getUsers, deleteUser} = useUsers()\nconst {can} = useAbility()\nonMounted(() => {\n    getUsers()\n})\nconst updateOrdering = (column) => {\n    orderColumn.value = column;\n    orderDirection.value = (orderDirection.value === 'asc') ? 'desc' : 'asc';\n    getUsers(\n        1,\n        search_id.value,\n        search_title.value,\n        search_global.value,\n        orderColumn.value,\n        orderDirection.value\n    );\n}\nwatch(search_id, (current, previous) => {\n    getUsers(\n        1,\n        current,\n        search_title.value,\n        search_global.value\n    )\n})\nwatch(search_title, (current, previous) => {\n    getUsers(\n        1,\n        search_id.value,\n        current,\n        search_global.value\n    )\n})\nwatch(search_global, _.debounce((current, previous) => {\n    getUsers(\n        1,\n        search_id.value,\n        search_title.value,\n        current\n    )\n}, 200))\n</script>\n"
  },
  {
    "path": "resources/js/views/auth/Verify.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row justify-content-center my-5\">\n            <div class=\"col-md-8\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-header\">{{ $t('verify_your_email_address') }}</div>\n\n                    <div class=\"card-body\">\n                        <!-- Loading State -->\n                        <div v-if=\"loading\" class=\"text-center\">\n                            <div class=\"spinner-border\" role=\"status\">\n                                <span class=\"visually-hidden\">Loading...</span>\n                            </div>\n                            <p class=\"mt-2\">{{ $t('verifying_email') }}</p>\n                        </div>\n\n                        <!-- Success Message -->\n                        <div v-else-if=\"verified\" class=\"alert alert-success\" role=\"alert\">\n                            <h4 class=\"alert-heading\">{{ $t('email_verified_success') }}</h4>\n                            <p>{{ $t('redirecting_dashboard') }}</p>\n                        </div>\n\n                        <!-- Error Message -->\n                        <div v-else-if=\"error\" class=\"alert alert-danger\" role=\"alert\">\n                            <h4 class=\"alert-heading\">{{ $t('verification_link_invalid') }}</h4>\n                            <p>{{ error }}</p>\n                        </div>\n\n                        <!-- Resend Form -->\n                        <div v-if=\"error || showResendOnly\">\n                            <div v-if=\"resent\" class=\"alert alert-success\" role=\"alert\">\n                                {{ $t('fresh_verification_link_sent') }}\n                            </div>\n\n                            <p>{{ $t('before_proceeding_check_email') }}</p>\n                            <p>\n                                {{ $t('if_you_did_not_receive_the_email') }}\n                                <button type=\"button\" @click=\"resendVerificationEmail\" class=\"btn btn-primary align-baseline\" :disabled=\"processing\">\n                                    {{ $t('click_here_to_request_another') }}\n                                </button>\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport {useAuthStore} from \"@/store/auth\";\n\nconst route = useRoute();\nconst router = useRouter();\nconst authStore = useAuthStore();\n\nconst loading = ref(true);\nconst verified = ref(false);\nconst error = ref(null);\nconst resent = ref(false);\nconst processing = ref(false);\nconst showResendOnly = ref(false);\n\nconst verifyEmail = async () => {\n    const { id, hash } = route.params;\n    \n    // If no parameters, just show the resend form (user was redirected here)\n    if (!id || !hash) {\n        loading.value = false;\n        showResendOnly.value = true;\n        return;\n    }\n    \n    try {\n        loading.value = true;\n        const { expires, signature } = route.query;\n        \n        if (!expires || !signature) {\n            error.value = 'Invalid verification link.';\n            loading.value = false;\n            return;\n        }\n\n        const response = await axios.get(`/api/email/verify/${id}/${hash}`, {\n            params: {\n                expires,\n                signature,\n            },\n        });\n        \n        if (response.status === 200) {\n            await authStore.getUser();\n            verified.value = true;\n            // Redirect to dashboard after 2 seconds\n            setTimeout(() => {\n                router.push('/admin');\n            }, 2000);\n        }\n    } catch (err) {\n        error.value = err.response?.data?.message || 'Failed to verify email. The link may be invalid or expired.';\n        loading.value = false;\n    }\n};\n\nconst resendVerificationEmail = async () => {\n    processing.value = true;\n    try {\n        await axios.post('/api/email/verification-notification');\n        resent.value = true;\n        setTimeout(() => {\n            resent.value = false;\n        }, 5000);\n    } catch (error) {\n        console.error('Error resending verification email:', error);\n    } finally {\n        processing.value = false;\n    }\n};\n\nonMounted(() => {\n    verifyEmail();\n});\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/auth/passwords/Confirm.vue",
    "content": "<template>\n<h1>Confirm</h1>\n</template>\n\n<script>\nexport default {\n    name: \"Confirm\"\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/auth/passwords/Email.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row justify-content-center my-5\">\n            <div class=\"col-md-6\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n                        <form @submit.prevent=\"submitForgotPassword\">\n                            <div class=\"\">\n                                <!-- Email -->\n                                <div class=\"mb-3\">\n                                    <label for=\"email\" class=\"form-label\">{{ $t('email') }}</label>\n                                    <input v-model=\"forgotForm.email\" id=\"email\" type=\"email\" class=\"form-control\" autofocus autocomplete=\"username\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.email\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <!-- Buttons -->\n                                <div class=\"flex items-center justify-end mt-4\">\n                                    <button class=\"btn btn-primary\" :class=\"{ 'opacity-25': processing }\" :disabled=\"processing\">\n                                        {{ $t('send_password_reset_link') }}\n                                    </button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport useAuth from '@/composables/auth'\n\nconst { forgotForm, validationErrors, processing, submitForgotPassword } = useAuth();\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/auth/passwords/Reset.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row justify-content-center my-5\">\n            <div class=\"col-md-6\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n                        <form @submit.prevent=\"submitResetPassword\">\n                            <div class=\"\">\n                                <!-- Email -->\n                                <div class=\"mb-3\">\n                                    <label for=\"email\" class=\"form-label\">{{ $t('email') }}</label>\n                                    <input v-model=\"resetForm.email\" id=\"email\" type=\"email\" class=\"form-control\" autofocus autocomplete=\"email\" readonly disabled>\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.email\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"mb-3\">\n                                    <label for=\"password\" class=\"form-label\">{{ $t('password') }}</label>\n                                    <input v-model=\"resetForm.password\" id=\"password\" type=\"password\" class=\"form-control\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.password\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"mb-3\">\n                                    <label for=\"password_confirmation\" class=\"form-label\">{{ $t('confirm_password') }}</label>\n                                    <input v-model=\"resetForm.password_confirmation\" id=\"password_confirmation\" type=\"password\" class=\"form-control\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.password_confirmation\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <!-- Buttons -->\n                                <div class=\"flex items-center justify-end mt-4\">\n                                    <button class=\"btn btn-primary\" :class=\"{ 'opacity-25': processing }\" :disabled=\"processing\">\n                                        {{ $t('reset_password') }}\n                                    </button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport useAuth from '@/composables/auth';\nimport {useRoute} from \"vue-router\";\nimport {onMounted} from \"vue\";\nconst route = useRoute();\n\nonMounted(() => {\n    resetForm.token = route.params.token;\n    resetForm.email = route.query.email\n})\n\nconst { resetForm, validationErrors, processing, submitResetPassword } = useAuth();\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/category/posts.vue",
    "content": "<template>\n    <div class=\"container\">\n        <h2 class=\"text-center my-4\">Category Posts</h2>\n        <div class=\"row mb-2\">\n            <div v-for=\"post in posts?.data\" :key=\"post.id\" class=\"col-md-6\">\n                <div\n                    class=\"row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative\">\n                    <div class=\"col-auto d-none d-lg-block d-md-block\">\n                        <img :src=\"getImageUrl(post)\" class=\"img-fluid\"/>\n                    </div>\n                    <div class=\"col p-4 d-flex flex-column position-static\">\n                        <strong v-for=\"category in post.categories\" class=\"d-inline-block mb-2 text-primary\">\n                            {{ category.name }}\n                        </strong>\n                        <h3 class=\"mb-0\">{{ post.title }}</h3>\n                        <div class=\"mb-1 text-muted\">Nov 12</div>\n                        <p class=\"card-text mb-auto\">{{ post.content.substring(0, 90) + \"...\" }}</p>\n                        <router-link :to=\"{ name: 'public-posts.details', params: { id: post.id } }\"\n                                     class=\"stretched-link\">Continue reading\n                        </router-link>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport axios from 'axios';\nimport {ref, onMounted} from 'vue'\nimport {useRoute} from \"vue-router\";\n\nconst route = useRoute();\nconst posts = ref();\n\nfunction getImageUrl(post) {\n    let image\n    if (post.resized_image.length > 0) {\n        image = post.resized_image\n    } else {\n        image = post.original_image\n    }\n    return new URL(image, import.meta.url).href\n}\n\nonMounted(() => {\n    axios.get('/api/get-category-posts/' + route.params.id).then(({data}) => {\n        posts.value = data;\n    })\n})\n</script>\n"
  },
  {
    "path": "resources/js/views/errors/404.vue",
    "content": "<template>\n    <div class=\"d-flex align-items-center justify-content-center vh-100\">\n        <div class=\"text-center\">\n            <h1 class=\"display-1 fw-bold\">404</h1>\n            <p class=\"fs-3\"> <span class=\"text-danger\">Opps!</span> Page not found.</p>\n            <p class=\"lead\">\n                The page you’re looking for does’t exist.\n            </p>\n            <router-link to=\"/\" class=\"btn btn-primary\">Go Home</router-link>\n        </div>\n    </div>\n</template>\n\n<script>\nexport default {\n    name: \"404\"\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "resources/js/views/home/index.vue",
    "content": "<template>\n    <div class=\"relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0\">\n        <div class=\"max-w-6xl mx-auto sm:px-6 lg:px-8\">\n            <div class=\"flex justify-center pt-8 sm:text-gray-600 dark:text-gray-400 text-sm\">\n                <h1>{{ $t('welcome_starter_title') }}</h1>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n</script>\n\n<style scoped>\nbody {\n    font-family: 'Nunito', sans-serif;\n}\n/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\\:rounded-lg{border-radius:.5rem}.sm\\:block{display:block}.sm\\:items-center{align-items:center}.sm\\:justify-start{justify-content:flex-start}.sm\\:justify-between{justify-content:space-between}.sm\\:h-20{height:5rem}.sm\\:ml-0{margin-left:0}.sm\\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\\:pt-0{padding-top:0}.sm\\:text-left{text-align:left}.sm\\:text-right{text-align:right}}@media (min-width:768px){.md\\:border-t-0{border-top-width:0}.md\\:border-l{border-left-width:1px}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}}\n</style>\n"
  },
  {
    "path": "resources/js/views/login/Login.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row justify-content-center my-5\">\n            <div class=\"col-md-6\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-body\">\n                        <form @submit.prevent=\"submitLogin\">\n                            <div class=\"\">\n                                <!-- Email -->\n                                <div class=\"mb-3\">\n                                    <label for=\"email\" class=\"form-label\">{{ $t('email') }}</label>\n                                    <input v-model=\"loginForm.email\" id=\"email\" type=\"email\" class=\"form-control\" autofocus autocomplete=\"username\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.email\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <!-- Password -->\n                                <div class=\"mb-4\">\n                                    <label for=\"password\" class=\"form-label\">\n                                        {{ $t('password') }}\n                                    </label>\n                                    <input v-model=\"loginForm.password\" id=\"password\" type=\"password\" class=\"form-control\" autocomplete=\"current-password\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.password\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <!-- Remember me -->\n                                <div class=\"form-check\">\n                                    <input class=\"form-check-input\" type=\"checkbox\" name=\"remember\" v-model=\"loginForm.remember\" id=\"flexCheckIndeterminate\">\n                                    <label class=\"form-check-label\" for=\"flexCheckIndeterminate\">\n                                        {{ $t('remember_me') }}\n                                    </label>\n                                </div>\n\n                                <!-- Buttons -->\n                                <div class=\"flex items-center justify-end mt-4\">\n                                    <button class=\"btn btn-primary\" :class=\"{ 'opacity-25': processing }\" :disabled=\"processing\">\n                                        {{ $t('login') }}\n                                    </button>\n                                </div>\n                            </div>\n                            <router-link :to=\"{name: 'auth.forgot-password'}\">{{ $t('forgot_password')}}</router-link>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n\nimport useAuth from '@/composables/auth'\n\nconst { loginForm, validationErrors, processing, submitLogin } = useAuth();\n\n</script>\n"
  },
  {
    "path": "resources/js/views/posts/details.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row g-5 mt-4\">\n            <div class=\"col-md-8\">\n            <h3 class=\"pb-4 mb-4 fst-italic border-bottom\">\n                {{ post?.title }}\n            </h3>\n            <p class=\"blog-post-meta\">January 1, 2021 by <a href=\"#\">{{ post?.user?.name}}</a></p>\n\n            <article class=\"blog-post\">\n                <div v-for=\"image in post?.media\">\n                    <img :src=\"image.original_url\" alt=\"image\" class=\"img-fluid\">\n                </div>\n                <div class=\"mt-4\" v-html=\"post?.content\"></div>\n            </article>\n\n            <nav class=\"blog-pagination\" aria-label=\"Pagination\">\n                <a class=\"btn btn-outline-primary rounded-pill\" href=\"#\">Older</a>\n                <a class=\"btn btn-outline-secondary rounded-pill disabled\">Newer</a>\n            </nav>\n\n            </div>\n\n            <div class=\"col-md-4\">\n                <div class=\"position-sticky\" style=\"top: 2rem;\">\n                    <div class=\"p-4 mb-3 bg-light rounded\">\n                    <h4 class=\"fst-italic\">About</h4>\n                    <p class=\"mb-0\">Customize this section to tell your visitors a little bit about your publication, writers, content, or something else entirely. Totally up to you.</p>\n                    </div>\n\n                    <div class=\"p-4\">\n                        <h4 class=\"fst-italic\">Categories</h4>\n                        <ol v-if=\"categories?.length > 0\" class=\"list-unstyled\">\n                            <li v-for=\"category in categories\" :key=\"category.id\">\n                                <router-link :to=\"{ name: 'category-posts.index', params: { id: category.id } }\">{{ category.name }}</router-link>\n                            </li>\n                        </ol>\n                    </div>\n                    <!-- <div class=\"p-4\">\n                        <h4 class=\"fst-italic\">Archives</h4>\n                        <ol class=\"list-unstyled mb-0\">\n                            <li><a href=\"#\">March 2021</a></li>\n                            <li><a href=\"#\">February 2021</a></li>\n                            <li><a href=\"#\">January 2021</a></li>\n                            <li><a href=\"#\">December 2020</a></li>\n                            <li><a href=\"#\">November 2020</a></li>\n                            <li><a href=\"#\">October 2020</a></li>\n                            <li><a href=\"#\">September 2020</a></li>\n                            <li><a href=\"#\">August 2020</a></li>\n                            <li><a href=\"#\">July 2020</a></li>\n                            <li><a href=\"#\">June 2020</a></li>\n                            <li><a href=\"#\">May 2020</a></li>\n                            <li><a href=\"#\">April 2020</a></li>\n                        </ol>\n                    </div> -->\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport axios from 'axios';\nimport { ref, onMounted } from 'vue';\nimport { useRoute } from \"vue-router\";\n\n\n    const post = ref();\n    const categories = ref();\n    const route = useRoute()\n\n    onMounted(() => {\n        axios.get('/api/get-post/' + route.params.id).then(({ data }) => {\n            post.value = data\n        })\n        axios.get('/api/category-list').then(({ data }) => {\n            categories.value = data.data\n        })\n    })\n</script>\n"
  },
  {
    "path": "resources/js/views/posts/index.vue",
    "content": "<template>\n    <div class=\"container\">\n        <h2 class=\"text-center my-4\">Blog Posts</h2>\n        <div class=\"row mb-2\">\n            <div v-for=\"post in posts?.data\" :key=\"post.id\" class=\"col-md-6\">\n                <div\n                    class=\"row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative\">\n                    <div class=\"col-auto d-none d-lg-block d-md-block\">\n                        <img :src=\"getImageUrl(post)\" class=\"img-fluid\"/>\n                    </div>\n                    <div class=\"col p-4 d-flex flex-column position-static\">\n                        <strong v-for=\"category in post.categories\" class=\"d-inline-block mb-2 text-primary\">\n                            {{ category.name }}\n                        </strong>\n                        <h3 class=\"mb-0\">{{ post.title }}</h3>\n                        <div class=\"mb-1 text-muted\">Nov 12</div>\n                        <div class=\"card-text mb-auto\" v-html=\"post.content.substring(0, 150) + '...'\"></div>\n                        <router-link :to=\"{ name: 'public-posts.details', params: { id: post.id } }\"\n                                     class=\"stretched-link\">Continue reading\n                        </router-link>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport axios from 'axios';\nimport {ref, onMounted} from 'vue'\n\nconst posts = ref();\n\nfunction getImageUrl(post) {\n    let image\n    if (post.resized_image.length > 0) {\n        image = post.resized_image\n    } else {\n        image = post.original_image\n    }\n    return new URL(image, import.meta.url).href\n}\n\nonMounted(() => {\n    axios.get('/api/get-posts').then(({data}) => {\n        posts.value = data;\n    })\n})\n</script>\n"
  },
  {
    "path": "resources/js/views/register/index.vue",
    "content": "<template>\n    <div class=\"container\">\n        <div class=\"row justify-content-center my-5\">\n            <div class=\"col-md-6\">\n                <div class=\"card border-0 shadow-sm\">\n                    <div class=\"card-header bg-transparent\">{{ $t('register') }}</div>\n                    <div class=\"card-body\">\n                        <form @submit.prevent=\"submitRegister\">\n                            <div class=\"\">\n                                <!-- Email -->\n                                <div class=\"mb-3\">\n                                    <label for=\"name\" class=\"form-label\">{{ $t('name') }}</label>\n                                    <input v-model=\"registerForm.name\" id=\"name\" type=\"text\" class=\"form-control\" autofocus>\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.name\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"mb-3\">\n                                    <label for=\"email\" class=\"form-label\">{{ $t('email') }}</label>\n                                    <input v-model=\"registerForm.email\" id=\"email\" type=\"email\" class=\"form-control\" autocomplete=\"username\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.email\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <!-- Password -->\n                                <div class=\"mb-4\">\n                                    <label for=\"password\" class=\"form-label\">\n                                        {{ $t('password') }}\n                                    </label>\n                                    <input v-model=\"registerForm.password\" id=\"password\" type=\"password\" class=\"form-control\" autocomplete=\"current-password\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger mt-1\">\n                                        <div v-for=\"message in validationErrors?.password\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"mb-4\">\n                                    <label for=\"password_confirmation\" class=\"form-label\">\n                                        {{ $t('confirm_password') }}\n                                    </label>\n                                    <input v-model=\"registerForm.password_confirmation\" id=\"password_confirmation\" type=\"password\" class=\"form-control\" autocomplete=\"current-password\">\n                                    <!-- Validation Errors -->\n                                    <div class=\"text-danger-600 mt-1\">\n                                        <div v-for=\"message in validationErrors?.password_confirmation\">\n                                            {{ message }}\n                                        </div>\n                                    </div>\n                                </div>\n\n                                <!-- Buttons -->\n                                <div class=\"flex items-center justify-end mt-4\">\n                                    <button class=\"btn btn-primary\" :class=\"{ 'opacity-25': processing }\" :disabled=\"processing\">\n                                        {{ $t('register') }}\n                                    </button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup>\n\nimport useAuth from '@/composables/auth'\n\nconst { registerForm, validationErrors, processing, submitRegister } = useAuth();\n\n</script>\n"
  },
  {
    "path": "resources/sass/_custom.scss",
    "content": ".activity-timeline {\n    position: relative;\n}\n\n.activity-item {\n    padding: 1.5rem;\n    border-radius: 12px;\n    transition: all 0.3s ease;\n    border: 1px solid rgba(0, 0, 0, 0.05);\n    margin-bottom: 1rem;\n}\n\n.activity-item:hover {\n    background-color: #f8f9fa;\n    transform: translateX(5px);\n}\n\n.activity-icon {\n    width: 40px;\n    height: 40px;\n    border-radius: 10px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: white;\n}\n\n.activity-date {\n    font-size: 0.85rem;\n    color: #6c757d;\n}\n\n.activity-user img {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n}\n\n.filter-badge {\n    cursor: pointer;\n    transition: all 0.3s ease;\n    background-color: #ba9bc2;\n    border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.filter-badge:hover {\n    background-color: #e9ecef;\n}\n\n.filter-badge.active {\n    background-color: #0d6efd;\n    color: white;\n}\n\n.search-box {\n    border-radius: 10px;\n    border: 1px solid rgba(0, 0, 0, 0.1);\n    padding: 0.75rem 1rem;\n}\n\n.status-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    display: inline-block;\n    margin-right: 6px;\n}\n\n.bg-success-soft {\n    background-color: #d1e7dd;\n}\n\n.bg-danger-soft {\n    background-color: #f8d7da;\n}\n\n.bg-warning-soft {\n    background-color: #fff3cd;\n}\n\n.bg-info-soft {\n    background-color: #cff4fc;\n}\n"
  },
  {
    "path": "resources/sass/_variables.scss",
    "content": "// Body\n$body-bg: #f8fafc;\n\n// Typography\n$font-family-sans-serif: 'Nunito', sans-serif;\n$font-size-base: 0.9rem;\n$line-height-base: 1.6;\n"
  },
  {
    "path": "resources/sass/app.scss",
    "content": "// Fonts\n@import url('https://fonts.bunny.net/css?family=Nunito');\n\n// Variables\n//@import 'variables';\n\n// Bootstrap\n@import 'bootstrap/scss/bootstrap';\n@import \"custom\";\n\nbody {\n    background-color: #f0f2fc !important;\n}\n\na {\n    text-decoration: none !important;\n}\n"
  },
  {
    "path": "resources/views/auth/login.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Login') }}</div>\n\n                <div class=\"card-body\">\n                    <form method=\"POST\" action=\"{{ route('login') }}\">\n                        @csrf\n\n                        <div class=\"row mb-3\">\n                            <label for=\"email\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Email Address') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"email\" type=\"email\" class=\"form-control @error('email') is-invalid @enderror\" name=\"email\" value=\"{{ old('email') }}\" required autocomplete=\"email\" autofocus>\n\n                                @error('email')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <label for=\"password\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Password') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"password\" type=\"password\" class=\"form-control @error('password') is-invalid @enderror\" name=\"password\" required autocomplete=\"current-password\">\n\n                                @error('password')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <div class=\"col-md-6 offset-md-4\">\n                                <div class=\"form-check\">\n                                    <input class=\"form-check-input\" type=\"checkbox\" name=\"remember\" id=\"remember\" {{ old('remember') ? 'checked' : '' }}>\n\n                                    <label class=\"form-check-label\" for=\"remember\">\n                                        {{ __('Remember Me') }}\n                                    </label>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-0\">\n                            <div class=\"col-md-8 offset-md-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    {{ __('Login') }}\n                                </button>\n\n                                @if (Route::has('password.request'))\n                                    <a class=\"btn btn-link\" href=\"{{ route('password.request') }}\">\n                                        {{ __('Forgot Your Password?') }}\n                                    </a>\n                                @endif\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/passwords/confirm.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Confirm Password') }}</div>\n\n                <div class=\"card-body\">\n                    {{ __('Please confirm your password before continuing.') }}\n\n                    <form method=\"POST\" action=\"{{ route('password.confirm') }}\">\n                        @csrf\n\n                        <div class=\"row mb-3\">\n                            <label for=\"password\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Password') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"password\" type=\"password\" class=\"form-control @error('password') is-invalid @enderror\" name=\"password\" required autocomplete=\"current-password\">\n\n                                @error('password')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-0\">\n                            <div class=\"col-md-8 offset-md-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    {{ __('Confirm Password') }}\n                                </button>\n\n                                @if (Route::has('password.request'))\n                                    <a class=\"btn btn-link\" href=\"{{ route('password.request') }}\">\n                                        {{ __('Forgot Your Password?') }}\n                                    </a>\n                                @endif\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/passwords/email.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Reset Password') }}</div>\n\n                <div class=\"card-body\">\n                    @if (session('status'))\n                        <div class=\"alert alert-success\" role=\"alert\">\n                            {{ session('status') }}\n                        </div>\n                    @endif\n\n                    <form method=\"POST\" action=\"{{ route('password.email') }}\">\n                        @csrf\n\n                        <div class=\"row mb-3\">\n                            <label for=\"email\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Email Address') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"email\" type=\"email\" class=\"form-control @error('email') is-invalid @enderror\" name=\"email\" value=\"{{ old('email') }}\" required autocomplete=\"email\" autofocus>\n\n                                @error('email')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-0\">\n                            <div class=\"col-md-6 offset-md-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    {{ __('Send Password Reset Link') }}\n                                </button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/passwords/reset.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Reset Password') }}</div>\n\n                <div class=\"card-body\">\n                    <form method=\"POST\" action=\"{{ route('password.update') }}\">\n                        @csrf\n\n                        <input type=\"hidden\" name=\"token\" value=\"{{ $token }}\">\n\n                        <div class=\"row mb-3\">\n                            <label for=\"email\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Email Address') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"email\" type=\"email\" class=\"form-control @error('email') is-invalid @enderror\" name=\"email\" value=\"{{ $email ?? old('email') }}\" required autocomplete=\"email\" autofocus>\n\n                                @error('email')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <label for=\"password\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Password') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"password\" type=\"password\" class=\"form-control @error('password') is-invalid @enderror\" name=\"password\" required autocomplete=\"new-password\">\n\n                                @error('password')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <label for=\"password-confirm\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Confirm Password') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"password-confirm\" type=\"password\" class=\"form-control\" name=\"password_confirmation\" required autocomplete=\"new-password\">\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-0\">\n                            <div class=\"col-md-6 offset-md-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    {{ __('Reset Password') }}\n                                </button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/register.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Register') }}</div>\n\n                <div class=\"card-body\">\n                    <form method=\"POST\" action=\"{{ route('register') }}\">\n                        @csrf\n\n                        <div class=\"row mb-3\">\n                            <label for=\"name\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Name') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"name\" type=\"text\" class=\"form-control @error('name') is-invalid @enderror\" name=\"name\" value=\"{{ old('name') }}\" required autocomplete=\"name\" autofocus>\n\n                                @error('name')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <label for=\"email\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Email Address') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"email\" type=\"email\" class=\"form-control @error('email') is-invalid @enderror\" name=\"email\" value=\"{{ old('email') }}\" required autocomplete=\"email\">\n\n                                @error('email')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <label for=\"password\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Password') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"password\" type=\"password\" class=\"form-control @error('password') is-invalid @enderror\" name=\"password\" required autocomplete=\"new-password\">\n\n                                @error('password')\n                                    <span class=\"invalid-feedback\" role=\"alert\">\n                                        <strong>{{ $message }}</strong>\n                                    </span>\n                                @enderror\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-3\">\n                            <label for=\"password-confirm\" class=\"col-md-4 col-form-label text-md-end\">{{ __('Confirm Password') }}</label>\n\n                            <div class=\"col-md-6\">\n                                <input id=\"password-confirm\" type=\"password\" class=\"form-control\" name=\"password_confirmation\" required autocomplete=\"new-password\">\n                            </div>\n                        </div>\n\n                        <div class=\"row mb-0\">\n                            <div class=\"col-md-6 offset-md-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    {{ __('Register') }}\n                                </button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/verify.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Verify Your Email Address') }}</div>\n\n                <div class=\"card-body\">\n                    @if (session('resent'))\n                        <div class=\"alert alert-success\" role=\"alert\">\n                            {{ __('A fresh verification link has been sent to your email address.') }}\n                        </div>\n                    @endif\n\n                    {{ __('Before proceeding, please check your email for a verification link.') }}\n                    {{ __('If you did not receive the email') }},\n                    <form class=\"d-inline\" method=\"POST\" action=\"{{ route('verification.resend') }}\">\n                        @csrf\n                        <button type=\"submit\" class=\"btn btn-link p-0 m-0 align-baseline\">{{ __('click here to request another') }}</button>.\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/home.blade.php",
    "content": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row justify-content-center\">\n        <div class=\"col-md-8\">\n            <div class=\"card\">\n                <div class=\"card-header\">{{ __('Dashboard') }}</div>\n\n                <div class=\"card-body\">\n                    @if (session('status'))\n                        <div class=\"alert alert-success\" role=\"alert\">\n                            {{ session('status') }}\n                        </div>\n                    @endif\n\n                    {{ __('You are logged in!') }}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/layouts/app.blade.php",
    "content": "<!doctype html>\n<html lang=\"{{ str_replace('_', '-', app()->getLocale()) }}\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- CSRF Token -->\n    <meta name=\"csrf-token\" content=\"{{ csrf_token() }}\">\n\n    <title>{{ config('app.name', 'Laravel') }}</title>\n\n    <!-- Fonts -->\n    <link rel=\"dns-prefetch\" href=\"//fonts.gstatic.com\">\n    <link href=\"https://fonts.bunny.net/css?family=Nunito\" rel=\"stylesheet\">\n\n    <!-- Scripts -->\n    @vite(['resources/sass/app.scss', 'resources/js/app.js'])\n</head>\n<body>\n    <div id=\"app\">\n        <nav class=\"navbar navbar-expand-md navbar-light bg-white shadow-sm\">\n            <div class=\"container\">\n                <a class=\"navbar-brand\" href=\"{{ url('/') }}\">\n                    {{ config('app.name', 'Laravel') }}\n                </a>\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"{{ __('Toggle navigation') }}\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <!-- Left Side Of Navbar -->\n                    <ul class=\"navbar-nav me-auto\">\n\n                    </ul>\n\n                    <!-- Right Side Of Navbar -->\n                    <ul class=\"navbar-nav ms-auto\">\n                        <!-- Authentication Links -->\n                        @guest\n                            @if (Route::has('login'))\n                                <li class=\"nav-item\">\n                                    <a class=\"nav-link\" href=\"{{ route('login') }}\">{{ __('Login') }}</a>\n                                </li>\n                            @endif\n\n                            @if (Route::has('register'))\n                                <li class=\"nav-item\">\n                                    <a class=\"nav-link\" href=\"{{ route('register') }}\">{{ __('Register') }}</a>\n                                </li>\n                            @endif\n                        @else\n                            <li class=\"nav-item dropdown\">\n                                <a id=\"navbarDropdown\" class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\" v-pre>\n                                    {{ Auth::user()->name }}\n                                </a>\n\n                                <div class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"navbarDropdown\">\n                                    <a class=\"dropdown-item\" href=\"{{ route('logout') }}\"\n                                       onclick=\"event.preventDefault();\n                                                     document.getElementById('logout-form').submit();\">\n                                        {{ __('Logout') }}\n                                    </a>\n\n                                    <form id=\"logout-form\" action=\"{{ route('logout') }}\" method=\"POST\" class=\"d-none\">\n                                        @csrf\n                                    </form>\n                                </div>\n                            </li>\n                        @endguest\n                    </ul>\n                </div>\n            </div>\n        </nav>\n\n        <main class=\"py-4\">\n            @yield('content')\n        </main>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "resources/views/layouts/master.blade.php",
    "content": "<!doctype html>\n<html lang=\"{{ str_replace('_', '-', app()->getLocale()) }}\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- CSRF Token -->\n    <meta name=\"csrf-token\" content=\"{{ csrf_token() }}\">\n\n    <title>{{ config('app.name', 'Laravel') }}</title>\n\n    <!-- Fonts -->\n    <link rel=\"dns-prefetch\" href=\"//fonts.gstatic.com\">\n    <link href=\"https://fonts.bunny.net/css?family=Nunito\" rel=\"stylesheet\">\n\n    <!-- Scripts -->\n    @vite(['resources/sass/app.scss', 'resources/js/app.js'])\n</head>\n<body>\n    <div id=\"app\">\n        <nav class=\"navbar navbar-expand-md navbar-light bg-white shadow-sm\">\n            <div class=\"container\">\n                <a class=\"navbar-brand\" href=\"{{ url('/') }}\">\n                    {{ config('app.name', 'Laravel') }}\n                </a>\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"{{ __('Toggle navigation') }}\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n\n                <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                    <!-- Left Side Of Navbar -->\n                    <ul class=\"navbar-nav me-auto\">\n\n                    </ul>\n\n                    <!-- Right Side Of Navbar -->\n                    <ul class=\"navbar-nav ms-auto\">\n                        <!-- Authentication Links -->\n                        @guest\n                            @if (Route::has('login'))\n                                <li class=\"nav-item\">\n                                    <a class=\"nav-link\" href=\"{{ route('login') }}\">{{ __('Login') }}</a>\n                                </li>\n                            @endif\n\n                            @if (Route::has('register'))\n                                <li class=\"nav-item\">\n                                    <a class=\"nav-link\" href=\"{{ route('register') }}\">{{ __('Register') }}</a>\n                                </li>\n                            @endif\n                        @else\n                            <li class=\"nav-item dropdown\">\n                                <a id=\"navbarDropdown\" class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\" v-pre>\n                                    {{ Auth::user()->name }}\n                                </a>\n\n                                <div class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"navbarDropdown\">\n                                    <a class=\"dropdown-item\" href=\"{{ route('logout') }}\"\n                                       onclick=\"event.preventDefault();\n                                                     document.getElementById('logout-form').submit();\">\n                                        {{ __('Logout') }}\n                                    </a>\n\n                                    <form id=\"logout-form\" action=\"{{ route('logout') }}\" method=\"POST\" class=\"d-none\">\n                                        @csrf\n                                    </form>\n                                </div>\n                            </li>\n                        @endguest\n                    </ul>\n                </div>\n            </div>\n        </nav>\n\n        <main class=\"py-4\">\n            @yield('content')\n        </main>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "resources/views/main-view.blade.php",
    "content": "@php\n    $config = [\n        'appName' => config('app.name'),\n        'locale' => $locale = app()->getLocale(),\n        'locales' => config('app.locales'),\n    ];\n@endphp\n<!doctype html>\n<html lang=\"{{ str_replace('_', '-', app()->getLocale()) }}\" data-bs-theme=\"light\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- CSRF Token -->\n    <meta name=\"csrf-token\" content=\"{{ csrf_token() }}\">\n\n    <title>Laravel Vue 3 Stater</title>\n\n    <!-- Fonts -->\n    <link rel=\"dns-prefetch\" href=\"//fonts.gstatic.com\">\n    <link href=\"https://fonts.bunny.net/css?family=Nunito\" rel=\"stylesheet\">\n    <script>\n        window.config = @json($config);\n    </script>\n    <!-- Scripts -->\n    @vite(['resources/sass/app.scss', 'resources/js/app.js'])\n</head>\n<body class=\"font-sans antialiased\" id=\"app\">\n    <router-view></router-view>\n</body>\n</html>\n"
  },
  {
    "path": "resources/views/welcome.blade.php",
    "content": "<!DOCTYPE html>\n<html lang=\"{{ str_replace('_', '-', app()->getLocale()) }}\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <title>Laravel</title>\n\n        <!-- Fonts -->\n        <link href=\"https://fonts.bunny.net/css2?family=Nunito:wght@400;600;700&display=swap\" rel=\"stylesheet\">\n\n        <!-- Styles -->\n        <style>\n            /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\\:rounded-lg{border-radius:.5rem}.sm\\:block{display:block}.sm\\:items-center{align-items:center}.sm\\:justify-start{justify-content:flex-start}.sm\\:justify-between{justify-content:space-between}.sm\\:h-20{height:5rem}.sm\\:ml-0{margin-left:0}.sm\\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\\:pt-0{padding-top:0}.sm\\:text-left{text-align:left}.sm\\:text-right{text-align:right}}@media (min-width:768px){.md\\:border-t-0{border-top-width:0}.md\\:border-l{border-left-width:1px}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}}\n        </style>\n\n        <style>\n            body {\n                font-family: 'Nunito', sans-serif;\n            }\n        </style>\n    </head>\n    <body class=\"antialiased\">\n        <div class=\"relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0\">\n            @if (Route::has('login'))\n                <div class=\"hidden fixed top-0 right-0 px-6 py-4 sm:block\">\n                    @auth\n                        <a href=\"{{ url('/home') }}\" class=\"text-sm text-gray-700 dark:text-gray-500 underline\">Home</a>\n                    @else\n                        <a href=\"{{ route('login') }}\" class=\"text-sm text-gray-700 dark:text-gray-500 underline\">Log in</a>\n\n                        @if (Route::has('register'))\n                            <a href=\"{{ route('register') }}\" class=\"ml-4 text-sm text-gray-700 dark:text-gray-500 underline\">Register</a>\n                        @endif\n                    @endauth\n                </div>\n            @endif\n\n            <div class=\"max-w-6xl mx-auto sm:px-6 lg:px-8\">\n                <div class=\"flex justify-center pt-8 sm:justify-start sm:pt-0\">\n                    <svg viewBox=\"0 0 651 192\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-16 w-auto text-gray-700 sm:h-20\">\n                        <g clip-path=\"url(#clip0)\" fill=\"#EF3B2D\">\n                            <path d=\"M248.032 44.676h-16.466v100.23h47.394v-14.748h-30.928V44.676zM337.091 87.202c-2.101-3.341-5.083-5.965-8.949-7.875-3.865-1.909-7.756-2.864-11.669-2.864-5.062 0-9.69.931-13.89 2.792-4.201 1.861-7.804 4.417-10.811 7.661-3.007 3.246-5.347 6.993-7.016 11.239-1.672 4.249-2.506 8.713-2.506 13.389 0 4.774.834 9.26 2.506 13.459 1.669 4.202 4.009 7.925 7.016 11.169 3.007 3.246 6.609 5.799 10.811 7.66 4.199 1.861 8.828 2.792 13.89 2.792 3.913 0 7.804-.955 11.669-2.863 3.866-1.908 6.849-4.533 8.949-7.875v9.021h15.607V78.182h-15.607v9.02zm-1.431 32.503c-.955 2.578-2.291 4.821-4.009 6.73-1.719 1.91-3.795 3.437-6.229 4.582-2.435 1.146-5.133 1.718-8.091 1.718-2.96 0-5.633-.572-8.019-1.718-2.387-1.146-4.438-2.672-6.156-4.582-1.719-1.909-3.032-4.152-3.938-6.73-.909-2.577-1.36-5.298-1.36-8.161 0-2.864.451-5.585 1.36-8.162.905-2.577 2.219-4.819 3.938-6.729 1.718-1.908 3.77-3.437 6.156-4.582 2.386-1.146 5.059-1.718 8.019-1.718 2.958 0 5.656.572 8.091 1.718 2.434 1.146 4.51 2.674 6.229 4.582 1.718 1.91 3.054 4.152 4.009 6.729.953 2.577 1.432 5.298 1.432 8.162-.001 2.863-.479 5.584-1.432 8.161zM463.954 87.202c-2.101-3.341-5.083-5.965-8.949-7.875-3.865-1.909-7.756-2.864-11.669-2.864-5.062 0-9.69.931-13.89 2.792-4.201 1.861-7.804 4.417-10.811 7.661-3.007 3.246-5.347 6.993-7.016 11.239-1.672 4.249-2.506 8.713-2.506 13.389 0 4.774.834 9.26 2.506 13.459 1.669 4.202 4.009 7.925 7.016 11.169 3.007 3.246 6.609 5.799 10.811 7.66 4.199 1.861 8.828 2.792 13.89 2.792 3.913 0 7.804-.955 11.669-2.863 3.866-1.908 6.849-4.533 8.949-7.875v9.021h15.607V78.182h-15.607v9.02zm-1.432 32.503c-.955 2.578-2.291 4.821-4.009 6.73-1.719 1.91-3.795 3.437-6.229 4.582-2.435 1.146-5.133 1.718-8.091 1.718-2.96 0-5.633-.572-8.019-1.718-2.387-1.146-4.438-2.672-6.156-4.582-1.719-1.909-3.032-4.152-3.938-6.73-.909-2.577-1.36-5.298-1.36-8.161 0-2.864.451-5.585 1.36-8.162.905-2.577 2.219-4.819 3.938-6.729 1.718-1.908 3.77-3.437 6.156-4.582 2.386-1.146 5.059-1.718 8.019-1.718 2.958 0 5.656.572 8.091 1.718 2.434 1.146 4.51 2.674 6.229 4.582 1.718 1.91 3.054 4.152 4.009 6.729.953 2.577 1.432 5.298 1.432 8.162 0 2.863-.479 5.584-1.432 8.161zM650.772 44.676h-15.606v100.23h15.606V44.676zM365.013 144.906h15.607V93.538h26.776V78.182h-42.383v66.724zM542.133 78.182l-19.616 51.096-19.616-51.096h-15.808l25.617 66.724h19.614l25.617-66.724h-15.808zM591.98 76.466c-19.112 0-34.239 15.706-34.239 35.079 0 21.416 14.641 35.079 36.239 35.079 12.088 0 19.806-4.622 29.234-14.688l-10.544-8.158c-.006.008-7.958 10.449-19.832 10.449-13.802 0-19.612-11.127-19.612-16.884h51.777c2.72-22.043-11.772-40.877-33.023-40.877zm-18.713 29.28c.12-1.284 1.917-16.884 18.589-16.884 16.671 0 18.697 15.598 18.813 16.884h-37.402zM184.068 43.892c-.024-.088-.073-.165-.104-.25-.058-.157-.108-.316-.191-.46-.056-.097-.137-.176-.203-.265-.087-.117-.161-.242-.265-.345-.085-.086-.194-.148-.29-.223-.109-.085-.206-.182-.327-.252l-.002-.001-.002-.002-35.648-20.524a2.971 2.971 0 00-2.964 0l-35.647 20.522-.002.002-.002.001c-.121.07-.219.167-.327.252-.096.075-.205.138-.29.223-.103.103-.178.228-.265.345-.066.089-.147.169-.203.265-.083.144-.133.304-.191.46-.031.085-.08.162-.104.25-.067.249-.103.51-.103.776v38.979l-29.706 17.103V24.493a3 3 0 00-.103-.776c-.024-.088-.073-.165-.104-.25-.058-.157-.108-.316-.191-.46-.056-.097-.137-.176-.203-.265-.087-.117-.161-.242-.265-.345-.085-.086-.194-.148-.29-.223-.109-.085-.206-.182-.327-.252l-.002-.001-.002-.002L40.098 1.396a2.971 2.971 0 00-2.964 0L1.487 21.919l-.002.002-.002.001c-.121.07-.219.167-.327.252-.096.075-.205.138-.29.223-.103.103-.178.228-.265.345-.066.089-.147.169-.203.265-.083.144-.133.304-.191.46-.031.085-.08.162-.104.25-.067.249-.103.51-.103.776v122.09c0 1.063.568 2.044 1.489 2.575l71.293 41.045c.156.089.324.143.49.202.078.028.15.074.23.095a2.98 2.98 0 001.524 0c.069-.018.132-.059.2-.083.176-.061.354-.119.519-.214l71.293-41.045a2.971 2.971 0 001.489-2.575v-38.979l34.158-19.666a2.971 2.971 0 001.489-2.575V44.666a3.075 3.075 0 00-.106-.774zM74.255 143.167l-29.648-16.779 31.136-17.926.001-.001 34.164-19.669 29.674 17.084-21.772 12.428-43.555 24.863zm68.329-76.259v33.841l-12.475-7.182-17.231-9.92V49.806l12.475 7.182 17.231 9.92zm2.97-39.335l29.693 17.095-29.693 17.095-29.693-17.095 29.693-17.095zM54.06 114.089l-12.475 7.182V46.733l17.231-9.92 12.475-7.182v74.537l-17.231 9.921zM38.614 7.398l29.693 17.095-29.693 17.095L8.921 24.493 38.614 7.398zM5.938 29.632l12.475 7.182 17.231 9.92v79.676l.001.005-.001.006c0 .114.032.221.045.333.017.146.021.294.059.434l.002.007c.032.117.094.222.14.334.051.124.088.255.156.371a.036.036 0 00.004.009c.061.105.149.191.222.288.081.105.149.22.244.314l.008.01c.084.083.19.142.284.215.106.083.202.178.32.247l.013.005.011.008 34.139 19.321v34.175L5.939 144.867V29.632h-.001zm136.646 115.235l-65.352 37.625V148.31l48.399-27.628 16.953-9.677v33.862zm35.646-61.22l-29.706 17.102V66.908l17.231-9.92 12.475-7.182v33.841z\"/>\n                        </g>\n                    </svg>\n                </div>\n\n                <div class=\"mt-8 bg-white dark:bg-gray-800 overflow-hidden shadow sm:rounded-lg\">\n                    <div class=\"grid grid-cols-1 md:grid-cols-2\">\n                        <div class=\"p-6\">\n                            <div class=\"flex items-center\">\n                                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" class=\"w-8 h-8 text-gray-500\"><path d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"></path></svg>\n                                <div class=\"ml-4 text-lg leading-7 font-semibold\"><a href=\"https://laravel.com/docs\" class=\"underline text-gray-900 dark:text-white\">Documentation</a></div>\n                            </div>\n\n                            <div class=\"ml-12\">\n                                <div class=\"mt-2 text-gray-600 dark:text-gray-400 text-sm\">\n                                    Laravel has wonderful, thorough documentation covering every aspect of the framework. Whether you are new to the framework or have previous experience with Laravel, we recommend reading all of the documentation from beginning to end.\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"p-6 border-t border-gray-200 dark:border-gray-700 md:border-t-0 md:border-l\">\n                            <div class=\"flex items-center\">\n                                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" class=\"w-8 h-8 text-gray-500\"><path d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\"></path><path d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\"></path></svg>\n                                <div class=\"ml-4 text-lg leading-7 font-semibold\"><a href=\"https://laracasts.com\" class=\"underline text-gray-900 dark:text-white\">Laracasts</a></div>\n                            </div>\n\n                            <div class=\"ml-12\">\n                                <div class=\"mt-2 text-gray-600 dark:text-gray-400 text-sm\">\n                                    Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"p-6 border-t border-gray-200 dark:border-gray-700\">\n                            <div class=\"flex items-center\">\n                                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" class=\"w-8 h-8 text-gray-500\"><path d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"></path></svg>\n                                <div class=\"ml-4 text-lg leading-7 font-semibold\"><a href=\"https://laravel-news.com/\" class=\"underline text-gray-900 dark:text-white\">Laravel News</a></div>\n                            </div>\n\n                            <div class=\"ml-12\">\n                                <div class=\"mt-2 text-gray-600 dark:text-gray-400 text-sm\">\n                                    Laravel News is a community driven portal and newsletter aggregating all of the latest and most important news in the Laravel ecosystem, including new package releases and tutorials.\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"p-6 border-t border-gray-200 dark:border-gray-700 md:border-l\">\n                            <div class=\"flex items-center\">\n                                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" class=\"w-8 h-8 text-gray-500\"><path d=\"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg>\n                                <div class=\"ml-4 text-lg leading-7 font-semibold text-gray-900 dark:text-white\">Vibrant Ecosystem</div>\n                            </div>\n\n                            <div class=\"ml-12\">\n                                <div class=\"mt-2 text-gray-600 dark:text-gray-400 text-sm\">\n                                    Laravel's robust library of first-party tools and libraries, such as <a href=\"https://forge.laravel.com\" class=\"underline\">Forge</a>, <a href=\"https://vapor.laravel.com\" class=\"underline\">Vapor</a>, <a href=\"https://nova.laravel.com\" class=\"underline\">Nova</a>, and <a href=\"https://envoyer.io\" class=\"underline\">Envoyer</a> help you take your projects to the next level. Pair them with powerful open source libraries like <a href=\"https://laravel.com/docs/billing\" class=\"underline\">Cashier</a>, <a href=\"https://laravel.com/docs/dusk\" class=\"underline\">Dusk</a>, <a href=\"https://laravel.com/docs/broadcasting\" class=\"underline\">Echo</a>, <a href=\"https://laravel.com/docs/horizon\" class=\"underline\">Horizon</a>, <a href=\"https://laravel.com/docs/sanctum\" class=\"underline\">Sanctum</a>, <a href=\"https://laravel.com/docs/telescope\" class=\"underline\">Telescope</a>, and more.\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                <div class=\"flex justify-center mt-4 sm:items-center sm:justify-between\">\n                    <div class=\"text-center text-sm text-gray-500 sm:text-left\">\n                        <div class=\"flex items-center\">\n                            <svg fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" class=\"-mt-px w-5 h-5 text-gray-400\">\n                                <path d=\"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z\"></path>\n                            </svg>\n\n                            <a href=\"https://laravel.bigcartel.com\" class=\"ml-1 underline\">\n                                Shop\n                            </a>\n\n                            <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" class=\"ml-4 -mt-px w-5 h-5 text-gray-400\">\n                                <path d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"></path>\n                            </svg>\n\n                            <a href=\"https://github.com/sponsors/taylorotwell\" class=\"ml-1 underline\">\n                                Sponsor\n                            </a>\n                        </div>\n                    </div>\n\n                    <div class=\"ml-4 text-center text-sm text-gray-500 sm:text-right sm:ml-0\">\n                        Laravel v{{ Illuminate\\Foundation\\Application::VERSION }} (PHP v{{ PHP_VERSION }})\n                    </div>\n                </div>\n            </div>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "routes/api.php",
    "content": "<?php\n\nuse App\\Http\\Controllers\\Api\\ActivityLogController;\nuse App\\Http\\Controllers\\Api\\BrowserSessionController;\nuse App\\Http\\Controllers\\Api\\CategoryController;\nuse App\\Http\\Controllers\\Api\\PermissionController;\nuse App\\Http\\Controllers\\Api\\PostController;\nuse App\\Http\\Controllers\\Api\\ProfileController;\nuse App\\Http\\Controllers\\Api\\RoleController;\nuse App\\Http\\Controllers\\Api\\UserController;\nuse App\\Http\\Controllers\\Auth\\AuthenticatedSessionController;\nuse App\\Http\\Controllers\\Auth\\ResetPasswordController;\nuse App\\Http\\Controllers\\Auth\\VerificationController;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\n\nuse App\\Http\\Controllers\\Auth\\ForgotPasswordController;\n\nRoute::post('login', [AuthenticatedSessionController::class, 'login']);\nRoute::post('register', [AuthenticatedSessionController::class, 'register']);\nRoute::post('logout', [AuthenticatedSessionController::class, 'logout']);\nRoute::post('forget-password', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('forget.password.post');\nRoute::post('reset-password', [ResetPasswordController::class, 'reset'])->name('password.reset');\n\n// Email Verification Routes (API)\nRoute::get('/email/verify/{id}/{hash}', [VerificationController::class, 'verify'])\n    ->middleware(['auth:sanctum', \\App\\Http\\Middleware\\HandleInvalidSignature::class])\n    ->name('verification.verify');\n\nRoute::middleware('auth:sanctum')->group(function () {\n    Route::post('/email/verification-notification', [VerificationController::class, 'resend'])\n        ->middleware('throttle:6,1')\n        ->name('verification.resend');\n});\n\n// Protected routes requiring authentication AND verified email\n// NOTE: Previous array syntax was incorrect: 'verified' was a stray element and ignored.\nRoute::group(['middleware' => ['auth:sanctum','verified.api']], function() {\n\n    Route::group(['middleware' => ['verified.api']], function() {});\n\n    Route::apiResource('users', UserController::class);\n    Route::apiResource('posts', PostController::class);\n    Route::apiResource('categories', CategoryController::class);\n    Route::apiResource('roles', RoleController::class);\n    Route::get('role-list', [RoleController::class, 'getList']);\n    Route::get('role-permissions/{id}', [PermissionController::class, 'getRolePermissions']);\n    Route::put('/role-permissions', [PermissionController::class, 'updateRolePermissions']);\n    Route::apiResource('permissions', PermissionController::class);\n    Route::get('category-list', [CategoryController::class, 'getList']);\n    Route::get('/user', [ProfileController::class, 'user']);\n    Route::put('/user', [ProfileController::class, 'update']);\n\n    // Browser Sessions\n    Route::get('browser-sessions', [BrowserSessionController::class, 'index']);\n    Route::post('logout-other-devices', [BrowserSessionController::class, 'logoutOtherDevices']);\n\n    // Activity log\n    Route::get('activity-logs', ActivityLogController::class);\n\n    Route::get('abilities', function(Request $request) {\n        return $request->user()->roles()->with('permissions')\n            ->get()\n            ->pluck('permissions')\n            ->flatten()\n            ->pluck('name')\n            ->unique()\n            ->values()\n            ->toArray();\n    });\n});\n\nRoute::get('category-list', [CategoryController::class, 'getList']);\nRoute::get('get-posts', [PostController::class, 'getPosts']);\nRoute::get('get-category-posts/{id}', [PostController::class, 'getCategoryByPosts']);\nRoute::get('get-post/{id}', [PostController::class, 'getPost']);\n"
  },
  {
    "path": "routes/channels.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Broadcast;\n\n/*\n|--------------------------------------------------------------------------\n| Broadcast Channels\n|--------------------------------------------------------------------------\n|\n| Here you may register all of the event broadcasting channels that your\n| application supports. The given channel authorization callbacks are\n| used to check if an authenticated user can listen to the channel.\n|\n*/\n\nBroadcast::channel('App.Models.User.{id}', function ($user, $id) {\n    return (int) $user->id === (int) $id;\n});\n"
  },
  {
    "path": "routes/console.php",
    "content": "<?php\n\nuse Illuminate\\Foundation\\Inspiring;\nuse Illuminate\\Support\\Facades\\Artisan;\n\n/*\n|--------------------------------------------------------------------------\n| Console Routes\n|--------------------------------------------------------------------------\n|\n| This file is where you may define all of your Closure based console\n| commands. Each Closure is bound to a command instance allowing a\n| simple approach to interacting with each command's IO methods.\n|\n*/\n\nArtisan::command('inspire', function () {\n    $this->comment(Inspiring::quote());\n})->purpose('Display an inspiring quote');\n"
  },
  {
    "path": "routes/web.php",
    "content": "<?php\n\nuse App\\Http\\Controllers\\Auth\\AuthenticatedSessionController;\nuse App\\Http\\Controllers\\Auth\\VerificationController;\nuse Illuminate\\Support\\Facades\\Route;\n\n/*\n|--------------------------------------------------------------------------\n| Web Routes\n|--------------------------------------------------------------------------\n|\n| Here is where you can register web routes for your application. These\n| routes are loaded by the RouteServiceProvider within a group which\n| contains the \"web\" middleware group. Now create something great!\n|\n*/\n\nRoute::post('login', [AuthenticatedSessionController::class, 'login']);\nRoute::post('register', [AuthenticatedSessionController::class, 'register']);\nRoute::post('logout', [AuthenticatedSessionController::class, 'logout']);\n\n// Email Verification Routes\n/*Route::get('/email/verify/{id}/{hash}', [VerificationController::class, 'verify'])\n    ->middleware(['signed', 'throttle:6,1'])\n    ->name('verification.verify');\n\nRoute::post('/email/resend', [VerificationController::class, 'resend'])\n    ->middleware(['throttle:6,1'])\n    ->name('verification.resend');*/\n\n\n\n\n//Route::get('/home', [App\\Http\\Controllers\\HomeController::class, 'index'])->name('home');\n\n\nRoute::view('/{any?}', 'main-view')\n    ->name('dashboard')\n    ->where('any', '.*');\n"
  },
  {
    "path": "storage/app/.gitignore",
    "content": "*\n!public/\n!.gitignore\n"
  },
  {
    "path": "storage/framework/.gitignore",
    "content": "compiled.php\nconfig.php\ndown\nevents.scanned.php\nmaintenance.php\nroutes.php\nroutes.scanned.php\nschedule-*\nservices.json\n"
  },
  {
    "path": "storage/framework/cache/.gitignore",
    "content": "*\n!data/\n!.gitignore\n"
  },
  {
    "path": "storage/framework/sessions/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/framework/testing/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/framework/views/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/logs/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "tests/CreatesApplication.php",
    "content": "<?php\n\nnamespace Tests;\n\nuse Illuminate\\Contracts\\Console\\Kernel;\n\ntrait CreatesApplication\n{\n    /**\n     * Creates the application.\n     *\n     * @return \\Illuminate\\Foundation\\Application\n     */\n    public function createApplication()\n    {\n        $app = require __DIR__.'/../bootstrap/app.php';\n\n        $app->make(Kernel::class)->bootstrap();\n\n        return $app;\n    }\n}\n"
  },
  {
    "path": "tests/Feature/ExampleTest.php",
    "content": "<?php\n\nnamespace Tests\\Feature;\n\n// use Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Tests\\TestCase;\n\nclass ExampleTest extends TestCase\n{\n    /**\n     * A basic test example.\n     *\n     * @return void\n     */\n    public function test_the_application_returns_a_successful_response()\n    {\n        $response = $this->get('/');\n\n        $response->assertStatus(200);\n    }\n}\n"
  },
  {
    "path": "tests/TestCase.php",
    "content": "<?php\n\nnamespace Tests;\n\nuse Illuminate\\Foundation\\Testing\\TestCase as BaseTestCase;\n\nabstract class TestCase extends BaseTestCase\n{\n    use CreatesApplication;\n}\n"
  },
  {
    "path": "tests/Unit/ExampleTest.php",
    "content": "<?php\n\nnamespace Tests\\Unit;\n\nuse PHPUnit\\Framework\\TestCase;\n\nclass ExampleTest extends TestCase\n{\n    /**\n     * A basic test example.\n     *\n     * @return void\n     */\n    public function test_that_true_is_true()\n    {\n        $this->assertTrue(true);\n    }\n}\n"
  },
  {
    "path": "vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport laravel from 'laravel-vite-plugin';\nimport vue from '@vitejs/plugin-vue';\nimport path from 'path';\n\nexport default defineConfig({\n    plugins: [\n        laravel({\n            input: [\n                'resources/sass/app.scss',\n                'resources/js/app.js',\n            ],\n            // reactivityTransform: true,\n            refresh: true,\n        }),\n        vue({\n            template: {\n                transformAssetUrls: {\n                    base: null,\n                    includeAbsolute: false,\n                },\n            },\n        }),\n    ],\n    // build: {\n    //     chunkSizeWarningLimit: 1600,\n    // },\n    resolve: {\n        alias: {\n            vue: 'vue/dist/vue.esm-bundler.js',\n            '@': path.resolve(__dirname, './resources/js'),\n        },\n    }\n});\n"
  },
  {
    "path": "vue.config.js",
    "content": "module.exports = {\n    // Delete the prefetch plugin\n    chainWebpack: config => {\n      config.plugins.delete('prefetch')\n    }\n  }\n"
  }
]