151 Commits

Author SHA1 Message Date
Marek Lesko
426b4c55fc feat: add WebMessage model and controller with CRUD endpoints #7 2025-10-31 15:56:21 +00:00
Marek Lesko
4c85d18a79 fix: update Google Maps iframe source to correct location #9 2025-10-31 14:40:13 +00:00
Marek Lesko
a19fd6ea72 refactor: remove debug trace from ApiEndpointInterceptor 2025-10-31 14:39:29 +00:00
Marek Lesko
2653b6f6c1 feat: enhance app configuration and dashboard component with HTTP interceptors and improved data loading #4 2025-10-31 14:31:28 +00:00
Marek Lesko
a6c31bb93b fix: refine condition for serving static files in development environment 2025-10-31 14:30:47 +00:00
Marek Lesko
9683b069af feat: enhance footer logos with light and dark variants, improve theme handling in homepage component 2025-10-30 18:54:55 +00:00
Marek Lesko
b7cf4ab106 feat: restructure dashboard routing and components for improved organization and navigation 2025-10-30 17:59:14 +00:00
Marek Lesko
1cb5c3d03a feat: update dashboard routing and sidebar navigation for improved structure and clarity 2025-10-30 17:30:47 +00:00
Marek Lesko
e1bb591a38 feat: remove unused branding component from callback, update authentication service to handle missing issuer in configuration 2025-10-30 16:51:21 +00:00
Marek Lesko
b2a57675a7 fix: remove unused favicon and branding assets, update logo image sources to external URLs 2025-10-30 16:36:09 +00:00
Marek Lesko
b7cb864982 feat: Refactor settings handling in full layout and header components for improved theme management 2025-10-30 16:22:30 +00:00
Marek Lesko
d5619e42da feat: Update sidebar navigation and add dashboard component
- Changed display name for the main dashboard in sidebar from 'Dashboards' to 'Hlavná stránka'.
- Removed commented-out children routes for dashboards and frontend pages in sidebar.
- Added new dashboard component and its routing.
- Introduced logout functionality with a dedicated logout component.
- Updated authentication routes to include logout path.
- Modified callback component to navigate to the dashboard upon successful login.
- Enhanced authentication service to handle user profile loading more effectively.
2025-10-29 19:59:35 +00:00
Marek Lesko
74f15cabd9 fix: remove unused imports from callback component for cleaner code 2025-10-28 19:50:29 +00:00
Marek Lesko
204006a4cb fix: remove unused imports from callback component for cleaner code 2025-10-28 19:48:58 +00:00
Marek Lesko
ed5cba4677 feat: implement OAuth2 authentication flow with Google and PocketId, add callback handling 2025-10-28 19:43:46 +00:00
Marek Lesko
52696196b2 fix: update footer layout and improve favicon links for better accessibility 2025-10-24 08:42:49 +00:00
Marek Lesko
f939866d36 fix: adjust column width for topcards in homepage details for better layout 2025-10-22 17:48:50 +00:00
Marek Lesko
331c3d50f2 fix: correct formatting of box-shadow properties in frontend styles 2025-10-22 17:43:44 +00:00
Marek Lesko
1de0aabf6c feat: update error page text for improved localization and user experience 2025-10-22 17:32:42 +00:00
Marek Lesko
e57fb48c88 feat: integrate Google OAuth for user authentication and update login UI 2025-10-22 17:28:05 +00:00
Marek Lesko
c27568435e feat: update UI text and structure for improved user experience and localization 2025-10-22 15:45:02 +00:00
Marek Lesko
9d644a9b79 WIP 2025-10-22 14:44:25 +00:00
Marek Lesko
498d2c7ade devcontainer: update 2025-10-22 16:08:35 +02:00
Marek Lesko
213fd63860 Refactor code structure for improved readability and maintainability 2025-10-21 14:42:11 +00:00
Marek Lesko
61d52a5bd1 fix: update copy command in Dockerfile to avoid globbing for web build output 2025-10-19 18:56:20 +00:00
Marek Lesko
bae87359b0 fix: update output path for Angular build in Dockerfile 2025-10-19 18:52:19 +00:00
Marek Lesko
8cc8be7c2f fix: correct path for listing contents of build output directory in Dockerfile 2025-10-19 18:46:56 +00:00
Marek Lesko
2602c9a3b9 fix: add verification step to list contents of build output directory in Dockerfile 2025-10-19 18:45:54 +00:00
Marek Lesko
aae3eb92fa Edit docker-compose.yml 2025-10-19 18:26:35 +00:00
Marek Lesko
d3d9a9037e fix: remove version declaration and adjust app service configuration in docker-compose 2025-10-19 18:01:04 +00:00
Marek Lesko
ccfcc57f6b Merge branch 'dev' of https://gitlab.lesko.me/marek/centrum into dev 2025-10-19 17:57:38 +00:00
Marek Lesko
4e9cac7b44 refactor: remove unused example service from automations.yaml 2025-10-19 17:57:06 +00:00
Marek Lesko
147700ab82 Update .gitlab-ci.yml file 2025-10-19 17:39:42 +00:00
Marek Lesko
dea59357c3 fix: specify project file in dotnet restore command for clarity 2025-10-19 17:00:33 +00:00
Marek Lesko
f31ead1b6d fix: adjust Dockerfile to copy all API files before restoring dependencies 2025-10-19 16:57:08 +00:00
Marek Lesko
ba45c54e1d fix: reorder Dockerfile commands for improved build efficiency 2025-10-19 16:56:45 +00:00
Marek Lesko
56a5851783 fix: update Dockerfile to use npm ci for consistent installs 2025-10-19 16:52:52 +00:00
Marek Lesko
aba8943d17 Migrate to modernize template 2025-10-19 16:34:01 +00:00
Marek Lesko
9deee01ba3 fix: update Angular CLI version and refactor dialog component template
- Updated @angular/cli from version ~20.0.3 to ~20.3.6 in package.json.
- Refactored dialog.component.html to remove optional chaining from ngModel bindings for event properties.
2025-10-19 16:33:28 +00:00
Marek Lesko
f21ba09a6f Added pcakage-lock 2025-10-19 14:34:56 +00:00
Marek Lesko
0e5f91d02e Update .gitlab-ci.yml file 2025-10-14 12:04:42 +00:00
Marek Lesko
6ee421e109 Update .gitlab-ci.yml file 2025-10-14 11:54:16 +00:00
Marek Lesko
8e5561b80d Update .gitlab-ci.yml file 2025-10-14 11:52:17 +00:00
Marek Lesko
7a29d18494 Update .gitlab-ci.yml file 2025-10-14 11:49:46 +00:00
Marek Lesko
dcc17e7e25 chore: add initialization tasks for devcontainer setup 2025-10-14 10:29:12 +00:00
Marek Lesko
4c110f7f6e chore: update devcontainer configuration for improved setup 2025-10-14 10:18:12 +00:00
Marek Lesko
08d4432351 Changes 2025-10-14 08:22:01 +00:00
Marek Lesko
4dda50cbf4 ADDED Materialize theme 2025-10-13 18:18:04 +02:00
Marek Lesko
9451589a9d Edit docker-compose.yaml 2025-09-08 12:43:44 +00:00
Marek Lesko
5c3ea53231 Edit app.routes.ts 2025-08-06 20:18:17 +00:00
Marek Lesko
7919a93ab4 feat: integrate Tailwind CSS and implement dark mode functionality
- Added Tailwind CSS dependencies and configured PostCSS.
- Updated app component to wrap router outlet with a styled div for dark mode support.
- Modified routing to include a default route and added auth guards.
- Implemented dark mode toggle functionality in content component.
- Enhanced login component with improved styling and lifecycle management.
- Created items component with basic structure and routing.
- Added global styles for body and dark mode variants.
- Updated tests for new items component.
2025-08-06 19:53:23 +00:00
Marek Lesko
02116aa3df Refactor HTML and configuration files for improved structure and consistency
- Updated videos.html to enhance readability and maintainability.
- Refactored webpack.config.js for better organization and clarity.
- Cleaned up TypeScript configuration files (tsconfig.app.json, tsconfig.json, tsconfig.spec.json) for consistency in formatting.
- Adjusted docker-compose.yaml for improved formatting and readability.
2025-08-05 06:35:56 +00:00
Marek Lesko
83ca026a55 Edit Dockerfile 2025-08-04 18:45:55 +00:00
Marek Lesko
58d981b629 Edit app.config.ts #5 2025-08-03 18:48:20 +00:00
Marek Lesko
3fd3a77057 Edit app.config.ts #5 2025-08-03 18:41:37 +00:00
Marek Lesko
9cd2f4ef9c fix: simplify database connection string handling in Program.cs #3 2025-08-01 11:42:15 +02:00
Marek Lesko
4d26344665 fix: update CORS policy and add CorsOrigins to configuration #5 2025-08-01 11:02:57 +02:00
Marek Lesko
f8c555bc84 fix: correct escaping in apiEndpoint sed command in docker-build #5 2025-08-01 10:22:36 +02:00
Marek Lesko
09b9969292 fix: correct escaping in apiEndpoint sed command in docker-build #5 2025-08-01 10:21:46 +02:00
Marek Lesko
3638606e45 fix: correct escaping in apiEndpoint sed command in docker-build #5 2025-08-01 10:18:19 +02:00
Marek Lesko
fa229e1e0c fix: correct escaping in apiEndpoint sed command in docker-build #5 2025-08-01 10:14:35 +02:00
Marek Lesko
fc164063c8 fix: correct escaping in apiEndpoint sed command in docker-build #5 2025-08-01 10:11:11 +02:00
Marek Lesko
2df87904c1 fix: correct escaping in apiEndpoint sed command in docker-build #5 2025-08-01 10:07:10 +02:00
Marek Lesko
8447f82dcf fix: update apiEndpoint in docker-build to include https protocol #5 2025-08-01 09:58:47 +02:00
Marek Lesko
f25af78f81 fix: update AllowedHosts in docker-build to use PUBLIC_WEB_URL #5 2025-08-01 09:52:59 +02:00
Marek Lesko
c251589885 feat: implement API endpoint interceptor and update app configuration #5 2025-08-01 09:51:22 +02:00
Marek Lesko
7902cc4dcf Update .gitlab-ci.yml file #5 2025-08-01 07:06:11 +00:00
Marek Lesko
e7c75609d2 fix: update apiEndpoint in docker-build to use PUBLIC_WEB_URL #4 2025-08-01 09:00:51 +02:00
Marek Lesko
2f86edb5e6 Minor fixes #5 2025-08-01 08:38:44 +02:00
Marek Lesko
0ab0402172 feat: implement authentication flow and dynamic API configuration #5 2025-07-31 17:41:18 +02:00
Marek Lesko
42f84e878f fix: update redirectUri to use window.location.origin for dynamic URL handling #5 2025-07-31 15:59:40 +02:00
Marek Lesko
66757b4b9f Merge branch 'PROVIDING-authentication-flow' into 'dev'
feat: integrate angular-oauth2-oidc for authentication

See merge request marek/centrum!10
2025-07-30 06:09:18 +00:00
Marek Lesko
af127b716e fix: update package versions for EntityFramework and adjust API endpoint in login component 2025-07-30 08:05:36 +02:00
Marek Lesko
f032df2894 Update .gitlab-ci.yml file #5 2025-07-29 18:10:10 +00:00
Marek Lesko
329fb94a3a feat: update ProductController route and enhance authentication configuration 2025-07-29 16:23:12 +00:00
Marek Lesko
9217e805e9 feat: integrate angular-oauth2-oidc for authentication
- Added angular-oauth2-oidc package to package.json.
- Configured OAuth client in app.config.ts with resource server settings.
- Implemented login component with basic HTTP request to fetch products.
- Set up routing for the login component.
- Updated app component to initialize OAuth service and handle login.
- Modified default app settings to open and collapse sidenav by default.
- Removed placeholder content from app.html to streamline the initial view.
2025-07-29 15:58:56 +00:00
Marek Lesko
50f0bb7f57 Enable authorization for ProductController and update GetProducts method to support optional ID query parameter #5 2025-07-28 11:49:01 +00:00
Marek Lesko
35d7160fdd Remove unused flag from docker image prune command in docker-deploy job #5 2025-07-28 11:35:38 +00:00
Marek Lesko
228b303d3e Update update_db job to specify dotnet-ef version and adjust PATH for database migrations #5 2025-07-28 11:32:32 +00:00
Marek Lesko
d66e7e7126 Install dotnet-ef tool in update_db job for database migrations #5 2025-07-28 11:20:09 +00:00
Marek Lesko
b3e459211d Refactor update_db job to specify project paths for dotnet commands #5 2025-07-28 11:12:10 +00:00
Marek Lesko
e84cf9dfb7 Remove commented-out build jobs and adjust update_db job to change directory before restoring and building the project #5 2025-07-28 11:04:47 +00:00
Marek Lesko
a20155bb1e Add shell tag to docker-deploy job and set dependency for update_db job #5 2025-07-28 10:57:11 +00:00
Marek Lesko
14c3307339 Refactor database update job and update connection string in docker-compose for consistency #5 2025-07-28 10:50:11 +00:00
Marek Lesko
e35fe1bf6c Update database connection string to include TrustServerCertificate option #5 2025-07-28 10:26:51 +00:00
Marek Lesko
7b9ac121b6 Refactor docker-deploy script to change directory before pulling and deploying Docker images #5 2025-07-28 10:22:00 +00:00
Marek Lesko
7e3481e17f Update Docker build and deployment scripts for improved image tagging and configuration #5 2025-07-28 10:19:15 +00:00
Marek Lesko
e77a275885 Update Docker image tagging to use commit reference name instead of tag #5 2025-07-28 10:15:09 +00:00
Marek Lesko
6940ba1fc0 Add Docker image tagging and update deployment script in CI configuration #5 2025-07-28 10:12:28 +00:00
Marek Lesko
c8fde6f44c Refactor database connection handling and update Docker Compose environment variables #5 2025-07-28 10:05:41 +00:00
Marek Lesko
75e43c7473 Merge branch 'dev' of https://gitlab.lesko.me/marek/centrum into dev 2025-07-28 09:53:26 +00:00
Marek Lesko
2edb7aa3b3 Edit ProductController.cs #5 2025-07-28 09:31:02 +00:00
Marek Lesko
22159b15f3 Update .gitlab-ci.yml file #5 2025-07-28 09:27:24 +00:00
Marek Lesko
2199e1f5b2 Update .gitlab-ci.yml file 2025-07-28 09:16:30 +00:00
Marek Lesko
b0521f60a9 Add shared tag to docker-build job in CI configuration #5 2025-07-28 08:25:18 +00:00
Marek Lesko
014cf13072 Restore docker-compose.yaml for application and database services #5 2025-07-28 08:23:33 +00:00
Marek Lesko
91ffd122e9 Update GitLab CI configuration to use Docker Compose for deployment #5 2025-07-28 08:18:51 +00:00
Marek Lesko
246c22ff70 Edit Dockerfile #5 2025-07-28 07:23:09 +00:00
Marek Lesko
c7806a5463 Edit Dockerfile #5 2025-07-27 21:05:22 +00:00
Marek Lesko
cda065e25f Update .gitlab-ci.yml file #5 2025-07-27 20:47:42 +00:00
Marek Lesko
68cf1b30df Update .gitlab-ci.yml file #5 2025-07-27 20:35:24 +00:00
Marek Lesko
adb09771cb Update .gitlab-ci.yml file #5 2025-07-27 18:30:34 +00:00
Marek Lesko
10e2e631d6 Update .gitlab-ci.yml file #5 2025-07-27 18:22:12 +00:00
Marek Lesko
e0a1523e49 Update .gitlab-ci.yml file 2025-07-27 17:50:55 +00:00
Marek Lesko
d5b870530a Fix Docker build context path in CI configuration and add Dockerfile for multi-stage build #5 2025-07-27 17:47:10 +00:00
Marek Lesko
fd10c53dfb Update .gitlab-ci.yml file 2025-07-27 17:31:08 +00:00
Marek Lesko
0e4bbea454 Update .gitlab-ci.yml file 2025-07-27 17:26:44 +00:00
Marek Lesko
75e762ac6c Update .gitlab-ci.yml file 2025-07-27 17:19:02 +00:00
Marek Lesko
4ede06b99e Update .gitlab-ci.yml file 2025-07-27 17:05:37 +00:00
Marek Lesko
316d891da4 Update .gitlab-ci.yml file 2025-07-27 17:01:57 +00:00
Marek Lesko
a551ec95c0 Update .gitlab-ci.yml file 2025-07-27 16:55:10 +00:00
Marek Lesko
003625113c Update .gitlab-ci.yml file 2025-07-27 16:54:30 +00:00
Marek Lesko
e84149bc11 feat: Update CI/CD pipeline to include database update and Docker build/deploy steps #5 2025-07-27 16:52:46 +00:00
Marek Lesko
af3b0aefe4 feat: Enhance static file serving and routing for development and production environments #3 2025-07-27 16:40:13 +00:00
Marek Lesko
b991f009c7 feat: Add authentication configuration with OpenID Connect and update appsettings #4 2025-07-27 16:30:17 +00:00
Marek Lesko
813b7ac9aa delete: Remove WeatherForecastController and WeatherForecast model #3 2025-07-27 16:16:41 +00:00
Marek Lesko
e969008873 Implement initial product management with Entity Framework Core #3 2025-07-27 16:03:55 +00:00
Marek Lesko
5f921e5a2c CONFIGURED projects #2 2025-07-16 13:31:46 +00:00
Marek Lesko
f465a0d9eb Merge remote-tracking branch 'origin/main' into dev 2025-07-16 13:16:11 +00:00
Marek Lesko
eb20ae9106 FIXED CI/CD config #2 2025-07-15 19:30:06 +00:00
Marek Lesko
e3c22289cf fix: Minor fixes for CI/CD process 2025-07-15 19:25:38 +00:00
Marek Lesko
d9b58b0502 fix: Updated CI/CD configuration 2025-07-15 19:25:38 +00:00
Marek Lesko
1a5358d7e6 UPDATED CI/CD config #2 2025-07-15 19:23:33 +00:00
Marek Lesko
de28a90819 Merge remote-tracking branch 'origin/main' into dev 2025-07-15 19:21:30 +00:00
Marek Lesko
3863d2e78f ADDED Release artifact for API #2 2025-07-15 19:18:19 +00:00
Marek Lesko
ac67904da8 UPDATED CI config #3 2025-07-15 18:58:00 +00:00
Marek Lesko
1f41c900a7 UPDATED automated build config #3 2025-07-15 18:53:54 +00:00
Marek Lesko
5c82bca4a3 Merge branch 'dev' of https://gitlab.lesko.me/marek/centrum into dev 2025-07-15 18:49:40 +00:00
Marek Lesko
7782a8ce76 ADDED build pipeline changes #3 2025-07-15 18:49:01 +00:00
Marek Lesko
c773f4d97b Update .gitlab-ci.yml file 2025-07-15 18:37:40 +00:00
Marek Lesko
ea76886869 Update .gitlab-ci.yml file 2025-07-15 18:29:32 +00:00
Marek Lesko
52c2fe3941 Update .gitlab-ci.yml file 2025-07-15 18:29:07 +00:00
Marek Lesko
cd6dba6876 Merge branch 'main' into 'dev'
Backmerge from Main to Dev

See merge request marek/centrum!8
2025-07-15 18:17:14 +00:00
Marek Lesko
2d59e8afd3 Backmerge from Main to Dev 2025-07-15 18:17:14 +00:00
Marek Lesko
6a1dc75b3b fix: Update .gitlab-ci.yml file 2025-07-15 18:15:12 +00:00
Marek Lesko
57b35ae431 fix: Update .gitlab-ci.yml file 2025-07-15 18:13:05 +00:00
Marek Lesko
103548eb7e ADDED .gitignore #2 2025-07-15 13:44:51 +02:00
Marek Lesko
4351f41d31 ADDED Test project #3 2025-07-15 13:29:51 +02:00
Marek Lesko
aeeb3fd2f0 ADDED Test project #3 2025-07-15 13:29:33 +02:00
Marek Lesko
6f9864e6ac ADDED core backend to repo #3 2025-07-15 11:03:25 +00:00
Marek Lesko
4e25c0179e Merge branch 'dev' into 'main'
Dev

See merge request marek/centrum!7
2025-07-14 19:14:10 +00:00
Marek Lesko
0a0f1ea10a fix: Dev 2025-07-14 19:14:10 +00:00
Marek Lesko
18740f5119 Merge remote-tracking branch 'origin/main' into dev 2025-07-14 19:12:48 +00:00
Marek Lesko
dcd57dbfe2 fix: UPDATED semantic release cinfig 2025-07-14 19:08:54 +00:00
Marek Lesko
37acfb5d06 fix: UPDATED package.json 2025-07-14 18:59:27 +00:00
Marek Lesko
38aaec1f38 Merge branch 'main' into 'dev'
Added release pipeline

See merge request marek/centrum!5
2025-07-14 18:49:06 +00:00
Marek Lesko
e2ba6c52e3 Added release pipeline 2025-07-14 18:49:06 +00:00
Marek Lesko
3c93b53819 Merge remote-tracking branch 'origin/main' into dev 2025-07-14 18:48:34 +00:00
Marek Lesko
9201f49b5b ADDED website templates #1 2025-07-13 09:32:53 +00:00
Marek Lesko
e467247175 Merge branch 'main' into 'dev'
Main

See merge request marek/centrum!4
2025-07-10 18:11:35 +00:00
Marek Lesko
d2496f6aca Main 2025-07-10 18:11:35 +00:00
2379 changed files with 169218 additions and 30567 deletions

36
.devcontainer/Dockerfile Normal file → Executable file
View File

@@ -1,17 +1,19 @@
FROM mcr.microsoft.com/devcontainers/dotnet:1-8.0-bookworm
# Install SQL Tools: SQLPackage and sqlcmd
COPY mssql/installSQLtools.sh installSQLtools.sh
RUN bash ./installSQLtools.sh \
&& apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list && \
apt-get update && apt-get install -y google-chrome-stable xvfb
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
EXPOSE 4200
# [Optional] Uncomment this line to install global node packages.
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install --lts && nvm use --lts && npm install -g typescript" 2>&1
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1
FROM mcr.microsoft.com/devcontainers/dotnet:1-8.0-bookworm
# Install SQL Tools: SQLPackage and sqlcmd
COPY mssql/installSQLtools.sh installSQLtools.sh
RUN bash ./installSQLtools.sh && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts
# RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
# echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list && \
# apt-get update && apt-get install -y google-chrome-stable xvfb
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
ENV ASPNETCORE_HTTP_PORTS=5000
EXPOSE 4200
# [Optional] Uncomment this line to install global node packages.
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install --lts && nvm use --lts && npm install -g typescript" 2>&1
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1

113
.devcontainer/devcontainer.json Normal file → Executable file
View File

@@ -1,53 +1,60 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet-mssql
{
"name": ".NET (C#), Node.js (TypeScript) & MS SQL",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"mssql.connections": [
{
"server": "localhost,1433",
"database": "",
"authenticationType": "SqlLogin",
"user": "sa",
"password": "P@ssw0rd",
"emptyPasswordInput": false,
"savePassword": false,
"profileName": "mssql-container"
}
]
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-dotnettools.csharp",
"ms-mssql.mssql"
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [5000, 5001],
// "portsAttributes": {
// "5001": {
// "protocol": "https"
// }
// }
// postCreateCommand.sh parameters: $1=SA password, $2=dacpac path, $3=sql script(s) path
"postCreateCommand": "bash .devcontainer/mssql/postCreateCommand.sh 'P@ssw0rd' './bin/Debug/' './.devcontainer/mssql/'"
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet-mssql
{
"name": ".NET (C#), Node.js (TypeScript) & MS SQL",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"mssql.connections": [
{
"server": "localhost,1433",
"database": "",
"authenticationType": "SqlLogin",
"user": "sa",
"password": "P@ssw0rd",
"emptyPasswordInput": false,
"savePassword": false,
"profileName": "mssql-container"
}
]
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-dotnettools.csharp",
"ms-mssql.mssql"
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [
4200,
5000,
5001,
1433
],
"portsAttributes": {
"5001": {
"protocol": "https"
},
"1433": {
"protocol": "tcp"
}
},
// postCreateCommand.sh parameters: $1=SA password, $2=dacpac path, $3=sql script(s) path
"containerEnv": {
"SA_PASSWORD": "P@ssw0rd",
"ACCEPT_EULA": "Y"
},
"postCreateCommand": "bash .devcontainer/mssql/postCreateCommand.sh 'P@ssw0rd' './bin/Debug/' './.devcontainer/mssql/'"
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}

65
.devcontainer/docker-compose.yml Normal file → Executable file
View File

@@ -1,34 +1,31 @@
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ../..:/workspaces:cached
# Overrides default command so things don't shut down after the process ends.
command: sleep infinity
ports:
- "4200:4200"
# Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
network_mode: host
# Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
# user: root
# Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)
db:
image: mcr.microsoft.com/mssql/server:2019-latest
restart: unless-stopped
network_mode: host
environment:
SA_PASSWORD: P@ssw0rd
ACCEPT_EULA: Y
# Add "forwardPorts": ["db:1433"] to **devcontainer.json** to forward MSSQL locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ../..:/workspaces:cached
# Overrides default command so things don't shut down after the process ends.
command: sleep infinity
ports:
- "4200:4200"
# Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
network_mode: host
# Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
# user: root
# Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)
db:
image: mcr.microsoft.com/mssql/server:2019-latest
restart: unless-stopped
network_mode: host
environment:
SA_PASSWORD: P@ssw0rd
ACCEPT_EULA: Y
# Add "forwardPorts": ["db:1433"] to **devcontainer.json** to forward MSSQL locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)

0
.devcontainer/mssql/installSQLtools.sh Normal file → Executable file
View File

View File

@@ -0,0 +1,64 @@
#!/bin/bash
dacpac="false"
sqlfiles="false"
SApassword=$1
dacpath=$2
sqlpath=$3
echo "SELECT * FROM SYS.DATABASES" | dd of=testsqlconnection.sql
for i in {1..60};
do
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SApassword -d master -i testsqlconnection.sql > /dev/null
if [ $? -eq 0 ]
then
echo "SQL server ready"
break
else
echo "Not ready yet..."
sleep 1
fi
done
rm testsqlconnection.sql
for f in $dacpath/*
do
if [ $f == $dacpath/*".dacpac" ]
then
dacpac="true"
echo "Found dacpac $f"
fi
done
for f in $sqlpath/*
do
if [ $f == $sqlpath/*".sql" ]
then
sqlfiles="true"
echo "Found SQL file $f"
fi
done
if [ $sqlfiles == "true" ]
then
for f in $sqlpath/*
do
if [ $f == $sqlpath/*".sql" ]
then
echo "Executing $f"
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SApassword -d master -i $f
fi
done
fi
if [ $dacpac == "true" ]
then
for f in $dacpath/*
do
if [ $f == $dacpath/*".dacpac" ]
then
dbname=$(basename $f ".dacpac")
echo "Deploying dacpac $f"
/opt/sqlpackage/sqlpackage /Action:Publish /SourceFile:$f /TargetServerName:localhost /TargetDatabaseName:$dbname /TargetUser:sa /TargetPassword:$SApassword
fi
done
fi

63
.devcontainer/mssql/postCreateCommand.sh Normal file → Executable file
View File

@@ -5,60 +5,9 @@ SApassword=$1
dacpath=$2
sqlpath=$3
echo "SELECT * FROM SYS.DATABASES" | dd of=testsqlconnection.sql
for i in {1..60};
do
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SApassword -d master -i testsqlconnection.sql > /dev/null
if [ $? -eq 0 ]
then
echo "SQL server ready"
break
else
echo "Not ready yet..."
sleep 1
fi
done
rm testsqlconnection.sql
for f in $dacpath/*
do
if [ $f == $dacpath/*".dacpac" ]
then
dacpac="true"
echo "Found dacpac $f"
fi
done
for f in $sqlpath/*
do
if [ $f == $sqlpath/*".sql" ]
then
sqlfiles="true"
echo "Found SQL file $f"
fi
done
if [ $sqlfiles == "true" ]
then
for f in $sqlpath/*
do
if [ $f == $sqlpath/*".sql" ]
then
echo "Executing $f"
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SApassword -d master -i $f
fi
done
fi
if [ $dacpac == "true" ]
then
for f in $dacpath/*
do
if [ $f == $dacpath/*".dacpac" ]
then
dbname=$(basename $f ".dacpac")
echo "Deploying dacpac $f"
/opt/sqlpackage/sqlpackage /Action:Publish /SourceFile:$f /TargetServerName:localhost /TargetDatabaseName:$dbname /TargetUser:sa /TargetPassword:$SApassword
fi
done
fi
cd Api
dotnet restore ./Api.csproj
dotnet build ./Api.csproj
dotnet tool install --global dotnet-ef --version 8.*
export PATH="$PATH:/root/.dotnet/tools"
dotnet-ef database update --project ./Api.csproj --startup-project ./Api.csproj

View File

@@ -1,2 +0,0 @@
CREATE DATABASE ApplicationDB;
GO

24
.github/dependabot.yml vendored Normal file → Executable file
View File

@@ -1,12 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly

1
.gitignore vendored Executable file
View File

@@ -0,0 +1 @@
.vs/

123
.gitlab-ci.yml Normal file → Executable file
View File

@@ -1,36 +1,87 @@
stages: # Define the stages of the pipeline.
- build
#- test
- release
install-job: # This job runs in the build stage, which runs first.
stage: build
image: node:24
script:
- cd Web
- npm install
- npm run build
artifacts: # Artifacts are files that are passed between stages.
paths:
- Web/dist/Web/browser # The 'dist' directory will be available in the next stage.
semantic-release:
image: node:24
stage: release
script:
- apt update && apt install zip -y
- zip -r dist.zip Web/dist/Web/browser
- npm install --save-dev @semantic-release/gitlab
- npx semantic-release --debug
only:
- main
deploy-job: # This job runs in the deploy stage.
stage: release # It only runs when *both* jobs in the test stage complete successfully.
environment: production
tags:
- deployment
script:
- cp -ir Web/dist/Web/browser/* /var/www/html
- echo "Application successfully deployed."
stages: # Define the stages of the pipeline.
- build
#- test
- release
semantic-release:
image: node:24
stage: release
script:
- apt update && apt install zip -y
- zip -r dist.zip Web/dist/Web/browser
- zip -r api.zip Api/build
- npm install --save-dev @semantic-release/gitlab
- npx semantic-release --debug
only:
- main
docker-build:
stage: build
image: docker:latest
tags:
- shared
services:
- name: docker:dind
alias: docker
variables:
DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
before_script:
- docker info
- ip a
script:
- 'sed -i "s|\"apiEndpoint\": \"[^\"]*\"|\"apiEndpoint\": \"https\:\/\/""$PUBLIC_WEB_URL""\"|" Web/public/config.json'
- 'sed -i "s|\"AllowedHosts\": \"[^\"]*\"|\"AllowedHosts\": \"$PUBLIC_WEB_URL\"|" Api/appsettings.json'
- 'sed -i "s|\"CorsOrigins\": \"[^\"]*\"|\"CorsOrigins\": \"https\:\/\/""$PUBLIC_WEB_URL""\"|" Api/appsettings.json'
- docker build -t $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:${CI_PIPELINE_IID} -f Dockerfile .
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
- docker push $CI_REGISTRY_IMAGE:latest
- docker push $CI_REGISTRY_IMAGE:${CI_PIPELINE_IID}
retry:
max: 2
when:
- runner_system_failure
- script_failure
- api_failure
only:
- dev
- main
docker-deploy:
stage: release
tags:
- production
- shell
script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
- cd deployment
- docker compose pull
- docker compose -f docker-compose.yaml up -d
- docker image prune -f
only:
- dev
- main
update_db:
image: mcr.microsoft.com/dotnet/sdk:8.0
stage: release
needs: ["docker-deploy"]
script:
- cd Api
- dotnet restore ./Api.csproj
- dotnet build ./Api.csproj
- dotnet tool install --global dotnet-ef --version 8.*
- export PATH="$PATH:/root/.dotnet/tools"
- dotnet-ef database update --project ./Api.csproj --startup-project ./Api.csproj
only:
- dev
- main
tags:
- production
- docker
variables:
ConnectionStrings__DefaultConnection: "Server=localhost;Database=CentrumDb;User=sa;Password=$DB_PASSWORD;TrustServerCertificate=True;"

6
.gitpod.yml Executable file
View File

@@ -0,0 +1,6 @@
coreDump:
enabled: false
tasks:
- init: |
npm install -g @devcontainers/cli@0.40.0
devcontainer --version

46
.gitpod/automations.yaml Normal file → Executable file
View File

@@ -1,37 +1,9 @@
tasks:
hello:
name: Hello World
command: |
echo "Hello, World!"
triggeredBy:
- manual
# - postEnvironmentStart
# - postDevcontainerStart
services:
example-service:
name: Example Service
description: Example service simulating a backend
commands:
start: |
echo "Starting backend service..."
touch /tmp/backend.started
while true; do
sleep 1
date
done
ready: |
if [ -f /tmp/backend.started ]; then
echo "Backend service is ready"
exit 0
else
echo "Backend service is not ready"
exit 1
fi
# stop: |
# echo "Stopping backend service..."
# rm /tmp/backend.started
# pkill backend
triggeredBy:
- postEnvironmentStart
# - postDevcontainerStart
tasks:
hello:
name: Hello World
command: |
echo "Hello, World!"
triggeredBy:
- manual
# - postEnvironmentStart
# - postDevcontainerStart

3
.releaserc.json Normal file → Executable file
View File

@@ -11,7 +11,8 @@
"@semantic-release/gitlab"
],
"assets": [
{ "path": "dist.zip", "label": "bundle" },
{ "path": "dist.zip", "label": "Web.zip" },
{ "path": "api.zip", "label": "Api.zip" },
{ "url": "https://gitlab.lesko.me/marek/centrum/-/blob/main/README.md", "label": "README.md" }
]
}

28
.vscode/launch.json vendored Normal file → Executable file
View File

@@ -1,15 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:4200",
"webRoot": "${workspaceFolder}"
}
]
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:4200",
"webRoot": "${workspaceFolder}/Web"
}
]
}

41
.vscode/tasks.json vendored Executable file
View File

@@ -0,0 +1,41 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Api/Api.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/Api/Api.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/Api/Api.sln"
],
"problemMatcher": "$msCompile"
}
]
}

5
Api/.config/dotnet-tools.json Executable file
View File

@@ -0,0 +1,5 @@
{
"version": 1,
"isRoot": true,
"tools": {}
}

30
Api/.dockerignore Executable file
View File

@@ -0,0 +1,30 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**

5
Api/.gitignore vendored Executable file
View File

@@ -0,0 +1,5 @@
obj/
bin/
.vs/
build/
**/core

26
Api/Api.csproj Executable file
View File

@@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>aspnet-Api-50db7f4c-1c75-467a-a923-a5477d7decc4</UserSecretsId>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>.</DockerfileContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.18" NoWarn="NU1605" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.0.18" NoWarn="NU1605" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.18">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.18" />
<PackageReference Include="Microsoft.Identity.Web" Version="3.10.0" />
<PackageReference Include="Microsoft.Identity.Web.DownstreamApi" Version="3.10.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.3" />
</ItemGroup>
</Project>

9
Api/Api.csproj.user Executable file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ActiveDebugProfile>https</ActiveDebugProfile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>

6
Api/Api.http Executable file
View File

@@ -0,0 +1,6 @@
@Api_HostAddress = http://localhost:5012
GET {{Api_HostAddress}}/weatherforecast/
Accept: application/json
###

31
Api/Api.sln Executable file
View File

@@ -0,0 +1,31 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36301.6
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Api", "Api.csproj", "{EC86C676-06E8-4011-A4E3-5118543F4728}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "..\Tests\Tests.csproj", "{819F3EDC-F488-4C63-89D0-4BE09CD0C485}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EC86C676-06E8-4011-A4E3-5118543F4728}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EC86C676-06E8-4011-A4E3-5118543F4728}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC86C676-06E8-4011-A4E3-5118543F4728}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EC86C676-06E8-4011-A4E3-5118543F4728}.Release|Any CPU.Build.0 = Release|Any CPU
{819F3EDC-F488-4C63-89D0-4BE09CD0C485}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{819F3EDC-F488-4C63-89D0-4BE09CD0C485}.Debug|Any CPU.Build.0 = Debug|Any CPU
{819F3EDC-F488-4C63-89D0-4BE09CD0C485}.Release|Any CPU.ActiveCfg = Release|Any CPU
{819F3EDC-F488-4C63-89D0-4BE09CD0C485}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A7800B0A-84E4-432A-9E11-6EF3987291FC}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,70 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Api.Models;
using Microsoft.AspNetCore.Authorization;
namespace Api.Controllers
{
[ApiController]
[Authorize]
[Route("api/product")]
public class ProductController : ControllerBase
{
private readonly AppDbContext _context;
public ProductController(AppDbContext context)
{
_context = context;
}
// GET: api/Product
[HttpGet]
public async Task<ActionResult<IEnumerable<Product>>> GetProducts([FromQuery] int? id = null)
{
if (id.HasValue)
{
return await _context.Products
.Where(p => p.Id == id.Value)
.ToListAsync();
}
else
return await _context.Products.ToListAsync();
}
// POST: api/Product
[HttpPost]
public async Task<ActionResult<Product>> PostProduct([FromBody] Product product)
{
_context.Products.Add(product);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetProducts), new { id = product.Id }, product);
}
// PUT: api/Product/{id}
[HttpPut("{id}")]
public async Task<IActionResult> PutProduct(int id, [FromBody] Product product)
{
if (id != product.Id)
{
return BadRequest();
}
_context.Entry(product).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!await _context.Products.AnyAsync(e => e.Id == id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
}
}

View File

@@ -0,0 +1,71 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Api.Helpers;
using Api.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace Api.Controllers
{
// Controller to expose WebMessage read endpoints for the SPA.
// Assumes an EF DbContext named ApiDbContext with DbSet<WebMessage> WebMessages.
[ApiController]
[Route("api/[controller]")]
public class WebMessagesController : ControllerBase
{
private readonly AppDbContext _context;
public WebMessagesController(AppDbContext context)
{
_context = context;
}
// GET: api/webmessages
// Optional pagination via ?page=1&pageSize=20
[HttpGet]
public async Task<ActionResult<IEnumerable<WebMessage>>> GetAll([FromQuery] int? page, [FromQuery] int? pageSize)
{
var query = _context.WebMessages.AsNoTracking().OrderByDescending(m => m.Id).AsQueryable();
if (page.HasValue && pageSize.HasValue && page > 0 && pageSize > 0)
{
var skip = (page.Value - 1) * pageSize.Value;
query = query.Skip(skip).Take(pageSize.Value);
}
var list = await query.ToListAsync();
return Ok(list);
}
// GET: api/webmessages/5
[HttpGet("{id:int}")]
public async Task<ActionResult<WebMessage>> GetById(int id)
{
var message = await _context.WebMessages.AsNoTracking().FirstOrDefaultAsync(m => m.Id == id);
if (message == null) return NotFound();
return Ok(message);
}
// POST: api/webmessages
// Saves a new WebMessage. Expects JSON body. Returns 201 with Location header.
[HttpPost]
public async Task<ActionResult<WebMessage>> Create([FromBody] WebMessage message)
{
if (message == null)
return BadRequest();
// optional: basic server-side validation
if (string.IsNullOrWhiteSpace(message.Message) && string.IsNullOrWhiteSpace(message.Subject))
return BadRequest("Message or Subject is required.");
if(ReCaptchaAssessment.CheckToken(message.RecaptchaToken, out string reason) == false)
return BadRequest($"ReCaptcha validation failed: {reason}");
_context.WebMessages.Add(message);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetById), new { id = message.Id }, message);
}
}
}

30
Api/Dockerfile Executable file
View File

@@ -0,0 +1,30 @@
# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Api.csproj", "."]
RUN dotnet restore "./Api.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "./Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Api.dll"]

View File

@@ -0,0 +1,56 @@
// <auto-generated />
using Api.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace Api.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20250727154636_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.7")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("Api.Models.Product", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18,2)");
b.HasKey("Id");
b.ToTable("Products");
b.HasData(
new
{
Id = 1,
Name = "Sample Product",
Price = 9.99m
});
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,40 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Api.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Products",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Products", x => x.Id);
});
migrationBuilder.InsertData(
table: "Products",
columns: new[] { "Id", "Name", "Price" },
values: new object[] { 1, "Sample Product", 9.99m });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Products");
}
}
}

View File

@@ -0,0 +1,87 @@
// <auto-generated />
using Api.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace Api.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20251031151451_AddWebMessages")]
partial class AddWebMessages
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.18")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("Api.Models.Product", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18,2)");
b.HasKey("Id");
b.ToTable("Products");
b.HasData(
new
{
Id = 1,
Name = "Sample Product",
Price = 9.99m
});
});
modelBuilder.Entity("WebMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.HasColumnType("nvarchar(max)");
b.Property<string>("Message")
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<string>("Phone")
.HasColumnType("nvarchar(max)");
b.Property<string>("Subject")
.HasColumnType("nvarchar(max)");
b.Property<string>("Surname")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("WebMessages");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Api.Migrations
{
/// <inheritdoc />
public partial class AddWebMessages : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "WebMessages",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
Surname = table.Column<string>(type: "nvarchar(max)", nullable: true),
Email = table.Column<string>(type: "nvarchar(max)", nullable: true),
Phone = table.Column<string>(type: "nvarchar(max)", nullable: true),
Subject = table.Column<string>(type: "nvarchar(max)", nullable: true),
Message = table.Column<string>(type: "nvarchar(max)", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_WebMessages", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "WebMessages");
}
}
}

View File

@@ -0,0 +1,84 @@
// <auto-generated />
using Api.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace Api.Migrations
{
[DbContext(typeof(AppDbContext))]
partial class AppDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.18")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("Api.Models.Product", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18,2)");
b.HasKey("Id");
b.ToTable("Products");
b.HasData(
new
{
Id = 1,
Name = "Sample Product",
Price = 9.99m
});
});
modelBuilder.Entity("WebMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.HasColumnType("nvarchar(max)");
b.Property<string>("Message")
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<string>("Phone")
.HasColumnType("nvarchar(max)");
b.Property<string>("Subject")
.HasColumnType("nvarchar(max)");
b.Property<string>("Surname")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("WebMessages");
});
#pragma warning restore 612, 618
}
}
}

29
Api/Models/AppDbContext.cs Executable file
View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
namespace Api.Models
{
public class Product
{
public int Id { get; set; }
public string? Name { get; set; }
public decimal Price { get; set; }
}
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Product> Products { get; set; }
public DbSet<WebMessage> WebMessages { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Seed data
modelBuilder.Entity<Product>().HasData(
new Product { Id = 1, Name = "Sample Product", Price = 9.99M }
);
}
}
}

16
Api/Models/WebMessage.cs Normal file
View File

@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public class WebMessage
{
[Key]
public int Id { get; set; }
public string? Name { get; set; }
public string? Surname { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
public string? Subject { get; set; }
public string? Message { get; set; }
[NotMapped]
public string? RecaptchaToken { get; set; }
}

110
Api/Program.cs Executable file
View File

@@ -0,0 +1,110 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.Resource;
namespace Api
{
using Microsoft.EntityFrameworkCore;
using Api.Models;
using Microsoft.AspNetCore.Rewrite;
public static class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = builder.Configuration["Authentication:PocketId:Authority"];
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
{
ValidAudiences = builder.Configuration["Authentication:PocketId:ClientId"]?.Split(';').Select(i => i.Trim()).ToArray(),
ValidIssuers = builder.Configuration["Authentication:PocketId:Authority"]?.Split(';').Select(i => i.Trim()).ToArray()
};
});
builder.Services.AddCors(options =>
{
options.AddPolicy("Default", policy =>
{
var allowedHostsConfiguration = builder.Configuration["CorsOrigins"]?
.ToString()
.Split(',');
policy
.WithOrigins(allowedHostsConfiguration ?? new[] { "*" })
.AllowAnyHeader()
.AllowAnyMethod();
});
});
builder.Services.AddControllers();
// Add DbContext with SQL Server
// Allow connection string to be set via environment variable (e.g., in Docker)
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
if (!app.Environment.IsDevelopment())
{
app.UseHttpsRedirection();
}
// Angular rewrite for SPA hosting
var routes = new[] { "api", "swagger" };
var rewriteString = String.Join("|", routes);
var rewriteOptions = new RewriteOptions()
.AddRewrite(@$"^(?!.*?\b({rewriteString}))^(?!.*?\.\b(jpg|jpeg|png|svg|ttf|woff|woff2|html|js|json|css|ico))", "index.html", false);
app.UseRewriter(rewriteOptions);
// Serve static files from the Angular app
if (app.Environment.IsDevelopment() && Directory.Exists(Path.Combine(Directory.GetCurrentDirectory(), "../Web/dist/Web/browser")))
{
var currentDirectory = Directory.GetCurrentDirectory();
var staticFilePath = Path.Combine(currentDirectory, "../Web/dist/Web/browser");
app.UseDefaultFiles(new DefaultFilesOptions
{
FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(staticFilePath),
DefaultFileNames = new List<string> { "index.html" }
});
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(staticFilePath),
RequestPath = ""
});
}
else
{
app.UseDefaultFiles(); // Uses wwwroot by default
app.UseStaticFiles();
}
app.UseCors("Default");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}

View File

@@ -0,0 +1,42 @@
{
"profiles": {
"https": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
},
"dotnetRunMessages": true,
"applicationUrl": "https://0.0.0.0:5001;http://0.0.0.0:5000"
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
}
},
"Container (Dockerfile)": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_HTTPS_PORTS": "8081",
"ASPNETCORE_HTTP_PORTS": "8080"
},
"publishAllPorts": true,
"useSSL": true
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60760",
"sslPort": 44315
}
}
}

View File

@@ -0,0 +1,21 @@
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft.AspNetCore": "Trace"
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=localhost,1433;Database=CentrumDb;User=sa;Password=P@ssw0rd;TrustServerCertificate=True;"
}
,
"Authentication": {
"PocketId": {
"Authority": "https://identity.lesko.me",
"ClientId": "21131567-fea1-42a2-8907-21abd874eff8",
"ClientSecret": "a633GE6G3JoY8WopnsxhSXQpmsTuXa63",
"CallbackPath": "/signin-pocketid",
"Scopes": "openid profile email"
}
}
}

20
Api/appsettings.json Executable file
View File

@@ -0,0 +1,20 @@
{
"Authentication": {
"PocketId": {
"Authority": "https://identity.lesko.me",
"ClientId": "21131567-fea1-42a2-8907-21abd874eff8",
"ClientSecret": "a633GE6G3JoY8WopnsxhSXQpmsTuXa63",
"CallbackPath": "/signin-pocketid",
"Scopes": "openid profile email"
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "localhost",
"CorsOrigins": "https://localhost:5001,http://localhost:4200,http://localhost:5000"
}

23
Dockerfile Executable file
View File

@@ -0,0 +1,23 @@
# Build Angular Web app
FROM node:24 AS web-build
WORKDIR /app/web
COPY Web/ ./
RUN npm ci
RUN npm run build -- --output-path=dist/Web
RUN ls /app/web/dist/Web/browser
# Build .NET Api app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS api-build
WORKDIR /app/api
COPY Api/ ./
RUN dotnet restore Api.csproj
RUN dotnet publish Api.csproj -c Release -o /app/api/build
# Final runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
COPY --from=api-build /app/api/build ./
COPY --from=web-build /app/web/dist/Web/browser/ ./wwwroot/
ENV ASPNETCORE_URLS=http://+:5000
EXPOSE 5000
ENTRYPOINT ["dotnet", "Api.dll"]

186
README.md Normal file → Executable file
View File

@@ -1,93 +1,93 @@
# Centrum
![release](https://gitlab.lesko.me/marek/centrum/-/badges/release.svg)
[![pipeline status](https://gitlab.lesko.me/marek/centrum/badges/main/pipeline.svg)](https://gitlab.lesko.me/marek/centrum/-/commits/main)
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://gitlab.lesko.me/marek/centrum.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
- [ ] [Set up project integrations](https://gitlab.lesko.me/marek/centrum/-/settings/integrations)
## Collaborate with your team
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
## Test and Deploy
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
# Centrum
![release](https://gitlab.lesko.me/marek/centrum/-/badges/release.svg)
[![pipeline status](https://gitlab.lesko.me/marek/centrum/badges/main/pipeline.svg)](https://gitlab.lesko.me/marek/centrum/-/commits/main)
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://gitlab.lesko.me/marek/centrum.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
- [ ] [Set up project integrations](https://gitlab.lesko.me/marek/centrum/-/settings/integrations)
## Collaborate with your team
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
## Test and Deploy
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.

2
Tests/.gitignore vendored Executable file
View File

@@ -0,0 +1,2 @@
obj/
bin/

38
Tests/IntegrationTest1.cs Executable file
View File

@@ -0,0 +1,38 @@
namespace Tests.Tests
{
public class IntegrationTest1
{
// Instructions:
// 1. Add a project reference to the target AppHost project, e.g.:
//
// <ItemGroup>
// <ProjectReference Include="../MyAspireApp.AppHost/MyAspireApp.AppHost.csproj" />
// </ItemGroup>
//
// 2. Uncomment the following example test and update 'Projects.MyAspireApp_AppHost' to match your AppHost project:
//
// [Fact]
// public async Task GetWebResourceRootReturnsOkStatusCode()
// {
// // Arrange
// var appHost = await DistributedApplicationTestingBuilder.CreateAsync<Projects.MyAspireApp_AppHost>();
// appHost.Services.ConfigureHttpClientDefaults(clientBuilder =>
// {
// clientBuilder.AddStandardResilienceHandler();
// });
// // To output logs to the xUnit.net ITestOutputHelper, consider adding a package from https://www.nuget.org/packages?q=xunit+logging
//
// await using var app = await appHost.BuildAsync();
// var resourceNotificationService = app.Services.GetRequiredService<ResourceNotificationService>();
// await app.StartAsync();
// // Act
// var httpClient = app.CreateHttpClient("webfrontend");
// await resourceNotificationService.WaitForResourceAsync("webfrontend", KnownResourceStates.Running).WaitAsync(TimeSpan.FromSeconds(30));
// var response = await httpClient.GetAsync("/");
// // Assert
// Assert.Equal(HttpStatusCode.OK, response.StatusCode);
// }
}
}

27
Tests/Tests.csproj Executable file
View File

@@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting.Testing" Version="9.3.1" />
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>
<ItemGroup>
<Using Include="System.Net" />
<Using Include="Microsoft.Extensions.DependencyInjection" />
<Using Include="Aspire.Hosting.ApplicationModel" />
<Using Include="Aspire.Hosting.Testing" />
<Using Include="Xunit" />
</ItemGroup>
</Project>

34
Web/.editorconfig Normal file → Executable file
View File

@@ -1,17 +1,17 @@
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
ij_typescript_use_double_quotes = false
[*.md]
max_line_length = off
trim_trailing_whitespace = false
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
ij_typescript_use_double_quotes = false
[*.md]
max_line_length = off
trim_trailing_whitespace = false

84
Web/.gitignore vendored Normal file → Executable file
View File

@@ -1,42 +1,42 @@
# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
# Compiled output
/dist
/tmp
/out-tsc
/bazel-out
# Node
/node_modules
npm-debug.log
yarn-error.log
# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings
# System files
.DS_Store
Thumbs.db
# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
# Compiled output
/dist
/tmp
/out-tsc
/bazel-out
# Node
/node_modules
npm-debug.log
yarn-error.log
# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings
# System files
.DS_Store
Thumbs.db

0
Web/themes/modernize/.npmrc → Web/.npmrc Normal file → Executable file
View File

8
Web/.vscode/extensions.json vendored Normal file → Executable file
View File

@@ -1,4 +1,4 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
"recommendations": ["angular.ng-template"]
}
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
"recommendations": ["angular.ng-template"]
}

41
Web/.vscode/launch.json vendored Normal file → Executable file
View File

@@ -1,20 +1,21 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ng serve",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: start",
"url": "http://localhost:4200/"
},
{
"name": "ng test",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: test",
"url": "http://localhost:9876/debug.html"
}
]
}
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ng serve",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: start",
"url": "http://localhost:4200/",
"webRoot": "${workspaceFolder}/Web",
},
{
"name": "ng test",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: test",
"url": "http://localhost:9876/debug.html"
}
]
}

84
Web/.vscode/tasks.json vendored Normal file → Executable file
View File

@@ -1,42 +1,42 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
},
{
"type": "npm",
"script": "test",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
}
]
}
{
// For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
},
{
"type": "npm",
"script": "test",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
}
]
}

118
Web/README.md Normal file → Executable file
View File

@@ -1,59 +1,59 @@
# Web
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.0.6.
## Development server
To start a local development server, run:
```bash
ng serve
```
Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
## Code scaffolding
Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
```bash
ng generate component component-name
```
For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
```bash
ng generate --help
```
## Building
To build the project run:
```bash
ng build
```
This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
## Running unit tests
To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
```bash
ng test
```
## Running end-to-end tests
For end-to-end (e2e) testing, run:
```bash
ng e2e
```
Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
## Additional Resources
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
# Web
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.0.6.
## Development server
To start a local development server, run:
```bash
ng serve
```
Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
## Code scaffolding
Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
```bash
ng generate component component-name
```
For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
```bash
ng generate --help
```
## Building
To build the project run:
```bash
ng build
```
This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
## Running unit tests
To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
```bash
ng test
```
## Running end-to-end tests
For end-to-end (e2e) testing, run:
```bash
ng e2e
```
Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
## Additional Resources
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.

204
Web/angular.json Normal file → Executable file
View File

@@ -1,100 +1,106 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"Web": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular/build:application",
"options": {
"browser": "src/main.ts",
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public"
}
],
"styles": [
"src/styles.scss"
]
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kB",
"maximumError": "1MB"
},
{
"type": "anyComponentStyle",
"maximumWarning": "4kB",
"maximumError": "8kB"
}
],
"outputHashing": "all"
},
"development": {
"optimization": false,
"extractLicenses": false,
"sourceMap": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular/build:dev-server",
"options": {
"allowedHosts": [
"localhost",
"4200--0197f0a3-fef1-7776-b920-71d5d9c3d787.us01.gitpod.dev"
]
},
"configurations": {
"production": {
"buildTarget": "Web:build:production"
},
"development": {
"buildTarget": "Web:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular/build:extract-i18n"
},
"test": {
"builder": "@angular/build:karma",
"options": {
"tsConfig": "tsconfig.spec.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public"
}
],
"styles": [
"src/styles.scss"
]
}
}
}
}
},
"cli": {
"analytics": false
}
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"Web": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular/build:application",
"options": {
"browser": "src/main.ts",
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public" ,
"output": "assets"
}
],
"styles": [
"src/styles.scss",
"public/scss/style.scss",
"node_modules/ngx-toastr/toastr.css",
"node_modules/angular-calendar/css/angular-calendar.css",
"node_modules/highlight.js/styles/atom-one-dark.min.css"
]
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kB",
"maximumError": "5MB"
},
{
"type": "anyComponentStyle",
"maximumWarning": "4kB",
"maximumError": "8kB"
}
],
"outputHashing": "all"
},
"development": {
"optimization": false,
"extractLicenses": false,
"sourceMap": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular/build:dev-server",
"options": {
"allowedHosts": [
"localhost",
"4200--0197f0a3-fef1-7776-b920-71d5d9c3d787.us01.gitpod.dev"
]
},
"configurations": {
"production": {
"buildTarget": "Web:build:production"
},
"development": {
"buildTarget": "Web:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular/build:extract-i18n"
},
"test": {
"builder": "@angular/build:karma",
"options": {
"tsConfig": "tsconfig.spec.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public",
"output": "assets"
}
],
"styles": [
"src/styles.scss"
]
}
}
}
}
},
"cli": {
"analytics": false
}
}

BIN
Web/core

Binary file not shown.

19257
Web/package-lock.json generated

File diff suppressed because it is too large Load Diff

118
Web/package.json Normal file → Executable file
View File

@@ -1,45 +1,73 @@
{
"name": "web",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve --host 0.0.0.0",
"build": "ng build --configuration=production",
"watch": "ng build --watch --configuration development",
"test": "ng test"
},
"prettier": {
"overrides": [
{
"files": "*.html",
"options": {
"parser": "angular"
}
}
]
},
"private": true,
"dependencies": {
"@angular/common": "^20.0.0",
"@angular/compiler": "^20.0.0",
"@angular/core": "^20.0.0",
"@angular/forms": "^20.0.0",
"@angular/platform-browser": "^20.0.0",
"@angular/router": "^20.0.0",
"rxjs": "~7.8.0",
"tslib": "^2.3.0"
},
"devDependencies": {
"@angular/build": "^20.0.6",
"@angular/cli": "^20.0.6",
"@angular/compiler-cli": "^20.0.0",
"@types/jasmine": "~5.1.0",
"jasmine-core": "~5.7.0",
"karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"typescript": "~5.8.2"
}
}
{
"name": "web",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve --host 0.0.0.0",
"build": "ng build --configuration=production",
"watch": "ng build --watch --configuration development",
"test": "ng test"
},
"prettier": {
"overrides": [
{
"files": "*.html",
"options": {
"parser": "angular"
}
}
]
},
"private": true,
"dependencies": {
"@angular/animations": "^20.0.4",
"@angular/cdk": "^20.0.3",
"@angular/common": "^20.0.4",
"@angular/compiler": "^20.0.4",
"@angular/core": "^20.0.4",
"@angular/forms": "^20.0.4",
"@angular/material": "^20.0.3",
"@angular/platform-browser": "^20.0.4",
"@angular/platform-browser-dynamic": "^20.0.4",
"@angular/router": "^20.0.4",
"@ng-matero/extensions": "^20.1.0",
"@ngx-translate/core": "^16.0.4",
"@ngx-translate/http-loader": "^16.0.1",
"angular-calendar": "^0.31.1",
"angular-tabler-icons": "^3.26.0",
"apexcharts": "^4.7.0",
"chance": "^1.1.13",
"date-fns": "^4.1.0",
"highlight.js": "^11.11.1",
"ng-apexcharts": "^1.16.0",
"ng2-search-filter": "^0.5.1",
"ngx-dropzone": "^3.1.0",
"ngx-editor": "^19.0.0-beta.1",
"ngx-highlightjs": "^14.0.1",
"ngx-owl-carousel-o": "^20.0.0",
"ngx-pagination": "^6.0.3",
"ngx-permissions": "^19.0.0",
"ngx-scrollbar": "^18.0.0",
"angular-oauth2-oidc": "^20.0.2",
"ngx-toastr": "^19.0.0",
"rxjs": "~7.8.2",
"sass": "^1.89.2",
"tslib": "^2.8.1",
"zone.js": "~0.15.1"
},
"devDependencies": {
"@angular/build": "^20.0.3",
"@angular/cli": "~20.3.6",
"@angular/compiler-cli": "^20.0.4",
"@types/chance": "^1.1.6",
"@types/date-fns": "^2.6.3",
"@types/jasmine": "~5.1.8",
"jasmine-core": "~5.8.0",
"karma": "~6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.1",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"typescript": "~5.8.3"
}
}

3
Web/public/config.json Executable file
View File

@@ -0,0 +1,3 @@
{
"apiEndpoint": "http://localhost:5000"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

View File

@@ -0,0 +1,44 @@
<svg width="360" height="360" viewBox="0 0 360 360" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1928_12651)">
<path d="M46.6595 263.061H132.417V302.279H46.6595V263.061Z" fill="white" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M68.098 262.016L68.1161 286.854L74.3762 276.658L80.6362 286.854L86.2362 277.737L91.351 286.07V262.082L68.098 262.016Z" fill="#FEBA91"/>
<path d="M78.3365 135.682L76.1996 127.746" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M119.924 200.748C120.451 195.082 122.094 184.575 108.492 178.053C94.8894 171.531 86.5919 165.048 82.9661 150.535" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M85.479 148.43L82.0888 135.831C81.7372 134.524 80.3928 133.75 79.0859 134.102L77.3426 134.571C76.0357 134.922 75.2614 136.267 75.613 137.574L79.0032 150.173C79.3548 151.48 80.6993 152.254 82.0061 151.902L83.7495 151.433C85.0563 151.082 85.8306 149.737 85.479 148.43Z" fill="#49BEFF"/>
<path d="M54.4356 174.313L46.2195 174.307" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M68.6013 170.738H55.5538C54.2005 170.738 53.1034 171.835 53.1034 173.189V174.994C53.1034 176.347 54.2005 177.444 55.5538 177.444H68.6013C69.9546 177.444 71.0517 176.347 71.0517 174.994V173.189C71.0517 171.835 69.9546 170.738 68.6013 170.738Z" fill="#49BEFF"/>
<path d="M69.1439 173.776C69.1439 173.776 99.3411 172.076 113.45 197.439" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M247.717 230.643C255.821 230.643 261.581 232.535 261.967 250.773C262.353 269.011 261.545 285.497 277.459 285.286C292.164 285.09 288.897 279.141 295.693 279.403" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M311.252 272.082H294.259C293.175 272.082 292.297 272.96 292.297 274.044V284.629C292.297 285.713 293.175 286.591 294.259 286.591H311.252C312.335 286.591 313.214 285.713 313.214 284.629V274.044C313.214 272.96 312.335 272.082 311.252 272.082Z" fill="#49BEFF"/>
<path d="M306.022 272.061L306.001 286.615" stroke="#2E186A" stroke-width="1.80839" stroke-linejoin="round"/>
<path d="M309.769 275.961H320.969M309.769 281.386H320.969" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M254.122 66.3633V73.7898M257.835 70.0765H250.411" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M201.31 93.5551V100.979M205.021 97.2683H197.597M158.693 57.4746V64.8981M162.403 61.1878H154.979M113.983 117.872V125.295M117.696 121.582H110.27M62.7392 89.1094V96.5359M66.4495 92.8227H59.026M54.6346 199.183V206.607M58.3448 202.897H50.9214M39.7304 137.74V145.167M43.4437 141.453H36.0172M287.719 159.049V166.476M291.432 162.762H284.008M301.447 97.4763V104.903M305.157 101.19H297.734M328.899 206.504V213.928M332.612 210.215H325.185" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M290.784 206.212L257.244 175.49H205.03L205.542 176.129H114.245L80.7749 206.851V214.781H114.23V303.283H257.784V214.127H290.784V206.212Z" fill="#5D87FF"/>
<path d="M245.128 256.461H237.807V287.05H229.44V255.937H222.643L234.148 223.777L245.128 256.461Z" fill="white"/>
<path d="M205.623 183.318V300.451M205.361 183.282L174.727 214.353M201.964 179.529L174.468 207.418M114.55 214.694H174.513V207.556H81.6188M257.569 214.067H225.401V206.929H288.071M205.711 183.107L225.003 213.973M213.176 187.754L225.449 207.068" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M187.069 233.648H130.578C128.081 233.648 126.057 235.673 126.057 238.169V264.424C126.057 266.921 128.081 268.945 130.578 268.945H187.069C189.566 268.945 191.59 266.921 191.59 264.424V238.169C191.59 235.673 189.566 233.648 187.069 233.648Z" fill="#2E186A"/>
<path d="M132.637 257.178C132.511 257.18 132.387 257.157 132.271 257.109C132.155 257.062 132.05 256.992 131.962 256.903C131.871 256.816 131.801 256.711 131.753 256.595C131.706 256.479 131.684 256.354 131.687 256.228C131.684 256.031 131.743 255.838 131.856 255.677L143.288 239.148C143.374 239.022 143.491 238.921 143.628 238.854C143.765 238.786 143.917 238.756 144.069 238.765C144.194 238.764 144.318 238.787 144.434 238.834C144.55 238.881 144.655 238.951 144.744 239.04C144.832 239.128 144.902 239.234 144.949 239.349C144.996 239.465 145.02 239.59 145.018 239.715V255.279H147.881C148.006 255.279 148.13 255.304 148.245 255.351C148.36 255.399 148.465 255.469 148.553 255.557C148.641 255.645 148.711 255.75 148.759 255.865C148.806 255.98 148.831 256.104 148.831 256.228C148.831 256.353 148.806 256.476 148.759 256.592C148.711 256.707 148.641 256.812 148.553 256.9C148.465 256.988 148.36 257.058 148.245 257.105C148.13 257.153 148.006 257.178 147.881 257.178H145.018V262.32C145.018 262.571 144.918 262.813 144.74 262.991C144.562 263.169 144.321 263.269 144.069 263.269C143.817 263.269 143.575 263.169 143.397 262.991C143.219 262.813 143.119 262.571 143.119 262.32V257.178H132.637ZM143.119 255.279V242.789L134.472 255.279H143.119Z" fill="white"/>
<path d="M151.278 250.972C151.239 248.843 151.507 246.719 152.074 244.667C152.604 242.893 153.35 241.486 154.31 240.447C154.885 239.911 155.547 239.479 156.269 239.169C157.003 238.863 157.789 238.705 158.584 238.705C159.379 238.705 160.166 238.863 160.899 239.169C161.616 239.482 162.276 239.914 162.849 240.447C163.819 241.49 164.567 242.897 165.091 244.667C166.144 248.81 166.144 253.152 165.091 257.295C164.567 259.072 163.819 260.478 162.849 261.515C162.277 262.05 161.618 262.482 160.899 262.793C160.166 263.101 159.379 263.26 158.584 263.26C157.789 263.26 157.002 263.101 156.269 262.793C155.549 262.487 154.888 262.056 154.316 261.521C153.356 260.48 152.61 259.074 152.08 257.301C151.51 255.241 151.24 253.109 151.278 250.972ZM158.578 240.595C158.033 240.587 157.492 240.692 156.989 240.902C156.486 241.113 156.032 241.425 155.654 241.819C154.011 243.657 153.19 246.708 153.192 250.972C153.194 255.236 154.015 258.302 155.654 260.171C156.033 260.562 156.487 260.871 156.99 261.078C157.494 261.286 158.034 261.387 158.578 261.376C159.122 261.384 159.661 261.281 160.164 261.074C160.666 260.867 161.121 260.559 161.502 260.171C163.157 258.314 163.984 255.248 163.982 250.972C163.98 246.696 163.153 243.645 161.502 241.819C161.122 241.429 160.667 241.12 160.164 240.91C159.662 240.701 159.122 240.596 158.578 240.601V240.595Z" fill="white"/>
<path d="M169.368 257.178C169.243 257.179 169.119 257.155 169.004 257.108C168.888 257.061 168.783 256.991 168.695 256.902C168.607 256.814 168.537 256.709 168.49 256.593C168.443 256.477 168.42 256.353 168.422 256.228C168.419 256.032 168.477 255.839 168.588 255.677L180.023 239.148C180.108 239.022 180.225 238.92 180.362 238.853C180.499 238.786 180.651 238.756 180.803 238.765C180.928 238.762 181.052 238.785 181.168 238.832C181.284 238.879 181.388 238.95 181.475 239.04C181.565 239.127 181.636 239.233 181.684 239.349C181.731 239.465 181.755 239.589 181.753 239.715V255.279H184.613C184.738 255.277 184.863 255.3 184.979 255.348C185.095 255.396 185.2 255.467 185.288 255.556C185.464 255.736 185.562 255.978 185.562 256.23C185.562 256.482 185.464 256.723 185.288 256.904C185.2 256.992 185.094 257.062 184.978 257.109C184.862 257.157 184.738 257.18 184.613 257.178H181.744V262.32C181.746 262.445 181.722 262.57 181.675 262.686C181.627 262.802 181.556 262.907 181.466 262.995C181.287 263.17 181.045 263.269 180.794 263.269C180.543 263.269 180.302 263.17 180.122 262.995C180.032 262.907 179.961 262.802 179.914 262.686C179.866 262.57 179.843 262.445 179.845 262.32V257.178H169.368ZM179.854 255.279V242.789L171.195 255.279H179.854Z" fill="white"/>
<path d="M240.396 123.902C234.368 122.248 230.025 123.269 230.025 123.269C226.191 114.731 214.051 106.798 214.051 106.798C205.512 111.244 209.433 129.373 209.433 129.373L204.553 131.202C198.453 123.794 189.911 115.689 187.449 115.514C181.762 115.111 181.566 140.615 181.566 140.615C167.728 148.846 153.575 157.448 142.562 164.859C142.969 159.564 145.491 152.722 151.64 144.364C162.882 129.068 165.366 108.838 154.994 96.6047C140.44 79.4249 127.106 85.2721 119.176 92.8583C111.156 100.526 109.935 114.035 122.492 105.059C135.123 96.0169 141.317 100.701 147.242 111.858C153.168 123.016 134.867 140.19 126.328 154.127C121.539 161.945 119.179 169.67 119.282 176.129H177.211C177.093 176.261 176.978 176.391 176.876 176.521L179.748 176.129H198.191C205.554 183.215 222.815 196.419 226.67 188.809C228.614 184.978 229.464 180.776 228.656 176.789C230.365 180.053 235.712 189.276 240.36 186.693C244.386 184.456 247.593 178.193 246.813 171.623C249.808 168.859 252.114 165.917 253.558 162.831C265.322 141.661 245.746 125.376 240.396 123.902Z" fill="#49BEFF"/>
<path d="M246.409 136.519C253.6 125.536 270.596 123.969 270.596 123.969M249.417 145.407C251.117 142.007 263.667 134.949 273.079 137.694" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M208.243 154.688C203.098 153.006 192.811 151.852 184.938 159.411M207.803 150.158C202.835 145.845 189.631 144.666 180.481 151.595" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M190.198 117.693C190.198 117.693 183.66 133.249 190.852 138.49" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M215.428 108.936C215.428 108.936 212.028 120.69 215.166 128.674" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M216.733 147.931C217.961 147.509 218.416 145.596 217.75 143.658C217.084 141.72 215.549 140.491 214.321 140.914C213.093 141.336 212.638 143.249 213.304 145.186C213.97 147.124 215.505 148.353 216.733 147.931Z" fill="#2E186A"/>
<path d="M234.379 142.31C235.607 141.888 236.062 139.975 235.396 138.037C234.73 136.099 233.195 134.87 231.967 135.292C230.739 135.714 230.284 137.628 230.95 139.565C231.616 141.503 233.151 142.732 234.379 142.31Z" fill="#2E186A"/>
<path d="M232.795 145.946L230.624 149.521C230.465 149.769 230.215 149.946 229.927 150.013C229.64 150.08 229.337 150.032 229.084 149.879L225.724 147.875C225.544 147.774 225.4 147.621 225.308 147.437C225.217 147.252 225.183 147.045 225.211 146.841C225.239 146.637 225.327 146.446 225.465 146.293C225.603 146.14 225.783 146.032 225.983 145.982L231.514 144.412C232.469 144.138 233.283 145.123 232.795 145.946Z" fill="#2E186A"/>
<path d="M227.002 153.281C230.465 157.672 230.353 152.202 229.805 149.32C230.92 151.825 233.87 155.457 234.326 151.43" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M222.683 190.966C222.333 190.008 216.866 179.133 211.461 175.037M219.219 171.812C219.479 171.9 225.85 182.361 226.103 189.505" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M176.864 176.526C181.831 170.381 204.593 158.485 217.251 164.238C229.91 169.992 230.977 180.318 226.664 188.814" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M232.487 170.498C232.487 170.498 238.37 181.674 238.5 187.099M239.808 168.023C239.808 168.023 244.121 181.029 241.574 186.062" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M222.086 166.15C223.674 163.597 237.635 155.254 243.82 163.934C244.944 165.511 246.171 168.582 246.671 170.246" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M0.904175 302.523H359.096" stroke="#2E186A" stroke-width="1.80839" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_1928_12651">
<rect width="360" height="360" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -0,0 +1,54 @@
<svg width="360" height="199" viewBox="0 0 360 199" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_1968_12144" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-78" width="360" height="360">
<path d="M360 -78H0V282H360V-78Z" fill="white"/>
</mask>
<g mask="url(#mask0_1968_12144)">
<path d="M263.066 164.022C265.813 164.411 275.401 164.23 280.366 146.041C285.331 127.853 307.094 135.002 307.094 135.002" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M307.577 139.39C310.101 139.39 312.147 137.343 312.147 134.819C312.147 132.294 310.101 130.248 307.577 130.248C305.052 130.248 303.006 132.294 303.006 134.819C303.006 137.343 305.052 139.39 307.577 139.39Z" fill="#FEBA91"/>
<path d="M260.459 99.9435C268.081 101.207 286.48 94.0115 282.132 76.7165C277.785 59.4215 294.73 54.7715 294.73 54.7715" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M306.416 57.6909L310.64 52.3029M301.593 53.0179L305.817 47.6299M295.561 48.1389L299.787 42.7539M288.895 43.9759L293.122 38.5879" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M307.901 57.1488L305.081 61.0938C304.781 61.5118 304.328 61.7948 303.821 61.8788C303.313 61.9628 302.793 61.8428 302.374 61.5428L285.987 49.8238C285.569 49.5248 285.286 49.0718 285.202 48.5638C285.118 48.0568 285.238 47.5358 285.538 47.1178L288.358 43.1738L307.901 57.1488Z" fill="#FEBA91"/>
<path d="M316.421 87.9154L325.292 82.1484M243.365 158.256C250.662 157.602 264.345 157.223 269.42 138.48C274.496 119.737 280.765 107.723 298.285 99.7304" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M302.478 101.8L318.267 91.5354C319.256 90.8924 319.537 89.5684 318.893 88.5794L316.518 84.9254C315.875 83.9364 314.551 83.6554 313.562 84.2984L297.773 94.5634C296.783 95.2074 296.503 96.5304 297.146 97.5204L299.522 101.173C300.165 102.163 301.488 102.443 302.478 101.8Z" fill="#49BEFF"/>
<path d="M27.002 136.25C40.8483 137.301 42.8564 142.742 46.4783 148.23C50.1003 153.718 55.3544 158.712 65.2135 152.78C71.9474 148.724 75.8953 148.54 78.5894 149.839" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M24.0298 141.362C26.5541 141.362 28.6005 139.316 28.6005 136.791C28.6005 134.267 26.5541 132.221 24.0298 132.221C21.5054 132.221 19.459 134.267 19.459 136.791C19.459 139.316 21.5054 141.362 24.0298 141.362Z" fill="#49BEFF"/>
<path d="M46.0536 50.4507L31.7096 48.9787C30.2656 48.8307 28.9748 49.8817 28.8266 51.3257L26.9007 70.0907C26.7525 71.5347 27.8029 72.8257 29.247 72.9737L43.591 74.4457C45.035 74.5937 46.3258 73.5438 46.474 72.0998L48.3999 53.3337C48.5482 51.8897 47.4977 50.5997 46.0536 50.4507Z" fill="#FEBA91"/>
<path d="M35.9447 55.1831L23.1077 53.6641M35.1851 61.6021L22.3481 60.0801M34.4229 68.0201L21.5859 66.4981M77.4181 87.8171C69.7669 76.0611 63.0277 62.1771 47.2915 62.6531" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M41.4292 49.8164L38.5801 73.8064" stroke="#2E186A" stroke-width="1.57703" stroke-linejoin="round"/>
<path d="M18.4208 111.183C18.8955 110.795 19.2752 110.303 19.5308 109.746C19.7864 109.188 19.9111 108.58 19.8953 107.967C19.8796 107.354 19.7239 106.752 19.4401 106.209C19.1563 105.665 18.7519 105.193 18.2578 104.83" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32.2626 101.65L17.0536 103.745C14.9325 104.037 13.4498 105.993 13.7418 108.114L13.8616 108.984C14.1537 111.105 16.1099 112.588 18.2311 112.296L33.44 110.201C35.5611 109.909 37.0438 107.953 36.7518 105.832L36.632 104.962C36.34 102.841 34.3837 101.358 32.2626 101.65Z" fill="#FEBA91"/>
<path d="M16.4911 108.211L6.01172 109.654M78.7498 112.587C65.0979 104.226 53.3569 100.867 36.9925 105.672" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M262.077 11.5234L194.422 11.555L200.236 15.8944L199.894 191.568L215.665 191.489V182.216C215.664 181.639 215.777 181.067 215.997 180.534C216.218 180 216.541 179.515 216.949 179.106C217.357 178.698 217.841 178.374 218.374 178.152C218.908 177.931 219.479 177.817 220.057 177.816H249.991C250.568 177.817 251.14 177.931 251.673 178.153C252.206 178.374 252.69 178.699 253.097 179.107C253.505 179.516 253.828 180.001 254.048 180.534C254.268 181.068 254.381 181.639 254.381 182.216V191.679H268.5V17.984C268.503 17.138 268.339 16.2998 268.017 15.5173C267.696 14.7348 267.223 14.0232 266.627 13.4233C266.03 12.8234 265.321 12.3468 264.541 12.0209C263.76 11.6949 262.923 11.5259 262.077 11.5234Z" fill="#5D87FF"/>
<path d="M190.524 191.568V181.72C190.524 181.144 190.41 180.573 190.189 180.042C189.968 179.51 189.645 179.026 189.237 178.619C188.829 178.213 188.346 177.89 187.813 177.67C187.281 177.45 186.711 177.337 186.135 177.338H100.783C100.207 177.337 99.6365 177.45 99.1042 177.67C98.5719 177.89 98.0881 178.213 97.6804 178.619C97.2728 179.026 96.9493 179.51 96.7285 180.042C96.5077 180.573 96.3939 181.144 96.3935 181.72V191.518H77.5795L77.5664 18.2417C77.5671 17.4722 77.7194 16.7105 78.0147 15.9999C78.3099 15.2893 78.7423 14.6439 79.2872 14.1005C79.832 13.5572 80.4786 13.1265 81.1899 12.8332C81.9013 12.5398 82.6635 12.3895 83.433 12.3909L194.088 12.3594C194.933 12.3587 195.769 12.5245 196.55 12.8473C197.33 13.1701 198.039 13.6436 198.637 14.2407C199.234 14.8378 199.708 15.5468 200.031 16.3271C200.354 17.1074 200.52 17.9438 200.52 18.7884V191.687L190.524 191.568Z" fill="white" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M183.478 24.7461H96.0396C91.6006 24.7461 88.002 28.3451 88.002 32.7841V159.706C88.002 164.145 91.6006 167.744 96.0396 167.744H183.478C187.917 167.744 191.516 164.145 191.516 159.706V32.7841C191.516 28.3451 187.917 24.7461 183.478 24.7461Z" fill="#2E186A"/>
<path d="M200.113 86.9531H268.496V106.219H200.113V86.9531Z" fill="#2E186A"/>
<path d="M239.104 98.3616C240.086 98.3616 240.881 97.5666 240.881 96.5846C240.881 95.6036 240.086 94.8086 239.104 94.8086C238.123 94.8086 237.328 95.6036 237.328 96.5846C237.328 97.5666 238.123 98.3616 239.104 98.3616Z" fill="white"/>
<path d="M229.675 98.3616C230.656 98.3616 231.452 97.5666 231.452 96.5846C231.452 95.6036 230.656 94.8086 229.675 94.8086C228.693 94.8086 227.898 95.6036 227.898 96.5846C227.898 97.5666 228.693 98.3616 229.675 98.3616Z" fill="white"/>
<path d="M259.795 94.3105H249.102C248.551 94.3105 248.104 94.7575 248.104 95.3085V97.8635C248.104 98.4155 248.551 98.8625 249.102 98.8625H259.795C260.346 98.8625 260.792 98.4155 260.792 97.8635V95.3085C260.792 94.7575 260.346 94.3105 259.795 94.3105Z" fill="#5D87FF"/>
<path d="M219.539 94.3105H208.846C208.295 94.3105 207.848 94.7575 207.848 95.3085V97.8635C207.848 98.4155 208.295 98.8625 208.846 98.8625H219.539C220.09 98.8625 220.538 98.4155 220.538 97.8635V95.3085C220.538 94.7575 220.09 94.3105 219.539 94.3105Z" fill="#5D87FF"/>
<path d="M200.578 23.541H268.408V40.678H200.578V23.541Z" fill="#2E186A"/>
<path d="M200.73 114.354H268.466V143.108H200.73V114.354Z" fill="#2E186A"/>
<path d="M201.283 50.8906H268.409M201.283 63.8406H268.409M201.283 76.7906H268.409" stroke="white" stroke-width="1.57703" stroke-linejoin="round"/>
<path d="M185.786 24.7476H144.92C130.09 23.5096 85.9698 27.3386 83.6463 38.8956C81.3228 50.4526 105.987 55.2496 105.987 55.2496C95.8367 81.1286 104.824 90.9956 114.925 96.8806C118.342 102.987 123.274 107.597 129.193 109.76L129.125 109.928C126.015 112.649 123.56 118.36 125.445 122.842C122.087 121.56 118.466 121.125 114.9 121.574C111.333 122.023 107.933 123.343 104.997 125.418L88.1618 119.399C87.5029 119.32 86.8348 119.407 86.2176 119.651C85.6004 119.894 85.0533 120.288 84.6255 120.795C84.1977 121.302 83.9026 121.908 83.7665 122.557C83.6305 123.207 83.6578 123.88 83.846 124.516C86.3877 133.058 91.2791 138.349 95.5056 141.501C95.2951 142.878 95.1757 144.268 95.1481 145.661C95.1323 146.468 95.1271 147.252 95.1297 148.027C90.757 150.744 86.837 154.129 83.5122 158.06C81.9352 159.899 82.5055 162.478 84.0195 164.176C87.5547 168.118 95.5844 171.12 104.648 168.523H185.786C186.556 168.523 187.318 168.371 188.029 168.076C188.74 167.781 189.386 167.349 189.93 166.804C190.473 166.259 190.904 165.612 191.198 164.901C191.491 164.189 191.641 163.426 191.639 162.657V31.4206C191.639 28.1876 189.019 24.7476 185.786 24.7476Z" fill="#49BEFF"/>
<path d="M173.108 150.378C151.632 147.895 156.878 129.141 156.039 123.716C155.209 118.333 140.795 115.445 140.056 125.383C139.557 132.064 136.043 153.703 152.381 160.382" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M145.287 119.439C144.627 122.88 143.184 131.753 145 135.473M150.79 119.534C150.168 122.725 148.751 131.262 150.588 134.873" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M150.817 119.068C143.005 112.284 132.681 107.211 127.104 110.744M123.855 121.289C125.621 125.965 128.978 127.397 132.999 128.386C135.706 129.053 137.667 129.679 139.491 130.538M139.949 126.06L134.553 123.778M142.835 120.13L138.274 117.622" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M83.6113 159.766C83.6113 159.766 91.5911 167.125 102.707 160.791" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M85.9863 121.498C85.9863 121.498 87.5449 130.637 97.814 134.056" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M186.923 103.065C176.788 101.152 167.165 94.3181 165.081 70.2861C164.963 70.1841 144.075 86.1221 134.237 70.8881C127.952 59.2711 152.184 44.8091 163.814 36.9531" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M141.962 25.4336C137.494 27.7826 133.025 31.2976 128.649 35.3216C108.148 54.2136 106.526 81.4916 114.456 97.5196" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M142.377 64.025C143.569 64.025 144.535 63.059 144.535 61.867C144.535 60.675 143.569 59.709 142.377 59.709C141.185 59.709 140.219 60.675 140.219 61.867C140.219 63.059 141.185 64.025 142.377 64.025Z" fill="#2E186A"/>
<path d="M144.824 70.773C146.016 70.773 146.982 69.807 146.982 68.615C146.982 67.423 146.016 66.457 144.824 66.457C143.632 66.457 142.666 67.423 142.666 68.615C142.666 69.807 143.632 70.773 144.824 70.773Z" fill="#2E186A"/>
<path d="M152.554 72.8414C153.746 72.8414 154.712 71.8754 154.712 70.6834C154.712 69.4924 153.746 68.5254 152.554 68.5254C151.363 68.5254 150.396 69.4924 150.396 70.6834C150.396 71.8754 151.363 72.8414 152.554 72.8414Z" fill="#2E186A"/>
<path d="M151.178 66.8543C154.029 66.8543 156.34 64.5423 156.34 61.6913C156.34 58.8403 154.029 56.5293 151.178 56.5293C148.327 56.5293 146.016 58.8403 146.016 61.6913C146.016 64.5423 148.327 66.8543 151.178 66.8543Z" fill="#2E186A"/>
<path d="M94.8278 40.984C96.0196 40.984 96.9857 40.018 96.9857 38.826C96.9857 37.634 96.0196 36.668 94.8278 36.668C93.636 36.668 92.6699 37.634 92.6699 38.826C92.6699 40.018 93.636 40.984 94.8278 40.984Z" fill="#2E186A"/>
<path d="M97.3616 35.306C97.9424 35.325 98.5213 35.23 99.0652 35.025C99.6091 34.821 100.108 34.511 100.532 34.114C100.956 33.717 101.298 33.24 101.538 32.711C101.778 32.182 101.911 31.61 101.93 31.029C101.935 30.241 101.762 29.461 101.425 28.748C98.4235 29.169 95.6768 30.278 93.1588 31.143C93.1168 33.553 94.9409 35.224 97.3616 35.306ZM86.3802 35.143C86.366 35.556 86.471 35.965 86.6826 36.321C86.8942 36.676 87.2035 36.963 87.5737 37.148C87.9439 37.333 88.3594 37.407 88.7706 37.362C89.1819 37.317 89.5716 37.155 89.8934 36.895C90.2151 36.635 90.4553 36.288 90.5854 35.895C90.7154 35.503 90.7298 35.081 90.6269 34.68C90.524 34.279 90.3081 33.917 90.0048 33.635C89.7016 33.354 89.3239 33.166 88.9166 33.093C88.0234 33.596 87.1833 34.187 86.4091 34.859C86.3927 34.953 86.3831 35.048 86.3802 35.143Z" fill="#2E186A"/>
<path d="M107.737 138.46C109.506 138.174 110.793 137.033 110.612 135.912C110.431 134.791 108.85 134.113 107.081 134.399C105.312 134.685 104.025 135.827 104.206 136.948C104.387 138.069 105.968 138.745 107.737 138.46Z" fill="#2E186A"/>
<path d="M111.662 153.458C113.427 153.177 114.713 152.043 114.535 150.925C114.357 149.807 112.782 149.128 111.017 149.409C109.253 149.69 107.967 150.824 108.145 151.943C108.323 153.061 109.898 153.739 111.662 153.458Z" fill="#2E186A"/>
<path d="M115.442 135.708L119.33 138.157C119.462 138.241 119.576 138.35 119.665 138.478C119.754 138.607 119.817 138.752 119.849 138.905C119.881 139.058 119.881 139.216 119.851 139.369C119.82 139.523 119.759 139.668 119.671 139.798L117.332 143.246C117.207 143.431 117.031 143.576 116.825 143.663C116.619 143.751 116.393 143.778 116.172 143.74C115.952 143.702 115.747 143.602 115.582 143.451C115.417 143.3 115.299 143.105 115.243 142.888L113.692 136.99C113.631 136.764 113.641 136.524 113.718 136.303C113.796 136.082 113.939 135.889 114.129 135.751C114.318 135.612 114.544 135.534 114.779 135.526C115.013 135.518 115.245 135.582 115.442 135.708Z" fill="#2E186A"/>
<path d="M123.384 141.793C128.378 138.361 122.332 138.213 119.102 138.639C121.925 137.588 126.057 134.655 121.623 133.984" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M111.985 102.421C109.018 108.971 108.269 119.137 115.373 130.545M123.009 101.756C118.611 107.638 115.846 117.455 120.275 129.948" stroke="white" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M128.924 178.978C124.588 175.133 118.915 163.734 120.55 151.906M139.254 175.091C134.194 172.268 126.209 162.364 125.263 150.463" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M359.212 191.643H0.789062" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,57 @@
<svg width="360" height="360" viewBox="0 0 360 360" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1928_12776)">
<path d="M263.065 242.022C265.812 242.411 275.4 242.23 280.365 224.041C285.33 205.853 307.093 213.002 307.093 213.002" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M307.577 217.39C310.101 217.39 312.147 215.343 312.147 212.819C312.147 210.294 310.101 208.248 307.577 208.248C305.052 208.248 303.006 210.294 303.006 212.819C303.006 215.343 305.052 217.39 307.577 217.39Z" fill="#FEBA91"/>
<path d="M260.458 177.943C268.08 179.207 286.479 172.011 282.131 154.716C277.784 137.421 294.729 132.771 294.729 132.771" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M306.415 135.691L310.639 130.303ZM301.592 131.018L305.816 125.63ZM295.56 126.139L299.786 120.754ZM288.894 121.976L293.121 116.588Z" fill="white"/>
<path d="M306.415 135.691L310.639 130.303M301.592 131.018L305.816 125.63M295.56 126.139L299.786 120.754M288.894 121.976L293.121 116.588" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M307.9 135.148L305.08 139.093C304.78 139.511 304.327 139.794 303.82 139.878C303.312 139.962 302.792 139.842 302.373 139.542L285.986 127.823C285.568 127.524 285.285 127.071 285.201 126.563C285.117 126.056 285.237 125.535 285.537 125.117L288.357 121.173L307.9 135.148Z" fill="#FEBA91"/>
<path d="M316.421 165.915L325.292 160.148M243.365 236.256C250.662 235.602 264.345 235.223 269.42 216.48C274.496 197.737 280.765 185.723 298.285 177.73" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M302.477 179.801L318.266 169.536C319.255 168.893 319.536 167.569 318.892 166.58L316.517 162.926C315.874 161.937 314.55 161.656 313.561 162.299L297.772 172.564C296.782 173.208 296.502 174.531 297.145 175.521L299.521 179.174C300.164 180.164 301.487 180.444 302.477 179.801Z" fill="#49BEFF"/>
<path d="M27.0015 214.25C40.8478 215.301 42.8559 220.742 46.4778 226.23C50.0998 231.718 55.3539 236.712 65.213 230.78C71.9469 226.724 75.8948 226.54 78.5889 227.839" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M24.0288 219.362C26.5531 219.362 28.5995 217.316 28.5995 214.791C28.5995 212.267 26.5531 210.221 24.0288 210.221C21.5044 210.221 19.458 212.267 19.458 214.791C19.458 217.316 21.5044 219.362 24.0288 219.362Z" fill="#49BEFF"/>
<path d="M46.0537 128.451L31.7097 126.979C30.2657 126.831 28.9749 127.882 28.8267 129.326L26.9008 148.091C26.7526 149.535 27.803 150.826 29.2471 150.974L43.5911 152.446C45.0351 152.594 46.3259 151.544 46.4741 150.1L48.4 131.334C48.5483 129.89 47.4978 128.6 46.0537 128.451Z" fill="#FEBA91"/>
<path d="M35.9432 133.183L23.1062 131.664M35.1836 139.602L22.3466 138.08M34.4214 146.02L21.5844 144.498M77.4166 165.817C69.7654 154.061 63.0262 140.177 47.29 140.653" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M41.4286 127.816L38.5795 151.806" stroke="#2E186A" stroke-width="1.57703" stroke-linejoin="round"/>
<path d="M18.4198 189.183C18.8945 188.795 19.2742 188.303 19.5298 187.746C19.7854 187.188 19.9101 186.58 19.8943 185.967C19.8786 185.354 19.7229 184.752 19.4391 184.209C19.1553 183.665 18.7509 183.193 18.2568 182.83" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32.262 179.65L17.053 181.745C14.9319 182.037 13.4492 183.993 13.7412 186.114L13.861 186.984C14.1531 189.105 16.1093 190.588 18.2305 190.296L33.4394 188.201C35.5605 187.909 37.0432 185.953 36.7512 183.832L36.6314 182.962C36.3394 180.841 34.3831 179.358 32.262 179.65Z" fill="#FEBA91"/>
<path d="M16.4905 186.211L6.01111 187.654M78.7492 190.587C65.0973 182.226 53.3563 178.867 36.9919 183.672" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M262.077 89.5234L194.422 89.555L200.236 93.8944L199.894 269.568L215.665 269.489V260.216C215.664 259.639 215.777 259.067 215.997 258.534C216.218 258 216.541 257.515 216.949 257.106C217.357 256.698 217.841 256.374 218.374 256.152C218.908 255.931 219.479 255.817 220.057 255.816H249.991C250.568 255.817 251.14 255.931 251.673 256.153C252.206 256.374 252.69 256.699 253.097 257.107C253.505 257.516 253.828 258.001 254.048 258.534C254.268 259.068 254.381 259.639 254.381 260.216V269.679H268.5V95.984C268.503 95.138 268.339 94.2998 268.017 93.5173C267.696 92.7348 267.223 92.0232 266.627 91.4233C266.03 90.8234 265.321 90.3468 264.541 90.0209C263.76 89.6949 262.923 89.5259 262.077 89.5234Z" fill="#5D87FF"/>
<path d="M190.524 269.568V259.72C190.524 259.144 190.41 258.573 190.189 258.042C189.968 257.51 189.645 257.026 189.237 256.619C188.829 256.213 188.346 255.89 187.813 255.67C187.281 255.45 186.711 255.337 186.135 255.338H100.783C100.207 255.337 99.6364 255.45 99.1041 255.67C98.5718 255.89 98.088 256.213 97.6803 256.619C97.2727 257.026 96.9492 257.51 96.7284 258.042C96.5076 258.573 96.3938 259.144 96.3934 259.72V269.518H77.5794L77.5663 96.2417C77.567 95.4722 77.7193 94.7105 78.0146 93.9999C78.3098 93.2893 78.7422 92.6439 79.2871 92.1005C79.8319 91.5572 80.4785 91.1265 81.1898 90.8332C81.9012 90.5398 82.6634 90.3895 83.4329 90.3909L194.088 90.3594C194.933 90.3587 195.769 90.5245 196.55 90.8473C197.33 91.1701 198.039 91.6436 198.637 92.2407C199.234 92.8378 199.708 93.5468 200.031 94.3271C200.354 95.1074 200.52 95.9438 200.52 96.7884V269.687L190.524 269.568Z" fill="white" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M183.477 102.746H96.0387C91.5997 102.746 88.0011 106.345 88.0011 110.784V237.706C88.0011 242.145 91.5997 245.744 96.0387 245.744H183.477C187.916 245.744 191.515 242.145 191.515 237.706V110.784C191.515 106.345 187.916 102.746 183.477 102.746Z" fill="#2E186A"/>
<path d="M200.112 164.953H268.495V184.219H200.112V164.953Z" fill="#2E186A"/>
<path d="M239.104 176.362C240.086 176.362 240.881 175.567 240.881 174.585C240.881 173.604 240.086 172.809 239.104 172.809C238.123 172.809 237.328 173.604 237.328 174.585C237.328 175.567 238.123 176.362 239.104 176.362Z" fill="white"/>
<path d="M229.674 176.362C230.655 176.362 231.451 175.567 231.451 174.585C231.451 173.604 230.655 172.809 229.674 172.809C228.692 172.809 227.897 173.604 227.897 174.585C227.897 175.567 228.692 176.362 229.674 176.362Z" fill="white"/>
<path d="M259.793 172.311H249.1C248.549 172.311 248.102 172.758 248.102 173.309V175.864C248.102 176.416 248.549 176.863 249.1 176.863H259.793C260.344 176.863 260.791 176.416 260.791 175.864V173.309C260.791 172.758 260.344 172.311 259.793 172.311Z" fill="#5D87FF"/>
<path d="M219.539 172.311H208.846C208.295 172.311 207.848 172.758 207.848 173.309V175.864C207.848 176.416 208.295 176.863 208.846 176.863H219.539C220.09 176.863 220.538 176.416 220.538 175.864V173.309C220.538 172.758 220.09 172.311 219.539 172.311Z" fill="#5D87FF"/>
<path d="M200.578 101.541H268.408V118.678H200.578V101.541Z" fill="#2E186A"/>
<path d="M200.73 192.354H268.466V221.108H200.73V192.354Z" fill="#2E186A"/>
<path d="M201.282 128.891H268.408M201.282 141.841H268.408M201.282 154.791H268.408" stroke="white" stroke-width="1.57703" stroke-linejoin="round"/>
<path d="M185.785 102.748H144.919C130.089 101.51 85.9693 105.339 83.6458 116.896C81.3223 128.453 105.987 133.25 105.987 133.25C95.8362 159.129 104.823 168.996 114.924 174.881C118.341 180.987 123.274 185.597 129.193 187.76L129.125 187.928C126.015 190.649 123.56 196.36 125.445 200.842C122.087 199.56 118.465 199.125 114.899 199.574C111.332 200.023 107.932 201.343 104.996 203.418L88.1613 197.399C87.5024 197.32 86.8343 197.407 86.2171 197.651C85.5999 197.894 85.0528 198.288 84.625 198.795C84.1972 199.302 83.9021 199.908 83.766 200.557C83.63 201.207 83.6573 201.88 83.8455 202.516C86.3872 211.058 91.2786 216.349 95.5051 219.501C95.2946 220.878 95.1752 222.268 95.1476 223.661C95.1318 224.468 95.1266 225.252 95.1292 226.027C90.7565 228.744 86.8365 232.129 83.5117 236.06C81.9347 237.899 82.505 240.478 84.019 242.176C87.5542 246.118 95.5839 249.12 104.647 246.523H185.785C186.555 246.523 187.317 246.371 188.028 246.076C188.739 245.781 189.385 245.349 189.929 244.804C190.472 244.259 190.903 243.612 191.197 242.901C191.49 242.189 191.64 241.426 191.638 240.657V109.421C191.638 106.188 189.018 102.748 185.785 102.748Z" fill="#49BEFF"/>
<path d="M173.108 228.378C151.632 225.895 156.878 207.141 156.039 201.716C155.209 196.333 140.795 193.445 140.056 203.383C139.557 210.064 136.043 231.703 152.381 238.382" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M145.287 197.439C144.627 200.88 143.184 209.753 145 213.473M150.79 197.534C150.168 200.725 148.751 209.262 150.588 212.873" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M150.817 197.068C143.005 190.284 132.681 185.211 127.104 188.744M123.855 199.289C125.621 203.965 128.978 205.397 132.999 206.386C135.706 207.053 137.667 207.679 139.491 208.538M139.949 204.06L134.553 201.778M142.835 198.13L138.274 195.622" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M83.6116 237.766C83.6116 237.766 91.5914 245.125 102.707 238.791" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M85.985 199.498C85.985 199.498 87.5436 208.637 97.8127 212.056" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M186.923 181.065C176.788 179.152 167.165 172.318 165.081 148.286C164.963 148.184 144.075 164.122 134.237 148.888C127.952 137.271 152.184 122.809 163.814 114.953" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M141.962 103.434C137.494 105.783 133.025 109.298 128.649 113.322C108.148 132.214 106.526 159.492 114.456 175.52" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M142.377 142.025C143.569 142.025 144.535 141.059 144.535 139.867C144.535 138.675 143.569 137.709 142.377 137.709C141.185 137.709 140.219 138.675 140.219 139.867C140.219 141.059 141.185 142.025 142.377 142.025Z" fill="#2E186A"/>
<path d="M144.824 148.773C146.016 148.773 146.982 147.807 146.982 146.615C146.982 145.423 146.016 144.457 144.824 144.457C143.632 144.457 142.666 145.423 142.666 146.615C142.666 147.807 143.632 148.773 144.824 148.773Z" fill="#2E186A"/>
<path d="M152.554 150.841C153.746 150.841 154.712 149.875 154.712 148.683C154.712 147.492 153.746 146.525 152.554 146.525C151.363 146.525 150.396 147.492 150.396 148.683C150.396 149.875 151.363 150.841 152.554 150.841Z" fill="#2E186A"/>
<path d="M151.177 144.854C154.028 144.854 156.339 142.542 156.339 139.691C156.339 136.84 154.028 134.529 151.177 134.529C148.326 134.529 146.015 136.84 146.015 139.691C146.015 142.542 148.326 144.854 151.177 144.854Z" fill="#2E186A"/>
<path d="M94.827 118.984C96.0188 118.984 96.9849 118.018 96.9849 116.826C96.9849 115.634 96.0188 114.668 94.827 114.668C93.6352 114.668 92.6691 115.634 92.6691 116.826C92.6691 118.018 93.6352 118.984 94.827 118.984Z" fill="#2E186A"/>
<path d="M97.3607 113.306C97.9415 113.325 98.5204 113.23 99.0643 113.025C99.6082 112.821 100.107 112.511 100.531 112.114C100.955 111.717 101.297 111.24 101.537 110.711C101.777 110.182 101.91 109.61 101.929 109.029C101.934 108.241 101.761 107.461 101.424 106.748C98.4226 107.169 95.6759 108.278 93.1579 109.143C93.1159 111.553 94.94 113.224 97.3607 113.306ZM86.3793 113.143C86.3651 113.556 86.4701 113.965 86.6817 114.321C86.8933 114.676 87.2026 114.963 87.5728 115.148C87.943 115.333 88.3585 115.407 88.7697 115.362C89.181 115.317 89.5707 115.155 89.8925 114.895C90.2142 114.635 90.4544 114.288 90.5845 113.895C90.7145 113.503 90.7289 113.081 90.626 112.68C90.5231 112.279 90.3072 111.917 90.0039 111.635C89.7007 111.354 89.323 111.166 88.9157 111.093C88.0225 111.596 87.1824 112.187 86.4082 112.859C86.3918 112.953 86.3822 113.048 86.3793 113.143Z" fill="#2E186A"/>
<path d="M107.737 216.46C109.506 216.174 110.793 215.033 110.612 213.912C110.431 212.791 108.85 212.114 107.081 212.4C105.312 212.686 104.025 213.827 104.206 214.948C104.387 216.069 105.968 216.745 107.737 216.46Z" fill="#2E186A"/>
<path d="M111.662 231.458C113.427 231.177 114.713 230.043 114.535 228.925C114.357 227.807 112.782 227.128 111.017 227.409C109.253 227.69 107.967 228.824 108.145 229.943C108.323 231.061 109.898 231.739 111.662 231.458Z" fill="#2E186A"/>
<path d="M115.441 213.708L119.329 216.157C119.461 216.241 119.575 216.35 119.664 216.478C119.753 216.607 119.816 216.752 119.848 216.905C119.88 217.058 119.88 217.216 119.85 217.369C119.819 217.523 119.758 217.668 119.67 217.798L117.331 221.246C117.206 221.431 117.03 221.576 116.824 221.663C116.618 221.751 116.392 221.778 116.171 221.74C115.951 221.702 115.746 221.602 115.581 221.451C115.416 221.3 115.298 221.105 115.242 220.888L113.691 214.99C113.63 214.764 113.64 214.524 113.717 214.303C113.795 214.082 113.938 213.889 114.128 213.751C114.317 213.612 114.543 213.534 114.778 213.526C115.012 213.518 115.244 213.582 115.441 213.708Z" fill="#2E186A"/>
<path d="M123.382 219.793C128.376 216.361 122.33 216.213 119.1 216.639C121.923 215.588 126.055 212.655 121.621 211.984" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M111.985 180.421C109.018 186.971 108.269 197.137 115.373 208.545M123.009 179.756C118.611 185.638 115.846 195.455 120.275 207.948" stroke="white" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M128.922 256.978C124.586 253.133 118.913 241.734 120.548 229.906M139.252 253.091C134.192 250.268 126.207 240.364 125.261 228.463" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M359.211 269.643H0.788452" stroke="#2E186A" stroke-width="1.57703" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_1928_12776">
<rect width="360" height="360" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,11 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_631_1669)">
<path d="M23.993 0H0.00703125C0.003148 0 0 0.003148 0 0.00703125V23.993C0 23.9969 0.003148 24 0.00703125 24H23.993C23.9969 24 24 23.9969 24 23.993V0.00703125C24 0.003148 23.9969 0 23.993 0Z" fill="#ED2224"/>
<path d="M13.875 5.625L19.2188 18.375V5.625H13.875ZM4.78125 5.625V18.375L10.125 5.625H4.78125ZM9.70312 15.7969H12.1406L13.2188 18.375H15.375L11.9531 10.2656L9.70312 15.7969Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_631_1669">
<rect width="24" height="24" rx="3" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 663 B

View File

@@ -0,0 +1,13 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_631_1649)">
<path d="M12 6.5625H22.6875C23.6383 8.43365 24.0817 10.5215 23.9735 12.6175C23.8652 14.7136 23.2091 16.7446 22.0706 18.5079C20.9321 20.2711 19.3511 21.7049 17.4852 22.6662C15.6194 23.6274 13.5341 24.0825 11.4375 23.9859" fill="#FFCC44"/>
<path d="M16.7344 14.7188L11.4375 23.9859C9.33318 23.8901 7.29114 23.2421 5.51666 22.1069C3.74218 20.9718 2.29777 19.3895 1.32864 17.5192C0.359502 15.6488 -0.100216 13.5563 -0.00430812 11.452C0.0915998 9.34768 0.739754 7.30568 1.87501 5.53125" fill="#0F9D58"/>
<path d="M12 6.56259H22.6875C21.7301 4.67609 20.291 3.0762 18.5161 1.92509C16.7411 0.773985 14.6934 0.112566 12.5805 0.0078703C10.4675 -0.096825 8.36448 0.358925 6.48443 1.32893C4.60438 2.29894 3.01418 3.74872 1.875 5.53134L7.26562 14.7188" fill="#DB4437"/>
<path d="M12 16.9219C14.7183 16.9219 16.9219 14.7183 16.9219 12C16.9219 9.28172 14.7183 7.07812 12 7.07812C9.28172 7.07812 7.07812 9.28172 7.07812 12C7.07812 14.7183 9.28172 16.9219 12 16.9219Z" fill="#4285F4" stroke="#F1F1F1" stroke-width="2"/>
</g>
<defs>
<clipPath id="clip0_631_1649">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 24C10.208 24 12 22.208 12 20V16H8C5.792 16 4 17.792 4 20C4 22.208 5.792 24 8 24Z" fill="#0ACF83"/>
<path d="M4 12C4 9.792 5.792 8 8 8H12V16H8C5.792 16 4 14.208 4 12Z" fill="#A259FF"/>
<path d="M4 4C4 1.792 5.792 0 8 0H12V8H8C5.792 8 4 6.208 4 4Z" fill="#F24E1E"/>
<path d="M12 0H16C18.208 0 20 1.792 20 4C20 6.208 18.208 8 16 8H12V0Z" fill="#FF7262"/>
<path d="M20 12C20 14.208 18.208 16 16 16C13.792 16 12 14.208 12 12C12 9.792 13.792 8 16 8C18.208 8 20 9.792 20 12Z" fill="#1ABCFE"/>
</svg>

After

Width:  |  Height:  |  Size: 608 B

View File

@@ -0,0 +1,11 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_631_1629)">
<path d="M23.993 0H0.00703125C0.003148 0 0 0.003148 0 0.00703125V23.993C0 23.9969 0.003148 24 0.00703125 24H23.993C23.9969 24 24 23.9969 24 23.993V0.00703125C24 0.003148 23.9969 0 23.993 0Z" fill="#F7DF1E"/>
<path d="M15.1875 17.3438C15.6562 18.1406 16.3125 18.7031 17.3906 18.7031C18.3281 18.7031 18.9375 18.2344 18.9375 17.5781C18.9375 16.8281 18.3281 16.5469 17.2969 16.0781L16.7344 15.8438C15.0938 15.1406 14.0156 14.2969 14.0156 12.4688C14.0156 10.7812 15.2812 9.46875 17.2969 9.46875C18.75 9.46875 19.7812 9.98438 20.4844 11.2969L18.75 12.4219C18.375 11.7188 17.9531 11.4375 17.2969 11.4375C16.6406 11.4375 16.2188 11.8594 16.2188 12.4219C16.2188 13.0781 16.6406 13.3594 17.625 13.7812L18.1875 14.0156C20.1094 14.8594 21.1875 15.6562 21.1875 17.5781C21.1875 19.5938 19.5938 20.7188 17.4375 20.7188C15.3281 20.7188 13.9688 19.7344 13.3125 18.4219L15.1875 17.3438ZM7.21875 17.5312C7.59375 18.1406 7.875 18.7031 8.67188 18.7031C9.42188 18.7031 9.89062 18.4219 9.89062 17.2969V9.51562H12.1406V17.2031C12.1406 19.5469 10.7812 20.5781 8.76562 20.5781C6.9375 20.5781 5.90625 19.6406 5.39062 18.5156L7.21875 17.5312Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_631_1629">
<rect width="24" height="24" rx="3" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.25 21H2.75C2.02082 20.9995 1.32165 20.7096 0.806041 20.194C0.290431 19.6783 0.000529737 18.9792 0 18.25L0 5.75C0.000529737 5.02082 0.290431 4.32165 0.806041 3.80604C1.32165 3.29043 2.02082 3.00053 2.75 3H8C8.199 3 8.39 3.079 8.53 3.22L10.311 5H21.25C21.9792 5.00053 22.6783 5.29043 23.194 5.80604C23.7096 6.32165 23.9995 7.02082 24 7.75V18.25C23.9995 18.9792 23.7096 19.6783 23.194 20.194C22.6783 20.7096 21.9792 20.9995 21.25 21Z" fill="#03A9F4"/>
<path d="M11.5 16C11.3011 16 11.1103 15.921 10.9697 15.7803C10.829 15.6397 10.75 15.4489 10.75 15.25V10.75C10.75 10.5511 10.829 10.3603 10.9697 10.2197C11.1103 10.079 11.3011 10 11.5 10C11.6989 10 11.8897 10.079 12.0303 10.2197C12.171 10.3603 12.25 10.5511 12.25 10.75V15.25C12.25 15.4489 12.171 15.6397 12.0303 15.7803C11.8897 15.921 11.6989 16 11.5 16ZM8.24999 16H5.74999C5.61924 16.0005 5.49066 15.9667 5.37706 15.9019C5.26345 15.8372 5.1688 15.7438 5.10253 15.6311C5.03626 15.5184 5.00069 15.3903 4.99937 15.2596C4.99804 15.1288 5.03101 15 5.09499 14.886L6.97599 11.5H5.74999C5.55108 11.5 5.36031 11.421 5.21966 11.2803C5.07901 11.1397 4.99999 10.9489 4.99999 10.75C4.99999 10.5511 5.07901 10.3603 5.21966 10.2197C5.36031 10.079 5.55108 10 5.74999 10H8.24999C8.38074 9.99954 8.50932 10.0334 8.62293 10.0981C8.73653 10.1628 8.83119 10.2562 8.89745 10.3689C8.96372 10.4816 8.99929 10.6097 9.00061 10.7404C9.00194 10.8712 8.96897 11 8.90499 11.114L7.02399 14.5H8.24999C8.4489 14.5 8.63967 14.579 8.78032 14.7197C8.92097 14.8603 8.99999 15.0511 8.99999 15.25C8.99999 15.4489 8.92097 15.6397 8.78032 15.7803C8.63967 15.921 8.4489 16 8.24999 16ZM14.75 16C14.5511 16 14.3603 15.921 14.2197 15.7803C14.079 15.6397 14 15.4489 14 15.25V10.75C14 10.5511 14.079 10.3603 14.2197 10.2197C14.3603 10.079 14.5511 10 14.75 10H16C17.103 10 18 10.897 18 12C18 13.103 17.103 14 16 14H15.5V15.25C15.5 15.4489 15.421 15.6397 15.2803 15.7803C15.1397 15.921 14.9489 16 14.75 16ZM15.5 12.5H16C16.275 12.5 16.5 12.275 16.5 12C16.5 11.725 16.275 11.5 16 11.5H15.5V12.5Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="28px" height="20px" viewBox="0 0 28 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>ic_flag_cn</title>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_flag_cn">
<rect id="Mask" fill="#F1361D" x="0" y="0" width="28" height="20" rx="3"></rect>
<path d="M11.9592954,10.1560699 L11.9708698,11.1384189 L12.5105968,11.9592954 L11.5282478,11.9708698 L10.7073712,12.5105968 L10.6957968,11.5282478 L10.1560699,10.7073712 L11.1384189,10.6957968 L11.9592954,10.1560699 Z M6.66666667,2.66666667 L7.5836117,5.40460011 L10.4708927,5.43059869 L8.15031489,7.1487332 L9.01780768,9.90273464 L6.66666667,8.22666673 L4.31552566,9.90273464 L5.18301844,7.1487332 L2.8624406,5.43059869 L5.74972164,5.40460011 L6.66666667,2.66666667 Z M12.5685648,7.57446394 L13.4490988,8.01012816 L14.4255361,7.90189808 L13.9898718,8.78243212 L14.0981019,9.75886939 L13.2175679,9.32320517 L12.2411306,9.43143525 L12.6767948,8.55090121 L12.5685648,7.57446394 Z M14,4.17863279 L13.9772839,5.1607873 L14.4880339,6 L13.5058794,5.97728388 L12.6666667,6.48803387 L12.6893828,5.50587936 L12.1786328,4.66666667 L13.1607873,4.68938278 L14,4.17863279 Z M10.8992425,1.40597523 L11.6255808,2.06747064 L12.5940248,2.23257579 L11.9325294,2.9589141 L11.7674242,3.9273581 L11.0410859,3.2658627 L10.0726419,3.10075754 L10.7341373,2.37441924 L10.8992425,1.40597523 Z" id="Combined-Shape" fill="#FFDC42"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
<svg height="20" viewBox="0 0 28 20" width="28" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><rect id="a" height="20" rx="3" width="28"/><mask id="b" fill="#fff"><use fill="#fff" fill-rule="evenodd" xlink:href="#a"/></mask></defs><g fill="none" fill-rule="evenodd"><use fill="#0a17a7" xlink:href="#a"/><path d="m29.2824692-1.91644623 1.4911811 2.21076686-9.4483006 6.37223314 6.6746503.0001129v6.66666663l-6.6746503-.0007795 9.4483006 6.3731256-1.4911811 2.2107668-11.9501195-8.0608924.0009836 7.4777795h-6.6666666l-.000317-7.4777795-11.9488189 8.0608924-1.49118107-2.2107668 9.448-6.3731256-6.67434973.0007795v-6.66666663l6.67434973-.0001129-9.448-6.37223314 1.49118107-2.21076686 11.9488189 8.06.000317-7.4768871h6.6666666l-.0009836 7.4768871z" fill="#fff" mask="url(#b)"/><g stroke="#db1f35" stroke-linecap="round" stroke-width=".667"><path d="m18.668 6.332 12.665-8.332" mask="url(#b)"/><path d="m20.013 21.35 11.354-7.652" mask="url(#b)" transform="matrix(1 0 0 -1 0 35.048)"/><path d="m8.006 6.31-11.843-7.981" mask="url(#b)"/><path d="m9.29 22.31-13.127-8.705" mask="url(#b)" transform="matrix(1 0 0 -1 0 35.915)"/></g><path d="m0 12h12v8h4v-8h12v-4h-12v-8h-4v8h-12z" fill="#e6273e" mask="url(#b)"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1 @@
<svg height="20" viewBox="0 0 28 20" width="28" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><rect id="a" height="20" rx="3" width="28"/><mask id="b" fill="#fff"><use fill="#fff" fill-rule="evenodd" xlink:href="#a"/></mask></defs><g fill="none" fill-rule="evenodd"><use fill="#fff" xlink:href="#a"/><path d="m19 0h9v20h-9z" fill="#f44653" mask="url(#b)"/><path d="m0 0h9v20h-9z" fill="#1035bb" mask="url(#b)"/></g></svg>

After

Width:  |  Height:  |  Size: 459 B

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--twemoji" preserveAspectRatio="xMidYMid meet"><path fill="#EE2024" d="M36 27v-4H0v4a4 4 0 0 0 4 4h28a4 4 0 0 0 4-4z"></path><path fill="#EEE" d="M36 23H0V9a4 4 0 0 1 4-4h28a4 4 0 0 1 4 4v14z"></path><path fill="#0A4EA2" d="M0 13h36v10H0z"></path><path fill="#FFF" d="M11.837 25.09c-1.129-.646-3.638-2.278-4.555-4.488c-.925-2.227-.719-5.423-.481-9.124l.06-.936h11.963l.061.936c.238 3.7.444 6.895-.481 9.123c-.918 2.211-3.426 3.844-4.556 4.489l-1.004.572l-1.007-.572z"></path><path fill="#EE2024" d="M17.886 11.542H7.798c-.238 3.707-.422 6.68.407 8.676c1.021 2.46 4.516 4.22 4.631 4.276v.006l.005-.003l.005.003v-.006c.115-.057 3.61-1.816 4.632-4.276c.83-1.996.647-4.97.408-8.676z"></path><path fill="#FFF" d="M15.865 16.109s-1.401.133-2.632.165a13.05 13.05 0 0 1 .003-1.286c.973.06 1.645.246 1.645.246c.247 0 .447-.2.447-.447v-.606c0-.247-.2-.447-.447-.447c0 0-.739.126-1.568.179c.071-.782.156-1.435.156-1.435c0-.247-.2-.447-.447-.447h-.605c-.247 0-.447.2-.447.447c0 0 .092.666.17 1.443a13.359 13.359 0 0 1-1.583-.187c-.247 0-.447.2-.447.447v.606c0 .247.2.447.447.447c0 0 .639-.206 1.67-.255c.014.23.024.453.024.646c0 .161-.006.388-.016.649c-1.242-.033-2.693-.164-2.693-.164c-.247 0-.447.2-.447.447v.606c0 .247.2.447.447.447c0 0 1.319-.108 2.635-.128c-.083 1.531-.207 3.322-.207 3.322c0 .247.2.447.447.447h.605c.247 0 .447-.2.447-.447c0 0-.111-1.773-.185-3.317c1.272.03 2.581.123 2.581.123c.247 0 .447-.2.447-.447v-.606c0-.247-.2-.448-.447-.448z"></path><path fill="#0A4EA2" d="M17.079 20.965c-.508-1.086-1.905-1.393-2.568-.066c-.438-1.594-1.681-1.594-1.681-1.594s-1.244 0-1.681 1.594c-.658-1.316-2.04-1.024-2.558.041c1.314 2.074 4.143 3.504 4.247 3.555v.005l.005-.003l.005.003v-.006c.103-.051 2.91-1.469 4.231-3.529z"></path></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Some files were not shown because too many files have changed in this diff Show More