Initial commit: PC Builder AdonisJS project

This commit is contained in:
Kevin committed 2026-06-28 10:41:51 +02:00
commit 648d0af538
144 files changed
+18570

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
/**
* This file is automatically generated.
* DO NOT EDIT manually
*/
/// <reference path="./manifest.d.ts" />
import type { InferData, InferVariants } from '@adonisjs/core/types/transformers'
import type { InferSharedProps } from '@adonisjs/inertia/types'
import type UserTransformer from '#transformers/user_transformer'
import type InertiaMiddleware from '#middleware/inertia_middleware'
export namespace Data {
export type User = InferData<UserTransformer>
export namespace User {
export type Variants = InferVariants<UserTransformer>
}
export type SharedProps = InferSharedProps<InertiaMiddleware>
}
+9
View File
@@ -0,0 +1,9 @@
/**
* This file is automatically generated.
* DO NOT EDIT manually
*/
/// <reference path="../../adonisrc.ts" />
/// <reference path="../../config/auth.ts" />
/// <reference path="../../config/hash.ts" />
/// <reference path="../../config/logger.ts" />
+143
View File
@@ -0,0 +1,143 @@
/* eslint-disable prettier/prettier */
import type { AdonisEndpoint } from '@tuyau/core/types'
import type { Registry } from './schema.d.ts'
import type { ApiDefinition } from './tree.d.ts'
const placeholder: any = {}
const routes = {
'home': {
methods: ["GET","HEAD"],
pattern: '/',
tokens: [{"old":"/","type":0,"val":"/","end":""}],
types: placeholder as Registry['home']['types'],
},
'new_account.create': {
methods: ["GET","HEAD"],
pattern: '/auth/signup',
tokens: [{"old":"/auth/signup","type":0,"val":"auth","end":""},{"old":"/auth/signup","type":0,"val":"signup","end":""}],
types: placeholder as Registry['new_account.create']['types'],
},
'new_account.store': {
methods: ["POST"],
pattern: '/auth/signup',
tokens: [{"old":"/auth/signup","type":0,"val":"auth","end":""},{"old":"/auth/signup","type":0,"val":"signup","end":""}],
types: placeholder as Registry['new_account.store']['types'],
},
'session.create': {
methods: ["GET","HEAD"],
pattern: '/auth/login',
tokens: [{"old":"/auth/login","type":0,"val":"auth","end":""},{"old":"/auth/login","type":0,"val":"login","end":""}],
types: placeholder as Registry['session.create']['types'],
},
'session.store': {
methods: ["POST"],
pattern: '/auth/login',
tokens: [{"old":"/auth/login","type":0,"val":"auth","end":""},{"old":"/auth/login","type":0,"val":"login","end":""}],
types: placeholder as Registry['session.store']['types'],
},
'session.destroy': {
methods: ["POST"],
pattern: '/logout',
tokens: [{"old":"/logout","type":0,"val":"logout","end":""}],
types: placeholder as Registry['session.destroy']['types'],
},
'computers.index': {
methods: ["GET","HEAD"],
pattern: '/computers',
tokens: [{"old":"/computers","type":0,"val":"computers","end":""}],
types: placeholder as Registry['computers.index']['types'],
},
'computers.create': {
methods: ["GET","HEAD"],
pattern: '/computers/create',
tokens: [{"old":"/computers/create","type":0,"val":"computers","end":""},{"old":"/computers/create","type":0,"val":"create","end":""}],
types: placeholder as Registry['computers.create']['types'],
},
'computers.store': {
methods: ["POST"],
pattern: '/computers',
tokens: [{"old":"/computers","type":0,"val":"computers","end":""}],
types: placeholder as Registry['computers.store']['types'],
},
'computers.show': {
methods: ["GET","HEAD"],
pattern: '/computers/:id',
tokens: [{"old":"/computers/:id","type":0,"val":"computers","end":""},{"old":"/computers/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['computers.show']['types'],
},
'computers.edit': {
methods: ["GET","HEAD"],
pattern: '/computers/:id/edit',
tokens: [{"old":"/computers/:id/edit","type":0,"val":"computers","end":""},{"old":"/computers/:id/edit","type":1,"val":"id","end":""},{"old":"/computers/:id/edit","type":0,"val":"edit","end":""}],
types: placeholder as Registry['computers.edit']['types'],
},
'computers.update': {
methods: ["PUT"],
pattern: '/computers/:id',
tokens: [{"old":"/computers/:id","type":0,"val":"computers","end":""},{"old":"/computers/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['computers.update']['types'],
},
'computers.destroy': {
methods: ["DELETE"],
pattern: '/computers/:id',
tokens: [{"old":"/computers/:id","type":0,"val":"computers","end":""},{"old":"/computers/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['computers.destroy']['types'],
},
'components.index': {
methods: ["GET","HEAD"],
pattern: '/components',
tokens: [{"old":"/components","type":0,"val":"components","end":""}],
types: placeholder as Registry['components.index']['types'],
},
'components.create': {
methods: ["GET","HEAD"],
pattern: '/components/create',
tokens: [{"old":"/components/create","type":0,"val":"components","end":""},{"old":"/components/create","type":0,"val":"create","end":""}],
types: placeholder as Registry['components.create']['types'],
},
'components.store': {
methods: ["POST"],
pattern: '/components',
tokens: [{"old":"/components","type":0,"val":"components","end":""}],
types: placeholder as Registry['components.store']['types'],
},
'components.show': {
methods: ["GET","HEAD"],
pattern: '/components/:id',
tokens: [{"old":"/components/:id","type":0,"val":"components","end":""},{"old":"/components/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['components.show']['types'],
},
'components.edit': {
methods: ["GET","HEAD"],
pattern: '/components/:id/edit',
tokens: [{"old":"/components/:id/edit","type":0,"val":"components","end":""},{"old":"/components/:id/edit","type":1,"val":"id","end":""},{"old":"/components/:id/edit","type":0,"val":"edit","end":""}],
types: placeholder as Registry['components.edit']['types'],
},
'components.update': {
methods: ["PUT"],
pattern: '/components/:id',
tokens: [{"old":"/components/:id","type":0,"val":"components","end":""},{"old":"/components/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['components.update']['types'],
},
'components.destroy': {
methods: ["DELETE"],
pattern: '/components/:id',
tokens: [{"old":"/components/:id","type":0,"val":"components","end":""},{"old":"/components/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['components.destroy']['types'],
},
} as const satisfies Record<string, AdonisEndpoint>
export { routes }
export const registry = {
routes,
$tree: {} as ApiDefinition,
}
declare module '@tuyau/core/types' {
export interface UserRegistry {
routes: typeof routes
$tree: ApiDefinition
}
}
+250
View File
@@ -0,0 +1,250 @@
/* eslint-disable prettier/prettier */
/// <reference path="../manifest.d.ts" />
import type { ExtractBody, ExtractErrorResponse, ExtractQuery, ExtractQueryForGet, ExtractResponse } from '@tuyau/core/types'
import type { InferInput, SimpleError } from '@vinejs/vine/types'
export type ParamValue = string | number | bigint | boolean
export interface Registry {
'home': {
methods: ["GET","HEAD"]
pattern: '/'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: unknown
errorResponse: unknown
}
}
'new_account.create': {
methods: ["GET","HEAD"]
pattern: '/auth/signup'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['create']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['create']>>>
}
}
'new_account.store': {
methods: ["POST"]
pattern: '/auth/signup'
types: {
body: ExtractBody<InferInput<(typeof import('#validators/user').signupValidator)>>
paramsTuple: []
params: {}
query: ExtractQuery<InferInput<(typeof import('#validators/user').signupValidator)>>
response: ExtractResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['store']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
}
}
'session.create': {
methods: ["GET","HEAD"]
pattern: '/auth/login'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/session_controller').default['create']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/session_controller').default['create']>>>
}
}
'session.store': {
methods: ["POST"]
pattern: '/auth/login'
types: {
body: ExtractBody<InferInput<(typeof import('#validators/Auth/login').loginValidator)>>
paramsTuple: []
params: {}
query: ExtractQuery<InferInput<(typeof import('#validators/Auth/login').loginValidator)>>
response: ExtractResponse<Awaited<ReturnType<import('#controllers/session_controller').default['store']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/session_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
}
}
'session.destroy': {
methods: ["POST"]
pattern: '/logout'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/session_controller').default['destroy']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/session_controller').default['destroy']>>>
}
}
'computers.index': {
methods: ["GET","HEAD"]
pattern: '/computers'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['index']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['index']>>>
}
}
'computers.create': {
methods: ["GET","HEAD"]
pattern: '/computers/create'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['create']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['create']>>>
}
}
'computers.store': {
methods: ["POST"]
pattern: '/computers'
types: {
body: ExtractBody<InferInput<(typeof import('#validators/Computers/store').storeComputerValidator)>>
paramsTuple: []
params: {}
query: ExtractQuery<InferInput<(typeof import('#validators/Computers/store').storeComputerValidator)>>
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['store']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
}
}
'computers.show': {
methods: ["GET","HEAD"]
pattern: '/computers/:id'
types: {
body: {}
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['show']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['show']>>>
}
}
'computers.edit': {
methods: ["GET","HEAD"]
pattern: '/computers/:id/edit'
types: {
body: {}
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['edit']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['edit']>>>
}
}
'computers.update': {
methods: ["PUT"]
pattern: '/computers/:id'
types: {
body: ExtractBody<InferInput<(typeof import('#validators/Computers/update').updateComputerValidator)>>
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: ExtractQuery<InferInput<(typeof import('#validators/Computers/update').updateComputerValidator)>>
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['update']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['update']>>> | { status: 422; response: { errors: SimpleError[] } }
}
}
'computers.destroy': {
methods: ["DELETE"]
pattern: '/computers/:id'
types: {
body: {}
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['destroy']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['destroy']>>>
}
}
'components.index': {
methods: ["GET","HEAD"]
pattern: '/components'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['index']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['index']>>>
}
}
'components.create': {
methods: ["GET","HEAD"]
pattern: '/components/create'
types: {
body: {}
paramsTuple: []
params: {}
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['create']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['create']>>>
}
}
'components.store': {
methods: ["POST"]
pattern: '/components'
types: {
body: ExtractBody<InferInput<(typeof import('#validators/Components/store').storeComponentValidator)>>
paramsTuple: []
params: {}
query: ExtractQuery<InferInput<(typeof import('#validators/Components/store').storeComponentValidator)>>
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['store']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
}
}
'components.show': {
methods: ["GET","HEAD"]
pattern: '/components/:id'
types: {
body: {}
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['show']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['show']>>>
}
}
'components.edit': {
methods: ["GET","HEAD"]
pattern: '/components/:id/edit'
types: {
body: {}
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['edit']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['edit']>>>
}
}
'components.update': {
methods: ["PUT"]
pattern: '/components/:id'
types: {
body: ExtractBody<InferInput<(typeof import('#validators/Components/update').updateComponentValidator)>>
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: ExtractQuery<InferInput<(typeof import('#validators/Components/update').updateComponentValidator)>>
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['update']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['update']>>> | { status: 422; response: { errors: SimpleError[] } }
}
}
'components.destroy': {
methods: ["DELETE"]
pattern: '/components/:id'
types: {
body: {}
paramsTuple: [ParamValue]
params: { id: ParamValue }
query: {}
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['destroy']>>>
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['destroy']>>>
}
}
}
+33
View File
@@ -0,0 +1,33 @@
/* eslint-disable prettier/prettier */
import type { routes } from './index.ts'
export interface ApiDefinition {
home: typeof routes['home']
newAccount: {
create: typeof routes['new_account.create']
store: typeof routes['new_account.store']
}
session: {
create: typeof routes['session.create']
store: typeof routes['session.store']
destroy: typeof routes['session.destroy']
}
computers: {
index: typeof routes['computers.index']
create: typeof routes['computers.create']
store: typeof routes['computers.store']
show: typeof routes['computers.show']
edit: typeof routes['computers.edit']
update: typeof routes['computers.update']
destroy: typeof routes['computers.destroy']
}
components: {
index: typeof routes['components.index']
create: typeof routes['components.create']
store: typeof routes['components.store']
show: typeof routes['components.show']
edit: typeof routes['components.edit']
update: typeof routes['components.update']
destroy: typeof routes['components.destroy']
}
}
+11
View File
@@ -0,0 +1,11 @@
/**
* This file is automatically generated.
* DO NOT EDIT manually
*/
export const controllers = {
Components: () => import('#controllers/components_controller'),
Computers: () => import('#controllers/computers_controller'),
NewAccount: () => import('#controllers/new_account_controller'),
Session: () => import('#controllers/session_controller'),
}
+6
View File
@@ -0,0 +1,6 @@
/**
* This file is automatically generated.
* DO NOT EDIT manually
*/
export const events = {}
+6
View File
@@ -0,0 +1,6 @@
/**
* This file is automatically generated.
* DO NOT EDIT manually
*/
export const listeners = {}
+41
View File
@@ -0,0 +1,41 @@
import '@adonisjs/inertia/types'
import type { VNodeProps, AllowedComponentProps, ComponentInstance } from 'vue'
type ExtractProps<T> = Omit<
ComponentInstance<T>['$props'],
keyof VNodeProps | keyof AllowedComponentProps
>
declare module '@adonisjs/inertia/types' {
export interface InertiaPages {
'account/signup': ExtractProps<(typeof import('../../inertia/pages/account/signup.vue'))['default']>
'auth/login': ExtractProps<(typeof import('../../inertia/pages/auth/login.vue'))['default']>
'auth/signup': ExtractProps<(typeof import('../../inertia/pages/auth/signup.vue'))['default']>
'components/create': ExtractProps<(typeof import('../../inertia/pages/components/create.vue'))['default']>
'components/edit': ExtractProps<(typeof import('../../inertia/pages/components/edit.vue'))['default']>
'components/index': ExtractProps<(typeof import('../../inertia/pages/components/index.vue'))['default']>
'components/show': ExtractProps<(typeof import('../../inertia/pages/components/show.vue'))['default']>
'computers/create': ExtractProps<(typeof import('../../inertia/pages/computers/create.vue'))['default']>
'computers/edit': ExtractProps<(typeof import('../../inertia/pages/computers/edit.vue'))['default']>
'computers/index': ExtractProps<(typeof import('../../inertia/pages/computers/index.vue'))['default']>
'computers/show': ExtractProps<(typeof import('../../inertia/pages/computers/show.vue'))['default']>
'errors/not_found': ExtractProps<(typeof import('../../inertia/pages/errors/not_found.vue'))['default']>
'errors/server_error': ExtractProps<(typeof import('../../inertia/pages/errors/server_error.vue'))['default']>
'home': ExtractProps<(typeof import('../../inertia/pages/home.vue'))['default']>
'layout/defaultLayout': ExtractProps<(typeof import('../../inertia/pages/layout/defaultLayout.vue'))['default']>
'layout/emptyLayout': ExtractProps<(typeof import('../../inertia/pages/layout/emptyLayout.vue'))['default']>
'layout/header': ExtractProps<(typeof import('../../inertia/pages/layout/header.vue'))['default']>
'layout/sidebar': ExtractProps<(typeof import('../../inertia/pages/layout/sidebar.vue'))['default']>
'widgets/AuthErrorAlert': ExtractProps<(typeof import('../../inertia/pages/widgets/AuthErrorAlert.vue'))['default']>
'widgets/ComponentEditor': ExtractProps<(typeof import('../../inertia/pages/widgets/ComponentEditor.vue'))['default']>
'widgets/ComponentsViewer': ExtractProps<(typeof import('../../inertia/pages/widgets/ComponentsViewer.vue'))['default']>
'widgets/ComputerCard': ExtractProps<(typeof import('../../inertia/pages/widgets/ComputerCard.vue'))['default']>
'widgets/ComputerComponentsTable': ExtractProps<(typeof import('../../inertia/pages/widgets/ComputerComponentsTable.vue'))['default']>
'widgets/ComputersViewer': ExtractProps<(typeof import('../../inertia/pages/widgets/ComputersViewer.vue'))['default']>
'widgets/DeleteConfirmationModal': ExtractProps<(typeof import('../../inertia/pages/widgets/DeleteConfirmationModal.vue'))['default']>
'widgets/SimpleGallery': ExtractProps<(typeof import('../../inertia/pages/widgets/SimpleGallery.vue'))['default']>
'widgets/TableComponent': ExtractProps<(typeof import('../../inertia/pages/widgets/TableComponent.vue'))['default']>
'widgets/ValidationError': ExtractProps<(typeof import('../../inertia/pages/widgets/ValidationError.vue'))['default']>
}
}
+72
View File
@@ -0,0 +1,72 @@
import '@adonisjs/core/types/http'
type ParamValue = string | number | bigint | boolean
export type ScannedRoutes = {
ALL: {
'home': { paramsTuple?: []; params?: {} }
'new_account.create': { paramsTuple?: []; params?: {} }
'new_account.store': { paramsTuple?: []; params?: {} }
'session.create': { paramsTuple?: []; params?: {} }
'session.store': { paramsTuple?: []; params?: {} }
'session.destroy': { paramsTuple?: []; params?: {} }
'computers.index': { paramsTuple?: []; params?: {} }
'computers.create': { paramsTuple?: []; params?: {} }
'computers.store': { paramsTuple?: []; params?: {} }
'computers.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'computers.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'computers.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'computers.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.index': { paramsTuple?: []; params?: {} }
'components.create': { paramsTuple?: []; params?: {} }
'components.store': { paramsTuple?: []; params?: {} }
'components.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
}
GET: {
'home': { paramsTuple?: []; params?: {} }
'new_account.create': { paramsTuple?: []; params?: {} }
'session.create': { paramsTuple?: []; params?: {} }
'computers.index': { paramsTuple?: []; params?: {} }
'computers.create': { paramsTuple?: []; params?: {} }
'computers.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'computers.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.index': { paramsTuple?: []; params?: {} }
'components.create': { paramsTuple?: []; params?: {} }
'components.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
}
HEAD: {
'home': { paramsTuple?: []; params?: {} }
'new_account.create': { paramsTuple?: []; params?: {} }
'session.create': { paramsTuple?: []; params?: {} }
'computers.index': { paramsTuple?: []; params?: {} }
'computers.create': { paramsTuple?: []; params?: {} }
'computers.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'computers.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.index': { paramsTuple?: []; params?: {} }
'components.create': { paramsTuple?: []; params?: {} }
'components.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
}
POST: {
'new_account.store': { paramsTuple?: []; params?: {} }
'session.store': { paramsTuple?: []; params?: {} }
'session.destroy': { paramsTuple?: []; params?: {} }
'computers.store': { paramsTuple?: []; params?: {} }
'components.store': { paramsTuple?: []; params?: {} }
}
PUT: {
'computers.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
}
DELETE: {
'computers.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
'components.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
}
}
declare module '@adonisjs/core/types/http' {
export interface RoutesList extends ScannedRoutes {}
}
+22
View File
@@ -0,0 +1,22 @@
# http://editorconfig.org
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.json]
insert_final_newline = unset
[**.min.js]
indent_style = unset
insert_final_newline = unset
[MakeFile]
indent_style = space
[*.md]
trim_trailing_whitespace = false
+21
View File
@@ -0,0 +1,21 @@
# Node
TZ=UTC
PORT=3333
HOST=localhost
NODE_ENV=development
# App
LOG_LEVEL=info
APP_KEY=hzjnqY1-CfioBl2N-mncw4hty_66rB7V
APP_URL=http://localhost:3333
# Session
SESSION_DRIVER=cookie
# Database
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=admin
DB_PASSWORD=password
DB_DATABASE=pc_builderv2
+43
View File
@@ -0,0 +1,43 @@
# Dependencies and AdonisJS build
node_modules
build
tmp/*
!tmp/.gitkeep
dist
.output
# Secrets
.env
.env.local
.env.production.local
.env.development.local
.env.test
# Frontend assets compiled code
public/assets
# Build tools specific
npm-debug.log
yarn-error.log
pnpm-debug.log
# Test coverage
coverage
# Editors specific
.fleet
.idea
.vscode
*.swp
*.swo
# Platform specific
.DS_Store
Thumbs.db
# IDE
*.sublime-project
*.sublime-workspace
# OS
.env.*.local
+3
View File
@@ -0,0 +1,3 @@
.adonisjs
node_modules
build
+156
View File
@@ -0,0 +1,156 @@
# ✅ Checklist de Migration - Pages Inertia
## 📦 Fichiers Migrés
### Pages d'Authentification
- [x] `pages/auth/login.vue` - Page de connexion
- [x] `pages/auth/signup.vue` - Page d'inscription
- [x] `pages/account/signup.vue` - Création de compte
### Pages de Gestion des Composants
- [x] `pages/components/index.vue` - Liste
- [x] `pages/components/create.vue` - Création
- [x] `pages/components/edit.vue` - Édition
- [x] `pages/components/show.vue` - Détails
### Pages de Gestion des Ordinateurs
- [x] `pages/computers/index.vue` - Liste
- [x] `pages/computers/create.vue` - Création
- [x] `pages/computers/edit.vue` - Édition
- [x] `pages/computers/show.vue` - Détails
### Pages d'Erreur
- [x] `pages/errors/not_found.vue` - 404
- [x] `pages/errors/server_error.vue` - 500
### Layouts
- [x] `pages/layout/defaultLayout.vue` - Layout principal
- [x] `pages/layout/emptyLayout.vue` - Layout vide
- [x] `pages/layout/sidebar.vue` - Navigation
- [x] `pages/layout/header.vue` - En-tête
### Composants Réutilisables
- [x] `pages/widgets/AuthErrorAlert.vue`
- [x] `pages/widgets/ComponentEditor.vue`
- [x] `pages/widgets/ComponentsViewer.vue`
- [x] `pages/widgets/ComputerCard.vue`
- [x] `pages/widgets/ComputerComponentsTable.vue`
- [x] `pages/widgets/ComputersViewer.vue`
- [x] `pages/widgets/DeleteConfirmationModal.vue`
- [x] `pages/widgets/SimpleGallery.vue`
- [x] `pages/widgets/TableComponent.vue`
- [x] `pages/widgets/ValidationError.vue`
### Assets & Resources
- [x] `assets/icons/` - 18 fichiers SVG
- [x] `assets/images/` - Placeholders
- [x] `composables/isAdminMode.ts` - Gestion admin
- [x] `composables/useSidebar.ts` - Gestion sidebar
- [x] `directives/v_validation_error.ts` - Validation
- [x] `directives/v-delete-confirm.ts` - Confirmation
- [x] `directives/v-price.ts` - Formatage prix
- [x] `pages/types/UITypes.ts` - Types TypeScript
- [x] `app.ts` - Configuration Inertia (mise à jour)
## 📋 Étapes de Validation
### 1. Vérification des Imports
- [ ] Vérifier que tous les chemins d'import utilisent l'alias `~/`
- [ ] Vérifier que les imports de composants existent
- [ ] Vérifier que les imports d'icônes fonctionnent
### 2. Configuration du Routage
- [ ] Vérifier que les routes AdonisJS retournent les bonnes pages Inertia
- [ ] Tester la navigation entre les pages
- [ ] Vérifier les redirections de layout (auth vs. default)
### 3. Styles et CSS
- [ ] Vérifier que Tailwind CSS est chargé
- [ ] Tester le design responsive
- [ ] Vérifier l'apparence du sidebار et de l'en-tête
### 4. Composants & Directives
- [ ] Vérifier que VueDatePicker fonctionne
- [ ] Tester la directive v-validation-error
- [ ] Tester la directive v-price
- [ ] Tester la directive v-delete-confirm
- [ ] Vérifier les composants Carousel
### 5. Fonctionnalités
- [ ] Tester le toggle admin/classic mode
- [ ] Tester la barre latérale responsive
- [ ] Vérifier l'affichage du profil utilisateur
- [ ] Tester la déconnexion
### 6. Pages Critiques
- [ ] Page de connexion - formulaire et validation
- [ ] Page de création de composant - formulaire complet
- [ ] Page de liste des ordinateurs - grille responsive
- [ ] Page de détails - affichage corrects des données
- [ ] Pages d'erreur - design cohérent
## 🔧 Configuration Requise
### Dependencies Vérifiées
```json
{
"@adonisjs/inertia": "^1.0",
"@inertiajs/vue3": "^1.0",
"@adonisjs/core": "^6.0",
"vue": "^3.0",
"tailwindcss": "^3.0",
"@vuepic/vue-datepicker": "latest",
"vue3-carousel": "latest",
"vue-sonner": "latest"
}
```
## 🚨 Points d'Attention
1. **Base Données**: Assurez-vous que les modèles AdonisJS correspondent aux types TypeScript
2. **Authentification**: Vérifier que les guards et middlewares d'auth sont correctement configurés
3. **CSRF**: Vérifier que les tokens CSRF sont transmis correctement
4. **Permissions**: Vérifier que le mode admin accès les bonnes données
5. **Fichiers**: Adapter les chemins de fichiers uploadés si nécessaire
## 📝 Notes de Développement
### Modèles AdonisJS (À adapter)
Les pages supposent les modèles suivants dans `app/models/`:
- `Component` - Modèle de composant
- `Computer` - Modèle d'ordinateur
- `ComponentType` - Type de composant
- `ComputerState` - État d'ordinateur
- `User` - Utilisateur authentifié
### Types TypeScript
Les types sont définis dans `inertia/pages/types/UITypes.ts` - adapter selon vos modèles réels
### Chemins d'Import
L'alias `~/` est configuré pour pointer vers `inertia/`:
- `~/pages/` → `inertia/pages/`
- `~/composables/` → `inertia/composables/`
- `~/directives/` → `inertia/directives/`
- `~/assets/` → `inertia/assets/`
## 🎯 Résumé de la Migration
✅ **Tous les fichiers Inertia ont été migrés de pc-builder vers pc-builderV2**
### Fichiers Créés: 45+
- 11 Pages Inertia
- 4 Layouts
- 10 Composants widgets
- 18 Icônes SVG
- 2 Composables
- 3 Directives
- 1 Fichier de types
### Fichiers Modifiés: 1
- `inertia/app.ts` - Configuration complète pour AdonisJS V7
---
**Date:** Juin 2026
**Status:** ✅ Terminé
**Prochaine Étape:** Adapter les controllers et routes AdonisJS
+218
View File
@@ -0,0 +1,218 @@
# 🎉 Migration Complète - Pages Inertia PC Builder → PC Builder V2
## 📊 Statistiques
- **Fichiers Migrés:** 45+
- **Pages Inertia:** 15
- **Composants Widget:** 10
- **Layouts:** 4
- **Composables:** 2
- **Directives:** 3
- **Icônes SVG:** 18
- **Fichiers Assets:** 2 (images)
- **Fichiers de Configuration:** 1 (`app.ts`)
## ✅ Résultats
### Pages Inertia Créées (15)
```
✅ inertia/pages/auth/login.vue
✅ inertia/pages/auth/signup.vue
✅ inertia/pages/account/signup.vue
✅ inertia/pages/components/index.vue
✅ inertia/pages/components/create.vue
✅ inertia/pages/components/edit.vue
✅ inertia/pages/components/show.vue
✅ inertia/pages/computers/index.vue
✅ inertia/pages/computers/create.vue
✅ inertia/pages/computers/edit.vue
✅ inertia/pages/computers/show.vue
✅ inertia/pages/errors/not_found.vue (mise à jour)
✅ inertia/pages/errors/server_error.vue (mise à jour)
✅ inertia/pages/layout/defaultLayout.vue
✅ inertia/pages/layout/emptyLayout.vue
```
### Layouts & Navigation (4)
```
✅ inertia/pages/layout/defaultLayout.vue
✅ inertia/pages/layout/emptyLayout.vue
✅ inertia/pages/layout/sidebar.vue
✅ inertia/pages/layout/header.vue
```
### Composants Réutilisables (10)
```
✅ inertia/pages/widgets/AuthErrorAlert.vue
✅ inertia/pages/widgets/ComponentEditor.vue
✅ inertia/pages/widgets/ComponentsViewer.vue
✅ inertia/pages/widgets/ComputerCard.vue
✅ inertia/pages/widgets/ComputerComponentsTable.vue
✅ inertia/pages/widgets/ComputersViewer.vue
✅ inertia/pages/widgets/DeleteConfirmationModal.vue
✅ inertia/pages/widgets/SimpleGallery.vue
✅ inertia/pages/widgets/TableComponent.vue
✅ inertia/pages/widgets/ValidationError.vue
```
### Composables (2)
```
✅ inertia/composables/isAdminMode.ts
✅ inertia/composables/useSidebar.ts
```
### Directives Personnalisées (3)
```
✅ inertia/directives/v_validation_error.ts
✅ inertia/directives/v-delete-confirm.ts
✅ inertia/directives/v-price.ts
```
### Assets Copiés
```
✅ inertia/assets/icons/ (18 fichiers SVG)
✅ inertia/assets/images/ (2 fichiers)
✅ inertia/pages/types/UITypes.ts (types TypeScript)
```
### Configuration Mise à Jour
```
✅ inertia/app.ts (configuration complète pour AdonisJS V7)
```
## 🎯 Fonctionnalités Incluées
### Layout Dynamique
- ✅ DefaultLayout pour les pages authentifiées
- ✅ EmptyLayout pour pages d'authentification
- ✅ Sélection automatique basée sur la route
### Composants Globaux
- ✅ VueDatePicker pour sélection de dates
- ✅ Carousel/Slide pour galeries
- ✅ Directives d'erreur de validation
- ✅ Directive de confirmation avant suppression
- ✅ Directive de formatage des prix
### Mode Admin
- ✅ Toggle Admin/Classic mode
- ✅ Affichage conditionnel des données sensibles
- ✅ Persistance du mode via composable
### Navigation Responsive
- ✅ Sidebar pliable sur mobile
- ✅ Menu hamburger
- ✅ Menu déroulant profil utilisateur
## 🔄 Conversion AdonisJS V6 → V7
### Changements Appliqués
1. **Directives**: Import avec `// @ts-ignore` pour compatibilité
2. **Composables**: Exportation simplifiée avec ref()
3. **Types**: Utilisation de types génériques pour Page Props
4. **Imports**: Chemins relatifs remplacés par alias `~/`
### Améliorations V7
- ✅ Support natif de Tailwind CSS
- ✅ Routing simplifié avec middleware
- ✅ Meilleur support TypeScript
- ✅ Configuration Vite optimisée
## 📦 Dépendances Requises
Vérifiez que votre `package.json` inclut:
```json
{
"@adonisjs/inertia": "^1.0",
"@inertiajs/vue3": "^1.0",
"@vuepic/vue-datepicker": "latest",
"vue3-carousel": "latest",
"vue-sonner": "latest",
"tailwindcss": "^3.0"
}
```
## 🚀 Prochaines Étapes
### 1. Valider la Structure (✓ Fait)
- [x] Pages créées
- [x] Composants copiés
- [x] Assets migrés
- [x] Configuration mise à jour
### 2. Adapter les Controllers AdonisJS
- [ ] Créer/adapter les controllers pour chaque page
- [ ] Implémenter les routes correspondantes
- [ ] Adapter les retours Inertia avec les bonnes données
### 3. Tester les Fonctionnalités
- [ ] Tester la navigation
- [ ] Vérifier les formulaires
- [ ] Tester les directives
- [ ] Valider le design responsive
### 4. Affiner les Imports
- [ ] Vérifier tous les chemins d'import
- [ ] Adapter les types de modèles si nécessaire
- [ ] Résoudre les imports circulaires si présents
## 📝 Documentation Générée
- `MIGRATION_PAGES_SUMMARY.md` - Résumé détaillé de la migration
- `MIGRATION_CHECKLIST.md` - Checklist de validation
- `MIGRATION_COMPLETE.md` - Ce fichier
## 🎓 Guide Rapide
### Créer une Nouvelle Page
```vue
<!-- inertia/pages/example.vue -->
<script setup lang="ts">
import { Link } from '@inertiajs/vue3'
defineProps<{ data: any[] }>()
</script>
<template>
<div class="container">
<!-- Votre contenu -->
</div>
</template>
```
### Ajouter une Directive Personnalisée
```vue
<input
v-validation-error="getErrorMessage('email')"
type="email"
placeholder="Email"
/>
```
### Utiliser un Composable
```typescript
import { useSidebar } from '~/composables/useSidebar'
const { isOpen } = useSidebar()
```
## ⚠️ Points Critiques
1. **Base de Données**: Mettre à jour les schémas si différents
2. **Authentification**: Configurer les guards correctement
3. **CSRF**: Inclure les tokens dans les formulaires
4. **Uploads**: Adapter les chemins de fichiers
5. **Permissions**: Vérifier l'accès aux données sensibles
## 🎉 Status: COMPLET
✅ Migration des pages Inertia de pc-builder → pc-builderV2 **TERMINÉE**
La structure Inertia est maintenant prête pour l'intégration avec les controllers et routes AdonisJS V7.
---
**Date de Migration:** Juin 2026
**Version Source:** pc-builder (AdonisJS V6)
**Version Cible:** pc-builderV2 (AdonisJS V7)
**Statut:** ✅ Complet
+164
View File
@@ -0,0 +1,164 @@
# Migration des Pages Inertia - PC Builder V2
## 📋 Résumé de la Migration
Toutes les pages Inertia du projet **pc-builder** ont été migrées vers **pc-builderV2** avec AdonisJS V7.
## ✅ Pages Migrées
### Pages d'Authentification (auth/)
- ✅ `auth/login.vue` - Page de connexion
- ✅ `auth/signup.vue` - Page d'inscription
- ✅ `account/signup.vue` - Page de création de compte (redondant)
### Pages de Composants (components/)
- ✅ `components/index.vue` - Liste des composants
- ✅ `components/create.vue` - Création d'un composant
- ✅ `components/edit.vue` - Édition d'un composant
- ✅ `components/show.vue` - Détails d'un composant
### Pages d'Ordinateurs (computers/)
- ✅ `computers/index.vue` - Liste des ordinateurs
- ✅ `computers/create.vue` - Création d'un ordinateur
- ✅ `computers/edit.vue` - Édition d'un ordinateur
- ✅ `computers/show.vue` - Détails d'un ordinateur
### Pages d'Erreur (errors/)
- ✅ `errors/not_found.vue` - Page 404 (mise à jour avec style)
- ✅ `errors/server_error.vue` - Page 500 (mise à jour avec style)
### Layouts (pages/layout/)
- ✅ `layout/defaultLayout.vue` - Layout principal avec sidebar et header
- ✅ `layout/emptyLayout.vue` - Layout vide pour auth
- ✅ `layout/sidebar.vue` - Barre latérale de navigation
- ✅ `layout/header.vue` - En-tête avec profil utilisateur
### Composants Réutilisables (pages/widgets/)
- ✅ `AuthErrorAlert.vue` - Alerte d'erreur d'authentification
- ✅ `ComponentEditor.vue` - Éditeur de composants
- ✅ `ComponentsViewer.vue` - Visionneuse de composants
- ✅ `ComputerCard.vue` - Carte d'ordinateur
- ✅ `ComputerComponentsTable.vue` - Table de composants d'ordinateur
- ✅ `ComputersViewer.vue` - Visionneuse d'ordinateurs
- ✅ `DeleteConfirmationModal.vue` - Modal de confirmation de suppression
- ✅ `SimpleGallery.vue` - Galerie simple
- ✅ `TableComponent.vue` - Composant de table
- ✅ `ValidationError.vue` - Afficheur d'erreurs de validation
## 🎯 Ressources Copiées
### Assets (inertia/assets/)
- ✅ **Icons/** - 18 fichiers SVG d'icônes
- case.svg, cooler.svg, cpu.svg, cross-icon.svg, default-icon.svg
- fan.svg, graphic-card.svg, hard-drive.svg, memory.svg, motherboard.svg
- mvne.svg, power-supply.svg, site-icon-with-title.svg, site-icon.svg
- trash-icon.svg, user-profile-icon.svg, wifi-card.svg, index.ts
- ✅ **Images/** - Images utilitaires
- no-Image-placeholder.svg, index.ts
### Composables (inertia/composables/)
- ✅ `isAdminMode.ts` - Gestion du mode admin
- ✅ `useSidebar.ts` - Gestion de la sidebar
### Directives (inertia/directives/)
- ✅ `v_validation_error.ts` - Directive pour afficher les erreurs de validation
- ✅ `v-delete-confirm.ts` - Directive pour confirmation avant suppression
- ✅ `v-price.ts` - Directive pour formatage des prix
### Types (inertia/pages/types/)
- ✅ `UITypes.ts` - Types TypeScript pour l'interface utilisateur
## 🔧 Modifications AdonisJS V7
### app.ts - Mise à jour
Le fichier `inertia/app.ts` a été mis à jour pour :
1. Inclure les imports de directives
2. Ajouter les composants globaux (VueDatePicker, Carousel, Slide)
3. Implémenter la logique de sélection de layout dynamique
4. Enregistrer les directives personnalisées
### Structure de répertoires
```
inertia/
├── app.ts (mis à jour)
├── client.ts
├── ssr.ts
├── assets/
│ ├── icons/
│ └── images/
├── composables/
│ ├── isAdminMode.ts
│ └── useSidebar.ts
├── directives/
│ ├── v_validation_error.ts
│ ├── v-delete-confirm.ts
│ └── v-price.ts
├── pages/
│ ├── auth/
│ │ ├── login.vue
│ │ └── signup.vue
│ ├── account/
│ │ └── signup.vue
│ ├── components/
│ │ ├── index.vue
│ │ ├── create.vue
│ │ ├── edit.vue
│ │ └── show.vue
│ ├── computers/
│ │ ├── index.vue
│ │ ├── create.vue
│ │ ├── edit.vue
│ │ └── show.vue
│ ├── errors/
│ │ ├── not_found.vue
│ │ └── server_error.vue
│ ├── layout/
│ │ ├── defaultLayout.vue
│ │ ├── emptyLayout.vue
│ │ ├── sidebar.vue
│ │ └── header.vue
│ ├── types/
│ │ └── UITypes.ts
│ └── widgets/
│ ├── AuthErrorAlert.vue
│ ├── ComponentEditor.vue
│ ├── ComponentsViewer.vue
│ ├── ComputerCard.vue
│ ├── ComputerComponentsTable.vue
│ ├── ComputersViewer.vue
│ ├── DeleteConfirmationModal.vue
│ ├── SimpleGallery.vue
│ ├── TableComponent.vue
│ └── ValidationError.vue
└── css/
└── app.css (existant)
```
## 🎨 Améliorations Apportées
1. **Pages d'erreur** - Mise à jour avec design cohérent et boutons de navigation
2. **Layout dynamique** - Sélection automatique du layout en fonction de la route
3. **Admin mode toggle** - Basculer entre mode admin et mode classique
4. **Intégration complète** - Toutes les directives et composants sont disponibles
## 📝 Notes Importantes
- Les chemins des imports utilisent les alias Vite (~/) configurés dans `tsconfig.inertia.json`
- Les composants et directives sont enregistrés globalement dans `app.ts`
- La structure de layout suit le pattern de pc-builder avec DefaultLayout et EmptyLayout
- Les widgets réutilisables sont dans `pages/widgets/` pour maintenir la compatibilité
## 🚀 Prochaines Étapes
1. Vérifier que tous les imports sont corrects dans les controllers AdonisJS
2. Adapter les types de modèles si nécessaire
3. Tester la navigation et les layouts
4. Vérifier les directives v-validation-error, v-price, v-delete-confirm
5. Adapter les appels API selon la structure V7
---
**Date de migration:** Juin 2026
**Source:** pc-builder
**Destination:** pc-builderV2 (AdonisJS V7)
+27
View File
@@ -0,0 +1,27 @@
/*
|--------------------------------------------------------------------------
| JavaScript entrypoint for running ace commands
|--------------------------------------------------------------------------
|
| DO NOT MODIFY THIS FILE AS IT WILL BE OVERRIDDEN DURING THE BUILD
| PROCESS.
|
| See docs.adonisjs.com/guides/typescript-build-process#creating-production-build
|
| Since, we cannot run TypeScript source code using "node" binary, we need
| a JavaScript entrypoint to run ace commands.
|
| This file registers the "ts-node/esm" hook with the Node.js module system
| and then imports the "bin/console.ts" file.
|
*/
/**
* Register hook to process TypeScript files using @poppinss/ts-exec
*/
import '@poppinss/ts-exec'
/**
* Import ace console entrypoint
*/
await import('./bin/console.js')
+138
View File
@@ -0,0 +1,138 @@
import { indexPages } from '@adonisjs/inertia'
import { indexEntities } from '@adonisjs/core'
import { defineConfig } from '@adonisjs/core/app'
import { generateRegistry } from '@tuyau/core/hooks'
export default defineConfig({
/*
|--------------------------------------------------------------------------
| Experimental flags
|--------------------------------------------------------------------------
|
| The following features will be enabled by default in the next major release
| of AdonisJS. You can opt into them today to avoid any breaking changes
| during upgrade.
|
*/
experimental: {},
/*
|--------------------------------------------------------------------------
| Commands
|--------------------------------------------------------------------------
|
| List of ace commands to register from packages. The application commands
| will be scanned automatically from the "./commands" directory.
|
*/
commands: [
() => import('@adonisjs/core/commands'),
() => import('@adonisjs/lucid/commands'),
() => import('@adonisjs/session/commands'),
() => import('@adonisjs/inertia/commands'),
],
/*
|--------------------------------------------------------------------------
| Service providers
|--------------------------------------------------------------------------
|
| List of service providers to import and register when booting the
| application
|
*/
providers: [
() => import('@adonisjs/core/providers/app_provider'),
() => import('@adonisjs/core/providers/hash_provider'),
{
file: () => import('@adonisjs/core/providers/repl_provider'),
environment: ['repl', 'test'],
},
() => import('@adonisjs/core/providers/vinejs_provider'),
() => import('@adonisjs/core/providers/edge_provider'),
() => import('@adonisjs/session/session_provider'),
() => import('@adonisjs/vite/vite_provider'),
() => import('@adonisjs/shield/shield_provider'),
() => import('@adonisjs/static/static_provider'),
() => import('@adonisjs/lucid/database_provider'),
() => import('@adonisjs/cors/cors_provider'),
() => import('@adonisjs/inertia/inertia_provider'),
() => import('@adonisjs/auth/auth_provider'),
() => import('#providers/api_provider'),
],
/*
|--------------------------------------------------------------------------
| Preloads
|--------------------------------------------------------------------------
|
| List of modules to import before starting the application.
|
*/
preloads: [
() => import('#start/routes'),
() => import('#start/kernel'),
() => import('#start/validator'),
],
/*
|--------------------------------------------------------------------------
| Tests
|--------------------------------------------------------------------------
|
| List of test suites to organize tests by their type. Feel free to remove
| and add additional suites.
|
*/
tests: {
suites: [
{
files: ['tests/unit/**/*.spec.{ts,js}'],
name: 'unit',
timeout: 2000,
},
{
files: ['tests/functional/**/*.spec.{ts,js}'],
name: 'functional',
timeout: 30000,
},
{
files: ['tests/browser/**/*.spec.{ts,js}'],
name: 'browser',
timeout: 300000,
},
],
forceExit: false,
},
/*
|--------------------------------------------------------------------------
| Metafiles
|--------------------------------------------------------------------------
|
| A collection of files you want to copy to the build folder when creating
| the production build.
|
*/
metaFiles: [
{
pattern: 'resources/views/**/*.edge',
reloadServer: false,
},
{
pattern: 'public/**',
reloadServer: false,
},
],
hooks: {
init: [
indexEntities({
transformers: { enabled: true, withSharedProps: true },
}),
indexPages({ framework: 'vue3' }),
generateRegistry(),
],
buildStarting: [() => import('@adonisjs/vite/build_hook')],
},
})
+77
View File
@@ -0,0 +1,77 @@
import type { HttpContext } from '@adonisjs/core/http'
import { storeComponentValidator } from '#validators/Components/store'
import { updateComponentValidator } from '#validators/Components/update'
import Component from '#models/component'
import ComponentType from '#models/component_type'
export default class ComponentsController {
async index({ inertia, auth }: HttpContext) {
const user = await auth.authenticate()
const components = await Component.query()
.preload('type')
.where('userId', user.id)
return inertia.render('components/index', { components })
}
async create({ inertia }: HttpContext) {
const types = await ComponentType.all()
return inertia.render('components/create', { types })
}
async store({ request, response, auth }: HttpContext) {
const data = request.all()
const user = await auth.authenticate()
const { quantity, ...componentData } = await storeComponentValidator.validate(data)
await ComponentType.findOrFail(componentData.typeId)
for (let i = 0; i < quantity; i++) {
await Component.create({
...componentData,
userId: user.id,
})
}
response.redirect('/components')
}
async show({ params, auth, inertia }: HttpContext) {
const user = await auth.authenticate()
const componentId = params.id
const component = await Component.query()
.preload('type')
.where('userId', user.id)
.andWhere('id', componentId)
.firstOrFail()
return inertia.render('components/show', { component })
}
async edit({ params, auth, inertia }: HttpContext) {
const user = await auth.authenticate()
const types = await ComponentType.all()
const componentId = params.id
const component = await Component.query()
.preload('type')
.where('userId', user.id)
.andWhere('id', componentId)
.firstOrFail()
return inertia.render('components/edit', { component, types })
}
async update({ params, auth, request, response }: HttpContext) {
const data = request.all()
const componentData = await updateComponentValidator.validate(data)
const user = await auth.authenticate()
const component = await Component.query()
.where('userId', user.id)
.andWhere('id', params.id)
.firstOrFail()
component.merge(componentData)
await component.save()
return response.redirect('/components')
}
async destroy({ params, response }: HttpContext) {
const componentId = params.id
const component = await Component.findOrFail(componentId)
await component.delete()
return response.redirect('/components')
}
}
+111
View File
@@ -0,0 +1,111 @@
import type { HttpContext } from '@adonisjs/core/http'
import Computer from '#models/computer'
import ComputerState from '#models/computer_state'
import Component from '#models/component'
import { storeComputerValidator } from '#validators/Computers/store'
import { handleComponents } from '#services/component_service'
import { handlePictures } from '#services/picture_service'
import type { Image } from '#types/UItypes'
import { updateComputerValidator } from '#validators/Computers/update'
export default class ComputersController {
async index({ auth, inertia }: HttpContext) {
const user = await auth.authenticate()
const computers = await Computer.query()
.where('user_id', user.id)
.preload('state')
.preload('components')
.preload('pictures', (picturesQuery) => {
picturesQuery.where('order', 1)
})
return inertia.render('computers/index', { computers })
}
async create({ auth, inertia }: HttpContext) {
const user = await auth.authenticate()
const states = await ComputerState.all()
const components = await Component.query()
.where('userId', user.id)
.whereNull('computerId')
.preload('type')
return inertia.render('computers/create', { components, states })
}
async store({ auth, request, response }: HttpContext) {
const data = request.all()
const user = await auth.authenticate()
const { pictures, componentsId, ...computerData } = await storeComputerValidator.validate(data)
await ComputerState.findOrFail(computerData.stateId)
const computer = await Computer.create({
...computerData,
userId: user.id,
})
await handleComponents(componentsId as number[], computer)
await handlePictures(pictures as Image[], request, computer)
return response.redirect('computers/')
}
async show({ auth, inertia, params }: HttpContext) {
const user = await auth.authenticate()
const computerId = params.id
const computer = await Computer.query()
.preload('state')
.preload('components', (componentsQuery) => {
componentsQuery.preload('type')
})
.preload('pictures', (picturesQuery) => {
picturesQuery.orderBy('order')
})
.where('user_id', user.id)
.andWhere('id', computerId)
.firstOrFail()
return inertia.render('computers/show', { computer })
}
async edit({ params, inertia, auth }: HttpContext) {
const user = await auth.authenticate()
const states = await ComputerState.all()
const computerId = params.id
const computer = await Computer.query()
.preload('state')
.preload('components', (componentsQuery) => {
componentsQuery.preload('type')
})
.preload('pictures')
.where('user_id', user.id)
.andWhere('id', computerId)
.firstOrFail()
const availableComponents = await Component.query()
.preload('type')
.where('user_id', user.id)
.whereNull('computer_id')
.whereNotIn(
'id',
computer.components.map((c) => c.id)
)
return inertia.render('computers/edit', { computer, availableComponents, states })
}
async update({ params, request, response }: HttpContext) {
const computerId = params.id
const { pictures, componentsId, ...computerData } = await updateComputerValidator.validate(
request.all()
)
const computer = await Computer.findOrFail(computerId)
computer.merge(computerData)
await computer.save()
await handleComponents(componentsId as number[], computer)
await handlePictures(pictures as Image[], request, computer)
return response.redirect(`${computer.id}`)
}
async destroy({ params, response }: HttpContext) {
const computerId = params.id
const computer = await Computer.findOrFail(computerId)
await computer.delete()
return response.redirect('/computers')
}
}
+17
View File
@@ -0,0 +1,17 @@
import User from '#models/user'
import { signupValidator } from '#validators/user'
import type { HttpContext } from '@adonisjs/core/http'
export default class NewAccountController {
async create({ inertia }: HttpContext) {
return inertia.render('auth/signup', {})
}
async store({ request, response, auth }: HttpContext) {
const payload = await request.validateUsing(signupValidator)
const user = await User.create({ ...payload })
await auth.use('web').login(user)
response.redirect().toRoute('home')
}
}
+21
View File
@@ -0,0 +1,21 @@
import type { HttpContext } from '@adonisjs/core/http'
import { loginValidator } from '#validators/Auth/login'
import User from '#models/user'
export default class SessionController {
async create({ inertia }: HttpContext) {
return inertia.render('auth/login', {})
}
async store({ request, auth, response }: HttpContext) {
const payload = await request.validateUsing(loginValidator)
const user = await User.verifyCredentials(payload.email, payload.password)
await auth.use('web').login(user)
response.redirect('/computers')
}
async destroy({ auth, response }: HttpContext) {
await auth.use('web').logout()
response.redirect('/auth/login')
}
}
+45
View File
@@ -0,0 +1,45 @@
import app from '@adonisjs/core/services/app'
import { type HttpContext, ExceptionHandler } from '@adonisjs/core/http'
import type { StatusPageRange, StatusPageRenderer } from '@adonisjs/core/types/http'
export default class HttpExceptionHandler extends ExceptionHandler {
/**
* In debug mode, the exception handler will display verbose errors
* with pretty printed stack traces.
*/
protected debug = !app.inProduction
/**
* Status pages are used to display a custom HTML pages for certain error
* codes. You might want to enable them in production only, but feel
* free to enable them in development as well.
*/
protected renderStatusPages = app.inProduction
/**
* Status pages is a collection of error code range and a callback
* to return the HTML contents to send as a response.
*/
protected statusPages: Record<StatusPageRange, StatusPageRenderer> = {
'404': (_, { inertia }) => inertia.render('errors/not_found', {}),
'500..599': (_, { inertia }) => inertia.render('errors/server_error', {}),
}
/**
* The method is used for handling errors and returning
* response to the client
*/
async handle(error: unknown, ctx: HttpContext) {
return super.handle(error, ctx)
}
/**
* The method is used to report error to the logging service or
* the a third party error monitoring service.
*
* @note You should not attempt to send a response from this method.
*/
async report(error: unknown, ctx: HttpContext) {
return super.report(error, ctx)
}
}
+16
View File
@@ -0,0 +1,16 @@
import type { HttpContext } from '@adonisjs/core/http'
import type { NextFn } from '@adonisjs/core/types/http'
import type { Authenticators } from '@adonisjs/auth/types'
export default class AuthMiddleware {
redirectTo = '/auth/login'
async handle(
ctx: HttpContext,
next: NextFn,
options: { guards?: (keyof Authenticators)[] } = {}
) {
await ctx.auth.authenticateUsing(options.guards, { loginRoute: this.redirectTo })
return next()
}
}
@@ -0,0 +1,19 @@
import { Logger } from '@adonisjs/core/logger'
import { HttpContext } from '@adonisjs/core/http'
import { type NextFn } from '@adonisjs/core/types/http'
/**
* The container bindings middleware binds classes to their request
* specific value using the container resolver.
*
* - We bind "HttpContext" class to the "ctx" object
* - And bind "Logger" class to the "ctx.logger" object
*/
export default class ContainerBindingsMiddleware {
handle(ctx: HttpContext, next: NextFn) {
ctx.containerResolver.bindValue(HttpContext, ctx)
ctx.containerResolver.bindValue(Logger, ctx.logger)
return next()
}
}
+32
View File
@@ -0,0 +1,32 @@
import type { HttpContext } from '@adonisjs/core/http'
import type { NextFn } from '@adonisjs/core/types/http'
import type { Authenticators } from '@adonisjs/auth/types'
/**
* Guest middleware is used to deny access to routes that should
* be accessed by unauthenticated users.
*
* For example, the login page should not be accessible if the user
* is already logged-in
*/
export default class GuestMiddleware {
/**
* The URL to redirect to when user is logged-in
*/
redirectTo = '/computers'
async handle(
ctx: HttpContext,
next: NextFn,
options: { guards?: (keyof Authenticators)[] } = {}
) {
for (let guard of options.guards || [ctx.auth.defaultGuard]) {
if (await ctx.auth.use(guard).check()) {
ctx.session.reflash()
return ctx.response.redirect(this.redirectTo, true)
}
}
return next()
}
}
+51
View File
@@ -0,0 +1,51 @@
import type { HttpContext } from '@adonisjs/core/http'
import type { NextFn } from '@adonisjs/core/types/http'
import UserTransformer from '#transformers/user_transformer'
import BaseInertiaMiddleware from '@adonisjs/inertia/inertia_middleware'
export default class InertiaMiddleware extends BaseInertiaMiddleware {
share(ctx: HttpContext) {
/**
* The share method is called everytime an Inertia page is rendered. In
* certain cases, a page may get rendered before the session middleware
* or the auth middleware are executed. For example: During a 404 request.
*
* In that case, we must always assume that HttpContext is not fully hydrated
* with all the properties
*/
const { session, auth } = ctx as Partial<HttpContext>
/**
* Fetching the first error from the flash messages
*/
const error = session?.flashMessages.get('error') as string
const success = session?.flashMessages.get('success') as string
/**
* Data shared with all Inertia pages. Make sure you are using
* transformers for rich data-types like Models.
*/
return {
errors: ctx.inertia.always(this.getValidationErrors(ctx)),
flash: ctx.inertia.always({
error,
success,
}),
user: ctx.inertia.always(auth?.user ? UserTransformer.transform(auth.user) : undefined),
}
}
async handle(ctx: HttpContext, next: NextFn) {
await this.init(ctx)
const output = await next()
this.dispose(ctx)
return output
}
}
declare module '@adonisjs/inertia/types' {
type MiddlewareSharedProps = InferSharedProps<InertiaMiddleware>
export interface SharedProps extends MiddlewareSharedProps {}
}
+16
View File
@@ -0,0 +1,16 @@
import type { HttpContext } from '@adonisjs/core/http'
import type { NextFn } from '@adonisjs/core/types/http'
/**
* Silent auth middleware can be used as a global middleware to silent check
* if the user is logged-in or not.
*
* The request continues as usual, even when the user is not logged-in.
*/
export default class SilentAuthMiddleware {
async handle(ctx: HttpContext, next: NextFn) {
await ctx.auth.check()
return next()
}
}
+38
View File
@@ -0,0 +1,38 @@
import { DateTime } from 'luxon'
import { BaseModel, belongsTo, column } from '@adonisjs/lucid/orm'
import ComponentType from '#models/component_type'
import type { BelongsTo } from '@adonisjs/lucid/types/relations'
export default class Component extends BaseModel {
@column({ isPrimary: true })
declare id: number
@column()
declare name: string
@column()
declare price: number
@column({ serializeAs: null })
declare typeId: number
@belongsTo(() => ComponentType, {
foreignKey: 'typeId',
})
declare type: BelongsTo<typeof ComponentType>
@column()
declare computerId: number | null
@column({ serializeAs: null })
declare userId: number
@column.date()
declare purchaseDate: DateTime
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
}
+12
View File
@@ -0,0 +1,12 @@
import { BaseModel, column } from '@adonisjs/lucid/orm'
export default class ComponentType extends BaseModel {
@column({ isPrimary: true })
declare id: number
@column()
declare name: string
@column()
declare unique: boolean
}
+60
View File
@@ -0,0 +1,60 @@
import { DateTime } from 'luxon'
import { BaseModel, belongsTo, column, computed, hasMany } from '@adonisjs/lucid/orm'
import type { BelongsTo, HasMany } from '@adonisjs/lucid/types/relations'
import ComputerState from '#models/computer_state'
import ComputerPicture from '#models/computer_picture'
import Component from '#models/component'
export default class Computer extends BaseModel {
@column({ isPrimary: true })
declare id: number
@column()
declare title: string
@column()
declare sellPrice: number
@column()
declare gpuScore: number
@column()
declare cpuScore: number
@column()
declare globalScore: number
@column({ serializeAs: null })
declare stateId: number
@belongsTo(() => ComputerState, {
foreignKey: 'stateId',
})
declare state: BelongsTo<typeof ComputerState>
@hasMany(() => Component)
declare components: HasMany<typeof Component>
@hasMany(() => ComputerPicture, {
foreignKey: 'computerId',
})
declare pictures: HasMany<typeof ComputerPicture>
@column({ serializeAs: null })
declare userId: number
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
@computed()
get cost(): number {
if (!this.$preloaded.components) {
console.warn('Components not preloaded, cost may be incorrect')
return 0
}
return this.components.reduce((total, component) => total + Number(component.price), 0)
}
}
+27
View File
@@ -0,0 +1,27 @@
import { DateTime } from 'luxon'
import { BaseModel, belongsTo, column } from '@adonisjs/lucid/orm'
import Computer from '#models/computer'
import type { BelongsTo } from '@adonisjs/lucid/types/relations'
export default class ComputerPicture extends BaseModel {
@column({ isPrimary: true })
declare id: number
@column()
declare computerId: number
@column()
declare link: string
@column()
declare order: number
@belongsTo(() => Computer)
declare computer: BelongsTo<typeof Computer>
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
}
+9
View File
@@ -0,0 +1,9 @@
import { BaseModel, column } from '@adonisjs/lucid/orm'
export default class ComputerState extends BaseModel {
@column({ isPrimary: true })
declare id: number
@column()
declare name: string
}
+30
View File
@@ -0,0 +1,30 @@
import { DateTime } from 'luxon'
import hash from '@adonisjs/core/services/hash'
import { compose } from '@adonisjs/core/helpers'
import { BaseModel, column } from '@adonisjs/lucid/orm'
import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'
const AuthFinder = withAuthFinder(() => hash.use('scrypt'), {
uids: ['email'],
passwordColumnName: 'password',
})
export default class User extends compose(BaseModel, AuthFinder) {
@column({ isPrimary: true })
declare id: number
@column()
declare name: string | null
@column()
declare email: string
@column({ serializeAs: null })
declare password: string
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
}
+25
View File
@@ -0,0 +1,25 @@
import Component from '#models/component'
import Computer from '#models/computer'
async function handleComponents(componentsId: number[], computer: Computer) {
const currentComponents = await computer.related('components').query()
const currentComponentsIds = currentComponents.map((component) => component.id)
const componentsToAdd = componentsId.filter((id) => !currentComponentsIds.includes(id))
const componentsToRemove = currentComponentsIds.filter((id) => !componentsId.includes(id))
await Promise.all(
componentsToAdd.map(async (id: number) => {
const component = await Component.findOrFail(id)
component.computerId = computer.id
await component.save()
})
)
await Promise.all(
componentsToRemove.map(async (id: number) => {
const component = await Component.findOrFail(id)
component.computerId = null
await component.save()
})
)
}
export { handleComponents }
+57
View File
@@ -0,0 +1,57 @@
import type { HttpContext } from '@adonisjs/core/http'
import ComputerPicture from '#models/computer_picture'
import Computer from '#models/computer'
import { v4 as uuid } from 'uuid'
import type { Image } from '#types/UItypes'
import { existsSync, unlinkSync } from 'node:fs'
async function handlePictures(
pictures: Image[],
request: HttpContext['request'],
computer: Computer
) {
const currentPictures = await computer.related('pictures').query()
const currentPictureIds = currentPictures.map((picture) => picture.id)
const imagesToRemove = currentPictureIds.filter(
(id: number) => !pictures.some((picture) => 'id' in picture && picture.id === id)
)
await Promise.all(
pictures.map(async (picture: Image, index: number) => {
if ('id' in picture) {
const existingPicture = await ComputerPicture.findOrFail(picture.id)
existingPicture.order = picture.order
await existingPicture.save()
} else {
const image = request.file(`pictures[${index}][file]`, {
size: '2mb',
extnames: ['jpg', 'png', 'jpeg', 'svg'],
})
if (image) {
const imageName = `img_${uuid()}.${image.extname}`
await image.move(`uploads/computer_${computer.id}`, {
name: imageName,
})
await ComputerPicture.create({
computerId: computer.id,
link: `/uploads/computer_${computer.id}/${imageName}`,
order: picture.order,
})
}
}
})
)
await Promise.all(
imagesToRemove.map(async (id: number) => {
const picture = await ComputerPicture.findOrFail(id)
const filePath = `uploads/computer_${computer.id}/${picture.link.split('/').pop()}`
if (existsSync(filePath)) {
unlinkSync(filePath)
}
await picture.delete()
})
)
}
export { handlePictures }
+13
View File
@@ -0,0 +1,13 @@
import { BaseModel } from '@adonisjs/lucid/orm'
export default class UserTransformer {
static exclude = ['password']
transform(user: BaseModel) {
return {
id: user.id,
name: user.name,
email: user.email,
}
}
}
+8
View File
@@ -0,0 +1,8 @@
import vine from '@vinejs/vine'
export const loginValidator = vine.compile(
vine.object({
email: vine.string().email(),
password: vine.string().minLength(8).maxLength(32),
})
)
+15
View File
@@ -0,0 +1,15 @@
import vine from '@vinejs/vine'
export const registerValidator = vine.compile(
vine.object({
name: vine.string().minLength(3).maxLength(64),
email: vine
.string()
.email()
.unique(async (query, field) => {
const user = await query.from('users').where('email', field).first()
return !user
}),
password: vine.string().minLength(8).maxLength(32),
})
)
+11
View File
@@ -0,0 +1,11 @@
import vine from '@vinejs/vine'
export const storeComponentValidator = vine.compile(
vine.object({
name: vine.string().trim().minLength(1),
price: vine.number().decimal([0, 2]).min(0),
typeId: vine.number().min(1),
purchaseDate: vine.string().regex(/^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/),
quantity: vine.number().min(1).withoutDecimals(),
})
)
+12
View File
@@ -0,0 +1,12 @@
import vine from '@vinejs/vine'
const email = () => vine.string().email().maxLength(254)
const password = () => vine.string().minLength(8).maxLength(32)
export const signupValidator = vine.create({
fullName: vine.string().nullable(),
email: email().unique({ table: 'users', column: 'email' }),
password: password().confirmed({
confirmationField: 'passwordConfirmation',
}),
})
+47
View File
@@ -0,0 +1,47 @@
/*
|--------------------------------------------------------------------------
| Ace entry point
|--------------------------------------------------------------------------
|
| The "console.ts" file is the entrypoint for booting the AdonisJS
| command-line framework and executing commands.
|
| Commands do not boot the application, unless the currently running command
| has "options.startApp" flag set to true.
|
*/
await import('reflect-metadata')
const { Ignitor, prettyPrintError } = await import('@adonisjs/core')
/**
* URL to the application root. AdonisJS need it to resolve
* paths to file and directories for scaffolding commands
*/
const APP_ROOT = new URL('../', import.meta.url)
/**
* The importer is used to import files in context of the
* application.
*/
const IMPORTER = (filePath: string) => {
if (filePath.startsWith('./') || filePath.startsWith('../')) {
return import(new URL(filePath, APP_ROOT).href)
}
return import(filePath)
}
new Ignitor(APP_ROOT, { importer: IMPORTER })
.tap((app) => {
app.booting(async () => {
await import('#start/env')
})
app.listen('SIGTERM', () => app.terminate())
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate())
})
.ace()
.handle(process.argv.splice(2))
.catch((error) => {
process.exitCode = 1
prettyPrintError(error)
})
+45
View File
@@ -0,0 +1,45 @@
/*
|--------------------------------------------------------------------------
| HTTP server entrypoint
|--------------------------------------------------------------------------
|
| The "server.ts" file is the entrypoint for starting the AdonisJS HTTP
| server. Either you can run this file directly or use the "serve"
| command to run this file and monitor file changes
|
*/
await import('reflect-metadata')
const { Ignitor, prettyPrintError } = await import('@adonisjs/core')
/**
* URL to the application root. AdonisJS need it to resolve
* paths to file and directories for scaffolding commands
*/
const APP_ROOT = new URL('../', import.meta.url)
/**
* The importer is used to import files in context of the
* application.
*/
const IMPORTER = (filePath: string) => {
if (filePath.startsWith('./') || filePath.startsWith('../')) {
return import(new URL(filePath, APP_ROOT).href)
}
return import(filePath)
}
new Ignitor(APP_ROOT, { importer: IMPORTER })
.tap((app) => {
app.booting(async () => {
await import('#start/env')
})
app.listen('SIGTERM', () => app.terminate())
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate())
})
.httpServer()
.start()
.catch((error) => {
process.exitCode = 1
prettyPrintError(error)
})
+62
View File
@@ -0,0 +1,62 @@
/*
|--------------------------------------------------------------------------
| Test runner entrypoint
|--------------------------------------------------------------------------
|
| The "test.ts" file is the entrypoint for running tests using Japa.
|
| Either you can run this file directly or use the "test"
| command to run this file and monitor file changes.
|
*/
process.env.NODE_ENV = 'test'
import 'reflect-metadata'
import { Ignitor, prettyPrintError } from '@adonisjs/core'
import { configure, processCLIArgs, run } from '@japa/runner'
/**
* URL to the application root. AdonisJS need it to resolve
* paths to file and directories for scaffolding commands
*/
const APP_ROOT = new URL('../', import.meta.url)
/**
* The importer is used to import files in context of the
* application.
*/
const IMPORTER = (filePath: string) => {
if (filePath.startsWith('./') || filePath.startsWith('../')) {
return import(new URL(filePath, APP_ROOT).href)
}
return import(filePath)
}
new Ignitor(APP_ROOT, { importer: IMPORTER })
.tap((app) => {
app.booting(async () => {
await import('#start/env')
})
app.listen('SIGTERM', () => app.terminate())
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate())
})
.testRunner()
.configure(async (app) => {
const { runnerHooks, ...config } = await import('../tests/bootstrap.js')
processCLIArgs(process.argv.splice(2))
configure({
...app.rcFile.tests,
...config,
...{
setup: runnerHooks.setup,
teardown: runnerHooks.teardown.concat([() => app.terminate()]),
},
})
})
.run(() => run())
.catch((error) => {
process.exitCode = 1
prettyPrintError(error)
})
+76
View File
@@ -0,0 +1,76 @@
import app from '@adonisjs/core/services/app'
import { defineConfig } from '@adonisjs/core/http'
/**
* The configuration settings used by the HTTP server
*/
export const http = defineConfig({
/**
* Generate a unique request id for each incoming request.
* Useful to correlate logs and debug a request flow.
*/
generateRequestId: true,
/**
* Allow HTTP method spoofing via the "_method" form/query parameter.
* This lets HTML forms target PUT/PATCH/DELETE routes while still
* submitting with POST.
*/
allowMethodSpoofing: false,
/**
* Enabling async local storage will let you access HTTP context
* from anywhere inside your application.
*/
useAsyncLocalStorage: false,
/**
* Redirect configuration controls the behavior of
* response.redirect().back() and query string forwarding.
*/
redirect: {
/**
* When enabled, all redirects automatically carry over the current
* request's query string parameters to the redirect destination.
* Use withQs(false) to opt out for a specific redirect.
*/
forwardQueryString: true,
},
/**
* Manage cookies configuration. The settings for the session id cookie are
* defined inside the "config/session.ts" file.
*/
cookie: {
/**
* Restrict the cookie to a specific domain.
* Keep empty to use the current host.
*/
domain: '',
/**
* Restrict the cookie to a URL path. '/' means all routes.
*/
path: '/',
/**
* Default lifetime for cookies managed by the HTTP layer.
*/
maxAge: '2h',
/**
* Prevent JavaScript access to the cookie in the browser.
*/
httpOnly: true,
/**
* Send cookies only over HTTPS in production.
*/
secure: app.inProduction,
/**
* Cross-site policy for cookie sending.
*/
sameSite: 'lax',
},
})
+39
View File
@@ -0,0 +1,39 @@
import { defineConfig } from '@adonisjs/auth'
import { sessionGuard, sessionUserProvider } from '@adonisjs/auth/session'
import type { InferAuthenticators, InferAuthEvents, Authenticators } from '@adonisjs/auth/types'
const authConfig = defineConfig({
/**
* Default guard used when no guard is explicitly specified.
*/
default: 'web',
guards: {
/**
* Session-based guard for browser authentication.
*/
web: sessionGuard({
/**
* Enable persistent login using remember-me tokens.
*/
useRememberMeTokens: false,
provider: sessionUserProvider({
model: () => import('#models/user'),
}),
}),
},
})
export default authConfig
/**
* Inferring types from the configured auth
* guards.
*/
declare module '@adonisjs/auth/types' {
export interface Authenticators extends InferAuthenticators<typeof authConfig> {}
}
declare module '@adonisjs/core/types' {
interface EventsList extends InferAuthEvents<Authenticators> {}
}
+78
View File
@@ -0,0 +1,78 @@
import { defineConfig } from '@adonisjs/core/bodyparser'
const bodyParserConfig = defineConfig({
/**
* Parse request bodies for these HTTP methods.
* Keep this aligned with methods that receive payloads in your routes.
*/
allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
/**
* Config for the "application/x-www-form-urlencoded"
* content-type parser.
*/
form: {
/**
* Normalize empty string values to null.
*/
convertEmptyStringsToNull: true,
/**
* Content types handled by the form parser.
*/
types: ['application/x-www-form-urlencoded'],
},
/**
* Config for the JSON parser.
*/
json: {
/**
* Normalize empty string values to null.
*/
convertEmptyStringsToNull: true,
/**
* Content types handled by the JSON parser.
*/
types: [
'application/json',
'application/json-patch+json',
'application/vnd.api+json',
'application/csp-report',
],
},
/**
* Config for the "multipart/form-data" content-type parser.
* File uploads are handled by the multipart parser.
*/
multipart: {
/**
* Automatically process uploaded files into the system tmp directory.
*/
autoProcess: true,
/**
* Normalize empty string values to null.
*/
convertEmptyStringsToNull: true,
/**
* Routes where multipart processing is handled manually.
*/
processManually: [],
/**
* Maximum accepted payload size for multipart requests.
*/
limit: '20mb',
/**
* Content types handled by the multipart parser.
*/
types: ['multipart/form-data'],
},
})
export default bodyParserConfig
+50
View File
@@ -0,0 +1,50 @@
import app from '@adonisjs/core/services/app'
import { defineConfig } from '@adonisjs/cors'
/**
* Configuration options to tweak the CORS policy. The following
* options are documented on the official documentation website.
*
* https://docs.adonisjs.com/guides/security/cors
*/
const corsConfig = defineConfig({
/**
* Enable or disable CORS handling globally.
*/
enabled: true,
/**
* In development, allow every origin to simplify local front/backend setup.
* In production, keep an explicit allowlist (empty by default, so no
* cross-origin browser access is allowed until configured).
*/
origin: app.inDev ? true : [],
/**
* HTTP methods accepted for cross-origin requests.
*/
methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE'],
/**
* Reflect request headers by default. Use a string array to restrict
* allowed headers.
*/
headers: true,
/**
* Response headers exposed to the browser.
*/
exposeHeaders: [],
/**
* Allow cookies/authorization headers on cross-origin requests.
*/
credentials: true,
/**
* Cache CORS preflight response for N seconds.
*/
maxAge: 90,
})
export default corsConfig
+55
View File
@@ -0,0 +1,55 @@
import env from '#start/env'
import app from '@adonisjs/core/services/app'
import { defineConfig } from '@adonisjs/lucid'
const dbConfig = defineConfig({
connection: env.get('DB_CONNECTION', 'sqlite'),
connections: {
sqlite: {
client: 'better-sqlite3',
connection: {
filename: app.tmpPath('db.sqlite3'),
},
useNullAsDefault: true,
migrations: {
naturalSort: true,
paths: ['database/migrations'],
},
},
mysql: {
client: 'mysql2',
connection: {
host: env.get('DB_HOST'),
port: Number(env.get('DB_PORT', '3306')),
user: env.get('DB_USER'),
password: env.get('DB_PASSWORD'),
database: env.get('DB_DATABASE'),
},
migrations: {
naturalSort: true,
paths: ['database/migrations'],
},
debug: app.inDev,
},
pg: {
client: 'pg',
connection: {
host: env.get('DB_HOST'),
port: Number(env.get('DB_PORT', '5432')),
user: env.get('DB_USER'),
password: env.get('DB_PASSWORD'),
database: env.get('DB_DATABASE'),
},
migrations: {
naturalSort: true,
paths: ['database/migrations'],
},
debug: app.inDev,
},
},
})
export default dbConfig
+34
View File
@@ -0,0 +1,34 @@
import env from '#start/env'
import { defineConfig, drivers } from '@adonisjs/core/encryption'
const encryptionConfig = defineConfig({
/**
* Default encryption driver used by the application.
*/
default: 'gcm',
list: {
gcm: drivers.aes256gcm({
/**
* Keys used for encryption/decryption.
* First key encrypts, all keys are tried for decryption.
*/
keys: [env.get('APP_KEY')],
/**
* Stable identifier for this driver.
*/
id: 'gcm',
}),
},
})
export default encryptionConfig
/**
* Inferring types for the list of encryptors you have configured
* in your application.
*/
declare module '@adonisjs/core/types' {
export interface EncryptorsList extends InferEncryptors<typeof encryptionConfig> {}
}
+75
View File
@@ -0,0 +1,75 @@
import { defineConfig, drivers } from '@adonisjs/core/hash'
/**
* Hashing configuration.
*
* This starter uses Node.js scrypt under the hood.
* Node.js reference: https://nodejs.org/api/crypto.html#cryptoscryptpassword-salt-keylen-options-callback
*/
const hashConfig = defineConfig({
/**
* Default hasher used by the application.
*/
default: 'scrypt',
list: {
/**
* Scrypt is memory-hard, which makes brute-force attacks more expensive.
*/
scrypt: drivers.scrypt({
/**
* Work factor (Node alias: N / cost).
* Higher values increase security and CPU+memory usage.
*
* Tuning guideline:
* - Start with 16384.
* - Increase gradually (for example 32768) and benchmark login/signup latency.
* - Keep values practical for your slowest production machine.
*
* Node constraint: value must be a power of two greater than 1.
*/
cost: 16384,
/**
* Block size (Node alias: r / blockSize).
* Increases memory and CPU linearly.
*
* Tuning guideline:
* - Keep 8 unless you have a measured reason to change it.
* - Raise only with benchmark data, because memory usage grows quickly.
*/
blockSize: 8,
/**
* Parallelization (Node alias: p / parallelization).
* Controls how many independent computations are performed.
*
* Tuning guideline:
* - Keep 1 for most applications.
* - Increase only after load testing if your infrastructure benefits from it.
*/
parallelization: 1,
/**
* Maximum memory limit in bytes (Node alias: maxmem / maxMemory).
* Hashing throws if the estimated memory usage is above this limit.
* Node documents the check as approximately: 128 * N * r > maxmem.
*
* Tuning guideline:
* - Keep this aligned with your cost/blockSize choices.
* - Increase carefully on memory-constrained environments.
*/
maxMemory: 33554432,
}),
},
})
export default hashConfig
/**
* Inferring types for the list of hashers you have configured
* in your application.
*/
declare module '@adonisjs/core/types' {
export interface HashersList extends InferHashers<typeof hashConfig> {}
}
+20
View File
@@ -0,0 +1,20 @@
import { defineConfig } from '@adonisjs/inertia'
const inertiaConfig = defineConfig({
/**
* Server-side rendering options.
*/
ssr: {
/**
* Toggle SSR mode for Inertia pages.
*/
enabled: false,
/**
* Entry file used by the SSR server build.
*/
entrypoint: 'inertia/ssr.ts',
},
})
export default inertiaConfig
+50
View File
@@ -0,0 +1,50 @@
import env from '#start/env'
import app from '@adonisjs/core/services/app'
import { defineConfig, targets } from '@adonisjs/core/logger'
const loggerConfig = defineConfig({
/**
* Default logger name used by ctx.logger and app logger calls.
*/
default: 'app',
loggers: {
app: {
/**
* Toggle this logger on/off.
*/
enabled: true,
/**
* Logger name shown in log records.
*/
name: env.get('APP_NAME'),
/**
* Minimum level to output (trace, debug, info, warn, error, fatal).
*/
level: env.get('LOG_LEVEL'),
/**
* Configure where logs are written.
* Pretty logs in development, stdout in production.
*/
transport: {
targets: targets()
.pushIf(!app.inProduction, targets.pretty())
.pushIf(app.inProduction, targets.file({ destination: 1 }))
.toArray(),
},
},
},
})
export default loggerConfig
/**
* Inferring types for the list of loggers you have configured
* in your application.
*/
declare module '@adonisjs/core/types' {
export interface LoggersList extends InferLoggers<typeof loggerConfig> {}
}
+78
View File
@@ -0,0 +1,78 @@
import env from '#start/env'
import app from '@adonisjs/core/services/app'
import { defineConfig, stores } from '@adonisjs/session'
const sessionConfig = defineConfig({
/**
* Enable or disable session support globally.
*/
enabled: true,
/**
* Cookie name storing the session identifier.
*/
cookieName: 'adonis-session',
/**
* When set to true, the session id cookie will be deleted
* once the user closes the browser.
*/
clearWithBrowser: false,
/**
* Define how long to keep the session data alive without
* any activity.
*/
age: '2h',
/**
* Configuration for session cookie and the
* cookie store.
*/
cookie: {
/**
* Restrict the cookie to a URL path. '/' means all routes.
*/
path: '/',
/**
* Prevent JavaScript access to the cookie in the browser.
*/
httpOnly: true,
/**
* Send cookies only over HTTPS in production.
*/
secure: app.inProduction,
/**
* Cross-site policy for cookie sending.
*/
sameSite: 'lax',
},
/**
* The store to use. Make sure to validate the environment
* variable in order to infer the store name without any
* errors.
*/
store: env.get('SESSION_DRIVER'),
/**
* List of configured stores. Refer documentation to see
* list of available stores and their config.
*/
stores: {
/**
* Store session data inside encrypted cookies.
*/
cookie: stores.cookie(),
/**
* Store session data inside the configured database.
*/
database: stores.database(),
},
})
export default sessionConfig
+95
View File
@@ -0,0 +1,95 @@
import { defineConfig } from '@adonisjs/shield'
const shieldConfig = defineConfig({
/**
* Configure CSP policies for your app. Refer documentation
* to learn more.
*/
csp: {
/**
* Enable the Content-Security-Policy header.
*/
enabled: false,
/**
* Per-resource CSP directives.
*/
directives: {},
/**
* Report violations without blocking resources.
*/
reportOnly: false,
},
/**
* Configure CSRF protection options. Refer documentation
* to learn more.
*/
csrf: {
/**
* Enable CSRF token verification for state-changing requests.
*/
enabled: true,
/**
* Route patterns to exclude from CSRF checks.
* Useful for external webhooks or API endpoints.
*/
exceptRoutes: [],
/**
* Expose an encrypted XSRF-TOKEN cookie for frontend HTTP clients.
*/
enableXsrfCookie: true,
/**
* HTTP methods protected by CSRF validation.
*/
methods: ['POST', 'PUT', 'PATCH', 'DELETE'],
},
/**
* Control how your website should be embedded inside
* iframes.
*/
xFrame: {
/**
* Enable the X-Frame-Options header.
*/
enabled: true,
/**
* Block all framing attempts. Default value is DENY.
*/
action: 'DENY',
},
/**
* Force browser to always use HTTPS.
*/
hsts: {
/**
* Enable the Strict-Transport-Security header.
*/
enabled: true,
/**
* HSTS policy duration remembered by browsers.
*/
maxAge: '180 days',
},
/**
* Disable browsers from sniffing content types and rely only
* on the response content-type header.
*/
contentTypeSniffing: {
/**
* Enable X-Content-Type-Options: nosniff.
*/
enabled: true,
},
})
export default shieldConfig
+32
View File
@@ -0,0 +1,32 @@
import { defineConfig } from '@adonisjs/static'
/**
* Configuration options to tweak the static files middleware.
* The complete set of options are documented on the
* official documentation website.
*
* https://docs.adonisjs.com/guides/basics/static-file-server
*/
const staticServerConfig = defineConfig({
/**
* Enable or disable static file serving middleware.
*/
enabled: true,
/**
* Generate ETag headers for client/proxy caching.
*/
etag: true,
/**
* Include Last-Modified headers for conditional requests.
*/
lastModified: true,
/**
* Policy for files starting with a dot.
*/
dotFiles: 'ignore',
})
export default staticServerConfig
+34
View File
@@ -0,0 +1,34 @@
import { defineConfig } from '@adonisjs/vite'
const viteBackendConfig = defineConfig({
/**
* The output of vite will be written inside this
* directory. The path should be relative from
* the application root.
*/
buildDirectory: 'public/assets',
/**
* The path to the manifest file generated by the
* "vite build" command.
*/
manifestFile: 'public/assets/.vite/manifest.json',
/**
* Feel free to change the value of the "assetsUrl" to
* point to a CDN in production.
*/
assetsUrl: '/assets',
/**
* HTML attributes added to generated script tags.
*/
scriptAttributes: {
/**
* Execute scripts after HTML parsing is complete.
*/
defer: true,
},
})
export default viteBackendConfig
@@ -0,0 +1,20 @@
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'users'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.string('name').nullable()
table.string('email', 254).notNullable().unique()
table.string('password').notNullable()
table.timestamp('created_at').notNullable()
table.timestamp('updated_at').nullable()
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
@@ -0,0 +1,24 @@
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'computers'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.string('title').notNullable()
table.integer('state_id').notNullable()
table.float('sell_price', 6, 2).nullable()
table.integer('gpu_score').notNullable()
table.integer('cpu_score').notNullable()
table.integer('global_score').notNullable()
table.integer('user_id').unsigned().references('id').inTable('users').onDelete('CASCADE')
table.timestamp('created_at')
table.timestamp('updated_at')
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
@@ -0,0 +1,17 @@
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'component_types'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.string('name').notNullable()
table.boolean('unique').notNullable()
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
@@ -0,0 +1,23 @@
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'components'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.string('name').notNullable()
table.decimal('price', 8, 2).notNullable()
table.integer('type_id').unsigned().references('id').inTable('component_types').onDelete('CASCADE')
table.integer('computer_id').unsigned().nullable().references('id').inTable('computers').onDelete('CASCADE')
table.integer('user_id').unsigned().references('id').inTable('users').onDelete('CASCADE')
table.date('purchase_date').notNullable()
table.timestamp('created_at')
table.timestamp('updated_at')
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
@@ -0,0 +1,16 @@
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'computer_states'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.string('name').notNullable()
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
@@ -0,0 +1,20 @@
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'computer_pictures'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.integer('computer_id').unsigned().references('id').inTable('computers').onDelete('CASCADE')
table.string('link').notNullable()
table.integer('order').notNullable()
table.timestamp('created_at')
table.timestamp('updated_at')
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
+110
View File
@@ -0,0 +1,110 @@
/**
* This file is automatically generated
* DO NOT EDIT manually
* Run "node ace migration:run" command to re-generate this file
*/
import { BaseModel, column } from '@adonisjs/lucid/orm'
import { DateTime } from 'luxon'
export class ComponentTypeSchema extends BaseModel {
static $columns = ['id', 'name', 'unique'] as const
$columns = ComponentTypeSchema.$columns
@column({ isPrimary: true })
declare id: number
@column()
declare name: string
@column()
declare unique: boolean
}
export class ComponentSchema extends BaseModel {
static $columns = ['computerId', 'createdAt', 'id', 'name', 'price', 'purchaseDate', 'typeId', 'updatedAt', 'userId'] as const
$columns = ComponentSchema.$columns
@column()
declare computerId: number | null
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime | null
@column({ isPrimary: true })
declare id: number
@column()
declare name: string
@column()
declare price: string
@column.date()
declare purchaseDate: DateTime
@column()
declare typeId: number | null
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
@column()
declare userId: number | null
}
export class ComputerPictureSchema extends BaseModel {
static $columns = ['computerId', 'createdAt', 'id', 'link', 'order', 'updatedAt'] as const
$columns = ComputerPictureSchema.$columns
@column()
declare computerId: number | null
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime | null
@column({ isPrimary: true })
declare id: number
@column()
declare link: string
@column()
declare order: number
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
}
export class ComputerStateSchema extends BaseModel {
static $columns = ['id', 'name'] as const
$columns = ComputerStateSchema.$columns
@column({ isPrimary: true })
declare id: number
@column()
declare name: string
}
export class ComputerSchema extends BaseModel {
static $columns = ['cpuScore', 'createdAt', 'globalScore', 'gpuScore', 'id', 'sellPrice', 'stateId', 'title', 'updatedAt', 'userId'] as const
$columns = ComputerSchema.$columns
@column()
declare cpuScore: number
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime | null
@column()
declare globalScore: number
@column()
declare gpuScore: number
@column({ isPrimary: true })
declare id: number
@column()
declare sellPrice: number | null
@column()
declare stateId: number
@column()
declare title: string
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
@column()
declare userId: number | null
}
export class UserSchema extends BaseModel {
static $columns = ['createdAt', 'email', 'id', 'name', 'password', 'updatedAt'] as const
$columns = UserSchema.$columns
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
@column()
declare email: string
@column({ isPrimary: true })
declare id: number
@column()
declare name: string | null
@column({ serializeAs: null })
declare password: string
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime | null
}
+3
View File
@@ -0,0 +1,3 @@
import { type SchemaRules } from '@adonisjs/lucid/types/schema_generator'
export default {} satisfies SchemaRules
+23
View File
@@ -0,0 +1,23 @@
version: '3'
services:
mysql:
image: 'mysql/mysql-server:8.0.32'
container_name: mysql-pcbuilderv2
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: 'password'
MYSQL_ROOT_HOST: '%'
MYSQL_DATABASE: 'pc_builderv2'
MYSQL_USER: 'admin'
MYSQL_PASSWORD: 'password'
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ['CMD', 'mysqladmin', 'ping', '-ppassword']
retries: 3
timeout: 5s
volumes:
mysql_data:
+10
View File
@@ -0,0 +1,10 @@
import { configApp } from '@adonisjs/eslint-config'
import { vue } from '@adonisjs/eslint-config/vue'
export default configApp(...vue, {
name: 'inertia-vue ts overrides',
files: ['inertia/**/*.ts'],
rules: {
'vue/component-api-style': 'off',
},
})
+66
View File
@@ -0,0 +1,66 @@
import './css/app.css'
import 'vue-sonner/style.css'
import { client } from '~/client'
import Layout from '~/layouts/default.vue'
import { createInertiaApp } from '@inertiajs/vue3'
import { TuyauProvider } from '@adonisjs/inertia/vue'
import { createApp, type DefineComponent, h } from 'vue'
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
import DefaultLayout from '~/pages/layout/defaultLayout.vue'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
// directives
// @ts-ignore
import validationErrorDirective from '~/directives/v_validation_error'
// @ts-ignore
import priceDirective from '~/directives/v-price'
// @ts-ignore
import deleteConfirmDirective from '~/directives/v-delete-confirm'
const appName = import.meta.env.VITE_APP_NAME || 'AdonisJS'
createInertiaApp({
title: (title) => (title ? `${title} - ${appName}` : appName),
resolve: async (name) => {
const page = await resolvePageComponent(
`./pages/${name}.vue`,
import.meta.glob<DefineComponent>('./pages/**/*.vue')
)
// Choix du layout
const layout =
name.startsWith('auth/') || name.startsWith('account')
? EmptyLayout
: DefaultLayout
page.default.layout = page.default.layout || layout
return page
},
setup({ el, App, props, plugin }) {
const vueApp = createApp({
render: () =>
h(
TuyauProvider,
{ client },
{
default: () => h(App, props),
}
),
})
vueApp
.use(plugin)
.directive('validation-error', validationErrorDirective)
.directive('price', priceDirective)
.directive('delete-confirm', deleteConfirmDirective)
.mount(el)
},
progress: {
color: '#4B5563',
},
})
+122
View File
@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="256" height="256" viewBox="0 0 256 256" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<rect x="0" y="0" width="100%" height="100%" fill="transparent"></rect>
<g transform="matrix(1 0 0 1 128 128)" id="26de6fa9-e9ba-440c-9ba5-19b77165ca9c" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-128" y="-128" rx="0" ry="0" width="256" height="256" />
</g>
<g transform="matrix(0 0 0 0 0 0)" id="619c12e5-bbef-4eda-b35a-fd1e0d3f473f" >
</g>
<g transform="matrix(0.57 0 0 0.57 128 128)" >
<g style="" vector-effect="non-scaling-stroke" >
<g transform="matrix(0.13 0 0 -0.13 -3.83 -5.2)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2251.28, -2249.19)" d="M 2185 3801 C 2160 3794 2013 3729 1510 3497 C 1480 3484 1394 3444 1320 3410 C 1246 3376 1172 3336 1156 3322 C 1097 3266 1100 3329 1105 2138 C 1108 1537 1113 972 1116 883 C 1121 738 1124 720 1139 720 C 1149 720 1165 713 1176 705 C 1188 696 1220 691 1267 690 C 1327 690 1344 694 1360 710 C 1379 729 1393 730 1668 730 C 1943 730 1956 729 1973 710 C 1987 694 2002 690 2058 690 C 2103 690 2133 695 2148 706 C 2168 720 2172 720 2192 706 C 2223 684 2443 684 2480 705 C 2517 726 3005 726 3046 705 C 3086 684 3267 685 3294 705 C 3305 713 3333 720 3357 720 L 3400 720 L 3400 2118 C 3400 3459 3399 3517 3381 3556 C 3358 3607 3317 3637 3254 3650 C 3176 3666 2251 3810 2232 3809 C 2223 3808 2202 3805 2185 3801 z M 2511 3725 C 2634 3705 2814 3677 2910 3662 C 3006 3647 3074 3634 3060 3633 C 3046 3631 2857 3656 2639 3688 C 2421 3720 2237 3744 2231 3742 C 2223 3739 2220 3341 2220 2253 L 2220 767 L 2468 771 C 2820 776 3300 769 3225 760 C 3192 756 2921 752 2623 751 L 2081 750 L 1998 781 L 1915 812 L 1657 811 C 1407 810 1397 809 1338 785 C 1297 768 1257 760 1218 760 L 1160 760 L 1159 898 C 1159 973 1155 1525 1151 2125 C 1146 2782 1147 3225 1152 3240 C 1162 3266 1208 3320 1222 3320 C 1226 3320 1435 3415 1687 3531 C 1939 3647 2154 3746 2165 3750 C 2203 3766 2288 3760 2511 3725 z M 2727 3399 C 3038 3358 3252 3323 3212 3321 C 3158 3318 2342 3434 2331 3446 C 2324 3453 2342 3451 2727 3399 z M 3245 3409 C 3257 3403 3242 3402 3203 3406 C 3149 3411 3141 3410 3137 3393 C 3134 3381 3132 3385 3131 3403 C 3130 3431 3130 3431 3178 3424 C 3204 3420 3234 3413 3245 3409 z M 3357 1513 C 3356 1178 3355 1452 3355 2120 C 3355 2788 3356 3062 3357 2728 C 3359 2393 3359 1847 3357 1513 z M 3277 3314 C 3274 3311 3265 3310 3258 3313 C 3250 3316 3253 3319 3264 3319 C 3275 3320 3281 3317 3277 3314 z M 2810 3049 C 3180 3003 3269 2988 3140 2996 C 3045 3001 2546 3063 2424 3085 L 2345 3099 L 2420 3094 C 2461 3091 2637 3071 2810 3049 z M 3213 3084 C 3233 3080 3250 3073 3250 3068 C 3250 3063 3242 3061 3233 3063 C 3170 3081 3142 3080 3137 3063 C 3133 3049 3132 3050 3131 3068 C 3130 3092 3144 3095 3213 3084 z M 3263 2983 C 3256 2981 3244 2981 3238 2983 C 3231 2986 3236 2988 3250 2988 C 3264 2988 3269 2986 3263 2983 z M 3217 2749 C 3023 2330 2828 1924 2584 1435 C 2358 983 2286 846 2318 930 C 2357 1031 2711 1772 2922 2195 C 3191 2734 3241 2832 3246 2827 C 3249 2825 3235 2789 3217 2749 z M 3214 2439 C 2988 1944 2796 1554 2771 1541 C 2760 1534 2750 1533 2750 1537 C 2750 1551 3262 2572 3266 2567 C 3269 2565 3245 2507 3214 2439 z M 3161 2019 C 3044 1765 2930 1527 2924 1521 C 2922 1518 2915 1521 2909 1527 C 2902 1534 2931 1602 3003 1746 C 3196 2135 3251 2242 3256 2238 C 3258 2235 3216 2137 3161 2019 z M 3255 1918 C 3237 1874 3094 1569 3034 1445 C 2994 1364 2984 1350 2982 1371 C 2979 1397 3099 1651 3217 1868 C 3263 1953 3279 1973 3255 1918 z M 3209 1509 C 3126 1326 2922 918 2904 900 C 2896 892 2922 957 2963 1045 C 3062 1259 3260 1653 3266 1648 C 3268 1645 3243 1583 3209 1509 z M 2822 1489 C 2782 1477 2750 1429 2750 1380 C 2750 1331 2782 1283 2822 1271 L 2855 1262 L 2818 1261 C 2789 1260 2777 1266 2756 1290 C 2689 1370 2732 1502 2824 1499 L 2855 1498 L 2822 1489 z M 2830 1433 C 2789 1418 2779 1371 2810 1340 C 2825 1325 2826 1320 2815 1320 C 2807 1320 2796 1329 2790 1339 C 2767 1383 2786 1441 2823 1439 C 2837 1439 2840 1437 2830 1433 z M 2575 1120 C 2516 1004 2466 910 2464 913 C 2460 917 2635 1305 2663 1355 C 2674 1375 2675 1375 2678 1353 C 2680 1340 2638 1245 2575 1120 z M 3235 1258 C 3165 1105 3049 878 3043 884 C 3040 886 3059 935 3085 992 C 3150 1135 3272 1371 3277 1366 C 3280 1363 3261 1315 3235 1258 z M 2848 1071 C 2797 972 2754 893 2752 895 C 2746 901 2890 1213 2907 1233 C 2950 1280 2933 1234 2848 1071 z M 2694 1061 C 2651 979 2614 913 2612 915 C 2610 917 2632 970 2660 1032 C 2689 1094 2721 1165 2732 1189 C 2746 1218 2755 1229 2762 1222 C 2769 1215 2748 1164 2694 1061 z M 3273 1033 C 3243 959 3189 858 3183 864 C 3172 874 3269 1070 3285 1070 C 3287 1070 3282 1053 3273 1033 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -81.27 2.02)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1650, -2201.09)" d="M 1958 3344 C 1949 3248 1940 3167 1938 3165 C 1933 3160 1366 2952 1363 2954 C 1362 2955 1354 3014 1345 3085 C 1336 3156 1327 3216 1324 3219 C 1322 3221 1321 2681 1321 2019 C 1322 790 1323 772 1354 992 L 1361 1040 L 1650 1040 L 1939 1040 L 1945 1008 C 1948 990 1957 939 1964 895 C 1976 826 1978 1006 1979 2168 C 1979 2911 1979 3520 1977 3520 C 1975 3520 1967 3441 1958 3344 z M 1769 3076 C 1766 3073 1426 2938 1368 2917 C 1351 2911 1350 2860 1347 2078 L 1345 1245 L 1343 2085 L 1340 2925 L 1548 3002 C 1738 3073 1781 3087 1769 3076 z M 1899 3075 C 1884 3061 1464 2910 1440 2911 C 1419 2911 1546 2963 1725 3026 C 1860 3074 1912 3088 1899 3075 z M 1880 2985 C 1880 2980 1614 2893 1501 2861 C 1460 2850 1431 2844 1436 2849 C 1448 2860 1599 2913 1740 2955 C 1854 2989 1880 2994 1880 2985 z M 1707 2777 C 1711 2771 1705 2769 1692 2772 C 1647 2784 1600 2706 1579 2586 C 1564 2498 1572 2283 1594 2214 C 1615 2147 1650 2096 1678 2092 C 1707 2088 1696 2070 1665 2070 C 1586 2070 1522 2323 1548 2532 C 1564 2661 1586 2728 1624 2766 C 1657 2799 1691 2803 1707 2777 z M 1722 2580 C 1746 2531 1755 2418 1740 2347 C 1727 2280 1693 2235 1670 2250 C 1657 2258 1658 2262 1677 2275 C 1706 2295 1720 2348 1720 2436 C 1720 2516 1707 2567 1679 2592 C 1654 2614 1655 2622 1683 2618 C 1697 2616 1711 2602 1722 2580 z M 1508 2532 C 1511 2522 1503 2519 1480 2522 C 1462 2523 1449 2521 1449 2515 C 1450 2510 1463 2506 1478 2507 L 1505 2508 L 1506 2389 C 1506 2295 1504 2270 1494 2274 C 1486 2277 1478 2275 1475 2270 C 1471 2264 1477 2260 1487 2260 C 1504 2260 1506 2248 1506 2071 L 1506 1882 L 1448 1884 C 1411 1885 1390 1882 1390 1875 C 1390 1867 1411 1865 1451 1867 C 1496 1870 1511 1867 1508 1858 C 1505 1850 1482 1845 1439 1845 L 1375 1845 L 1374 1912 L 1372 1978 L 1416 1976 C 1458 1974 1460 1975 1460 2002 C 1460 2018 1456 2029 1450 2025 C 1445 2022 1443 2013 1446 2006 C 1450 1997 1440 1993 1410 1993 C 1373 1993 1370 1995 1370 2021 C 1370 2047 1372 2048 1415 2046 C 1443 2045 1460 2048 1460 2055 C 1460 2062 1444 2065 1417 2064 L 1373 2062 L 1373 2236 C 1373 2371 1376 2410 1386 2408 C 1393 2406 1398 2409 1397 2415 C 1396 2420 1390 2424 1384 2422 C 1377 2421 1373 2442 1373 2484 L 1373 2547 L 1438 2546 C 1483 2545 1505 2541 1508 2532 z M 1571 1800 C 1572 1689 1569 1596 1566 1593 C 1563 1589 1560 1683 1560 1800 C 1560 1917 1563 2011 1566 2008 C 1569 2005 1571 1911 1571 1800 z M 1720 1800 C 1720 1692 1716 1619 1710 1615 C 1703 1611 1700 1675 1700 1800 C 1700 1925 1703 1989 1710 1985 C 1716 1981 1720 1908 1720 1800 z M 1530 1785 C 1530 1769 1477 1765 1408 1776 C 1343 1787 1366 1800 1450 1800 C 1514 1800 1530 1797 1530 1785 z M 1660 1785 C 1660 1777 1656 1770 1650 1770 C 1645 1770 1640 1777 1640 1785 C 1640 1793 1645 1800 1650 1800 C 1656 1800 1660 1793 1660 1785 z M 1880 1780 C 1880 1775 1876 1770 1870 1770 C 1865 1770 1860 1775 1860 1780 C 1860 1786 1865 1790 1870 1790 C 1876 1790 1880 1786 1880 1780 z M 1530 1715 C 1530 1703 1514 1700 1450 1700 C 1386 1700 1370 1703 1370 1715 C 1370 1727 1386 1730 1450 1730 C 1514 1730 1530 1727 1530 1715 z M 1660 1710 C 1660 1705 1656 1700 1650 1700 C 1645 1700 1640 1705 1640 1710 C 1640 1716 1645 1720 1650 1720 C 1656 1720 1660 1716 1660 1710 z M 1880 1704 C 1880 1696 1876 1692 1870 1695 C 1865 1698 1860 1705 1860 1711 C 1860 1716 1865 1720 1870 1720 C 1876 1720 1880 1713 1880 1704 z M 1530 1635 C 1530 1623 1514 1620 1450 1620 C 1386 1620 1370 1623 1370 1635 C 1370 1647 1386 1650 1450 1650 C 1514 1650 1530 1647 1530 1635 z M 1660 1635 C 1660 1627 1656 1620 1650 1620 C 1645 1620 1640 1627 1640 1635 C 1640 1643 1645 1650 1650 1650 C 1656 1650 1660 1643 1660 1635 z M 1880 1634 C 1880 1626 1875 1622 1870 1625 C 1864 1629 1862 1636 1865 1641 C 1874 1655 1880 1652 1880 1634 z M 1450 1445 C 1465 1427 1456 1400 1435 1400 C 1417 1400 1405 1424 1414 1445 C 1421 1464 1434 1464 1450 1445 z M 1509 1446 C 1523 1429 1513 1400 1494 1400 C 1476 1400 1466 1424 1474 1445 C 1481 1464 1494 1464 1509 1446 z M 1567 1445 C 1572 1431 1574 1431 1591 1446 C 1613 1466 1630 1457 1630 1424 C 1630 1407 1624 1400 1611 1400 C 1600 1400 1589 1406 1586 1413 C 1581 1423 1579 1423 1574 1413 C 1571 1406 1560 1400 1549 1400 C 1536 1400 1530 1407 1530 1423 C 1530 1460 1555 1475 1567 1445 z M 1685 1429 C 1685 1414 1678 1404 1667 1402 C 1645 1398 1634 1426 1650 1445 C 1668 1466 1685 1458 1685 1429 z M 1878 1278 C 1877 1152 1876 1137 1870 1195 C 1863 1259 1868 1430 1876 1430 C 1878 1430 1879 1361 1878 1278 z M 1769 1278 C 1769 1189 1765 1143 1760 1155 C 1744 1192 1749 1420 1766 1420 C 1768 1420 1770 1356 1769 1278 z M 1848 1280 C 1848 1228 1844 1174 1840 1160 C 1835 1145 1832 1193 1832 1280 C 1832 1367 1835 1415 1840 1400 C 1844 1386 1848 1332 1848 1280 z M 1810 1280 C 1810 1200 1806 115Line truncated
</g>
<g transform="matrix(0.13 0 0 -0.13 -110.29 -31.32)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1425, -2483.87)" d="M 1390 2485 C 1390 2480 1406 2475 1425 2475 C 1444 2475 1460 2478 1460 2481 C 1460 2485 1444 2490 1425 2492 C 1405 2494 1390 2492 1390 2485 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.87 -30.81)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1480, -2480)" d="M 1470 2480 C 1470 2475 1475 2470 1480 2470 C 1486 2470 1490 2475 1490 2480 C 1490 2486 1486 2490 1480 2490 C 1475 2490 1470 2486 1470 2480 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -113.77 -26.81)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1398.2, -2450)" d="M 1390 2450 C 1390 2445 1395 2440 1401 2440 C 1406 2440 1408 2445 1405 2450 C 1402 2456 1397 2460 1394 2460 C 1392 2460 1390 2456 1390 2450 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -109.77 -26.81)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1428.2, -2450)" d="M 1420 2450 C 1420 2445 1425 2440 1431 2440 C 1436 2440 1438 2445 1435 2450 C 1432 2456 1427 2460 1424 2460 C 1422 2460 1420 2456 1420 2450 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 -25.47)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2440)" d="M 1475 2440 C 1478 2435 1483 2430 1486 2430 C 1488 2430 1490 2435 1490 2440 C 1490 2446 1485 2450 1479 2450 C 1474 2450 1472 2446 1475 2440 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 -21.47)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2410)" d="M 1475 2410 C 1472 2405 1474 2400 1479 2400 C 1485 2400 1490 2405 1490 2410 C 1490 2416 1488 2420 1486 2420 C 1483 2420 1478 2416 1475 2410 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -113.77 -17.47)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1398.2, -2380)" d="M 1390 2380 C 1390 2375 1395 2370 1401 2370 C 1406 2370 1408 2375 1405 2380 C 1402 2386 1397 2390 1394 2390 C 1392 2390 1390 2386 1390 2380 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -108.24 -16.81)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1440, -2375)" d="M 1420 2375 C 1420 2369 1429 2364 1440 2364 C 1451 2364 1460 2369 1460 2375 C 1460 2381 1451 2386 1440 2386 C 1429 2386 1420 2381 1420 2375 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 -16.14)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2370)" d="M 1475 2370 C 1478 2365 1483 2360 1486 2360 C 1488 2360 1490 2365 1490 2370 C 1490 2376 1485 2380 1479 2380 C 1474 2380 1472 2376 1475 2370 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -113.78 -13.07)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1398.19, -2346.9)" d="M 1390 2344 C 1390 2336 1395 2332 1400 2335 C 1406 2339 1408 2346 1405 2351 C 1396 2365 1390 2362 1390 2344 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -110.29 -9.86)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1425, -2322.5)" d="M 1450 2330 C 1450 2314 1444 2311 1420 2314 C 1402 2316 1390 2313 1390 2306 C 1390 2300 1406 2295 1425 2295 C 1457 2295 1460 2298 1460 2323 C 1460 2338 1458 2350 1455 2350 C 1452 2350 1450 2341 1450 2330 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 -12.14)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2340)" d="M 1475 2340 C 1472 2335 1474 2330 1479 2330 C 1485 2330 1490 2335 1490 2340 C 1490 2346 1488 2350 1486 2350 C 1483 2350 1478 2346 1475 2340 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 -6.81)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2300)" d="M 1475 2300 C 1478 2295 1483 2290 1486 2290 C 1488 2290 1490 2295 1490 2300 C 1490 2306 1485 2310 1479 2310 C 1474 2310 1472 2306 1475 2300 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -106.63 -2.4)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1451.81, -2266.9)" d="M 1445 2271 C 1442 2266 1444 2259 1450 2255 C 1455 2252 1460 2256 1460 2264 C 1460 2282 1454 2285 1445 2271 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -110.29 6.48)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1425, -2199.43)" d="M 1390 2235 C 1390 2227 1401 2224 1420 2226 C 1442 2229 1450 2225 1450 2214 C 1450 2204 1444 2200 1435 2204 C 1426 2207 1420 2204 1420 2195 C 1420 2186 1426 2183 1437 2187 C 1449 2192 1452 2189 1447 2177 C 1444 2168 1445 2158 1450 2155 C 1456 2151 1460 2168 1460 2194 C 1460 2224 1456 2240 1448 2241 C 1441 2241 1425 2243 1413 2244 C 1400 2246 1390 2241 1390 2235 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 2.53)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2230)" d="M 1475 2230 C 1478 2225 1483 2220 1486 2220 C 1488 2220 1490 2225 1490 2230 C 1490 2236 1485 2240 1479 2240 C 1474 2240 1472 2236 1475 2230 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -113.77 6.53)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1398.2, -2200)" d="M 1390 2200 C 1390 2195 1395 2190 1401 2190 C 1406 2190 1408 2195 1405 2200 C 1402 2206 1397 2210 1394 2210 C 1392 2210 1390 2206 1390 2200 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 6.53)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2200)" d="M 1475 2200 C 1472 2195 1474 2190 1479 2190 C 1485 2190 1490 2195 1490 2200 C 1490 2206 1488 2210 1486 2210 C 1483 2210 1478 2206 1475 2200 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -113.54 11.63)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1400, -2161.8)" d="M 1390 2159 C 1390 2154 1395 2152 1400 2155 C 1406 2158 1410 2163 1410 2166 C 1410 2168 1406 2170 1400 2170 C 1395 2170 1390 2165 1390 2159 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.87 11.86)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1480, -2160)" d="M 1470 2160 C 1470 2155 1475 2150 1480 2150 C 1486 2150 1490 2155 1490 2160 C 1490 2166 1486 2170 1480 2170 C 1475 2170 1470 2166 1470 2160 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -110.29 18.54)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1425, -2109.56)" d="M 1390 2107 C 1390 2091 1394 2081 1400 2085 C 1405 2088 1407 2097 1404 2105 C 1399 2117 1405 2119 1429 2116 C 1447 2114 1460 2117 1460 2124 C 1460 2130 1444 2135 1425 2135 C 1393 2135 1390 2132 1390 2107 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 17.19)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2120)" d="M 1475 2120 C 1478 2115 1483 2110 1486 2110 C 1488 2110 1490 2115 1490 2120 C 1490 2126 1485 2130 1479 2130 C 1474 2130 1472 2126 1475 2120 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.87 21.19)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1480, -2090)" d="M 1470 2090 C 1470 2085 1475 2080 1480 2080 C 1486 2080 1490 2085 1490 2090 C 1490 2096 1486 2100 1480 2100 C 1475 2100 1470 2096 1470 2090 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 26.53)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2050)" d="M 1475 2050 C 1478 2045 1483 2040 1486 2040 C 1488 2040 1490 2045 1490 2050 C 1490 2056 1485 2060 1479 2060 C 1474 2060 1472 2056 1475 2050 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 30.53)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -2020)" d="M 1475 2020 C 1472 2015 1474 2010 1479 2010 C 1485 2010 1490 2015 1490 2020 C 1490 2026 1488 2030 1486 2030 C 1483 2030 1478 2026 1475 2020 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 35.86)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -1980)" d="M 1475 1980 C 1478 1975 1483 1970 1486 1970 C 1488 1970 1490 1975 1490 1980 C 1490 1986 1485 1990 1479 1990 C 1474 1990 1472 1986 1475 1980 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -110.29 40.53)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1425, -1945)" d="M 1390 1945 C 1390 1940 1406 1935 1425 1935 C 1444 1935 1460 1940 1460 1945 C 1460 1951 1444 1955 1425 1955 C 1406 1955 1390 1951 1390 1945 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 39.86)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -1950)" d="M 1475 1950 C 1472 1945 1474 1940 1479 1940 C 1485 1940 1490 1945 1490 1950 C 1490 1956 1488 1960 1486 1960 C 1483 1960 1478 1956 1475 1950 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -113.54 44.96)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1400, -1911.8)" d="M 1390 1909 C 1390 1904 1395 1902 1400 1905 C 1406 1908 1410 1913 1410 1916 C 1410 1918 1406 1920 1400 1920 C 1395 1920 1390 1915 1390 1909 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -108.24 44.93)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1440, -1912)" d="M 1420 1912 C 1420 1908 1429 1904 1440 1904 C 1451 1904 1460 1908 1460 1912 C 1460 1916 1451 1920 1440 1920 C 1429 1920 1420 1916 1420 1912 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -102.62 45.19)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1481.8, -1910)" d="M 1475 1910 C 1478 1905 1483 1900 1486 1900 C 1488 1900 1490 1905 1490 1910 C 1490 1916 1485 1920 1479 1920 C 1474 1920 1472 1916 1475 1910 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -10.53 -1.52)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2172.54, -2233.69)" d="M 2168 3230 C 2159 3022 2160 1374 2169 1180 C 2178 972 2188 2329 2181 2905 C 2176 3337 2174 3381 2168 3230 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -142.9 25.13)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-1179.79, -2040.19)" d="M 1177 2748 C 1168 2596 1170 1338 1179 1225 C 1184 1176 1188 1523 1188 1998 C 1189 2472 1188 2860 1187 2860 C 1185 2860 1180 2809 1177 2748 z" stroke-linecap="round" />
</g>
</g>
</g>
</svg>
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" standalone="no"?>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M627 5102 c-16 -17 -17 -165 -17 -1930 0 -1899 0 -1912 20 -1932 18
-18 33 -20 174 -20 l154 0 5 -342 c4 -364 6 -377 57 -478 12 -24 45 -68 73
-98 96 -101 218 -152 364 -152 79 0 81 0 92 -29 7 -15 27 -42 44 -59 67 -65
20 -62 967 -62 947 0 900 -3 967 62 17 17 37 44 44 59 11 29 13 29 92 29 224
0 403 128 474 339 13 37 17 112 20 389 l5 342 154 0 c141 0 156 2 174 20 20
20 20 33 20 1933 0 1841 -1 1915 -18 1930 -17 16 -166 17 -1934 17 -1842 0
-1916 -1 -1931 -18z m2165 -327 c246 -37 462 -119 663 -253 853 -567 974
-1772 250 -2497 -633 -633 -1657 -633 -2290 0 -305 306 -475 715 -475 1146 0
803 582 1479 1381 1604 118 18 349 18 471 0z m-1202 -3834 l0 -280 -27 -45
c-28 -45 -28 -45 -84 -46 -99 0 -94 -18 -97 339 l-3 311 106 0 105 0 0 -279z
m1510 29 l0 -250 -540 0 -540 0 0 250 0 250 540 0 540 0 0 -250z m638 -61 c-3
-357 2 -339 -97 -339 -56 1 -56 1 -83 46 l-28 45 0 280 0 279 105 0 106 0 -3
-311z"/>
<path d="M2415 4534 c-92 -14 -191 -35 -253 -54 l-71 -21 36 -82 c34 -80 164
-418 178 -466 7 -23 7 -23 -36 6 -77 53 -280 178 -417 257 l-134 77 -48 -41
c-120 -101 -259 -278 -333 -426 -41 -80 -90 -221 -111 -311 l-14 -62 31 -5
c18 -3 100 -14 182 -26 83 -11 203 -30 267 -42 l118 -21 -68 -37 c-37 -20
-134 -73 -217 -117 -82 -44 -189 -104 -236 -132 l-87 -51 20 -92 c40 -183 101
-327 208 -486 62 -93 225 -272 247 -272 7 0 25 19 42 43 35 51 227 291 292
365 l45 52 0 -347 -1 -347 88 -28 c255 -82 572 -84 815 -6 l70 23 -43 102
c-52 121 -178 454 -173 458 2 2 70 -40 152 -92 82 -52 214 -133 294 -179 l145
-83 65 57 c186 163 335 399 405 642 14 47 27 99 28 115 4 28 1 30 -31 33 -62
5 -372 52 -469 70 l-95 18 159 83 c87 45 224 120 305 167 l148 84 -19 88 c-60
277 -188 510 -387 706 l-70 68 -63 -83 c-52 -70 -209 -264 -294 -365 l-21 -24
1 346 0 346 -62 23 c-112 43 -256 67 -413 70 -80 2 -158 1 -175 -1z m226
-1018 c248 -58 355 -352 204 -558 -67 -92 -165 -140 -285 -140 -85 0 -139 17
-206 62 -168 116 -198 370 -63 524 49 56 114 95 183 112 67 16 100 16 167 0z"/>
</g>
</svg>
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg version="1.1" id="_x32_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 512 512" xml:space="preserve">
<style type="text/css">
.st0{fill:#000000;}
</style>
<g>
<rect x="141.312" class="st0" width="32.771" height="71.683"/>
<rect x="206.853" class="st0" width="32.761" height="71.683"/>
<rect x="272.385" class="st0" width="32.761" height="71.683"/>
<rect x="337.917" class="st0" width="32.77" height="71.683"/>
<rect x="141.312" y="440.326" class="st0" width="32.771" height="71.674"/>
<rect x="206.853" y="440.326" class="st0" width="32.761" height="71.674"/>
<rect x="272.385" y="440.326" class="st0" width="32.761" height="71.674"/>
<rect x="337.917" y="440.326" class="st0" width="32.77" height="71.674"/>
<rect x="440.321" y="141.307" class="st0" width="71.674" height="32.771"/>
<rect x="440.321" y="206.849" class="st0" width="71.674" height="32.77"/>
<rect x="440.321" y="272.39" class="st0" width="71.674" height="32.761"/>
<rect x="440.321" y="337.922" class="st0" width="71.674" height="32.77"/>
<rect x="0.005" y="141.307" class="st0" width="71.674" height="32.771"/>
<rect x="0.005" y="206.849" class="st0" width="71.674" height="32.77"/>
<rect x="0.005" y="272.39" class="st0" width="71.674" height="32.761"/>
<rect x="0.005" y="337.922" class="st0" width="71.674" height="32.77"/>
<path class="st0" d="M255.246,252.209c6.171,0,9.862-3.586,9.862-9.06c0-5.485-3.69-9.176-9.862-9.176h-11.16
c-0.4,0-0.6,0.21-0.6,0.61v17.025c0,0.4,0.2,0.601,0.6,0.601H255.246z"/>
<path class="st0" d="M92.165,419.84h327.67V92.17H92.165V419.84z M367.359,130.568c8.479,0,15.356,6.867,15.356,15.356
c0,8.488-6.876,15.355-15.356,15.355c-8.479,0-15.356-6.867-15.356-15.355C352.004,137.434,358.88,130.568,367.359,130.568z
M367.359,353.287c8.479,0,15.356,6.867,15.356,15.356c0,8.488-6.876,15.355-15.356,15.355c-8.479,0-15.356-6.867-15.356-15.355
C352.004,360.154,358.88,353.287,367.359,353.287z M290.821,222.318c0-0.591,0.4-0.991,1.001-0.991h12.648
c0.6,0,1.001,0.4,1.001,0.991v42.242c0,8.069,4.483,12.648,11.35,12.648c6.772,0,11.264-4.578,11.264-12.648v-42.242
c0-0.591,0.4-0.991,0.992-0.991h12.646c0.601,0,0.992,0.4,0.992,0.991v41.851c0,16.825-10.749,25.99-25.895,25.99
c-15.232,0-25.999-9.165-25.999-25.99V222.318z M228.846,222.318c0-0.591,0.4-0.991,1.001-0.991h26.295
c14.745,0,23.605,8.87,23.605,21.822c0,12.741-8.966,21.707-23.605,21.707h-12.056c-0.4,0-0.6,0.2-0.6,0.6v22.614
c0,0.591-0.391,0.991-0.991,0.991h-12.648c-0.601,0-1.001-0.4-1.001-0.991V222.318z M167.673,236.872
c3.586-11.063,12.256-16.633,24.112-16.633c11.454,0,19.819,5.57,23.605,15.03c0.295,0.496,0.095,0.992-0.496,1.202l-10.863,4.874
c-0.592,0.296-1.097,0.104-1.393-0.486c-1.889-4.387-5.084-7.678-10.759-7.678c-5.274,0-8.66,2.795-10.157,7.468
c-0.801,2.499-1.097,4.883-1.097,14.554c0,9.652,0.296,12.046,1.097,14.535c1.497,4.673,4.883,7.468,10.157,7.468
c5.675,0,8.87-3.291,10.759-7.669c0.296-0.6,0.801-0.791,1.393-0.496l10.863,4.874c0.591,0.21,0.791,0.706,0.496,1.202
c-3.786,9.461-12.152,15.04-23.605,15.04c-11.856,0-20.525-5.58-24.112-16.643c-1.487-4.368-1.888-7.859-1.888-18.312
C165.785,244.732,166.186,241.26,167.673,236.872z M144.64,130.568c8.489,0,15.365,6.876,15.365,15.356
c0,8.478-6.876,15.355-15.365,15.355c-8.488,0-15.355-6.876-15.355-15.355C129.285,137.444,136.152,130.568,144.64,130.568z
M144.64,353.287c8.489,0,15.365,6.876,15.365,15.356c0,8.478-6.876,15.355-15.365,15.355c-8.488,0-15.355-6.877-15.355-15.355
C129.285,360.163,136.152,353.287,144.64,353.287z"/>
</g>
</svg>
+5
View File
@@ -0,0 +1,5 @@
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 490 490" xml:space="preserve">
<polygon points="456.851,0 245,212.564 33.149,0 0.708,32.337 212.669,245.004 0.708,457.678 33.149,490 245,277.443 456.851,490
489.292,457.678 277.331,245.004 489.292,32.337 "/>
</svg>
+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 512 512" xml:space="preserve">
<g>
<g>
<path d="M256,120.457c-74.739,0-135.543,60.804-135.543,135.543c0,74.739,60.804,135.543,135.543,135.543
S391.543,330.739,391.543,256C391.543,181.261,330.74,120.457,256,120.457z M256,357.391
c-55.908,0-101.391-45.484-101.391-101.391c0-55.907,45.483-101.391,101.391-101.391S357.391,200.093,357.391,256
C357.391,311.907,311.907,357.391,256,357.391z"/>
</g>
</g>
<g>
<g>
<path d="M256,185.027c-39.135,0-70.973,31.839-70.973,70.973c0,39.135,31.839,70.973,70.973,70.973
c39.135,0,70.973-31.839,70.973-70.973C326.974,216.865,295.134,185.027,256,185.027z"/>
</g>
</g>
<g>
<g>
<path d="M511.999,315.659V196.341h-47.416c-4.534-15.894-10.867-31.172-18.918-45.636l33.539-33.539l-84.37-84.37l-33.539,33.54
c-14.467-8.053-29.741-14.385-45.636-18.919V0H196.341v47.416c-15.895,4.534-31.168,10.866-45.636,18.919l-33.539-33.54
l-84.37,84.37l33.539,33.539c-8.051,14.464-14.385,29.741-18.918,45.636H0.001v119.318h47.416
c4.534,15.894,10.867,31.172,18.918,45.636l-33.539,33.539l84.37,84.37l33.539-33.54c14.467,8.053,29.741,14.385,45.636,18.919
V512H315.66v-47.416c15.895-4.534,31.169-10.866,45.636-18.919l33.539,33.54l84.37-84.37l-33.539-33.539
c8.051-14.464,14.385-29.741,18.918-45.636H511.999z M256,421.959c-91.511,0-165.96-74.449-165.96-165.96S164.489,90.04,256,90.04
s165.96,74.449,165.96,165.96S347.512,421.959,256,421.959z"/>
</g>
</g>
</svg>
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" width="800px" height="800px" viewBox="-0.01 0 122.89 122.89" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="enable-background:new 0 0 122.88 122.89" xml:space="preserve">
<style type="text/css">
<![CDATA[
.st0{fill-rule:evenodd;clip-rule:evenodd;}
]]>
</style>
<g>
<path class="st0" d="M11.56,0h99.75c3.18,0,6.07,1.3,8.17,3.4c2.1,2.1,3.4,4.99,3.4,8.17v99.75c0,3.18-1.3,6.07-3.4,8.17 c-2.09,2.09-4.99,3.4-8.17,3.4H11.56c-3.18,0-6.07-1.3-8.17-3.4C1.3,117.39,0,114.5,0,111.32V11.56C0,8.38,1.3,5.49,3.4,3.4 C5.49,1.3,8.38,0,11.56,0L11.56,0z M57.23,72.48c-1.52-0.48-2.91-1.24-4.19-2.3c-1.36-1.13-2.58-2.57-3.66-4.36 c-0.5,0.03-0.97,0.04-1.43,0.04c-0.8,0.01-1.63-0.03-2.5-0.09c-3.42-0.25-6-1.19-8.57-2.12c-1.67-0.61-3.34-1.21-5.15-1.58 c-0.65-0.13-1.23-0.14-1.74-0.08c-0.87,0.13-1.55,0.56-2.06,1.19c-0.58,0.7-0.97,1.66-1.18,2.7c-0.23,1.15-0.25,2.41-0.07,3.59 c0.16,1.05,0.46,2.12,0.84,3.16c0.39,1.08,0.87,2.12,1.38,3.09c0.46,0.9,0.98,1.75,1.55,2.56c0.57,0.82,1.2,1.61,1.86,2.36 c2.23,2.54,4.54,4.26,6.82,5.21c2.08,0.87,4.15,1.08,6.12,0.72c1.99-0.37,3.9-1.35,5.65-2.89c2.25-1.97,4.22-4.84,5.75-8.54 c0.26-0.62,0.41-1.25,0.49-1.89C57.21,73.02,57.23,72.75,57.23,72.48L57.23,72.48L57.23,72.48z M73.98,65.82 c-0.6,1.47-1.48,2.79-2.65,3.98c-1.24,1.26-2.78,2.35-4.66,3.27c-0.02,0.5-0.04,0.97-0.09,1.43c-0.06,0.8-0.16,1.63-0.3,2.48 c-0.54,3.38-1.69,5.88-2.84,8.36c-0.75,1.62-1.49,3.22-2.01,4.99c-0.19,0.64-0.25,1.21-0.22,1.73c0.06,0.88,0.43,1.59,1.01,2.15 c0.65,0.64,1.57,1.11,2.59,1.41c1.13,0.33,2.38,0.46,3.57,0.38c1.06-0.07,2.15-0.28,3.22-0.57c1.11-0.3,2.18-0.69,3.2-1.12 c0.94-0.39,1.83-0.83,2.68-1.33c0.87-0.5,1.7-1.06,2.51-1.65c2.72-2,4.62-4.16,5.77-6.35c1.04-2,1.44-4.05,1.24-6.04 c-0.2-2.01-1.02-4-2.4-5.88c-1.77-2.41-4.47-4.62-8.02-6.45c-0.59-0.31-1.21-0.52-1.84-0.64C74.51,65.89,74.25,65.85,73.98,65.82 L73.98,65.82L73.98,65.82z M65.86,50.31c1.49,0.54,2.85,1.36,4.09,2.47c1.32,1.19,2.48,2.68,3.48,4.51c0.47,0,0.95,0.01,1.43,0.03 c0.86,0.03,1.68,0.09,2.49,0.18c3.38,0.39,5.93,1.43,8.47,2.48c1.63,0.66,3.25,1.33,5.09,1.78c0.02,0.01,0.03,0.01,0.06,0.02 c0.62,0.15,1.18,0.18,1.67,0.13c0.88-0.09,1.57-0.5,2.11-1.1c0.6-0.68,1.03-1.62,1.29-2.66c0.28-1.14,0.34-2.4,0.22-3.58 c-0.11-1.07-0.37-2.14-0.7-3.2c-0.35-1.09-0.78-2.15-1.26-3.15c-0.43-0.91-0.92-1.79-1.45-2.62c-0.53-0.82-1.12-1.63-1.76-2.43 c-2.12-2.63-4.36-4.43-6.6-5.47c-2.04-0.94-4.11-1.25-6.09-0.97c-2,0.29-3.95,1.19-5.77,2.65c-2.33,1.87-4.42,4.67-6.09,8.29 c-0.28,0.61-0.46,1.24-0.57,1.87C65.91,49.78,65.88,50.04,65.86,50.31L65.86,50.31L65.86,50.31z M68.08,55.6 c-1.54-1.54-3.67-2.49-6.02-2.49c-2.35,0-4.48,0.95-6.02,2.49c-1.54,1.54-2.49,3.67-2.49,6.02s0.95,4.48,2.49,6.01 c1.54,1.54,3.67,2.49,6.02,2.49c2.35,0,4.48-0.96,6.02-2.49c1.54-1.54,2.49-3.67,2.49-6.01S69.61,57.13,68.08,55.6L68.08,55.6 L68.08,55.6z M50.36,57.33c0.53-1.5,1.35-2.86,2.45-4.1c1.17-1.31,2.67-2.47,4.5-3.48c0-0.48,0-0.95,0.02-1.43 c0.03-0.85,0.09-1.68,0.18-2.49c0.38-3.4,1.42-5.95,2.45-8.48c0.67-1.65,1.34-3.3,1.78-5.09c0.16-0.64,0.2-1.22,0.14-1.73 c-0.09-0.87-0.51-1.57-1.11-2.11c-0.69-0.61-1.62-1.03-2.66-1.28c-1.14-0.27-2.4-0.34-3.58-0.21c-1.07,0.12-2.15,0.37-3.2,0.71 c-1.07,0.34-2.13,0.78-3.15,1.26c-0.91,0.43-1.78,0.92-2.62,1.46c-0.85,0.55-1.66,1.13-2.42,1.76c-2.63,2.13-4.43,4.37-5.47,6.63 c-0.94,2.04-1.25,4.11-0.95,6.08c0.29,2,1.19,3.95,2.66,5.76c1.88,2.32,4.68,4.41,8.31,6.08c0.61,0.28,1.24,0.46,1.86,0.56 C49.82,57.28,50.09,57.31,50.36,57.33L50.36,57.33L50.36,57.33z M61.44,15.39c25.44,0,46.06,20.62,46.06,46.06 c0,25.44-20.62,46.06-46.06,46.06c-25.44,0-46.06-20.62-46.06-46.06C15.38,36.01,36,15.39,61.44,15.39L61.44,15.39z M108.06,9.56 c3.23,0,5.84,2.62,5.84,5.84c0,3.23-2.62,5.84-5.84,5.84c-3.22,0-5.84-2.62-5.84-5.84C102.22,12.17,104.84,9.56,108.06,9.56 L108.06,9.56z M14.81,9.56c3.23,0,5.84,2.62,5.84,5.84c0,3.23-2.62,5.84-5.84,5.84c-3.23,0-5.84-2.62-5.84-5.84 C8.97,12.17,11.59,9.56,14.81,9.56L14.81,9.56z M108.06,101.73c3.23,0,5.84,2.62,5.84,5.84s-2.62,5.84-5.84,5.84 c-3.22,0-5.84-2.62-5.84-5.84S104.84,101.73,108.06,101.73L108.06,101.73z M20.66,107.57c0,3.23-2.62,5.84-5.84,5.84 c-3.23,0-5.84-2.62-5.84-5.84s2.62-5.84,5.84-5.84C18.04,101.73,20.66,104.35,20.66,107.57L20.66,107.57z"/>
</g>
</svg>
+63
View File
@@ -0,0 +1,63 @@
<?xml version="1.0" standalone="no"?>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="923.000000pt" height="923.000000pt" viewBox="0 0 923.000000 923.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,923.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M110 7235 l0 -95 293 -2 292 -3 3 -2482 2 -2483 95 0 95 0 0 2580 0
2580 -390 0 -390 0 0 -95z"/>
<path d="M1010 4750 l0 -2100 3853 0 c4175 0 3902 -3 4009 51 105 53 203 184
228 302 7 36 10 571 8 1782 l-3 1730 -33 69 c-61 129 -147 208 -271 246 -62
20 -108 20 -3927 20 l-3864 0 0 -2100z m2739 1605 c800 -165 1351 -903 1290
-1728 -58 -767 -641 -1394 -1392 -1496 -101 -14 -343 -14 -444 0 -598 81
-1118 516 -1312 1096 -264 788 98 1648 841 2003 166 79 328 126 518 150 127
15 358 4 499 -25z m3373 24 c670 -72 1232 -564 1398 -1223 40 -157 54 -294 47
-466 -9 -247 -59 -446 -167 -665 -230 -469 -669 -799 -1178 -886 -156 -26
-389 -26 -545 1 -660 112 -1172 614 -1319 1290 -19 91 -22 134 -22 325 0 190
3 234 22 322 73 334 216 598 451 834 354 353 823 521 1313 468z"/>
<path d="M3290 6081 c-34 -6 -35 -8 -47 -66 -48 -237 -39 -537 23 -798 9 -37
15 -69 13 -70 -2 -2 -27 -17 -56 -34 l-51 -31 -69 71 c-189 197 -327 419 -384
622 -13 44 -24 82 -25 83 -5 8 -95 -61 -168 -129 -96 -89 -187 -206 -255 -324
-75 -130 -75 -130 -11 -187 156 -139 411 -283 635 -357 l120 -40 3 -65 3 -64
-108 -25 c-171 -41 -257 -51 -418 -50 -139 0 -248 15 -371 49 -18 5 -20 2 -17
-28 27 -239 94 -430 215 -620 55 -86 42 -84 168 -36 206 79 443 231 606 390
l60 59 56 -33 c66 -38 66 -21 3 -214 -73 -224 -181 -416 -313 -555 -75 -80
-78 -73 43 -120 164 -64 306 -89 504 -89 94 0 132 4 139 13 36 43 62 385 43
572 -11 109 -44 306 -57 339 -4 11 85 76 105 76 14 0 154 -159 231 -261 84
-112 191 -320 222 -436 13 -46 26 -82 30 -80 4 1 45 33 92 70 97 77 208 198
271 296 45 70 115 204 115 221 0 14 -80 86 -169 151 -151 111 -336 203 -537
269 l-102 34 5 60 c3 34 8 64 12 67 10 11 175 49 284 65 141 22 399 14 515
-15 46 -12 86 -21 89 -21 12 0 -7 148 -31 242 -42 165 -131 360 -205 449 l-26
31 -65 -22 c-212 -70 -464 -225 -658 -405 -33 -30 -62 -55 -65 -55 -3 0 -28
14 -55 31 l-50 31 24 88 c66 249 189 482 340 648 36 40 65 74 63 76 -14 12
-198 78 -264 95 -145 36 -349 51 -455 32z m190 -1197 c98 -39 119 -164 39
-240 -27 -26 -37 -29 -94 -29 -57 0 -67 3 -94 29 -78 75 -61 194 34 237 50 23
64 23 115 3z"/>
<path d="M6819 6083 l-37 -4 -18 -92 c-30 -145 -27 -498 5 -667 13 -69 26
-137 28 -151 4 -21 -1 -29 -24 -41 -15 -8 -39 -22 -53 -31 -26 -17 -26 -16
-82 41 -130 134 -239 284 -311 427 -39 78 -97 237 -97 265 0 34 -17 30 -81
-17 -142 -104 -296 -290 -378 -457 l-42 -84 43 -40 c182 -167 434 -305 718
-394 l45 -15 3 -65 3 -66 -108 -25 c-276 -65 -509 -70 -719 -17 -42 11 -79 18
-82 16 -8 -9 27 -213 53 -301 29 -102 126 -306 180 -377 l35 -48 77 29 c229
85 423 204 628 386 l83 75 51 -33 c49 -31 51 -34 46 -67 -11 -65 -85 -275
-130 -366 -56 -115 -145 -249 -226 -337 -34 -37 -60 -69 -58 -71 29 -25 200
-87 314 -112 77 -17 403 -30 422 -17 43 31 68 453 39 663 -9 63 -25 150 -35
192 l-18 78 55 30 56 30 54 -52 c173 -170 327 -415 388 -618 14 -47 28 -91 30
-98 10 -35 246 179 337 306 31 44 80 124 109 178 l52 98 -55 48 c-159 144
-417 289 -643 363 l-117 39 3 65 3 66 115 27 c173 41 280 51 458 45 111 -4
182 -11 241 -26 46 -12 86 -19 89 -16 8 8 -16 165 -39 252 -38 143 -137 353
-209 441 l-20 24 -67 -22 c-210 -68 -463 -225 -646 -399 l-68 -65 -55 30 -55
29 6 40 c10 67 73 244 126 354 64 134 145 257 232 348 l68 72 -38 19 c-59 30
-212 79 -304 97 -83 16 -309 27 -380 18z m210 -1210 c65 -49 83 -122 47 -191
-46 -89 -185 -98 -244 -15 -56 79 -23 184 68 222 34 15 98 6 129 -16z"/>
<path d="M348 6231 l-33 -29 -3 -539 c-3 -477 -1 -541 13 -568 25 -48 51 -59
158 -63 l97 -4 0 616 0 616 -100 0 c-96 0 -101 -1 -132 -29z"/>
<path d="M362 4454 c-52 -36 -52 -33 -52 -594 0 -571 0 -574 59 -604 21 -11
58 -16 121 -16 l90 0 0 615 0 615 -98 0 c-72 0 -103 -4 -120 -16z"/>
<path d="M1652 2309 l3 -221 33 -29 32 -29 1661 0 c1532 0 1663 1 1689 17 16
9 33 27 39 40 7 15 11 104 11 233 l0 210 -1736 0 -1735 0 3 -221z"/>
<path d="M5310 2323 c0 -190 2 -211 20 -241 11 -18 32 -37 46 -42 14 -6 169
-10 366 -10 l340 0 34 34 34 34 0 216 0 216 -420 0 -420 0 0 -207z"/>
</g>
</svg>
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 502.664 502.664" xml:space="preserve">
<g>
<g>
<g>
<path d="M70.364,0v502.664H432.3V0H70.364z M243.966,457.732H109.536V316.185l46.981,43.53
c-15.509,6.795-26.381,22.239-26.381,40.251c0,24.202,19.673,43.897,43.94,43.897s43.918-19.673,43.918-43.897
c0-1.208-0.259-2.33-0.367-3.538c0.043-0.043,0.086-0.065,0.129-0.108l26.208,0.453
C243.966,396.773,243.966,457.732,243.966,457.732z M198.537,396.557c0.086,1.165,0.626,2.222,0.626,3.408
c0,13.848-11.238,25.065-25.087,25.065c-13.892,0-25.13-11.238-25.13-25.065c0-13.935,11.238-25.13,25.13-25.13
c2.243,0,4.228,0.733,6.32,1.273c39.755-30.415,114.778-86.52,116.267-84.903C297.936,292.672,233.223,360.728,198.537,396.557z
M272.87,339.308c47.779-52.201,42.645-58.392,39.237-62.145c-8.499-9.405-8.499-9.405-86.089,48.577l-13.331,10.181
c-63.677-16.998-110.723-74.915-110.723-143.985c0-82.422,66.826-149.248,149.162-149.248
c82.465,0,149.227,66.848,149.227,149.248C400.354,266.895,345.003,328.782,272.87,339.308z"/>
<path d="M251.127,147.544c-24.461,0-44.328,19.91-44.328,44.393c0,24.504,19.888,44.306,44.328,44.306
c24.591,0,44.393-19.824,44.393-44.306C295.498,167.476,275.653,147.566,251.127,147.544z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</g>
</svg>
+35
View File
@@ -0,0 +1,35 @@
import motherboard from './motherboard.svg'
import pcCase from './case.svg'
import cooler from './cooler.svg'
import cpu from './cpu.svg'
import fan from './fan.svg'
import ssd from './mvne.svg'
import graphicCard from './graphic-card.svg'
import hardDrive from './hard-drive.svg'
import memory from './memory.svg'
import defaultIcon from './default-icon.svg'
import powerSupply from './power-supply.svg'
import wiFiCard from './wifi-card.svg'
import siteIcon from './site-icon.svg'
import trashIcon from './trash-icon.svg'
import crossIcon from './cross-icon.svg'
import userProfileIcon from './user-profile-icon.svg'
export {
motherboard,
defaultIcon,
pcCase,
cooler,
cpu,
fan,
graphicCard,
hardDrive,
memory,
powerSupply,
wiFiCard,
siteIcon,
trashIcon,
crossIcon,
userProfileIcon,
ssd,
}
+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0" standalone="no"?>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1300.000000pt" height="1300.000000pt" viewBox="0 0 1300.000000 1300.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,1300.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M0 8101 l0 -499 233 -4 c227 -3 233 -4 289 -30 182 -84 266 -308 183
-486 -33 -71 -106 -146 -174 -179 -51 -25 -68 -28 -193 -31 l-138 -4 0 -177 0
-178 124 -6 c154 -8 214 -28 291 -98 201 -184 148 -494 -105 -612 -41 -19 -67
-22 -277 -25 l-233 -4 0 -944 0 -944 6500 0 6500 0 0 945 0 945 -209 0 c-241
0 -296 11 -381 76 -96 73 -144 169 -144 289 1 103 28 176 94 247 82 91 188
127 368 128 l72 0 0 179 0 179 -137 4 c-123 3 -143 6 -187 28 -281 144 -282
526 -1 665 l60 30 233 3 232 4 0 499 0 499 -6500 0 -6500 0 0 -499z m2790
-1046 l0 -1145 -685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0
-1145 -685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0 -1145
-685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1755 0 l0 -1140 -687 -3
-688 -2 0 1145 0 1145 688 -2 687 -3 0 -1140z m1755 0 l0 -1145 -685 0 -685 0
0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0 -1145 -685 0 -685 0 0 1145 0
1145 685 0 685 0 0 -1145z m-10512 -1817 l-3 -243 -162 -3 -163 -2 0 245 0
245 165 0 165 0 -2 -242z m510 0 l-3 -243 -162 -3 -163 -2 0 245 0 245 165 0
165 0 -2 -242z m507 -3 l0 -240 -162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0
-240z m505 0 l0 -245 -160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0
l0 -245 -160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0
-160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230
c-1 126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m510 0 l0 -245 -162 2
-163 3 -3 230 c-1 126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m505 0
l0 -240 -162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0 -240z m510 0 l0 -240
-162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0 -240z m2035 0 l0 -245 -160 0
-160 0 0 245 0 245 160 0 160 0 0 -245z m505 0 l0 -240 -162 -3 -163 -2 0 245
0 245 163 -2 162 -3 0 -240z m515 0 l0 -245 -162 2 -163 3 -3 230 c-1 126 0
235 2 242 4 10 45 13 166 13 l160 0 0 -245z m508 3 l-3 -243 -162 -3 -163 -2
0 245 0 245 165 0 165 0 -2 -242z m505 215 c0 -13 -1 -122 -2 -243 l-1 -220
-160 0 -160 0 0 245 0 245 162 -2 c161 -3 162 -3 161 -25z m507 -218 l0 -245
-160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0 -160 0
0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0 -160 0 0 245 0 245
160 0 160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230 c-1 126 0 235 2 242
4 10 45 13 166 13 l160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230 c-1
126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m-5627 142 c24 -14 58 -42
76 -62 60 -69 65 -89 69 -327 l4 -218 -281 0 -281 0 0 185 c0 101 5 206 11
234 19 92 90 175 176 207 60 23 171 13 226 -19z"/>
</g>
</svg>
+80
View File
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="256" height="256" viewBox="0 0 256 256" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<rect x="0" y="0" width="100%" height="100%" fill="transparent"></rect>
<g transform="matrix(1 0 0 1 128 128)" id="6a4920c3-39df-4c16-8c5d-5ddba5f2d73f" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-128" y="-128" rx="0" ry="0" width="256" height="256" />
</g>
<g transform="matrix(Infinity NaN NaN Infinity 0 0)" id="a6d30f70-2d9f-4631-98c0-a67b45e15f92" >
</g>
<g transform="matrix(0 -0.94 0.94 0 128 128)" >
<g style="" vector-effect="non-scaling-stroke" >
<g transform="matrix(1 0 0 1 0 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-127.95, -127.95)" d="M 137.2 25.2 C 135.89999999999998 26.5 135.89999999999998 26.7 135.89999999999998 31.2 L 135.89999999999998 35.9 L 134 35.9 L 132.2 35.9 L 132.2 33.6 C 132.2 30.700000000000003 131.29999999999998 28.900000000000002 129.39999999999998 28.1 C 126.39999999999998 26.900000000000002 123.89999999999998 29.3 123.89999999999998 33.6 L 123.89999999999998 35.9 L 122 35.9 L 120.2 35.9 L 120.2 33.199999999999996 C 120.2 30.999999999999996 120 30.199999999999996 119.2 29.299999999999997 C 117.60000000000001 27.499999999999996 115.60000000000001 27.299999999999997 113.9 28.799999999999997 C 112.60000000000001 29.9 112.5 30.299999999999997 112.30000000000001 32.9 L 112.20000000000002 35.8 L 78.2 35.8 C 59.6 35.8 37.1 35.8 28.300000000000004 35.9 L 12.300000000000004 36 L 11.2 37 L 10 38.1 L 10 133.8 L 10 229.5 L 11.3 230.8 L 12.600000000000001 232.10000000000002 L 128 232.10000000000002 L 243.3 232.10000000000002 L 244.60000000000002 230.8 L 245.90000000000003 229.5 L 245.90000000000003 133.8 L 245.90000000000003 38.1 L 244.70000000000005 37 C 243.70000000000005 35.9 243.30000000000004 35.8 238.90000000000003 35.8 L 234.30000000000004 35.8 L 234.30000000000004 33.8 C 234.30000000000004 29.599999999999998 232.20000000000005 27.099999999999998 229.20000000000005 27.799999999999997 C 227.10000000000005 28.299999999999997 226.00000000000006 29.999999999999996 226.00000000000006 33.099999999999994 L 226.00000000000006 35.8 L 224.20000000000005 35.8 L 222.40000000000003 35.8 L 222.40000000000003 31.099999999999998 C 222.40000000000003 26.599999999999998 222.40000000000003 26.4 221.10000000000002 25.099999999999998 L 219.8 23.799999999999997 L 179.20000000000002 23.799999999999997 L 138.5 23.799999999999997 L 137.2 25.2 z M 151.5 33.5 L 151.5 35.3 L 147.6 35.3 L 143.7 35.3 L 143.7 33.5 L 143.7 31.7 L 147.6 31.7 L 151.5 31.7 L 151.5 33.5 z M 167.2 33.5 L 167.2 35.3 L 163.5 35.3 L 159.8 35.3 L 159.8 33.5 L 159.8 31.7 L 163.5 31.7 L 167.2 31.7 L 167.2 33.5 z M 182.9 33.5 L 182.9 35.3 L 179.20000000000002 35.3 L 175.50000000000003 35.3 L 175.50000000000003 33.5 L 175.50000000000003 31.7 L 179.20000000000002 31.7 L 182.9 31.7 L 182.9 33.5 z M 198.5 33.5 L 198.5 35.3 L 194.8 35.3 L 191.10000000000002 35.3 L 191.10000000000002 33.5 L 191.10000000000002 31.7 L 194.8 31.7 L 198.5 31.7 L 198.5 33.5 z M 214.7 33.5 L 214.7 35.3 L 210.79999999999998 35.3 L 206.89999999999998 35.3 L 206.89999999999998 33.5 L 206.89999999999998 31.7 L 210.79999999999998 31.7 L 214.7 31.7 L 214.7 33.5 z M 41.3 75.2 C 41.3 98.7 41.4 107 41.9 107.9 C 42.6 109.5 44.5 110.4 47.1 110.4 L 49.2 110.4 L 49.2 113 C 49.2 115.2 49.400000000000006 115.7 50.5 116.9 C 53.6 120 57.5 117.5 57.5 112.5 L 57.5 110.4 L 59.3 110.4 C 61.599999999999994 110.4 63.9 109.60000000000001 64.39999999999999 108.60000000000001 C 64.69999999999999 108.00000000000001 64.89999999999999 95.7 64.89999999999999 75.70000000000002 L 64.89999999999999 43.6 L 69 43.6 L 73.1 43.6 L 73.1 87.30000000000001 C 73.1 111.4 73.19999999999999 131.4 73.39999999999999 131.8 C 73.89999999999999 132.9 76.1 133.9 78.3 133.9 L 80.39999999999999 133.9 L 80.6 136.8 C 80.8 139.20000000000002 81 139.8 82.1 140.70000000000002 C 83.89999999999999 142.20000000000002 85.8 142.10000000000002 87.5 140.4 C 88.7 139.20000000000002 88.8 138.70000000000002 88.8 136.5 L 88.8 134 L 91.6 133.8 C 93.69999999999999 133.70000000000002 94.6 133.3 95.39999999999999 132.60000000000002 L 96.39999999999999 131.50000000000003 L 96.49999999999999 87.50000000000003 L 96.59999999999998 43.50000000000003 L 167.39999999999998 43.50000000000003 L 238.2 43.50000000000003 L 238.2 134 L 238.2 224.3 L 128 224.3 L 17.8 224.3 L 17.8 222.5 L 17.8 220.7 L 22 220.7 C 26.7 220.7 28.7 220 29.4 218.1 C 30.099999999999998 216.2 30 215.1 28.5 213.7 C 27.2 212.39999999999998 27 212.39999999999998 22.5 212.39999999999998 L 17.8 212.39999999999998 L 17.8 210.59999999999997 L 17.8 208.79999999999995 L 22.5 208.79999999999995 C 27 208.79999999999995 27.2 208.79999999999995 28.5 207.49999999999994 C 30 205.99999999999994 30.2 204.79999999999995 29.1 202.79999999999995 C 28.3 201.19999999999996 27.6 200.99999999999994 22.200000000000003 200.79999999999995 L 18.1 200.69999999999996 L 18.1 198.89999999999995 L 18.1 197.09999999999994 L 22.200000000000003 196.99999999999994 C 27.6 196.79999999999995 28.300000000000004 196.59999999999994 29.1 194.99999999999994 C 30.1 192.99999999999994 30 191.89999999999995 28.5 190.29999999999995 C 27.2 188.99999999999994 27 188.99999999999994 22.5 188.99999999999994 L 17.8 188.99999999999994 L 17.8 187 L 17.8 185.2 L 22.5 185.2 C 27 185.2 27.2 185.2 28.5 183.89999999999998 C 29.9 182.49999999999997 30.1 181.49999999999997 29.4 179.49999999999997 C 28.Line truncated
</g>
<g transform="matrix(1 0 0 1 51.12 -33.24)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-179.07, -94.71)" d="M 142.5 52.4 C 140.1 53.5 137.1 56.9 136.4 59.3 C 135.6 61.9 135.6 127.39999999999999 136.4 130 C 137.1 132.4 140.20000000000002 135.8 142.5 136.9 C 144.3 137.70000000000002 146.4 137.8 179.1 137.8 C 207.5 137.8 214.1 137.70000000000002 215.3 137.20000000000002 C 217.4 136.3 220.10000000000002 133.9 221.20000000000002 131.70000000000002 L 222.20000000000002 129.8 L 222.3 95.30000000000001 C 222.4 61.000000000000014 222.4 60.90000000000001 221.4 58.60000000000001 C 220.3 56.10000000000001 217.6 53.30000000000001 215.20000000000002 52.30000000000001 C 213.9 51.70000000000001 207.70000000000002 51.70000000000001 179 51.70000000000001 C 146.4 51.5 144.3 51.6 142.5 52.4 z M 164.5 60.4 C 163.6 61.4 163.5 62 163.5 66.1 L 163.5 70.8 L 160.7 71 C 156.79999999999998 71.3 155.6 72.4 155.6 76.1 L 155.6 78.8 L 151 78.8 C 146.5 78.8 146.3 78.8 145 80.1 L 143.7 81.39999999999999 L 143.7 71.3 C 143.7 65.2 143.89999999999998 60.8 144.2 60.199999999999996 C 144.7 59.4 145.29999999999998 59.3 155.1 59.3 L 165.5 59.3 L 164.5 60.4 z M 177 59.6 C 175.7 60.1 175.1 62.5 175.1 66.7 L 175.1 70.8 L 173.29999999999998 70.8 L 171.49999999999997 70.8 L 171.49999999999997 66.2 C 171.49999999999997 61.900000000000006 171.39999999999998 61.5 170.29999999999998 60.400000000000006 L 169.2 59.2 L 173.39999999999998 59.2 C 175.7 59.4 177.3 59.5 177 59.6 z M 188.2 60.5 C 187.1 61.5 187 61.9 187 66.3 L 187 70.89999999999999 L 185.2 70.89999999999999 L 183.39999999999998 70.89999999999999 L 183.39999999999998 66.6 C 183.39999999999998 62.599999999999994 183.29999999999998 62.099999999999994 182.2 60.8 L 181 59.4 L 185.2 59.4 L 189.29999999999998 59.4 L 188.2 60.5 z M 214.2 60.2 C 214.5 60.800000000000004 214.7 65.10000000000001 214.7 71.3 L 214.7 81.39999999999999 L 213.39999999999998 80.1 C 212.09999999999997 78.8 211.89999999999998 78.8 207.39999999999998 78.8 L 202.7 78.8 L 202.7 76.3 C 202.7 72.6 201.5 71.3 197.7 71 L 194.79999999999998 70.8 L 194.79999999999998 66.3 C 194.79999999999998 62.5 194.7 61.599999999999994 193.79999999999998 60.599999999999994 L 192.89999999999998 59.39999999999999 L 203.29999999999998 59.39999999999999 C 213.1 59.3 213.7 59.4 214.2 60.2 z M 194.8 94.6 L 194.8 110.39999999999999 L 179.10000000000002 110.39999999999999 L 163.40000000000003 110.39999999999999 L 163.40000000000003 94.6 L 163.40000000000003 78.8 L 179.10000000000002 78.8 L 194.8 78.8 L 194.8 94.6 z M 150.8 86.9 L 155.70000000000002 87.10000000000001 L 155.70000000000002 88.9 L 155.70000000000002 90.7 L 150.9 90.7 C 146.3 90.7 146 90.8 144.9 91.9 L 143.70000000000002 93 L 143.70000000000002 88.6 L 143.70000000000002 84.19999999999999 L 144.8 85.49999999999999 C 145.8 86.7 146.1 86.7 150.8 86.9 z M 214.7 88.6 L 214.7 93.1 L 213.5 91.89999999999999 C 212.3 90.69999999999999 212 90.69999999999999 207.5 90.69999999999999 L 202.7 90.69999999999999 L 202.7 88.89999999999999 L 202.7 87.1 L 207.6 86.89999999999999 C 212.29999999999998 86.8 212.5 86.69999999999999 213.5 85.49999999999999 C 214.1 84.79999999999998 214.6 84.29999999999998 214.7 84.29999999999998 C 214.6 84.2 214.7 86.2 214.7 88.6 z M 150.8 98.5 L 155.60000000000002 98.5 L 155.60000000000002 100.3 L 155.60000000000002 102.1 L 150.70000000000002 102.3 C 146.00000000000003 102.39999999999999 145.8 102.5 144.70000000000002 103.7 L 143.60000000000002 105 L 143.60000000000002 100.6 L 143.60000000000002 96.19999999999999 L 144.8 97.29999999999998 C 145.9 98.4 146.3 98.5 150.8 98.5 z M 214.7 100.6 L 214.7 105 L 213.6 103.7 C 212.5 102.5 212.29999999999998 102.4 207.6 102.3 L 202.7 102.1 L 202.7 100.3 L 202.7 98.5 L 207.5 98.5 C 212 98.5 212.3 98.5 213.4 97.3 C 214 96.7 214.6 96.1 214.6 96.1 C 214.6 96.2 214.7 98.2 214.7 100.6 z M 151 110.5 L 155.7 110.5 L 155.7 113.2 C 155.7 116.8 156.89999999999998 118 160.79999999999998 118.3 L 163.6 118.5 L 163.6 123.2 C 163.6 127.3 163.7 127.9 164.6 128.9 L 165.6 130 L 155.2 130 C 145.39999999999998 130 144.7 130 144.29999999999998 129.1 C 143.99999999999997 128.5 143.79999999999998 124.19999999999999 143.79999999999998 118 L 143.79999999999998 107.9 L 145.1 109.2 C 146.3 110.4 146.5 110.5 151 110.5 z M 214.2 128.9 C 213.7 129.8 213.2 129.8 203.29999999999998 129.8 L 192.89999999999998 129.8 L 193.79999999999998 128.60000000000002 C 194.6 127.50000000000003 194.79999999999998 126.70000000000002 194.79999999999998 122.90000000000002 L 194.79999999999998 118.40000000000002 L 197.7 118.20000000000002 C 201.39999999999998 117.90000000000002 202.7 116.60000000000002 202.7 112.90000000000002 L 202.7 110.40000000000002 L 207.39999999999998 110.40000000000002 C 211.79999999999998 110.40000000000002 212.09999999999997 110.40000000000002 213.29999999999998 109.10000000000002 L 214.4999999999999Line truncated
</g>
<g transform="matrix(1 0 0 1 -7.85 -53.2)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-120.1, -74.75)" d="M 118.3 71.5 C 114.8 73.4 116.2 78.6 120.2 78.6 C 122.3 78.6 123.9 77.1 123.9 75.1 C 123.9 73 123.5 72.19999999999999 122 71.5 C 120.4 70.7 119.8 70.7 118.3 71.5 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -19.54 -45.29)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-108.41, -82.66)" d="M 107 79.1 C 103.2 80.69999999999999 104.1 86.5 108.2 86.5 C 110.4 86.5 111.8 85.3 112.2 83.2 C 112.6 80.4 109.6 78 107 79.1 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 102.22 -45.18)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-230.17, -82.77)" d="M 228.4 79.4 C 226.6 80.4 225.9 82.5 226.6 84.2 C 228.2 88.10000000000001 234 87 234 82.8 C 234 79.9 230.9 78 228.4 79.4 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -7.9 -41.21)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-120.05, -86.74)" d="M 117.6 83.9 C 114.89999999999999 86.2 116.69999999999999 90.60000000000001 120.19999999999999 90.60000000000001 C 122.19999999999999 90.60000000000001 123.79999999999998 88.80000000000001 123.79999999999998 86.7 C 123.9 83.3 120.2 81.7 117.6 83.9 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -19.51 -29.39)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-108.44, -98.56)" d="M 105.5 96 C 104.3 97.5 104.3 99.3 105.3 100.7 C 107.7 104.2 113.1 101.7 112.2 97.5 C 111.5 94.7 107.2 93.8 105.5 96 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -7.89 -29.35)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-120.06, -98.6)" d="M 117.7 95.4 C 115.4 97.2 116 101.2 118.7 102.10000000000001 C 120.4 102.7 121.3 102.50000000000001 122.8 101.10000000000001 C 124.2 99.80000000000001 124.2 97.10000000000001 122.8 95.80000000000001 C 121.6 94.7 119 94.4 117.7 95.4 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -7.88 -17.75)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-120.07, -110.2)" d="M 117.6 107.4 C 113.8 110.60000000000001 118.69999999999999 116.2 122.69999999999999 113.2 C 123.6 112.5 123.89999999999999 111.9 123.89999999999999 110.4 C 123.9 106.8 120.3 105.1 117.6 107.4 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 102.2 -17.71)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-230.15, -110.24)" d="M 227.7 107.4 C 225 109.7 226.79999999999998 114.10000000000001 230.29999999999998 114.10000000000001 C 232.29999999999998 114.10000000000001 233.89999999999998 112.30000000000001 233.89999999999998 110.2 C 234 106.8 230.3 105.2 227.7 107.4 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -102.18 -9.87)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-25.77, -118.08)" d="M 24.1 114.7 C 21.700000000000003 116 21.200000000000003 118.9 23.200000000000003 120.8 C 24.6 122.3 26.700000000000003 122.3 28.300000000000004 120.8 C 31.6 118 27.9 112.6 24.1 114.7 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -7.97 -5.88)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-119.98, -122.07)" d="M 117.5 119.3 C 116.1 120.89999999999999 115.8 122.2 116.6 123.7 C 117.6 125.60000000000001 119.6 126.4 121.5 125.60000000000001 C 123.2 124.9 123.8 123.9 123.8 121.80000000000001 C 123.9 118.7 119.7 117 117.5 119.3 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -102.2 2.04)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-25.75, -129.99)" d="M 23.2 127.1 C 22.3 127.8 22 128.5 22 129.6 C 22 131.79999999999998 22.4 132.6 23.9 133.29999999999998 C 26.599999999999998 134.7 29.5 132.99999999999997 29.5 129.99999999999997 C 29.5 126.7 25.9 125 23.2 127.1 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -76.7 11.7)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-51.25, -139.65)" d="M 38.8 127.3 L 37.599999999999994 128.4 L 37.599999999999994 139.6 C 37.599999999999994 150.29999999999998 37.599999999999994 150.9 38.599999999999994 152.1 L 39.49999999999999 153.29999999999998 L 51.19999999999999 153.29999999999998 C 62.69999999999999 153.29999999999998 62.89999999999999 153.29999999999998 63.79999999999999 152.2 C 64.69999999999999 151.2 64.79999999999998 150.7 64.89999999999999 139.7 L 64.89999999999999 128.2 L 63.69999999999999 127.1 C 62.499999999999986 126 62.29999999999999 126 51.19999999999999 126 L 39.9 126 L 38.8 127.3 z M 57 139.8 L 57 145.60000000000002 L 51.2 145.60000000000002 L 45.400000000000006 145.60000000000002 L 45.400000000000006 139.8 L 45.400000000000006 134 L 51.2 134 L 57 134 L 57 139.8 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -7.89 5.84)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-120.06, -133.79)" d="M 118.5 130.3 C 117.2 130.9 115.9 133.3 116.3 134.60000000000002 C 116.89999999999999 136.50000000000003 118.39999999999999 137.70000000000002 120.2 137.70000000000002 C 122.3 137.70000000000002 123.9 136.20000000000002 123.9 134.20000000000002 C 123.9 132.10000000000002 123.5 131.3 122 130.60000000000002 C 120.5 129.7 119.9 129.7 118.5 130.3 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -102.11 13.63)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-25.84, -141.58)" d="M 24.1 138.2 C 22.6 139 22 140 22 141.79999999999998 C 22 146.39999999999998 28.2 146.79999999999998 29.6 142.39999999999998 C 30 141.09999999999997 28.900000000000002 138.89999999999998 27.3 138.2 C 25.8 137.5 25.3 137.5 24.1 138.2 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 39.39 53.13)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-167.34, -181.08)" d="M 114.8 146 C 113.1 146.6 112.3 148.3 112.3 150.9 L 112.3 153.3 L 110 153.3 C 107.5 153.3 105.2 154.20000000000002 104.7 155.4 C 103.4 158.9 105.60000000000001 161.6 109.8 161.6 L 112.3 161.6 L 112.3 165.29999999999998 L 112.3 168.99999999999997 L 109.8 168.99999999999997 C 105.7 168.99999999999997 103.39999999999999 171.79999999999998 104.7 175.19999999999996 C 105.2 176.39999999999995 107.4 177.29999999999995 110 177.29999999999995 L 112.3 177.29999999999995 L 112.3 180.89999999999995 L 112.3 184.49999999999994 L 109.5 184.69999999999993 C 107.4 184.79999999999993 106.5 185.19999999999993 105.6 185.99999999999994 C 104.39999999999999 187.09999999999994 104.1 189.09999999999994 104.69999999999999 190.79999999999995 C 105.19999999999999 191.99999999999994 107.39999999999999 192.89999999999995 109.99999999999999 192.89999999999995 L 112.29999999999998 192.89999999999995 L 112.19999999999999 196.69999999999996 L 112.1 200.49999999999997 L 109.3 200.59999999999997 C 105.8 200.79999999999995 104.5 201.79999999999995 104.5 204.49999999999997 C 104.5 207.29999999999998 106 208.59999999999997 109.6 208.59999999999997 L 112.39999999999999 208.59999999999997 L 112.39999999999999 211.19999999999996 C 112.39999999999999 213.99999999999997 112.89999999999999 214.99999999999997 114.6 215.89999999999995 C 115.3 216.29999999999995 129 216.49999999999994 167.7 216.49999999999994 L 219.89999999999998 216.49999999999994 L 221.2 215.19999999999993 C 222.39999999999998 213.99999999999994 222.5 213.49999999999994 222.5 211.29999999999993 L 222.5 208.69999999999993 L 225.1 208.69999999999993 C 227.29999999999998 208.69999999999993 227.79999999999998 208.49999999999994 229 207.39999999999992 C 230.7 205.5999999999999 230.8 203.5999999999999 229.2 202.0999999999999 C 228.29999999999998 201.0999999999999 227.6 200.89999999999992 225.29999999999998 200.89999999999992 L 222.49999999999997 200.89999999999992 L 222.49999999999997 196.99999999999991 L 222.49999999999997 193 L 225.09999999999997 193 C 227.29999999999995 193 227.79999999999995 192.8 228.99999999999997 191.7 C 230.69999999999996 190 230.79999999999998 188.1 229.29999999999998 186.29999999999998 C 228.39999999999998 185.2 227.7 184.99999999999997 225.39999999999998 184.79999999999998 L 222.49999999999997 184.6 L 222.49999999999997 181 L 222.49999999999997 177.4 L 225.09999999999997 177.4 C 227.29999999999995 177.4 227.79999999999995 177.20000000000002 228.99999999999997 176.1 C 230.69999999999996 174.4 230.79999999999998 172.5 229.29999999999998 170.7 C 228.39999999999998 169.6 227.7 169.39999999999998 225.39999999999998 169.2 L 222.49999999999997 169 L 222.49999999999997 165.4 L 222.49999999999997 161.8 L 225.39999999999998 161.60000000000002 C 227.79999999999998 161.40000000000003 228.39999999999998 161.20000000000002 229.29999999999998 160.10000000000002 C 230.79999999999998 158.3 230.7 156.40000000000003 228.99999999999997 154.70000000000002 C 227.79999999999998 153.50000000000003 227.29999999999998 153.4 225.09999999999997 153.4 L 222.59999999999997 153.4 L 222.39999999999998 150.6 C 222.29999999999998 148.5 221.89999999999998 147.6 221.2 146.79999999999998 L 220.1 145.79999999999998 L 167.89999999999998 145.7 C 139.2 145.6 115.3 145.7 114.8 146 z M 123.9 157.3 L 123.9 161.20000000000002 L 122 161.20000000000002 L 120.2 161.20000000000002 L 120.2 157.3 L 120.2 153.4 L 122 153.4 L 123.8 153.4 L 123.8 157.3 z M 202.7 157.3 L 202.7 161.20000000000002 L 167.39999999999998 161.20000000000002 L 132.09999999999997 161.20000000000002 L 132.09999999999997 157.3 L 132.09999999999997 153.4 L 167.39999999999998 153.4 L 202.7 153.4 L 202.7 157.3 L 202.7 157.3 z M 214.5 157.4 L 214.6 161.20000000000002 L 212.5 161.20000000000002 L 210.5 161.20000000000002 L 210.5 157.60000000000002 C 210.5 155.60000000000002 210.6 153.8 210.8 153.60000000000002 C 211 153.40000000000003 211.9 153.3 212.8 153.40000000000003 L 214.4 153.50000000000003 L 214.5 157.4 z M 123.9 173.2 L 123.9 176.89999999999998 L 122 176.89999999999998 L 120.2 176.89999999999998 L 120.2 173.2 L 120.2 169.5 L 122 169.5 L 123.8 169.5 L 123.8 173.2 z M 202.7 173.2 L 202.7 176.89999999999998 L 167.39999999999998 176.89999999999998 L 132.09999999999997 176.89999999999998 L 132.09999999999997 173.2 L 132.09999999999997 169.5 L 167.39999999999998 169.5 L 202.7 169.5 L 202.7 173.2 L 202.7 173.2 z M 214.6 173.2 L 214.6 176.89999999999998 L 212.6 176.89999999999998 L 210.6 176.89999999999998 L 210.6 173.2 L 210.6 169.5 L 212.6 169.5 L 214.6 169.5 L 214.6 173.2 z M 123.9 188.8 L 123.9 192.5 L 122 192.5 L 120.2 192.5 L 120.2 188.8 L 120.2 185.10000000000002 L 122 185.10000000000002 L 123.8 185.10000000000002 L 123.8 188.8 z M 202.7 188.8 L 202.7 192.Line truncated
</g>
<g transform="matrix(1 0 0 1 -66.82 37.45)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-61.13, -165.4)" d="M 59.5 161.9 C 56.5 163.1 56.7 167.9 59.8 169 C 62.4 169.9 64.89999999999999 168.1 64.89999999999999 165.4 C 64.9 162.5 62.1 160.8 59.5 161.9 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -55.04 37.37)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-72.91, -165.32)" d="M 71.9 161.6 C 71.30000000000001 161.7 70.4 162.29999999999998 69.9 162.9 C 67.80000000000001 165.5 69.60000000000001 169.1 72.9 169.1 C 74.30000000000001 169.1 75 168.79999999999998 75.80000000000001 167.9 C 78.3 164.9 75.9 161 71.9 161.6 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -43.06 37.33)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-84.89, -165.28)" d="M 83.8 161.5 C 80.1 162.9 80.2 167.8 83.89999999999999 169.2 C 84.39999999999999 169.39999999999998 85.39999999999999 169.2 86.3 168.89999999999998 C 89.5 167.59999999999997 89.5 163.2 86.3 161.89999999999998 C 85.39999999999999 161.49999999999997 84.7 161.29999999999998 84.6 161.29999999999998 C 84.5 161.2 84.1 161.4 83.8 161.5 z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -54.9 66.85)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-73.05, -194.8)" d="M 58.8 178 C 57.699999999999996 178.8 57 180.7 57 182.9 C 57 184.70000000000002 57 184.70000000000002 55.2 184.70000000000002 C 49.900000000000006 184.70000000000002 47.400000000000006 188.50000000000003 50.5 191.70000000000002 C 51.7 192.9 52.2 193.00000000000003 54.4 193.00000000000003 L 57 193.00000000000003 L 57 194.80000000000004 L 57 196.60000000000005 L 54.4 196.60000000000005 C 52.199999999999996 196.60000000000005 51.699999999999996 196.80000000000004 50.5 197.90000000000006 C 49 199.40000000000006 48.8 200.60000000000005 49.9 202.50000000000006 C 50.6 204.00000000000006 52.6 204.90000000000006 55.199999999999996 204.90000000000006 L 56.99999999999999 204.90000000000006 L 57.199999999999996 207.40000000000006 C 57.3 209.20000000000007 57.699999999999996 210.30000000000007 58.49999999999999 211.10000000000005 L 59.599999999999994 212.30000000000004 L 73.1 212.30000000000004 L 86.6 212.30000000000004 L 87.69999999999999 211.10000000000005 C 88.49999999999999 210.30000000000004 88.89999999999999 209.30000000000004 88.99999999999999 207.40000000000006 L 89.19999999999999 204.90000000000006 L 90.99999999999999 204.90000000000006 C 96.19999999999999 204.90000000000006 98.69999999999999 201.10000000000005 95.59999999999998 197.90000000000006 C 94.39999999999998 196.70000000000007 93.89999999999998 196.60000000000005 91.69999999999997 196.60000000000005 L 89.09999999999998 196.60000000000005 L 89.09999999999998 194.80000000000004 L 89.09999999999998 193 L 91.69999999999997 193 C 93.89999999999998 193 94.39999999999998 192.8 95.59999999999998 191.7 C 98.69999999999997 188.6 96.19999999999997 184.7 90.89999999999998 184.7 C 89.09999999999998 184.7 89.09999999999998 184.7 89.09999999999998 182.89999999999998 C 89.09999999999998 180.59999999999997 88.29999999999998 178.29999999999998 87.29999999999998 177.79999999999998 C 85.6 177 59.7 177.2 58.8 178 z M 80.8 194.8 L 80.8 204.5 L 72.89999999999999 204.5 L 64.89999999999999 204.5 L 64.89999999999999 194.8 L 64.89999999999999 185.10000000000002 L 72.8 185.10000000000002 L 80.7 185.10000000000002 L 80.7 194.8 L 80.8 194.8 z" stroke-linecap="round" />
</g>
</g>
</g>
</svg>
+271
View File
@@ -0,0 +1,271 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1013.000000pt" height="1013.000000pt" viewBox="0 0 1013.000000 1013.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,1013.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M167 6653 c-4 -3 -7 -262 -7 -575 l0 -568 28 0 c16 0 57 -14 91 -31
96 -48 141 -122 141 -233 0 -121 -78 -218 -201 -249 l-54 -14 0 -569 0 -569
4690 0 4690 0 3 21 c2 12 17 34 33 50 l30 29 220 3 219 3 0 205 0 204 -221 0
-221 0 -29 29 c-35 36 -41 80 -16 129 23 47 50 52 277 52 l210 0 0 989 c0 892
-2 989 -16 995 -9 3 -109 6 -223 6 l-207 0 -26 28 c-14 15 -28 36 -30 47 -3
20 -12 20 -4689 23 -2577 1 -4689 -1 -4692 -5z m9059 -199 c19 -9 44 -31 57
-48 l22 -31 0 -1085 0 -1085 -22 -31 c-49 -69 82 -64 -1703 -64 -1785 0 -1654
-5 -1703 64 l-22 31 0 1085 0 1085 22 31 c49 68 -84 64 1701 64 1469 0 1617
-1 1648 -16z m759 -19 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135
45 l128 -3 0 -30z m-9115 -61 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3
37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15
-21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42
-13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1 c0 -38 -3
-45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m108 3
c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17
-42z m110 0 c-2 -30 -8 -44 -19 -46 -13 -2 -18 7 -21 35 -6 46 -3 53 23 53 17
0 20 -6 17 -42z m110 0 c-2 -35 -7 -43 -23 -43 -16 0 -21 8 -23 43 -3 39 -2
42 23 42 25 0 26 -3 23 -42z m107 -3 c0 -33 -3 -40 -20 -40 -16 0 -21 8 -23
43 -3 40 -2 43 20 40 20 -3 23 -9 23 -43z m105 -1 c0 -38 -3 -45 -17 -42 -13
2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1 c0 -38 -3 -45
-20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 -1 c0
-38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z
m650 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21
-6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17
42 18 0 21 -6 21 -46z m108 4 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0
40 3 46 21 46 18 0 20 -5 17 -42z m112 -3 c0 -38 -3 -45 -20 -45 -17 0 -20 7
-20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m108 3 c-2 -31 -8 -44 -20 -46 -15
-3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2 -31 -8 -44
-20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2
-31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z
m110 0 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20
-5 17 -42z m107 -3 c0 -33 -3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25
55 14 -2 18 -13 18 -43z m105 -1 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46
-3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19
15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m650 0 c0 -38 -3 -45 -17 -42
-13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3
-45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0
c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21
-46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18
0 21 -6 21 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m108 3 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42
0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2 -35 -7 -43 -23 -43 -15 0 -21
8 -23 28 -5 40 4 57 28 57 19 0 21 -5 18 -42z m107 -3 c0 -33 -3 -40 -20 -40
-16 0 -21 8 -23 43 -3 40 -2 43 20 40 20 -3 23 -9 23 -43z m105 -1 c0 -38 -3
-45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1
c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
20 -45z m4546 -50 c13 -52 5 -55 -131 -55 -136 0 -144 3 -131 55 6 25 6 25
131 25 125 0 125 0 131 -25z m-7958 -31 l22 -6 0 -999 0 -999 -652 2 -653 3
-3 1003 -2 1002 632 0 c348 0 643 -3 656 -6z m1764 -22 c9 -32 8 -1957 -1
-1970 -6 -9 -149 -12 -657 -10 l-649 3 -3 985 c-1 542 0 991 3 998 3 9 143 12
654 12 622 0 649 -1 653 -18z m1738 -982 l0 -1000 -652 2 -653 3 -3 985 c-1
542 0 991 3 998 3 9 144 12 655 12 l650 0 0 -1000z m4451 923 c6 -6 9 -21 7
-34 -3 -24 -4 -24 -133 -24 l-130 0 0 30 c0 30 1 30 65 36 92 8 179 4 191 -8z
m-9281 -33 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45
-3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20
38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4
17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46
21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0 -18 -5 -20 -42 -17 -31 2
-44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42
-17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m-4962 -97 c3
-22 0 -23 -40 -20 -31 2 -44 8 -46 20 -2 12 5 18 25 21 46 7 58 3 61 -21z
m1475 19 c4 -1 7 -10 7 -21 0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 19 0 11 8
21 18 23 15 3 26 3 65 -1z m265 -18 c3 -21 -1 -23 -37 -23 -42 0 -57 11 -47
36 4 11 17 14 43 12 31 -2 39 -7 41 -25z m1480 -1 c3 -19 -1 -22 -37 -22 -41
0 -57 11 -48 34 3 7 20 12 43 11 32 -2 40 -6 42 -23z m246 22 c9 -3 16 -15 16
-25 0 -16 -7 -19 -40 -19 -28 0 -43 5 -47 16 -10 26 32 43 71 28z m1494 -23
c3 -20 0 -22 -40 -19 -30 2 -44 8 -46 20 -2 11 5 18 20 21 43 7 63 1 66 -22z
m4327 -21 l0 -35 -130 0 c-128 0 -130 0 -133 23 -7 51 -2 53 135 50 l128 -3 0
-35z m-9285 -75 c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15
36 0 40 -2 40 -25z m1480 0 c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10
20 15 46 15 36 0 40 -2 40 -25z m260 0 c0 -22 -4 -25 -39 -25 -42 0 -57 11
-47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m1480 0 c0 -22 -4 -25 -39 -25
-42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m260 0 c0 -22 -4
-25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m1480 0
c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40
-25z m4325 -50 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45 l128
-3 0 -30z m-9287 -47 c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11 19
16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9
-48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m260 0 c-2 -18 -11 -24 -37 -26
-38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1477 -3 c0 -15 -8
-21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m263 3
c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11 19 16 47 16 37 0 41 -2 38
-22z m1477 -3 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30
-2 38 -7 38 -23z m4331 -60 c13 -53 6 -56 -133 -53 -125 3 -128 3 -131 26 -7
50 -1 52 132 52 126 0 126 0 132 -25z m-9291 -40 c0 -15 -8 -21 -34 -23 -38
-4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m1480 0 c0 -15 -8 -21
-34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m265 0 c0
-22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z
m1475 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38
-7 38 -23z m260 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43
13 30 -2 38 -7 38 -23z m1480 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4
12 16 15 43 13 30 -2 38 -7 38 -23z m4325 -69 c6 -8 10 -25 8 -38 -3 -23 -5
-23 -133 -23 l-130 0 -3 24 c-6 41 20 51 139 51 81 0 109 -3 119 -14z m-9280
-26 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38
-20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0
38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52
27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21
11 27 52 27 31 0 38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45
13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0
-45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20
-45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0
-17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z
m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3
38 -20z m1478 -2 c3 -15 -4 -18 -42 -18 -32 0 -46 4 -46 13 0 22 12 28 50 25
24 -2 36 -9 38 -20z m262 2 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11
27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45
13 0 21 11 27 52 27 31 0 38 -3 38 -20z m4328 -18 c6 -42 -11 -49 -123 -51
-59 -1 -113 3 -125 9 -19 10 -27 49 -13 64 4 3 63 5 132 4 123 -3 126 -4 129
-26z m-9288 -82 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38
0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20
45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0
21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -39 -20 -40 0 -57
11 -46 30 3 6 24 10 46 10 32 0 39 -3 39 -20z m260 0 c0 -17 -7 -20 -45 -20
-31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7
-20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m4325
-55 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45 l128 -3 0 -30z
m-9285 -45 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45
-3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20
38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4
17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -39 -20 -40 0 -57 11 -46
30 3 6 24 10 46 10 32 0 39 -3 39 -20z m260 0 c0 -17 -7 -20 -45 -20 -38 0
-45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m4328 -68 c7 -45
-12 -52 -128 -52 -60 0 -115 3 -124 6 -16 6 -22 54 -9 68 4 3 63 5 132 4 123
-3 126 -4 129 -26z m-9288 -33 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3
14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20 -38 0 -45 3
-45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31
2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0
-18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
-3 46 -21z m4320 -73 c6 -8 10 -25 8 -38 -3 -23 -5 -23 -133 -23 -128 0 -130
0 -133 23 -7 45 12 52 133 52 86 0 115 -3 125 -14z m-9280 -27 c0 -18 -5 -20
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0
-17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z
m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
-3 46 -21z m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42
17 40 0 46 -3 46 -21z m260 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14
4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45
20 0 17 7 20 45 20 38 0 45 -3 45 -20z m-4960 -100 c0 -17 -7 -20 -45 -20 -38
0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7
-20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0
c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z
m260 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3
45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38
0 45 -3 45 -20z m4325 -25 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48
135 45 l128 -3 0 -30z m-6065 -76 c0 -15 -7 -19 -39 -19 -41 0 -57 11 -48 33
3 8 19 11 46 9 32 -3 41 -8 41 -23z m-3220 0 c0 -18 -5 -20 -42 -17 -31 2 -44
8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20
-38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1740 0 c0
-18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
-3 46 -21z m4325 -54 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45
l128 -3 0 -30z m-6065 -46 c0 -15 -7 -19 -39 -19 -41 0 -57 11 -48 33 3 8 19
11 46 9 32 -3 41 -8 41 -23z m1740 0 c0 -17 -6 -20 -42 -17 -31 2 -44 8 -46
20 -2 13 5 17 35 20 47 4 53 2 53 -23z m-4960 0 c0 -18 -5 -20 -42 -17 -31 2
-44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42
-17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0 -18 -5
-20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1740 0
c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
m5808 -67 c7 -45 -12 -52 -132 -52 -74 0 -116 4 -124 12 -13 13 -16 51 -5 62
4 3 63 5 132 4 123 -3 126 -4 129 -26z m-9290 -24 c-2 -18 -11 -24 -37 -26
-38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11
-24 -37 -26 -38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m262 -3
c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40
-25z m1478 3 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9 -48 32 4 11 19 16 47 16
37 0 41 -2 38 -22z m260 0 c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11
19 16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9
-48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m4328 -83 c4 -8 3 -26 0 -40 l-7
-26 -127 3 -127 3 -3 29 c-2 16 2 32 10 37 7 5 66 9 131 9 95 0 119 -3 123
-15z m-9286 -14 c0 -12 -9 -20 -26 -24 -34 -6 -64 2 -64 17 0 20 11 26 52 26
31 0 38 -4 38 -19z m1478 -3 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9 -48 32 4
11 19 16 47 16 37 0 41 -2 38 -22z m260 0 c-2 -17 -10 -24 -33 -26 -37 -3 -60
11 -52 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1480 0 c2 -12 -6 -19 -33 -24
-40 -7 -61 5 -51 31 8 23 80 17 84 -7z m260 0 c-2 -16 -11 -23 -33 -25 -37 -4
-60 10 -52 31 4 11 19 16 47 16 37 0 41 -2 38 -22z m1477 -3 c0 -16 -7 -20
-37 -22 -40 -2 -53 8 -44 33 4 11 17 14 43 12 30 -2 38 -7 38 -23z m-4955 -95
c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z
m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38
-3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27
31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11
27 52 27 31 0 38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13
0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45
4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20 -45
-20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17
-7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m260
0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38
-20z m1478 -2 c3 -15 -4 -18 -42 -18 -32 0 -46 4 -46 13 0 22 12 28 50 25 24
-2 36 -9 38 -20z m262 2 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27
52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0
21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20 -45 -20 -38 0
-45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7
-20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0
c0 -17 -7 -20 -39 -20 -40 0 -57 11 -46 30 3 6 24 10 46 10 32 0 39 -3 39 -20z
m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3
38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27
31 0 38 -3 38 -20z m4320 -94 c6 -8 10 -25 8 -38 -3 -23 -5 -23 -133 -23 -128
0 -130 0 -133 23 -7 45 12 52 133 52 86 0 115 -3 125 -14z m-9110 -101 c0 -38
-3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0 13 -14 13 -45z m110 0
c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m108 -3 c3 -36 0 -42 -16 -42 -15 0 -21 9 -25 37 -7
42 -2 55 21 51 12 -2 18 -16 20 -46z m107 3 c0 -33 -3 -40 -20 -40 -15 0 -21
8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z m110 0 c0 -34 -3 -40 -22 -43
-21 -3 -23 1 -23 36 0 43 7 54 30 50 10 -2 15 -15 15 -43z m105 0 c0 -38 -3
-45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0
-38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
20 -45z m650 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0
38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7
-20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17
0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20
-45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m105 0 c0 -30 -4
-41 -17 -43 -15 -3 -18 4 -18 43 0 39 3 46 18 43 13 -2 17 -13 17 -43z m110 0
c0 -30 -4 -41 -17 -43 -15 -3 -18 4 -18 43 0 39 3 46 18 43 13 -2 17 -13 17
-43z m110 0 c0 -33 -3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2
18 -13 18 -43z m105 -1 c0 -38 -3 -45 -17 -42 -32 6 -30 88 2 88 11 0 15 -11
15 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m650 -1 c0 -38 -3 -45 -17 -42 -32 6 -30 88 2 88 11 0 15 -11
15 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0
13 -14 13 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20
45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38
3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20
45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0
-20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m105 0 c0 -33 -3 -40 -20
-40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z m110 0 c0 -33
-3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z
m105 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0 13 -14
13 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m4548 -46 c5 -43 -15 -50 -144 -47 -116 3 -119 4
-122 26 -7 51 -2 53 135 50 l128 -3 3 -26z m-2 -114 c13 -53 6 -56 -133 -53
-125 3 -128 3 -131 26 -7 50 -1 52 132 52 126 0 126 0 132 -25z"/>
<path d="M6090 5300 l0 -480 85 0 85 0 0 332 c0 188 4 328 9 323 8 -9 107
-286 198 -552 l35 -103 109 0 109 0 0 480 0 480 -85 0 -85 0 0 -315 c0 -173
-4 -315 -8 -315 -8 0 -55 125 -177 475 l-53 150 -111 3 -111 3 0 -481z"/>
<path d="M6800 5772 c0 -4 23 -106 50 -227 28 -121 76 -330 106 -465 31 -135
58 -248 61 -252 2 -5 59 -8 127 -8 l123 0 51 228 c28 125 76 337 107 471 30
134 55 247 55 252 0 5 -44 9 -99 9 l-98 0 -68 -345 c-38 -190 -71 -345 -75
-345 -3 0 -34 152 -69 338 -35 185 -65 340 -68 345 -6 10 -203 9 -203 -1z"/>
<path d="M7560 5300 l0 -480 90 0 90 0 1 368 c0 225 4 359 9 347 5 -11 25 -96
45 -190 20 -93 54 -248 76 -343 21 -96 39 -176 39 -178 0 -2 35 -4 78 -4 l77
0 79 358 c43 196 82 364 87 372 5 8 9 -151 9 -357 l0 -373 90 0 90 0 -2 478
-3 477 -142 3 c-128 2 -142 1 -147 -15 -8 -27 -62 -289 -96 -468 -18 -88 -36
-164 -41 -169 -5 -6 -9 -7 -9 -3 0 10 -120 619 -126 640 -5 15 -21 17 -150 17
l-144 0 0 -480z"/>
<path d="M8683 5544 c-57 -21 -118 -89 -138 -156 -9 -29 -19 -102 -22 -163
-10 -199 27 -328 111 -384 35 -23 52 -26 139 -29 54 -2 114 -1 133 3 72 13
140 101 151 196 l6 49 -87 0 -86 0 0 -27 c0 -40 -35 -91 -66 -99 -70 -18 -114
40 -114 148 l0 68 178 2 177 3 0 100 c-1 164 -52 263 -151 293 -55 16 -179 14
-231 -4z m184 -140 c9 -15 19 -53 21 -85 l4 -59 -92 0 -92 0 4 60 c6 79 33
110 95 110 35 0 46 -5 60 -26z"/>
</g>
</svg>
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1080" height="1080" viewBox="0 0 1080 1080" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<g transform="matrix(1 0 0 1 540 540)" id="67f78da0-5e9d-4333-b8b9-8faaa9c6791d" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-540" y="-540" rx="0" ry="0" width="1080" height="1080" />
</g>
<g transform="matrix(1 0 0 1 540 540)" id="6fd75371-cd76-47c5-a752-7df1f9cbc828" >
</g>
<g transform="matrix(1 0 0 1 540 540)" >
<g style="" vector-effect="non-scaling-stroke" >
<g transform="matrix(0.13 0 0 -0.13 -179.33 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3655, -5802.99)" d="M 3650 9084 C 2360 8868 1304 8691 1303 8691 C 1301 8690 1300 7435 1300 5900 L 1300 3110 L 1348 3110 C 1374 3110 2253 3074 3303 3030 C 4818 2967 5216 2947 5238 2936 C 5346 2879 5367 2745 5279 2665 C 5258 2646 5228 2627 5213 2624 C 5188 2617 1547 2762 1373 2776 L 1300 2782 L 1300 2611 C 1300 2517 1301 2440 1303 2439 C 1317 2435 5997 2124 6003 2127 C 6007 2129 6010 3785 6010 5806 C 6010 7827 6007 9479 6003 9479 C 5998 9478 4940 9301 3650 9084 z M 5715 8659 C 5798 8636 5852 8550 5836 8465 C 5828 8422 5777 8362 5733 8344 C 5682 8322 5485 8326 5434 8349 C 5298 8411 5314 8617 5459 8660 C 5499 8672 5670 8671 5715 8659 z M 3976 8296 C 4317 8225 4608 8066 4884 7800 C 5296 7402 5556 6854 5646 6195 C 5673 5996 5671 5562 5643 5380 C 5563 4868 5398 4457 5128 4092 C 5049 3985 4857 3784 4755 3700 C 4587 3563 4353 3433 4161 3371 C 3979 3312 3867 3295 3650 3296 C 3436 3296 3345 3310 3151 3371 C 2722 3507 2309 3856 2038 4312 C 1842 4644 1721 5006 1664 5435 C 1639 5619 1639 6028 1663 6200 C 1715 6568 1804 6861 1956 7160 C 2073 7391 2199 7567 2380 7754 C 2685 8068 3033 8254 3434 8315 C 3572 8337 3822 8327 3976 8296 z M 2066 8134 C 2120 8094 2135 8064 2135 7995 C 2135 7924 2118 7892 2060 7853 C 2030 7832 2015 7830 1898 7830 C 1750 7830 1717 7840 1675 7894 C 1609 7981 1646 8112 1750 8153 C 1758 8156 1827 8158 1902 8157 C 2022 8155 2042 8153 2066 8134 z M 2066 3764 C 2120 3724 2135 3694 2135 3625 C 2135 3556 2120 3526 2066 3486 C 2041 3467 2024 3465 1892 3465 C 1754 3465 1743 3466 1712 3488 C 1672 3517 1640 3577 1640 3625 C 1640 3689 1689 3759 1750 3783 C 1758 3786 1827 3788 1902 3787 C 2022 3785 2042 3783 2066 3764 z M 5752 3604 C 5767 3596 5791 3574 5806 3555 C 5866 3476 5839 3359 5750 3312 C 5708 3290 5695 3289 5574 3292 C 5448 3295 5442 3296 5406 3324 C 5291 3411 5334 3592 5477 3621 C 5531 3631 5720 3620 5752 3604 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -124.6 -197.7)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4065.48, -7285.68)" d="M 3707 7883 C 3582 7585 3519 7276 3518 6965 C 3517 6800 3536 6594 3552 6584 C 3557 6580 3585 6581 3613 6584 L 3665 6591 L 3722 6708 C 3893 7060 4179 7362 4519 7552 L 4613 7604 L 4569 7642 C 4364 7821 4072 7951 3804 7984 L 3752 7990 L 3707 7883 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -272.27 -179.3)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2958, -7147.72)" d="M 3241 7924 C 3028 7854 2842 7737 2656 7559 L 2546 7453 L 2559 7374 C 2588 7199 2676 6939 2767 6755 C 2825 6639 2943 6455 3008 6381 L 3047 6337 L 3104 6383 C 3135 6409 3174 6437 3190 6445 C 3225 6463 3225 6465 3203 6601 C 3182 6734 3179 7131 3198 7270 C 3227 7471 3288 7726 3346 7879 C 3359 7914 3370 7946 3370 7951 C 3370 7965 3352 7961 3241 7924 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -46.09 -131.01)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4654.36, -6785.5)" d="M 4749 7299 C 4496 7177 4248 6948 4098 6700 C 4032 6590 3996 6516 4008 6512 C 4029 6505 4137 6437 4185 6400 L 4235 6362 L 4325 6383 C 4459 6413 4736 6412 4876 6382 C 4991 6357 5151 6304 5242 6260 L 5303 6231 L 5296 6283 C 5276 6437 5194 6713 5114 6895 C 5042 7059 4873 7340 4845 7340 C 4839 7340 4796 7322 4749 7299 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -344.4 -67.06)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2417, -6305.89)" d="M 2222 6940 C 2072 6629 1987 6268 1978 5910 L 1976 5805 L 2029 5768 C 2158 5678 2358 5594 2515 5565 C 2595 5550 2794 5541 2805 5551 C 2807 5554 2805 5594 2800 5640 C 2788 5744 2801 5871 2834 5974 L 2858 6049 L 2832 6072 C 2784 6117 2656 6276 2597 6365 C 2511 6496 2398 6732 2336 6910 L 2282 7065 L 2222 6940 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -179.05 10.2)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3657.14, -5726.48)" d="M 3543 6240 C 3382 6208 3224 6067 3163 5900 C 3139 5835 3135 5812 3136 5720 C 3138 5569 3180 5464 3280 5361 C 3483 5152 3820 5150 4026 5356 C 4135 5465 4188 5604 4177 5755 C 4167 5895 4118 6002 4021 6099 C 3899 6221 3718 6274 3543 6240 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -13.2 65.1)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4901, -5314.68)" d="M 4464 6064 C 4456 6061 4460 6036 4476 5985 C 4511 5873 4524 5749 4510 5638 C 4504 5587 4497 5544 4495 5541 C 4492 5539 4514 5509 4543 5476 C 4729 5262 4879 4995 4977 4703 C 5003 4624 5028 4560 5031 4560 C 5039 4560 5127 4755 5170 4865 C 5260 5101 5317 5389 5335 5697 L 5342 5809 L 5293 5844 C 5172 5934 4929 6034 4767 6060 C 4705 6070 4485 6073 4464 6064 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -316.67 129.85)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2625, -4829.11)" d="M 2010 5372 C 2010 5364 2021 5303 2035 5236 C 2078 5023 2175 4750 2272 4570 C 2333 4458 2452 4280 2467 4280 C 2490 4280 2671 4375 2747 4426 C 2859 4503 2976 4607 3058 4705 C 3131 4791 3240 4949 3240 4967 C 3240 4971 3213 4992 3181 5013 C 3122 5051 3024 5140 2978 5197 L 2952 5229 L 2889 5220 C 2647 5185 2321 5239 2080 5354 C 2026 5379 2010 5384 2010 5372 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -85.99 183.36)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4355.05, -4427.75)" d="M 4292 5151 C 4270 5125 4220 5079 4181 5049 L 4110 4996 L 4118 4955 C 4122 4933 4125 4803 4125 4665 C 4125 4331 4093 4131 3989 3816 C 3962 3734 3942 3664 3945 3662 C 3954 3653 4147 3720 4240 3765 C 4390 3838 4522 3932 4652 4058 C 4744 4147 4769 4177 4765 4194 C 4693 4548 4575 4851 4421 5083 C 4381 5141 4346 5192 4341 5194 C 4336 5197 4314 5178 4292 5151 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -233.78 206.39)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3246.68, -4255.03)" d="M 3768 4874 C 3765 4871 3719 4868 3666 4868 L 3571 4868 L 3510 4768 C 3354 4510 3154 4301 2905 4137 C 2856 4105 2788 4064 2755 4048 L 2696 4018 L 2740 3979 C 2873 3864 3070 3753 3244 3695 C 3341 3663 3545 3622 3556 3633 C 3567 3644 3639 3820 3670 3910 C 3760 4180 3809 4513 3795 4763 C 3788 4870 3784 4890 3768 4874 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 336 0.6)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7520, -5798.45)" d="M 6340 5801 C 6340 3782 6343 2129 6348 2127 C 6352 2125 6877 2156 7515 2196 C 8153 2236 8681 2269 8688 2270 C 8697 2270 8700 2953 8700 5649 C 8700 8859 8699 9029 8683 9034 C 8658 9041 6366 9470 6352 9470 C 6343 9470 6340 8580 6340 5801 z M 6929 8979 C 6978 8949 6998 8922 7010 8865 C 7018 8829 7020 7955 7018 5774 L 7015 2734 L 6990 2697 C 6915 2588 6752 2597 6699 2714 C 6681 2754 6680 2852 6680 5810 L 6680 8866 L 6703 8910 C 6744 8993 6853 9026 6929 8979 z M 7906 8744 C 8258 8655 8292 8643 8334 8587 C 8355 8559 8355 8554 8358 7671 L 8360 6784 L 8337 6740 C 8321 6710 8300 6689 8270 6673 C 8227 6650 8224 6650 7858 6650 C 7569 6650 7482 6653 7457 6664 C 7414 6681 7373 6731 7360 6780 C 7353 6806 7350 7130 7352 7768 L 7355 8716 L 7381 8756 C 7413 8804 7460 8829 7518 8830 C 7541 8830 7716 8791 7906 8744 z M 7619 6280 C 7637 6268 7661 6239 7671 6216 C 7689 6177 7690 6111 7690 4466 L 7690 2756 L 7669 2713 C 7641 2656 7600 2627 7534 2622 C 7470 2617 7410 2646 7377 2700 L 7355 2735 L 7355 4466 L 7355 6196 L 7381 6236 C 7396 6259 7423 6284 7441 6294 C 7489 6318 7576 6311 7619 6280 z M 8270 6295 C 8286 6287 8312 6263 8327 6243 L 8355 6207 L 8355 4465 L 8355 2723 L 8326 2686 C 8249 2585 8101 2601 8041 2717 C 8033 2733 8030 3205 8030 4465 C 8030 6331 8026 6216 8082 6266 C 8094 6278 8114 6292 8125 6298 C 8154 6314 8236 6312 8270 6295 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 381.27 -255.61)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7859.5, -7720)" d="M 7690 7720 L 7690 6990 L 7860 6990 L 8029 6990 L 8027 7674 C 8026 8050 8022 8361 8018 8365 C 8012 8371 7717 8449 7698 8450 C 7693 8450 7690 8122 7690 7720 z" stroke-linecap="round" />
</g>
</g>
</g>
</svg>
@@ -0,0 +1,262 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="494.000000pt" height="555.000000pt" viewBox="0 0 494.000000 555.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)">
<path d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23
19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44
l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8
-335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10
1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748
-30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343
-53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47
4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4
437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151
-80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450
-238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494
243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96
-66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83
-180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95
44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360
-187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0
-95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107
49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64
-42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45
-62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93
198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4
6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177
-121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11
75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353
-84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24
-45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68
523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6
56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7
-302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0
-9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196
-15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219
-9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2
-203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212
1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10
-42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305
-33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0
30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338
63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3
-191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25
-34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81
-54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360
9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0
-16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694
4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3
1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153
79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17
0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44
800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125
-181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93
c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50
8 50 -2z m100 -141 c44 -16 93 -37 108 -45 27 -16 26 -16 -23 -10 -27 3 -79
14 -113 25 -76 24 -82 24 -82 5 0 -8 -31 -29 -72 -49 -40 -18 -158 -75 -261
-125 -103 -50 -192 -91 -198 -91 -5 0 -9 14 -9 31 0 30 4 32 263 159 144 71
272 129 284 129 12 1 58 -12 103 -29z m-530 -70 c0 -11 -73 -50 -95 -50 -25 0
-17 19 18 40 34 21 77 27 77 10z m1381 -26 c248 -133 381 -551 260 -811 -108
-229 -397 -283 -583 -108 -47 44 -26 65 25 25 14 -11 56 -32 94 -46 56 -21 81
-25 143 -22 90 4 141 32 190 103 79 115 101 272 60 429 -19 70 -54 156 -64
156 -2 0 -34 -40 -70 -90 -45 -59 -74 -90 -87 -90 -39 0 -19 40 62 125 69 71
79 86 70 103 -19 36 -130 130 -185 157 -49 24 -64 27 -123 22 -38 -3 -79 -8
-93 -12 -21 -5 -18 0 19 34 53 50 87 61 167 57 44 -3 77 -12 115 -32z m-1581
-70 c0 -16 -56 -44 -90 -44 -31 0 -24 18 18 39 45 24 72 26 72 5z m-200 -105
c0 -12 -77 -48 -102 -49 -31 0 -8 27 40 48 46 20 62 20 62 1z m228 -21 c-4
-39 44 -13 -416 -229 -45 -21 -87 -39 -93 -39 -6 0 -9 12 -7 27 3 24 27 38
248 149 135 68 251 123 258 123 9 1 12 -9 10 -31z m1421 -121 c1 -53 -2 -69
-15 -74 -32 -12 -38 12 -25 102 6 47 15 93 19 103 9 24 21 -45 21 -131z
m-1979 -152 c0 -22 -23 -36 -202 -124 -206 -101 -228 -107 -228 -60 0 19 10
25 315 169 55 26 103 46 108 43 4 -2 7 -15 7 -28z m2260 -44 c0 -6 -25 -30
-56 -55 -54 -44 -86 -56 -98 -37 -13 20 8 40 72 69 74 34 82 36 82 23z m-934
-237 c16 -65 -19 -211 -53 -222 -10 -3 -13 24 -13 112 0 112 1 117 23 126 33
13 36 12 43 -16z m855 6 l24 -20 -45 2 c-33 2 -46 7 -48 21 -5 24 39 23 69 -3z
m-781 -113 c0 -1 -9 -33 -19 -70 -65 -226 -274 -413 -573 -511 -40 -13 -90
-27 -111 -30 -36 -7 -38 -6 -35 16 2 14 12 25 28 29 114 32 184 55 235 81 185
92 341 245 425 416 19 39 38 72 43 72 4 0 7 -1 7 -3z m-29 -272 c-62 -139
-328 -322 -573 -394 -86 -25 -163 -25 -163 -1 0 9 11 16 25 18 48 6 191 43
243 63 164 64 278 148 420 309 34 39 63 66 65 61 2 -6 -6 -31 -17 -56z m777
-36 c95 -42 179 -132 221 -234 29 -68 34 -96 39 -185 4 -94 2 -112 -21 -179
-14 -40 -38 -91 -54 -114 -61 -88 -209 -167 -315 -167 -54 0 -163 33 -191 58
-28 25 -4 37 40 19 140 -56 285 -14 368 107 83 121 107 292 60 427 -58 167
-180 263 -332 263 -40 -1 -73 2 -73 6 0 16 28 29 70 32 73 5 121 -3 188 -33z
m-2013 -9 c7 -11 -42 -37 -51 -27 -9 9 15 37 32 37 7 0 16 -4 19 -10z m414
-21 c40 -24 35 -36 -10 -20 -53 18 -93 13 -136 -18 -167 -121 -105 -387 77
-332 36 11 110 79 110 101 0 6 7 10 16 10 33 0 -6 -74 -62 -116 -29 -22 -50
-29 -100 -32 -57 -4 -69 -1 -105 22 -128 85 -92 313 61 388 47 24 108 22 149
-3z m-409 -69 c0 -16 -38 -32 -46 -19 -7 12 12 29 34 29 6 0 12 -4 12 -10z
m485 -31 c8 -23 1 -34 -14 -24 -13 8 -15 45 -2 45 5 0 13 -9 16 -21z m-71 -21
c3 -18 7 -59 10 -91 4 -55 3 -58 -21 -68 -31 -12 -54 4 -35 23 18 18 15 95 -4
102 -14 5 -13 9 3 36 23 39 41 38 47 -2z m1586 15 c0 -31 -84 -163 -104 -163
-15 0 -17 5 -11 28 11 45 86 152 107 152 4 0 8 -7 8 -17z m-1706 -9 c10 -4 16
-18 16 -39 0 -19 5 -37 10 -40 17 -11 11 -64 -11 -86 -27 -27 -84 -23 -84 6 0
16 7 20 30 20 20 0 31 6 33 18 3 13 -3 17 -22 17 -29 0 -37 27 -11 36 23 9 19
37 -5 31 -26 -7 -34 7 -14 27 16 17 33 20 58 10z m-290 -69 c-6 -15 -42 -30
-51 -21 -12 12 8 36 31 36 18 0 24 -4 20 -15z m1216 -211 c0 -210 -1 -215 -41
-194 -17 10 -19 22 -19 123 0 157 25 297 50 282 6 -4 10 -85 10 -211z m-120
150 c9 -10 15 -65 18 -171 l5 -155 -34 7 c-19 3 -60 13 -92 21 -32 8 -61 14
-63 14 -2 0 -4 61 -4 135 0 126 1 135 21 145 11 7 22 10 23 8 2 -2 7 -60 12
-130 9 -117 16 -149 29 -136 3 2 9 55 14 117 11 137 36 188 71 145z m-1102
-46 c-5 -15 -48 -24 -48 -10 0 14 12 22 33 22 10 0 17 -5 15 -12z m750 -121
c2 -53 0 -67 -11 -67 -10 0 -16 17 -19 58 -6 63 -1 85 16 79 6 -2 12 -32 14
-70z m1342 60 c0 -17 -94 -62 -110 -52 -17 10 1 26 53 47 52 21 57 21 57 5z
m-1402 -69 c-2 -35 -7 -63 -13 -63 -5 0 -11 28 -13 63 -2 51 0 62 13 62 13 0
15 -11 13 -62z m-443 -13 c53 -9 127 8 167 36 35 26 37 8 2 -20 l-26 -20 41
-7 c65 -10 48 -23 -36 -27 -68 -3 -66 -4 14 -3 78 2 97 5 122 24 17 12 33 22
36 22 3 0 5 -17 5 -39 0 -38 -1 -39 -42 -45 -45 -7 -243 -48 -340 -70 l-58
-14 0 115 0 115 35 -30 c22 -20 50 -33 80 -37z m-245 41 c0 -17 -34 -31 -50
-21 -16 10 8 35 31 35 11 0 19 -6 19 -14z m624 -36 c7 -51 3 -70 -15 -70 -5 0
-9 27 -9 60 0 73 15 79 24 10z m-626 -58 c5 -17 -27 -27 -41 -13 -9 9 -8 14 3
21 18 11 32 8 38 -8z m883 -76 c120 -24 313 -72 333 -84 5 -3 0 -9 -12 -13
-14 -5 -57 0 -119 16 -309 76 -353 84 -353 65 0 -5 7 -10 15 -10 13 0 15 -19
13 -127 l-3 -128 -26 -3 c-22 -3 -27 2 -33 29 -3 17 -6 59 -7 93 -2 116 -17
116 -18 0 -1 -76 -5 -115 -13 -121 -7 -5 -51 -17 -98 -26 -47 -9 -95 -20 -107
-23 -21 -6 -23 -3 -23 34 0 23 5 44 10 47 13 8 13 122 0 130 -10 6 -215 -30
-256 -45 -21 -8 -24 -16 -24 -62 0 -62 8 -77 35 -75 18 2 21 -6 26 -98 5 -75
14 -118 34 -170 35 -88 123 -223 174 -267 l39 -33 -187 0 c-197 -1 -241 -6
-241 -30 0 -10 -11 -15 -34 -15 l-34 0 -7 103 c-13 196 -12 261 5 264 8 1 60
7 116 13 113 13 107 7 98 102 l-6 58 -38 -6 c-36 -6 -37 -5 -44 26 -3 18 -6
83 -6 145 l0 113 28 10 c15 6 104 24 197 41 94 18 213 40 265 50 128 25 155
25 301 -3z m-887 5 c3 -5 -1 -14 -10 -21 -11 -10 -18 -10 -27 -1 -9 9 -9 14 3
21 19 12 27 12 34 1z m2040 -6 c45 -19 46 -35 2 -35 -35 0 -71 24 -61 41 8 12
17 11 59 -6z m-2769 -94 l40 -6 6 -60 c4 -33 7 -225 8 -427 l1 -368 -33 0 -34
0 -6 113 c-4 61 -7 207 -7 322 0 116 -3 240 -7 278 -12 132 -23 63 -23 -147 0
-121 -4 -217 -9 -221 -5 -3 -21 0 -35 6 l-26 12 -1 209 c-2 233 -1 224 -11
234 -5 4 -8 -13 -9 -37 0 -34 -2 -39 -9 -24 -11 25 -13 119 -3 129 7 7 70 1
158 -13z m1603 9 c6 0 12 -9 12 -19 0 -17 -4 -18 -40 -9 -22 6 -40 14 -40 18
0 14 15 21 35 16 11 -3 26 -6 33 -6z m110 -20 c6 0 12 -10 12 -21 0 -19 -4
-21 -32 -15 -18 3 -36 10 -41 15 -15 15 4 33 27 27 11 -3 27 -6 34 -6z m-1562
-136 c-4 -76 -10 -143 -15 -151 -7 -14 -21 142 -21 244 0 37 3 43 22 43 21 0
21 -1 14 -136z m628 94 c13 -83 15 -221 5 -240 -9 -17 -13 -18 -19 -7 -7 12
-14 192 -11 262 2 30 20 19 25 -15z m1057 22 c22 -12 25 -36 7 -42 -7 -3 -28
-1 -45 4 -23 6 -33 14 -33 28 0 23 37 28 71 10z m-1117 -32 c9 -35 7 -258 -3
-258 -10 0 -21 107 -21 208 0 70 12 95 24 50z m-114 -122 l0 -134 -72 -12
c-198 -31 -233 -40 -247 -60 -7 -11 -17 -20 -22 -20 -12 0 -11 247 1 270 15
29 211 87 303 89 l37 1 0 -134z m53 120 c9 -22 11 -245 3 -253 -17 -17 -26 30
-26 145 0 110 8 148 23 108z m955 -35 c3 -10 -3 -11 -29 -6 -42 9 -51 14 -44
24 7 13 68 -3 73 -18z m90 -7 c27 -8 29 -24 3 -24 -26 0 -51 10 -51 21 0 10
16 11 48 3z m111 -20 c18 -4 31 -13 31 -21 0 -11 -7 -14 -22 -9 -13 3 -31 6
-40 6 -10 0 -18 7 -18 15 0 17 4 18 49 9z m-673 -131 c24 -122 65 -224 135
-333 55 -86 85 -118 149 -155 l45 -27 -40 7 c-82 14 -139 59 -216 174 -65 95
-122 247 -135 356 -8 63 -2 85 24 85 15 0 21 -18 38 -107z m-108 -3 c28 -200
77 -314 187 -427 41 -43 72 -79 70 -81 -9 -9 -71 24 -108 57 -76 68 -136 178
-172 314 -27 98 -33 205 -13 225 18 18 23 5 36 -88z m572 90 c24 -15 -2 -31
-38 -24 -40 8 -43 34 -4 34 15 0 34 -5 42 -10z m117 -25 c8 -22 1 -26 -35 -19
-18 4 -32 13 -32 20 0 20 59 18 67 -1z m167 -25 c78 -25 89 -46 19 -35 -100
14 -143 27 -143 41 0 20 46 18 124 -6z m881 -120 c72 -36 165 -132 204 -211
112 -229 26 -517 -186 -625 -53 -26 -67 -29 -158 -29 -107 0 -144 12 -223 72
-47 36 -26 52 23 19 74 -51 184 -69 270 -45 60 17 153 116 189 204 47 113 48
317 3 379 -13 17 -19 15 -112 -48 -98 -65 -115 -74 -115 -57 0 9 77 76 152
131 26 19 48 40 48 45 0 20 -57 80 -98 103 l-41 23 -16 -38 c-63 -154 -89
-202 -101 -190 -8 8 5 59 42 160 25 67 27 79 14 88 -19 13 -151 5 -180 -11
-30 -16 -51 3 -28 26 24 25 74 33 173 31 72 -2 100 -8 140 -27z m-845 -19 c0
-13 -38 -19 -250 -36 -107 -8 -244 -20 -304 -25 -112 -10 -136 -5 -136 26 0
10 14 14 43 15 23 1 146 7 272 14 296 16 375 17 375 6z m35 -100 c-10 -17
-103 -30 -375 -56 -247 -23 -266 -23 -278 -8 -6 9 -9 20 -5 24 11 11 426 47
556 48 65 1 106 -3 102 -8z m-1600 -16 c241 -29 255 -32 255 -50 0 -20 -39
-19 -199 5 -142 21 -151 23 -151 47 0 11 7 14 23 10 12 -3 45 -8 72 -12z m0
-100 c58 -7 175 -23 223 -31 34 -5 46 -34 15 -34 -21 0 -277 30 -310 36 -15 3
-23 12 -23 25 0 17 5 20 23 16 12 -3 45 -8 72 -12z m1602 1 c-21 -17 -116 -30
-357 -51 -96 -9 -182 -18 -191 -21 -16 -4 -49 19 -49 35 0 4 73 14 163 20 89
7 203 16 252 21 50 4 115 8 145 8 49 1 53 0 37 -12z m1 -113 c-3 -16 -22 -19
-183 -24 -170 -5 -245 1 -185 15 43 11 191 23 283 25 79 1 88 -1 85 -16z
m-1538 -19 c165 -21 180 -24 180 -34 0 -24 -316 -2 -332 22 -16 25 -9 41 15
33 12 -3 74 -13 137 -21z m2369 -137 c48 -24 65 -47 34 -47 -37 0 -143 42
-143 56 0 21 58 17 109 -9z m-70 -153 c33 -28 39 -44 17 -44 -20 0 -66 39 -66
56 0 21 15 17 49 -12z m335 -80 c13 -99 0 -290 -17 -244 -8 22 -16 245 -10
270 9 33 20 23 27 -26z m-2795 -383 c19 -12 7 -41 -33 -80 -46 -45 -60 -37
-33 19 37 76 39 78 66 61z m461 -26 c12 -14 43 -106 37 -111 -1 -2 -108 -6
-236 -10 l-234 -7 39 71 38 72 172 0 c138 0 174 -3 184 -15z m93 -47 c22 -69
7 -83 -27 -26 -31 53 -33 78 -8 78 13 0 23 -15 35 -52z m912 6 c15 -25 23 -50
19 -54 -11 -10 -633 -19 -639 -10 -3 4 2 31 11 59 l15 51 283 0 284 0 27 -46z
m205 36 c0 -20 -50 -90 -65 -90 -22 0 -85 60 -85 81 0 17 8 19 75 19 44 0 75
-4 75 -10z m839 -32 c17 -23 31 -48 31 -55 0 -10 -59 -13 -295 -13 -215 0
-295 3 -295 11 0 7 12 31 28 55 l27 44 237 0 236 0 31 -42z m341 27 c0 -22
-12 -24 -143 -28 -99 -3 -119 -1 -132 13 -8 9 -12 20 -8 23 3 4 69 7 145 7
117 0 138 -2 138 -15z"/>
<path d="M1713 2370 c-76 -11 -103 -19 -103 -30 0 -14 63 -23 144 -18 82 4 96
10 80 36 -13 20 -48 23 -121 12z"/>
<path d="M1825 2275 c-5 -2 -44 -6 -85 -10 -85 -7 -115 -19 -90 -35 33 -22
228 -7 237 17 9 23 -28 40 -62 28z"/>
<path d="M1720 2156 c-46 -8 -65 -15 -65 -26 0 -12 23 -15 139 -18 152 -3 181
5 150 39 -14 15 -31 19 -88 18 -39 -1 -100 -6 -136 -13z"/>
<path d="M2515 4414 c-178 -26 -270 -62 -301 -119 -16 -31 -16 -35 -2 -58 33
-50 79 -62 251 -65 182 -4 271 8 342 46 78 43 97 111 39 148 -49 33 -242 60
-329 48z m275 -118 c0 -22 -24 -26 -215 -41 -208 -16 -197 -15 -165 -25 14 -4
91 -8 173 -9 213 -1 192 -25 -34 -38 -164 -9 -299 25 -299 76 0 17 10 20 68
27 147 16 232 21 350 23 98 1 122 -2 122 -13z"/>
<path d="M2140 4363 c-19 -9 -87 -41 -150 -72 l-115 -55 120 -8 c66 -4 126 -6
133 -3 6 2 12 16 12 30 0 14 11 48 25 75 28 55 26 56 -25 33z"/>
<path d="M1810 4137 c-134 -26 -203 -94 -131 -132 34 -17 42 -10 14 11 -91 67
339 137 456 74 38 -20 12 -30 -77 -30 -129 0 -282 -12 -282 -22 0 -4 64 -8
143 -8 113 -1 138 -3 122 -12 -11 -7 -49 -17 -85 -23 -75 -12 -82 -29 -13 -33
102 -7 261 41 277 84 9 25 -20 63 -62 81 -49 21 -273 27 -362 10z"/>
<path d="M1250 3929 c-61 -12 -95 -39 -95 -75 0 -23 5 -30 25 -33 24 -3 25 -3
7 17 -18 20 -18 21 5 36 30 19 176 31 264 21 l69 -8 -45 -7 c-25 -4 -89 -11
-142 -15 -161 -12 -120 -28 104 -41 96 -6 108 -9 93 -21 -11 -7 -27 -13 -37
-13 -10 0 -18 -5 -18 -11 0 -19 119 -1 165 24 80 44 33 103 -100 126 -72 13
-230 13 -295 0z"/>
<path d="M1013 3912 c-39 -19 -42 -32 -9 -32 34 0 56 10 56 25 0 22 -13 24
-47 7z"/>
<path d="M997 3696 c-46 -14 -132 -64 -123 -73 2 -3 26 7 52 21 27 14 61 26
75 26 22 0 28 -7 39 -42 15 -52 54 -127 45 -88 -3 14 -8 51 -12 83 l-6 59 49
-7 c27 -4 52 -9 57 -12 4 -2 4 -43 1 -91 -6 -94 4 -96 26 -5 17 75 28 80 85
40 75 -51 75 -54 4 -125 -46 -46 -60 -65 -51 -74 8 -8 31 -1 86 25 l76 36 11
-22 c7 -12 16 -37 20 -55 6 -29 4 -34 -18 -43 -13 -5 -46 -9 -73 -9 -52 0 -80
-7 -80 -21 0 -9 88 -36 135 -41 36 -4 45 -36 20 -74 -18 -28 -20 -28 -123 39
-46 31 -61 46 -57 58 7 21 -20 89 -34 89 -6 0 -8 -19 -4 -49 5 -43 3 -50 -18
-65 -67 -46 -166 26 -123 91 18 28 12 42 -10 23 -22 -18 -30 -73 -16 -112 11
-30 8 -40 -29 -120 -22 -49 -44 -88 -48 -88 -5 0 -19 7 -32 16 -15 11 -26 13
-32 7 -14 -14 72 -68 147 -94 177 -62 380 30 444 201 63 170 -32 381 -213 470
-78 38 -190 49 -270 26z m224 -478 c9 -7 38 -39 64 -72 l49 -58 -28 -25 c-44
-38 -57 -28 -93 72 -18 50 -33 91 -33 93 0 7 28 0 41 -10z m-90 -118 c6 -40 7
-76 2 -81 -8 -8 -73 2 -76 12 -5 14 49 157 56 150 5 -5 13 -41 18 -81z"/>
<path d="M892 3538 c6 -18 57 -53 65 -45 9 9 -37 57 -55 57 -7 0 -12 -5 -10
-12z"/>
<path d="M840 3361 c0 -20 34 -31 96 -31 50 0 41 14 -19 33 -68 21 -77 21 -77
-2z"/>
<path d="M929 3218 c-65 -44 -72 -55 -45 -73 11 -7 20 -2 38 20 12 17 35 43
51 59 15 16 26 30 24 33 -2 2 -33 -16 -68 -39z"/>
<path d="M1200 1030 c-42 -10 -75 -47 -89 -98 -14 -47 -14 -385 -1 -433 23
-81 106 -119 194 -88 59 21 80 56 84 145 l4 74 -46 0 -46 0 0 -57 c0 -71 -9
-86 -50 -86 -17 0 -36 6 -41 14 -14 22 -11 423 3 437 16 16 63 15 76 -1 6 -7
12 -35 14 -62 l3 -50 40 0 40 0 3 49 c4 57 -19 118 -52 140 -29 18 -93 26
-136 16z"/>
<path d="M1706 1030 c-41 -13 -74 -48 -86 -89 -5 -20 -10 -124 -10 -231 0
-263 14 -295 133 -306 102 -10 157 48 157 163 l0 63 -45 0 -45 0 0 -60 c0 -51
-3 -62 -23 -74 -29 -20 -66 -10 -78 21 -14 38 -11 373 4 403 14 27 61 40 80
21 7 -7 14 -35 17 -64 l5 -52 43 -3 42 -3 0 53 c0 60 -23 113 -60 140 -31 21
-95 30 -134 18z"/>
<path d="M3510 1030 c-43 -10 -76 -47 -90 -102 -7 -25 -10 -113 -8 -232 2
-160 6 -197 21 -228 43 -86 201 -90 253 -5 17 29 19 52 19 257 0 219 -1 226
-23 258 -13 17 -31 36 -40 41 -28 14 -95 20 -132 11z m88 -92 c13 -13 17 -415
4 -434 -12 -18 -41 -24 -67 -14 l-25 10 0 213 c0 152 3 216 12 225 15 15 61
15 76 0z"/>
<path d="M757 1023 c-4 -3 -7 -143 -7 -310 l0 -303 50 0 50 0 0 114 0 113 48
5 c111 11 142 53 142 196 0 156 -35 192 -186 192 -50 0 -94 -3 -97 -7z m173
-93 c16 -16 20 -33 20 -91 0 -92 -10 -109 -60 -109 l-40 0 0 104 c0 91 2 105
18 109 33 9 42 7 62 -13z"/>
<path d="M1987 1023 c-4 -3 -7 -143 -7 -310 l0 -303 45 0 44 0 3 123 3 122 36
3 c54 5 63 -14 69 -137 l5 -106 45 -3 45 -3 -5 125 c-6 120 -7 127 -34 154
-23 25 -25 30 -11 36 26 9 45 70 45 141 0 132 -38 165 -187 165 -49 0 -93 -3
-96 -7z m181 -101 c6 -9 12 -43 12 -77 0 -66 -11 -85 -58 -100 -42 -12 -52 9
-52 105 0 76 2 89 18 92 29 6 66 -3 80 -20z"/>
<path d="M2360 720 l0 -310 130 0 130 0 0 40 0 40 -85 0 -85 0 0 95 0 94 68 3
67 3 3 34 c4 38 -11 53 -45 44 -13 -3 -39 -2 -58 1 l-35 7 0 84 c0 81 1 85 23
86 12 0 49 1 82 2 l60 2 3 43 3 42 -130 0 -131 0 0 -310z"/>
<path d="M2777 1017 c-3 -8 -12 -59 -21 -113 -19 -120 -64 -404 -72 -456 l-6
-38 40 0 40 0 9 53 8 52 65 0 65 0 8 -52 9 -53 44 0 c52 0 52 0 29 125 -8 44
-24 139 -35 210 -11 72 -26 164 -33 205 l-13 75 -66 3 c-49 2 -67 -1 -71 -11z
m113 -399 c0 -15 -9 -18 -44 -18 -25 0 -47 3 -49 8 -6 10 30 270 40 285 6 10
51 -226 53 -275z"/>
<path d="M3062 988 l3 -43 45 -1 45 -1 3 -266 2 -267 45 0 45 0 0 264 c0 225
2 265 15 270 8 3 22 3 30 0 8 -4 26 -3 40 0 21 5 25 12 25 46 l0 40 -151 0
-150 0 3 -42z"/>
<path d="M3790 720 l0 -310 45 0 44 0 3 123 3 122 40 0 c54 0 65 -24 65 -147
l0 -98 48 0 47 0 -3 83 c-4 126 -11 165 -36 194 l-22 26 22 24 c27 29 39 94
31 162 -13 107 -48 131 -192 131 l-95 0 0 -310z m188 203 c17 -24 15 -124 -3
-150 -19 -27 -74 -41 -86 -22 -10 16 -12 182 -3 192 12 12 79 -3 92 -20z"/>
</g>
</svg>
+225
View File
@@ -0,0 +1,225 @@
<svg xmlns="http://www.w3.org/2000/svg"
width="494.000000pt" height="555.000000pt" viewBox="0 0 494.000000 555.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)" fill="white">
<path d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23
19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44
l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8
-335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10
1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748
-30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343
-53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47
4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4
437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151
-80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450
-238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494
243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96
-66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83
-180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95
44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360
-187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0
-95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107
49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64
-42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45
-62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93
198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4
6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177
-121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11
75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353
-84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24
-45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68
523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6
56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7
-302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0
-9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196
-15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219
-9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2
-203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212
1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10
-42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305
-33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0
30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338
63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3
-191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25
-34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81
-54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360
9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0
-16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694
4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3
1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153
79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17
0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44
800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125
-181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93
c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50
8 50 -2z m100 -141 c44 -16 93 -37 108 -45 27 -16 26 -16 -23 -10 -27 3 -79
14 -113 25 -76 24 -82 24 -82 5 0 -8 -31 -29 -72 -49 -40 -18 -158 -75 -261
-125 -103 -50 -192 -91 -198 -91 -5 0 -9 14 -9 31 0 30 4 32 263 159 144 71
272 129 284 129 12 1 58 -12 103 -29z m-530 -70 c0 -11 -73 -50 -95 -50 -25 0
-17 19 18 40 34 21 77 27 77 10z m1381 -26 c248 -133 381 -551 260 -811 -108
-229 -397 -283 -583 -108 -47 44 -26 65 25 25 14 -11 56 -32 94 -46 56 -21 81
-25 143 -22 90 4 141 32 190 103 79 115 101 272 60 429 -19 70 -54 156 -64
156 -2 0 -34 -40 -70 -90 -45 -59 -74 -90 -87 -90 -39 0 -19 40 62 125 69 71
79 86 70 103 -19 36 -130 130 -185 157 -49 24 -64 27 -123 22 -38 -3 -79 -8
-93 -12 -21 -5 -18 0 19 34 53 50 87 61 167 57 44 -3 77 -12 115 -32z m-1581
-70 c0 -16 -56 -44 -90 -44 -31 0 -24 18 18 39 45 24 72 26 72 5z m-200 -105
c0 -12 -77 -48 -102 -49 -31 0 -8 27 40 48 46 20 62 20 62 1z m228 -21 c-4
-39 44 -13 -416 -229 -45 -21 -87 -39 -93 -39 -6 0 -9 12 -7 27 3 24 27 38
248 149 135 68 251 123 258 123 9 1 12 -9 10 -31z m1421 -121 c1 -53 -2 -69
-15 -74 -32 -12 -38 12 -25 102 6 47 15 93 19 103 9 24 21 -45 21 -131z
m-1979 -152 c0 -22 -23 -36 -202 -124 -206 -101 -228 -107 -228 -60 0 19 10
25 315 169 55 26 103 46 108 43 4 -2 7 -15 7 -28z m2260 -44 c0 -6 -25 -30
-56 -55 -54 -44 -86 -56 -98 -37 -13 20 8 40 72 69 74 34 82 36 82 23z m-934
-237 c16 -65 -19 -211 -53 -222 -10 -3 -13 24 -13 112 0 112 1 117 23 126 33
13 36 12 43 -16z m855 6 l24 -20 -45 2 c-33 2 -46 7 -48 21 -5 24 39 23 69 -3z
m-781 -113 c0 -1 -9 -33 -19 -70 -65 -226 -274 -413 -573 -511 -40 -13 -90
-27 -111 -30 -36 -7 -38 -6 -35 16 2 14 12 25 28 29 114 32 184 55 235 81 185
92 341 245 425 416 19 39 38 72 43 72 4 0 7 -1 7 -3z m-29 -272 c-62 -139
-328 -322 -573 -394 -86 -25 -163 -25 -163 -1 0 9 11 16 25 18 48 6 191 43
243 63 164 64 278 148 420 309 34 39 63 66 65 61 2 -6 -6 -31 -17 -56z m777
-36 c95 -42 179 -132 221 -234 29 -68 34 -96 39 -185 4 -94 2 -112 -21 -179
-14 -40 -38 -91 -54 -114 -61 -88 -209 -167 -315 -167 -54 0 -163 33 -191 58
-28 25 -4 37 40 19 140 -56 285 -14 368 107 83 121 107 292 60 427 -58 167
-180 263 -332 263 -40 -1 -73 2 -73 6 0 16 28 29 70 32 73 5 121 -3 188 -33z
m-2013 -9 c7 -11 -42 -37 -51 -27 -9 9 15 37 32 37 7 0 16 -4 19 -10z m414
-21 c40 -24 35 -36 -10 -20 -53 18 -93 13 -136 -18 -167 -121 -105 -387 77
-332 36 11 110 79 110 101 0 6 7 10 16 10 33 0 -6 -74 -62 -116 -29 -22 -50
-29 -100 -32 -57 -4 -69 -1 -105 22 -128 85 -92 313 61 388 47 24 108 22 149
-3z m-409 -69 c0 -16 -38 -32 -46 -19 -7 12 12 29 34 29 6 0 12 -4 12 -10z
m485 -31 c8 -23 1 -34 -14 -24 -13 8 -15 45 -2 45 5 0 13 -9 16 -21z m-71 -21
c3 -18 7 -59 10 -91 4 -55 3 -58 -21 -68 -31 -12 -54 4 -35 23 18 18 15 95 -4
102 -14 5 -13 9 3 36 23 39 41 38 47 -2z m1586 15 c0 -31 -84 -163 -104 -163
-15 0 -17 5 -11 28 11 45 86 152 107 152 4 0 8 -7 8 -17z m-1706 -9 c10 -4 16
-18 16 -39 0 -19 5 -37 10 -40 17 -11 11 -64 -11 -86 -27 -27 -84 -23 -84 6 0
16 7 20 30 20 20 0 31 6 33 18 3 13 -3 17 -22 17 -29 0 -37 27 -11 36 23 9 19
37 -5 31 -26 -7 -34 7 -14 27 16 17 33 20 58 10z m-290 -69 c-6 -15 -42 -30
-51 -21 -12 12 8 36 31 36 18 0 24 -4 20 -15z m1216 -211 c0 -210 -1 -215 -41
-194 -17 10 -19 22 -19 123 0 157 25 297 50 282 6 -4 10 -85 10 -211z m-120
150 c9 -10 15 -65 18 -171 l5 -155 -34 7 c-19 3 -60 13 -92 21 -32 8 -61 14
-63 14 -2 0 -4 61 -4 135 0 126 1 135 21 145 11 7 22 10 23 8 2 -2 7 -60 12
-130 9 -117 16 -149 29 -136 3 2 9 55 14 117 11 137 36 188 71 145z m-1102
-46 c-5 -15 -48 -24 -48 -10 0 14 12 22 33 22 10 0 17 -5 15 -12z m750 -121
c2 -53 0 -67 -11 -67 -10 0 -16 17 -19 58 -6 63 -1 85 16 79 6 -2 12 -32 14
-70z m1342 60 c0 -17 -94 -62 -110 -52 -17 10 1 26 53 47 52 21 57 21 57 5z
m-1402 -69 c-2 -35 -7 -63 -13 -63 -5 0 -11 28 -13 63 -2 51 0 62 13 62 13 0
15 -11 13 -62z m-443 -13 c53 -9 127 8 167 36 35 26 37 8 2 -20 l-26 -20 41
-7 c65 -10 48 -23 -36 -27 -68 -3 -66 -4 14 -3 78 2 97 5 122 24 17 12 33 22
36 22 3 0 5 -17 5 -39 0 -38 -1 -39 -42 -45 -45 -7 -243 -48 -340 -70 l-58
-14 0 115 0 115 35 -30 c22 -20 50 -33 80 -37z m-245 41 c0 -17 -34 -31 -50
-21 -16 10 8 35 31 35 11 0 19 -6 19 -14z m624 -36 c7 -51 3 -70 -15 -70 -5 0
-9 27 -9 60 0 73 15 79 24 10z m-626 -58 c5 -17 -27 -27 -41 -13 -9 9 -8 14 3
21 18 11 32 8 38 -8z m883 -76 c120 -24 313 -72 333 -84 5 -3 0 -9 -12 -13
-14 -5 -57 0 -119 16 -309 76 -353 84 -353 65 0 -5 7 -10 15 -10 13 0 15 -19
13 -127 l-3 -128 -26 -3 c-22 -3 -27 2 -33 29 -3 17 -6 59 -7 93 -2 116 -17
116 -18 0 -1 -76 -5 -115 -13 -121 -7 -5 -51 -17 -98 -26 -47 -9 -95 -20 -107
-23 -21 -6 -23 -3 -23 34 0 23 5 44 10 47 13 8 13 122 0 130 -10 6 -215 -30
-256 -45 -21 -8 -24 -16 -24 -62 0 -62 8 -77 35 -75 18 2 21 -6 26 -98 5 -75
14 -118 34 -170 35 -88 123 -223 174 -267 l39 -33 -187 0 c-197 -1 -241 -6
-241 -30 0 -10 -11 -15 -34 -15 l-34 0 -7 103 c-13 196 -12 261 5 264 8 1 60
7 116 13 113 13 107 7 98 102 l-6 58 -38 -6 c-36 -6 -37 -5 -44 26 -3 18 -6
83 -6 145 l0 113 28 10 c15 6 104 24 197 41 94 18 213 40 265 50 128 25 155
25 301 -3z m-887 5 c3 -5 -1 -14 -10 -21 -11 -10 -18 -10 -27 -1 -9 9 -9 14 3
21 19 12 27 12 34 1z m2040 -6 c45 -19 46 -35 2 -35 -35 0 -71 24 -61 41 8 12
17 11 59 -6z m-2769 -94 l40 -6 6 -60 c4 -33 7 -225 8 -427 l1 -368 -33 0 -34
0 -6 113 c-4 61 -7 207 -7 322 0 116 -3 240 -7 278 -12 132 -23 63 -23 -147 0
-121 -4 -217 -9 -221 -5 -3 -21 0 -35 6 l-26 12 -1 209 c-2 233 -1 224 -11
234 -5 4 -8 -13 -9 -37 0 -34 -2 -39 -9 -24 -11 25 -13 119 -3 129 7 7 70 1
158 -13z m1603 9 c6 0 12 -9 12 -19 0 -17 -4 -18 -40 -9 -22 6 -40 14 -40 18
0 14 15 21 35 16 11 -3 26 -6 33 -6z m110 -20 c6 0 12 -10 12 -21 0 -19 -4
-21 -32 -15 -18 3 -36 10 -41 15 -15 15 4 33 27 27 11 -3 27 -6 34 -6z m-1562
-136 c-4 -76 -10 -143 -15 -151 -7 -14 -21 142 -21 244 0 37 3 43 22 43 21 0
21 -1 14 -136z m628 94 c13 -83 15 -221 5 -240 -9 -17 -13 -18 -19 -7 -7 12
-14 192 -11 262 2 30 20 19 25 -15z m1057 22 c22 -12 25 -36 7 -42 -7 -3 -28
-1 -45 4 -23 6 -33 14 -33 28 0 23 37 28 71 10z m-1117 -32 c9 -35 7 -258 -3
-258 -10 0 -21 107 -21 208 0 70 12 95 24 50z m-114 -122 l0 -134 -72 -12
c-198 -31 -233 -40 -247 -60 -7 -11 -17 -20 -22 -20 -12 0 -11 247 1 270 15
29 211 87 303 89 l37 1 0 -134z m53 120 c9 -22 11 -245 3 -253 -17 -17 -26 30
-26 145 0 110 8 148 23 108z m955 -35 c3 -10 -3 -11 -29 -6 -42 9 -51 14 -44
24 7 13 68 -3 73 -18z m90 -7 c27 -8 29 -24 3 -24 -26 0 -51 10 -51 21 0 10
16 11 48 3z m111 -20 c18 -4 31 -13 31 -21 0 -11 -7 -14 -22 -9 -13 3 -31 6
-40 6 -10 0 -18 7 -18 15 0 17 4 18 49 9z m-673 -131 c24 -122 65 -224 135
-333 55 -86 85 -118 149 -155 l45 -27 -40 7 c-82 14 -139 59 -216 174 -65 95
-122 247 -135 356 -8 63 -2 85 24 85 15 0 21 -18 38 -107z m-108 -3 c28 -200
77 -314 187 -427 41 -43 72 -79 70 -81 -9 -9 -71 24 -108 57 -76 68 -136 178
-172 314 -27 98 -33 205 -13 225 18 18 23 5 36 -88z m572 90 c24 -15 -2 -31
-38 -24 -40 8 -43 34 -4 34 15 0 34 -5 42 -10z m117 -25 c8 -22 1 -26 -35 -19
-18 4 -32 13 -32 20 0 20 59 18 67 -1z m167 -25 c78 -25 89 -46 19 -35 -100
14 -143 27 -143 41 0 20 46 18 124 -6z m881 -120 c72 -36 165 -132 204 -211
112 -229 26 -517 -186 -625 -53 -26 -67 -29 -158 -29 -107 0 -144 12 -223 72
-47 36 -26 52 23 19 74 -51 184 -69 270 -45 60 17 153 116 189 204 47 113 48
317 3 379 -13 17 -19 15 -112 -48 -98 -65 -115 -74 -115 -57 0 9 77 76 152
131 26 19 48 40 48 45 0 20 -57 80 -98 103 l-41 23 -16 -38 c-63 -154 -89
-202 -101 -190 -8 8 5 59 42 160 25 67 27 79 14 88 -19 13 -151 5 -180 -11
-30 -16 -51 3 -28 26 24 25 74 33 173 31 72 -2 100 -8 140 -27z m-845 -19 c0
-13 -38 -19 -250 -36 -107 -8 -244 -20 -304 -25 -112 -10 -136 -5 -136 26 0
10 14 14 43 15 23 1 146 7 272 14 296 16 375 17 375 6z m35 -100 c-10 -17
-103 -30 -375 -56 -247 -23 -266 -23 -278 -8 -6 9 -9 20 -5 24 11 11 426 47
556 48 65 1 106 -3 102 -8z m-1600 -16 c241 -29 255 -32 255 -50 0 -20 -39
-19 -199 5 -142 21 -151 23 -151 47 0 11 7 14 23 10 12 -3 45 -8 72 -12z m0
-100 c58 -7 175 -23 223 -31 34 -5 46 -34 15 -34 -21 0 -277 30 -310 36 -15 3
-23 12 -23 25 0 17 5 20 23 16 12 -3 45 -8 72 -12z m1602 1 c-21 -17 -116 -30
-357 -51 -96 -9 -182 -18 -191 -21 -16 -4 -49 19 -49 35 0 4 73 14 163 20 89
7 203 16 252 21 50 4 115 8 145 8 49 1 53 0 37 -12z m1 -113 c-3 -16 -22 -19
-183 -24 -170 -5 -245 1 -185 15 43 11 191 23 283 25 79 1 88 -1 85 -16z
m-1538 -19 c165 -21 180 -24 180 -34 0 -24 -316 -2 -332 22 -16 25 -9 41 15
33 12 -3 74 -13 137 -21z m2369 -137 c48 -24 65 -47 34 -47 -37 0 -143 42
-143 56 0 21 58 17 109 -9z m-70 -153 c33 -28 39 -44 17 -44 -20 0 -66 39 -66
56 0 21 15 17 49 -12z m335 -80 c13 -99 0 -290 -17 -244 -8 22 -16 245 -10
270 9 33 20 23 27 -26z m-2795 -383 c19 -12 7 -41 -33 -80 -46 -45 -60 -37
-33 19 37 76 39 78 66 61z m461 -26 c12 -14 43 -106 37 -111 -1 -2 -108 -6
-236 -10 l-234 -7 39 71 38 72 172 0 c138 0 174 -3 184 -15z m93 -47 c22 -69
7 -83 -27 -26 -31 53 -33 78 -8 78 13 0 23 -15 35 -52z m912 6 c15 -25 23 -50
19 -54 -11 -10 -633 -19 -639 -10 -3 4 2 31 11 59 l15 51 283 0 284 0 27 -46z
m205 36 c0 -20 -50 -90 -65 -90 -22 0 -85 60 -85 81 0 17 8 19 75 19 44 0 75
-4 75 -10z m839 -32 c17 -23 31 -48 31 -55 0 -10 -59 -13 -295 -13 -215 0
-295 3 -295 11 0 7 12 31 28 55 l27 44 237 0 236 0 31 -42z m341 27 c0 -22
-12 -24 -143 -28 -99 -3 -119 -1 -132 13 -8 9 -12 20 -8 23 3 4 69 7 145 7
117 0 138 -2 138 -15z"/>
<path d="M1713 2370 c-76 -11 -103 -19 -103 -30 0 -14 63 -23 144 -18 82 4 96
10 80 36 -13 20 -48 23 -121 12z"/>
<path d="M1825 2275 c-5 -2 -44 -6 -85 -10 -85 -7 -115 -19 -90 -35 33 -22
228 -7 237 17 9 23 -28 40 -62 28z"/>
<path d="M1720 2156 c-46 -8 -65 -15 -65 -26 0 -12 23 -15 139 -18 152 -3 181
5 150 39 -14 15 -31 19 -88 18 -39 -1 -100 -6 -136 -13z"/>
<path d="M2515 4414 c-178 -26 -270 -62 -301 -119 -16 -31 -16 -35 -2 -58 33
-50 79 -62 251 -65 182 -4 271 8 342 46 78 43 97 111 39 148 -49 33 -242 60
-329 48z m275 -118 c0 -22 -24 -26 -215 -41 -208 -16 -197 -15 -165 -25 14 -4
91 -8 173 -9 213 -1 192 -25 -34 -38 -164 -9 -299 25 -299 76 0 17 10 20 68
27 147 16 232 21 350 23 98 1 122 -2 122 -13z"/>
<path d="M2140 4363 c-19 -9 -87 -41 -150 -72 l-115 -55 120 -8 c66 -4 126 -6
133 -3 6 2 12 16 12 30 0 14 11 48 25 75 28 55 26 56 -25 33z"/>
<path d="M1810 4137 c-134 -26 -203 -94 -131 -132 34 -17 42 -10 14 11 -91 67
339 137 456 74 38 -20 12 -30 -77 -30 -129 0 -282 -12 -282 -22 0 -4 64 -8
143 -8 113 -1 138 -3 122 -12 -11 -7 -49 -17 -85 -23 -75 -12 -82 -29 -13 -33
102 -7 261 41 277 84 9 25 -20 63 -62 81 -49 21 -273 27 -362 10z"/>
<path d="M1250 3929 c-61 -12 -95 -39 -95 -75 0 -23 5 -30 25 -33 24 -3 25 -3
7 17 -18 20 -18 21 5 36 30 19 176 31 264 21 l69 -8 -45 -7 c-25 -4 -89 -11
-142 -15 -161 -12 -120 -28 104 -41 96 -6 108 -9 93 -21 -11 -7 -27 -13 -37
-13 -10 0 -18 -5 -18 -11 0 -19 119 -1 165 24 80 44 33 103 -100 126 -72 13
-230 13 -295 0z"/>
<path d="M1013 3912 c-39 -19 -42 -32 -9 -32 34 0 56 10 56 25 0 22 -13 24
-47 7z"/>
<path d="M997 3696 c-46 -14 -132 -64 -123 -73 2 -3 26 7 52 21 27 14 61 26
75 26 22 0 28 -7 39 -42 15 -52 54 -127 45 -88 -3 14 -8 51 -12 83 l-6 59 49
-7 c27 -4 52 -9 57 -12 4 -2 4 -43 1 -91 -6 -94 4 -96 26 -5 17 75 28 80 85
40 75 -51 75 -54 4 -125 -46 -46 -60 -65 -51 -74 8 -8 31 -1 86 25 l76 36 11
-22 c7 -12 16 -37 20 -55 6 -29 4 -34 -18 -43 -13 -5 -46 -9 -73 -9 -52 0 -80
-7 -80 -21 0 -9 88 -36 135 -41 36 -4 45 -36 20 -74 -18 -28 -20 -28 -123 39
-46 31 -61 46 -57 58 7 21 -20 89 -34 89 -6 0 -8 -19 -4 -49 5 -43 3 -50 -18
-65 -67 -46 -166 26 -123 91 18 28 12 42 -10 23 -22 -18 -30 -73 -16 -112 11
-30 8 -40 -29 -120 -22 -49 -44 -88 -48 -88 -5 0 -19 7 -32 16 -15 11 -26 13
-32 7 -14 -14 72 -68 147 -94 177 -62 380 30 444 201 63 170 -32 381 -213 470
-78 38 -190 49 -270 26z m224 -478 c9 -7 38 -39 64 -72 l49 -58 -28 -25 c-44
-38 -57 -28 -93 72 -18 50 -33 91 -33 93 0 7 28 0 41 -10z m-90 -118 c6 -40 7
-76 2 -81 -8 -8 -73 2 -76 12 -5 14 49 157 56 150 5 -5 13 -41 18 -81z"/>
<path d="M892 3538 c6 -18 57 -53 65 -45 9 9 -37 57 -55 57 -7 0 -12 -5 -10
-12z"/>
<path d="M840 3361 c0 -20 34 -31 96 -31 50 0 41 14 -19 33 -68 21 -77 21 -77
-2z"/>
<path d="M929 3218 c-65 -44 -72 -55 -45 -73 11 -7 20 -2 38 20 12 17 35 43
51 59 15 16 26 30 24 33 -2 2 -33 -16 -68 -39z"/>
</g>
</svg>
+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="462px" height="512px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.984" fill="#000000" d="M 170.5,-0.5 C 210.5,-0.5 250.5,-0.5 290.5,-0.5C 314.491,5.66058 328.657,20.9939 333,45.5C 333.5,64.1637 333.667,82.8304 333.5,101.5C 368.835,101.333 404.168,101.5 439.5,102C 452.678,105.007 460.012,113.174 461.5,126.5C 461.5,127.5 461.5,128.5 461.5,129.5C 458.719,144.937 449.385,152.937 433.5,153.5C 425.386,253.203 416.886,352.87 408,452.5C 398.365,485.308 376.865,504.974 343.5,511.5C 268.167,511.5 192.833,511.5 117.5,511.5C 84.1349,504.974 62.6349,485.308 53,452.5C 44.1142,352.87 35.6142,253.203 27.5,153.5C 11.6146,152.937 2.28123,144.937 -0.5,129.5C -0.5,128.167 -0.5,126.833 -0.5,125.5C 1.4512,112.713 8.78453,104.88 21.5,102C 56.8318,101.5 92.1651,101.333 127.5,101.5C 127.333,82.8304 127.5,64.1637 128,45.5C 132.343,20.9939 146.509,5.66058 170.5,-0.5 Z M 179.5,51.5 C 213.5,51.5 247.5,51.5 281.5,51.5C 281.5,68.1667 281.5,84.8333 281.5,101.5C 247.5,101.5 213.5,101.5 179.5,101.5C 179.5,84.8333 179.5,68.1667 179.5,51.5 Z M 79.5,153.5 C 180.167,153.5 280.833,153.5 381.5,153.5C 373.502,247.142 365.669,340.808 358,434.5C 357.095,447.076 350.595,455.243 338.5,459C 266.5,459.667 194.5,459.667 122.5,459C 110.405,455.243 103.905,447.076 103,434.5C 95.3313,340.808 87.4979,247.142 79.5,153.5 Z"/></g>
<g><path style="opacity:0.981" fill="#000000" d="M 178.5,203.5 C 190.763,204.276 199.263,210.276 204,221.5C 205.146,249.795 205.646,278.128 205.5,306.5C 205.646,334.872 205.146,363.205 204,391.5C 199.733,402.725 191.566,408.725 179.5,409.5C 166.457,408.624 157.957,401.957 154,389.5C 153.333,334.5 153.333,279.5 154,224.5C 157.476,211.846 165.643,204.846 178.5,203.5 Z"/></g>
<g><path style="opacity:0.981" fill="#000000" d="M 280.5,203.5 C 292.434,204.048 300.934,209.715 306,220.5C 307.151,249.287 307.651,278.12 307.5,307C 307.333,334.5 307.167,362 307,389.5C 303.043,401.957 294.543,408.624 281.5,409.5C 269.209,409.034 261.042,403.034 257,391.5C 255.854,363.205 255.354,334.872 255.5,306.5C 255.354,278.128 255.854,249.795 257,221.5C 261.488,211.018 269.322,205.018 280.5,203.5 Z"/></g>
</svg>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 122.88" style="enable-background:new 0 0 122.88 122.88" xml:space="preserve"><g><path d="M61.44,0c8.32,0,16.25,1.66,23.5,4.66l0.11,0.05c7.47,3.11,14.2,7.66,19.83,13.3l0,0c5.66,5.65,10.22,12.42,13.34,19.95 c3.01,7.24,4.66,15.18,4.66,23.49c0,8.32-1.66,16.25-4.66,23.5l-0.05,0.11c-3.12,7.47-7.66,14.2-13.3,19.83l0,0 c-5.65,5.66-12.42,10.22-19.95,13.34c-7.24,3.01-15.18,4.66-23.49,4.66c-8.31,0-16.25-1.66-23.5-4.66l-0.11-0.05 c-7.47-3.11-14.2-7.66-19.83-13.29L18,104.87C12.34,99.21,7.78,92.45,4.66,84.94C1.66,77.69,0,69.76,0,61.44s1.66-16.25,4.66-23.5 l0.05-0.11c3.11-7.47,7.66-14.2,13.29-19.83L18.01,18c5.66-5.66,12.42-10.22,19.94-13.34C45.19,1.66,53.12,0,61.44,0L61.44,0z M16.99,94.47l0.24-0.14c5.9-3.29,21.26-4.38,27.64-8.83c0.47-0.7,0.97-1.72,1.46-2.83c0.73-1.67,1.4-3.5,1.82-4.74 c-1.78-2.1-3.31-4.47-4.77-6.8l-4.83-7.69c-1.76-2.64-2.68-5.04-2.74-7.02c-0.03-0.93,0.13-1.77,0.48-2.52 c0.36-0.78,0.91-1.43,1.66-1.93c0.35-0.24,0.74-0.44,1.17-0.59c-0.32-4.17-0.43-9.42-0.23-13.82c0.1-1.04,0.31-2.09,0.59-3.13 c1.24-4.41,4.33-7.96,8.16-10.4c2.11-1.35,4.43-2.36,6.84-3.04c1.54-0.44-1.31-5.34,0.28-5.51c7.67-0.79,20.08,6.22,25.44,12.01 c2.68,2.9,4.37,6.75,4.73,11.84l-0.3,12.54l0,0c1.34,0.41,2.2,1.26,2.54,2.63c0.39,1.53-0.03,3.67-1.33,6.6l0,0 c-0.02,0.05-0.05,0.11-0.08,0.16l-5.51,9.07c-2.02,3.33-4.08,6.68-6.75,9.31C73.75,80,74,80.35,74.24,80.7 c1.09,1.6,2.19,3.2,3.6,4.63c0.05,0.05,0.09,0.1,0.12,0.15c6.34,4.48,21.77,5.57,27.69,8.87l0.24,0.14 c6.87-9.22,10.93-20.65,10.93-33.03c0-15.29-6.2-29.14-16.22-39.15c-10-10.03-23.85-16.23-39.14-16.23 c-15.29,0-29.14,6.2-39.15,16.22C12.27,32.3,6.07,46.15,6.07,61.44C6.07,73.82,10.13,85.25,16.99,94.47L16.99,94.47L16.99,94.47z"/></g></svg>
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="761.000000pt" height="684.000000pt" viewBox="0 0 761.000000 684.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,684.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M765 6608 c-52 -18 -93 -56 -118 -110 -24 -49 -26 -68 -31 -243 -4
-104 -9 -245 -12 -312 l-6 -123 221 0 221 0 0 313 0 313 -26 52 c-49 98 -152
144 -249 110z"/>
<path d="M596 5393 c-8 -271 -21 -809 -41 -1668 -8 -346 -17 -714 -21 -817
l-6 -188 301 0 301 0 0 50 0 50 100 0 100 0 0 -50 0 -50 200 0 200 0 0 -1050
0 -1050 100 0 100 0 0 2250 0 2250 -300 0 -300 0 0 -100 0 -100 200 0 200 0 0
-900 0 -900 -200 0 -200 0 0 -50 0 -50 -104 0 -104 0 -6 188 c-4 103 -13 491
-21 862 -9 371 -20 853 -25 1070 -5 217 -10 414 -10 438 l0 42 -229 0 -229 0
-6 -227z"/>
<path d="M2130 2870 l0 -1250 400 0 400 0 0 -100 0 -100 550 0 550 0 0 100 0
100 150 0 150 0 0 -350 0 -350 700 0 700 0 0 350 0 350 100 0 100 0 0 -350 0
-350 300 0 300 0 0 1600 0 1600 -2200 0 -2200 0 0 -1250z m1598 990 c166 -164
277 -381 329 -638 25 -124 24 -403 -1 -527 -56 -270 -193 -521 -367 -674 l-46
-40 -25 27 c-13 15 -43 50 -66 79 l-43 52 52 48 c406 379 408 1148 6 1542
l-55 54 61 78 c34 43 65 78 68 78 4 1 43 -35 87 -79z m-307 -258 c20 -24 55
-77 79 -118 183 -320 170 -760 -33 -1076 -42 -67 -166 -200 -178 -193 -5 3
-35 39 -68 79 l-60 73 52 55 c138 147 215 369 203 588 -7 133 -26 211 -82 328
-32 67 -62 111 -110 162 l-66 70 43 52 c23 29 54 65 67 80 l25 28 46 -43 c25
-23 62 -61 82 -85z m1709 -32 l0 -50 50 0 50 0 0 50 0 50 100 0 100 0 0 -50 0
-50 50 0 50 0 0 50 0 50 100 0 100 0 0 -50 0 -50 50 0 50 0 0 -50 0 -50 50 0
50 0 0 -100 0 -100 -50 0 -50 0 0 -50 0 -50 50 0 50 0 0 -100 0 -100 -50 0
-50 0 0 -50 0 -50 50 0 50 0 0 -100 0 -100 -50 0 -50 0 0 -50 0 -50 -50 0 -50
0 0 -50 0 -50 -100 0 -100 0 0 50 0 50 -50 0 -50 0 0 -50 0 -50 -100 0 -100 0
0 50 0 50 -50 0 -50 0 0 -50 0 -50 -100 0 -100 0 0 50 0 50 -50 0 -50 0 0 50
0 50 -50 0 -50 0 0 100 0 100 50 0 50 0 0 50 0 50 -50 0 -50 0 0 100 0 100 50
0 50 0 0 50 0 50 -50 0 -50 0 0 100 0 100 50 0 50 0 0 50 0 50 50 0 50 0 0 50
0 50 100 0 100 0 0 -50z m-2122 -130 c201 -202 228 -609 56 -868 -45 -69 -104
-133 -115 -127 -4 3 -36 39 -69 80 l-61 74 30 28 c74 68 131 214 131 335 0
117 -48 244 -121 323 l-41 44 64 80 c35 44 66 80 69 80 3 1 29 -22 57 -49z
m-369 -216 c63 -71 85 -139 85 -259 0 -80 -5 -111 -23 -157 -20 -52 -103 -160
-113 -148 -124 150 -130 159 -110 180 22 24 42 84 42 129 0 36 -23 97 -46 122
-15 16 -11 24 48 98 34 44 66 80 70 80 3 1 25 -20 47 -45z m2091 -1904 l0
-200 -100 0 -100 0 0 200 0 200 100 0 100 0 0 -200z m400 0 l0 -200 -100 0
-100 0 0 200 0 200 100 0 100 0 0 -200z m400 0 l0 -200 -100 0 -100 0 0 200 0
200 100 0 100 0 0 -200z m800 0 l0 -200 -100 0 -100 0 0 200 0 200 100 0 100
0 0 -200z"/>
<path d="M5030 3020 l0 -300 300 0 300 0 0 300 0 300 -300 0 -300 0 0 -300z"/>
</g>
</svg>
+3
View File
@@ -0,0 +1,3 @@
import noImagePlaceholder from './no-Image-placeholder.svg'
export { noImagePlaceholder }
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="No-Image-Placeholder.svg" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" version="1.1" id="svg2" viewBox="0 0 329.77792 406.00738" height="406.00739" width="329.77792">
<defs id="defs4">
<linearGradient id="linearGradient967" inkscape:collect="always">
<stop id="stop963" offset="0" style="stop-color:#c2c2c2;stop-opacity:1"/>
<stop id="stop965" offset="1" style="stop-color:#9f9f9f;stop-opacity:1"/>
</linearGradient>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3414" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3410" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3406" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3402" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3398" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3392" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3388" effect="spiro"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3372" effect="spiro"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3368" effect="spiro"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3364" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3360" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3346" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3392-8" is_visible="true"/>
<linearGradient gradientTransform="translate(-45.254833,0.35355338)" gradientUnits="userSpaceOnUse" y2="108.77648" x2="658.45801" y1="6.5995569" x1="660.06653" id="linearGradient969" xlink:href="#linearGradient967" inkscape:collect="always"/>
</defs>
<sodipodi:namedview inkscape:document-rotation="0" inkscape:window-maximized="1" inkscape:window-y="42" inkscape:window-x="0" inkscape:window-height="1004" inkscape:window-width="1920" units="px" fit-margin-bottom="0" fit-margin-right="0" fit-margin-left="0" fit-margin-top="0" inkscape:guide-bbox="true" inkscape:snap-smooth-nodes="true" showguides="false" inkscape:object-nodes="true" showgrid="false" inkscape:current-layer="layer1" inkscape:document-units="px" inkscape:cy="109.10202" inkscape:cx="148.40044" inkscape:zoom="0.7071068" inkscape:pageshadow="2" inkscape:pageopacity="0.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#ffffff" id="base">
<inkscape:grid originy="-510.42818" originx="-399.13435" id="grid3336" type="xygrid"/>
<sodipodi:guide id="guide3375" orientation="0,1" position="-117.13437,-25.564321"/>
<sodipodi:guide id="guide3377" orientation="0,1" position="-114.13437,-23.564321"/>
<sodipodi:guide id="guide3380" orientation="0,1" position="-121.13437,-27.564321"/>
<sodipodi:guide id="guide3382" orientation="0,1" position="-114.13437,-22.564321"/>
<sodipodi:guide id="guide3384" orientation="0,1" position="-114.13437,-21.564321"/>
<sodipodi:guide id="guide3416" orientation="-2,0.5" position="-115.13437,-25.564311"/>
<sodipodi:guide id="guide3420" orientation="-2,0.5" position="-115.13437,-25.564311"/>
<sodipodi:guide id="guide4180" orientation="0.24382204,-0.96981999" position="206.80442,220.41193"/>
<sodipodi:guide id="guide4182" orientation="1,0" position="86.804424,280.52227"/>
<sodipodi:guide id="guide4186" orientation="1,0" position="206.80442,250.52231"/>
<sodipodi:guide id="guide4188" orientation="-0.24382199,0.96982" position="206.80442,190.30156"/>
</sodipodi:namedview>
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-399.13437,-122.79051)" id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<rect ry="7.0136137" y="122.79051" x="399.13437" height="406.00739" width="329.77792" id="rect1017" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.59331;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
<g transform="translate(43.778173,191.04163)" id="g1015">
<rect style="fill:#9f9f9f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.2995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect1002" width="82.489967" height="90.470001" x="398.75827" y="178.74706" ry="8.3970251" transform="rotate(-16.342822)"/>
<g id="g1000" transform="rotate(16.320529,538.13563,-184.89727)">
<rect ry="4.5961938" y="1.6498091" x="547.18585" height="115.96551" width="107.83378" id="rect961" style="fill:url(#linearGradient969);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:5.398;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"/>
<g style="stroke:#ffffff;stroke-width:13.0708;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(0.17265471,0,0,0.17265471,512.49324,-6.3296456)" id="g875">
<rect style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="rect3338" width="491.10556" height="449.99814" x="270" y="107.36227"/>
<rect style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="rect3342" width="491.10559" height="209.99976" x="270" y="107.36227"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 300,317.36255 38.46147,-53.53818 60.53097,-45.16084 15.88277,18.57394 13.61285,-38.68356 8.20133,-2.98188 13.3106,-28.2093 180,179.99979" id="path3344" inkscape:path-effect="#path-effect3346" inkscape:original-d="m 300,317.36255 38.46147,-53.53818 60.53097,-45.16084 15.88277,18.57394 13.61285,-38.68356 8.20133,-2.98188 13.3106,-28.2093 180,179.99979" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 180,60 c 4.09311,16.474688 7.71219,33.067277 10.85156,49.75 2.38256,12.66097 4.48857,25.37408 6.31641,38.12695 l -22.06445,-7.16015 -46.11133,-29.41602 5.32422,46.42578 -1.61524,24.78711 10.05274,30.37695 73.18554,-11.75585 L 300,180 252.19922,102.56641 242.5,117.5 215.375,95.375 Z" transform="translate(270,107.36227)" id="path3390-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cscccccccccccc"/>
<path inkscape:connector-curvature="0" inkscape:original-d="m 419.99999,347.36252 81.89918,-74.42959 18.50574,-9.68009 23.6512,-44.18894 25.94388,-21.70121 179.99999,179.99979" inkscape:path-effect="#path-effect3360" id="path3358" d="m 419.99999,347.36252 81.89918,-74.42959 18.50574,-9.68009 23.6512,-44.18894 25.94388,-21.70121 179.99999,179.99979" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="cccccc"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 569.99999,197.36269 35.9388,80.91289 v 30.11038 30.11038 l 22.45864,19.46652 c 6.52453,-6.45031 14.14893,-11.78526 22.44431,-15.70477 14.8245,-7.00447 31.33823,-9.35959 47.17057,-13.6217 6.42776,-1.73037 12.90672,-3.85419 18.21343,-7.87277 1.35174,-1.02362 2.61592,-2.16281 3.77424,-3.40107 h -30 l -40.52149,-40.55006 -29.85645,-48.91972 -10.25307,8.83886 z" id="path3386" inkscape:path-effect="#path-effect3388" inkscape:original-d="m 569.99999,197.36269 35.9388,80.91289 v 30.11038 30.11038 l 22.45864,19.46652 c 5.77311,-6.36416 13.54339,-11.40815 22.44431,-15.70477 13.00316,-6.27685 32.0432,-8.74899 47.17057,-13.6217 6.8762,-2.21491 12.68001,-4.81998 18.21343,-7.87277 1.55883,-0.86001 1.99765,-2.671 3.77424,-3.40107 h -30 l -40.52149,-40.55006 -29.85645,-48.91972 -10.25307,8.83886 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccssscccccc"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 419.99999,557.36227 c -0.41699,-9.60089 -8.81759,-17.60878 17.1252,-30.66806 31.8318,-16.02389 125.895,-35.88836 152.1537,-59.98434 19.42709,-17.82687 -70.4154,-37.66945 -55.0191,-59.07323 6.981,-9.70528 59.037,-19.96947 82.1463,-30.27386 21.90569,-9.76799 15.14129,-19.80328 31.4046,-29.97507 15.7092,-9.82558 68.3499,-19.77358 72.18929,-30.02516 -10.41359,10.52188 -68.83379,20.40327 -89.99999,30.00026 -22.3377,10.128 -21.4689,19.93018 -49.4313,29.48367 -30.1245,10.29239 -89.142,20.55268 -102.7077,30.51626 -28.4133,20.86858 46.863,42.59995 16.2024,59.99993 C 452.54309,490.92554 344.7219,510.65712 300,527.3626 c -30.9039,11.54369 -28.4079,17.74799 -30,29.99967" id="path3370" inkscape:connector-curvature="0" sodipodi:nodetypes="cssssscsssssc"/>
</g>
</g>
</g>
<text id="text1021" y="412.12527" x="562.00677" style="font-style:normal;font-weight:normal;font-size:32px;line-height:1.25;font-family:sans-serif;fill:#767676;fill-opacity:1;stroke:none" xml:space="preserve"><tspan style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle" y="412.12527" x="562.00677" id="tspan1019" sodipodi:role="line">NO IMAGE</tspan><tspan style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle" id="tspan1023" y="452.12527" x="562.00677" sodipodi:role="line">AVAILABLE</tspan></text>
</g>
</svg>
+9
View File
@@ -0,0 +1,9 @@
import { registry } from '@generated/registry'
import { createTuyau } from '@tuyau/core/client'
export const client = createTuyau({
baseUrl: '/',
registry,
})
export const urlFor = client.urlFor
+14
View File
@@ -0,0 +1,14 @@
import { ref, watch } from 'vue'
// Cr├®er une r├®f├®rence pour isAdminActive
const isAdminActive = ref(JSON.parse(localStorage.getItem('isAdminActive') || 'false'))
// Surveiller les changements de isAdminActive et mettre à jour localStorage
watch(isAdminActive, (newValue) => {
localStorage.setItem('isAdminActive', JSON.stringify(newValue))
})
// Exporter une fonction pour utiliser isAdminActive
export function useAdminMode() {
return { isAdminActive }
}
+9
View File
@@ -0,0 +1,9 @@
import { ref } from 'vue'
const isOpen = ref(false)
export function useSidebar() {
return {
isOpen,
}
}
+240
View File
@@ -0,0 +1,240 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
--gray-1: oklch(98.5% 0 0);
--gray-2: oklch(97% 0 0);
--gray-3: oklch(92.2% 0 0);
--gray-4: oklch(87% 0 0);
--gray-6: oklch(55.6% 0 0);
--gray-7: oklch(43.9% 0 0);
--gray-8: oklch(37.1% 0 0);
--gray-10: oklch(26.9% 0 0);
--gray-12: oklch(14.5% 0 0);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
font-family: system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
background: var(--gray-2);
color: var(--gray-10);
font-size: 16px;
line-height: 1.5;
}
a {
color: inherit;
text-decoration: none;
}
[x-cloak] {
display: none;
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--gray-12);
}
/* Header */
header {
max-width: 1440px;
margin: auto;
padding: 0 30px;
}
header > div {
display: flex;
justify-content: space-between;
align-items: center;
height: 64px;
}
header nav {
display: flex;
align-items: center;
gap: 26px;
}
header nav a {
font-weight: 500;
color: var(--gray-8);
}
header nav a:hover,
header nav a.current {
color: var(--gray-12);
}
/* Main */
main {
max-width: 1440px;
margin: 0 30px;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - 65px);
background: #fff;
border: 1px solid var(--gray-3);
}
.hero {
padding: 100px 50px;
max-width: 880px;
}
.hero h1 {
margin-bottom: 15px;
font-size: 52px;
font-weight: 600;
letter-spacing: -1px;
line-height: 1.05;
}
.hero p {
font-size: 22px;
color: var(--gray-7);
}
.hero .button {
margin-top: 30px;
display: inline-block;
padding: 10px 16px;
}
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
padding: 0 50px;
border-top: 1px solid var(--gray-3);
}
.cards a {
padding: 30px 40px;
border-right: 1px solid var(--gray-3);
}
.cards a:first-child {
border-left: 1px solid var(--gray-3);
}
.cards a:hover {
background: var(--gray-1);
}
.cards h3 {
margin-bottom: 10px;
font-size: 20px;
font-weight: 600;
letter-spacing: -0.4px;
}
.cards p {
color: var(--gray-6);
}
/* Form */
.form-container {
display: flex;
flex-direction: column;
justify-content: center;
max-width: 400px;
margin: auto;
}
.form-container h1 {
font-size: 32px;
letter-spacing: -0.5px;
margin-bottom: 5px;
}
.form-container p {
font-size: 18px;
margin-bottom: 48px;
color: var(--gray-6);
}
form {
display: flex;
flex-direction: column;
gap: 24px;
}
label {
margin-bottom: 4px;
display: block;
font-size: 14px;
font-weight: 500;
}
input,
textarea,
button {
width: 100%;
border-radius: 4px;
font: inherit;
}
input {
height: 40px;
border: 1px solid var(--gray-4);
padding: 0 16px;
}
input[data-invalid='true'],
textarea[data-invalid='true'] {
border-color: #fb2c36;
}
input[data-invalid='true'] + div,
textarea[data-invalid='true'] + div {
color: #fb2c36;
font-size: 14px;
font-weight: 500;
margin-top: 2px;
}
button {
background: var(--gray-12);
color: #fff;
border: none;
padding: 10px;
font-weight: 500;
}
button:hover {
background: var(--gray-10);
}
/* Alerts */
.alert {
background: #fff;
position: relative;
padding: 12px 16px;
font-size: 14px;
min-width: 380px;
font-weight: 500;
border: 1px solid var(--gray-3);
border-radius: 10px;
animation: scale-up 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) both;
}
.alert-destructive {
color: #fb2c36;
background: #fb2c361a;
border-color: #fb2c36;
}
.alert-success {
color: #00a63e;
background: #00a63e1a;
border-color: #00a63e;
}
.flash-container {
position: fixed;
top: 80px;
left: 0;
right: 0;
display: flex;
flex-direction: column;
align-items: center;
}
@keyframes scale-up {
from {
transform: scale(0.7);
}
to {
transform: scale(1);
}
}
+54
View File
@@ -0,0 +1,54 @@
import { createApp, DirectiveBinding, h, ObjectDirective } from 'vue'
import DeleteConfirmationModal from '~/pages/widgets/DeleteConfirmationModal.vue'
// Interface pour ├®tendre HTMLElement avec _handleClick
interface HTMLElementWithHandleClick extends HTMLElement {
_handleClick?: (event: Event) => void
}
const deleteConfirmDirective: ObjectDirective<HTMLElementWithHandleClick> = {
mounted(el: HTMLElementWithHandleClick, binding: DirectiveBinding) {
const handleClick = (event: Event) => {
event.stopPropagation() // Emp├¬cher la propagation de l'├®v├®nement
event.preventDefault() // Emp├¬cher l'action par d├®faut
const modalApp = createApp({
data() {
return { show: true }
},
methods: {
confirm() {
this.show = false
document.body.removeChild(modalContainer)
binding.value() // Ex├®cuter la fonction de suppression
},
cancel() {
this.show = false
document.body.removeChild(modalContainer)
},
},
render() {
return h(DeleteConfirmationModal, {
show: this.show,
onConfirm: this.confirm,
onCancel: this.cancel,
})
},
})
const modalContainer = document.createElement('div')
document.body.appendChild(modalContainer)
modalApp.mount(modalContainer)
}
el.addEventListener('click', handleClick)
el._handleClick = handleClick // Stocker la r├®f├®rence pour la suppression ult├®rieure
},
unmounted(el: HTMLElementWithHandleClick) {
if (el._handleClick) {
el.removeEventListener('click', el._handleClick)
}
},
}
export default deleteConfirmDirective
+30
View File
@@ -0,0 +1,30 @@
import { ObjectDirective } from 'vue'
// Fonction pour formater le prix
const formatPrice = (value: string): string => {
const numberValue = Number.parseFloat(value)
return Number.isNaN(numberValue) ? '' : numberValue.toFixed(2).replace('.', ',')
}
// Interface pour ├®tendre HTMLInputElement avec _handleBlur
interface HTMLInputElementWithHandleBlur extends HTMLInputElement {
_handleBlur?: () => void
}
const priceDirective: ObjectDirective<HTMLInputElementWithHandleBlur> = {
mounted(el: HTMLInputElementWithHandleBlur) {
const handleBlur = () => {
el.value = formatPrice(el.value)
el.dispatchEvent(new Event('input')) // Pour mettre à jour le v-model
}
el.addEventListener('blur', handleBlur)
el._handleBlur = handleBlur // Stocker la r├®f├®rence pour la suppression ult├®rieure
},
unmounted(el: HTMLInputElementWithHandleBlur) {
if (el._handleBlur) {
el.removeEventListener('blur', el._handleBlur)
}
},
}
export default priceDirective
+111
View File
@@ -0,0 +1,111 @@
import { createVNode, DirectiveBinding, ObjectDirective, render } from 'vue'
import ValidationError from '~/pages/widgets/ValidationError.vue'
interface ValidationErrorBinding extends DirectiveBinding {
value: string | null
}
const validationErrorDirective: ObjectDirective<HTMLElement, string | null> = {
mounted(el: HTMLElement, binding: ValidationErrorBinding) {
const errorMessage = binding.value
const fieldName = el.getAttribute('name')
if (errorMessage && fieldName) {
const container = document.createElement('div')
container.classList.add(`validation-error-container-${fieldName}`)
container.classList.add(
'transition-all',
'duration-2500',
'ease-in-out',
'w-0',
'opacity-0'
) // Ajout des classes Tailwind pour la transition
container.style.position = 'absolute'
container.style.bottom = '-17px'
container.style.right = '0px'
container.style.whiteSpace = 'nowrap'
container.style.textAlign = 'right'
if (el.parentNode && el.parentNode instanceof HTMLElement) {
el.parentNode.style.position = 'relative'
el.parentNode.appendChild(container)
const vnode = createVNode(ValidationError, { message: errorMessage })
render(vnode, container)
// Force reflow pour d├®clencher la transition
void container.offsetWidth
container.classList.remove('w-0', 'opacity-0')
container.classList.add('w-full', 'opacity-100')
// Attach the container to the element for future reference
;(el as any)._validationErrorContainer = container
} else {
console.error('Parent node is null or not an HTMLElement during mounted')
}
}
},
updated(el: HTMLElement, binding: ValidationErrorBinding) {
const errorMessage = binding.value
const fieldName = el.getAttribute('name')
let container = (el as any)._validationErrorContainer
if (errorMessage && fieldName) {
if (container) {
const vnode = createVNode(ValidationError, { message: errorMessage })
render(vnode, container)
} else {
const newContainer = document.createElement('div')
newContainer.classList.add(`validation-error-container-${fieldName}`)
newContainer.classList.add(
'transition-all',
'duration-2500',
'ease-in-out',
'w-0',
'opacity-0'
) // Ajout des classes Tailwind pour la transition
newContainer.style.position = 'absolute'
newContainer.style.bottom = '-17px'
newContainer.style.right = '0px'
newContainer.style.whiteSpace = 'nowrap'
newContainer.style.textAlign = 'right'
if (el.parentNode && el.parentNode instanceof HTMLElement) {
el.parentNode.style.position = 'relative'
el.parentNode.appendChild(newContainer)
const vnode = createVNode(ValidationError, { message: errorMessage })
render(vnode, newContainer)
// Force reflow pour d├®clencher la transition
void newContainer.offsetWidth
newContainer.classList.remove('w-0', 'opacity-0')
newContainer.classList.add('w-100', 'opacity-100')
// Attach the container to the element for future reference
;(el as any)._validationErrorContainer = newContainer
} else {
console.error('Parent node is null or not an HTMLElement during updated')
}
}
} else if (container) {
container.classList.remove('w-100', 'opacity-100')
container.classList.remove('transition-all', 'duration-2500', 'ease-in-out') // Supprimez les classes de transition pour la disparition
container.classList.add('w-0', 'opacity-0')
// Supprimez le conteneur imm├®diatement sans d├®lai
render(null, container)
container.remove()
;(el as any)._validationErrorContainer = null
}
},
unmounted(el: HTMLElement) {
// Clean up the error container when the element is unmounted
const container = (el as any)._validationErrorContainer
if (container) {
render(null, container)
container.remove()
}
},
}
export default validationErrorDirective
+70
View File
@@ -0,0 +1,70 @@
<script setup lang="ts">
import { watch } from 'vue'
import { usePage } from '@inertiajs/vue3'
import { toast, Toaster } from 'vue-sonner'
import type { Data } from '@generated/data'
import { Link, Form } from '@adonisjs/inertia/vue'
const page = usePage<Data.SharedProps>()
watch(
() => page.url,
() => toast.dismiss()
)
watch(
() => page.props.flash,
(flashMessages) => {
if (flashMessages.error) {
toast.error(flashMessages.error)
}
if (flashMessages.success) {
toast.success(flashMessages.success)
}
},
{ immediate: true }
)
</script>
<template>
<header>
<div>
<div>
<Link route="home">
<svg
width="66"
height="24"
viewBox="0 0 105 38"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M0 0h7.5v15H0ZM7.5 15h7.5v15H7.5ZM15 30h7.5v7.5H15ZM22.5 15h7.5v15H22.5ZM30 0h7.5v15H30ZM45 0h7.5v30h15v-30h7.5v37.5h-30v-37.5ZM82.5 37.5V0H105v7.5H90V15h15v7.5H90V30h15v7.5H82.5Z"
fill="currentColor"
/>
</svg>
</Link>
</div>
<div>
<nav>
<template v-if="page.props.user">
<span>{{ page.props.user.initials }}</span>
<Form route="session.destroy">
<button type="submit">Logout</button>
</Form>
</template>
<template v-else>
<Link route="new_account.create">Signup</Link>
<Link route="session.create">Login</Link>
</template>
</nav>
</div>
</div>
</header>
<main>
<slot />
</main>
<Toaster position="top-center" rich-colors />
</template>
+98
View File
@@ -0,0 +1,98 @@
<script setup lang="ts">
import { Form, Link } from '@adonisjs/inertia/vue'
import { useForm } from '@inertiajs/vue3'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
defineOptions({ layout: EmptyLayout })
const form = useForm({
fullName: '',
email: '',
password: '',
passwordConfirmation: '',
})
</script>
<template>
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
<div class="flex flex-col items-center justify-center mb-8">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">Create Account</h1>
<p class="text-sm text-gray-600 mt-2">Join PC Creator today</p>
</div>
<Form route="account.signup" #default="{ processing, errors }">
<div class="space-y-4 sm:space-y-6">
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Full Name</span>
<input
v-model="form.fullName"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="fullName"
type="text"
placeholder="Enter your full name"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
<input
v-model="form.email"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="email"
type="email"
placeholder="Enter your email"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
<input
v-model="form.password"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="password"
type="password"
placeholder="Enter your password"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Confirm Password</span>
<input
v-model="form.passwordConfirmation"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="passwordConfirmation"
type="password"
placeholder="Confirm your password"
/>
</label>
</div>
<button
type="submit"
:disabled="processing"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition disabled:opacity-50 disabled:cursor-not-allowed"
>
{{ processing ? 'Creating account...' : 'Sign Up' }}
</button>
<div class="text-center mt-4">
<p class="text-sm text-gray-600">
Already have an account?
<Link route="auth.show_login" class="text-indigo-600 hover:text-indigo-700 font-semibold">
Login
</Link>
</p>
</div>
</div>
</Form>
</div>
</div>
</template>
+124
View File
@@ -0,0 +1,124 @@
<script lang="ts" setup>
import { Link, useForm } from '@inertiajs/vue3'
import { computed } from 'vue'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
defineOptions({ layout: EmptyLayout })
const props = defineProps<{ errors?: any[] | any }>()
const vineErrors = computed(() => {
if (Array.isArray(props.errors)) {
return props.errors as any[]
}
return []
})
const authError = computed(() => {
if (!Array.isArray(props.errors) && props.errors) {
return props.errors as any
}
return null
})
const form = useForm({
email: '',
password: '',
})
function getErrorMessage(field: string): string | null {
const error = vineErrors.value.find((error) => error.field === field)
return error ? error.message : null
}
console.log(authError)
console.log(vineErrors)
console.log(props)
</script>
<template>
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
<div class="flex flex-col items-center justify-center mb-8">
<div class="mb-4">
<svg
class="w-12 h-12 sm:w-14 sm:h-14 text-indigo-600"
fill="currentColor"
preserveAspectRatio="xMidYMid meet"
viewBox="0 0 494.000000 555.000000"
xmlns="http://www.w3.org/2000/svg"
>
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)">
<path
d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23 19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44 l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8 -335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10 1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748 -30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343 -53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47 4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4 437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151 -80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450 -238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494 243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96 -66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83 -180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95 44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360 -187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0 -95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107 49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64 -42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45 -62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93 198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4 6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177 -121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11 75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353 -84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24 -45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68 523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6 56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7 -302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0 -9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196 -15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219 -9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2 -203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212 1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10 -42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305 -33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0 30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338 63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3 -191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25 -34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81 -54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360 9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0 -16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694 4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3 1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153 79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17 0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44 800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125 -181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93 c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50 8 50 -2z"
/>
</g>
</svg>
</div>
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">PC Creator</h1>
</div>
<form class="space-y-4 sm:space-y-6">
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
<input
v-model="form.email"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="email"
type="email"
placeholder="Enter your email"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
<input
v-model="form.password"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="password"
type="password"
placeholder="Enter your password"
/>
</label>
</div>
<div class="flex items-center justify-between pt-2">
<label class="flex items-center cursor-pointer">
<input
class="w-4 h-4 text-indigo-600 border-gray-300 rounded focus:ring-2 focus:ring-indigo-500/40"
type="checkbox"
/>
<span class="ml-2 text-sm text-gray-600">Remember me</span>
</label>
</div>
<Link
:data="form"
as="button"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition"
href="/auth/login"
method="post"
type="button"
>
Login
</Link>
<Link
as="button"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-3 sm:mt-4 text-base font-semibold text-indigo-600 bg-gray-100 rounded-lg hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition"
href="/account/signup"
type="button"
>
Create an account
</Link>
</form>
</div>
</div>
</template>
<style scoped>
/* No inline styles - using Tailwind classes only */
</style>
+98
View File
@@ -0,0 +1,98 @@
<script setup lang="ts">
import { Form, Link } from '@adonisjs/inertia/vue'
import { useForm } from '@inertiajs/vue3'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
defineOptions({ layout: EmptyLayout })
const form = useForm({
fullName: '',
email: '',
password: '',
passwordConfirmation: '',
})
</script>
<template>
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
<div class="flex flex-col items-center justify-center mb-8">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">Create Account</h1>
<p class="text-sm text-gray-600 mt-2">Join PC Creator today</p>
</div>
<Form route="account.signup" #default="{ processing, errors }">
<div class="space-y-4 sm:space-y-6">
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Full Name</span>
<input
v-model="form.fullName"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="fullName"
type="text"
placeholder="Enter your full name"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
<input
v-model="form.email"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="email"
type="email"
placeholder="Enter your email"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
<input
v-model="form.password"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="password"
type="password"
placeholder="Enter your password"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Confirm Password</span>
<input
v-model="form.passwordConfirmation"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="passwordConfirmation"
type="password"
placeholder="Confirm your password"
/>
</label>
</div>
<button
type="submit"
:disabled="processing"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition disabled:opacity-50 disabled:cursor-not-allowed"
>
{{ processing ? 'Creating account...' : 'Sign Up' }}
</button>
<div class="text-center mt-4">
<p class="text-sm text-gray-600">
Already have an account?
<Link route="auth.show_login" class="text-indigo-600 hover:text-indigo-700 font-semibold">
Login
</Link>
</p>
</div>
</div>
</Form>
</div>
</div>
</template>
Loaded 100 of 144 files, more files were not shown because too many files have changed in this diff. Show more