feat: init

This commit is contained in:
2025-09-04 11:29:00 +08:00
parent 2c9059ce2f
commit ddbee614e8
89 changed files with 3476 additions and 349 deletions

42
.eslintrc.js Normal file
View File

@@ -0,0 +1,42 @@
module.exports = {
root: true,
env: {
browser: true,
es2020: true,
node: true,
},
extends: [
"eslint:recommended",
"@typescript-eslint/recommended",
"plugin:react-hooks/recommended",
],
ignorePatterns: ["dist", ".eslintrc.js", "node_modules"],
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
},
plugins: ["react-refresh"],
rules: {
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
"@typescript-eslint/no-explicit-any": "warn",
},
overrides: [
{
files: ["packages/**/*.ts", "packages/**/*.tsx"],
rules: {
"no-console": "warn",
},
},
{
files: ["projects/**/*.ts", "projects/**/*.tsx"],
rules: {
"no-console": "off",
},
},
],
};

95
.gitignore vendored
View File

@@ -1 +1,96 @@
# Dependencies
node_modules
.pnpm-store/
# Build outputs
dist/
build/
# Environment files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
*.lcov
# nyc test coverage
.nyc_output
# Dependency directories
jspm_packages/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
# Storybook build outputs
.out
.storybook-out
# Temporary folders
tmp/
temp/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# Local Netlify folder
.netlify

View File

@@ -1,8 +1,10 @@
{
"name": "ec-web-h5",
"name": "tashow-h5",
"version": "0.0.0",
"type": "module",
"scripts": {
"dev:translate-h5": "pnpm --filter translate-h5 dev",
"build:translate-h5": "pnpm --filter translate-h5 build",
"dev": "vite",
"dev:https": "vite --https",
"build": "tsc && vite build",

0
packages/hooks/index.ts Normal file
View File

View File

@@ -0,0 +1,12 @@
import zhCN from '@/locales/zh_CN.json'
import enUS from '@/locales/en_US.json'
import {useI18nStore} from '@/store/i18n';
export default function useI18n() {
const {lang} = useI18nStore();
const locales = lang === 'en_US' ? enUS : zhCN;
return (name: string) => {
return locales[name as keyof typeof locales] || name;
}
}

View File

@@ -0,0 +1,60 @@
import {useState, useEffect} from 'react';
import useI18n from "@/hooks/i18n";
// 定义位置坐标的类型
export interface Coordinates {
lat: number;
lng: number;
}
// 定义返回的位置状态的类型
export interface LocationState {
loaded: boolean;
coordinates: Coordinates | null;
}
// 定义错误状态的类型
export type ErrorState = string | null;
export const useLocation = (): { location: LocationState; error: ErrorState } => {
const t = useI18n();
// 用于存储位置信息和加载状态的状态
const [location, setLocation] = useState<LocationState>({
loaded: false,
coordinates: null,
});
// 用于存储任何错误消息的状态
const [error, setError] = useState<ErrorState>(null);
// 地理位置成功处理函数
const onSuccess = (location: GeolocationPosition) => {
setLocation({
loaded: true,
coordinates: {
lat: location.coords.latitude,
lng: location.coords.longitude,
},
});
};
// 地理位置错误处理函数
const onError = (error: GeolocationPositionError) => {
setError(error.message);
};
// 使用 useEffect 在组件挂载时执行地理位置请求
useEffect(() => {
// 检查浏览器是否支持地理位置
if (!navigator.geolocation) {
setError(t('hooks.location.unsupported'));
return;
}
// 请求用户的当前位置
navigator.geolocation.getCurrentPosition(onSuccess, onError);
}, []);
return {location, error};
};

View File

@@ -0,0 +1,28 @@
import {useState, useEffect} from 'react';
import isEqual from 'lodash.isequal';
function useSessionStorage<T>(key: string, initialValue: T): [T, (value: T) => void] {
// 初始化状态
const [storedValue, setStoredValue] = useState<T>(() => {
const item = sessionStorage.getItem(key);
if (item !== null) {
// 如果 sessionStorage 中有数据,则使用现有数据
return JSON.parse(item);
} else {
// 当 sessionStorage 中没有相应的键时,使用 initialValue 初始化,并写入 sessionStorage
sessionStorage.setItem(key, JSON.stringify(initialValue));
return initialValue;
}
});
// 监听并保存变化到 sessionStorage
useEffect(() => {
if (!isEqual(JSON.parse(sessionStorage.getItem(key) || 'null'), storedValue)) {
sessionStorage.setItem(key, JSON.stringify(storedValue));
}
}, [key, storedValue]);
return [storedValue, setStoredValue];
}
export default useSessionStorage;

View File

@@ -0,0 +1,198 @@
// hooks/useFileUpload.ts (更新)
import { useState, useCallback } from "react";
import {
UploadConfig,
UploadProgress,
UploadResponse,
VoiceUploadStatus,
} from "../types/upload";
interface UseFileUploadReturn {
uploadStatus: VoiceUploadStatus;
uploadFile: (
file: Blob,
fileName: string,
config: UploadConfig
) => Promise<UploadResponse>;
resetUpload: () => void;
}
export const useFileUpload = (): UseFileUploadReturn => {
const [uploadStatus, setUploadStatus] = useState<VoiceUploadStatus>({
status: "idle",
});
// 检测文件类型并转换文件名
const getFileExtension = (mimeType: string): string => {
const mimeToExt: Record<string, string> = {
"audio/webm": ".webm",
"audio/mp4": ".m4a",
"audio/aac": ".aac",
"audio/wav": ".wav",
"audio/ogg": ".ogg",
"audio/mpeg": ".mp3",
};
// 处理带codecs的MIME类型
const baseMimeType = mimeType.split(";")[0];
return mimeToExt[baseMimeType] || ".webm";
};
const uploadFile = useCallback(
async (
file: Blob,
fileName: string,
config: UploadConfig
): Promise<UploadResponse> => {
// 检查文件大小
if (config.maxFileSize && file.size > config.maxFileSize) {
const error = `文件大小超过限制 (${Math.round(
config.maxFileSize / 1024 / 1024
)}MB)`;
setUploadStatus({
status: "error",
error,
});
throw new Error(error);
}
// 更宽松的文件类型检查支持iOS格式
const allowedTypes = config.allowedTypes || [
"audio/webm",
"audio/mp4",
"audio/aac",
"audio/wav",
"audio/ogg",
"audio/mpeg",
];
const baseMimeType = file.type.split(";")[0];
const isTypeAllowed = allowedTypes.some(
(type) => baseMimeType === type || baseMimeType === type.split(";")[0]
);
if (!isTypeAllowed) {
console.warn(`文件类型 ${file.type} 不在允许列表中,但继续上传`);
}
// 根据实际MIME类型调整文件名
const extension = getFileExtension(file.type);
const adjustedFileName = fileName.replace(/\.[^/.]+$/, "") + extension;
setUploadStatus({
status: "uploading",
progress: { loaded: 0, total: file.size, percentage: 0 },
});
return new Promise((resolve, reject) => {
const formData = new FormData();
formData.append(config.fieldName || "file", file, adjustedFileName);
// 添加额外的元数据
formData.append("fileName", adjustedFileName);
formData.append("originalFileName", fileName);
formData.append("fileSize", file.size.toString());
formData.append("fileType", file.type);
formData.append("uploadTime", new Date().toISOString());
formData.append("userAgent", navigator.userAgent);
const xhr = new XMLHttpRequest();
// 上传进度监听
xhr.upload.addEventListener("progress", (event) => {
if (event.lengthComputable) {
const progress: UploadProgress = {
loaded: event.loaded,
total: event.total,
percentage: Math.round((event.loaded / event.total) * 100),
};
setUploadStatus({
status: "uploading",
progress,
});
}
});
// 上传完成监听
xhr.addEventListener("load", () => {
try {
const response: UploadResponse = JSON.parse(xhr.responseText);
if (xhr.status >= 200 && xhr.status < 300 && response.success) {
setUploadStatus({
status: "success",
response,
progress: {
loaded: file.size,
total: file.size,
percentage: 100,
},
});
resolve(response);
} else {
const error = response.error || `上传失败: ${xhr.status}`;
setUploadStatus({
status: "error",
error,
});
reject(new Error(error));
}
} catch (parseError) {
const error = "服务器响应格式错误";
setUploadStatus({
status: "error",
error,
});
reject(new Error(error));
}
});
// 上传错误监听
xhr.addEventListener("error", () => {
const error = "网络错误,上传失败";
setUploadStatus({
status: "error",
error,
});
reject(new Error(error));
});
// 上传中断监听
xhr.addEventListener("abort", () => {
const error = "上传已取消";
setUploadStatus({
status: "error",
error,
});
reject(new Error(error));
});
// 设置请求头
const headers = {
"X-Requested-With": "XMLHttpRequest",
...config.headers,
};
Object.entries(headers).forEach(([key, value]) => {
xhr.setRequestHeader(key, value);
});
// 发送请求
xhr.open(config.method || "POST", config.url);
xhr.send(formData);
});
},
[]
);
const resetUpload = useCallback(() => {
setUploadStatus({ status: "idle" });
}, []);
return {
uploadStatus,
uploadFile,
resetUpload,
};
};

8
packages/shared/index.ts Normal file
View File

@@ -0,0 +1,8 @@
// 导出所有组件
import FloatingMenu, { FloatMenuItemConfig } from "./src/floatingMenu";
import XPopup from "./src/xpopup";
import QRscanner from "./src/qr-scanner";
import VoiceIcon from "./src/voiceIcon";
export { FloatingMenu, XPopup, QRscanner, VoiceIcon };
export type { FloatMenuItemConfig };

View File

@@ -0,0 +1,23 @@
{
"name": "@workspace/shared",
"version": "1.0.0",
"main": "./index.ts",
"types": "./index.ts",
"exports": {
".": {
"import": "./index.ts",
"types": "./index.ts"
}
},
"scripts": {
"lint": "eslint src --ext .ts,.tsx",
"type-check": "tsc --noEmit"
},
"dependencies": {
"react": "^18.2.0",
"antd-mobile": "^5.34.0"
},
"peerDependencies": {
"react": ">=18.0.0"
}
}

View File

@@ -0,0 +1,7 @@
.carousel {
.carousel-item {
.carousel-image {
border-radius: 15px;
}
}
}

View File

@@ -0,0 +1,49 @@
import React from 'react';
import Slider, {Settings} from 'react-slick';
import 'slick-carousel/slick/slick.css';
import 'slick-carousel/slick/slick-theme.css';
import './index.less';
export interface CarouselComponentProps {
images: string[];
height?: number;
}
/**
* 轮播图组件
* @param images 图片地址数组
* @param height 图片高度
* @constructor Carousel
*/
const Carousel: React.FC<CarouselComponentProps> = ({images, height = 180}) => {
const settings: Settings = {
dots: false,
infinite: true,
speed: 3000,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 2000,
responsive: [
{
breakpoint: 768,
settings: {
arrows: false,
}
}
]
};
return (
<Slider {...settings} className="carousel">
{images.map((image, index) => (
<div key={index} className="carousel-item">
<img className="carousel-image" src={image} alt={`Slide ${index}`}
style={{width: '100%', height: `${height}px`}}/>
</div>
))}
</Slider>
);
};
export default Carousel;

View File

@@ -0,0 +1,42 @@
/* FloatingFanMenu.css */
@keyframes menuItemPop {
0% {
opacity: 0;
transform: scale(0) rotate(-180deg);
}
70% {
opacity: 1;
transform: scale(1.1) rotate(-10deg);
}
100% {
opacity: 1;
transform: scale(1) rotate(0deg);
}
}
/* 悬停效果 */
.menu-item:hover {
transform: scale(1.1) !important;
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3) !important;
transition: all 0.2s ease !important;
}
.adm-floating-bubble-button {
z-index: 999;
width: 72px;
height: 72px;
overflow: visible;
.cat {
position: absolute;
width: 70px;
font-size: 12px;
bottom: -10px;
background: rgba(255, 204, 199, 1);
padding: 4px 0px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
}
}

View File

@@ -0,0 +1,184 @@
import React, { useState, useRef } from "react";
import { FloatingBubble } from "antd-mobile";
import { createPortal } from "react-dom";
import "./index.less";
export interface FloatMenuItemConfig {
icon: React.ReactNode;
type?: string;
}
const FloatingFanMenu: React.FC<{
menuItems: FloatMenuItemConfig[];
value?: FloatMenuItemConfig;
onChange?: (item: FloatMenuItemConfig) => void;
}> = (props) => {
const { menuItems = [] } = props;
const [visible, setVisible] = useState(false);
const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });
const bubbleRef = useRef<HTMLDivElement>(null);
// 点击时获取FloatingBubble的位置
const handleMainClick = () => {
if (!visible) {
// 显示菜单时获取当前FloatingBubble的位置
if (bubbleRef.current) {
const bubble = bubbleRef.current.querySelector(
".adm-floating-bubble-button"
);
if (bubble) {
const rect = bubble.getBoundingClientRect();
setMenuPosition({
x: rect.left + rect.width / 2,
y: rect.top + rect.height / 2,
});
}
}
}
setVisible(!visible);
};
const handleItemClick = (item: FloatMenuItemConfig) => {
props.onChange?.(item);
setVisible(false);
};
// 计算菜单项位置
const getMenuItemPosition = (index: number) => {
const positions = [
{ x: 0, y: -80 }, // 上方
{ x: -60, y: -60 }, // 左上
{ x: -80, y: 0 }, // 左方
{ x: -60, y: 60 }, // 左下
];
const pos = positions[index] || { x: 0, y: 0 };
let x = menuPosition.x + pos.x;
let y = menuPosition.y + pos.y;
// // 边界检测
// const itemSize = 48;
// const margin = 20;
// 边界检测
const itemSize = 48;
// const margin = 0;
// x = Math.max(
// // margin + itemSize / 2,
// Math.min(window.innerWidth - margin - itemSize / 2, x)
// );
// y = Math.max(
// // margin + itemSize / 2,
// Math.min(window.innerHeight - margin - itemSize / 2, y)
// );
return {
left: x - itemSize / 2,
top: y - itemSize / 2,
};
};
// 菜单组件
const MenuComponent = () => (
<>
{/* 背景遮罩 */}
<div
style={{
position: "fixed",
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: "rgba(0, 0, 0, 0.1)",
zIndex: 9998,
}}
onClick={() => setVisible(false)}
/>
{/* 菜单项 */}
{menuItems.map((item, index) => {
const position = getMenuItemPosition(index);
return (
<div
key={index}
style={{
position: "fixed",
...position,
width: 48,
height: 48,
borderRadius: "50%",
backgroundColor: "#fff",
display: "flex",
alignItems: "center",
justifyContent: "center",
color: "white",
fontSize: 20,
cursor: "pointer",
zIndex: 9999,
boxShadow: "0 4px 12px rgba(0, 0, 0, 0.2)",
animation: `menuItemPop 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards`,
animationDelay: `${index * 0.1}s`,
opacity: 0,
transform: "scale(0)",
}}
onClick={() => handleItemClick(item)}
// title={item.label}
>
{item.icon}
</div>
);
})}
</>
);
return (
<>
{/* 主按钮 */}
<div ref={bubbleRef}>
<FloatingBubble
style={{
"--initial-position-bottom": "200px",
"--initial-position-right": "24px",
"--edge-distance": "24px",
}}
onClick={handleMainClick}
>
<div
style={{
width: "100%",
height: "100%",
display: "flex",
alignItems: "center",
justifyContent: "center",
fontSize: 24,
color: "white",
background: visible
? "linear-gradient(135deg, #ff4d4f, #ff7875)"
: "linear-gradient(135deg, #fff, #fff)",
borderRadius: "50%",
transition: "all 0.3s ease",
transform: visible ? "rotate(45deg)" : "rotate(0deg)",
boxShadow: visible
? "0 6px 16px rgba(255, 77, 79, 0.4)"
: "0 4px 12px #eee",
}}
>
{props.value?.icon}
<div className="cat">
{/* {!visible && <CheckOutline style={{ marginRight: "3px" }} />} */}
</div>
</div>
</FloatingBubble>
</div>
{/* 菜单 - 只在有位置信息时渲染 */}
{visible &&
menuPosition.x > 0 &&
menuPosition.y > 0 &&
createPortal(<MenuComponent />, document.body)}
</>
);
};
export default FloatingFanMenu;

View File

@@ -0,0 +1,88 @@
import React, {useRef, useEffect, useState} from 'react';
import jsQR from 'jsqr';
export interface QRScannerProps {
width?: number;
height?: number;
onScan: (data: string) => void;
}
/**
* 二维码扫描组件
* @param width 画布宽度
* @param height 画布高度
* @param onScan 扫描成功的回调函数
* @constructor QRScanner
*/
const QRScanner: React.FC<QRScannerProps> = ({width = 300, height = 300, onScan}) => {
const videoRef = useRef<HTMLVideoElement>(null);
const canvasRef = useRef<HTMLCanvasElement>(null);
const [isScanning, setIsScanning] = useState(true);
const [scanSuccess, setScanSuccess] = useState(false); // 新的状态变量
let streamRef: MediaStream | null = null; // 存储摄像头流的引用
useEffect(() => {
navigator.mediaDevices.getUserMedia({video: {facingMode: "environment"}})
.then(stream => {
streamRef = stream; // 存储对摄像头流的引用
if (videoRef.current) {
videoRef.current.srcObject = stream;
videoRef.current.addEventListener('loadedmetadata', () => {
videoRef.current?.play().then(() => {
requestAnimationFrame(tick);
}).catch(err => console.error("Error playing video: ", err));
});
}
}).catch(err => {
console.error("Error accessing media devices: ", err);
setIsScanning(false);
});
}, []);
const tick = () => {
// 如果已经成功扫描就不再继续执行tick
if (!isScanning) return;
if (videoRef.current && canvasRef.current) {
if (videoRef.current.readyState === videoRef.current.HAVE_ENOUGH_DATA) {
let video = videoRef.current;
let canvas = canvasRef.current;
let ctx = canvas.getContext('2d');
if (ctx) {
canvas.height = height;
canvas.width = width;
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
let code = jsQR(imageData.data, imageData.width, imageData.height);
if (code) {
onScan(code.data); // 扫码成功
setIsScanning(false); // 更新状态为不再扫描
setScanSuccess(true); // 显示扫描成功的蒙层
if (streamRef) {
let tracks = streamRef.getTracks();
tracks.forEach(track => track.stop()); // 关闭摄像头
}
return; // 直接返回,避免再次调用 requestAnimationFrame
}
}
}
requestAnimationFrame(tick);
}
};
return (
<div>
<video ref={videoRef} style={{display: 'none'}}></video>
<canvas ref={canvasRef}
style={{
display: isScanning ? 'block' : 'none',
width: `${width}px`,
height: `${height}px`
}}></canvas>
{scanSuccess && <div className="scan-success-overlay"></div>} {/* 显示识别成功的蒙层 */}
</div>
);
}
export default QRScanner;

View File

@@ -0,0 +1,69 @@
/* VoiceIcon.css */
.voice-icon {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
cursor: pointer;
gap: 2px;
}
.audio-recorder {
display: none !important;
}
.wave {
width: 1px;
height: 13px;
background-color: rgba(0, 0, 0, 0.6);
border-radius: 2px;
transition: all 0.3s ease;
}
.wave1 {
height: 4px;
}
.wave2 {
height: 13px;
}
.wave3 {
height: 4px;
}
.wave3 {
height: 8px;
}
.wave4 {
height: 4px;
}
/* 播放动画 */
.voice-icon.playing .wave {
animation: voice-wave 1.2s ease-in-out infinite;
}
.voice-icon.playing .wave1 {
animation-delay: 0s;
}
.voice-icon.playing .wave2 {
animation-delay: 0.2s;
}
.voice-icon.playing .wave3 {
animation-delay: 0.4s;
}
@keyframes voice-wave {
0%,
100% {
transform: scaleY(0.3);
opacity: 0.5;
}
50% {
transform: scaleY(1);
opacity: 1;
}
}

View File

@@ -0,0 +1,22 @@
import React, { useCallback, useState } from "react";
import "./index.less";
const VoiceIcon = (props: { isPlaying: boolean; onChange?: () => void }) => {
const { isPlaying = false } = props;
const onChange = useCallback(() => {
props.onChange?.();
}, [isPlaying]);
return (
<div
className={`voice-icon ${isPlaying ? "playing" : ""}`}
onClick={onChange}
>
<div className="wave wave1"></div>
<div className="wave wave2"></div>
<div className="wave wave3"></div>
<div className="wave wave4"></div>
</div>
);
};
export default React.memo(VoiceIcon);

View File

@@ -0,0 +1,11 @@
.xpopup {
.adm-popup-body {
background-color: rgba(245, 245, 245, 1);
padding: 16px;
.header {
font-size: 16px;
display: flex;
justify-content: space-between;
}
}
}

View File

@@ -0,0 +1,28 @@
import { Divider, Popup } from "antd-mobile";
import { CloseOutline } from "antd-mobile-icons";
import "./index.less";
interface DefinedProps {
visible: boolean;
title: string;
children: React.ReactNode;
onClose: () => void;
}
function XPopup(props: DefinedProps) {
const { visible, title, children, onClose } = props;
return (
<Popup visible={visible} closeOnMaskClick={true} className="xpopup">
<div className="header">
<h3 className="title">{title}</h3>
<span className="closeIcon" onClick={onClose}>
<CloseOutline style={{ fontSize: "16px" }} />
</span>
</div>
<Divider />
<div className="content">{children}</div>
</Popup>
);
}
export default XPopup;

View File

@@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"composite": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}

17
packages/utils/index.ts Normal file
View File

@@ -0,0 +1,17 @@
// //处理音频类
export * from "./src/voice";
// // 验证工具
// export * from './validation';
// // 存储工具
// export * from './storage';
// // 日期工具
// export * from './date';
// // 按模块导出
// export * as format from './format';
// export * as validation from './validation';
// export * as storage from './storage';
// export * as date from './date';

View File

@@ -0,0 +1,19 @@
{
"name": "@workspace/utils",
"version": "1.0.0",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./index.ts",
"types": "./index.ts"
}
},
"scripts": {
"build": "tsc",
"dev": "tsc --watch",
"lint": "eslint src --ext .ts",
"type-check": "tsc --noEmit",
"clean": "rimraf dist"
}
}

View File

@@ -0,0 +1,3 @@
export function toYuan(num: number) {
return (num / 100).toFixed(2);
}

View File

@@ -0,0 +1,3 @@
export function toKm(m: number): number {
return m / 1000;
}

164
packages/utils/src/voice.ts Normal file
View File

@@ -0,0 +1,164 @@
export const mockTranslateAudio = async (): Promise<string> => {
return new Promise((resolve) => {
setTimeout(() => {
const mockTranslations = [
"汪汪汪!我饿了,想吃东西!🍖",
"喵喵~我想要抱抱!🤗",
"我想出去玩耍!🎾",
"我很开心!😊",
"我有点害怕...😰",
"我想睡觉了~😴",
"主人,陪我玩一会儿吧!🎮",
"我想喝水了💧",
"外面有什么声音?👂",
"我爱你,主人!❤️",
];
const randomTranslation =
mockTranslations[Math.floor(Math.random() * mockTranslations.length)];
resolve(randomTranslation);
}, 2000 + Math.random() * 2000);
});
};
// 创建发送音效 - 清脆的"叮"声
export const createSendSound = () => {
try {
const audioContext = new (window.AudioContext ||
(window as any).webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
// 设置音调 - 清脆的高音
oscillator.frequency.setValueAtTime(800, audioContext.currentTime);
oscillator.frequency.exponentialRampToValueAtTime(
1200,
audioContext.currentTime + 0.1
);
// 设置音量包络
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
gainNode.gain.linearRampToValueAtTime(0.3, audioContext.currentTime + 0.01);
gainNode.gain.exponentialRampToValueAtTime(
0.01,
audioContext.currentTime + 0.3
);
oscillator.type = "sine";
// 创建音频元素
const audio = new Audio();
// 重写play方法来播放合成音效
audio.play = () => {
return new Promise((resolve) => {
try {
const newOscillator = audioContext.createOscillator();
const newGainNode = audioContext.createGain();
newOscillator.connect(newGainNode);
newGainNode.connect(audioContext.destination);
newOscillator.frequency.setValueAtTime(800, audioContext.currentTime);
newOscillator.frequency.exponentialRampToValueAtTime(
1200,
audioContext.currentTime + 0.1
);
newGainNode.gain.setValueAtTime(0, audioContext.currentTime);
newGainNode.gain.linearRampToValueAtTime(
0.3,
audioContext.currentTime + 0.01
);
newGainNode.gain.exponentialRampToValueAtTime(
0.01,
audioContext.currentTime + 0.3
);
newOscillator.type = "sine";
newOscillator.start(audioContext.currentTime);
newOscillator.stop(audioContext.currentTime + 0.3);
setTimeout(() => resolve(undefined), 300);
} catch (error) {
console.error("播放发送音效失败:", error);
resolve(undefined);
}
});
};
return audio;
} catch (error) {
console.error("创建发送音效失败:", error);
return new Audio(); // 返回空音频对象
}
};
export const createStartRecordSound = () => {
try {
const audio = new Audio();
audio.play = () => {
return new Promise((resolve) => {
try {
const audioContext = new (window.AudioContext ||
(window as any).webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
// 设置音调 - 低沉的音
oscillator.frequency.setValueAtTime(400, audioContext.currentTime);
// 设置音量包络
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
gainNode.gain.linearRampToValueAtTime(
0.2,
audioContext.currentTime + 0.05
);
gainNode.gain.linearRampToValueAtTime(
0,
audioContext.currentTime + 0.2
);
oscillator.type = "sine";
oscillator.start(audioContext.currentTime);
oscillator.stop(audioContext.currentTime + 0.2);
setTimeout(() => resolve(undefined), 200);
} catch (error) {
console.error("播放录音音效失败:", error);
resolve(undefined);
}
});
};
return audio;
} catch (error) {
console.error("创建录音音效失败:", error);
return new Audio();
}
};
export const getAudioDuration = async (audioBlob: Blob): Promise<number> => {
return new Promise((resolve, reject) => {
const AudioContextClass =
window.AudioContext || (window as any).webkitAudioContext;
const audioContext = new AudioContextClass();
const fileReader = new FileReader();
fileReader.onload = async (e) => {
try {
const arrayBuffer = e.target?.result as ArrayBuffer;
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
const duration = audioBuffer.duration;
resolve(duration);
} catch (error) {
reject(error);
}
};
fileReader.readAsArrayBuffer(audioBlob);
});
};

View File

@@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"composite": true,
"noEmit": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}

123
pnpm-lock.yaml generated
View File

@@ -112,6 +112,129 @@ importers:
specifier: ^5.0.0
version: 5.4.19(@types/node@20.19.11)(less@4.4.1)
packages/shared:
dependencies:
antd-mobile:
specifier: ^5.34.0
version: 5.39.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react:
specifier: ^18.2.0
version: 18.3.1
packages/utils: {}
projects/translate-h5:
dependencies:
'@icon-park/react':
specifier: ^1.4.2
version: 1.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/node':
specifier: ^20.10.0
version: 20.19.11
'@types/react-router-dom':
specifier: ^5.3.3
version: 5.3.3
'@uidotdev/usehooks':
specifier: ^2.4.1
version: 2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@vitejs/plugin-basic-ssl':
specifier: ^2.1.0
version: 2.1.0(vite@5.4.19(@types/node@20.19.11)(less@4.4.1))
'@workspace/shared':
specifier: workspace:*
version: link:../../packages/shared
'@workspace/utils':
specifier: workspace:*
version: link:../../packages/utils
antd-mobile:
specifier: ^5.33.0
version: 5.39.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
antd-mobile-icons:
specifier: ^0.3.0
version: 0.3.0
axios:
specifier: ^1.6.2
version: 1.11.0
axios-hooks:
specifier: ^5.0.2
version: 5.1.1(axios@1.11.0)(react@18.3.1)
js-audio-recorder:
specifier: ^1.0.7
version: 1.0.7
jsqr:
specifier: ^1.4.0
version: 1.4.0
less:
specifier: ^4.2.0
version: 4.4.1
query-string:
specifier: ^8.1.0
version: 8.2.0
react:
specifier: ^18.2.0
version: 18.3.1
react-audio-voice-recorder:
specifier: ^2.2.0
version: 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-dom:
specifier: ^18.2.0
version: 18.3.1(react@18.3.1)
react-router-dom:
specifier: ^6.20.0
version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-slick:
specifier: ^0.29.0
version: 0.29.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
slick-carousel:
specifier: ^1.8.1
version: 1.8.1(jquery@3.7.1)
weixin-js-sdk:
specifier: ^1.6.5
version: 1.6.5
zustand:
specifier: ^4.4.6
version: 4.5.7(@types/react@18.3.24)(react@18.3.1)
devDependencies:
'@types/lodash.isequal':
specifier: ^4.5.8
version: 4.5.8
'@types/react':
specifier: ^18.3.24
version: 18.3.24
'@types/react-dom':
specifier: ^18.3.7
version: 18.3.7(@types/react@18.3.24)
'@types/react-slick':
specifier: ^0.23.12
version: 0.23.13
'@typescript-eslint/eslint-plugin':
specifier: ^6.10.0
version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2)
'@typescript-eslint/parser':
specifier: ^6.10.0
version: 6.21.0(eslint@9.34.0)(typescript@5.9.2)
'@vitejs/plugin-react-swc':
specifier: ^3.5.0
version: 3.11.0(vite@5.4.19(@types/node@20.19.11)(less@4.4.1))
eslint:
specifier: ^9.34.0
version: 9.34.0
eslint-plugin-react-hooks:
specifier: ^5.2.0
version: 5.2.0(eslint@9.34.0)
eslint-plugin-react-refresh:
specifier: ^0.4.20
version: 0.4.20(eslint@9.34.0)
postcss-pxtorem:
specifier: ^6.0.0
version: 6.1.0(postcss@8.5.6)
typescript:
specifier: ^5.2.2
version: 5.9.2
vite:
specifier: ^5.0.0
version: 5.4.19(@types/node@20.19.11)(less@4.4.1)
packages:
'@babel/runtime@7.26.10':

3
pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,3 @@
packages:
- "projects/*"
- "packages/*"

View File

@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta
name="viewport"
content="width=device-width, viewport-fit=cover, initial-scale=1.0"
,
/>
<title>tashow-h5</title>
<style>
/* 设置CSS变量用于安全区域 */
/* 防止页面滚动的全局样式 */
html,
body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
-webkit-overflow-scrolling: touch;
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: transparent;
position: fixed;
width: 100%;
}
#root {
height: 100%;
overflow: hidden;
}
</style>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

View File

@@ -0,0 +1,52 @@
{
"name": "translate-h5",
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"dev:https": "vite --https",
"build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
"dependencies": {
"@icon-park/react": "^1.4.2",
"@types/node": "^20.10.0",
"@types/react-router-dom": "^5.3.3",
"@uidotdev/usehooks": "^2.4.1",
"@vitejs/plugin-basic-ssl": "^2.1.0",
"antd-mobile": "^5.33.0",
"antd-mobile-icons": "^0.3.0",
"axios": "^1.6.2",
"axios-hooks": "^5.0.2",
"js-audio-recorder": "^1.0.7",
"jsqr": "^1.4.0",
"less": "^4.2.0",
"query-string": "^8.1.0",
"react": "^18.2.0",
"react-audio-voice-recorder": "^2.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.20.0",
"react-slick": "^0.29.0",
"slick-carousel": "^1.8.1",
"weixin-js-sdk": "^1.6.5",
"zustand": "^4.4.6",
"@workspace/shared": "workspace:*",
"@workspace/utils": "workspace:*"
},
"devDependencies": {
"@types/lodash.isequal": "^4.5.8",
"@types/react": "^18.3.24",
"@types/react-dom": "^18.3.7",
"@types/react-slick": "^0.23.12",
"@typescript-eslint/eslint-plugin": "^6.10.0",
"@typescript-eslint/parser": "^6.10.0",
"@vitejs/plugin-react-swc": "^3.5.0",
"eslint": "^9.34.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"postcss-pxtorem": "^6.0.0",
"typescript": "^5.2.2",
"vite": "^5.0.0"
}
}

View File

@@ -0,0 +1,37 @@
import useAxios from 'axios-hooks';
import {Page, Result} from "@/types/http";
export interface MockResult {
id: number;
}
export interface MockPage {
id: number;
}
/**
* fetch the data
* 详细使用可以查看 useAxios 的文档
*/
export const useFetchXXX = () => {
// set the url
const url = `/xxx/xxx`;
// fetch the data
const [{data, loading, error}, refetch] = useAxios<Result<MockResult>>(url);
// to do something
return {data, loading, error, refetch};
}
/**
* fetch the data with page
* 详细使用可以查看 useAxios 的文档
*/
export const useFetchPageXXX = (page: number, size: number) => {
// set the url
const url = `/xxx/xxx?page=${page}&size=${size}`;
// fetch the data
const [{data, loading, error}, refetch] = useAxios<Page<MockResult>>(url);
// to do something
return {data, loading, error, refetch};
}

View File

@@ -0,0 +1,64 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="48" height="48" rx="24" fill="black" fill-opacity="0.06"/>
<path d="M38.1307 32.6159C38.149 32.6045 39.2257 31.9737 39.9329 31.9341C40.64 31.8945 41.6448 32.3417 41.9416 32.7193C42.2384 33.0969 42.7483 33.622 42.642 34.0465C42.5357 34.4709 42.5864 34.4045 41.8825 34.8693C41.1787 35.3342 40.3609 35.8166 39.9281 35.9082C39.4953 35.9999 38.141 36.1118 38.141 36.1118L36.8591 35.9687C36.8591 35.9687 36.228 35.773 36.2905 35.4226C36.3529 35.0721 36.8167 33.9255 36.8167 33.9255C36.8167 33.9255 37.3016 33.2919 37.335 33.2578C37.3684 33.2236 38.0766 32.6504 38.0766 32.6504L38.1307 32.6159Z" fill="#B1B1B1"/>
<path d="M36.3918 35.5104C36.3951 35.4663 36.3992 35.4224 36.4042 35.3785C36.4056 35.3666 36.4071 35.3547 36.4085 35.3427L36.4101 35.3308C36.4128 35.3087 36.4066 35.3559 36.4096 35.3339C36.4127 35.3119 36.4159 35.2902 36.4193 35.2685C36.4331 35.1814 36.4503 35.0951 36.4709 35.0093C36.5122 34.8379 36.5664 34.6698 36.6329 34.5065C36.6371 34.4963 36.6413 34.4861 36.6455 34.4759C36.6482 34.4695 36.6551 34.4553 36.6435 34.4807C36.646 34.4752 36.6482 34.4696 36.6506 34.4641C36.6593 34.4438 36.6682 34.4236 36.6773 34.4035C36.6954 34.3632 36.7143 34.3233 36.7339 34.2837C36.7731 34.2045 36.8151 34.1266 36.8599 34.0502C36.9046 33.9739 36.9519 33.899 37.0019 33.8258C37.0268 33.7892 37.0524 33.753 37.0786 33.7172C37.0916 33.6994 37.1049 33.6816 37.1183 33.6639C37.1244 33.6559 37.1307 33.648 37.1366 33.6399C37.1204 33.662 37.1296 33.6491 37.1338 33.6437C37.1381 33.6382 37.1424 33.6327 37.1468 33.6271C37.2565 33.4879 37.3754 33.3562 37.5027 33.2329C37.5676 33.1702 37.6345 33.1096 37.7035 33.0513C37.7384 33.0218 37.7738 32.9928 37.8096 32.9644C37.8177 32.958 37.8259 32.9516 37.8341 32.9452C37.8388 32.9414 37.8567 32.9279 37.8333 32.9457C37.8366 32.9432 37.8398 32.9406 37.8432 32.9381C37.8629 32.923 37.8828 32.908 37.9029 32.8932C38.05 32.7847 38.2035 32.6852 38.3628 32.5954C38.4424 32.5504 38.5234 32.5078 38.6055 32.4675C38.6879 32.4271 38.772 32.3914 38.8555 32.3535C38.8538 32.3543 38.8327 32.363 38.8486 32.3564L38.8659 32.3492C38.8755 32.3452 38.8852 32.3413 38.8948 32.3374C38.918 32.3279 38.9412 32.3187 38.9645 32.3096C39.0063 32.2933 39.0483 32.2776 39.0904 32.2625C39.1768 32.2314 39.2639 32.2027 39.3519 32.1762C39.5267 32.1237 39.704 32.0802 39.8832 32.0457C39.9282 32.037 39.9733 32.0289 40.0185 32.0214C40.044 32.0143 40.0657 31.9976 40.0791 31.9748C40.0926 31.9511 40.0963 31.9231 40.0893 31.8967C40.071 31.8401 40.0208 31.8166 39.9647 31.826C39.5982 31.8867 39.2391 31.9856 38.8932 32.1211C38.5416 32.2576 38.2071 32.4349 37.8968 32.6492C37.5914 32.8603 37.3154 33.111 37.0759 33.3946C36.8418 33.6724 36.6471 33.9811 36.4973 34.3121C36.3446 34.6502 36.2449 35.0099 36.2016 35.3783C36.1965 35.4222 36.1924 35.4662 36.1892 35.5103C36.1852 35.5632 36.2386 35.6139 36.2905 35.6115C36.3171 35.6109 36.3425 35.6 36.3614 35.5812C36.3803 35.5623 36.3911 35.5369 36.3918 35.5103L36.3918 35.5104Z" fill="black"/>
<path d="M36.2172 35.6493C36.3589 35.8732 36.612 35.9978 36.8573 36.0742C37.1225 36.1569 37.3976 36.181 37.6735 36.1961C37.9752 36.2126 38.2776 36.2192 38.5795 36.2062C38.8446 36.1945 39.1089 36.1671 39.3708 36.1241C39.6319 36.0814 39.8902 36.0235 40.1469 35.9595C40.1817 35.9508 40.2165 35.942 40.2513 35.9331C40.2643 35.9297 40.2764 35.9238 40.2871 35.9156C40.2977 35.9075 40.3066 35.8973 40.3133 35.8857C40.32 35.8741 40.3243 35.8612 40.326 35.8479C40.3277 35.8346 40.3267 35.8212 40.3232 35.8082C40.3196 35.7953 40.3135 35.7832 40.3052 35.7727C40.297 35.7621 40.2867 35.7533 40.275 35.7468C40.2633 35.7402 40.2505 35.736 40.2371 35.7345C40.2238 35.733 40.2103 35.7341 40.1975 35.7378C39.9396 35.8036 39.6803 35.8647 39.4181 35.9114C39.3562 35.9224 39.2941 35.9327 39.2318 35.9421C39.2017 35.9466 39.1715 35.9509 39.1413 35.955C39.1247 35.9573 39.1515 35.9536 39.1522 35.9535C39.1477 35.9542 39.1433 35.9547 39.1388 35.9553L39.1175 35.9581C39.1014 35.9601 39.0853 35.9621 39.0692 35.964C38.9425 35.9792 38.8154 35.9906 38.6879 35.9981C38.3998 36.0137 38.111 36.0146 37.8228 36.0007C37.6704 35.9942 37.5173 35.9879 37.3656 35.9718C37.3514 35.9703 37.3371 35.9687 37.3229 35.967C37.3161 35.9661 37.3093 35.9653 37.3025 35.9644C37.2991 35.964 37.2956 35.9635 37.2923 35.963C37.3263 35.9672 37.3057 35.9649 37.2986 35.9639C37.2689 35.9597 37.2392 35.955 37.2096 35.9499C37.1469 35.939 37.0846 35.9258 37.0228 35.9102C36.9613 35.8947 36.9005 35.8766 36.8407 35.8553C36.8261 35.8501 36.8116 35.8448 36.7972 35.8392C36.7904 35.8366 36.7837 35.8339 36.7769 35.8312C36.7692 35.8281 36.74 35.8154 36.7711 35.829C36.7425 35.8165 36.7141 35.8037 36.6863 35.7897C36.6333 35.7631 36.5826 35.7322 36.5347 35.6974C36.5319 35.6954 36.5293 35.6934 36.5266 35.6914C36.514 35.6821 36.5349 35.6979 36.5353 35.6981C36.5292 35.694 36.5236 35.6889 36.5179 35.6842C36.5066 35.6749 36.4955 35.6652 36.4847 35.6553C36.464 35.6363 36.4446 35.6161 36.4264 35.5948C36.4223 35.5899 36.4184 35.585 36.4144 35.5801C36.4046 35.5682 36.4215 35.5895 36.4215 35.5895C36.4194 35.5871 36.4175 35.5846 36.4159 35.5819C36.4075 35.5706 36.3996 35.5589 36.3921 35.547C36.3638 35.5022 36.3006 35.4803 36.2535 35.5106C36.2087 35.5396 36.1868 35.6013 36.2172 35.6492L36.2172 35.6493Z" fill="black"/>
<path d="M40.3344 35.9078C40.6174 35.7722 40.8966 35.6284 41.1655 35.4662C41.4516 35.2914 41.7279 35.1009 41.9931 34.8957C42.1869 34.7473 42.377 34.5943 42.5651 34.4387C42.6061 34.4047 42.6028 34.33 42.5651 34.2954C42.5215 34.2555 42.4655 34.2592 42.4218 34.2954C42.2577 34.4312 42.0917 34.5646 41.9237 34.6955C41.9493 34.6756 41.9162 34.7013 41.9101 34.7059C41.9005 34.7133 41.8908 34.7207 41.8812 34.7281C41.8622 34.7426 41.8431 34.7571 41.8241 34.7715C41.7886 34.7983 41.7529 34.825 41.7171 34.8514C41.6478 34.9025 41.5778 34.9528 41.5072 35.0021C41.2524 35.1801 40.9874 35.343 40.7136 35.4901C40.5552 35.5751 40.3942 35.6552 40.2321 35.7329C40.1842 35.7558 40.1678 35.8281 40.1958 35.8715C40.2275 35.9207 40.2831 35.9324 40.3344 35.9078V35.9078Z" fill="black"/>
<path d="M39.9919 32.0252C40.1375 32.017 40.2836 32.0222 40.4282 32.0406C40.4356 32.0415 40.4511 32.0449 40.4221 32.0398C40.4261 32.0404 40.4301 32.0409 40.434 32.0414C40.4419 32.0425 40.4498 32.0437 40.4577 32.0449C40.4764 32.0478 40.4951 32.0509 40.5137 32.0543C40.5479 32.0604 40.582 32.0673 40.6158 32.0749C40.6853 32.0905 40.7539 32.1093 40.8217 32.1313C40.8555 32.1422 40.8891 32.1538 40.9224 32.1663C40.9382 32.1721 40.9538 32.1781 40.9695 32.1843C40.9777 32.1876 40.986 32.1909 40.9942 32.1943C41.0014 32.1972 41.0324 32.2116 41.0029 32.1978C41.0668 32.2279 41.1313 32.2556 41.1939 32.2886C41.3216 32.3561 41.4438 32.4333 41.5597 32.5196C41.5737 32.53 41.5876 32.5405 41.6014 32.5512C41.6118 32.5591 41.5852 32.5385 41.5955 32.5466C41.5996 32.5498 41.6036 32.553 41.6077 32.5562C41.6158 32.5626 41.6239 32.569 41.6319 32.5754C41.6602 32.5982 41.6881 32.6214 41.7157 32.6451C41.7618 32.6848 41.8069 32.7256 41.851 32.7675C41.9462 32.8576 42.0364 32.9528 42.1214 33.0527C42.1425 33.0775 42.1632 33.1027 42.1835 33.1282C42.1887 33.1348 42.1939 33.1414 42.1991 33.148C42.2014 33.1509 42.2036 33.1539 42.206 33.1568C42.1886 33.1349 42.1966 33.1446 42.2004 33.1495C42.2111 33.1636 42.2217 33.1777 42.2322 33.1919C42.271 33.2444 42.308 33.2982 42.3424 33.3536C42.3764 33.4081 42.408 33.4641 42.4363 33.5217C42.4428 33.535 42.4492 33.5483 42.4553 33.5617C42.4586 33.5687 42.4618 33.5758 42.4649 33.5829C42.4682 33.5904 42.4794 33.6196 42.4668 33.587C42.4773 33.6145 42.4885 33.6416 42.498 33.6695C42.5167 33.7237 42.531 33.7793 42.5407 33.8358C42.5419 33.8428 42.5429 33.8498 42.544 33.8567C42.546 33.8697 42.5404 33.8278 42.5426 33.846C42.5429 33.8491 42.5433 33.8522 42.5437 33.8552C42.5452 33.869 42.5464 33.8828 42.5473 33.8967C42.549 33.924 42.5493 33.9513 42.548 33.9786C42.5474 33.9914 42.5464 34.0041 42.5451 34.0168C42.5441 34.0258 42.5395 34.0511 42.5457 34.0144C42.5444 34.0218 42.5435 34.0292 42.5421 34.0365C42.5374 34.0631 42.531 34.0893 42.523 34.1151C42.5193 34.1266 42.5154 34.138 42.5111 34.1493C42.5096 34.1531 42.4996 34.1774 42.5076 34.1583C42.5157 34.1393 42.5045 34.1649 42.5024 34.1694C42.4903 34.1949 42.4765 34.2195 42.4611 34.2432C42.4536 34.2547 42.4457 34.266 42.4375 34.2771C42.4227 34.297 42.4486 34.2635 42.4382 34.2762C42.4329 34.2827 42.4276 34.2892 42.4222 34.2956C42.4038 34.315 42.3932 34.3405 42.3925 34.3672C42.3927 34.3941 42.4033 34.4198 42.4222 34.4389C42.46 34.4735 42.5288 34.482 42.5655 34.4389C42.6512 34.3418 42.7101 34.224 42.7363 34.0971C42.7586 33.9716 42.7542 33.8428 42.7233 33.7191C42.6607 33.4541 42.5082 33.2166 42.3424 33.0048C42.1771 32.7945 41.9885 32.6037 41.7801 32.4361C41.5413 32.2406 41.2728 32.0846 40.9847 31.9741C40.7031 31.8686 40.4045 31.816 40.1038 31.819C40.0665 31.8193 40.0293 31.8206 39.992 31.8227C39.9392 31.8256 39.8882 31.8672 39.8907 31.924C39.8931 31.9763 39.9353 32.0284 39.992 32.0253L39.9919 32.0252Z" fill="black"/>
<path d="M38.0768 32.8058C38.2982 32.7818 38.5208 32.7711 38.7435 32.774C38.8534 32.7756 38.9633 32.781 39.073 32.7901C39.129 32.7947 39.1848 32.8005 39.2406 32.8072C39.2536 32.8088 39.2667 32.8105 39.2797 32.8121C39.3046 32.8153 39.2563 32.8089 39.2812 32.8123C39.2883 32.8133 39.2954 32.8143 39.3025 32.8153C39.3308 32.8194 39.3592 32.8237 39.3875 32.8283C39.5907 32.8611 39.7911 32.9098 39.9867 32.974C40.0332 32.9894 40.0794 33.0057 40.1253 33.0229C40.1483 33.0315 40.1711 33.0404 40.1938 33.0494C40.2047 33.0538 40.2156 33.0582 40.2264 33.0626C40.2323 33.065 40.2382 33.0675 40.2441 33.0699C40.248 33.0715 40.2519 33.0732 40.2559 33.0748C40.2425 33.0692 40.2393 33.0678 40.2464 33.0709C40.3373 33.11 40.4267 33.1521 40.514 33.1987C40.6116 33.2506 40.7064 33.3074 40.7981 33.369C40.8439 33.3998 40.8889 33.4319 40.933 33.4651C40.9363 33.4677 40.9397 33.4702 40.9431 33.4728L40.9532 33.4806L40.9479 33.4764C40.9596 33.4856 40.9713 33.4948 40.9829 33.5041C41.0044 33.5214 41.0258 33.539 41.0468 33.5569C41.0662 33.5753 41.0917 33.5858 41.1185 33.5865C41.1453 33.5863 41.171 33.5757 41.1901 33.5569C41.2247 33.5192 41.2332 33.4502 41.1901 33.4136C40.8739 33.1456 40.5091 32.9443 40.1192 32.8056C39.7071 32.6591 39.2696 32.588 38.8332 32.5735C38.5807 32.5659 38.328 32.5758 38.0769 32.6032C38.0502 32.604 38.0247 32.6146 38.0053 32.6329C37.9864 32.652 37.9758 32.6777 37.9756 32.7045C37.9778 32.7546 38.0205 32.8118 38.0769 32.8058L38.0768 32.8058Z" fill="black"/>
<path d="M39.7537 32.8519C39.8432 32.7946 39.9352 32.7413 40.0296 32.6921C40.0767 32.6675 40.1244 32.644 40.1726 32.6216C40.1956 32.6108 40.2188 32.6004 40.2421 32.5901C40.2548 32.5846 40.2675 32.579 40.2803 32.5736C40.2991 32.5655 40.261 32.5815 40.2816 32.573C40.2881 32.5704 40.2944 32.5677 40.3009 32.5651C40.326 32.5572 40.3474 32.5407 40.3615 32.5185C40.3682 32.5071 40.3726 32.4944 40.3744 32.4812C40.3762 32.468 40.3754 32.4546 40.372 32.4417C40.3686 32.4288 40.3628 32.4168 40.3547 32.4062C40.3467 32.3956 40.3366 32.3867 40.3251 32.3799C40.3027 32.3681 40.2717 32.3596 40.2471 32.3697C40.0397 32.4541 39.8404 32.5569 39.6515 32.6769C39.6069 32.7054 39.5847 32.7683 39.6151 32.8155C39.6439 32.8601 39.706 32.8824 39.7537 32.8519L39.7537 32.8519Z" fill="black"/>
<path d="M18.4142 24.2747C18.4142 24.2747 18.1089 22.7991 18.1498 20.9074C18.1908 19.0157 18.5033 13.5462 18.5033 13.5462C18.5033 13.5462 18.5488 11.7318 18.9537 11.5015C19.3586 11.2711 20.0628 10.7953 23.389 10.6983C26.7151 10.6014 31.4475 10.684 33.3252 10.7897C35.2029 10.8953 38.8468 11.1317 39.2847 11.2791C39.7225 11.4265 39.8291 12.4943 39.829 13.7311C39.8289 14.9678 39.7541 18.6264 39.5961 20.1667C39.4381 21.7071 39.1199 24.3553 38.9032 25.2102C38.6865 26.0651 38.485 26.466 38.485 26.466C38.485 26.466 39.1673 25.7291 38.2718 27.3207C37.3763 28.9122 33.7533 32.6648 33.2399 32.5795C32.7265 32.4942 28.9875 32.878 28.9875 32.878C28.9875 32.878 22.7069 31.9825 22.6643 31.8119C22.6216 31.6414 17.3765 30.2214 17.3765 30.2214L11.6196 29.6725L9.63672 28.826L9.6722 28.4964C9.6722 28.4964 9.7336 28.0612 11.2469 27.3207C12.7602 26.5801 15.7463 25.3083 15.7463 25.3083L18.4142 24.2747Z" fill="#B1B1B1"/>
<path d="M39.5806 11.3717C39.5806 11.3717 40.279 11.319 40.3399 11.8867C40.4007 12.4544 40.4567 16.5456 40.4567 16.5456C40.4567 16.5456 40.396 19.2322 40.3184 20.0405C40.2408 20.8489 40.0346 22.5571 39.9188 23.2841C39.8029 24.011 39.5857 25.2711 39.5219 25.592C39.4581 25.913 39.6134 26.16 39.2909 26.3044C38.9684 26.4487 38.4849 26.466 38.4849 26.466C38.4849 26.466 38.7834 25.5647 38.826 25.5007C38.8686 25.4367 39.3164 22.4943 39.3804 22.1319C39.4443 21.7694 39.7429 18.4645 39.7215 17.8035C39.7002 17.1425 39.7855 15.3941 39.7855 15.3941L39.8288 13.731L39.5589 11.6936L39.4014 11.3704L39.5806 11.3717Z" fill="#626262"/>
<path d="M38.4851 26.7443C38.4851 26.7443 37.1845 28.5285 36.7154 29.0828C36.2463 29.6372 34.3913 31.4495 33.7516 31.8547C33.112 32.2598 32.6642 32.8994 30.9372 32.6009C29.2101 32.3024 23.0694 31.1937 23.0694 31.1937L15.2657 29.5306C15.2657 29.5306 11.8968 28.9762 11.8115 28.9336C11.7262 28.8909 9.89257 28.5285 9.89257 28.5285L9.67226 28.4965C9.67226 28.4965 9.62129 28.9457 9.6468 29.2969C9.67231 29.648 9.69639 29.6891 10.1297 29.8125C10.563 29.9358 17.4723 31.6152 17.4723 31.6152C17.4723 31.6152 22.8956 32.6569 23.0189 32.6778C23.1421 32.6987 27.8051 33.4615 27.8051 33.4615C27.8051 33.4615 31.5763 34.0889 31.7261 34.0886C31.8759 34.0883 32.6525 34.3147 33.6246 33.4858C34.5966 32.6569 35.9644 31.2125 35.9644 31.2125L37.3392 29.6726L38.2101 28.6446L38.6983 27.9955L38.7304 27.1213L38.6983 26.4761L38.4851 26.7443Z" fill="#626262"/>
<path d="M19.4874 13.6458C19.4874 13.6458 19.2636 16.4283 19.1997 17.9634C19.1357 19.4985 18.884 22.473 19.0098 22.9847C19.1357 23.4964 19.0397 23.7842 22.9416 24.0721C26.8435 24.3599 34.5833 25.3514 35.6387 25.4473C36.6941 25.5433 37.7768 25.9644 37.9711 25.2102C38.1654 24.4559 38.6882 21.1617 38.7306 19.8183C38.773 18.475 38.8611 13.6457 38.8611 13.6457C38.8611 13.6457 39.0608 12.6772 38.4852 12.4579C37.9095 12.2385 31.9607 12.0467 30.1057 11.7588C28.2507 11.4709 23.2294 11.7588 23.2294 11.7588C23.2294 11.7588 20.0631 11.8548 19.9032 12.1426C19.7433 12.4304 19.4874 13.6458 19.4874 13.6458Z" fill="#626262"/>
<path d="M16.3213 26.0872C16.3213 26.0872 17.6119 25.1651 18.1499 25.2104C18.688 25.2556 23.5494 25.8633 24.349 25.9593C25.1485 26.0552 30.8415 26.7908 31.1932 26.8548C31.545 26.9187 35.8947 27.4625 35.8947 27.4625C35.8947 27.4625 36.2145 27.6544 35.4789 28.294C34.7433 28.9336 33.3681 30.2198 33.3681 30.2198L29.016 29.6725C29.016 29.6725 22.0142 28.5819 21.7584 28.5179C21.5025 28.4539 17.0569 27.5904 17.0569 27.5904L14.7222 26.9827L16.3213 26.0872Z" fill="#626262"/>
<path d="M18.1316 29.2841C18.1316 29.2841 18.7414 28.723 18.9343 28.7268C19.1273 28.7307 21.2726 29.0043 21.7679 29.1118C22.2632 29.2193 23.9044 29.6846 23.9044 29.6846C23.9044 29.6846 23.6061 30.2092 23.3815 30.4533C23.1569 30.6974 22.4024 30.5153 22.0793 30.4434C21.7563 30.3714 18.7898 29.8544 18.7898 29.8544L17.8613 29.5942L18.1316 29.2841Z" fill="#626262"/>
<path d="M22.5254 21.4817C22.5254 21.4817 22.504 17.8516 22.6639 17.7237C22.8239 17.5957 24.8074 17.5957 24.8711 17.7237C24.9348 17.8516 24.7649 21.5401 24.7325 21.7667C24.7002 21.9933 24.0925 21.9933 23.4209 21.8974C22.7492 21.8015 22.5361 21.7384 22.5254 21.4817Z" fill="#FFA400"/>
<path d="M26.7475 15.5328C26.8115 15.3729 29.3701 15.309 29.466 15.5328C29.562 15.7567 29.2102 21.8654 29.2421 22.1213C29.2741 22.3771 26.6516 22.2075 26.5236 22.0828C26.3957 21.9581 26.6835 15.6928 26.7475 15.5328Z" fill="#FFA400"/>
<path d="M31.8323 14.2215C31.9816 14.0458 35.2545 14.0936 35.3184 14.2215C35.3824 14.3494 34.9346 22.1198 34.7427 22.4883C34.5509 22.8569 31.3419 22.6315 31.2247 22.4883C31.1074 22.3451 31.6415 14.4462 31.8323 14.2215Z" fill="#FFA400"/>
<path d="M18.5426 24.0986C18.5251 24.0793 18.5492 24.1101 18.5394 24.0957C18.5343 24.0882 18.5289 24.0807 18.5245 24.0728C18.5143 24.0541 18.5045 24.0356 18.4959 24.0161C18.5011 24.0279 18.4801 23.9736 18.4754 23.9595C18.4652 23.929 18.4563 23.8981 18.4481 23.867C18.408 23.708 18.3785 23.5465 18.3599 23.3836C18.2938 22.8622 18.2727 22.3347 18.2602 21.8097C18.2213 20.1795 18.3121 18.5518 18.3932 16.9243C18.4331 16.1218 18.4724 15.3191 18.5271 14.5174C18.5693 13.8982 18.6155 13.2767 18.7091 12.6628C18.7401 12.4442 18.7834 12.2276 18.839 12.014C18.8769 11.8742 18.9208 11.7314 18.9998 11.6087C19.0185 11.5783 19.0423 11.5512 19.0702 11.5288C19.0798 11.5196 19.0907 11.5116 19.1024 11.5052C19.1208 11.493 19.1396 11.4815 19.1588 11.4706C19.2628 11.4115 19.3515 11.3789 19.4666 11.3403C19.8067 11.2265 20.1623 11.1571 20.5152 11.0969C21.0293 11.0092 21.548 10.949 22.0671 10.8999C23.5092 10.7638 24.9598 10.7149 26.4079 10.7042C28.1931 10.691 29.9789 10.7465 31.7624 10.8196C33.2993 10.8826 34.8357 10.9643 36.3699 11.0749C37.2527 11.1385 38.1555 11.1865 39.026 11.3265C39.1006 11.3385 39.1791 11.3486 39.2506 11.3741C39.2679 11.3803 39.2404 11.369 39.2477 11.3727C39.2554 11.3764 39.2629 11.3804 39.2701 11.385C39.2965 11.4025 39.2754 11.3835 39.3004 11.4096C39.3279 11.4355 39.3506 11.4661 39.3675 11.4999C39.5014 11.7295 39.5501 12.0411 39.5915 12.3134C39.7355 13.2609 39.733 14.2361 39.7266 15.192C39.7194 16.2794 39.6764 17.3667 39.6141 18.4522C39.5599 19.3974 39.4877 20.3407 39.3848 21.2819C39.2521 22.4945 39.0943 23.7086 38.8613 24.9064C38.7816 25.3166 38.7006 25.7356 38.5574 26.1293C38.5388 26.1836 38.5163 26.2365 38.4902 26.2877C38.4792 26.3089 38.4673 26.3295 38.4544 26.3496C38.4359 26.3783 38.4563 26.3526 38.4306 26.3791C38.409 26.4014 38.4425 26.3744 38.4137 26.3919C38.4077 26.3956 38.4013 26.3988 38.3951 26.4019C38.3718 26.4135 38.4109 26.3965 38.3898 26.4043C38.354 26.4173 38.3173 26.4274 38.2799 26.4346C38.185 26.4538 38.0797 26.4606 37.9631 26.4645C37.8083 26.4698 37.6533 26.467 37.4986 26.4614C37.0585 26.4455 36.6191 26.4064 36.1809 26.3633C34.8925 26.2364 33.6082 26.0659 32.3243 25.8998C30.6292 25.6805 28.9344 25.4588 27.2373 25.2552C25.6891 25.0695 24.1383 24.9062 22.5888 24.7315C21.442 24.6022 20.2829 24.4932 19.1489 24.273C19.006 24.2453 18.8629 24.2157 18.7233 24.1742C18.6989 24.167 18.6746 24.1594 18.6505 24.151C18.6392 24.147 18.628 24.143 18.6168 24.1387C18.5904 24.1286 18.6181 24.1401 18.604 24.1337C18.5879 24.1263 18.5724 24.1182 18.5569 24.1095C18.5242 24.0912 18.5606 24.117 18.5426 24.0985C18.4512 24.0052 18.308 24.1485 18.3993 24.2418C18.4624 24.3062 18.5603 24.3357 18.6438 24.3617C18.7893 24.4048 18.9372 24.4398 19.0866 24.4667C19.5733 24.5616 20.066 24.6271 20.5575 24.6913C22.0075 24.8808 23.4628 25.0308 24.9161 25.192C26.6173 25.3806 28.3165 25.5845 30.0139 25.8036C31.5425 25.9995 33.0699 26.2051 34.5999 26.3896C35.6032 26.5106 36.6152 26.6449 37.6268 26.6678C37.8752 26.6735 38.1438 26.6831 38.3863 26.6179C38.605 26.5591 38.683 26.3763 38.755 26.1767C38.8992 25.7771 38.9809 25.3523 39.0613 24.9363C39.1761 24.3424 39.2693 23.7443 39.354 23.1454C39.5164 21.996 39.6493 20.8414 39.7359 19.6838C39.8092 18.7031 39.8626 17.7211 39.896 16.7377C39.9338 15.6391 39.9534 14.5365 39.8969 13.4382C39.8747 13.0055 39.8415 12.5711 39.7681 12.1437C39.7229 11.8801 39.6694 11.5781 39.5142 11.3531C39.4013 11.1891 39.2498 11.158 39.0646 11.1288C38.7172 11.074 38.3661 11.0405 38.0161 11.0072C36.7234 10.8842 35.4264 10.8026 34.13 10.7309C32.3703 10.6335 30.6093 10.5644 28.8469 10.5233C27.1626 10.4848 25.4765 10.4889 23.7936 10.5747C22.6311 10.6339 21.4596 10.7182 20.3131 10.9277C19.9764 10.9892 19.6353 11.0593 19.3141 11.1798C19.1108 11.2561 18.9136 11.3483 18.8021 11.5439C18.611 11.8794 18.5578 12.3041 18.5032 12.6793C18.4104 13.3165 18.3616 13.9598 18.3187 14.6019C18.2635 15.4295 18.2237 16.2581 18.1825 17.0864C18.1381 17.9776 18.0882 18.8685 18.065 19.7606C18.0457 20.502 18.0399 21.2443 18.0623 21.9858C18.0777 22.4974 18.1028 23.0113 18.1754 23.5185C18.2081 23.7469 18.2353 24.0616 18.3993 24.2419C18.4872 24.3385 18.6302 24.1949 18.5426 24.0986Z" fill="black"/>
<path d="M9.64541 28.5942C10.2253 28.7094 10.805 28.8251 11.3847 28.9411C12.6671 29.1975 13.9492 29.4553 15.2311 29.7145C16.5074 29.9729 17.7831 30.2345 19.0581 30.4995C20.0644 30.7107 21.072 30.9146 22.0811 31.1114C23.3821 31.366 24.6845 31.6133 25.9882 31.8533C27.2028 32.0768 28.4185 32.2954 29.6374 32.4937C30.0772 32.5652 30.5175 32.6344 30.9591 32.6941C31.2295 32.7307 31.5036 32.7727 31.7768 32.7794C32.0001 32.7821 32.2229 32.7576 32.4402 32.7064C32.769 32.6304 33.0557 32.4288 33.3224 32.231C33.9841 31.7405 34.6095 31.1941 35.2272 30.6501C35.7542 30.1859 36.2714 29.7071 36.746 29.1886C37.3978 28.4781 37.9867 27.7125 38.5062 26.9003C38.6011 26.7514 38.6949 26.6017 38.7858 26.4502L38.5971 26.3991C38.6155 26.6024 38.6245 26.8069 38.628 27.0109C38.6338 27.3407 38.6416 27.6992 38.5414 28.0174C38.4849 28.1964 38.3294 28.3414 38.2124 28.4836C38.0186 28.719 37.8228 28.9527 37.6251 29.1848C36.9974 29.9222 36.354 30.6457 35.6947 31.3554C35.2817 31.8008 34.8692 32.2504 34.4345 32.6748C34.0791 33.0218 33.6952 33.3463 33.2636 33.595C32.7301 33.9024 32.1526 34.0396 31.5404 33.9629C31.1905 33.9191 30.8434 33.8421 30.495 33.7864C29.1864 33.5773 27.8771 33.3722 26.5688 33.1612C24.8263 32.8802 23.0843 32.5947 21.3466 32.2854C19.7903 32.0085 18.2439 31.6881 16.7022 31.3394C15.1 30.9771 13.5029 30.5931 11.9108 30.1875C11.3718 30.0494 10.833 29.9098 10.2983 29.7561C10.1487 29.713 9.99868 29.67 9.8515 29.6192C9.82946 29.6116 9.80762 29.6038 9.78586 29.5956C9.7528 29.5832 9.76839 29.5815 9.75333 29.5822C9.72318 29.5836 9.74329 29.5482 9.74782 29.5825C9.75421 29.6309 9.76737 29.6337 9.77269 29.6186C9.78109 29.5948 9.76718 29.5417 9.76519 29.517C9.74808 29.3059 9.73191 29.0946 9.73646 28.8826C9.73949 28.7406 9.73537 28.5598 9.80279 28.4395C9.90241 28.2617 10.098 28.1292 10.261 28.0159C10.9817 27.5151 11.8001 27.1432 12.5914 26.7707C14.3492 25.9433 16.1614 25.2575 17.9739 24.5621C18.1378 24.4993 18.3087 24.4423 18.4654 24.3623C18.5816 24.3031 18.4792 24.1281 18.3631 24.1874C18.1972 24.272 18.0117 24.3318 17.836 24.3989C17.4779 24.5357 17.1191 24.6705 16.7611 24.8073C15.7802 25.182 14.8028 25.5667 13.839 25.9836C12.8468 26.4125 11.8572 26.8667 10.909 27.387C10.606 27.5533 10.3034 27.7272 10.0273 27.936C9.86975 28.0552 9.69422 28.1929 9.60779 28.3762C9.53927 28.5215 9.53876 28.7033 9.53446 28.8604C9.52846 29.0798 9.54491 29.2985 9.56261 29.5169C9.57509 29.671 9.57907 29.7312 9.72172 29.7869C10.0609 29.9196 10.4238 30.0036 10.7745 30.0986C12.2441 30.4965 13.725 30.8544 15.2071 31.2024C16.8396 31.5857 18.4764 31.9571 20.1245 32.2674C21.8316 32.5888 23.546 32.8724 25.2603 33.1528C26.7906 33.4031 28.3218 33.6483 29.8538 33.8883C30.2235 33.9469 30.5946 34.0005 30.9628 34.068C31.4676 34.1605 31.9591 34.2406 32.4694 34.1294C33.3171 33.9446 34.0357 33.3566 34.6365 32.7601C35.4588 31.9437 36.2379 31.0779 37.0043 30.2092C37.4861 29.6632 37.9585 29.109 38.4214 28.5466C38.5564 28.3818 38.694 28.2349 38.7504 28.0236C38.8384 27.6936 38.8368 27.3346 38.8303 26.9956C38.8264 26.7967 38.8176 26.5973 38.7996 26.3991C38.7909 26.3027 38.6657 26.2566 38.6109 26.348C38.3367 26.8046 38.0475 27.2557 37.7303 27.6836C37.5019 27.9917 37.2482 28.2865 37.0042 28.5828C36.1047 29.6752 35.0073 30.598 33.9218 31.4977C33.5347 31.8186 33.1384 32.1735 32.6859 32.4016C32.4594 32.5157 32.2299 32.5395 31.9843 32.5643C31.7764 32.5852 31.574 32.5661 31.3666 32.5428C30.992 32.5006 30.619 32.4443 30.2466 32.3866C29.1084 32.2102 27.974 32.0089 26.8407 31.8037C25.5275 31.566 24.2159 31.32 22.9057 31.0659C21.8301 30.858 20.7549 30.6468 19.6823 30.4238C18.5283 30.1839 17.374 29.9455 16.2193 29.7087C14.8874 29.4378 13.555 29.1691 12.2221 28.9025C11.4205 28.7419 10.6187 28.5818 9.81688 28.4222C9.77769 28.4144 9.7385 28.4066 9.69929 28.3988C9.57195 28.3735 9.51745 28.5687 9.64543 28.5941L9.64541 28.5942Z" fill="black"/>
<path d="M39.2582 11.3769C39.4049 11.4145 39.5486 11.4627 39.6884 11.5211C39.8872 11.6032 40.1212 11.7115 40.2361 11.9029C40.2383 11.9064 40.2538 11.9446 40.2436 11.9158C40.2443 11.9177 40.245 11.9195 40.2457 11.9214C40.2474 11.9264 40.2488 11.9315 40.25 11.9366C40.2533 11.9521 40.2568 11.9676 40.2595 11.9833C40.2609 11.9915 40.262 11.9998 40.2634 12.0081C40.2689 12.0416 40.2619 11.9933 40.2651 12.021C40.268 12.0458 40.2709 12.0706 40.2734 12.0954C40.2885 12.2469 40.2974 12.3991 40.3053 12.5511C40.3638 13.6713 40.3669 14.7956 40.3614 15.917C40.3546 17.2728 40.3336 18.6336 40.2224 19.9855C40.1093 21.361 39.9148 22.7302 39.6881 24.0912C39.6076 24.5743 39.5227 25.0567 39.4302 25.5377C39.4036 25.6757 39.3766 25.8137 39.3475 25.9512C39.322 26.0714 39.3011 26.172 39.1955 26.2542C39.0695 26.3524 38.896 26.3793 38.7499 26.3117C38.6323 26.2573 38.5293 26.4319 38.6476 26.4866C38.8234 26.5679 39.012 26.5725 39.1893 26.492C39.33 26.4281 39.4551 26.3111 39.5055 26.1624C39.5321 26.0842 39.5443 25.9993 39.5608 25.9186C39.6432 25.5167 39.7163 25.1128 39.7872 24.7088C40.0237 23.3595 40.2262 22.0024 40.3647 20.6394C40.5064 19.245 40.5447 17.8424 40.5598 16.4416C40.573 15.2192 40.5707 13.9945 40.5184 12.773C40.5061 12.4874 40.5092 12.1849 40.4502 11.9037C40.4124 11.7237 40.2419 11.5914 40.0946 11.4997C39.8937 11.3747 39.6668 11.2878 39.4413 11.2184C39.3985 11.2052 39.3555 11.1924 39.312 11.1815C39.1855 11.1497 39.1316 11.345 39.2582 11.3768V11.3769Z" fill="black"/>
<path d="M19.3146 23.441C19.2855 23.4224 19.321 23.4528 19.2955 23.4256C19.29 23.4198 19.2845 23.4139 19.279 23.4081C19.2585 23.3864 19.2865 23.4212 19.2722 23.3994C19.262 23.3837 19.2522 23.368 19.2435 23.3514C19.2394 23.3435 19.2356 23.3354 19.2317 23.3273C19.2198 23.3025 19.2349 23.3377 19.2253 23.3119C19.1894 23.2085 19.1645 23.1017 19.1509 22.9932C19.0996 22.6065 19.1075 22.2103 19.1139 21.8213C19.1243 21.1911 19.1542 20.5612 19.1829 19.9316C19.2229 19.0586 19.2594 18.1853 19.3047 17.3125C19.3706 16.0412 19.4446 14.7616 19.6342 13.5015C19.6807 13.1927 19.7327 12.8819 19.8181 12.581C19.832 12.5322 19.8469 12.4836 19.8636 12.4357C19.8706 12.4158 19.878 12.3961 19.8855 12.3763C19.8886 12.3682 19.8918 12.3602 19.8952 12.3522C19.8976 12.3465 19.8865 12.3666 19.9004 12.3422C19.9049 12.3344 19.9217 12.3153 19.9021 12.3378C19.9072 12.3315 19.9129 12.3256 19.9189 12.3202C19.941 12.3014 19.9223 12.3158 19.93 12.3103C19.9404 12.3028 19.9512 12.296 19.9621 12.2895C20.0085 12.2613 20.0583 12.2393 20.1104 12.224C20.5053 12.0884 20.9395 12.0501 21.3523 12.0088C21.9953 11.9445 22.6413 11.9107 23.2868 11.8841C24.7597 11.8235 26.2357 11.8001 27.7098 11.7952C28.7793 11.7916 29.8493 11.837 30.9172 11.8914C32.1359 11.9535 33.3535 12.0334 34.57 12.1311C35.5628 12.2102 36.5561 12.2959 37.5447 12.417C37.8322 12.4522 38.1209 12.4881 38.4051 12.5448C38.48 12.5589 38.5539 12.5777 38.6265 12.6009C38.6441 12.6067 38.6314 12.6013 38.6198 12.5977C38.622 12.5984 38.6323 12.6052 38.6343 12.6046C38.651 12.5993 38.6417 12.6248 38.6356 12.6044C38.6407 12.6215 38.6207 12.5843 38.6331 12.6011C38.6366 12.6056 38.6394 12.6106 38.6416 12.6159C38.652 12.6434 38.6391 12.6071 38.6436 12.619C38.647 12.628 38.6504 12.6371 38.6532 12.6463C38.729 12.9017 38.7307 13.1751 38.7424 13.4529C38.762 13.9175 38.7619 14.3831 38.7579 14.8481C38.7484 15.9489 38.71 17.0494 38.6662 18.1493C38.6324 18.9969 38.6063 19.846 38.5401 20.6917C38.4488 21.8573 38.3255 23.0273 38.1144 24.1777C38.0462 24.5495 37.9782 24.9795 37.8228 25.3108C37.8114 25.3356 37.7988 25.3597 37.785 25.3832C37.7789 25.3932 37.7726 25.403 37.766 25.4127C37.7531 25.4318 37.7755 25.4004 37.7565 25.4247C37.7512 25.431 37.7453 25.4368 37.739 25.4422C37.732 25.4488 37.762 25.4239 37.742 25.4389C37.7365 25.4427 37.7305 25.4458 37.7243 25.4483C37.72 25.4502 37.7456 25.4416 37.7204 25.4494C37.6815 25.4613 37.6417 25.4702 37.6015 25.476C37.6112 25.4746 37.6007 25.4763 37.584 25.478C37.5709 25.4794 37.5578 25.4807 37.5446 25.4818C37.5141 25.4844 37.4835 25.4862 37.4529 25.4876C37.0934 25.5036 36.7304 25.4716 36.3726 25.4402C35.8356 25.3932 35.3001 25.3298 34.7652 25.2633C33.3922 25.0927 32.0224 24.8974 30.651 24.7155C29.3094 24.5376 27.9667 24.3745 26.6197 24.2439C25.4013 24.1259 24.1827 24.0114 22.9647 23.8897C21.9351 23.7869 20.9024 23.6913 19.8778 23.5464C19.7464 23.5278 19.6149 23.5085 19.4846 23.4834C19.443 23.4754 19.4013 23.4671 19.3604 23.456C19.3471 23.4524 19.3342 23.4482 19.321 23.4442C19.2906 23.4351 19.3409 23.4568 19.3145 23.441C19.2024 23.3738 19.1004 23.549 19.2123 23.616C19.2757 23.654 19.3596 23.665 19.4307 23.6788C19.5701 23.7057 19.7108 23.726 19.8514 23.7456C20.3099 23.8098 20.7701 23.8616 21.2303 23.9121C22.471 24.0482 23.7136 24.1673 24.956 24.2867C26.1858 24.4049 27.4162 24.5167 28.643 24.6632C30.1063 24.8379 31.5659 25.0419 33.0264 25.2386C34.1988 25.3965 35.3734 25.5651 36.5532 25.6579C36.8861 25.6841 37.2288 25.7149 37.5625 25.6828C37.6539 25.674 37.7573 25.6642 37.8387 25.6171C37.9298 25.5644 37.9791 25.4584 38.0187 25.3657C38.1821 24.9831 38.2523 24.5553 38.3249 24.1482C38.4294 23.5618 38.5081 22.9707 38.5773 22.3792C38.6939 21.3818 38.7738 20.3819 38.817 19.3797C38.8611 18.363 38.9033 17.3463 38.9317 16.329C38.9598 15.3219 38.993 14.3081 38.9377 13.3013C38.9288 13.139 38.9166 12.9767 38.894 12.8157C38.8804 12.7184 38.8665 12.6134 38.8217 12.5244C38.7532 12.3877 38.5687 12.3706 38.4343 12.3446C37.6834 12.1994 36.9118 12.1383 36.1514 12.0659C34.976 11.9541 33.7984 11.8643 32.6201 11.7879C31.42 11.71 30.2186 11.6454 29.0165 11.6115C27.7644 11.5763 26.5115 11.6003 25.2594 11.6247C23.8687 11.6517 22.4659 11.6723 21.083 11.8354C20.702 11.8804 20.2842 11.9179 19.9303 12.0785C19.8293 12.1243 19.7466 12.1854 19.7035 12.2897C19.667 12.3802 19.6363 12.4729 19.6116 12.5673C19.5253 12.8856 19.4725 13.2134 19.4253 13.5395C19.3473 14.0791 19.292 14.6219 19.2455 15.1651C19.1036 16.821 19.0453 18.4832 18.9707 20.143C18.9432 20.7554 18.9148 21.3683 18.9092 21.9813C18.9057 22.3555 18.9035 22.7364 18.9645 23.1067C18.9945 23.2889 19.0458 23.5093 19.2123 23.616C19.3225 23.6865 19.4242 23.5112 19.3146 23.441Z" fill="black"/>
<path d="M14.741 26.9591C14.7581 26.9664 14.7755 27.0132 14.7729 27.0498C14.7735 27.0419 14.7709 27.0739 14.7684 27.0605C14.7663 27.0486 14.7695 27.0594 14.7674 27.0613C14.7919 27.0394 14.825 27.009 14.8318 27.0039C14.9322 26.9317 15.0366 26.8651 15.1444 26.8044C15.475 26.6108 15.8162 26.4348 16.158 26.2618C16.7893 25.9422 17.4415 25.6047 18.0933 25.3514C18.1225 25.34 18.1518 25.3296 18.1816 25.3198C18.1912 25.3167 18.2282 25.3124 18.1911 25.3169C18.2056 25.3151 18.2202 25.3142 18.2349 25.3133C18.3248 25.3098 18.4148 25.3113 18.5046 25.3177C18.8168 25.3342 19.1282 25.3676 19.4388 25.4014C20.3801 25.504 21.3188 25.6296 22.2573 25.7541C23.2167 25.8813 24.1755 26.0126 25.1358 26.1329C25.7483 26.2097 26.3623 26.274 26.9745 26.3539C27.7905 26.4603 28.6054 26.5748 29.4203 26.6897C30.3631 26.8226 31.3058 26.9564 32.2483 27.0913C33.0623 27.2069 33.8764 27.3225 34.6912 27.4325C35.1395 27.4931 35.5933 27.5728 36.0457 27.5967C36.0628 27.5976 36.0801 27.599 36.0973 27.5982C36.1886 27.5941 36.1056 27.6049 36.0694 27.5816L36.0229 27.521C36.0243 27.5318 36.0259 27.4219 36.0293 27.4506C36.0303 27.4586 36.0358 27.4421 36.0362 27.4419C36.0257 27.4517 36.0164 27.4626 36.0084 27.4745C35.9765 27.5112 35.9432 27.5467 35.91 27.5823C35.8024 27.6976 35.6927 27.811 35.5827 27.9239C35.244 28.2718 34.9005 28.615 34.5521 28.9535C34.1811 29.3149 33.8059 29.6727 33.4184 30.0167C33.3789 30.0518 33.3319 30.0845 33.2966 30.1238C33.2787 30.1437 33.3259 30.1077 33.3167 30.113C33.3107 30.1158 33.3041 30.1172 33.2974 30.1172C33.3297 30.1235 33.3068 30.1166 33.2894 30.117C33.2293 30.1185 33.1696 30.1178 33.1094 30.1147C32.5702 30.0867 32.0314 30.0047 31.497 29.9321C30.6491 29.8168 29.8027 29.6904 28.9567 29.5618C28.0381 29.4221 27.1199 29.2796 26.2021 29.1343C25.4308 29.0131 24.6594 28.8919 23.888 28.7708C23.2069 28.6651 22.5273 28.5506 21.8494 28.4274C20.9327 28.2592 20.0174 28.0829 19.1036 27.8986C18.2238 27.7228 17.345 27.5418 16.4673 27.3554C15.9296 27.2406 15.388 27.1321 14.8564 26.9905C14.8092 26.979 14.7626 26.9651 14.7167 26.9489C14.5947 26.9026 14.5419 27.0984 14.6629 27.1442C14.8046 27.198 14.959 27.2262 15.106 27.2609C15.4085 27.3324 15.7121 27.3992 16.0158 27.4652C16.9045 27.6583 17.7954 27.8417 18.6871 28.0212C19.6637 28.2178 20.6417 28.4076 21.6211 28.5906C22.3488 28.7253 23.078 28.8491 23.8088 28.9623C24.6294 29.0896 25.4498 29.2184 26.2699 29.3488C27.2436 29.5018 28.2177 29.6525 29.1921 29.801C30.0573 29.9317 30.923 30.06 31.7907 30.1739C32.1 30.2145 32.4096 30.2537 32.72 30.2852C32.8986 30.3033 33.0812 30.3261 33.2611 30.3208C33.31 30.3193 33.364 30.318 33.4075 30.2928C33.4954 30.2422 33.5736 30.1496 33.6488 30.0821C33.7473 29.9936 33.845 29.9044 33.942 29.8143C34.3545 29.432 34.7578 29.0396 35.1563 28.6428C35.4545 28.3458 35.7518 28.0473 36.0395 27.7401C36.093 27.6831 36.1682 27.6207 36.2057 27.5507C36.2458 27.4756 36.2003 27.4022 36.1193 27.3926C36.05 27.3843 36.1286 27.3981 36.0947 27.3956C35.7167 27.3679 35.341 27.3165 34.9653 27.2666C34.1968 27.1645 33.4293 27.0556 32.6617 26.9469C31.7411 26.8164 30.8205 26.6856 29.9 26.5544C29.0595 26.4355 28.2188 26.3171 27.3774 26.2045C26.7899 26.1259 26.2017 26.0582 25.6132 25.9886C24.7246 25.8835 23.8379 25.762 22.951 25.6437C21.9835 25.5147 21.0162 25.3845 20.047 25.2686C19.6723 25.2238 19.2972 25.1806 18.9213 25.1465C18.6991 25.1263 18.4717 25.1003 18.2481 25.11C18.0779 25.1175 17.9216 25.2027 17.7681 25.2699C17.4412 25.4132 17.1183 25.5659 16.7968 25.7209C16.4198 25.9026 16.045 26.0889 15.6742 26.2829C15.3851 26.4343 15.0926 26.586 14.8199 26.766C14.751 26.8115 14.6753 26.8589 14.6206 26.9217C14.5681 26.9822 14.5461 27.0942 14.6386 27.1338C14.7573 27.1849 14.8606 27.0104 14.741 26.9591Z" fill="black"/>
<path d="M23.9872 29.6532C23.702 29.9333 23.4309 30.2268 23.174 30.5337L23.2726 30.5076C23.0667 30.4753 22.8608 30.4426 22.655 30.4097C22.2141 30.3393 21.7733 30.268 21.3326 30.1957C20.8873 30.1224 20.4418 30.0502 19.999 29.9629C19.5371 29.8719 19.0771 29.771 18.6182 29.6662C18.3604 29.6074 18.1038 29.5418 17.8455 29.4851C17.8416 29.4842 17.8376 29.4832 17.8336 29.4822L17.8783 29.6515C18.1987 29.3406 18.5481 29.0611 18.9217 28.8167L18.8705 28.8305C19.1481 28.8539 19.4254 28.8802 19.7026 28.9077C19.9584 28.9331 20.2139 28.9603 20.4693 28.9892C20.5983 29.0039 20.7271 29.0194 20.8559 29.0356C20.8871 29.0396 20.9184 29.0436 20.9496 29.0477C20.965 29.0497 20.9804 29.0517 20.9958 29.0537C21.0019 29.0546 21.008 29.0554 21.0141 29.0562C21.0376 29.0593 21.0011 29.0543 21.025 29.0577C21.0619 29.0628 21.0987 29.0684 21.1354 29.0744C21.5157 29.1365 21.8913 29.2295 22.2644 29.3251C22.6499 29.4239 23.0334 29.5301 23.4157 29.6403C23.6185 29.6988 23.8199 29.7624 24.023 29.8197C24.026 29.8205 24.0289 29.8215 24.0319 29.8224C24.0578 29.8293 24.0853 29.8257 24.1086 29.8125C24.1319 29.7993 24.1491 29.7774 24.1565 29.7517C24.1631 29.7258 24.1594 29.6983 24.1462 29.6751C24.133 29.6519 24.1113 29.6347 24.0857 29.627C23.8729 29.5619 23.6592 29.4995 23.4453 29.438C22.9994 29.3097 22.5518 29.1864 22.1012 29.0751C21.8805 29.0205 21.659 28.9687 21.4359 28.9242C21.2121 28.8795 20.9869 28.849 20.7606 28.8211C20.2225 28.7548 19.6828 28.701 19.1429 28.652C19.0727 28.6456 19.0025 28.6393 18.9323 28.6332C18.9156 28.6318 18.8988 28.63 18.882 28.6289C18.8432 28.6264 18.8126 28.6461 18.781 28.667C18.4807 28.8661 18.1955 29.0871 17.9277 29.3282C17.8623 29.387 17.7981 29.447 17.735 29.5082C17.6813 29.5602 17.7059 29.6595 17.7797 29.6775C18.0432 29.7416 18.3075 29.8028 18.5718 29.8632C19.0884 29.9811 19.6064 30.0946 20.1269 30.1933C20.6325 30.2892 21.1415 30.3689 21.6494 30.4516C22.0886 30.5231 22.5281 30.5936 22.9676 30.6632C23.0508 30.6763 23.1339 30.6901 23.2172 30.7026C23.244 30.7085 23.2721 30.705 23.2966 30.6926C23.3207 30.6799 23.3381 30.6517 23.3553 30.6313C23.3706 30.6132 23.386 30.5951 23.4014 30.577C23.4606 30.5078 23.5205 30.4393 23.5811 30.3715C23.6999 30.2387 23.8214 30.1086 23.9458 29.9812C24.0067 29.9189 24.0681 29.8573 24.1303 29.7963C24.1682 29.7591 24.1704 29.6898 24.1303 29.653C24.111 29.6345 24.0854 29.6242 24.0587 29.6243C24.032 29.6243 24.0064 29.6347 23.9872 29.6532Z" fill="black"/>
<path d="M22.6603 15.6221C22.8068 15.4833 22.9575 15.3492 23.1123 15.2197C23.1896 15.1549 23.268 15.0914 23.3474 15.0292C23.3655 15.0149 23.3836 15.0008 23.4019 14.9867C23.4134 14.9777 23.3819 15.0021 23.3996 14.9885C23.4048 14.9845 23.41 14.9805 23.4152 14.9764C23.4257 14.9684 23.4361 14.9605 23.4466 14.9525C23.4867 14.922 23.5271 14.8918 23.5677 14.8618C23.891 14.6238 24.2285 14.4059 24.5784 14.2092C24.7753 14.0985 24.9759 13.9948 25.1802 13.898C25.2282 13.8752 25.2444 13.8027 25.2165 13.7594C25.1847 13.71 25.1292 13.6987 25.0779 13.7231C24.7132 13.896 24.3596 14.0913 24.019 14.3078C23.6731 14.528 23.341 14.7693 23.0247 15.0302C22.8504 15.1738 22.6812 15.3233 22.5171 15.4788C22.4983 15.4979 22.4878 15.5236 22.4878 15.5504C22.4878 15.5772 22.4983 15.6029 22.5171 15.6221C22.5363 15.6406 22.562 15.6509 22.5887 15.6509C22.6154 15.6509 22.6411 15.6406 22.6603 15.6221Z" fill="#B1B1B1"/>
<path d="M23.3974 13.4667C23.3694 13.4756 23.3437 13.4902 23.3217 13.5095C23.2997 13.5289 23.2819 13.5526 23.2696 13.5792C23.2438 13.6339 23.2382 13.696 23.2537 13.7544C23.2622 13.7849 23.2774 13.8131 23.2982 13.8369C23.319 13.8608 23.345 13.8796 23.3741 13.8919C23.4442 13.9215 23.5187 13.9167 23.5923 13.9061C23.7102 13.8867 23.8209 13.8365 23.9132 13.7605C23.9585 13.7236 23.9987 13.6808 24.0327 13.6332C24.0701 13.5827 24.1025 13.5228 24.1115 13.46C24.1207 13.4088 24.1136 13.3559 24.0913 13.3089C24.0734 13.2752 24.0462 13.2474 24.013 13.2286C23.9425 13.1882 23.8457 13.19 23.7883 13.253C23.7526 13.2922 23.7467 13.3581 23.7883 13.3963C23.8272 13.4319 23.8935 13.4381 23.9316 13.3963C23.9407 13.3863 23.9424 13.3929 23.9236 13.4009L23.927 13.3987C23.9359 13.394 23.9315 13.3957 23.9138 13.4038C23.9178 13.4032 23.9217 13.4022 23.9255 13.4007C23.9242 13.4019 23.8975 13.402 23.9107 13.4033C23.923 13.4045 23.9238 13.4085 23.9005 13.4011C23.9044 13.4023 23.9089 13.4032 23.913 13.4041C23.9294 13.408 23.8929 13.3931 23.903 13.3995C23.9073 13.4022 23.912 13.4045 23.9165 13.407C23.9318 13.4157 23.8977 13.3893 23.9099 13.402C23.9128 13.405 23.916 13.4089 23.9191 13.4115C23.9007 13.3959 23.907 13.394 23.9111 13.4016C23.9182 13.4149 23.91 13.4092 23.9087 13.3929C23.91 13.3991 23.9118 13.4051 23.9141 13.4109C23.9203 13.4311 23.9147 13.3873 23.9135 13.4083C23.9133 13.4123 23.9135 13.4167 23.9135 13.4207C23.9127 13.4318 23.9133 13.429 23.9153 13.4124C23.9147 13.4165 23.9139 13.4206 23.913 13.4248C23.9107 13.4352 23.9071 13.4452 23.904 13.4553C23.8973 13.4769 23.9146 13.4348 23.9042 13.455C23.9013 13.4607 23.8986 13.4665 23.8955 13.4722C23.8842 13.4926 23.8716 13.5122 23.8579 13.531C23.8484 13.5443 23.8625 13.5249 23.8634 13.5239C23.8595 13.5278 23.8562 13.5328 23.8527 13.537C23.8455 13.5457 23.838 13.5541 23.8302 13.5622C23.8153 13.5779 23.7996 13.5927 23.783 13.6066C23.7794 13.6097 23.7757 13.6126 23.7721 13.6156C23.756 13.6289 23.7918 13.6014 23.7747 13.6135C23.7671 13.6189 23.7595 13.6245 23.7516 13.6297C23.7329 13.6422 23.7134 13.6536 23.6933 13.6639C23.6832 13.669 23.673 13.6737 23.6627 13.6784C23.6476 13.6853 23.6704 13.6753 23.6713 13.6748C23.6662 13.6772 23.6609 13.6792 23.6556 13.6809C23.6344 13.6888 23.6129 13.6954 23.591 13.7007C23.5818 13.703 23.5726 13.7049 23.5634 13.7067C23.5579 13.7077 23.5523 13.7086 23.5468 13.7096C23.5258 13.7133 23.5725 13.7069 23.5514 13.709C23.5278 13.7118 23.5041 13.7128 23.4803 13.7122C23.4751 13.7119 23.4698 13.7113 23.4645 13.711C23.4505 13.71 23.4902 13.7173 23.4697 13.7112C23.4638 13.7094 23.4576 13.7078 23.4516 13.7062C23.431 13.7007 23.4712 13.7178 23.453 13.7064C23.4508 13.705 23.4485 13.7035 23.4461 13.7023C23.4317 13.6938 23.4658 13.7203 23.4543 13.7084C23.4517 13.7056 23.4491 13.7025 23.4463 13.7C23.4667 13.7184 23.4581 13.7165 23.452 13.7066C23.4503 13.7038 23.4489 13.701 23.4473 13.6982C23.4395 13.6844 23.4573 13.7264 23.4502 13.7044C23.4464 13.6927 23.4465 13.6684 23.4481 13.7044C23.4477 13.6951 23.4473 13.686 23.4476 13.6766C23.4478 13.6688 23.4521 13.6595 23.4453 13.6917C23.4464 13.6865 23.4471 13.6812 23.4484 13.6761C23.4494 13.6722 23.4507 13.6685 23.4519 13.6647C23.4566 13.6487 23.4404 13.6882 23.4476 13.6743C23.4495 13.6709 23.4512 13.6674 23.4531 13.664C23.4589 13.6543 23.4703 13.6472 23.4484 13.6687C23.4507 13.6664 23.4527 13.6638 23.4549 13.6616C23.4624 13.654 23.4731 13.6512 23.4475 13.6661C23.4508 13.6642 23.4539 13.6618 23.4573 13.6599C23.4775 13.6484 23.4358 13.6675 23.4512 13.6621C23.5011 13.6447 23.5396 13.5919 23.5219 13.5375C23.506 13.4881 23.4509 13.4481 23.3973 13.4667L23.3974 13.4667Z" fill="#B1B1B1"/>
<path d="M23.3887 15.6963C23.2912 15.7695 23.196 15.8747 23.2092 16.0064C23.2156 16.0693 23.2379 16.1336 23.2881 16.1753C23.3176 16.1997 23.3524 16.2167 23.3897 16.2251C23.427 16.2334 23.4657 16.2328 23.5027 16.2234C23.5606 16.2082 23.6148 16.1815 23.6621 16.1448C23.7119 16.1091 23.7594 16.0701 23.804 16.028C23.8429 15.991 23.8792 15.9513 23.9127 15.9093C23.9539 15.8575 23.9977 15.8039 24.0211 15.7413C24.0547 15.6513 24.0081 15.5614 23.9355 15.5083C23.8743 15.4636 23.7933 15.4593 23.7203 15.4595C23.6673 15.4596 23.6165 15.506 23.619 15.5608C23.6194 15.5875 23.6302 15.613 23.6491 15.6319C23.668 15.6508 23.6935 15.6616 23.7203 15.6621C23.7324 15.6621 23.7444 15.6621 23.7565 15.6624C23.762 15.6625 23.7675 15.6627 23.773 15.6631C23.7795 15.6644 23.7861 15.6649 23.7927 15.6647C23.7912 15.6658 23.7672 15.6598 23.7851 15.6639C23.7915 15.6652 23.7979 15.6664 23.8042 15.6682C23.8083 15.6693 23.8124 15.6707 23.8166 15.672C23.8271 15.6759 23.8248 15.6749 23.8096 15.6688C23.8129 15.6704 23.8162 15.6721 23.8194 15.674C23.8224 15.6758 23.8256 15.6785 23.8288 15.68L23.8172 15.6709C23.8201 15.6733 23.8229 15.6758 23.8255 15.6783C23.8278 15.6813 23.8304 15.684 23.8332 15.6864L23.8242 15.6746C23.8263 15.6775 23.8283 15.6806 23.8301 15.6837C23.8413 15.6989 23.8246 15.6648 23.8279 15.6766C23.8286 15.681 23.8298 15.6853 23.8314 15.6895C23.8254 15.679 23.8281 15.6658 23.8293 15.6814C23.829 15.689 23.8296 15.6851 23.8311 15.6696C23.8303 15.6736 23.8292 15.6776 23.8279 15.6816C23.823 15.7017 23.8365 15.6664 23.8294 15.6776C23.8266 15.682 23.8243 15.6869 23.8216 15.6914C23.8161 15.7005 23.8102 15.7092 23.8042 15.7179C23.7983 15.7266 23.7923 15.7352 23.7861 15.7438C23.7824 15.7489 23.7786 15.754 23.7748 15.759C23.7729 15.7616 23.771 15.7641 23.7691 15.7666C23.7645 15.7726 23.7666 15.7699 23.7753 15.7586C23.7677 15.7659 23.761 15.7742 23.7555 15.7832C23.7481 15.7921 23.7406 15.8009 23.7329 15.8096C23.7176 15.827 23.7018 15.844 23.6855 15.8604C23.6537 15.8927 23.62 15.923 23.5847 15.9514C23.5828 15.9529 23.5658 15.9651 23.58 15.9552C23.5942 15.9452 23.5771 15.9573 23.5752 15.9587C23.5668 15.965 23.5582 15.9712 23.5496 15.9773C23.531 15.9907 23.5115 16.0027 23.4913 16.0133C23.4878 16.0151 23.4764 16.0185 23.4743 16.0215C23.4796 16.014 23.4932 16.0145 23.4811 16.0184C23.4715 16.0217 23.4619 16.0251 23.4519 16.0275L23.446 16.0288C23.4351 16.0308 23.4382 16.0305 23.4554 16.028C23.4505 16.0279 23.4456 16.0282 23.4408 16.0289C23.436 16.0282 23.4311 16.0281 23.4263 16.0285C23.4437 16.0312 23.447 16.0316 23.4362 16.0296C23.4333 16.029 23.4305 16.0283 23.4278 16.0274C23.413 16.0231 23.4252 16.0207 23.4328 16.0302C23.4285 16.0271 23.4238 16.0244 23.4189 16.0223C23.4102 16.0171 23.4182 16.0147 23.4277 16.0292C23.4246 16.0254 23.4211 16.022 23.4173 16.0188C23.4106 16.0122 23.4164 16.0095 23.4241 16.0278C23.4223 16.0235 23.4186 16.0193 23.4163 16.0152C23.415 16.0122 23.4135 16.0093 23.4118 16.0064C23.4186 16.0231 23.4201 16.0265 23.4165 16.0167C23.4154 16.0136 23.4144 16.0103 23.4135 16.0071C23.4126 16.0038 23.4118 16.0005 23.4111 15.9973C23.4055 15.971 23.4118 16.0167 23.4113 15.999C23.4095 15.9889 23.4098 15.9785 23.412 15.9685C23.4122 15.9681 23.4064 15.9964 23.4107 15.9804C23.4126 15.9735 23.414 15.9667 23.4162 15.96C23.4175 15.9564 23.4192 15.9527 23.4203 15.949C23.4121 15.9775 23.4181 15.9548 23.4226 15.9468C23.4297 15.9374 23.4361 15.9275 23.4418 15.9173C23.4411 15.9192 23.426 15.9361 23.437 15.924C23.4417 15.9188 23.4461 15.9135 23.4509 15.9085C23.4592 15.8998 23.4678 15.8916 23.4768 15.8837C23.4805 15.8804 23.4843 15.8772 23.4882 15.874C23.4912 15.8715 23.4943 15.869 23.4974 15.8665C23.4847 15.8762 23.4826 15.8779 23.4911 15.8715C23.5133 15.8575 23.5298 15.836 23.5376 15.811C23.5446 15.7846 23.541 15.7565 23.5274 15.7329C23.5005 15.6911 23.4341 15.6625 23.3888 15.6965L23.3887 15.6963Z" fill="#B1B1B1"/>
<path d="M18.8966 17.2873C18.8966 17.2873 20.9795 17.1959 21.9461 17.3012C22.9127 17.4066 26.0664 18.1417 26.9159 18.329C27.7654 18.5163 29.5261 18.8312 30.4361 19.1508C31.346 19.4705 32.2926 19.9013 32.8835 20.1801C33.4744 20.459 33.7618 20.5439 33.7618 20.5439C33.7618 20.5439 34.174 20.0329 34.2756 19.7817C34.3771 19.5306 34.5578 19.0694 34.5578 19.0694C34.5578 19.0694 34.8006 19.5142 34.9333 19.8872C35.066 20.2603 35.4901 21.6996 35.5433 22.1278C35.5966 22.556 35.6374 24.1562 35.6374 24.1562L35.4012 25.9202C35.4012 25.9202 35.9136 26.1243 36.0693 26.3214C36.2251 26.5184 36.5374 27.1041 36.4201 27.4285C36.3028 27.753 35.7496 28.7626 35.2899 28.9996C34.8302 29.2366 34.6667 29.2904 34.6667 29.2904C34.6667 29.2904 34.6045 29.6442 34.2325 29.8656C33.8605 30.0871 32.191 30.7622 30.219 30.9069C28.247 31.0516 26.292 31.0705 26.292 31.0705L20.9123 30.7799L17.4321 30.3964L14.1536 29.5492C14.1536 29.5492 12.2871 28.8038 11.9946 28.3688C11.702 27.9338 11.4557 27.2763 11.4557 27.2763C11.4557 27.2763 10.8937 27.7471 10.6293 28.024C10.3648 28.3009 8.92114 29.7667 8.2754 30.6641C7.4183 31.8553 6.94264 32.9831 7.80966 33.5949C8.50483 34.0854 8.85118 34.3317 10.1057 34.3278C11.3601 34.3239 14.0642 34.116 14.0642 34.116C14.0642 34.116 16.4319 34.1194 17.7666 34.2449C19.4166 34.4 21.1623 35.0441 21.1623 35.0441C21.1623 35.0441 22.0876 35.3273 22.4223 36.0414C22.7569 36.7555 22.9121 37.2548 22.5484 37.5144C22.1848 37.7741 21.6026 37.9291 20.9109 37.7647C20.2192 37.6003 18.6902 37.07 18.6902 37.07L16.6897 36.5617L14.545 36.1347L12.9239 36.0115L11.3102 36.1802L9.06683 35.9639C9.06683 35.9639 7.69836 35.7222 7.08883 35.3781C6.47929 35.034 5.5722 34.6762 5.473 33.6429C5.3738 32.6096 5.16635 32.1955 6.00654 31.0833C6.84672 29.971 8.03007 28.8563 8.03007 28.8563L9.46929 27.8328L10.9725 26.8733L11.3102 26.6175C11.3102 26.6175 11.2973 25.4521 11.3549 24.851C11.4126 24.2498 11.4095 23.2091 12.0611 22.0445C12.7126 20.88 13.4911 19.7104 14.2802 19.0803C15.0693 18.4502 15.2966 18.0743 16.497 17.7629C17.6975 17.4514 18.8966 17.2873 18.8966 17.2873Z" fill="white"/>
<path d="M33.9426 23.1549C34.1026 22.9504 34.2858 22.7515 34.5251 22.6508C34.7645 22.5501 35.1304 22.6268 35.3291 22.7939C35.4897 22.9289 35.6097 23.2284 35.6059 23.4193C35.6021 23.6038 35.6238 23.8789 35.543 24.0447C35.4369 24.2624 35.2792 24.4196 35.0657 24.5338C34.9383 24.6019 34.6712 24.7378 34.5274 24.7518C34.2094 24.7826 33.2964 24.9757 33.2521 24.4714C33.2143 24.0411 33.6992 23.466 33.9426 23.1549Z" fill="#4E4E4E"/>
<path d="M30.141 21.319C29.9462 21.0639 29.8199 20.8859 29.6881 20.5932C29.6159 20.4329 29.5683 20.2288 29.6811 20.0938C29.7397 20.0237 29.9985 19.8771 30.0877 19.8571C30.9938 19.6533 31.8565 19.9682 32.49 20.6592C32.6133 20.7936 32.7229 20.9438 32.7884 21.1141C32.8484 21.2702 32.8695 21.4388 32.8725 21.6059C32.8787 21.9505 32.779 22.3391 32.4776 22.5063C32.1573 22.684 31.7612 22.5391 31.4256 22.3927C31.1912 22.2904 30.9536 21.9973 30.7104 21.7581C30.5614 21.6116 30.3118 21.5429 30.141 21.319Z" fill="#4E4E4E"/>
<path d="M33.0438 25.438C33.0492 25.4205 33.0289 25.4068 33.0119 25.3999C32.8873 25.3494 32.7551 25.3073 32.6209 25.3161C32.4867 25.325 32.3495 25.3943 32.2924 25.516C32.2608 25.5833 32.2559 25.6597 32.254 25.734C32.251 25.8479 32.258 25.9728 32.3345 26.0572C32.4126 26.1434 32.5396 26.1614 32.6557 26.1678C32.7395 26.1724 32.8254 26.1736 32.9053 26.148C33.0993 26.0859 33.2181 25.8512 33.1534 25.6581" fill="#B1B1B1"/>
<path d="M33.6975 25.9739C33.3026 26.0062 33.1374 25.8478 33.1065 25.4482C33.0886 25.2169 33.3064 25.0907 33.5239 25.1122C33.7001 25.1297 33.8582 25.1946 33.9789 25.3736C34.0598 25.4937 34.1204 25.6805 34.0575 25.8109C33.9974 25.9354 33.8353 25.9626 33.6975 25.9739Z" fill="#B1B1B1"/>
<path d="M35.1099 23.4806C35.1678 23.4733 35.2485 23.4831 35.2533 23.5413C35.2553 23.5662 35.2404 23.589 35.2256 23.6092C35.0589 23.8358 34.8417 24.0202 34.5911 24.148C34.4531 24.2189 34.3006 24.3009 34.1455 24.3246C34.0581 24.3379 34.0114 24.3171 33.9324 24.3043C33.8238 24.2863 33.7131 24.2848 33.604 24.2997C33.6541 24.2937 33.8784 24.0515 33.9316 24.0066C34.0331 23.9209 34.1159 23.817 34.228 23.741C34.4896 23.5636 34.803 23.5191 35.1099 23.4806Z" fill="white"/>
<path d="M23.7759 17.5583C23.0399 17.3739 22.2093 17.6444 21.7232 18.227C21.237 18.8095 21.1195 19.6751 21.4327 20.3662C21.5721 20.6738 21.7861 20.942 22.0188 21.1868C22.1897 21.3667 22.3752 21.5382 22.5972 21.6492C23.0722 21.8868 23.6403 21.8149 24.1566 21.6901C24.7908 21.5367 25.4161 21.3074 25.9454 20.9257C26.4747 20.5441 26.9034 19.9976 27.0542 19.3628C27.1336 19.0289 27.1154 18.6305 26.858 18.4034C26.6501 18.22 26.3503 18.2012 26.0764 18.1578C25.7006 18.0982 25.3373 17.9764 25.0014 17.7976" fill="#B1B1B1"/>
<path d="M25.6621 24.2325C25.9004 24.2845 26.1527 24.2473 26.3789 24.1558C26.5073 24.1038 26.6328 24.0311 26.7132 23.9183C26.8112 23.7807 26.8296 23.5978 26.7938 23.4327C26.7581 23.2676 26.6734 23.1173 26.5792 22.9771C26.4024 22.7138 26.1689 22.464 25.8616 22.3859C24.7906 22.1136 24.62 24.0049 25.6621 24.2325Z" fill="#B1B1B1"/>
<path d="M23.5718 22.6189C23.5481 22.7796 23.741 22.9211 23.8932 22.8643C24.0523 22.8049 24.1004 22.5578 23.9692 22.4499C23.838 22.342 23.5825 22.4337 23.5718 22.6189Z" fill="#B1B1B1"/>
<path d="M19.7858 19.096C19.7312 19.1714 19.6982 19.2601 19.6903 19.3528C19.6824 19.4455 19.7 19.5386 19.741 19.6221C19.7821 19.7056 19.8451 19.7763 19.9234 19.8266C20.0017 19.8769 20.0921 19.9049 20.1851 19.9076C20.2796 19.9104 20.3792 19.8837 20.4444 19.8154C20.6013 19.6512 20.4824 19.3734 20.5551 19.1584C20.5793 19.0869 20.6251 19.0224 20.6371 18.9479C20.6617 18.794 20.5206 18.6473 20.3657 18.6297C20.2109 18.6122 20.0588 18.698 19.9568 18.8158C19.8548 18.9336 19.8275 19.0123 19.7858 19.096Z" fill="#B1B1B1"/>
<path d="M11.8682 22.5118C12.463 22.5634 13.0614 22.4678 13.6107 22.2335C13.8536 22.1296 14.093 21.992 14.2465 21.7768C14.4787 21.4513 14.4762 21.0054 14.6928 20.6694C14.9094 20.3333 15.3035 20.1648 15.6111 19.9095C16.0752 19.5244 16.3421 18.9131 16.3092 18.311C16.3047 18.2277 16.293 18.1402 16.2425 18.0737C16.1176 17.9094 15.859 17.9729 15.6732 18.0628C14.0655 18.8396 12.9562 20.3577 12.0243 21.8807" fill="#626262"/>
<path d="M18.2611 26.9593C18.2397 27.3216 18.2229 27.7058 18.3966 28.0243C18.4943 28.2033 18.6449 28.3466 18.793 28.4867C19.0208 28.7022 19.2836 28.932 19.5972 28.9244C19.9565 28.9157 20.2306 28.5948 20.3806 28.2682C20.5734 27.8479 20.6434 27.3649 20.5356 26.9151C20.4245 26.4515 20.0006 25.7422 19.4657 25.6917C18.706 25.6199 18.2994 26.3118 18.2611 26.9593Z" fill="#626262"/>
<path d="M16.9576 36.2603C17.1632 36.6487 17.611 36.8412 18.0394 36.9395C18.4678 37.0378 18.9194 37.0747 19.3085 37.2792C19.4509 37.354 19.5283 37.3327 19.6715 37.4059C19.9299 37.5379 20.1851 37.5639 20.4704 37.6164C21.0579 37.7248 21.5745 37.8833 22.1462 37.7099C22.6946 37.5435 22.9072 37.3 22.7633 36.7452C22.7256 36.5996 22.6941 36.3708 22.6079 36.2476C22.191 35.6517 21.8343 35.3212 21.162 35.0438C20.2046 34.6489 18.8113 34.1618 17.7663 34.2447C16.9189 34.3119 16.5764 35.5397 16.9576 36.2603Z" fill="#626262"/>
<path d="M27.5032 21.0485C27.5801 21.38 27.6446 21.714 27.6968 22.0506C27.7041 22.0976 27.7111 22.1447 27.7179 22.1918C27.7213 22.2159 27.7248 22.2401 27.7281 22.2642C27.7296 22.2751 27.7311 22.286 27.7326 22.2969C27.7334 22.3029 27.7342 22.3089 27.735 22.315L27.7334 22.3026C27.734 22.3074 27.7346 22.3122 27.7353 22.3171C27.739 22.3451 27.7442 22.3679 27.765 22.3887C27.7744 22.3981 27.7855 22.4056 27.7978 22.4107C27.8101 22.4158 27.8233 22.4184 27.8366 22.4184C27.8499 22.4184 27.8631 22.4158 27.8754 22.4107C27.8877 22.4056 27.8988 22.3981 27.9082 22.3887C27.925 22.3705 27.9413 22.343 27.9379 22.3171C27.8918 21.9695 27.8338 21.6237 27.7617 21.2805C27.7417 21.1849 27.7206 21.0897 27.6985 20.9946C27.6912 20.9688 27.674 20.947 27.6507 20.9337C27.6274 20.9205 27.5998 20.917 27.5739 20.9239C27.5483 20.9315 27.5267 20.9487 27.5135 20.9719C27.5003 20.9952 27.4966 21.0226 27.5032 21.0485L27.5032 21.0485Z" fill="black"/>
<path d="M27.5637 21.0919L28.7926 21.4633L29.1427 21.5692C29.1686 21.5761 29.1962 21.5725 29.2195 21.5593C29.2428 21.546 29.26 21.5242 29.2673 21.4984C29.2739 21.4725 29.2703 21.4451 29.2571 21.4219C29.2439 21.3986 29.2222 21.3814 29.1966 21.3738L27.9677 21.0023L27.6175 20.8965C27.5916 20.8896 27.5641 20.8932 27.5408 20.9064C27.5175 20.9196 27.5003 20.9415 27.4929 20.9672C27.4864 20.9931 27.49 21.0206 27.5032 21.0438C27.5164 21.067 27.5381 21.0843 27.5637 21.0919Z" fill="black"/>
<path d="M34.4602 19.0424C34.3368 19.3572 34.227 19.6833 34.0698 19.9833C34.0013 20.1141 33.9222 20.2404 33.8216 20.3491C33.8065 20.3653 33.7101 20.4392 33.7105 20.4565C33.7103 20.4472 33.7519 20.4453 33.7545 20.4443C33.7262 20.4549 33.7587 20.448 33.7385 20.4432C33.7029 20.4347 33.6678 20.4243 33.6332 20.4121C33.4682 20.3548 33.3097 20.2776 33.1528 20.2013C32.6882 19.9752 32.2365 19.7306 31.7598 19.5295C31.2155 19.3009 30.6584 19.1042 30.0912 18.9403C29.405 18.7409 28.7084 18.6032 28.0085 18.4628C27.3795 18.3367 26.7547 18.1912 26.1329 18.0339C25.1507 17.7853 24.1737 17.4976 23.1708 17.3422C22.4027 17.2233 21.6231 17.1595 20.8466 17.1358C19.841 17.1052 18.8287 17.1504 17.8366 17.3234C16.8364 17.4978 15.8301 17.8101 14.9841 18.3856C14.4685 18.7365 14.0003 19.1738 13.5757 19.629C13.1713 20.0613 12.809 20.5311 12.4938 21.0322C11.9562 21.8902 11.5638 22.8469 11.376 23.8432C11.2798 24.3538 11.2435 24.8751 11.2207 25.3935C11.1956 25.9638 11.2016 26.5424 11.3133 27.1044C11.4094 27.5875 11.5965 28.0546 11.917 28.4334C12.1935 28.7601 12.5585 28.9828 12.9395 29.1676C13.8652 29.6165 14.8725 29.9089 15.8674 30.1583C16.999 30.4418 18.1533 30.6591 19.3155 30.7673C20.4186 30.8699 21.5286 30.9246 22.6343 30.9932C23.7625 31.0631 24.8913 31.1277 26.0211 31.1638C27.0016 31.1951 27.9747 31.1748 28.9541 31.116C29.8874 31.0615 30.8166 30.9518 31.7368 30.7876C32.3864 30.6718 33.0251 30.5019 33.6463 30.2795C34.0775 30.1238 34.5929 29.8563 34.7339 29.3818C34.8505 28.9895 34.7767 28.323 34.2823 28.2626C34.0524 28.2345 33.8129 28.2719 33.5863 28.3107C33.2867 28.3619 32.9895 28.4235 32.6888 28.4686C31.5091 28.6456 30.2868 28.6228 29.1201 28.3639C28.739 28.2794 28.3632 28.1726 27.9823 28.087C27.8553 28.0585 27.8011 28.2537 27.9285 28.2824C28.3175 28.3698 28.7012 28.4793 29.0907 28.5647C29.5707 28.6683 30.0582 28.7341 30.5485 28.7616C31.2244 28.8038 31.9028 28.7793 32.5738 28.6882C32.896 28.6439 33.2157 28.5862 33.535 28.5251C33.7462 28.4848 33.9633 28.4505 34.1789 28.4573C34.2813 28.4605 34.3714 28.4712 34.4424 28.5519C34.544 28.6674 34.5618 28.8272 34.5677 28.9743C34.5758 29.1706 34.5598 29.3559 34.4424 29.5207C34.1156 29.9794 33.4947 30.1292 32.9865 30.2777C31.9647 30.5761 30.9094 30.7426 29.8508 30.845C28.898 30.9372 27.9339 30.9883 26.9766 30.9814C25.9571 30.974 24.9377 30.922 23.9199 30.8661C22.7789 30.8034 21.6387 30.7283 20.4986 30.6505C19.9936 30.616 19.4879 30.5873 18.9848 30.5306C18.4085 30.4656 17.8354 30.3729 17.2663 30.2621C16.1572 30.0462 15.0531 29.7676 13.9894 29.3841C13.1943 29.0975 12.306 28.7598 11.8533 27.9971C11.5897 27.553 11.4793 27.034 11.4362 26.5245C11.3865 25.9373 11.4172 25.3453 11.4634 24.7589C11.5379 23.8134 11.7717 22.8981 12.1754 22.0382C12.6729 20.9784 13.392 20.0354 14.2516 19.2433C14.6661 18.8613 15.1038 18.5136 15.6042 18.2511C16.0542 18.0149 16.5343 17.8409 17.0245 17.7089C18.805 17.2295 20.7183 17.2537 22.5383 17.4616C23.4124 17.5614 24.2633 17.7593 25.1138 17.9798C25.6598 18.1214 26.2052 18.2649 26.754 18.395C27.4296 18.5551 28.1115 18.6788 28.7904 18.8231C29.9447 19.0687 31.0838 19.4213 32.1527 19.9249C32.5899 20.131 33.0082 20.3766 33.456 20.5601C33.5495 20.5984 33.7088 20.6842 33.8131 20.6314C33.9159 20.5795 34.0048 20.4524 34.0727 20.3617C34.1586 20.2446 34.2327 20.1191 34.2939 19.9873C34.4317 19.6984 34.539 19.3942 34.6557 19.0964C34.7033 18.9749 34.5074 18.9223 34.4603 19.0425L34.4602 19.0424Z" fill="black"/>
<path d="M34.5201 19.1315C34.813 19.8121 35.0626 20.5085 35.2456 21.2267C35.3393 21.5943 35.4251 21.9648 35.4717 22.3416C35.5225 22.7522 35.5394 23.1663 35.5414 23.5798C35.5448 24.2683 35.5416 24.975 35.3747 25.6443C35.3166 25.878 35.2355 26.1054 35.1324 26.323C35.0031 26.5947 34.8458 26.8531 34.6812 27.1046C34.4099 27.5192 34.1093 27.9244 33.7638 28.2811C33.7586 28.2865 33.7534 28.2919 33.7481 28.2973C33.6558 28.3896 33.799 28.5329 33.8913 28.4405C33.974 28.3579 34.0512 28.2693 34.1273 28.1806C34.3297 27.9439 34.5202 27.6971 34.6978 27.4412C35.0342 26.9586 35.3494 26.4445 35.5207 25.8775C35.7147 25.235 35.7358 24.5513 35.743 23.8851C35.7475 23.4654 35.741 23.045 35.7043 22.6266C35.6688 22.2222 35.5978 21.8259 35.5044 21.4311C35.3331 20.7126 35.1045 20.0089 34.8208 19.3268C34.7796 19.2273 34.7377 19.1282 34.6951 19.0293C34.6734 18.979 34.5995 18.9677 34.5565 18.9929C34.5045 19.0233 34.4984 19.0811 34.5201 19.1315Z" fill="black"/>
<path d="M33.7517 24.3059C33.7531 24.3026 33.7542 24.2987 33.7559 24.2954C33.7554 24.2964 33.7455 24.3192 33.7522 24.3041C33.7549 24.2982 33.7575 24.2922 33.7602 24.2862C33.7669 24.272 33.7739 24.2579 33.7814 24.2441C33.7948 24.2191 33.8095 24.1949 33.8254 24.1714C33.8331 24.1601 33.841 24.149 33.8492 24.1381C33.8508 24.1359 33.8525 24.1337 33.8541 24.1316C33.8617 24.1215 33.8403 24.1489 33.8483 24.1392C33.8535 24.1328 33.8585 24.1264 33.8638 24.1202C33.8818 24.0986 33.9008 24.0778 33.9206 24.0579C33.9403 24.0379 33.961 24.0187 33.9822 24.0003C33.9926 23.9913 34.003 23.9826 34.0136 23.974C34.0193 23.9694 34.025 23.9649 34.0307 23.9604C34.0392 23.9537 34.02 23.9689 34.0211 23.9679C34.0252 23.9643 34.0296 23.961 34.0341 23.9581C34.0795 23.9245 34.1266 23.8934 34.1753 23.8651C34.2234 23.8369 34.2727 23.8111 34.323 23.7872C34.3475 23.7755 34.3723 23.7642 34.3972 23.7533C34.4036 23.7506 34.4099 23.7478 34.4163 23.7451C34.4359 23.7367 34.3977 23.7528 34.4135 23.7463C34.4272 23.7406 34.441 23.7349 34.4549 23.7294C34.5901 23.6751 34.73 23.6331 34.8728 23.6039C34.9122 23.5959 34.9518 23.5891 34.9915 23.5834C34.996 23.5823 35.0005 23.5816 35.0051 23.5815L34.9918 23.5833C34.9952 23.5829 34.9986 23.5824 35.002 23.582C35.0121 23.5808 35.0223 23.5796 35.0325 23.5785C35.0517 23.5764 35.071 23.5746 35.0902 23.5731C35.1699 23.5667 35.2499 23.5657 35.3298 23.57C35.3566 23.5698 35.3823 23.5591 35.4012 23.5401C35.4202 23.5212 35.4309 23.4955 35.4311 23.4687C35.4305 23.442 35.4196 23.4165 35.4008 23.3977C35.3819 23.3788 35.3565 23.3679 35.3298 23.3674C35.0277 23.3511 34.7222 23.4118 34.4404 23.5187C34.2092 23.6064 33.9816 23.72 33.8007 23.8917C33.694 23.9925 33.6106 24.1155 33.5563 24.2519C33.5528 24.265 33.5518 24.2786 33.5536 24.292C33.5553 24.3054 33.5598 24.3183 33.5666 24.33C33.5733 24.3415 33.5822 24.3516 33.5927 24.3596C33.6033 24.3677 33.6154 24.3736 33.6283 24.377C33.6411 24.3804 33.6546 24.3812 33.6677 24.3794C33.6809 24.3776 33.6936 24.3732 33.7051 24.3665C33.727 24.3521 33.7433 24.3308 33.7517 24.306V24.3059Z" fill="black"/>
<path d="M33.6029 24.3667C33.6663 24.4135 33.7486 24.4292 33.8258 24.4318C33.8965 24.4327 33.9671 24.427 34.0368 24.415C34.163 24.395 34.2864 24.3597 34.4041 24.31C34.6647 24.2005 34.9044 24.0466 35.1125 23.8553C35.2243 23.7534 35.3264 23.6412 35.4172 23.5201C35.432 23.5006 35.4336 23.4645 35.4274 23.4421C35.4203 23.4162 35.4031 23.3942 35.3798 23.3809C35.3564 23.3676 35.3287 23.3642 35.3028 23.3713C35.278 23.3797 35.2568 23.3961 35.2423 23.4179C35.2378 23.4238 35.2332 23.4297 35.2287 23.4357C35.2295 23.4347 35.2444 23.4157 35.2342 23.4285C35.2319 23.4315 35.2296 23.4345 35.2272 23.4374C35.2178 23.4494 35.2082 23.4612 35.1985 23.4728C35.1788 23.4967 35.1586 23.52 35.1379 23.543C35.0961 23.5894 35.0525 23.6341 35.0071 23.677C34.9606 23.7211 34.9125 23.7633 34.8627 23.8036C34.85 23.814 34.8371 23.8242 34.8241 23.8343C34.8102 23.8452 34.8423 23.8204 34.8226 23.8354C34.8153 23.841 34.8079 23.8465 34.8005 23.8521C34.774 23.8718 34.7472 23.8909 34.72 23.9095C34.6138 23.9825 34.5014 24.0462 34.3841 24.0997C34.3768 24.103 34.3694 24.1063 34.3621 24.1095C34.355 24.1126 34.33 24.1219 34.3586 24.1112C34.3437 24.1168 34.329 24.1234 34.3141 24.1292C34.2846 24.1407 34.2548 24.1514 34.2247 24.1613C34.1667 24.1805 34.1076 24.1961 34.0476 24.2083C34.0309 24.2116 34.014 24.2147 33.9971 24.2174C33.9887 24.2188 33.9803 24.22 33.9718 24.2213C33.9652 24.2222 33.9524 24.2232 33.982 24.2199C33.9782 24.2203 33.9745 24.2208 33.9707 24.2213C33.9366 24.2254 33.9023 24.2282 33.868 24.2292C33.85 24.2297 33.8319 24.2296 33.8139 24.2286C33.8049 24.2281 33.796 24.2271 33.7871 24.2264C33.7756 24.2254 33.8006 24.2279 33.7993 24.228C33.7934 24.2277 33.7875 24.2267 33.7818 24.2249C33.7657 24.2215 33.7498 24.2168 33.7343 24.2111C33.7222 24.2067 33.7538 24.2205 33.7425 24.2144C33.7383 24.212 33.7339 24.2101 33.7297 24.2077C33.7212 24.2029 33.713 24.1975 33.7052 24.1917C33.6935 24.1849 33.6806 24.1805 33.6672 24.1787C33.6538 24.177 33.6402 24.1779 33.6271 24.1815C33.6012 24.1886 33.5792 24.2057 33.5659 24.2291C33.5527 24.2525 33.5492 24.2802 33.5564 24.3061C33.5647 24.3309 33.5811 24.3522 33.6029 24.3666L33.6029 24.3667Z" fill="black"/>
<path d="M29.6772 24.5239C29.6937 24.516 29.7104 24.5085 29.7272 24.5011C29.7309 24.4995 29.7346 24.4979 29.7383 24.4962C29.7577 24.4877 29.7206 24.5036 29.7337 24.4981C29.743 24.4943 29.7524 24.4904 29.7618 24.4867C29.7964 24.4729 29.8313 24.4601 29.8667 24.4482C29.9368 24.4249 30.0082 24.4055 30.0805 24.3902C30.1154 24.3828 30.1506 24.3764 30.1859 24.3709C30.1948 24.3696 30.2036 24.3682 30.2124 24.367C30.2197 24.366 30.2356 24.365 30.2061 24.3678C30.2101 24.3674 30.214 24.3668 30.2179 24.3663C30.2366 24.364 30.2553 24.3619 30.274 24.3601C30.346 24.3531 30.4183 24.35 30.4906 24.3506C30.5639 24.3512 30.6372 24.3557 30.7101 24.3639C30.719 24.3649 30.7279 24.3659 30.7368 24.367C30.7407 24.3675 30.7446 24.368 30.7486 24.3685C30.7629 24.3703 30.7214 24.3647 30.7423 24.3677C30.76 24.3703 30.7777 24.3729 30.7954 24.3758C30.8327 24.3819 30.8699 24.389 30.9068 24.3971C30.9781 24.4126 31.0485 24.4315 31.118 24.4538C31.1533 24.4652 31.1884 24.4773 31.2231 24.4904C31.2401 24.4967 31.2569 24.5032 31.2737 24.51C31.2812 24.513 31.2886 24.516 31.2961 24.5191C31.2998 24.5206 31.3035 24.5223 31.3072 24.5237C31.2796 24.5133 31.2988 24.5202 31.3052 24.523C31.4597 24.5898 31.6065 24.6729 31.7434 24.7708C31.7549 24.7775 31.7676 24.7819 31.7808 24.7837C31.794 24.7856 31.8074 24.7847 31.8202 24.7814C31.8331 24.778 31.8452 24.7721 31.8558 24.7641C31.8664 24.756 31.8753 24.746 31.882 24.7345C31.9096 24.6822 31.8918 24.6289 31.8457 24.5959C31.5933 24.4156 31.3088 24.2854 31.0074 24.2124C30.7023 24.1383 30.3852 24.129 30.0763 24.185C29.9028 24.2179 29.7343 24.273 29.5749 24.349C29.5268 24.3716 29.5107 24.4444 29.5385 24.4876C29.5704 24.537 29.6257 24.5482 29.6771 24.5239L29.6772 24.5239Z" fill="black"/>
<path d="M29.5543 24.508C29.6724 24.6057 29.8051 24.6843 29.9476 24.7409C30.0683 24.7885 30.1941 24.8223 30.3225 24.8416C30.6391 24.8932 30.9611 24.9038 31.2804 24.8731C31.4627 24.8554 31.6434 24.8246 31.8213 24.781C31.8471 24.7736 31.8689 24.7564 31.8822 24.7331C31.8954 24.7098 31.8989 24.6822 31.8921 24.6563C31.8845 24.6307 31.8672 24.6091 31.844 24.5959C31.8208 24.5827 31.7933 24.579 31.7675 24.5856C31.6927 24.604 31.6175 24.6201 31.5418 24.6339C31.5045 24.6406 31.4671 24.6468 31.4297 24.6524C31.4203 24.6537 31.4109 24.6551 31.4015 24.6564L31.3875 24.6584C31.3758 24.66 31.3969 24.6571 31.3968 24.6571C31.3768 24.6589 31.3569 24.6622 31.3369 24.6645C31.1851 24.6818 31.0324 24.6897 30.8797 24.6879C30.8028 24.687 30.7259 24.6836 30.6491 24.6779C30.6114 24.675 30.5736 24.6716 30.536 24.6675C30.5171 24.6655 30.4983 24.6634 30.4795 24.661C30.4712 24.66 30.4631 24.659 30.4548 24.6579C30.4366 24.6556 30.4581 24.6583 30.4607 24.6587C30.4537 24.6576 30.4466 24.6568 30.4396 24.6558C30.3116 24.6395 30.1856 24.6104 30.0635 24.569C30.0464 24.563 30.0295 24.5566 30.0127 24.55C30.0051 24.547 29.9747 24.5325 30.003 24.5463C29.9957 24.5428 29.988 24.5398 29.9805 24.5365C29.9454 24.5209 29.911 24.5038 29.8772 24.4853C29.8436 24.4668 29.8109 24.4469 29.7791 24.4255C29.7629 24.4146 29.747 24.4034 29.7313 24.3917C29.7278 24.3891 29.7243 24.3864 29.7208 24.3838C29.7108 24.3763 29.7375 24.3972 29.7231 24.3855C29.7146 24.3786 29.7059 24.3717 29.6975 24.3646C29.678 24.3463 29.6525 24.3357 29.6258 24.335C29.599 24.3352 29.5733 24.3458 29.5542 24.3646C29.5198 24.402 29.5107 24.4717 29.5542 24.5079L29.5543 24.508Z" fill="black"/>
<path d="M30.4437 24.2793C30.4134 24.3622 30.3995 24.4502 30.4028 24.5383C30.4068 24.633 30.4291 24.726 30.4684 24.8121C30.4818 24.8349 30.5035 24.8516 30.529 24.8587C30.5553 24.8657 30.5834 24.862 30.607 24.8485C30.6298 24.835 30.6465 24.8134 30.6536 24.7879C30.6593 24.7615 30.6557 24.7339 30.6434 24.7099C30.637 24.6956 30.6468 24.7142 30.6459 24.7162C30.6469 24.714 30.6408 24.7033 30.6399 24.7011C30.6369 24.6931 30.634 24.6849 30.6313 24.6767C30.6256 24.6593 30.6206 24.6416 30.6165 24.6237C30.6144 24.6142 30.6125 24.6047 30.6108 24.5951C30.61 24.5908 30.6094 24.5865 30.6086 24.5823C30.606 24.5689 30.611 24.6036 30.6096 24.59C30.6075 24.5706 30.6057 24.5513 30.6052 24.5318C30.6047 24.5135 30.6051 24.4951 30.6062 24.4767C30.6068 24.4681 30.6076 24.4595 30.6084 24.4509C30.6097 24.4369 30.6081 24.4539 30.6072 24.4585C30.6082 24.4533 30.6088 24.4478 30.6097 24.4425C30.616 24.4052 30.6258 24.3686 30.639 24.3332C30.6575 24.2834 30.6185 24.22 30.5683 24.2086C30.5109 24.1955 30.4634 24.226 30.4437 24.2793Z" fill="black"/>
<path d="M34.1812 23.7035C34.1388 23.7885 34.1179 23.8825 34.1203 23.9774C34.1227 24.0723 34.1482 24.1651 34.1947 24.2479C34.221 24.2939 34.2876 24.3137 34.3333 24.2842C34.3561 24.2703 34.3727 24.2481 34.3795 24.2222C34.3862 24.1964 34.3827 24.1689 34.3697 24.1456C34.3651 24.1377 34.3608 24.1297 34.3567 24.1216C34.3545 24.1171 34.3523 24.1125 34.3502 24.108C34.3442 24.0957 34.3519 24.1116 34.3531 24.1155C34.3475 24.0982 34.3404 24.0816 34.3355 24.064C34.3306 24.0464 34.3272 24.0287 34.324 24.0108C34.3214 23.9967 34.3242 24.0161 34.3251 24.0197C34.3242 24.0147 34.3237 24.0097 34.3235 24.0046C34.3228 23.9955 34.3222 23.9865 34.3219 23.9774C34.3214 23.9602 34.3218 23.943 34.3231 23.9259C34.3235 23.9209 34.3241 23.9159 34.3245 23.9108C34.3257 23.8965 34.3231 23.916 34.3231 23.9197C34.3238 23.9106 34.3254 23.9016 34.3279 23.8928C34.3315 23.875 34.3362 23.8575 34.342 23.8402C34.3448 23.8317 34.349 23.8233 34.3513 23.8147C34.3503 23.8186 34.3424 23.8346 34.3482 23.8222C34.3508 23.8166 34.3534 23.8111 34.3561 23.8057C34.3795 23.7583 34.3704 23.6939 34.3197 23.6671C34.274 23.643 34.2061 23.6527 34.1811 23.7035L34.1812 23.7035Z" fill="black"/>
<path d="M32.5858 25.3169C32.6655 25.4112 32.7907 25.4778 32.9159 25.4748C33.0386 25.4718 33.1571 25.3996 33.2068 25.2852C33.2355 25.2191 33.2471 25.1439 33.2205 25.0747C33.2127 25.0496 33.1962 25.0281 33.1739 25.0142C33.1502 25.0006 33.1222 24.997 33.0958 25.004C33.0478 25.0195 33.0047 25.0756 33.0251 25.1286C33.0275 25.1347 33.0296 25.141 33.0313 25.1473C33.0342 25.1584 33.0317 25.1754 33.0321 25.1442C33.0319 25.1555 33.0328 25.1665 33.0322 25.1778C33.0313 25.1952 33.0379 25.1491 33.032 25.1747C33.0306 25.181 33.0288 25.1873 33.0268 25.1934C33.0185 25.2181 33.0357 25.1767 33.0278 25.1921C33.0256 25.1965 33.0235 25.2009 33.0211 25.2053C33.0179 25.2111 33.0144 25.2167 33.0107 25.2222C32.9961 25.2438 33.0229 25.209 33.0115 25.2217C33.0038 25.2305 32.9956 25.2389 32.9869 25.2469C32.9673 25.2641 33.0021 25.2373 32.9877 25.2466C32.9821 25.2503 32.9766 25.2541 32.9708 25.2574C32.965 25.2608 32.9585 25.2631 32.953 25.2666C32.9696 25.2599 32.9731 25.2584 32.9634 25.2622C32.9611 25.2631 32.9587 25.2639 32.9563 25.2647C32.9508 25.2665 32.9452 25.2681 32.9395 25.2695C32.9359 25.2703 32.9321 25.2711 32.9283 25.2718C32.9175 25.2736 32.9209 25.2732 32.9384 25.2707C32.9245 25.2701 32.9103 25.2727 32.8962 25.2719C32.8866 25.2714 32.8684 25.2654 32.8979 25.273C32.8907 25.2712 32.883 25.2705 32.8757 25.2689C32.8618 25.2657 32.8482 25.2616 32.8349 25.2565C32.812 25.2478 32.8528 25.2656 32.8354 25.2566C32.8285 25.2531 32.8216 25.2499 32.8149 25.2461C32.8022 25.2391 32.79 25.2313 32.7782 25.2228C32.7583 25.2085 32.7927 25.2357 32.7781 25.2227C32.7723 25.2176 32.7663 25.2126 32.7607 25.2073C32.7495 25.1968 32.7389 25.1856 32.729 25.1738C32.6947 25.1332 32.6206 25.1358 32.5857 25.1738C32.5461 25.217 32.5491 25.2737 32.5857 25.3171L32.5858 25.3169Z" fill="black"/>
<path d="M32.9677 25.4898C32.9649 25.4863 32.9553 25.4731 32.963 25.484C32.9654 25.4874 32.9678 25.4907 32.9702 25.4941C32.9749 25.5008 32.9794 25.5076 32.9838 25.5146C32.9932 25.5293 33.0018 25.5444 33.0097 25.56C33.0135 25.5674 33.017 25.5748 33.0205 25.5822C33.0218 25.5852 33.0276 25.5989 33.0215 25.5842C33.0155 25.5695 33.0211 25.5833 33.0223 25.5863C33.0287 25.6026 33.0344 25.6191 33.0393 25.6359C33.0438 25.6516 33.0478 25.6676 33.0511 25.6837C33.0527 25.6917 33.054 25.6998 33.0554 25.7079C33.0578 25.7219 33.0546 25.7033 33.0544 25.6993C33.0546 25.7034 33.0554 25.7075 33.0558 25.7115C33.0593 25.7463 33.0596 25.7813 33.0567 25.8161C33.0525 25.869 33.1063 25.9197 33.158 25.9174C33.2165 25.9148 33.2547 25.8728 33.2593 25.8161C33.2655 25.7351 33.2565 25.6538 33.2328 25.5761C33.2068 25.4927 33.1654 25.4149 33.1109 25.3466C33.0962 25.3276 33.062 25.3169 33.0393 25.3169C33.0125 25.3171 32.9868 25.3277 32.9677 25.3466C32.9487 25.3656 32.9381 25.3913 32.938 25.4182C32.9396 25.4447 32.9501 25.4699 32.9677 25.4898L32.9677 25.4898Z" fill="black"/>
<path d="M32.2505 26.0942C32.3314 26.2376 32.5061 26.2961 32.6631 26.2895C32.8254 26.2814 32.9809 26.2218 33.107 26.1192C33.1737 26.0656 33.2303 26.0004 33.274 25.9269C33.3013 25.8814 33.2857 25.8136 33.2377 25.7883C33.2144 25.7752 33.1869 25.7717 33.1611 25.7785C33.1352 25.7853 33.113 25.8018 33.0991 25.8246C33.0909 25.8383 33.0823 25.8517 33.0731 25.8647C33.0711 25.8676 33.0546 25.8892 33.066 25.8748C33.076 25.8621 33.0678 25.8724 33.0653 25.8755C33.0624 25.8792 33.0594 25.8828 33.0564 25.8864C33.0352 25.9114 33.0122 25.9347 32.9875 25.9562C32.9818 25.9611 32.9761 25.966 32.9703 25.9707C32.9517 25.9858 32.9878 25.9578 32.9686 25.9721C32.9551 25.9822 32.9412 25.9917 32.9269 26.0007C32.899 26.018 32.87 26.0334 32.8401 26.0468C32.8336 26.0498 32.8241 26.051 32.8488 26.0432C32.8453 26.0443 32.8418 26.0461 32.8384 26.0474C32.8314 26.0501 32.8244 26.0527 32.8173 26.0552C32.8014 26.0608 32.7854 26.0657 32.7691 26.0701C32.7546 26.0739 32.7401 26.0773 32.7253 26.0801C32.718 26.0814 32.7106 26.0826 32.7032 26.0839C32.6863 26.0868 32.713 26.0828 32.7135 26.0826C32.708 26.0839 32.7024 26.0845 32.6967 26.0845C32.6659 26.0877 32.6349 26.0882 32.604 26.086C32.5968 26.0854 32.5896 26.0842 32.5825 26.0839C32.6147 26.0851 32.5923 26.0853 32.5828 26.0835C32.5669 26.0807 32.5513 26.077 32.5358 26.0724C32.5273 26.0698 32.5189 26.067 32.5106 26.0639C32.5073 26.0627 32.504 26.0612 32.5007 26.06C32.53 26.0708 32.5124 26.0649 32.5057 26.0617C32.4916 26.0549 32.4781 26.0471 32.4652 26.0383C32.4625 26.0364 32.4484 26.0257 32.463 26.037C32.4771 26.0479 32.4644 26.0379 32.4614 26.0352C32.4549 26.0296 32.4488 26.0237 32.443 26.0174C32.4406 26.0149 32.4384 26.0123 32.4361 26.0098C32.4243 25.9966 32.4496 26.0298 32.4392 26.014C32.4345 26.0067 32.4297 25.9995 32.4254 25.9919C32.3993 25.9457 32.3323 25.9262 32.2868 25.9555C32.264 25.9695 32.2475 25.9917 32.2407 26.0175C32.2339 26.0434 32.2374 26.0708 32.2504 26.0941L32.2505 26.0942Z" fill="black"/>
<path d="M33.109 25.9533C33.3038 26.1439 33.6007 26.1717 33.8497 26.0847C33.9246 26.0584 33.9967 26.0246 34.065 25.9839C34.1105 25.9569 34.1311 25.8916 34.1013 25.8453C34.0874 25.8225 34.0652 25.8059 34.0393 25.7991C34.0135 25.7924 33.986 25.7959 33.9627 25.809C33.9371 25.8242 33.911 25.8386 33.8843 25.8519C33.8715 25.8582 33.8585 25.8643 33.8454 25.8702C33.8424 25.8716 33.8393 25.8728 33.8363 25.8742C33.8261 25.8788 33.8453 25.8701 33.8453 25.8704C33.8445 25.8735 33.8246 25.8787 33.8207 25.8802C33.7652 25.9014 33.7077 25.9168 33.6491 25.9262C33.63 25.9293 33.6693 25.9241 33.65 25.9261C33.6434 25.9268 33.6369 25.9275 33.6303 25.9281C33.6152 25.9294 33.6 25.9302 33.5849 25.9305C33.5578 25.9311 33.5308 25.9298 33.5039 25.9269C33.4805 25.9243 33.5215 25.9299 33.504 25.927C33.4981 25.926 33.4922 25.9251 33.4863 25.924C33.4725 25.9214 33.4588 25.9184 33.4452 25.9149C33.4326 25.9117 33.4202 25.908 33.4078 25.9039C33.4021 25.9021 33.3965 25.9001 33.3908 25.898C33.3872 25.8967 33.3618 25.8864 33.3779 25.8933C33.3935 25.8999 33.3721 25.8905 33.3682 25.8887C33.361 25.8853 33.3539 25.8818 33.3469 25.878C33.3337 25.8711 33.3209 25.8636 33.3084 25.8555C33.3026 25.8517 33.2968 25.8478 33.2911 25.8438C33.2882 25.8412 33.2849 25.8388 33.2815 25.8368C33.2848 25.838 33.2986 25.8506 33.2879 25.8417C33.2756 25.8316 33.2637 25.8211 33.2523 25.8099C33.2144 25.7728 33.1463 25.7693 33.109 25.8099C33.0905 25.8291 33.0801 25.8548 33.0801 25.8816C33.0801 25.9083 33.0905 25.934 33.109 25.9532V25.9533Z" fill="black"/>
<path d="M35.3744 26.0179C35.409 26.0285 35.4432 26.0402 35.4771 26.0529C35.4939 26.0592 35.5105 26.0657 35.5271 26.0725C35.5339 26.0753 35.5472 26.0816 35.5193 26.0692C35.5239 26.0713 35.5286 26.0732 35.5333 26.0752C35.5418 26.0789 35.5503 26.0827 35.5587 26.0866C35.623 26.1159 35.6853 26.1494 35.7451 26.187C35.7741 26.2052 35.8024 26.2244 35.8301 26.2446C35.8366 26.2494 35.8431 26.2542 35.8496 26.2591C35.8522 26.261 35.8547 26.263 35.8573 26.265C35.8311 26.2457 35.8464 26.2565 35.8521 26.261C35.866 26.2719 35.8797 26.2831 35.8932 26.2945C35.9441 26.3377 35.9919 26.3845 36.036 26.4346C36.0464 26.4464 36.0566 26.4584 36.0666 26.4706C36.0716 26.4766 36.0765 26.4828 36.0814 26.4889C36.0859 26.4947 36.0966 26.5098 36.0771 26.4833C36.0798 26.4871 36.0828 26.4908 36.0856 26.4945C36.1053 26.5209 36.124 26.5479 36.1416 26.5757C36.1767 26.6313 36.2074 26.6895 36.2336 26.7498C36.2411 26.767 36.2236 26.7254 36.2307 26.7429C36.2318 26.7458 36.2331 26.7487 36.2342 26.7516C36.2372 26.7589 36.24 26.7662 36.2428 26.7736C36.249 26.7898 36.2548 26.8061 36.2602 26.8226C36.2707 26.8542 36.2799 26.8862 36.2878 26.9187C36.2959 26.9523 36.3026 26.9862 36.3079 27.0204C36.3085 27.0244 36.3091 27.0284 36.3097 27.0324C36.3124 27.0509 36.3068 27.0091 36.3084 27.0224C36.3093 27.0305 36.3104 27.0386 36.3113 27.0467C36.3133 27.0647 36.3149 27.0827 36.3161 27.1007C36.3208 27.1726 36.3196 27.2447 36.3125 27.3164C36.3116 27.3251 36.3107 27.3338 36.3097 27.3424C36.3087 27.3512 36.3038 27.3827 36.3093 27.3469C36.3063 27.3663 36.3035 27.3857 36.3 27.405C36.2931 27.4428 36.2848 27.4803 36.275 27.5176C36.2541 27.5956 36.228 27.6722 36.1967 27.7467C36.189 27.7653 36.2047 27.728 36.1993 27.7406C36.1974 27.7449 36.1956 27.7492 36.1938 27.7535C36.19 27.7621 36.1863 27.7707 36.1825 27.7792C36.1741 27.7981 36.1654 27.8169 36.1566 27.8356C36.1397 27.8714 36.1219 27.9068 36.1034 27.9418C36.0272 28.0825 35.9405 28.2174 35.8441 28.3451C35.864 28.3182 35.8417 28.348 35.837 28.3541C35.831 28.3616 35.825 28.3691 35.8191 28.3765C35.8058 28.3929 35.7924 28.4092 35.7788 28.4253C35.7528 28.456 35.7262 28.4862 35.6989 28.5158C35.6438 28.5756 35.5861 28.6329 35.5258 28.6877C35.4962 28.7147 35.4659 28.741 35.435 28.7666C35.4203 28.7788 35.4056 28.7908 35.3907 28.8026C35.3832 28.8086 35.3756 28.8143 35.3682 28.8203C35.3942 28.7992 35.3631 28.8241 35.3569 28.8287C35.2933 28.8765 35.2275 28.9212 35.1595 28.9628C35.092 29.004 35.0225 29.0418 34.9511 29.0759C34.9342 29.084 34.9172 29.0919 34.9 29.0995C34.8915 29.1033 34.8829 29.1071 34.8743 29.1108C34.8681 29.1135 34.8487 29.1213 34.8778 29.1094C34.8726 29.1116 34.8675 29.1137 34.8623 29.1159C34.826 29.1308 34.7892 29.1446 34.7521 29.1575C34.7149 29.1703 34.6775 29.1821 34.6399 29.1927C34.5889 29.2072 34.5522 29.265 34.5691 29.3173C34.5767 29.343 34.5939 29.3647 34.6171 29.3779C34.6404 29.3911 34.6678 29.3948 34.6937 29.3881C35.0218 29.2949 35.3216 29.1239 35.5826 28.9063C35.8403 28.6899 36.058 28.4301 36.226 28.1386C36.3926 27.8508 36.5196 27.5301 36.5214 27.1933C36.5235 26.9019 36.4299 26.6179 36.2549 26.3848C36.1629 26.2639 36.0535 26.1572 35.9304 26.0682C35.8073 25.9804 35.673 25.9095 35.531 25.8575C35.4971 25.8447 35.4629 25.8331 35.4283 25.8225C35.4024 25.8156 35.3748 25.8192 35.3515 25.8324C35.3282 25.8457 35.311 25.8675 35.3036 25.8933C35.2971 25.9192 35.3008 25.9466 35.3139 25.9698C35.3271 25.993 35.3488 26.0103 35.3744 26.0179Z" fill="black"/>
<path d="M18.594 25.0791C18.7959 25.2062 18.9979 25.3336 19.1937 25.4701C19.2432 25.5046 19.2922 25.5397 19.3407 25.5755C19.3638 25.5925 19.3868 25.6097 19.4096 25.627C19.4153 25.6314 19.421 25.6357 19.4267 25.6401C19.4307 25.6432 19.446 25.6551 19.43 25.6426C19.4436 25.6532 19.4571 25.6638 19.4706 25.6744C19.5624 25.7472 19.6518 25.8232 19.7374 25.9033C19.8243 25.9841 19.9067 26.0695 19.9843 26.1591C20.0019 26.1796 20.0193 26.2004 20.0363 26.2214C20.0449 26.2319 20.0533 26.2425 20.0617 26.2532C20.065 26.2574 20.0684 26.2617 20.0717 26.266C20.0563 26.2462 20.078 26.2743 20.0806 26.2778C20.1133 26.3212 20.1447 26.3655 20.1747 26.4109C20.2377 26.5057 20.2939 26.6049 20.343 26.7077C20.3546 26.732 20.3657 26.7567 20.3765 26.7814C20.3841 26.7987 20.3772 26.7826 20.3758 26.7795C20.379 26.7869 20.382 26.7944 20.3851 26.8018C20.3911 26.8168 20.397 26.8318 20.4028 26.8469C20.4223 26.8982 20.4397 26.9503 20.455 27.0031C20.4702 27.0557 20.4831 27.1088 20.4937 27.1625C20.4989 27.1887 20.5034 27.2149 20.5074 27.2412C20.5081 27.2458 20.5123 27.2727 20.5082 27.246C20.509 27.2512 20.5096 27.2565 20.5102 27.2618C20.5122 27.2776 20.5139 27.2935 20.5154 27.3095C20.5257 27.4188 20.5249 27.529 20.5128 27.6382C20.5121 27.6445 20.5113 27.6507 20.5106 27.657C20.5078 27.6819 20.5131 27.6405 20.5107 27.6563C20.5089 27.6687 20.5071 27.6812 20.505 27.6937C20.5007 27.7197 20.4958 27.7456 20.4903 27.7714C20.4793 27.8228 20.4658 27.8737 20.4499 27.924C20.4341 27.9743 20.4157 28.0236 20.3958 28.0724C20.3939 28.0771 20.3895 28.0904 20.3972 28.069C20.3947 28.0761 20.3912 28.0829 20.3882 28.0898C20.3831 28.1013 20.3779 28.1127 20.3726 28.1241C20.3614 28.1481 20.3498 28.1718 20.3376 28.1953C20.2892 28.2888 20.2339 28.3785 20.1724 28.4638C20.1575 28.4845 20.1424 28.5052 20.1267 28.5252C20.1408 28.5071 20.1296 28.5213 20.1261 28.5258C20.1221 28.5309 20.1181 28.5359 20.1141 28.5408C20.1046 28.5528 20.0948 28.5647 20.085 28.5765C20.0514 28.6168 20.0166 28.6561 19.9805 28.6943C19.9075 28.7715 19.83 28.8443 19.7483 28.9123C19.7287 28.9287 19.7089 28.9447 19.6889 28.9606C19.6839 28.9645 19.6789 28.9684 19.6738 28.9723C19.6614 28.9821 19.6931 28.9577 19.6732 28.9728C19.6604 28.9823 19.6478 28.992 19.6349 29.0014C19.5874 29.0365 19.5389 29.0702 19.4895 29.1027C19.2887 29.2327 19.078 29.3467 18.8594 29.4436C18.8053 29.4681 18.751 29.4918 18.6964 29.5148C18.718 29.5057 18.6913 29.5169 18.6885 29.5181L18.6725 29.5248C18.6591 29.5303 18.6457 29.5358 18.6323 29.5413C18.6028 29.5534 18.5733 29.5653 18.5436 29.5771C18.4319 29.6216 18.3195 29.6643 18.2068 29.7063C18.1512 29.727 18.0956 29.7476 18.04 29.7681C17.9904 29.7864 17.9514 29.8376 17.9692 29.8927C17.985 29.9413 18.0406 29.9831 18.0939 29.9635C18.5592 29.7916 19.0294 29.6182 19.4565 29.3625C19.8497 29.1271 20.2024 28.8174 20.442 28.4232C20.5572 28.2366 20.6401 28.032 20.6871 27.8179C20.735 27.5867 20.7362 27.3482 20.6906 27.1165C20.6014 26.6517 20.3397 26.2303 20.0151 25.8925C19.6746 25.5382 19.2622 25.2626 18.8492 25.0007C18.7983 24.9684 18.7473 24.9362 18.6962 24.9041C18.6729 24.8908 18.6454 24.8872 18.6195 24.894C18.5935 24.9008 18.5713 24.9175 18.5576 24.9405C18.5446 24.9638 18.5411 24.9913 18.5479 25.0171C18.5547 25.0429 18.5712 25.0651 18.5939 25.0791H18.594Z" fill="black"/>
<path d="M11.2592 26.5303C10.9423 26.7252 10.6303 26.9284 10.3201 27.1335C9.65301 27.5748 8.99577 28.0322 8.36034 28.518C7.74869 28.9857 7.12476 29.4757 6.62685 30.0675C6.31277 30.4408 6.01451 30.841 5.76439 31.2601C5.50971 31.6869 5.31364 32.1533 5.26221 32.6511C5.16932 33.5504 5.6158 34.4716 6.27698 35.0676C6.79924 35.5383 7.46316 35.8155 8.14083 35.9765C9.08917 36.2018 10.0803 36.2303 11.0504 36.1967C11.6825 36.1748 12.3118 36.1065 12.9448 36.1047C13.5719 36.1042 14.1984 36.1444 14.8203 36.225C15.8754 36.3596 16.917 36.6021 17.931 36.9217C18.7226 37.1711 19.4888 37.4892 20.2983 37.6812C20.7132 37.7796 21.1397 37.8571 21.567 37.8655C21.8859 37.8718 22.2469 37.8441 22.5206 37.6627C22.8022 37.4759 22.8903 37.1646 22.8733 36.8398C22.8524 36.4425 22.6712 36.0823 22.4101 35.788C22.1071 35.4464 21.709 35.1926 21.2999 34.9969C20.8176 34.7662 20.3027 34.6059 19.7797 34.4976C18.9216 34.3201 18.0525 34.1647 17.1812 34.0692C16.2535 33.9675 15.3203 33.9581 14.3886 33.9989C13.1852 34.0515 11.9887 34.1923 10.7823 34.1685C9.96131 34.1522 9.09237 34.0973 8.32103 33.7898C8.0742 33.6914 7.83372 33.5568 7.65016 33.3636C7.46989 33.1739 7.38457 32.9328 7.39356 32.6632C7.40583 32.2944 7.55521 31.934 7.72223 31.6106C7.9669 31.1368 8.2806 30.6991 8.61524 30.2854C9.35329 29.3726 10.203 28.5436 11.0703 27.7543C11.221 27.6171 11.3725 27.4805 11.5275 27.3481C11.6268 27.2633 11.4829 27.1206 11.3842 27.2048C10.8247 27.6828 10.2909 28.1939 9.77265 28.7159C9.31931 29.1725 8.87667 29.6415 8.47185 30.1421C8.138 30.5549 7.82255 30.9886 7.57327 31.4585C7.28073 32.0099 6.97162 32.8017 7.39347 33.3708C7.75335 33.8563 8.38533 34.0657 8.95235 34.1871C9.89737 34.3894 10.884 34.3956 11.8455 34.36C13.017 34.3166 14.1815 34.1809 15.3551 34.178C16.2053 34.1758 17.0545 34.2385 17.8952 34.3656C18.3188 34.4297 18.7404 34.5061 19.1615 34.585C19.6756 34.6815 20.1859 34.7816 20.6799 34.9578C21.1324 35.1192 21.5809 35.3336 21.9563 35.6371C22.2563 35.8797 22.5213 36.1884 22.6255 36.567C22.7021 36.8456 22.7184 37.2177 22.4902 37.431C22.2741 37.6329 21.9315 37.6618 21.6511 37.6635C21.2391 37.6661 20.8282 37.5949 20.4277 37.5034C20.0053 37.4052 19.5886 37.2838 19.1796 37.1396C18.8122 37.0116 18.4485 36.8746 18.0778 36.7558C17.6218 36.6097 17.1608 36.4803 16.6949 36.3678C15.5556 36.0937 14.3865 35.9243 13.214 35.9041C12.5822 35.8932 11.9568 35.952 11.3267 35.9826C10.7824 36.009 10.2364 36.0149 9.69218 35.9847C8.87956 35.9395 8.04064 35.8205 7.29298 35.4822C6.69445 35.2114 6.19345 34.796 5.85457 34.2301C5.57027 33.7555 5.40897 33.219 5.46356 32.6632C5.51133 32.1769 5.71944 31.7211 5.97173 31.3087C6.21956 30.9048 6.50001 30.5219 6.81026 30.1637C7.04431 29.8935 7.30706 29.6483 7.57601 29.4134C8.20404 28.865 8.87814 28.3695 9.56153 27.8928C10.0745 27.535 10.5953 27.1887 11.1239 26.854C11.2028 26.804 11.2818 26.7542 11.3613 26.7052C11.4722 26.637 11.3706 26.4617 11.2591 26.5303L11.2592 26.5303Z" fill="black"/>
<path d="M30.8158 26.3453C30.5427 26.4408 30.2672 26.529 29.9892 26.61C29.9107 26.6328 29.832 26.6551 29.7531 26.6768C29.7021 26.6908 29.6655 26.7493 29.6824 26.8014C29.6899 26.827 29.7071 26.8487 29.7304 26.8619C29.7536 26.8751 29.7811 26.8788 29.807 26.8721C30.086 26.7954 30.3628 26.7114 30.6374 26.62C30.715 26.5941 30.7924 26.5677 30.8696 26.5407C30.9195 26.5232 30.958 26.4706 30.9403 26.416C30.9244 26.3667 30.8693 26.3265 30.8157 26.3453H30.8158Z" fill="black"/>
<path d="M30.8889 26.7499C30.8736 26.7618 30.8584 26.7737 30.8431 26.7855C30.8344 26.7922 30.8355 26.7914 30.8464 26.7829L30.8349 26.7918L30.812 26.8095C30.7832 26.8315 30.7544 26.8534 30.7255 26.8753C30.6648 26.9211 30.6037 26.9665 30.5423 27.0114C30.4204 27.1005 30.2972 27.1876 30.1726 27.2728C30.1289 27.3027 30.1051 27.3632 30.1362 27.4114C30.1642 27.4549 30.2281 27.4798 30.2748 27.4478C30.5331 27.271 30.7856 27.0862 31.0321 26.8932C31.0511 26.8783 31.0618 26.8443 31.0618 26.8215C31.0616 26.7947 31.0509 26.769 31.0321 26.7499C31.0131 26.7309 30.9873 26.7203 30.9605 26.7202C30.9339 26.7218 30.9087 26.7323 30.8888 26.7499L30.8889 26.7499Z" fill="black"/>
<path d="M31.3549 26.9508C31.2266 27.1262 31.1112 27.3108 31.0097 27.5029C30.9849 27.5498 30.9963 27.6152 31.0461 27.6415C31.0929 27.6663 31.1582 27.6552 31.1847 27.6052C31.2862 27.413 31.4015 27.2285 31.5298 27.0531C31.5366 27.0414 31.541 27.0285 31.5428 27.0151C31.5445 27.0017 31.5436 26.9881 31.54 26.975C31.5329 26.9491 31.5157 26.9271 31.4924 26.9138C31.469 26.9006 31.4413 26.8971 31.4154 26.9043C31.3906 26.9126 31.3693 26.929 31.3549 26.9508Z" fill="black"/>
<path d="M34.609 26.1153L35.0354 26.4564C35.0549 26.4747 35.0804 26.4852 35.1071 26.4861C35.1339 26.4859 35.1596 26.4752 35.1787 26.4564C35.2124 26.4197 35.2229 26.3485 35.1787 26.3131L34.7522 25.9721C34.7327 25.9538 34.7073 25.9432 34.6806 25.9424C34.6537 25.9426 34.628 25.9532 34.6089 25.9721C34.5752 26.0088 34.5648 26.08 34.609 26.1153Z" fill="black"/>
<path d="M34.8058 25.7493C35.0034 25.7934 35.2045 25.8194 35.4068 25.8268C35.4336 25.8266 35.4593 25.8159 35.4782 25.7969C35.4972 25.778 35.5079 25.7523 35.5081 25.7255C35.5076 25.6988 35.4968 25.6734 35.4779 25.6545C35.459 25.6356 35.4335 25.6247 35.4068 25.6242C35.3115 25.6207 35.2164 25.613 35.1217 25.601C35.1158 25.6003 35.0971 25.5972 35.1235 25.6013C35.1187 25.6006 35.1138 25.6 35.1091 25.5994C35.0972 25.5977 35.0852 25.5959 35.0733 25.5941C35.0494 25.5904 35.0256 25.5865 35.0018 25.5824C34.9542 25.574 34.9069 25.5645 34.8597 25.5539C34.8081 25.5424 34.7477 25.5695 34.7351 25.6246C34.7234 25.676 34.7505 25.7369 34.8059 25.7493H34.8058Z" fill="black"/>
<path d="M34.8356 25.4665L35.5705 25.36C35.5938 25.3567 35.6197 25.3328 35.631 25.3135C35.6446 25.2898 35.6483 25.2618 35.6412 25.2354C35.6341 25.21 35.6174 25.1883 35.5947 25.1749C35.5706 25.1627 35.543 25.1591 35.5166 25.1647L34.7818 25.2711C34.7584 25.2745 34.7325 25.2984 34.7212 25.3177C34.7077 25.3414 34.704 25.3694 34.711 25.3957C34.7181 25.4212 34.7348 25.4429 34.7576 25.4564C34.7816 25.4686 34.8092 25.4722 34.8356 25.4666V25.4665Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 84 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,6 @@
<svg width="81" height="80" viewBox="0 0 81 80" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" width="80" height="80" rx="40" fill="#E6F4FF"/>
<path d="M46.3332 29.1666C46.3332 25.9449 43.7215 23.3333 40.4998 23.3333C37.2782 23.3333 34.6665 25.9449 34.6665 29.1666V39.9999C34.6665 43.2216 37.2782 45.8333 40.4998 45.8333C43.7215 45.8333 46.3332 43.2216 46.3332 39.9999V29.1666Z" fill="#4096FF" stroke="#4096FF" stroke-width="2.5" stroke-linejoin="round"/>
<path d="M28 39.1667C28 46.0703 33.5964 51.6667 40.5 51.6667C47.4036 51.6667 53 46.0703 53 39.1667" stroke="#4096FF" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M40.5 51.6667V56.6667" stroke="#4096FF" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 780 B

View File

@@ -0,0 +1,4 @@
<svg width="88" height="88" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="4" y="4" width="80" height="80" rx="40" fill="black" fill-opacity="0.06"/>
<path d="M56.5 41.917C57.1904 41.917 57.75 42.4766 57.75 43.167C57.7498 50.3394 52.258 56.2278 45.25 56.8594V60.667C45.2498 61.3572 44.6903 61.917 44 61.917C43.3097 61.917 42.7502 61.3572 42.75 60.667V56.8594C35.742 56.2278 30.2502 50.3394 30.25 43.167C30.25 42.4766 30.8096 41.917 31.5 41.917C32.1904 41.917 32.75 42.4766 32.75 43.167C32.7502 49.3801 37.7869 54.417 44 54.417C50.2131 54.417 55.2498 49.3801 55.25 43.167C55.25 42.4766 55.8096 41.917 56.5 41.917ZM44 26.083C47.9116 26.0833 51.0836 29.2545 51.084 33.166V44C51.0838 47.9117 47.9117 51.0827 44 51.083C40.0882 51.0828 36.9172 47.9118 36.917 44V33.166C36.9173 29.2544 40.0883 26.0832 44 26.083Z" fill="black" fill-opacity="0.15"/>
</svg>

After

Width:  |  Height:  |  Size: 879 B

View File

@@ -0,0 +1,49 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="48" height="48" rx="24" fill="black" fill-opacity="0.06"/>
<path d="M36.3301 38.1045C35.8214 38.6859 33.3503 40.3575 30.2961 41.157C27.2436 41.9565 23.6807 41.3751 23.0992 40.939C22.5178 40.5029 22.1544 40.0668 22.1544 40.0668H21.8637C19.9013 40.2849 18.4478 41.2297 14.2307 39.7761C10.0153 38.3224 9.65196 35.6318 10.6695 34.2508C11.687 32.8699 12.6318 32.3611 12.6318 32.3611C12.6318 32.3611 9.57925 28.2895 11.905 23.1293C11.894 23.1119 11.8845 23.0961 11.8734 23.0787C9.58401 19.4416 10.1876 13.7394 16.0493 10.8432C16.4854 10.6979 15.4664 7.86339 16.9215 7.49997C18.3751 7.13656 19.9741 9.09892 19.9741 9.09892C19.9741 9.09892 26.4441 10.5525 27.0983 10.4799C27.7524 10.4072 30.5142 9.535 31.6771 9.89842C32.2206 10.0675 32.2569 10.4277 32.17 10.8291C32.0721 11.2888 31.813 11.8039 31.9678 12.1531C32.2585 12.8072 32.8416 13.9701 33.2049 14.6969C33.5683 15.4236 36.7663 28.9452 35.676 33.8875C34.9492 36.2859 34.9492 36.2859 34.9492 36.2859L36.6208 36.2132C36.6208 36.2132 36.8389 37.523 36.3301 38.1045Z" fill="#C99965"/>
<path d="M22.1551 30.4711C22.5185 29.1627 22.7366 27.9269 22.5185 27.7088C22.3004 27.4907 21.937 28.0722 21.4281 28.2176C20.9193 28.363 18.8839 28.2176 17.6481 27.7814C16.4123 27.3453 16.0488 26.7637 15.9761 27.5634C15.9034 28.363 15.758 31.8523 16.1215 32.87C16.485 33.8877 19.1746 34.3239 19.1746 34.3239C19.1746 34.3239 21.2827 33.9604 21.8643 33.2335C22.4458 32.5066 22.1551 30.4711 22.1551 30.4711Z" fill="#A4CCD8"/>
<path d="M19.4653 26.037C18.4476 25.8189 17.0022 25.9814 16.703 26.1824C15.8496 26.7557 15.9033 27.3455 17.2845 27.7817C18.6657 28.2178 21.1372 28.3632 21.6461 27.8544C22.155 27.3455 21.8642 26.6913 21.5008 26.5459C21.1372 26.4005 19.4653 26.037 19.4653 26.037Z" fill="#8EB2BA"/>
<path d="M21.0647 20.2941C19.5382 20.803 17.5754 20.7303 16.4851 20.076C15.3947 19.4218 15.3947 17.6771 17.7935 16.6595C20.1924 15.6417 21.9371 15.8598 23.8271 16.4414C25.7171 17.0229 27.3891 18.186 27.3164 19.3491C27.2437 20.5122 27.171 21.2391 25.8625 21.5299C24.554 21.8207 24.4086 22.0388 23.4636 21.6026C22.5186 21.1665 21.0647 20.2941 21.0647 20.2941Z" fill="#FFD9B6"/>
<path d="M13.1408 19.7124C12.505 19.0766 12.9227 16.8046 13.4316 16.5865C13.9404 16.3685 13.9404 17.895 14.3766 18.622C14.8128 19.3489 13.577 20.1485 13.1408 19.7124Z" fill="white"/>
<path d="M28.8429 22.4747C27.9916 21.8894 27.6071 19.4943 28.8429 18.8401C29.4245 19.7124 30.2968 21.1663 30.8784 21.3117C31.4599 21.4571 30.006 23.2744 28.8429 22.4747Z" fill="white"/>
<path d="M22.8094 30.8346C22.9548 31.6342 22.7367 32.652 22.446 32.9427C22.1552 33.2335 21.2101 33.3789 20.5559 33.0154C19.9017 32.652 20.2652 31.9977 20.2652 31.9977C20.2652 31.9977 20.6286 31.3434 20.3379 30.9073C20.0471 30.4711 20.0471 30.1077 20.7741 29.9623C21.501 29.8169 22.5187 30.1804 22.5187 30.1804L22.8094 30.8346Z" fill="#996F2B"/>
<path d="M19.1747 34.3237C19.1747 34.8325 19.6109 35.1233 19.2474 35.4141C18.884 35.7048 16.8485 35.7775 16.6305 35.2687C16.4124 34.7598 16.9939 33.9602 16.9939 33.9602L19.1747 34.3237Z" fill="#996F2B"/>
<path d="M34.6582 35.9957C35.3851 36.2865 35.9667 38.1038 36.3301 38.1038C36.6936 38.1038 37.9294 37.0135 38.2202 36.4319C38.511 35.8504 37.5659 35.6323 37.5659 35.6323C37.5659 35.6323 36.839 34.978 36.6936 34.6146C36.5482 34.2511 36.1848 34.4692 35.9667 34.4692C35.7486 34.4692 34.6582 35.9957 34.6582 35.9957Z" fill="#996F2B"/>
<path d="M19.0565 26.6924C17.003 26.6031 16.3705 27.0084 17.2395 27.4034C18.1085 27.7984 20.1006 28.0585 20.8735 27.9564C21.6465 27.8544 20.8735 26.7714 19.0565 26.6924Z" fill="#FFEE17"/>
<path d="M32.1703 10.8291C28.8318 11.5164 28.5869 11.9762 27.3782 11.4721C26.1142 10.9444 20.4262 10.5241 20.4262 10.5241L18.5303 9.47027C18.5303 9.47027 17.6876 10.5241 17.5818 11.0503C12.5223 12.3688 10.2084 20.1089 11.8943 22.1102C12.6325 22.9866 12.3825 23.1403 11.8737 23.0787C9.58429 19.4416 10.1879 13.7394 16.0496 10.8432C16.4857 10.6979 15.4666 7.86339 16.9218 7.49997C18.3754 7.13656 19.9744 9.09892 19.9744 9.09892C19.9744 9.09892 26.4444 10.5525 27.0985 10.4799C27.7527 10.4072 30.5145 9.535 31.6773 9.89842C32.2209 10.0675 32.2572 10.4277 32.1703 10.8291Z" fill="#FFD9B6"/>
<path d="M22.8094 30.8345C24.2176 30.5367 28.019 28.0655 28.431 25.2701C28.431 24.5327 26.5349 28.1141 25.5869 28.5354C24.6389 28.9567 23.2696 29.2727 22.8483 29.378C22.427 29.4834 22.8094 30.8345 22.8094 30.8345Z" fill="#FFD9B6"/>
<path d="M19.2358 9.10466C19.0682 8.8101 18.8944 8.60783 18.7348 8.4489C18.5748 8.28888 18.4209 8.17855 18.266 8.07828C18.1103 7.97878 17.9458 7.89482 17.7477 7.83095C17.5526 7.76754 17.3111 7.72556 17.067 7.78898C16.9478 7.81953 16.8585 7.87429 16.7866 7.94097C16.7107 8.00239 16.6592 8.08508 16.61 8.16318C16.5185 8.32859 16.4755 8.5111 16.4438 8.69659C16.3944 9.07524 16.3868 9.49183 16.5251 10.1797C16.5374 10.2493 16.4411 10.4321 16.2807 10.459C16.1284 10.5185 15.958 10.3948 15.9354 10.3196C15.7362 9.58811 15.6928 9.10624 15.7297 8.60987C15.7579 8.36132 15.8013 8.10253 15.9495 7.81169C16.0294 7.66958 16.126 7.51527 16.2806 7.37982C16.4282 7.24125 16.6292 7.1203 16.8636 7.05856C17.1026 6.99501 17.3186 6.98957 17.503 7.01042C17.5959 7.0194 17.6806 7.03835 17.7621 7.05426C17.8404 7.07679 17.9172 7.09528 17.9865 7.12062C18.2662 7.2194 18.4773 7.34188 18.6707 7.48154C18.8628 7.62257 19.044 7.77719 19.2261 7.98857C19.4077 8.19936 19.5991 8.4615 19.7755 8.82918C19.8108 8.90588 19.7754 9.16603 19.6176 9.20796C19.472 9.28135 19.2697 9.15973 19.2358 9.10466Z" fill="#593614"/>
<path d="M11.3981 22.9205C10.8933 22.2774 10.6133 21.6843 10.4298 21.161C10.2454 20.6355 10.162 20.1708 10.1206 19.7072C10.0933 19.475 10.0959 19.2423 10.0913 18.9985C10.1019 18.7557 10.111 18.5013 10.1481 18.2283C10.2165 17.6826 10.3479 17.0556 10.6216 16.2965C10.8932 15.5551 11.1904 14.9957 11.4703 14.5206C11.7557 14.0479 12.0319 13.662 12.3251 13.2904C12.6214 12.9212 12.9405 12.5698 13.3394 12.189C13.7406 11.8115 14.2244 11.4026 14.8976 10.988C15.0382 10.9042 15.4016 10.8572 15.4447 11.0179C15.5499 11.1458 15.3403 11.4197 15.2192 11.5016C14.6112 11.9045 14.172 12.3027 13.8095 12.6693C13.4488 13.0391 13.1608 13.3785 12.8927 13.7324C12.6274 14.0887 12.3763 14.4555 12.1147 14.9005C11.8586 15.3476 11.5844 15.8713 11.3338 16.557C11.0813 17.2584 10.9592 17.8299 10.8914 18.3237C10.8544 18.5709 10.8433 18.7992 10.8286 19.0177C10.8291 19.2357 10.8204 19.4449 10.8395 19.6519C10.8642 20.0666 10.923 20.4809 11.0697 20.9519C11.2157 21.4216 11.4431 21.9558 11.8781 22.5506C11.96 22.6683 12.134 23.07 11.9937 23.159C11.9029 23.2981 11.5009 23.0512 11.3981 22.9205Z" fill="#593614"/>
<path d="M31.7603 10.9788C31.7811 10.8985 31.7945 10.8214 31.8073 10.7484C31.8077 10.6802 31.8223 10.6071 31.8087 10.5535C31.8083 10.4916 31.786 10.4501 31.7752 10.4051C31.7502 10.3704 31.7359 10.3326 31.7022 10.3071L31.6824 10.2845L31.6539 10.2664C31.6339 10.255 31.6199 10.2399 31.5975 10.2296C31.5498 10.2109 31.5108 10.1857 31.455 10.1739C31.4292 10.1662 31.4038 10.1586 31.3786 10.151C31.3506 10.1461 31.3229 10.1413 31.2955 10.1365C31.2423 10.1245 31.1847 10.1198 31.1284 10.1152C30.6729 10.0817 30.2488 10.1407 29.8346 10.2028C29.4172 10.2678 28.9974 10.3527 28.4913 10.4545C28.2375 10.5051 27.9629 10.5611 27.6484 10.6146C27.4915 10.6418 27.323 10.6668 27.1374 10.6857C27.0414 10.693 26.947 10.7029 26.8335 10.7004C26.7756 10.7015 26.7261 10.6981 26.6783 10.6938C26.629 10.6901 26.5792 10.6862 26.5288 10.6823C26.133 10.6519 25.7883 10.5893 25.4765 10.5273C25.1652 10.4634 24.8869 10.3969 24.6294 10.3327C24.121 10.2025 23.6842 10.0905 23.2472 9.97845C22.8137 9.86997 22.3816 9.76861 21.8755 9.68081C21.3697 9.59377 20.7895 9.51263 20.0629 9.50261C19.9165 9.50139 19.5958 9.37161 19.6203 9.20883C19.5759 9.04772 19.9016 8.90411 20.0603 8.89654C20.8306 8.8814 21.4463 8.94482 21.9792 9.01676C22.5127 9.08988 22.9649 9.17954 23.4112 9.278C23.8579 9.37505 24.2992 9.48552 24.8061 9.60588C25.0596 9.66576 25.3295 9.72764 25.6245 9.78657C25.7721 9.8168 25.9251 9.84042 26.0863 9.8688C26.2462 9.88734 26.4152 9.91784 26.5897 9.92664C26.6344 9.93004 26.6786 9.93344 26.7222 9.93684C26.7671 9.94101 26.809 9.94377 26.8418 9.94223C26.9095 9.94468 26.9909 9.93666 27.066 9.93144C27.2221 9.91553 27.376 9.89377 27.5246 9.86866C27.8216 9.81961 28.0945 9.76635 28.3483 9.71898C28.8567 9.62301 29.2909 9.54477 29.7342 9.48892C30.1788 9.43756 30.6263 9.38385 31.2019 9.44586C31.2741 9.45479 31.3477 9.4639 31.4259 9.48335C31.4645 9.49201 31.5035 9.50062 31.5429 9.5096C31.5833 9.52288 31.6242 9.53643 31.6655 9.55003C31.7472 9.57301 31.8338 9.62052 31.9196 9.66454C31.9626 9.68797 32.0052 9.72333 32.0478 9.75402C32.0689 9.77038 32.0904 9.78598 32.1111 9.80356L32.1691 9.86635C32.2514 9.9469 32.3078 10.0532 32.3602 10.1617C32.396 10.2728 32.4306 10.3899 32.4314 10.5017C32.4464 10.6193 32.4258 10.7219 32.4169 10.8342C32.3966 10.9386 32.3731 11.0447 32.3423 11.1479C32.3116 11.2262 32.2347 11.3738 32.129 11.4658C32.0274 11.5627 31.9203 11.622 31.8541 11.5709C31.7743 11.5514 31.745 11.4306 31.7397 11.3044C31.7404 11.1774 31.7376 11.0433 31.7603 10.9788Z" fill="#593614"/>
<path d="M20.923 20.578C20.3119 20.8624 19.8039 20.9893 19.3616 21.0762C18.9185 21.1616 18.5361 21.1909 18.1502 21.1895C17.7644 21.179 17.3698 21.1436 16.9105 20.9843C16.6826 20.9014 16.4371 20.7844 16.1964 20.5922C15.9552 20.4035 15.7302 20.121 15.5918 19.7658C15.5222 19.5917 15.4863 19.4217 15.4588 19.2683C15.4453 19.1898 15.4392 19.1108 15.43 19.0349C15.4237 18.9582 15.4239 18.8818 15.4214 18.8079C15.423 18.5101 15.4795 18.2347 15.5718 17.9951C15.7606 17.5135 16.061 17.1816 16.3797 16.9179C16.7049 16.6579 17.0616 16.4558 17.4917 16.2827C17.9225 16.1116 18.4262 15.9614 19.0705 15.8716C19.2038 15.8525 19.4954 15.9448 19.477 16.0915C19.5158 16.2314 19.27 16.3777 19.1521 16.4024C18.5616 16.5061 18.1025 16.6633 17.7241 16.8309C17.3456 16.9998 17.0464 17.1879 16.7885 17.407C16.5357 17.6294 16.3209 17.8866 16.1923 18.2283C16.1293 18.3993 16.0908 18.5922 16.0907 18.8112C16.0938 18.8662 16.0931 18.9222 16.0981 18.9801C16.1062 19.0381 16.1101 19.0975 16.1208 19.1584C16.1441 19.2834 16.1704 19.4053 16.2176 19.5214C16.4058 20.004 16.7902 20.2265 17.1376 20.3604C17.4938 20.4899 17.8315 20.5319 18.1684 20.5508C18.5075 20.5624 18.8534 20.5505 19.2612 20.4882C19.6667 20.4255 20.1446 20.3246 20.7009 20.0892C20.7571 20.067 20.8717 20.0453 20.9803 20.0432C21.0867 20.0392 21.1907 20.0557 21.2157 20.1242C21.2656 20.1782 21.2277 20.2767 21.1573 20.372C21.0863 20.4645 20.9838 20.5496 20.923 20.578Z" fill="#593614"/>
<path d="M21.8584 15.8768C22.2728 15.8866 22.6342 15.9388 22.9595 15.999C23.2844 16.061 23.5734 16.1329 23.8367 16.2142C24.3638 16.375 24.7946 16.5544 25.2103 16.7695C25.6218 16.9918 26.028 17.2399 26.4467 17.6351C26.6543 17.8334 26.8666 18.0682 27.0545 18.3717C27.2408 18.6737 27.4015 19.0514 27.4572 19.5009C27.5079 19.9425 27.449 20.3353 27.3239 20.6886C27.1964 21.0415 26.9787 21.3365 26.7288 21.5422C26.4784 21.7499 26.2062 21.875 25.9453 21.9557C25.6829 22.0359 25.4275 22.0739 25.1752 22.0905C24.6709 22.1163 24.1755 22.0638 23.6246 21.9251C23.3492 21.8551 23.0596 21.763 22.7512 21.6355C22.4437 21.5064 22.1143 21.3481 21.7754 21.1124C21.7058 21.0657 21.6176 20.9599 21.5666 20.8574C21.5171 20.7509 21.5045 20.6528 21.567 20.612C21.6024 20.5478 21.7028 20.5465 21.8025 20.5681C21.9059 20.5874 22.0129 20.6297 22.0759 20.6673C22.3752 20.8634 22.6792 20.9994 22.9612 21.1076C23.2446 21.2146 23.511 21.2901 23.7619 21.3458C24.264 21.4564 24.7064 21.4867 25.13 21.4548C25.5476 21.4147 25.9689 21.3143 26.3036 21.0338C26.4686 20.8932 26.606 20.706 26.695 20.4598C26.7814 20.2155 26.8298 19.9028 26.7901 19.5792C26.701 18.9102 26.3312 18.4523 25.9878 18.1148C25.6356 17.7743 25.2754 17.5425 24.9071 17.3318C24.5339 17.1267 24.1409 16.9476 23.6554 16.7823C23.1708 16.6225 22.5859 16.4605 21.8395 16.4134C21.7651 16.4085 21.6261 16.3758 21.505 16.3323C21.3852 16.2908 21.2796 16.234 21.2889 16.1608C21.263 16.0913 21.3584 16.0158 21.4881 15.9593C21.6168 15.9049 21.7757 15.8754 21.8584 15.8768Z" fill="#593614"/>
<path d="M30.9146 21.6562C30.6382 21.5474 30.4114 21.3914 30.2461 21.2247C30.1567 21.1455 30.0905 21.0584 30.0193 20.9797C29.9585 20.8967 29.8934 20.8188 29.8441 20.7403C29.6365 20.428 29.5032 20.1555 29.3734 19.8896C29.2445 19.6241 29.1276 19.3588 28.9744 19.0676C28.9399 19.0049 28.9038 18.9396 28.8661 18.8713L28.8629 18.8685L28.8625 18.8694C28.8504 18.8837 28.838 18.8986 28.8253 18.9138C28.796 18.9555 28.7613 18.9973 28.7315 19.0444C28.4901 19.4113 28.3768 19.7709 28.3037 20.0823C28.236 20.3974 28.2117 20.6759 28.2195 20.9502C28.2289 21.2233 28.2664 21.4978 28.3761 21.7833C28.4879 22.0633 28.6736 22.3682 29.0466 22.5589C29.0857 22.5757 29.1319 22.6353 29.1728 22.696C29.2114 22.7591 29.2393 22.8376 29.2104 22.9037C29.2036 22.9766 29.1391 23.0259 29.0555 23.0504C28.9718 23.0785 28.8749 23.066 28.8188 23.0451C28.5494 22.9271 28.3378 22.7512 28.1786 22.5699C28.0189 22.387 27.9093 22.1966 27.8273 22.0144C27.6663 21.6472 27.6072 21.3122 27.583 20.9822C27.5613 20.651 27.581 20.3201 27.6554 19.9441C27.7377 19.571 27.8634 19.1442 28.1739 18.6696C28.2131 18.6088 28.2573 18.5535 28.299 18.4966C28.3307 18.46 28.3622 18.4239 28.3931 18.3885C28.4244 18.3526 28.4513 18.3187 28.4971 18.2792C28.6591 18.1209 28.8484 18.0617 29.0283 18.1169C29.197 18.1653 29.3212 18.3256 29.4121 18.483C29.4297 18.5137 29.4471 18.544 29.4644 18.574L29.4984 18.6381C29.5208 18.6805 29.5427 18.7219 29.5642 18.7624C29.7284 19.0877 29.8384 19.36 29.9541 19.6233C30.0693 19.8855 30.1824 20.1437 30.3458 20.4174C30.3849 20.4881 30.4342 20.5506 30.4807 20.6229C30.5338 20.6859 30.5836 20.7609 30.6479 20.822C30.7683 20.957 30.9237 21.0712 31.1191 21.1596C31.1576 21.1782 31.2212 21.2392 31.2817 21.2997C31.3393 21.3643 31.3892 21.4453 31.3659 21.5134C31.365 21.587 31.2873 21.6359 31.187 21.6609C31.0864 21.6909 30.9702 21.6781 30.9146 21.6562Z" fill="#593614"/>
<path d="M14.2632 18.6659C14.098 18.2905 14.025 18.0098 13.9457 17.7659C13.8707 17.5235 13.8095 17.3219 13.744 17.1267C13.7112 17.0293 13.6774 16.9333 13.6398 16.838C13.6207 16.7909 13.601 16.7429 13.5794 16.6979C13.5568 16.6513 13.5632 16.6669 13.5611 16.6639L13.5584 16.6659L13.5585 16.6666L13.5586 16.6667C13.5578 16.6684 13.5618 16.6603 13.5517 16.6809C13.5238 16.7352 13.4903 16.8137 13.4607 16.8929C13.2231 17.551 13.1612 17.9603 13.1433 18.3676C13.137 18.5707 13.145 18.7742 13.189 19.0019C13.2365 19.2267 13.3107 19.4858 13.4977 19.7469C13.5292 19.8008 13.5504 19.974 13.451 20.0532C13.3771 20.155 13.1778 20.1001 13.1255 20.0299C12.8672 19.7056 12.7572 19.3883 12.6836 19.1173C12.6142 18.8426 12.5918 18.6013 12.5884 18.3627C12.5868 17.8881 12.6532 17.4045 12.9138 16.6854C12.9502 16.5894 12.9853 16.5045 13.0341 16.4092C13.0418 16.3916 13.0678 16.3487 13.0874 16.3151C13.1067 16.2787 13.1307 16.2478 13.1535 16.2163C13.1992 16.1537 13.2513 16.1035 13.305 16.0637C13.4122 15.9904 13.5409 15.9603 13.6582 15.9908C13.7717 16.0195 13.8651 16.0886 13.9396 16.1833C14.0133 16.274 14.0758 16.4003 14.1018 16.4603C14.1293 16.5222 14.1512 16.5803 14.1721 16.6373C14.2125 16.7504 14.245 16.8567 14.2752 16.9622C14.3353 17.1733 14.3857 17.3822 14.446 17.6272C14.508 17.8682 14.5709 18.1615 14.6913 18.4783C14.703 18.5092 14.7035 18.5747 14.692 18.6371C14.679 18.6986 14.6611 18.7648 14.6103 18.802C14.5711 18.8519 14.488 18.8468 14.4141 18.8058C14.3407 18.7667 14.2815 18.7034 14.2632 18.6659Z" fill="#593614"/>
<path d="M21.4664 9.79272C21.2731 10.0814 21.1955 10.2643 21.1092 10.4406C21.025 10.6183 20.9414 10.7959 20.8014 11.1198C20.6692 11.4468 20.5896 11.6439 20.5093 11.8424C20.4264 12.044 20.3381 12.2457 20.205 12.5928C20.1889 12.6276 19.9821 12.6536 19.764 12.5847C19.5413 12.5324 19.3776 12.4029 19.3819 12.3642C19.4486 11.9917 19.4898 11.7612 19.5438 11.5328C19.5988 11.3045 19.664 11.0761 19.8158 10.7064C19.9773 10.3295 20.0966 10.1219 20.2326 9.92631C20.3709 9.73252 20.5177 9.54087 20.8127 9.24264C20.8455 9.21362 21.0644 9.25329 21.2276 9.41408C21.4021 9.56158 21.483 9.76371 21.4664 9.79272Z" fill="#593614"/>
<path d="M23.438 10.0677C23.3471 10.1942 23.2872 10.3076 23.2383 10.407C23.1901 10.5075 23.1535 10.5948 23.1171 10.6832C23.0467 10.8616 22.9708 11.0382 22.8555 11.3673C22.7451 11.6909 22.6872 11.8936 22.6205 12.0942C22.5584 12.2968 22.4882 12.4992 22.4055 12.8452C22.3947 12.8796 22.1935 12.9327 21.9676 12.8976C21.7394 12.8797 21.5595 12.7735 21.5586 12.7328C21.576 12.3424 21.5988 12.1051 21.6318 11.8691C21.6701 11.6335 21.7165 11.3987 21.8452 11.0186C21.9801 10.6308 22.0921 10.4168 22.2171 10.211C22.2812 10.1084 22.3509 10.0081 22.4411 9.8921C22.5327 9.777 22.6434 9.64477 22.808 9.4906C22.8458 9.45941 23.0667 9.5071 23.2162 9.68099C23.3777 9.84259 23.4524 10.0438 23.438 10.0677Z" fill="#593614"/>
<path d="M25.4268 10.4788C25.2599 10.7658 25.1914 10.9463 25.1148 11.1191C25.04 11.2932 24.9613 11.4651 24.8357 11.7717C24.7165 12.073 24.6546 12.2573 24.5901 12.4399C24.5282 12.6226 24.4568 12.8065 24.3993 13.1145C24.3913 13.1442 24.1947 13.2052 23.9666 13.1915C23.7376 13.194 23.5503 13.1024 23.5469 13.0599C23.5401 12.6613 23.5696 12.426 23.6065 12.1935C23.6467 11.9618 23.7026 11.7331 23.843 11.3756C23.9909 11.0123 24.1012 10.8177 24.2235 10.631C24.3481 10.4457 24.4789 10.2642 24.7415 9.96874C24.771 9.93973 24.9884 9.97119 25.1618 10.1207C25.345 10.2572 25.4408 10.45 25.4268 10.4788Z" fill="#593614"/>
<path d="M16.7478 35.827C16.2778 35.7787 15.9199 35.6327 15.6001 35.4937C15.2827 35.3502 15.0133 35.1961 14.7709 35.0438C14.2878 34.7366 13.9138 34.4349 13.5599 34.1129C13.2084 33.7883 12.8782 33.4397 12.5273 32.9909C12.1795 32.5407 11.8075 31.9887 11.4464 31.2258C11.0966 30.4771 10.9117 29.8359 10.7865 29.2704C10.6663 28.7027 10.6115 28.2061 10.5892 27.71C10.5682 27.2138 10.5845 26.7166 10.6492 26.1455C10.7145 25.5746 10.8306 24.9285 11.0576 24.1493C11.1052 23.9892 11.3387 23.6962 11.4814 23.7813C11.6471 23.7971 11.6782 24.1583 11.6419 24.3104C11.4491 25.0598 11.3612 25.6732 11.3181 26.2107C11.2756 26.7484 11.2758 27.2116 11.3076 27.6712C11.3405 28.1305 11.4004 28.5877 11.5171 29.1089C11.6386 29.6282 11.8112 30.2159 12.1331 30.9041C12.4653 31.6055 12.8053 32.1153 13.1214 32.5342C13.4404 32.9519 13.7385 33.28 14.0547 33.5885C14.3729 33.8943 14.7087 34.1849 15.1401 34.4808C15.3562 34.6272 15.5964 34.7758 15.8732 34.9127C16.1474 35.046 16.4696 35.1799 16.8064 35.2237C16.8736 35.2341 16.9908 35.2736 17.0918 35.306C17.1893 35.343 17.2965 35.3564 17.3347 35.4293C17.366 35.4575 17.3711 35.5003 17.3449 35.557C17.3191 35.6125 17.2596 35.6712 17.1846 35.717C17.0339 35.8089 16.8403 35.8358 16.7478 35.827Z" fill="#593614"/>
<path d="M34.2652 36.1119C34.6894 35.6829 34.9398 35.1787 35.104 34.7005C35.2688 34.2202 35.3479 33.7649 35.381 33.3413C35.3971 33.1293 35.4009 32.9248 35.3962 32.7266C35.3909 32.5177 35.3858 32.3154 35.3808 32.1176C35.3712 31.7217 35.3621 31.3437 35.353 30.9656C35.3353 30.2109 35.3177 29.4564 35.2967 28.5586C35.2734 27.662 35.2376 26.6245 35.156 25.3063C34.965 22.7312 34.7083 21.1951 34.3658 19.6821C34.2844 19.3027 34.1736 18.9309 34.0755 18.5392C34.0287 18.3425 33.9627 18.1476 33.9002 17.9453C33.837 17.7432 33.7721 17.5353 33.7048 17.3198C33.641 17.1032 33.5499 16.8876 33.4689 16.6579C33.3831 16.43 33.3007 16.1899 33.2017 15.9435C33.0972 15.6994 32.988 15.4442 32.8732 15.1763C32.8141 15.0432 32.7611 14.9032 32.693 14.7662C32.6255 14.6289 32.5564 14.4882 32.4855 14.3441C32.3719 14.1086 32.2422 13.5473 32.4114 13.5229C32.5267 13.3914 32.9027 13.8347 33.028 14.0738C33.1034 14.2202 33.1769 14.3629 33.2488 14.5021C33.3212 14.6413 33.3786 14.7834 33.4419 14.9187C33.565 15.191 33.6823 15.4504 33.7945 15.6986C33.9012 15.9492 33.991 16.1938 34.0839 16.426C34.172 16.6601 34.2699 16.8799 34.3401 17.1009C34.4139 17.3207 34.4849 17.5329 34.5541 17.7392C34.6225 17.9458 34.6941 18.1451 34.7462 18.3459C34.8549 18.7458 34.9754 19.1268 35.0654 19.5147C35.4423 21.0616 35.7183 22.6392 35.9126 25.2553C35.9956 26.5918 36.0286 27.6392 36.0458 28.5408C36.0642 29.4425 36.0694 30.1993 36.0739 30.9553C36.076 31.3332 36.0781 31.7108 36.0803 32.1066C36.0812 32.3048 36.0821 32.5074 36.0831 32.7166C36.0838 32.9367 36.0747 33.1641 36.0517 33.4002C36.0047 33.8714 35.9056 34.3792 35.7089 34.916C35.5127 35.4485 35.2138 36.0344 34.6889 36.5453C34.584 36.6463 34.3486 36.8013 34.1284 36.8773C33.9088 36.9574 33.7153 36.961 33.7086 36.8775C33.6449 36.8153 33.7651 36.6796 33.8975 36.5247C34.0331 36.3719 34.1814 36.1977 34.2652 36.1119Z" fill="#593614"/>
<path d="M21.2943 30.1889C21.1225 30.2039 20.9878 30.1984 20.8727 30.1986C20.7578 30.1982 20.663 30.2 20.5853 30.2092C20.5074 30.2178 20.4467 30.2326 20.3991 30.25C20.3772 30.2604 20.3554 30.2687 20.3392 30.2805L20.3258 30.2879L20.3037 30.3025L20.2587 30.3321C20.2275 30.3517 20.1994 30.3715 20.175 30.3911L20.1358 30.4202L20.1141 30.44C20.0949 30.4574 20.1006 30.4543 20.1002 30.456L20.1018 30.4588L20.104 30.46L20.1068 30.4646C20.1179 30.4865 20.1291 30.5088 20.1406 30.5316C20.1939 30.6359 20.2687 30.7864 20.3131 30.9695C20.3197 30.9991 20.3262 31.028 20.3326 31.0563L20.3338 31.0616L20.3341 31.063L20.3343 31.0636L20.3344 31.064V31.0643C20.6204 31.0123 19.9447 31.1351 20.0143 31.1224L20.0176 31.122L20.0294 31.1181L20.0629 31.0987L20.1095 31.0607L20.1203 31.0493L20.2609 30.914L20.2612 30.9141L20.2617 30.9145L20.2627 30.9151L20.2647 30.9162L20.2726 30.9208C20.3344 30.9601 20.4047 31.0154 20.4437 31.0621C20.4847 31.1109 20.5101 31.1562 20.5235 31.1999C20.531 31.2214 20.5301 31.2442 20.5418 31.2614C20.5446 31.2804 20.5469 31.297 20.5489 31.3107C20.5612 31.4956 20.4873 31.6645 20.379 31.8065L20.3418 31.8571L20.3378 31.8623V31.8622L20.2766 31.8261C20.2447 31.8088 20.2366 31.8021 20.2214 31.7935C20.2072 31.785 20.1925 31.7773 20.1776 31.7701L20.1355 31.7513L20.1086 31.7395L20.0801 31.7321L20.065 31.7281L20.0569 31.7276L20.0526 31.728H20.0515C20.193 31.7246 19.7334 31.7358 20.3684 31.7204V31.7228L20.3679 31.7432C20.3662 31.8533 20.3305 31.9483 20.3026 32.0061C20.2429 32.122 20.2211 32.1498 20.2129 32.1731C20.2034 32.1933 20.1998 32.2089 20.2006 32.2454C20.2024 32.3097 20.2276 32.3875 20.3059 32.4778C20.3789 32.5643 20.5117 32.6634 20.6565 32.7006C20.674 32.7069 20.6919 32.7424 20.7147 32.7975C20.7338 32.8497 20.766 32.922 20.7689 33.0005C20.7847 33.0786 20.7626 33.1531 20.7097 33.2081C20.6605 33.2604 20.5889 33.288 20.5501 33.2815C20.2301 33.2256 20.0218 33.0896 19.8475 32.9325C19.6781 32.7761 19.5518 32.5643 19.5178 32.3301C19.4999 32.2183 19.5032 32.0819 19.542 31.9587C19.5776 31.8368 19.6413 31.7352 19.6505 31.7068L19.652 31.7012C19.6652 31.7043 19.6964 31.7188 19.72 31.7236C19.7612 31.7352 19.7765 31.7346 19.775 31.7349L19.7766 31.735L19.7767 31.7349C19.5141 31.7416 19.7039 31.7347 19.6453 31.7353V31.7316L19.6456 31.7168L19.6476 31.687C19.6496 31.6671 19.6528 31.6472 19.6572 31.6281L19.6679 31.5921C19.6862 31.5383 19.6984 31.5207 19.7125 31.4938C19.7238 31.4748 19.7359 31.4556 19.744 31.4441L19.7457 31.4407L19.7435 31.4375H19.7414L19.7362 31.4332C19.7298 31.4266 19.7364 31.4349 19.7181 31.4145C19.7038 31.3977 19.6947 31.3886 19.6777 31.3636C19.6597 31.3349 19.649 31.3216 19.6309 31.2764C19.6229 31.2559 19.6163 31.2344 19.6112 31.2129L19.6064 31.1921C19.6029 31.1772 19.5993 31.1621 19.5956 31.1465C19.5718 31.0492 19.5335 30.966 19.4819 30.862C19.4676 30.8325 19.4536 30.8037 19.4401 30.7754C19.4189 30.7262 19.3981 30.6795 19.3847 30.6288C19.3701 30.5784 19.3596 30.5287 19.3583 30.4795C19.3515 30.4304 19.3563 30.3821 19.3622 30.3354C19.3685 30.2888 19.3867 30.2452 19.401 30.2025C19.4211 30.1619 19.4429 30.1226 19.4658 30.0852C19.5182 30.0149 19.5816 29.9459 19.6296 29.9096C19.6549 29.8886 19.6825 29.8655 19.7061 29.8484L19.7699 29.8064C19.8127 29.7772 19.8536 29.7532 19.8934 29.7319L19.9541 29.6984L19.9851 29.6816L20.0274 29.6618C20.0842 29.6335 20.1419 29.6154 20.2012 29.5976C20.3185 29.5672 20.4361 29.5552 20.5529 29.5538C20.7838 29.5493 21.0245 29.5971 21.2612 29.5991C21.2856 29.6008 21.3278 29.6305 21.3731 29.6785C21.4151 29.724 21.4669 29.7882 21.4809 29.8656C21.5077 29.9406 21.4871 30.0196 21.4393 30.0838C21.3939 30.1445 21.3276 30.186 21.2943 30.1889Z" fill="#593614"/>
<path d="M22.2065 32.88C22.3005 32.545 22.3114 32.3492 22.3291 32.1574C22.3366 31.9645 22.3495 31.7726 22.3191 31.436C22.2846 31.1071 22.2323 30.9114 22.1821 30.7156C22.1278 30.5208 22.073 30.322 21.9229 30.0141C21.9094 29.9827 21.9848 29.8483 22.1224 29.7709C22.2516 29.6788 22.4078 29.6817 22.4324 29.7154C22.6522 30.0459 22.7562 30.2679 22.847 30.4933C22.9331 30.7203 23.0107 30.9562 23.0542 31.3612C23.0924 31.776 23.063 32.0147 23.0261 32.2471C22.9781 32.4776 22.9223 32.7092 22.7608 33.084C22.7422 33.1218 22.5794 33.1776 22.4368 33.1079C22.2883 33.0542 22.1989 32.9127 22.2065 32.88Z" fill="#593614"/>
<path d="M27.7742 25.7342C27.6533 26.1277 27.5158 26.4059 27.3934 26.6421C27.2683 26.8765 27.1551 27.0678 27.0335 27.2527C26.9132 27.4388 26.7836 27.618 26.6211 27.8257C26.4541 28.0317 26.2623 28.2653 25.9623 28.546C25.8853 28.6142 25.8104 28.6793 25.7225 28.7412C25.6418 28.7988 25.5769 28.837 25.5081 28.8824C25.3718 28.9668 25.2445 29.0392 25.1234 29.1033C24.8804 29.2302 24.6624 29.3223 24.4439 29.4024C24.0061 29.5637 23.5636 29.6669 22.8677 29.8608C22.7967 29.8793 22.6052 29.7983 22.5696 29.6394C22.5019 29.4908 22.6113 29.3115 22.6824 29.2837C23.3827 29.0364 23.7942 28.9017 24.1785 28.7338C24.371 28.6504 24.5577 28.5616 24.7684 28.4448C24.8734 28.3857 24.9845 28.3199 25.1049 28.2435C25.1619 28.2048 25.2328 28.1614 25.2867 28.1217C25.3347 28.0878 25.3913 28.0388 25.4514 27.9856C25.6982 27.7548 25.8841 27.5366 26.0395 27.3533C26.1934 27.1661 26.3207 27.0059 26.4414 26.8413C26.5636 26.6778 26.68 26.5105 26.8093 26.3075C26.9359 26.1041 27.077 25.8614 27.1982 25.5462C27.2254 25.4879 27.3998 25.3398 27.5577 25.3834C27.7205 25.3932 27.8001 25.6527 27.7742 25.7342Z" fill="#593614"/>
<path d="M23.3052 32.7588C23.8296 32.7092 24.2571 32.5713 24.6141 32.4561C24.9736 32.3377 25.2716 32.2173 25.5679 32.095C25.8635 31.9702 26.1573 31.8396 26.5005 31.6739C26.6711 31.5896 26.8547 31.4979 27.0532 31.39C27.2471 31.2803 27.47 31.1604 27.6603 31.01C28.537 30.3188 29.0282 29.8682 29.4906 29.3979C29.7167 29.1593 29.9362 28.9154 30.1587 28.6133C30.3773 28.3111 30.6063 27.9462 30.7448 27.4602C30.7648 27.4114 30.8055 27.3406 30.8723 27.2835C30.9373 27.2269 31.0203 27.1819 31.0988 27.2027C31.1816 27.1979 31.2471 27.2605 31.2888 27.3466C31.3292 27.4315 31.3526 27.5409 31.3341 27.6019C31.1886 28.2144 30.9396 28.6435 30.7119 28.9948C30.4789 29.3452 30.252 29.6213 30.0177 29.8876C29.541 30.4103 29.0291 30.8957 28.129 31.606C27.8636 31.813 27.6273 31.9346 27.4136 32.0548C27.1992 32.1696 27.0041 32.2645 26.8229 32.3505C26.4592 32.519 26.1482 32.6464 25.8334 32.7654C25.5176 32.8817 25.1997 32.9925 24.8105 33.1001C24.4198 33.2036 23.9695 33.3312 23.3388 33.3639C23.2762 33.3665 23.1539 33.3392 23.0535 33.2745C22.9541 33.2144 22.8869 33.136 22.9105 33.0564C22.9081 32.9754 22.9891 32.9044 23.0732 32.8536C23.1562 32.8074 23.2527 32.7651 23.3052 32.7588Z" fill="#593614"/>
<path d="M19.4373 34.2904C19.4544 34.3344 19.464 34.3883 19.4685 34.4436C19.4771 34.4965 19.4663 34.5524 19.4612 34.6043C19.4396 34.7069 19.3925 34.7971 19.3749 34.8309C19.3667 34.8466 19.3704 34.8417 19.3691 34.8453L19.3686 34.8505L19.3696 34.8602L19.3786 34.8744L19.3847 34.8786L19.3967 34.8888L19.4067 34.8982L19.4115 34.9028L19.4142 34.9055L19.4277 34.9215C19.4554 34.9487 19.4867 34.9746 19.5174 35.0007C19.6401 35.1064 19.7633 35.2083 19.8932 35.3156C19.8481 35.3722 19.776 35.4511 19.7084 35.5277C19.6359 35.6041 19.5633 35.6834 19.4671 35.7649C19.4106 35.8001 19.3515 35.8368 19.2896 35.8752C19.2596 35.8927 19.2249 35.9184 19.1954 35.9291C19.1712 35.9387 19.1464 35.9485 19.121 35.9587C19.0266 35.9998 18.9248 36.0246 18.8118 36.0547C18.3052 36.1511 18.0083 36.1211 17.7148 36.0825C17.6421 36.0691 17.5693 36.0555 17.4935 36.0414C17.4183 36.0222 17.3402 36.005 17.2572 35.9802C17.0912 35.9293 16.9029 35.8651 16.6766 35.741C16.6289 35.7109 16.5943 35.5537 16.6819 35.4381C16.7512 35.3127 16.8873 35.2485 16.9201 35.2624C17.2814 35.4066 17.5427 35.4285 17.786 35.4492C18.0309 35.4625 18.2873 35.4711 18.6654 35.3991C18.7441 35.3767 18.8183 35.3604 18.8755 35.3348L18.9138 35.3207L18.9183 35.3198L18.9198 35.3204L18.935 35.3184L18.9373 35.308L18.9369 35.3033L18.8917 35.2422C18.8738 35.2194 18.8545 35.187 18.8364 35.1503C18.8197 35.1146 18.7994 35.0797 18.7897 35.0409C18.7667 34.9645 18.7547 34.8809 18.7721 34.7963C18.7777 34.7536 18.7947 34.7127 18.811 34.6707C18.8175 34.6493 18.8318 34.63 18.842 34.6093C18.8525 34.5908 18.8671 34.5628 18.8722 34.5565C18.9086 34.502 18.9097 34.4939 18.9184 34.4848C18.9183 34.4729 18.9301 34.4701 18.9203 34.4355C18.9291 34.426 18.9863 34.28 19.1153 34.2124C19.2302 34.1281 19.4161 34.2068 19.4373 34.2904Z" fill="#593614"/>
<path d="M17.2106 33.9241C17.1529 34.1042 17.1424 34.2141 17.126 34.3193C17.111 34.425 17.0954 34.5306 17.0822 34.7132C17.0724 34.8919 17.0808 34.9955 17.0872 35.098C17.0965 35.199 17.1015 35.3044 17.1615 35.4519C17.1653 35.4661 17.0826 35.564 16.9627 35.6425C16.8476 35.7294 16.7182 35.7494 16.7001 35.7268C16.5498 35.51 16.5022 35.3596 16.4605 35.2144C16.4234 35.0676 16.3991 34.9169 16.4115 34.676C16.4283 34.4308 16.4622 34.296 16.5061 34.1653C16.5521 34.0355 16.6028 33.9071 16.7241 33.697C16.7385 33.6757 16.8753 33.6701 17.0003 33.7416C17.1294 33.8043 17.2146 33.9068 17.2106 33.9241Z" fill="#593614"/>
<path d="M17.1233 26.4318C17.0101 26.4558 16.9188 26.4818 16.8576 26.514C16.7953 26.5461 16.7585 26.5791 16.7259 26.6228C16.694 26.6663 16.6676 26.7223 16.647 26.7842C16.6265 26.8431 16.6215 26.8919 16.6213 26.9315C16.6287 27.0068 16.6502 27.0542 16.711 27.1172C16.7712 27.1776 16.8604 27.2361 16.962 27.2861C17.1677 27.387 17.4182 27.4603 17.7239 27.5261C18.0351 27.5926 18.394 27.6413 18.8953 27.696C19.3601 27.7592 19.7326 27.7711 20.0596 27.7751C20.3853 27.7768 20.662 27.7615 20.9246 27.7251C21.0541 27.7048 21.1806 27.6793 21.2985 27.6424C21.413 27.6054 21.5206 27.5506 21.5724 27.4985C21.5913 27.4708 21.6141 27.4549 21.6162 27.4256C21.6261 27.4148 21.6174 27.391 21.6236 27.3727C21.62 27.3487 21.6173 27.3227 21.6114 27.2929C21.5784 27.169 21.4881 27.0009 21.3493 26.8298C21.2982 26.7598 21.2617 26.5218 21.3923 26.4228C21.491 26.2922 21.7425 26.3597 21.8163 26.4433C21.9904 26.6417 22.1383 26.8514 22.2264 27.1108C22.2461 27.1775 22.261 27.2488 22.2708 27.3191C22.2715 27.3963 22.2816 27.4685 22.2622 27.5465C22.2425 27.703 22.159 27.8388 22.0752 27.9443C21.8948 28.1455 21.7042 28.2291 21.5355 28.2989C21.3651 28.3628 21.2048 28.4021 21.046 28.4341C20.7298 28.4922 20.4196 28.518 20.063 28.5232C19.7081 28.5259 19.3 28.5155 18.8028 28.4484C18.3183 28.3961 17.9054 28.3384 17.5619 28.2577C17.2147 28.175 16.9201 28.0839 16.6252 27.9237C16.4788 27.8412 16.3291 27.7419 16.1898 27.5837C16.0503 27.4313 15.9351 27.1773 15.9483 26.9156C15.9552 26.788 15.9847 26.6638 16.0308 26.5526C16.0749 26.4438 16.135 26.3268 16.2304 26.2144C16.3246 26.1017 16.4598 26.0034 16.601 25.9445C16.7428 25.8834 16.8824 25.8572 17.0125 25.8359C17.1226 25.822 17.3972 25.9097 17.4154 26.0694C17.4783 26.2243 17.2086 26.4136 17.1233 26.4318Z" fill="#593614"/>
<path d="M15.5988 32.5327C15.4978 31.9644 15.4551 31.6534 15.4108 31.3347C15.3899 31.1749 15.3706 31.0204 15.3517 30.8254C15.342 30.7259 15.3342 30.6146 15.335 30.4799C15.3337 30.3503 15.3568 30.1642 15.4044 30.0107C15.4473 29.8647 15.4785 29.7669 15.5041 29.6645C15.5301 29.5593 15.5473 29.4824 15.5584 29.402C15.5813 29.2435 15.5849 29.0983 15.5854 28.9404C15.5863 28.7822 15.5801 28.6109 15.5949 28.394C15.6086 28.1795 15.6546 27.9073 15.7968 27.6148C15.8298 27.5537 16.0127 27.4993 16.1458 27.5938C16.2912 27.6662 16.3645 27.8216 16.3504 27.8617C16.2736 28.0723 16.2612 28.2449 16.2667 28.4138C16.2716 28.5816 16.2916 28.7407 16.3043 28.9129C16.3168 29.0849 16.3251 29.2718 16.3006 29.4953C16.2896 29.6061 16.2645 29.7314 16.2374 29.8459C16.2102 29.9635 16.168 30.1012 16.1337 30.2179C16.1005 30.3324 16.0942 30.3964 16.0912 30.4935C16.0894 30.5856 16.0929 30.6787 16.0988 30.7674C16.11 30.9541 16.1194 31.111 16.1287 31.2682C16.1469 31.5821 16.1529 31.9055 16.1986 32.4461C16.2004 32.5016 16.0911 32.6584 15.932 32.6859C15.7761 32.7384 15.609 32.5883 15.5988 32.5327Z" fill="#593614"/>
<path d="M20.5852 34.2623C20.3314 34.399 20.1191 34.4735 19.9356 34.5254C19.7517 34.5778 19.5947 34.6092 19.4376 34.6309C19.1235 34.6706 18.8047 34.6916 18.2596 34.6191C17.7276 34.5396 17.4164 34.4311 17.1121 34.3011C16.9606 34.2324 16.811 34.1557 16.6419 34.0424C16.5574 33.9872 16.4679 33.9164 16.373 33.8283C16.2813 33.7328 16.1699 33.6217 16.0998 33.4079C16.0891 33.3636 16.105 33.2741 16.1628 33.2253C16.2192 33.1727 16.2958 33.1539 16.3756 33.1698C16.456 33.1743 16.5289 33.2034 16.583 33.2148C16.6386 33.2298 16.6761 33.2187 16.6772 33.2233C16.6911 33.2473 16.7415 33.3054 16.7998 33.3495C16.8628 33.3946 16.9254 33.4358 16.9929 33.4694C17.1248 33.5381 17.2512 33.5878 17.3792 33.6331C17.6384 33.7186 17.9075 33.8005 18.3657 33.8682C18.8348 33.9301 19.103 33.923 19.3666 33.9133C19.4985 33.907 19.6296 33.8954 19.7826 33.8696C19.9357 33.8449 20.1107 33.8041 20.3177 33.7186C20.3566 33.7038 20.5351 33.7609 20.6118 33.9041C20.7086 34.0353 20.6376 34.2315 20.5852 34.2623Z" fill="#593614"/>
<path d="M20.4373 26.2878C20.2618 25.8177 20.2425 25.5251 20.231 25.2412C20.234 24.9572 20.2452 24.6632 20.414 24.1848C20.5008 23.9505 20.6061 23.7768 20.6844 23.6385C20.7647 23.4983 20.8323 23.3825 20.885 23.2679C20.9363 23.1537 20.9778 23.0395 20.9829 22.9174C20.9863 22.7973 20.9553 22.6631 20.813 22.5213C20.7853 22.4944 20.764 22.3791 20.8218 22.3162C20.8636 22.2393 20.9926 22.2557 21.0358 22.291C21.2382 22.4637 21.3372 22.713 21.338 22.9149C21.3418 23.1188 21.2892 23.2756 21.2344 23.4178C21.177 23.5601 21.1072 23.6885 21.0292 23.832C20.9507 23.978 20.8637 24.1241 20.7897 24.3244C20.6438 24.739 20.6274 24.9953 20.6121 25.2446C20.6099 25.4941 20.6071 25.7533 20.7386 26.179C20.7505 26.2205 20.732 26.3638 20.6497 26.39C20.5762 26.4356 20.4563 26.3355 20.4373 26.2878Z" fill="#593614"/>
<path d="M19.0108 26.5078C19.0112 26.2759 18.9638 26.0894 18.9207 25.9272C18.8764 25.7646 18.8303 25.6257 18.7889 25.4815C18.7474 25.3377 18.7062 25.1894 18.6783 25.0024C18.6517 24.8169 18.6324 24.5871 18.6924 24.3003C18.7534 24.0145 18.8714 23.8172 18.9664 23.6602C19.0649 23.5021 19.1536 23.377 19.2375 23.2529C19.3196 23.1298 19.3987 23.0081 19.463 22.8651C19.5251 22.722 19.5709 22.5585 19.5228 22.3583C19.5096 22.3213 19.5421 22.2039 19.6216 22.1732C19.6926 22.1209 19.805 22.207 19.8295 22.2661C19.9202 22.5586 19.8609 22.816 19.7926 22.9976C19.7211 23.1836 19.6385 23.3236 19.5575 23.4584C19.4756 23.5914 19.3919 23.7187 19.3048 23.8645C19.2193 24.0113 19.1281 24.1728 19.0843 24.3841C19.0381 24.6047 19.0505 24.7874 19.0705 24.9466C19.0909 25.1062 19.1235 25.2434 19.1572 25.3834C19.1904 25.5234 19.229 25.6663 19.2666 25.8437C19.3022 26.0207 19.3462 26.2353 19.3309 26.5216C19.329 26.5808 19.2338 26.7279 19.1527 26.6979C19.0659 26.691 19.0141 26.5519 19.0108 26.5078Z" fill="#593614"/>
<path d="M17.6005 25.9406C17.508 25.4682 17.4581 25.1932 17.4232 24.9154C17.407 24.776 17.3925 24.6358 17.387 24.4664C17.3809 24.2973 17.3804 24.0988 17.4146 23.8431C17.45 23.5905 17.5084 23.3967 17.5902 23.218C17.675 23.0515 17.7566 22.9349 17.8293 22.8167C17.9016 22.7001 17.9713 22.5858 18.0191 22.4551C18.0664 22.3233 18.0896 22.1829 18.0035 22.0241C17.9873 21.9945 17.9897 21.8809 18.0585 21.8289C18.1126 21.7606 18.2427 21.8064 18.2775 21.8581C18.3568 21.9807 18.3923 22.118 18.4009 22.241C18.4036 22.3636 18.3862 22.4723 18.3575 22.5632C18.3021 22.7477 18.2273 22.8818 18.1566 23.0103C18.0857 23.1376 18.0094 23.2587 17.9468 23.3891C17.8938 23.5122 17.8401 23.6838 17.8116 23.8981C17.782 24.1197 17.7803 24.3002 17.783 24.4562C17.7848 24.6122 17.7936 24.7449 17.8024 24.8779C17.8228 25.1445 17.8509 25.4116 17.9167 25.8886C17.9222 25.9366 17.8727 26.0811 17.7863 26.0839C17.7033 26.108 17.6106 25.9873 17.6005 25.9406Z" fill="#593614"/>
<path d="M13.9624 27.5366C14.1352 27.8173 14.2185 27.9662 14.3064 28.1165C14.3883 28.2636 14.4693 28.4093 14.6123 28.6664C14.7533 28.9057 14.8453 29.033 14.9378 29.1501C15.0316 29.2627 15.1235 29.3844 15.3112 29.4689C15.3264 29.4776 15.344 29.6259 15.3114 29.7842C15.2922 29.9464 15.1842 30.0586 15.1402 30.0504C14.9429 30.0078 14.8046 29.9291 14.6905 29.8605C14.5809 29.7878 14.4898 29.7188 14.4143 29.6435C14.2573 29.4946 14.124 29.3301 13.9576 29.049C13.7919 28.7611 13.7233 28.5942 13.6559 28.4275C13.5893 28.2625 13.5353 28.0875 13.426 27.8188C13.417 27.793 13.4985 27.656 13.6421 27.5807C13.779 27.4931 13.9421 27.5081 13.9624 27.5366Z" fill="#593614"/>
<path d="M23.0297 27.7617C23.0653 28.1271 23.0979 28.1782 23.0615 28.5707C23.0396 28.7652 23.0102 28.8862 22.9692 29.0032C22.9269 29.1198 22.877 29.2365 22.7733 29.4153C22.7606 29.4337 22.6193 29.4164 22.4744 29.3431C22.3262 29.2775 22.2155 29.1893 22.2173 29.174C22.2543 29.0234 22.2591 28.9294 22.2694 28.8365C22.28 28.7401 22.2904 28.6458 22.3076 28.4897C22.3377 28.1533 22.3576 28.1031 22.4241 27.7375C22.4292 27.719 22.5676 27.6731 22.7295 27.6844C22.8917 27.6875 23.0261 27.7437 23.0297 27.7617Z" fill="#593614"/>
<path d="M34.8951 39.4237C34.4706 39.7286 34.0666 39.954 33.6952 40.141C33.3233 40.328 32.9828 40.478 32.6673 40.6105C32.3515 40.7431 32.0605 40.8588 31.7833 40.9682C31.5053 41.0771 31.2495 41.1816 30.9672 41.284C30.4127 41.4816 29.8469 41.6381 29.1643 41.765C28.4816 41.8883 27.682 41.995 26.6536 41.9996C26.1505 41.9992 25.6961 41.9706 25.2797 41.9256C25.0718 41.8959 24.8729 41.8743 24.6828 41.8359C24.5863 41.8169 24.4974 41.805 24.4001 41.7812C24.3032 41.7582 24.208 41.7358 24.1188 41.7059C23.7577 41.5942 23.4445 41.4485 23.1569 41.284C22.8701 41.1188 22.6093 40.9335 22.368 40.7202C22.1276 40.5064 21.9041 40.2649 21.7167 39.9691C21.6732 39.8924 21.6257 39.8179 21.5856 39.7363C21.5493 39.6519 21.5052 39.5715 21.476 39.4803C21.4474 39.3856 21.4131 39.3083 21.3927 39.1876C21.3738 39.076 21.3676 38.9615 21.3766 38.854C21.3907 38.6365 21.4481 38.4404 21.5008 38.2606C21.5542 38.0825 21.6063 37.908 21.6039 37.7929C21.6025 37.7355 21.5938 37.7031 21.5723 37.6678C21.551 37.6325 21.5037 37.5894 21.4351 37.5488C21.2987 37.4654 21.0919 37.4026 20.8716 37.3549C20.6957 37.3097 20.3027 37.1285 20.3614 36.9722C20.3305 36.8054 20.778 36.7172 20.9918 36.7609C21.2484 36.8121 21.4973 36.8701 21.747 37.0081C21.8698 37.0772 21.9976 37.1708 22.0954 37.3114C22.1947 37.4509 22.2405 37.6263 22.2448 37.7702C22.2506 38.0614 22.1763 38.2605 22.1336 38.4384C22.0861 38.6149 22.051 38.7655 22.0476 38.8919C22.0402 39.022 22.0665 39.1027 22.1181 39.2397C22.1387 39.3022 22.175 39.3604 22.201 39.4201C22.2316 39.4785 22.2702 39.5339 22.303 39.5904C22.4507 39.8109 22.6359 40.0042 22.8402 40.1777C23.2509 40.5199 23.7409 40.8074 24.3347 40.9897C24.4087 41.0141 24.4841 41.0305 24.5608 41.0482C24.6365 41.0669 24.7281 41.0789 24.8137 41.0951C24.9874 41.1295 25.1728 41.1481 25.365 41.1749C25.7523 41.2152 26.178 41.2413 26.6525 41.2414C27.6229 41.2369 28.3836 41.1385 29.0302 41.0278C29.677 40.9138 30.2117 40.7751 30.7305 40.6031C30.9841 40.5176 31.2569 40.4148 31.5354 40.3141C31.8142 40.2125 32.1041 40.1067 32.4149 39.9865C32.7256 39.8662 33.0571 39.7312 33.414 39.5639C33.7707 39.3965 34.1529 39.1957 34.547 38.9277C34.628 38.8769 34.7907 38.7961 34.9455 38.7435C35.0957 38.6872 35.2421 38.6603 35.2797 38.7348C35.3516 38.78 35.3032 38.9198 35.2122 39.0698C35.1183 39.2146 34.9808 39.3644 34.8951 39.4237Z" fill="#593614"/>
<path d="M20.956 40.5564C20.479 40.6245 20.06 40.6544 19.6792 40.6728C19.2983 40.693 18.9565 40.7002 18.6399 40.7055C18.007 40.7127 17.4758 40.7046 16.9433 40.6831C16.6769 40.671 16.4106 40.6576 16.1288 40.6342C15.9885 40.6234 15.8427 40.6086 15.6898 40.5896C15.6128 40.5796 15.5293 40.5638 15.4474 40.5502C15.3686 40.5328 15.2883 40.5151 15.2064 40.4968C14.5654 40.335 13.8668 40.0924 12.9991 39.694C12.5758 39.4939 12.202 39.2943 11.8635 39.0582C11.7797 39.0017 11.6937 38.9299 11.6176 38.867C11.548 38.8005 11.4799 38.7356 11.4131 38.6718C11.3466 38.608 11.2815 38.5453 11.2175 38.4837C11.1599 38.4157 11.1034 38.3488 11.0478 38.2832C10.6054 37.757 10.3206 37.2162 10.1526 36.6407C9.98913 36.0655 9.93913 35.4434 10.0915 34.758C10.1336 34.5876 10.1739 34.4106 10.2503 34.2369C10.2871 34.1499 10.314 34.0565 10.3617 33.9703C10.4083 33.8835 10.4559 33.795 10.5046 33.7044C10.7201 33.3577 10.9913 32.9906 11.3859 32.6916C11.4591 32.6214 11.6148 32.5674 11.7456 32.5433C11.8782 32.5202 11.9898 32.535 12.0133 32.6168C12.0714 32.6751 12.038 32.7879 11.9786 32.8945C11.9198 33.003 11.8271 33.098 11.7697 33.1608C11.1339 33.699 10.8604 34.339 10.7494 34.8951C10.6413 35.4589 10.6962 35.9655 10.8424 36.4364C10.9926 36.9076 11.2358 37.3535 11.6173 37.7979C11.6649 37.8536 11.7133 37.9104 11.7626 37.9681C11.8185 38.0205 11.8754 38.0739 11.9335 38.1285C11.9913 38.1833 12.0503 38.2392 12.1106 38.2963C12.1731 38.3464 12.2276 38.3932 12.2993 38.4411C12.5763 38.6329 12.9246 38.8209 13.3205 39.0074C14.1357 39.3822 14.815 39.6198 15.3868 39.7695C15.4576 39.786 15.527 39.8022 15.595 39.8181C15.6618 39.8295 15.7236 39.8426 15.7909 39.8523C15.9269 39.871 16.0613 39.8869 16.1958 39.8996C16.4631 39.9266 16.7224 39.9451 16.9814 39.963C17.5003 39.9965 18.0219 40.0204 18.6415 40.0322C18.9511 40.0364 19.2857 40.0396 19.6556 40.0312C20.0253 40.0245 20.4324 40.0064 20.8738 39.9559C20.9643 39.9497 21.1287 39.9535 21.2786 39.9818C21.419 40.0009 21.5541 40.0418 21.5608 40.1237C21.6078 40.1945 21.5138 40.2987 21.3697 40.3931C21.2303 40.4756 21.05 40.5457 20.956 40.5564Z" fill="#593614"/>
<path d="M36.0053 34.143C36.0614 34.11 36.1459 34.0804 36.215 34.0623C36.2891 34.0503 36.3622 34.0407 36.4331 34.0542C36.574 34.0742 36.6978 34.1461 36.7907 34.2396C36.8863 34.3331 36.9298 34.4047 36.9737 34.4674C37.0107 34.5258 37.0459 34.5815 37.0799 34.6351C37.1413 34.7337 37.1942 34.8086 37.24 34.8574C37.2726 34.8892 37.3045 34.9201 37.3359 34.9506C37.3771 34.9907 37.4167 35.0327 37.4538 35.0728C37.5319 35.1588 37.575 35.2076 37.6318 35.2512C37.6614 35.2745 37.6948 35.299 37.7347 35.3251L37.7651 35.3449L37.7714 35.3484L37.7732 35.347L37.7741 35.3467L37.7748 35.3458L37.8005 35.3419C37.8337 35.3354 37.8677 35.3291 37.9025 35.3225C37.9557 35.3135 38.0328 35.3027 38.1015 35.3049C38.2412 35.3097 38.3901 35.3507 38.5071 35.4547C38.6245 35.5548 38.7166 35.7027 38.7588 35.8744C38.7978 36.0449 38.7852 36.1819 38.763 36.2888C38.7418 36.4016 38.7079 36.4928 38.6742 36.578C38.6038 36.7442 38.5246 36.8726 38.4473 36.9875C38.292 37.2163 38.1393 37.3842 37.9813 37.5459C37.8223 37.7059 37.654 37.8536 37.447 38.0131C37.3425 38.092 37.2284 38.1736 37.0954 38.2569C36.961 38.3396 36.8131 38.4263 36.611 38.5019C36.5681 38.516 36.486 38.5065 36.4158 38.4652C36.3417 38.4232 36.2978 38.351 36.3029 38.2696C36.2919 38.1893 36.3151 38.1111 36.3283 38.0531C36.3453 37.993 36.3677 37.9478 36.3914 37.937C36.512 37.8813 36.6325 37.802 36.7368 37.7252C36.8421 37.6473 36.9354 37.5689 37.0208 37.4934C37.1901 37.3405 37.3285 37.1993 37.4572 37.0531C37.5844 36.9065 37.7083 36.7553 37.8228 36.5757C37.8799 36.4866 37.9357 36.389 37.9761 36.2892C37.9942 36.2404 38.0122 36.1897 38.019 36.1471C38.0295 36.1003 38.0253 36.0673 38.0258 36.069L38.0259 36.0681C38.024 36.0681 38.031 36.0667 38.0167 36.069C37.984 36.0747 37.9521 36.0803 37.9209 36.0857C37.9012 36.0891 37.8784 36.0919 37.8504 36.0947C37.8191 36.0987 37.7876 36.0992 37.7565 36.0987C37.6944 36.0987 37.6336 36.0905 37.5766 36.0746C37.5179 36.0616 37.4682 36.0302 37.4162 36.0067C37.3939 35.9948 37.3617 35.9723 37.3501 35.9643L37.3105 35.9365C37.2582 35.8994 37.2054 35.8581 37.1541 35.8132C37.0473 35.7215 36.9628 35.612 36.9091 35.5452C36.8798 35.5092 36.8522 35.4757 36.8224 35.4423L36.7766 35.3917C36.753 35.3642 36.7293 35.3364 36.7051 35.3084C36.6157 35.1944 36.5531 35.0794 36.4955 34.9694C36.469 34.9189 36.4415 34.8666 36.4126 34.8117C36.3866 34.7643 36.357 34.7178 36.3516 34.7092C36.3396 34.6889 36.3173 34.6665 36.2708 34.6879C36.2535 34.6969 36.2082 34.6787 36.133 34.671C36.0627 34.6566 35.9791 34.6271 35.9317 34.5616C35.8715 34.5059 35.8597 34.4199 35.878 34.3355C35.8876 34.2523 35.9618 34.1702 36.0053 34.143Z" fill="#593614"/>
<path d="M35.3107 36.2835C35.5072 36.3747 35.6141 36.4438 35.7157 36.5194C35.8159 36.597 35.912 36.6848 36.0424 36.8764C36.1644 37.0693 36.2122 37.2075 36.2395 37.3482C36.2634 37.4886 36.2771 37.6375 36.2365 37.8682C36.2302 37.8934 36.0906 37.9253 35.9303 37.8981C35.7694 37.8793 35.6357 37.833 35.6323 37.8212C35.6159 37.6882 35.579 37.6174 35.548 37.5465C35.515 37.4763 35.4805 37.4069 35.4083 37.2921C35.3287 37.1768 35.2752 37.1118 35.222 37.0449C35.1678 36.9785 35.1157 36.9053 34.9955 36.8011C34.9855 36.7901 35.0148 36.6483 35.0963 36.5083C35.1706 36.3639 35.2888 36.2754 35.3107 36.2835Z" fill="#593614"/>
<path d="M18.784 19.4978C18.4098 19.4444 18.2822 19.1443 18.3143 18.811C18.3658 18.2772 18.8266 17.6582 19.3401 17.8293C19.7573 17.9684 19.6182 18.3855 19.3749 18.7679C19.1316 19.1502 18.784 19.4978 18.784 19.4978Z" fill="#593614"/>
<path d="M23.3722 19.7759C23.1394 19.6362 22.997 19.436 22.9272 19.2208C22.7181 18.5752 23.1636 17.7945 23.7893 18.1074C24.218 18.3217 24.2795 18.8665 24.1437 19.2889C24.0153 19.6886 23.7101 19.9786 23.3722 19.7759Z" fill="#593614"/>
<path d="M25.3288 14.853C26.4411 15.1658 26.7655 15.5829 27.1363 15.861C27.5071 16.139 28.0421 15.7588 27.4839 15.1658C26.9277 14.5749 26.2765 14.3252 25.7922 14.2041C25.0507 14.0187 24.9297 14.7407 25.3288 14.853Z" fill="#593614"/>
<path d="M18.9062 14.1873C17.7534 14.266 17.3505 14.608 16.9307 14.8044C16.5109 15.0008 16.0649 14.5192 16.7326 14.0528C17.3979 13.5881 18.0864 13.4769 18.5852 13.4574C19.3489 13.4276 19.3197 14.1591 18.9062 14.1873Z" fill="#593614"/>
</svg>

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,24 @@
<svg width="112" height="112" viewBox="0 0 112 112" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_dd_8099_82154)">
<rect x="16" y="16" width="80" height="80" rx="40" fill="#BAE0FF"/>
<rect x="40" y="40" width="32" height="32" rx="8" fill="#1677FF"/>
</g>
<defs>
<filter id="filter0_dd_8099_82154" x="0" y="0" width="112" height="112" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="16" operator="dilate" in="SourceAlpha" result="effect1_dropShadow_8099_82154"/>
<feOffset/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.0862745 0 0 0 0 0.466667 0 0 0 0 1 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_8099_82154"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="8" operator="dilate" in="SourceAlpha" result="effect2_dropShadow_8099_82154"/>
<feOffset/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.0862745 0 0 0 0 0.466667 0 0 0 0 1 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_8099_82154" result="effect2_dropShadow_8099_82154"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_8099_82154" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,42 @@
import {useState, useEffect} from 'react';
export const STORAGE_AUTHORIZE_KEY = 'token';
export const useAuthorization = () => {
const [currentToken, setCurrentToken] = useState(localStorage.getItem(STORAGE_AUTHORIZE_KEY));
// 同步 localStorage 变更
useEffect(() => {
const handleStorageChange = (event: StorageEvent) => {
if (event.key === STORAGE_AUTHORIZE_KEY) {
setCurrentToken(localStorage.getItem(STORAGE_AUTHORIZE_KEY));
}
};
window.addEventListener('storage', handleStorageChange);
return () => {
window.removeEventListener('storage', handleStorageChange);
};
}, []);
const login = (token: string) => {
localStorage.setItem(STORAGE_AUTHORIZE_KEY, token);
setCurrentToken(token);
};
const logout = () => {
localStorage.removeItem(STORAGE_AUTHORIZE_KEY);
setCurrentToken(null);
};
const isLogin = () => {
return !!currentToken;
};
return {
token: currentToken,
login,
logout,
isLogin
};
};

View File

@@ -0,0 +1,21 @@
import {setDefaultConfig} from 'antd-mobile';
import enUS from 'antd-mobile/es/locales/en-US';
import zhCN from 'antd-mobile/es/locales/zh-CN';
function changeLanguage(language: string) {
let locale;
switch (language) {
case 'zh_CN':
locale = enUS;
break;
case 'en_US':
locale = zhCN;
break;
default:
locale = enUS; // 或者是你的默认语言
}
setDefaultConfig({locale: locale});
}
export default changeLanguage;

View File

@@ -0,0 +1,21 @@
/**
* @description: request method
*/
export enum RequestEnum {
GET = 'GET',
POST = 'POST',
PUT = 'PUT',
DELETE = 'DELETE',
}
/**
* @description: contentType
*/
export enum ContentTypeEnum {
// json
JSON = 'application/json;charset=UTF-8',
// form-data qs
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
// form-data upload
FORM_DATA = 'multipart/form-data;charset=UTF-8',
}

View File

@@ -0,0 +1,49 @@
import Axios, {
AxiosError,
AxiosInstance as AxiosType,
AxiosResponse,
InternalAxiosRequestConfig
} from 'axios';
import {STORAGE_AUTHORIZE_KEY} from "@/composables/authorization.ts";
export interface ResponseBody<T = any> {
code: number;
data?: T;
msg: string;
}
async function requestHandler(config: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> {
const token = localStorage.getItem(STORAGE_AUTHORIZE_KEY);
if (token) {
config.headers[STORAGE_AUTHORIZE_KEY] = token;
}
return config;
}
function responseHandler(response: AxiosResponse<ResponseBody>): AxiosResponse<ResponseBody> {
// 响应拦截器逻辑...
return response;
}
function errorHandler(error: AxiosError<ResponseBody>): Promise<AxiosError<ResponseBody>> {
// 错误处理逻辑...
return Promise.reject(error);
}
class AxiosInstance {
private readonly instance: AxiosType;
constructor(baseURL: string) {
this.instance = Axios.create({baseURL});
this.instance.interceptors.request.use(requestHandler, errorHandler);
this.instance.interceptors.response.use(responseHandler, errorHandler);
}
public getInstance(): AxiosType {
return this.instance;
}
}
const baseURL = import.meta.env.VITE_BASE_URL || 'http://127.0.0.1:8080';
export const axiosInstance = new AxiosInstance(baseURL).getInstance();

View File

@@ -0,0 +1,103 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: "Roboto", sans-serif;
}
a,
button,
input,
textarea {
-webkit-tap-highlight-color: transparent;
}
html {
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
font-size: 100%;
}
/* 小屏幕设备(如手机)*/
@media (max-width: 600px) {
html {
font-size: 90%; /* 字体稍微小一点 */
}
}
/* 中等屏幕设备(如平板)*/
@media (min-width: 601px) and (max-width: 1024px) {
html {
font-size: 100%; /* 标准大小 */
}
}
/* 大屏幕设备(如桌面)*/
@media (min-width: 1025px) {
html {
font-size: 110%; /* 字体稍微大一点 */
}
}
* {
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
}
a {
text-decoration: none;
color: inherit;
}
img {
max-width: 100%;
height: auto;
}
.ec-navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background-color: #fff;
border-bottom: 1px solid #e5e5e5;
-webkit-transition: all 0.3s;
transition: all 0.3s;
}
:root {
--primary-color: #ffc300;
}
:root:root {
/* --adm-color-primary: #FFC300;
--adm-color-success: #00b578;
--adm-color-warning: #ff8f1f;
--adm-color-danger: #ff3141;
--adm-color-white: #ffffff;
--adm-color-text: #333333;
--adm-color-text-secondary: #666666;
--adm-color-weak: #999999;
--adm-color-light: #cccccc;
--adm-color-border: #eeeeee;
--adm-color-box: #f5f5f5;
--adm-color-background: #ffffff;
--adm-font-size-main: var(--adm-font-size-5); */
--adm-font-family: -apple-system, blinkmacsystemfont, "Helvetica Neue",
helvetica, segoe ui, arial, roboto, "PingFang SC", "miui",
"Hiragino Sans GB", "Microsoft Yahei", sans-serif;
}
.i-icon {
height: 100%;
}
svg {
height: 100%;
}

View File

@@ -0,0 +1,20 @@
.main-layout {
height: 100%;
.layout-content {
height: 100%;
overflow-y: auto;
// padding-bottom: 150px;
padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/
}
.layout-tab {
flex: 0 0 auto;
position: fixed;
bottom: 0;
width: 100%;
z-index: 1000;
background-color: #fff;
box-shadow: 0 0 3px rgba(0, 0, 0, 0.1);
}
}

View File

@@ -0,0 +1,83 @@
import React from "react";
import { NavBar, SafeArea, TabBar, Toast } from "antd-mobile";
import { useNavigate, useLocation } from "react-router-dom";
import { User, CattleZodiac } from "@icon-park/react";
import "./index.less";
interface MainLayoutProps {
children: React.ReactNode;
isShowNavBar?: boolean;
title?: string;
onLink?: () => void;
}
const MainLayout: React.FC<MainLayoutProps> = ({
isShowNavBar,
children,
onLink,
title,
}) => {
const navigate = useNavigate();
const location = useLocation();
const { pathname } = location;
const [activeKey, setActiveKey] = React.useState(pathname);
const setRouteActive = (value: string) => {
if (value !== "/") {
Toast.show("待开发");
}
};
const tabs = [
{
key: "/",
title: "宠物翻译",
icon: <CattleZodiac />,
},
{
key: "/set",
title: "待办",
icon: <User />,
},
{
key: "/message",
title: "消息",
icon: <User />,
},
{
key: "/me",
title: "我的",
icon: <User size="24" />,
},
];
const goBack = () => {
if (onLink) {
onLink?.();
} else {
navigate(-1);
}
};
return (
<div className="main-layout">
<SafeArea position="top" />
{isShowNavBar ? <NavBar onBack={goBack}>{title}</NavBar> : ""}
<div className="layout-content">{children}</div>
<div className="footer layout-tab">
{/* <TabBar
activeKey={pathname}
onChange={(value) => setRouteActive(value)}
safeArea={true}
>
{tabs.map((item) => (
<TabBar.Item key={item.key} icon={item.icon} title={item.title} />
))}
</TabBar> */}
</div>
</div>
);
};
export default MainLayout;

View File

@@ -0,0 +1,3 @@
{
"index.title": "Hello World!"
}

View File

@@ -0,0 +1,3 @@
{
"index.title": "你好,世界!"
}

View File

@@ -0,0 +1,13 @@
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "@/view/app/App.tsx";
import "./index.css";
ReactDOM.createRoot(document.getElementById("root")!).render(
// <React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
// </React.StrictMode>
);

View File

@@ -0,0 +1,29 @@
import React, {useEffect} from 'react';
import {useNavigate} from 'react-router-dom';
interface AuthRouteProps {
children: React.ReactNode;
auth?: boolean;
}
/**
* 认证路由
* @param children 子组件
* @param auth 是否需要认证
* @constructor 认证路由组件
*/
const AuthRoute: React.FC<AuthRouteProps> = ({children, auth}) => {
const navigate = useNavigate();
const token = localStorage.getItem('token'); // 或者其他认证令牌的获取方式
const isAuthenticated = Boolean(token); // 认证逻辑
useEffect(() => {
if (auth && !isAuthenticated) {
navigate('/login'); // 如果未认证且路由需要认证,则重定向到登录
}
}, [auth, isAuthenticated, navigate]);
return <>{children}</>;
};
export default AuthRoute;

View File

@@ -0,0 +1,27 @@
import {Route, Routes} from 'react-router-dom';
import {routes, AppRoute} from './routes';
import AuthRoute from './auth.tsx';
/**
* 渲染路由
* @constructor RenderRoutes
*/
export const RenderRoutes = () => {
const renderRoutes = (routes: AppRoute[]) => {
return routes.map(route => (
<Route
key={route.path}
path={route.path}
element={
<AuthRoute auth={route.auth}>
{route.element}
</AuthRoute>
}
>
{route.children && renderRoutes(route.children)}
</Route>
));
};
return <Routes>{renderRoutes(routes)}</Routes>;
};

View File

@@ -0,0 +1,19 @@
import React from "react";
import Home from "@/view/home";
import TranslateDetail from "@/view/home/detail";
import Setting from "@/view/setting";
import Page404 from "@/view/error/page404";
export interface AppRoute {
path: string;
element: React.ReactNode;
auth?: boolean;
children?: AppRoute[];
}
export const routes: AppRoute[] = [
{ path: "/", element: <Home />, auth: false },
{ path: "/set", element: <Setting />, auth: false },
{ path: "/detail", element: <TranslateDetail />, auth: false },
{ path: "/mood", element: <Setting />, auth: false },
{ path: "*", element: <Page404 />, auth: false },
];

View File

@@ -0,0 +1,21 @@
import {create} from 'zustand'
import {persist, createJSONStorage} from 'zustand/middleware'
export const LANG_KEY = 'lang'
export const useI18nStore = create<LangStore>()(
persist(
(set, get) => ({
lang: 'en_US',
changeLanguage: (lang) => set({lang}),
toggleLanguage: () => set(() => {
return {
lang: get().lang.includes('zh') ? 'en_US' : 'zh_CN'
}
})
}),
{
name: 'i18n-storage',
storage: createJSONStorage(() => localStorage)
},
),
)

View File

@@ -0,0 +1,22 @@
import {create} from 'zustand'
import {persist, createJSONStorage} from 'zustand/middleware'
export const useUserStore = create<UserState>()(
persist(
(set) => ({
user: {
name: '',
avatar: '',
email: ''
},
setUser: (user: User) => set({user}),
clearUser: () => set({
user: null
}),
}),
{
name: 'user-storage',
storage: createJSONStorage(() => localStorage)
},
),
)

View File

@@ -0,0 +1,41 @@
// types/chat.ts
// types/chat.ts (更新)
export interface VoiceMessage {
id: string;
type: "voice";
content: {
duration: number;
url?: string;
localId?: string;
blob?: Blob;
waveform?: number[];
// 新增上传相关字段
fileId?: string;
fileName?: string;
serverUrl?: string;
uploadStatus?: "uploading" | "success" | "error";
uploadProgress?: number;
};
sender: "user" | "pet";
timestamp: number;
isPlaying?: boolean;
translation?: string;
translating?: boolean;
}
export interface TextMessage {
id: string;
type: "text";
content: string;
sender: "user" | "pet";
timestamp: number;
}
export type ChatMessage = VoiceMessage | TextMessage;
export interface PetProfile {
name: string;
avatar: string;
species: "dog" | "cat" | "bird" | "other";
personality: string;
}

View File

@@ -0,0 +1,14 @@
interface Page<T> {
total: number;
size: number;
current: number;
pages: number;
records: T[];
}
export interface Result<T> {
success: boolean;
code: number;
message: string;
data: T;
}

View File

@@ -0,0 +1,19 @@
interface User {
name: string;
avatar: string;
email: string;
}
interface UserState {
user: User | null;
setUser: (user: User) => void;
clearUser: () => void;
}
type lang = 'zh_CN' | 'en_US'
interface LangStore {
lang: lang;
changeLanguage: (lang: lang) => void
toggleLanguage: () => void
}

View File

@@ -0,0 +1,34 @@
// types/upload.ts
export interface UploadConfig {
url: string;
method?: "POST" | "PUT";
headers?: Record<string, string>;
fieldName?: string;
maxFileSize?: number;
allowedTypes?: string[];
}
export interface UploadProgress {
loaded: number;
total: number;
percentage: number;
}
export interface UploadResponse {
success: boolean;
data?: {
fileId: string;
fileName: string;
fileUrl: string;
duration: number;
size: number;
};
error?: string;
}
export interface VoiceUploadStatus {
status: "idle" | "uploading" | "success" | "error";
progress?: UploadProgress;
response?: UploadResponse;
error?: string;
}

View File

@@ -0,0 +1,3 @@
export function toYuan(num: number) {
return (num / 100).toFixed(2);
}

View File

@@ -0,0 +1,2 @@
export * from './amount';
export * from './location';

View File

@@ -0,0 +1,22 @@
declare module "js-audio-recorder" {
export interface RecorderOptions {
sampleBits?: number;
sampleRate?: number;
numChannels?: number;
compiling?: boolean;
}
export default class Recorder {
constructor(options?: RecorderOptions);
start(): Promise<void>;
pause(): void;
resume(): void;
stop(): void;
getBlob(): Blob;
getWAVBlob(): Blob;
destroy(): void;
duration: number;
fileSize: number;
isrecording: boolean;
}
}

View File

@@ -0,0 +1,3 @@
export function toKm(m: number): number {
return m / 1000;
}

View File

@@ -0,0 +1,164 @@
export const mockTranslateAudio = async (): Promise<string> => {
return new Promise((resolve) => {
setTimeout(() => {
const mockTranslations = [
"汪汪汪!我饿了,想吃东西!🍖",
"喵喵~我想要抱抱!🤗",
"我想出去玩耍!🎾",
"我很开心!😊",
"我有点害怕...😰",
"我想睡觉了~😴",
"主人,陪我玩一会儿吧!🎮",
"我想喝水了💧",
"外面有什么声音?👂",
"我爱你,主人!❤️",
];
const randomTranslation =
mockTranslations[Math.floor(Math.random() * mockTranslations.length)];
resolve(randomTranslation);
}, 2000 + Math.random() * 2000);
});
};
// 创建发送音效 - 清脆的"叮"声
export const createSendSound = () => {
try {
const audioContext = new (window.AudioContext ||
(window as any).webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
// 设置音调 - 清脆的高音
oscillator.frequency.setValueAtTime(800, audioContext.currentTime);
oscillator.frequency.exponentialRampToValueAtTime(
1200,
audioContext.currentTime + 0.1
);
// 设置音量包络
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
gainNode.gain.linearRampToValueAtTime(0.3, audioContext.currentTime + 0.01);
gainNode.gain.exponentialRampToValueAtTime(
0.01,
audioContext.currentTime + 0.3
);
oscillator.type = "sine";
// 创建音频元素
const audio = new Audio();
// 重写play方法来播放合成音效
audio.play = () => {
return new Promise((resolve) => {
try {
const newOscillator = audioContext.createOscillator();
const newGainNode = audioContext.createGain();
newOscillator.connect(newGainNode);
newGainNode.connect(audioContext.destination);
newOscillator.frequency.setValueAtTime(800, audioContext.currentTime);
newOscillator.frequency.exponentialRampToValueAtTime(
1200,
audioContext.currentTime + 0.1
);
newGainNode.gain.setValueAtTime(0, audioContext.currentTime);
newGainNode.gain.linearRampToValueAtTime(
0.3,
audioContext.currentTime + 0.01
);
newGainNode.gain.exponentialRampToValueAtTime(
0.01,
audioContext.currentTime + 0.3
);
newOscillator.type = "sine";
newOscillator.start(audioContext.currentTime);
newOscillator.stop(audioContext.currentTime + 0.3);
setTimeout(() => resolve(undefined), 300);
} catch (error) {
console.error("播放发送音效失败:", error);
resolve(undefined);
}
});
};
return audio;
} catch (error) {
console.error("创建发送音效失败:", error);
return new Audio(); // 返回空音频对象
}
};
export const createStartRecordSound = () => {
try {
const audio = new Audio();
audio.play = () => {
return new Promise((resolve) => {
try {
const audioContext = new (window.AudioContext ||
(window as any).webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
// 设置音调 - 低沉的音
oscillator.frequency.setValueAtTime(400, audioContext.currentTime);
// 设置音量包络
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
gainNode.gain.linearRampToValueAtTime(
0.2,
audioContext.currentTime + 0.05
);
gainNode.gain.linearRampToValueAtTime(
0,
audioContext.currentTime + 0.2
);
oscillator.type = "sine";
oscillator.start(audioContext.currentTime);
oscillator.stop(audioContext.currentTime + 0.2);
setTimeout(() => resolve(undefined), 200);
} catch (error) {
console.error("播放录音音效失败:", error);
resolve(undefined);
}
});
};
return audio;
} catch (error) {
console.error("创建录音音效失败:", error);
return new Audio();
}
};
export const getAudioDuration = async (audioBlob: Blob): Promise<number> => {
return new Promise((resolve, reject) => {
const AudioContextClass =
window.AudioContext || (window as any).webkitAudioContext;
const audioContext = new AudioContextClass();
const fileReader = new FileReader();
fileReader.onload = async (e) => {
try {
const arrayBuffer = e.target?.result as ArrayBuffer;
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
const duration = audioBuffer.duration;
resolve(duration);
} catch (error) {
reject(error);
}
};
fileReader.readAsArrayBuffer(audioBlob);
});
};

View File

@@ -0,0 +1,24 @@
import React from "react";
import { RenderRoutes } from "@/route/render-routes.tsx";
import { axiosInstance } from "@/http/axios-instance.ts";
import { configure } from "axios-hooks";
import enUS from "antd-mobile/es/locales/en-US";
import { ConfigProvider } from "antd-mobile";
import { useI18nStore } from "@/store/i18n.ts";
import zhCN from "antd-mobile/es/locales/zh-CN";
function App() {
configure({
axios: axiosInstance,
});
const i18nStore = useI18nStore();
return (
<>
<ConfigProvider locale={i18nStore.lang === "en_US" ? enUS : zhCN}>
<RenderRoutes />
</ConfigProvider>
</>
);
}
export default App;

View File

@@ -0,0 +1,13 @@
// 档案
import MainLayout from "@/layout/main/mainLayout";
import "./index.less";
function Index() {
return (
<MainLayout isShowNavBar={true}>
<div className="archives"></div>
</MainLayout>
);
}
export default Index;

View File

@@ -0,0 +1,18 @@
import MainLayout from "@/layout/main/mainLayout";
import { Button } from "antd-mobile";
import { useNavigate } from "react-router-dom";
function Index() {
const navigate = useNavigate();
const goHome = () => {
navigate("/");
};
return (
<MainLayout>
<Button onClick={goHome} color="primary">
404
</Button>
</MainLayout>
);
}
export default Index;

View File

@@ -0,0 +1,46 @@
.message {
flex: 1 auto;
overflow-y: auto;
padding: 12px;
.item {
color: rgba(0, 0, 0, 0.45);
font-size: 12px;
display: flex;
gap: 12px;
margin-bottom: 20px;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 40px;
background: #eee;
}
.voice-container {
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
border-radius: 8px;
margin-top: 8px;
padding-right: 12px;
.time {
color: rgba(0, 0, 0, 0.88);
}
.tips {
// align-self: stretch;
// display: grid;
// align-items: center;
color: rgba(0, 0, 0, 0.45);
}
}
.translate {
display: flex;
gap: 12px;
padding: 12px;
align-items: center;
background: rgba(0, 0, 0, 0.02);
border-radius: 8px;
margin-top: 12px;
}
}

View File

@@ -0,0 +1,176 @@
import { useEffect, useRef, useState } from "react";
import { Divider, Image, SpinLoading, Toast } from "antd-mobile";
import { VoiceIcon } from "@workspace/shared";
import dogSvg from "@/assets/translate/dog.svg";
import catSvg from "@/assets/translate/cat.svg";
import pigSvg from "@/assets/translate/pig.svg";
import { Message } from "../../types";
import "./index.less";
interface DefinedProps {
data: Message[];
isRecording: boolean;
}
function Index(props: DefinedProps) {
const { data, isRecording } = props;
const audioRefs = useRef<{ [key: string]: HTMLAudioElement }>({});
const [isPlaying, setIsPlating] = useState(false);
const [currentPlayingId, setCurrentPlayingId] = useState<number>();
useEffect(() => {
if (isRecording) {
stopAllAudio();
}
}, [isRecording]);
const onVoiceChange = () => {
setIsPlating(!isPlaying);
};
const playAudio = (messageId: number, audioUrl: string) => {
if (isRecording) {
Toast.show("录音中,无法播放音频");
return;
}
if (currentPlayingId === messageId) {
if (audioRefs.current[messageId]) {
audioRefs.current[messageId].pause();
audioRefs.current[messageId].currentTime = 0;
}
setCurrentPlayingId(undefined);
setIsPlating(false);
return;
}
stopAllAudio();
if (!audioRefs.current[messageId]) {
audioRefs.current[messageId] = new Audio(audioUrl);
}
const audio = audioRefs.current[messageId];
audio.currentTime = 0;
audio.onended = () => {
setCurrentPlayingId(undefined);
setIsPlating(false);
};
audio.onerror = (error) => {
console.error("音频播放错误:", error);
Toast.show("音频播放失败");
setIsPlating(false);
};
audio
.play()
.then(() => {
setCurrentPlayingId(messageId);
setIsPlating(true);
})
.catch((error) => {
console.error("音频播放失败:", error);
Toast.show("音频播放失败");
});
};
const stopAllAudio = () => {
if (currentPlayingId && audioRefs.current[currentPlayingId]) {
audioRefs.current[currentPlayingId].pause();
audioRefs.current[currentPlayingId].currentTime = 0;
setIsPlating(false);
setCurrentPlayingId(undefined);
}
Object.values(audioRefs.current).forEach((audio) => {
if (!audio.paused) {
audio.pause();
audio.currentTime = 0;
}
});
};
const renderAvatar = (type?: "pig" | "cat" | "dog") => {
if (type === "pig") {
<Image
src={pigSvg}
width={40}
height={40}
fit="cover"
style={{ borderRadius: 32 }}
/>;
}
if (type === "cat") {
return (
<Image
src={catSvg}
width={40}
height={40}
fit="cover"
style={{ borderRadius: 32 }}
/>
);
}
return (
<Image
src={dogSvg}
width={40}
height={40}
fit="cover"
style={{ borderRadius: 32 }}
/>
);
};
return (
<div className="message">
{data.map((item, index) => (
<div
className="item"
key={index}
onClick={() => playAudio(item.id, item.audioUrl)}
>
{renderAvatar(item.type)}
<div className="rig">
<div>
<span className="name">{item.name}</span>
<Divider direction="vertical" style={{ margin: "0px 8px" }} />
<span className="">{item.timestamp}</span>
</div>
<div className="voice-container">
<VoiceIcon
onChange={onVoiceChange}
isPlaying={isPlaying && currentPlayingId === item.id}
/>
<div className="time">{item.duration}''</div>
</div>
{item.isTranslating ? (
<div className="translate">
<SpinLoading color="default" style={{ "--size": "12px" }} />
<span>...</span>
</div>
) : (
<div className="translate">{item.translatedText}</div>
)}
</div>
</div>
))}
<div className="item">
<div className="avatar"></div>
<div className="rig">
<div>
<span className="name"></span>
<Divider direction="vertical" style={{ margin: "0px 8px" }} />
<span className="">15:00</span>
</div>
<div className="voice-container">
<VoiceIcon isPlaying={false} />
<div className="tips">
{isRecording ? "录制中..." : "轻点麦克风录制"}
</div>
</div>
</div>
</div>
</div>
);
}
export default Index;

View File

@@ -0,0 +1,22 @@
.search {
display: flex;
gap: 12px;
width: 100%;
.adm-search-bar-input-box-icon {
display: flex;
align-items: center;
}
.adm-search-bar {
flex: 1 auto;
}
.all {
height: 34px !important;
background: var(--adm-color-fill-content);
border-radius: 6px;
padding: 0px 12px;
display: flex;
align-items: center;
color: rgba(0, 0, 0, 0.88);
gap: 6px;
}
}

View File

@@ -0,0 +1,87 @@
import { DownOne } from "@icon-park/react";
import {
ActionSheet,
Dropdown,
type DropdownRef,
Popup,
Radio,
SearchBar,
Space,
} from "antd-mobile";
import { RadioValue } from "antd-mobile/es/components/radio";
import { useRef, useState } from "react";
interface PropsConfig {
handleAllAni: () => void;
}
const allAni = ["全部宠物", "丑丑", "胖胖", "可可"];
function Index(props: PropsConfig) {
const [aniName, setAniName] = useState<string>("全部宠物");
const animenuRef = useRef<DropdownRef>(null);
const handleAniSelect = (val: RadioValue) => {
setAniName(allAni[val as number]);
animenuRef.current?.close();
};
return (
<div className="search">
<SearchBar
placeholder="请输入翻译内容"
style={{
"--border-radius": "6px",
"--height": "32px",
"--padding-left": "12px",
}}
/>
<Dropdown className="all" ref={animenuRef}>
<Dropdown.Item key="ani" title={aniName}>
<div style={{ padding: 12 }}>
<Radio.Group defaultValue="default" onChange={handleAniSelect}>
<Space direction="vertical" block>
<Radio block value="0">
</Radio>
<Radio block value="1">
</Radio>
<Radio block value="2">
</Radio>
<Radio block value="3">
</Radio>
</Space>
</Radio.Group>
</div>
</Dropdown.Item>
</Dropdown>
{/* <div className="all" onClick={handleAllAni}>
<span>全部宠物</span>
<DownOne
theme="filled"
size="16"
strokeWidth={3}
strokeLinecap="butt"
/>
</div>
<ActionSheet
visible={visible}
actions={actions}
onClose={() => setVisible(false)}
/> */}
{/* <Popup
visible={visible}
onClose={() => {
setVisible(false);
}}
>
<div className="popup-head">
<span>宠物</span>
</div>
11111
</Popup> */}
</div>
);
}
export default Index;

View File

@@ -0,0 +1,54 @@
.voice-record {
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 12px 0px;
box-shadow: 1px 2px 4px 3px #eee;
.adm-progress-circle-info {
height: 32px;
}
.isRecording {
.adm-progress-circle {
border-radius: 50%;
animation: recordingButtonPulse 1s infinite;
}
}
.tips {
color: #9f9f9f;
}
.circle {
display: inline-block;
width: 32px;
height: 32px;
border-radius: 8px;
background: rgba(22, 119, 255, 1);
}
.cancleBtn {
position: absolute;
border: 2px solid rgba(230, 244, 255, 1);
width: 72px;
height: 72px;
right: 60px;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
}
@keyframes recordingButtonPulse {
0% {
box-shadow: 0 0 0 0 rgba(22, 119, 255, 0.5);
}
30% {
box-shadow: 0 0 0 14px rgba(255, 77, 79, 0);
}
70% {
box-shadow: 0 0 0 14px rgba(255, 77, 79, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(22, 119, 255, 0.5);
}
}
}

View File

@@ -0,0 +1,277 @@
import React, { useCallback, useEffect, useRef, useState } from "react";
import { AudioRecorder, useAudioRecorder } from "react-audio-voice-recorder";
import { Button, Dialog, Image, ProgressCircle, Toast } from "antd-mobile";
import microphoneSvg from "@/assets/translate/microphone.svg";
import microphoneDisabledSvg from "@/assets/translate/microphoneDisabledSvg.svg";
import { createStartRecordSound, createSendSound } from "@/utils/voice";
import "./index.less";
import { Message } from "../../types";
import { CloseCircleOutline } from "antd-mobile-icons";
interface DefinedProps {
onRecordingComplete: (url: string, finalDuration: number) => void;
isRecording: boolean;
onSetIsRecording: (flag: boolean) => void;
}
function Index(props: DefinedProps) {
const { isRecording } = props;
const [hasPermission, setHasPermission] = useState<boolean>(false); //是否有权限
const [isPermissioning, setIsPermissioning] = useState<boolean>(true); //获取权限中
const [recordingDuration, setRecordingDuration] = useState<number>(0); //录音时长进度
const [isModal, setIsModal] = useState<boolean>(false);
const recordingTimerRef = useRef<NodeJS.Timeout>();
const isCancelledRef = useRef(false);
const recordingStartTimeRef = useRef<number>(0); //录音时长
// 音效相关
const sendSoundRef = useRef<HTMLAudioElement | null>(null);
const startRecordSoundRef = useRef<HTMLAudioElement | null>(null);
useEffect(() => {
initializeSounds();
checkMicrophonePermission();
}, [hasPermission]);
useEffect(() => {
if (isRecording) {
recorderControls.startRecording();
} else {
}
}, [isRecording]);
//重置状态
const onResetRecordingState = () => {
props.onSetIsRecording(false);
setRecordingDuration(0);
recordingStartTimeRef.current = 0;
if (recordingTimerRef.current) {
clearInterval(recordingTimerRef.current);
recordingTimerRef.current = undefined;
}
};
const initializeSounds = () => {
try {
// 发送音效 - 使用Web Audio API生成
sendSoundRef.current = createSendSound();
// 开始录音音效
startRecordSoundRef.current = createStartRecordSound();
console.log("音效初始化完成");
} catch (error) {
console.error("音效初始化失败:", error);
}
};
const renderBtn = useCallback(() => {
if (!hasPermission) {
//没有权限
return (
<>
<Image height={80} width={80} src={microphoneDisabledSvg} />
{isPermissioning ? (
<div className="tips">...</div>
) : (
<div className="tips"></div>
)}
</>
);
}
if (isRecording) {
//正在录音中
return (
<div onClick={onStopRecording} className="isRecording">
<ProgressCircle
percent={recordingDuration}
style={{ "--size": "80px" }}
>
<div className="recording-dot">
<span className="circle"></span>
</div>
</ProgressCircle>
<Button fill="none" onClick={cancelRecording} className="cancleBtn">
</Button>
</div>
);
} else {
//麦克风状态
return (
<Image
height={80}
width={80}
src={microphoneSvg}
onClick={onStartRecording}
/>
);
}
}, [hasPermission, isRecording, recordingDuration]);
const checkMicrophonePermission = useCallback(async () => {
try {
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
setHasPermission(false);
setIsPermissioning(false);
Toast.show("浏览器不支持录音功能");
return false;
}
if (navigator.permissions && navigator.permissions.query) {
try {
const permissionStatus = await navigator.permissions.query({
name: "microphone" as PermissionName,
});
if (permissionStatus.state === "denied") {
setHasPermission(false);
setIsPermissioning(false);
setIsModal(true);
return false;
}
if (permissionStatus.state === "granted") {
setHasPermission(true);
setIsModal(false);
return true;
}
} catch (permError) {
console.log("权限查询不支持继续使用getUserMedia检查");
}
}
const stream = await navigator.mediaDevices.getUserMedia({
audio: {
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true,
},
});
stream.getTracks().forEach((track) => track.stop());
setHasPermission(true);
return true;
} catch (error: any) {
if (error.message.includes("user denied permission")) {
setIsModal(true);
}
setHasPermission(false);
return false;
}
}, []);
useEffect(() => {
if (isModal) {
Dialog.confirm({
content: "重新获取麦克风权限",
onConfirm: async () => {
setIsModal(true);
await navigator.mediaDevices.getUserMedia({
audio: {
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true,
},
});
setHasPermission(true);
},
});
}
}, [isModal]);
const recorderControls = useAudioRecorder(
{
noiseSuppression: true,
echoCancellation: true,
autoGainControl: true,
},
(err) => {
console.error("录音错误:", err);
Toast.show("录音失败,请重试");
onResetRecordingState();
}
);
// 播放音效
const playSound = async (soundRef: React.RefObject<HTMLAudioElement>) => {
try {
if (soundRef.current) {
await soundRef.current.play();
}
} catch (error: any) {
Toast.show(`播放音效失败:${error.message}`);
}
};
//开始录音
const onStartRecording = () => {
isCancelledRef.current = false;
if (recordingTimerRef.current) {
clearInterval(recordingTimerRef.current);
recordingTimerRef.current = undefined;
}
props.onSetIsRecording(true);
// recorderControls.startRecording();
recordingStartTimeRef.current = Date.now();
// 立即开始计时
recordingTimerRef.current = setInterval(() => {
setRecordingDuration((prev) => prev + 1);
}, 1000);
};
const onStopRecording = useCallback(() => {
recorderControls.stopRecording();
onResetRecordingState();
}, [recorderControls, recordingDuration]);
//录音完成
// 在发送时检查录音时长
const onRecordingComplete = useCallback(
(blob: Blob) => {
if (isCancelledRef.current) {
Toast.show("已取消");
return;
}
// 检查blob有效性
if (!blob || blob.size === 0) {
Toast.show("录音数据无效,请重新录音");
return;
}
const audioUrl = URL.createObjectURL(blob);
const audio = new Audio();
audio.src = audioUrl;
// 计算实际录音时长
audio.addEventListener("loadedmetadata", () => {
if (audio.duration < 1) {
Toast.show("录音时间太短,请重新录音");
return;
}
alert(audio.duration);
playSound(sendSoundRef);
props.onRecordingComplete?.(audioUrl, Math.floor(audio.duration));
});
},
[isCancelledRef, isRecording, sendSoundRef]
);
const cancelRecording = useCallback(() => {
isCancelledRef.current = true;
recorderControls.stopRecording();
onResetRecordingState();
}, []);
return (
<>
<AudioRecorder
onRecordingComplete={onRecordingComplete}
recorderControls={recorderControls}
audioTrackConstraints={{
noiseSuppression: true,
echoCancellation: true,
autoGainControl: true,
}}
showVisualizer={false}
/>
<div className={` voice-record`}>{renderBtn()}</div>
</>
);
}
export default React.memo(Index);

View File

@@ -0,0 +1,5 @@
function Index() {
return <div className="translate-detail"></div>;
}
export default Index;

View File

@@ -0,0 +1,39 @@
.home {
height: 100%;
overflow: hidden;
.adm-tabs {
display: flex;
flex-direction: column;
height: 100%;
}
.adm-tabs-content {
flex: 1;
overflow: hidden;
padding: 0px;
}
.adm-tabs-header {
border: 0 none;
position: sticky;
top: 0px;
background: #fff;
z-index: 99;
}
.adm-tabs-tab {
font-size: 20px;
color: rgba(0, 0, 0, 0.25);
font-weight: 600;
&.adm-tabs-tab-active {
color: #000;
}
}
.adm-tabs-tab-line {
height: 0px;
}
.translate-container {
display: flex;
flex-direction: column;
height: 100%;
}
}

View File

@@ -0,0 +1,31 @@
import MainLayout from "@/layout/main/mainLayout";
import { Button, Tabs } from "antd-mobile";
import Translate from "./translate";
import "./index.less";
function Index() {
const handleRecordComplete = (audioData: AudioData): void => {
console.log("录音完成:", audioData);
};
const handleError = (error: Error): void => {
console.error("录音错误:", error);
};
return (
<MainLayout>
<div className="home">
<Tabs stretch={false}>
<Tabs.Tab title="宠物翻译" key="1">
<Translate />
</Tabs.Tab>
<Tabs.Tab title="宠物档案" key="2">
2
</Tabs.Tab>
</Tabs>
</div>
</MainLayout>
);
}
export default Index;

View File

@@ -0,0 +1,157 @@
import { useCallback, useEffect, useState } from "react";
import { Image, Toast } from "antd-mobile";
import MessageCom from "./component/message";
import VoiceRecord from "./component/voice";
import {
XPopup,
FloatingMenu,
type FloatMenuItemConfig,
} from "@workspace/shared";
import type { Message } from "./types";
import { mockTranslateAudio } from "@/utils/voice";
import dogSvg from "@/assets/translate/dog.svg";
import catSvg from "@/assets/translate/cat.svg";
import pigSvg from "@/assets/translate/pig.svg";
import { MoreTwo } from "@icon-park/react";
interface DefinedProps {}
const menuItems: FloatMenuItemConfig[] = [
{ icon: <Image src={dogSvg} />, type: "dog" },
{ icon: <Image src={catSvg} />, type: "cat" },
{ icon: <Image src={pigSvg} />, type: "pig" },
{
icon: (
<MoreTwo
theme="outline"
size="24"
fill="#666"
strokeWidth={3}
strokeLinecap="butt"
/>
),
type: "add",
},
];
function Index(props: DefinedProps) {
// const data: Message[] = [
// {
// id: 1,
// audioUrl: "",
// duration: 0,
// translatedText: "",
// isTranslating: true,
// isPlaying: false,
// timestamp: 0,
// },
// ];
const [currentPlayingId, setCurrentPlayingId] = useState<string | null>(null); //当前播放id
const [messages, setMessages] = useState<Message[]>([]);
const [isRecording, setIsRecording] = useState(false); //是否录音中
const [currentLanguage, setCurrentLanguage] = useState<FloatMenuItemConfig>();
const [visible, setVisible] = useState<boolean>(false);
useEffect(() => {
setCurrentLanguage(menuItems[0]);
}, []);
//完成录音
const onRecordingComplete = useCallback(
(audioUrl: string, actualDuration: number) => {
const newMessage: Message = {
id: Date.now(),
type: "dog",
audioUrl,
name: "生无可恋喵",
duration: actualDuration,
timestamp: Date.now(),
isTranslating: true,
};
setMessages((prev) => [...prev, newMessage]);
setTimeout(() => {
onTranslateAudio(newMessage.id);
}, 1000);
Toast.show("语音已发送");
},
[messages]
);
//翻译
const onTranslateAudio = useCallback(
async (messageId: number) => {
try {
const translatedText = await mockTranslateAudio();
setMessages((prev) =>
prev.map((msg) =>
msg.id === messageId
? { ...msg, translatedText, isTranslating: false }
: msg
)
);
} catch (error) {
console.error("翻译失败:", error);
Toast.show("翻译失败,请重试");
setMessages((prev) =>
prev.map((msg) =>
msg.id === messageId
? {
...msg,
isTranslating: false,
translatedText: "翻译失败,请重试",
}
: msg
)
);
}
},
[messages]
);
const onSetIsRecording = (flag: boolean) => {
setIsRecording(flag);
};
const onLanguage = (item: FloatMenuItemConfig) => {
if (item.type === "add") {
setVisible(true);
} else {
setCurrentLanguage(item);
}
};
return (
<div className="translate-container">
<MessageCom data={messages} isRecording={isRecording}></MessageCom>
<VoiceRecord
onRecordingComplete={onRecordingComplete}
isRecording={isRecording}
onSetIsRecording={onSetIsRecording}
/>
<FloatingMenu
menuItems={menuItems}
value={currentLanguage}
onChange={onLanguage}
/>
<XPopup
title="选择翻译语种"
visible={visible}
onClose={() => {
setVisible(false);
}}
>
<div className="card">
<span></span>
<div></div>
</div>
<div className="card">
<span></span>
</div>
</XPopup>
</div>
);
}
export default Index;

View File

@@ -0,0 +1,12 @@
export interface Message {
id: number;
type?: "dog" | "cat" | "pig";
audioUrl: string;
name: string; //名字
duration: number; //时长
timestamp: number; //时间
translatedText?: string;
isTranslating?: boolean;
avatar?: string;
isPlaying?: boolean;
}

View File

@@ -0,0 +1,13 @@
import useI18n from "@/hooks/i18n.ts";
import MainLayout from "@/layout/main/mainLayout";
import { Button } from "antd-mobile";
import { useI18nStore } from "@/store/i18n.ts";
function Index() {
const t = useI18n();
const i18nStore = useI18nStore();
return <MainLayout>qq</MainLayout>;
}
export default Index;

View File

@@ -0,0 +1,9 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_BASE_URL: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

View File

@@ -0,0 +1,30 @@
{
// "extends": "../../tsconfig.json",
"compilerOptions": {
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": "./",
"paths": {
"@/*": ["src/*"],
"@shared/*": ["packages/shared/src/*"],
"@utils/*": ["packages/utils/src/*"],
"@hooks/*": ["packages/hooks/src/*"]
}
},
"include": ["src", "../../packages/shared/src", "../../packages/utils/src"]
}

View File

@@ -0,0 +1,11 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"],
"exclude": ["node_modules"]
}

View File

@@ -0,0 +1,25 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
import path from "path";
import basicSsl from "@vitejs/plugin-basic-ssl";
export default defineConfig({
// plugins: [react()],
plugins: [react(), basicSsl()],
server: {
https: {},
port: 3000,
host: "0.0.0.0",
open: true,
},
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
"@shared": path.resolve(__dirname, "../../packages/shared/src"),
"@hooks": path.resolve(__dirname, "../../packages/hooks/src"),
"@utils": path.resolve(__dirname, "../../packages/utils/src"),
},
},
optimizeDeps: {
include: ["@shared", "@hooks", "@utils"],
},
});

View File

@@ -9,9 +9,7 @@ import {
CheckOutline,
} from "antd-mobile-icons";
import { createPortal } from "react-dom";
import dogSvg from "@/assets/translate/dog.svg";
import catSvg from "@/assets/translate/cat.svg";
import pigSvg from "@/assets/translate/pig.svg";
import "./index.less";
import { MoreTwo } from "@icon-park/react";

View File

@@ -1,55 +0,0 @@
// hooks/useAudioControl.ts
import { useEffect, useState } from "react";
import AudioManager from "../utils/audioManager";
interface UseAudioControlReturn {
currentPlayingId: string | null;
stopAllAudio: () => void;
pauseAllAudio: () => void;
getAudioStates: () => Record<
string,
{
isPlaying: boolean;
duration: number;
currentTime: number;
}
>;
}
export const useAudioControl = (): UseAudioControlReturn => {
const [currentPlayingId, setCurrentPlayingId] = useState<string | null>(null);
const audioManager = AudioManager.getInstance();
useEffect(() => {
// 定期检查当前播放状态
const interval = setInterval(() => {
const currentId = audioManager.getCurrentAudioId();
setCurrentPlayingId(currentId);
}, 500);
return () => {
clearInterval(interval);
};
}, [audioManager]);
const stopAllAudio = () => {
audioManager.stopCurrent();
setCurrentPlayingId(null);
};
const pauseAllAudio = () => {
audioManager.pauseCurrent();
setCurrentPlayingId(null);
};
const getAudioStates = () => {
return audioManager.getAudioStates();
};
return {
currentPlayingId,
stopAllAudio,
pauseAllAudio,
getAudioStates,
};
};

View File

@@ -1,153 +0,0 @@
// hooks/usePetTranslator.ts
import { useState, useCallback } from "react";
import { VoiceMessage, ChatMessage, PetProfile } from "../types/chat";
interface UsePetTranslatorReturn {
messages: ChatMessage[];
currentPet: PetProfile;
translateVoice: (voiceMessage: VoiceMessage) => Promise<void>;
addMessage: (message: ChatMessage) => void;
updateMessage: (messageId: string, updatedMessage: ChatMessage) => void; // 新增
clearMessages: () => void;
setPet: (pet: PetProfile) => void;
}
export const usePetTranslator = (): UsePetTranslatorReturn => {
const [messages, setMessages] = useState<ChatMessage[]>([]);
const [currentPet, setCurrentPet] = useState<PetProfile>({
name: "小汪",
avatar: "🐕",
species: "dog",
personality: "活泼可爱",
});
// 模拟翻译API调用
const translateVoice = useCallback(
async (voiceMessage: VoiceMessage): Promise<void> => {
// 更新消息状态为翻译中
setMessages((prev) =>
prev.map((msg) =>
msg.id === voiceMessage.id ? { ...msg, translating: true } : msg
)
);
try {
// 模拟API调用延迟
await new Promise((resolve) => setTimeout(resolve, 2000));
// 模拟翻译结果
const translations = {
dog: [
"主人,我饿了!给我点好吃的吧!🍖",
"我想出去玩耍!带我去公园吧!🏃‍♂️",
"我爱你,主人!你是最好的!❤️",
"我想睡觉了,陪我一起休息吧!😴",
"有陌生人!我要保护你!🛡️",
"今天天气真好,我们去散步吧!🌞",
"我想和其他狗狗玩耍!🐕‍🦺",
"主人回来了!我好开心!🎉",
],
cat: [
"铲屎官,快来伺候本喵!😼",
"我要晒太阳,别打扰我!☀️",
"给我准备小鱼干!现在就要!🐟",
"我心情不好,离我远点!😾",
"勉强让你摸摸我的头吧!😸",
"这个位置是我的,你不能坐!🛋️",
"我饿了,但我不会告诉你的!🙄",
"今天我心情好,可以陪你玩一会!😺",
],
bird: [
"早上好!新的一天开始了!🌅",
"我想唱歌给你听!🎵",
"给我一些种子吧!我饿了!🌱",
"外面的世界真美好!🌳",
"我想和你一起飞翔!🕊️",
"今天的阳光真温暖!☀️",
"我学会了新的歌曲!🎶",
"陪我聊聊天吧!💬",
],
other: [
"我想和你交流!👋",
"照顾好我哦!💕",
"我很开心!😊",
"陪我玩一会儿吧!🎾",
"我需要你的关爱!🤗",
"今天过得真愉快!😄",
"我想要你的注意!👀",
"我们是最好的朋友!🤝",
],
};
const speciesTranslations =
translations[currentPet.species] || translations.other;
const randomTranslation =
speciesTranslations[
Math.floor(Math.random() * speciesTranslations.length)
];
// 更新翻译结果
setMessages((prev) =>
prev.map((msg) =>
msg.id === voiceMessage.id
? { ...msg, translation: randomTranslation, translating: false }
: msg
)
);
// 添加宠物回复
const petReply: ChatMessage = {
id: `pet_${Date.now()}`,
type: "text",
content: `${currentPet.name}说:${randomTranslation}`,
sender: "pet",
timestamp: Date.now(),
};
setMessages((prev) => [...prev, petReply]);
} catch (error) {
console.error("翻译失败:", error);
setMessages((prev) =>
prev.map((msg) =>
msg.id === voiceMessage.id
? { ...msg, translation: "翻译失败,请重试", translating: false }
: msg
)
);
}
},
[currentPet]
);
const addMessage = useCallback((message: ChatMessage): void => {
setMessages((prev) => [...prev, message]);
}, []);
// 新增:更新消息方法
const updateMessage = useCallback(
(messageId: string, updatedMessage: ChatMessage): void => {
setMessages((prev) =>
prev.map((msg) => (msg.id === messageId ? updatedMessage : msg))
);
},
[]
);
const clearMessages = useCallback((): void => {
setMessages([]);
}, []);
const setPet = useCallback((pet: PetProfile): void => {
setCurrentPet(pet);
}, []);
return {
messages,
currentPet,
translateVoice,
addMessage,
updateMessage, // 导出新方法
clearMessages,
setPet,
};
};

View File

@@ -1,125 +0,0 @@
// hooks/useVoiceRecorder.ts (使用新的录音工具类)
import { useState, useRef, useCallback } from "react";
import { UniversalAudioRecorder } from "../utils/audioRecorder";
interface UseVoiceRecorderReturn {
isRecording: boolean;
recordingTime: number;
isPaused: boolean;
startRecording: () => Promise<void>;
stopRecording: () => Promise<Blob | null>;
pauseRecording: () => void;
resumeRecording: () => void;
cancelRecording: () => void;
}
export const useVoiceRecorder = (): UseVoiceRecorderReturn => {
const [isRecording, setIsRecording] = useState(false);
const [isPaused, setIsPaused] = useState(false);
const [recordingTime, setRecordingTime] = useState(0);
const recorderRef = useRef<UniversalAudioRecorder | null>(null);
const timerRef = useRef<NodeJS.Timeout | null>(null);
const startTimer = useCallback(() => {
timerRef.current = setInterval(() => {
if (recorderRef.current) {
setRecordingTime(recorderRef.current.getDuration());
}
}, 100);
}, []);
const stopTimer = useCallback(() => {
if (timerRef.current) {
clearInterval(timerRef.current);
timerRef.current = null;
}
}, []);
const startRecording = useCallback(async (): Promise<void> => {
try {
const recorder = new UniversalAudioRecorder({
sampleRate: 16000,
channels: 1,
bitDepth: 16,
});
await recorder.start();
recorderRef.current = recorder;
setIsRecording(true);
setIsPaused(false);
setRecordingTime(0);
startTimer();
} catch (error) {
console.error("录音启动失败:", error);
throw error;
}
}, [startTimer]);
const stopRecording = useCallback(async (): Promise<Blob | null> => {
if (!recorderRef.current || !isRecording) return null;
try {
const audioBlob = await recorderRef.current.stop();
setIsRecording(false);
setIsPaused(false);
setRecordingTime(0);
stopTimer();
recorderRef.current = null;
return audioBlob;
} catch (error) {
console.error("录音停止失败:", error);
return null;
}
}, [isRecording, stopTimer]);
const pauseRecording = useCallback((): void => {
if (!recorderRef.current || !isRecording || isPaused) return;
try {
recorderRef.current.pause();
setIsPaused(true);
stopTimer();
} catch (error) {
console.error("录音暂停失败:", error);
}
}, [isRecording, isPaused, stopTimer]);
const resumeRecording = useCallback((): void => {
if (!recorderRef.current || !isRecording || !isPaused) return;
try {
recorderRef.current.resume();
setIsPaused(false);
startTimer();
} catch (error) {
console.error("录音恢复失败:", error);
}
}, [isRecording, isPaused, startTimer]);
const cancelRecording = useCallback((): void => {
if (recorderRef.current) {
recorderRef.current.cancel();
recorderRef.current = null;
}
setIsRecording(false);
setIsPaused(false);
setRecordingTime(0);
stopTimer();
}, [stopTimer]);
return {
isRecording,
recordingTime,
isPaused,
startRecording,
stopRecording,
pauseRecording,
resumeRecording,
cancelRecording,
};
};

View File

@@ -7,7 +7,6 @@ import {
User,
CattleZodiac,
} from "@icon-park/react";
import useI18n from "@/hooks/i18n.ts";
import "./index.less";
interface MainLayoutProps {

View File

@@ -1,30 +1,29 @@
{
"compilerOptions": {
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
// "jsx": "react",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": "./",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
"@/*": ["src/*"],
"@workspace/shared": ["packages/shared/src/index.ts"],
"@workspace/shared/*": ["packages/shared/src/*"],
"@workspace/utils": ["packages/utils/src/index.ts"],
"@workspace/utils/*": ["packages/utils/src/*"]
}
}
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}

View File

@@ -6,5 +6,6 @@
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
"include": ["vite.config.ts"],
"exclude": ["dist", "node_modules"]
}