chore: import WonderQ project

This commit is contained in:
duanshuwen
2026-08-11 19:19:11 +08:00
commit f5a9e4403a
452 changed files with 34173 additions and 0 deletions

21
.gitignore vendored Normal file
View File

@@ -0,0 +1,21 @@
node_modules/
dist/
apps/*/dist/
.env
.env.local
**/.venv/
**/.pytest_cache/
**/__pycache__/
*.pyc
*.sqlite
*.db
*.pem
*.key
.DS_Store
*.log
coverage/
.prisma/
artifacts/
task_plan.md
progress.md
findings.md

376
AGENTS.md Normal file
View File

@@ -0,0 +1,376 @@
# AGENTS.md
本文档用于约束 AI 代理参与 WonderQ 项目开发时的行为、边界和验证方式。适用于 Codex、ChatGPT、Cursor、Claude Code 等 AI 工具。
项目层规则优先于通用规则;进入某个子项目工作时,优先遵守该子项目技术栈、接口契约和锁定边界。
## 1. 全局协作规则
- 默认全程使用中文回答;用户明确要求其他语言时才切换。
- 回答简洁直接,不做无效铺垫,不输出与任务无关的说明。
- 需求不清晰、影响范围不明或涉及高风险文件时,先提问确认,不自行猜测执行。
- 默认只读优先。创建、修改、删除文件必须先获得用户明确授权。
- 严格按当前需求工作,不额外加功能、不扩大改动范围。
- 修改前先阅读目标文件、相邻实现、相关类型和契约文档;修改后检查变更内容,并按影响范围运行验证。
- 保留工作区里的用户改动,不使用 `git reset``git checkout --`、批量删除或覆盖无关文件。
- 不读取、展示、复述或提交 `.env``.env.local`、生产环境变量、Token、密码、密钥、真实客服链接、企业 ID、客户手机号等敏感信息。
- 文档、示例和测试只能使用占位值,不写入真实账号、密钥、联系方式或生产配置。
- 用户提到产品设计时,优先考虑 `product design`
- 用户提出“调整视觉 UI”“视觉不好看”“美化界面”“优化视觉”“界面更好看”等需求时优先考虑 `ui-ux-pro-max`,并结合项目现有设计系统落地。
## 2. 项目定位
WonderQ 是三端分离的旅行产品项目集合,当前由三个独立子项目组成:
- `WonderQ-MiniAPP`:万趣旅行移动端前台,面向 H5 与微信小程序,技术栈为 uni-app、Vue 3、TypeScript、TailwindCSS。
- `WonderQ-Admin-UI`:后台管理前端,用于维护首页结构、目的地、线路商品、活动入口、页面模块和客户需求线索,技术栈为 Vite、React、TypeScript、Tailwind CSS 4、shadcn/ui 风格组件。
- `WonderQ-Admin`:后端 API 服务,为 MiniAPP 提供 Public API为后台管理端提供 Admin API技术栈为 Python、FastAPI、SQLAlchemy 2、Alembic、PostgreSQL、JWT、Pydantic。
核心开发原则是页面驱动开发:业务围绕 MiniAPP/H5 前台页面和运营配置场景展开后台负责配置页面数据后端负责业务逻辑、鉴权、数据持久化和接口MiniAPP 负责展示与交互。
## 3. 根目录结构
```text
WonderQ-Project/
├─ AGENTS.md
├─ README.md
├─ docs/
│ ├─ README.md
│ ├─ integration-workflow.md
│ ├─ development-status.md
│ ├─ decisions.md
│ ├─ backend-api-service.md
│ ├─ backend-plan.md
│ ├─ admin-api-requirements.md
│ ├─ module-config-api.md
│ └─ public-api.md
├─ WonderQ-MiniAPP/
├─ WonderQ-Admin-UI/
└─ WonderQ-Admin/
```
## 4. 文档入口与权威来源
- `docs/README.md` 是当前文档索引。
- `docs/integration-workflow.md` 定义三端本地启动、联调顺序、接口变更流程和验证命令。
- `docs/development-status.md` 记录三端能力对接状态,不替代实际测试结果。
- `docs/decisions.md` 记录当前有效技术和文档决策。
- `docs/public-api.md` 是 MiniAPP 对接后端的唯一 Public API 契约。
- `docs/admin-api-requirements.md` 是 Admin UI 对接后端的主契约。
- `docs/module-config-api.md` 是页面模块配置 CRUD 的唯一细节契约。
- `docs/backend-api-service.md``docs/backend-plan.md` 约束后端运行、联调、部署和规划边界。
接口、字段、状态码或模块规则发生变化时,先更新对应契约文档,再改后端和前端实现。
## 5. 页面驱动开发流程
本项目采用页面驱动开发Page Driven Development先从 MiniAPP/H5 前台页面和运营配置场景定义需求,再推进数据模型、后端 API、后台管理和前台实现。
新增或重构面向用户的页面、模块或运营能力时,按以下顺序推进:
1. 明确前台页面目标:用户角色、页面流程、展示模块、交互方式、空态、错误态和边界情况。
2. 明确数据归属:哪些字段来自 Public API哪些字段由 Admin API 维护,哪些仅为本地兜底内容。
3. 更新契约文档Public API 改 `public-api.md`Admin API 改 `admin-api-requirements.md`,页面模块 CRUD 改 `module-config-api.md`
4. 设计后端数据与接口数据库模型、迁移、Pydantic schema、鉴权、审计、参数校验和错误响应。
5. 实现后端 API保持现有路径和响应结构兼容不随意破坏 MiniAPP 与 Admin UI 调用。
6. 实现后台管理:围绕运营配置页面组织菜单和表单,不按数据库表名机械拆菜单。
7. 实现 MiniAPP 展示:调用 Public API处理 loading、empty、error、retry、分页/刷新和本地兜底。
8. 运行三端验证按变更范围执行后端测试、前端构建、MiniAPP 构建和必要的浏览器/小程序验证。
小型修复、纯文档整理、单端 UI 调整不强制输出完整八步,但不能跳过与当前任务相关的契约、安全和验证检查。
## 6. 三端模块分工
### WonderQ-MiniAPP
```text
WonderQ-MiniAPP/
├─ index.html
├─ package.json
├─ tsconfig.json
├─ tailwind.config.ts
├─ vitest.config.ts
├─ vite.config.ts
├─ src/
│ ├─ main.ts
│ ├─ App.vue
│ ├─ app.css
│ ├─ manifest.json
│ ├─ pages.json
│ ├─ content.ts
│ ├─ generated-products.json
│ ├─ components/
│ ├─ lib/
│ └─ pages/
├─ tests/
├─ public/assets/
└─ scripts/
```
- `src/pages/`:首页、目的地、搜索、活动、需求、权益、预订、详情和我的页面。
- `src/components/`:复用 Vue SFC 组件,如顶部栏、底部导航、产品卡、客服弹层、空状态和留资表单。
- `src/lib/api.ts`Public API 客户端与类型定义,访问 `/api/public/site-config``/api/public/products``/api/public/leads`
- `src/lib/data.ts``src/lib/store.ts``src/lib/navigation.ts``src/lib/support.ts`:业务数据归一化、共享状态、页面跳转和客服联系封装。
- `src/content.ts``src/generated-products.json`:前台静态兜底内容与产品数据。
- `public/assets/`:前台图片资源。
### WonderQ-Admin-UI
```text
WonderQ-Admin-UI/
├─ README.md
├─ components.json
├─ public/assets/
├─ src/
│ ├─ App.tsx
│ ├─ api.ts
│ ├─ components/ui/
│ ├─ lib/
│ ├─ pages/
│ ├─ main.tsx
│ ├─ styles.css
│ └─ vite-env.d.ts
├─ index.html
├─ package.json
├─ tsconfig.json
├─ vite.config.ts
└─ yarn.lock
```
- `src/App.tsx`:后台应用壳、登录态、侧边导航和全局布局。
- `src/api.ts`Admin API 类型、Token 管理、鉴权头和请求封装。
- `src/pages/structure/StructurePage.tsx`:首页、目的地页、需求页等页面模块配置主界面。
- `src/pages/products/ProductsPage.tsx`:线路商品维护。
- `src/pages/leads/LeadsPage.tsx`:需求线索查询、筛选和状态流转。
- `src/components/ui/`Button、Card、Input、Textarea、Badge、Alert、Switch、NativeSelect、Separator 等基础组件。
- `src/styles.css`Tailwind 入口、设计变量、后台工作台、表格/表单和移动端适配。
### WonderQ-Admin
```text
WonderQ-Admin/
├─ app/
│ ├─ main.py
│ ├─ config.py
│ ├─ database.py
│ ├─ models.py
│ ├─ schemas.py
│ ├─ auth.py
│ ├─ serializers.py
│ ├─ content.py
│ ├─ seed.py
│ └─ routers/
│ ├─ public.py
│ ├─ admin.py
│ └─ shared.py
├─ alembic/
├─ data/generated-products.json
├─ tests/
├─ Dockerfile
├─ docker-compose.yml
├─ requirements.txt
├─ pyproject.toml
├─ .env.example
└─ README.md
```
- `app/main.py`FastAPI 应用入口、CORS、错误处理和路由注册。
- `app/config.py``app/database.py`:环境变量配置与 SQLAlchemy engine/session/Base。
- `app/models.py``app/schemas.py``app/serializers.py`ORM 模型、Pydantic 校验和响应序列化。
- `app/auth.py`JWT 与后台鉴权。
- `app/routers/public.py``app/routers/admin.py``app/routers/shared.py`Public API、Admin API 和共享查询。
- `app/content.py``app/seed.py``data/generated-products.json`:初始化内容、重置命令和迁移数据源。
- `alembic/``Dockerfile``docker-compose.yml`:数据库迁移与部署入口。
## 7. 启动方式
### 后端 `WonderQ-Admin`
`WonderQ-Project` 根目录启动:
```powershell
Set-Location .\WonderQ-Admin
.\.venv\Scripts\Activate.ps1
docker-compose up -d postgres redis
python -m alembic upgrade head
python -m uvicorn app.main:app --host 0.0.0.0 --port 4000 --reload
```
首次缺少虚拟环境或依赖时,再执行:
```powershell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
```
健康检查http://localhost:4000/health。
### 管理前端 `WonderQ-Admin-UI`
```powershell
Set-Location .\WonderQ-Admin-UI
yarn install
yarn dev
```
默认访问http://localhost:5602。后端 Admin API 默认运行在 http://localhost:4000。
### 前台 `WonderQ-MiniAPP`
```powershell
Set-Location .\WonderQ-MiniAPP
yarn install
yarn dev
```
H5 默认访问http://localhost:5173。微信小程序开发构建
```powershell
yarn dev:mp-weixin
```
## 8. 测试与验证
- `WonderQ-Admin`:修改 Python 代码后运行 `python -m pytest`;涉及迁移时运行 `python -m alembic upgrade head`;空库或 seed 相关变更才考虑 `python -m app.seed`,且执行前必须确认风险。
- `WonderQ-Admin-UI`:当前未配置独立测试脚本,提交前至少运行 `yarn build`;涉及 UI、交互或接口行为时本地启动页面并手动验证关键流程。
- `WonderQ-MiniAPP`:前台变更后至少运行 `yarn build:h5``yarn build:mp-weixin``yarn test`UI 变更还应浏览器验证移动端和桌面宽度,涉及小程序兼容时用微信开发者工具验证 `dist/build/mp-weixin`
- 纯文档变更可不跑构建,但必须检查文档链接、命令、路径和敏感信息。
## 9. 部署规范
- `WonderQ-MiniAPP`H5 生产构建使用 `yarn build:h5`,产物在 `dist/build/h5`;微信小程序构建使用 `yarn build:mp-weixin`,产物在 `dist/build/mp-weixin`
- `WonderQ-Admin-UI`:生产发布使用 `yarn build` 生成 `dist/`,可交给 Nginx、CDN 或静态托管服务部署。
- `WonderQ-Admin`:使用 Dockerfile 与 `docker-compose.yml` 部署 API、PostgreSQL 和 Redis。
- 生产 API 地址、客服链接、企业 ID、JWT secret、OSS 密钥、数据库连接只允许通过部署环境变量注入,不硬编码到源码、测试或文档。
- 不提交 `dist/``node_modules/``.venv/``.env``.env.local`、日志、coverage、数据库备份或临时规划文件。
## 10. 接口与数据规范
- Public API 与 Admin API 分离MiniAPP 只访问 `/api/public/...`Admin UI 只访问 `/api/admin/...`
- 保持现有 API 路径和响应结构兼容;不要为了统一风格擅自改路径、改字段名或改响应包裹结构。
- 接口设计优先 RESTful 风格,如 `GET /api/admin/products``POST /api/admin/products``PATCH /api/admin/products/{id}`
- 禁止新增 `/getBanner``/saveProduct``/updateConfig` 这类动作式路径,除非已有契约明确要求。
- TypeScript 与 API 响应字段保持 camelCase后端内部可使用 snake_case但序列化给前端时遵守契约。
- 外部输入必须通过 Pydantic schema 或前端表单校验;后端不能信任前端传参。
- 错误响应不得泄露内部异常、SQL、环境变量、Token、密钥或敏感业务数据。
- 页面模块字段、排序、删除冲突、媒体上传等细节以 `module-config-api.md` 为准。
## 11. 数据库与后端实现原则
- Alembic 管理数据库迁移;涉及模型变更时同步迁移、测试和契约文档。
- 新业务表按实际需要考虑 `id``created_at``updated_at``deleted_at``status``sort` 等字段,不机械添加无意义字段。
- 时间字段后端统一使用明确时区语义;对外返回 ISO 8601 字符串。
- 查询应合理建立索引,避免 N+1 查询和无界列表。
- Admin 变更类接口应继续写入审计日志,尤其是发布、重置、删除、状态流转和页面配置变更。
- 复杂新业务优先按 Router、Service、Repository 分层拆分;现有简单接口可沿用当前结构,但不要把大量业务逻辑继续堆进单个路由函数。
## 12. 前端实现原则
- TypeScript 项目使用 strict 模式,新增代码应有明确类型,避免 `any`
- `WonderQ-MiniAPP` 使用 Vue 3 SFC、`<script setup lang="ts">` 和 uni-app 组件,不引入 React。
- `WonderQ-Admin-UI` 使用 React 函数组件和 Hooks不引入 class component。
- 样式优先使用项目已集成的 TailwindCSS管理端同时遵守 `src/styles.css` 的设计变量和已有类名体系。
- `WonderQ-MiniAPP` 移动端采用简约、内容优先的视觉风格:以白色和低饱和中性色为基础,使用绿色作为主操作色,避免大面积渐变、金色渐变按钮、装饰性光晕和重阴影。
- MiniAPP 卡片、输入框和操作按钮优先使用 8-12px 圆角、细边框和轻阴影;图片负责表达目的地与线路,不额外叠加装饰性图形。
- MiniAPP 顶部栏和底部导航保持扁平、稳定的固定布局,选中态通过颜色、细线或浅色底区分,不使用会改变布局的浮动徽章或缩放动画。
- 通用控件优先复用 `src/components/ui/`;图标优先使用 `lucide-react`
- 功能不要集中堆在一个文件中。能拆分组件就拆分组件,能封装工具函数就封装工具函数,保持人工可维护性和复用性。
- UI 必须处理 loading、empty、error、retry、禁用态、提交中状态和移动端布局。
- MiniAPP 页面数据优先来自 Public API接口失败或字段缺失时按现有本地兜底机制处理不新增硬编码业务数据源。
## 13. 命名与代码风格
- 组件、类型使用 PascalCase。
- 函数、变量使用 camelCase。
- CSS class 沿用 kebab-case 或 Tailwind 原子类。
- Python 代码遵守现有 FastAPI、SQLAlchemy、Pydantic 风格。
- 中文文案文件按 UTF-8 处理Windows PowerShell 中检查中文文件时使用 `Get-Content -Encoding UTF8`
- 注释只写必要解释,避免“赋值给变量”这类无意义注释。
## 14. 高风险区域与锁定文件
### 全局高风险区域
未经用户明确授权,不得改动:
- `.env``.env.local`、生产环境变量、密钥配置、账号密码和真实隐私配置。
- 数据库配置、鉴权逻辑、部署入口、依赖锁文件。
- 已被页面引用的图片资源、采集源文件、生成数据和大批量素材文件。
- 任何会重置、迁移、删除、覆盖生产或开发数据的命令。
删除、批量移动、重命名资源文件前必须再次确认。
### `WonderQ-MiniAPP`
- 不要在本子项目重新添加后端、数据库、ORM、Docker Compose、后台认证或管理后台页面。
- `src/lib/api.ts` 的公共 API 路径保持 `/api/public/site-config``/api/public/products``/api/public/leads`,除非后端契约已同步变更。
- `vite.config.ts``manifest.json``/api` 代理只服务本地开发,不作为生产后端配置。
- 不要随意改动 `src/generated-products.json``public/assets/source/` 中的采集/生成内容,除非任务专门针对这些资源。
### `WonderQ-Admin-UI`
未经用户明确授权,不得改动:
- `.env``.env.local`、任何生产环境变量或密钥配置。
- `vite.config.ts` 中的代理、端口和构建配置。
- `tsconfig.json` 的严格类型配置。
- `package.json``yarn.lock` 的依赖与脚本。
- `src/api.ts` 的接口路径、Token 存储键、鉴权头和类型契约。
- `public/assets/` 下已被页面引用的图片资源和 `manifest.json`
- `docs/admin-api-requirements.md``docs/module-config-api.md` 中的接口契约,除非任务就是同步契约变更。
### `WonderQ-Admin`
未经用户明确授权,不得改动:
- `.env``.env.local`、生产环境变量和任何密钥配置。
- `app/models.py``alembic/versions/*`:数据库结构和迁移。
- `app/auth.py`:后台鉴权逻辑。
- `app/routers/admin.py``app/routers/public.py`:核心 API 行为。
- `app/seed.py``app/content.py``data/generated-products.json`:初始化内容和迁移数据源。
- `Dockerfile``docker-compose.yml`:部署入口。
- `requirements.txt``pyproject.toml`:依赖和测试配置。
如确需修改上述文件,先说明原因、影响范围、验证方式,并等待用户确认。
## 15. AI 输出要求
### 开发类需求
根据任务范围输出必要内容:
- 功能目标和影响范围。
- 涉及页面、用户角色、数据流和边界情况。
- 是否需要数据库、后端 API、Admin UI、MiniAPP 同步变更。
- 需要更新的契约文档。
- 开发顺序、验证命令和风险点。
不要对纯文档、纯样式、小修复机械输出数据库设计、后台 CRUD 或无关扩展建议。
### 评审类需求
优先输出问题,按严重程度排序,并给出文件和行号。重点关注:
- 行为回归、接口不兼容、权限绕过、数据丢失。
- 缺少参数校验、错误处理、空态处理或测试。
- 敏感信息泄露、生产环境风险、破坏锁定边界。
### 实施类需求
- 先读相关文件和契约,再动手。
- 修改范围最小化,不做无关重构。
- 编辑后检查变更内容。
- 按影响范围运行验证;无法运行时说明原因和剩余风险。
## 16. 自检清单
提交或答复前检查:
- 是否误读或输出敏感信息。
- 是否改动了未授权文件或锁定文件。
- 是否保持 Public API、Admin API、页面模块契约一致。
- 是否遗漏鉴权、参数校验、错误响应、审计或删除冲突处理。
- 是否处理 loading、empty、error、retry 和移动端适配。
- 是否新增硬编码生产地址、客服链接、密钥或真实手机号。
- 是否运行了与变更范围匹配的验证,或明确说明未运行原因。

View File

@@ -0,0 +1 @@
VITE_API_BASE_URL="http://localhost:4000"

7
WonderQ-Admin-UI/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
node_modules/
dist/
.env
.env.local
*.log
coverage/
.vite/

View File

@@ -0,0 +1,40 @@
# WonderQ-Admin-UI
独立的 WonderQ 后台管理前端,基于 Vite、React、TypeScript、Tailwind CSS 4 和 shadcn/ui 风格组件。
## 本地启动
1. 安装依赖:
```bash
yarn install
```
本项目使用 Yarn 1 锁文件。Windows 环境下Vite 8、Tailwind CSS 4、lightningcss 依赖 native binding`package.json` 中已固定对应的 Windows 构建包,避免 Yarn 1 漏装 optional dependency 导致构建失败。
2. 确认后端 API 运行在 `http://localhost:4000`
3. 启动后台 UI
```bash
yarn dev
```
访问http://localhost:5602
局域网访问可使用本机 IP例如 `http://192.168.1.23:5602/`。该地址由 Vite dev server 提供,支持样式和组件热更新。
默认后台账号由 `WonderQ-Admin` 提供:`admin@example.com / ChangeMe123!`
## 目录说明
- `src/App.tsx`:后台管理主界面和业务交互。
- `src/api.ts`Admin API 类型、Token 管理和请求封装。
- `src/components/ui/`:本地 shadcn/ui 风格基础组件,包括 Button、Card、Input、Textarea、Badge、Alert、Switch 等。
- `src/lib/utils.ts`:组件 className 合并工具。
- `src/styles.css`Tailwind 入口、设计变量、后台布局和响应式样式。
- `public/assets/`:后台预览所需静态资源,保留 `/assets/...` 引用方式。
- `components.json`shadcn/ui 组件配置。
- `vite.config.ts`:开发环境将 `/api` 代理到 `http://localhost:4000`dev server 固定运行在 `5602` 并支持 HMR生产构建预览运行在 `5603`
本仓库已经独立,不再依赖 `WonderQ-MiniAPP` 的相对路径。

View File

@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/styles.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

View File

@@ -0,0 +1,12 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>万趣小程序管理端</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

View File

@@ -0,0 +1,35 @@
{
"name": "wonderq-admin-ui",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc --noEmit && vite build",
"preview": "vite preview"
},
"dependencies": {
"@radix-ui/react-select": "^2.3.2",
"@radix-ui/react-slot": "^1.3.0",
"@radix-ui/react-switch": "^1.3.2",
"@rolldown/binding-win32-x64-msvc": "1.1.3",
"@tailwindcss/oxide-win32-x64-msvc": "4.3.2",
"@tailwindcss/vite": "^4.3.2",
"@vitejs/plugin-react": "^6.0.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lightningcss-win32-x64-msvc": "1.32.0",
"lucide-react": "^1.21.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.3.2",
"vite": "^8.1.0"
},
"devDependencies": {
"@types/node": "^26.0.1",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"typescript": "^6.0.3"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

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