docs: record pause wasm implementation plan
@@ -0,0 +1,20 @@
|
||||
# 2026-07-06 xyzbc-trt 任务态按钮逻辑严格对标
|
||||
|
||||
## 用户提问
|
||||
|
||||
完全对标 `/home/mes123456/cnc_wams/linuxcnc` 的 `xyzbc-trt` 中解除 `ESTOP`、`上电`、`Home All`、`Run`、`暂停` 功能,修改 Web 仿真系统 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 的混乱逻辑,并进行严格验证。要求新任务先写入 `working` 文档后再执行。
|
||||
|
||||
## 执行目标
|
||||
|
||||
1. 以本地 LinuxCNC `xyzbc-trt` 配置、HAL/任务状态语义和现有验证证据为参考,梳理按钮状态机。
|
||||
2. 修正 Web 仿真中 `ESTOP`、机器上电、全轴回零、程序运行、暂停/继续的状态流转和按钮可用性。
|
||||
3. 增加或更新自动化验证,覆盖未解除急停、未上电、未回零、运行、暂停、继续等关键路径。
|
||||
4. 执行构建/节点测试/浏览器验证等可用验证,并把结果记录到最终结论与日志。
|
||||
|
||||
## 执行顺序
|
||||
|
||||
1. 阅读 LinuxCNC `xyzbc-trt` 参考配置与 Web 当前任务态实现。
|
||||
2. 定位混乱逻辑的根因,制定局部修改方案。
|
||||
3. 修改源代码与必要测试。
|
||||
4. 严格运行验证并保存证据。
|
||||
5. 按仓库要求把完整执行过程追加到 `gptlog-process/gpdlog.md`。
|
||||
@@ -0,0 +1,19 @@
|
||||
# 2026-07-06 xyzbc-trt 暂停按钮严格对标
|
||||
|
||||
## 用户提问
|
||||
|
||||
严格对标“暂停”按钮的逻辑。一直就不好用。
|
||||
|
||||
## 执行目标
|
||||
|
||||
1. 对照本地 LinuxCNC AXIS 的 `task_pause`、`task_resume`、`task_pauseresume` 源码语义,明确暂停按钮应有行为。
|
||||
2. 复查 Web 仿真中工具栏暂停按钮、菜单 Pause、菜单 Resume、底层 `PAUSE/RESUME/PAUSE_RESUME` 的分发与状态门禁。
|
||||
3. 找出导致暂停按钮“不好用”的实际原因,修正为以 LinuxCNC 任务状态为准的稳定逻辑。
|
||||
4. 使用节点测试、构建、浏览器烟测和真实按钮/位置冻结证据进行严格验证。
|
||||
|
||||
## 预期对标语义
|
||||
|
||||
1. 工具栏双竖线按钮对标 LinuxCNC AXIS `task_pauseresume`:运行中点击应暂停,暂停中点击应恢复。
|
||||
2. 菜单 `Pause` 对标 `task_pause`:仅在 AUTO 且 interpreter 处于 reading/waiting 时暂停。
|
||||
3. 菜单 `Resume` 对标 `task_resume`:仅在 paused 且 task mode 为 AUTO/MDI 时恢复。
|
||||
4. 暂停后速度归零,G-code 执行采样不继续推进,DRO、axisPose、canvas toolhead 保持冻结。
|
||||
@@ -0,0 +1,55 @@
|
||||
# 2026-07-06 AXIS 主控制按钮严格对标补齐
|
||||
|
||||
## 用户提问
|
||||
|
||||
对标 `doc/AXIS主控制按钮功能先决条件与状态影响详解.md`,修改项目 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan`,并依据 `working` 下既有任务文档实施。
|
||||
|
||||
## 本轮目标
|
||||
|
||||
1. 以本地 LinuxCNC AXIS `task_pause`、`task_resume`、`task_pauseresume` 源码和项目文档为准,复查主控制按钮状态门禁。
|
||||
2. 收紧 Web 仿真中暂停相关门禁,避免仅凭 `runState` 的残留运行态绕过 AXIS 的 `task_mode` 与 `interp_state` 条件。
|
||||
3. 更新自动化验证,覆盖菜单 Pause、工具栏 pause/resume 在 idle、manual、AUTO/MDI、paused 状态下的严格行为。
|
||||
4. 重新构建 `dist`,执行节点 smoke、浏览器 smoke、Web evidence 与 compare。
|
||||
|
||||
## 实施结论
|
||||
|
||||
- `app/src/state/linuxcnc-task-policy.js`
|
||||
- `canPause` 调整为仅在 `STATE_ON + MODE_AUTO + INTERP_READING/WAITING` 时为真。
|
||||
- 菜单 `PAUSE` 严格对标 AXIS `task_pause`:非 AUTO 阻止,非 READING/WAITING 阻止。
|
||||
- 工具栏 `PAUSE_RESUME` 的暂停分支对标 AXIS `task_pauseresume`:必须为 AUTO/MDI,且解释器非 idle。
|
||||
|
||||
- `app/src/state/store.js`
|
||||
- `PAUSE_RESUME` 不再因 `runState=running/stepping` 自动接管 manual 残留状态。
|
||||
- `PAUSE_RESUME` 在 manual 模式直接返回 `pause blocked: task mode must be auto or MDI`。
|
||||
- `PAUSE_RESUME` 在 AUTO/MDI 且解释器 idle 时返回 `pause ignored: interpreter is idle`。
|
||||
|
||||
- `tests/node/verify_xyzbc_trt_web_app.mjs`
|
||||
- 移除旧的宽容断言:idle interpreter + running runState 不应被菜单 Pause 暂停。
|
||||
- 移除旧的宽容断言:manual 残留 running 状态不应被工具栏 pause/resume 强制改成 AUTO paused。
|
||||
- 增加对应严格拦截断言。
|
||||
|
||||
- `app/dist/src/...`
|
||||
- 通过 `npm --prefix app run build` 从 `src` 重新生成。
|
||||
|
||||
## 验证结果
|
||||
|
||||
```text
|
||||
npm --prefix app run smoke:node
|
||||
xyzbc_trt_web_app_smoke=ok
|
||||
|
||||
npm --prefix app run build
|
||||
gmoccapy_static_build=ok
|
||||
|
||||
npm --prefix app run smoke:browser
|
||||
xyzbc_trt_browser_smoke=ok
|
||||
|
||||
npm --prefix app run evidence:web
|
||||
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
|
||||
|
||||
npm --prefix app run evidence:compare
|
||||
compare_xyzbc_trt_status=pass
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
本轮开始前工作区已有多处未提交修改和新增证据文件。本轮只在现有状态上补齐 AXIS 暂停/恢复门禁,不回退既有改动。
|
||||
@@ -0,0 +1,83 @@
|
||||
# 2026-07-06 AXIS 主控制按钮完全对标复核
|
||||
|
||||
## 用户提问
|
||||
|
||||
项目 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 要完全对标 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/doc/AXIS主控制按钮功能先决条件与状态影响详解.md`。
|
||||
|
||||
## 对标范围
|
||||
|
||||
按文档逐项复核:
|
||||
|
||||
- 急停与解除急停:`estop_clicked()`,`STATE_ESTOP` / `STATE_ESTOP_RESET`。
|
||||
- 上电/下电:`onoff_clicked()`,仅 `STATE_ESTOP_RESET` 分支上电,其余状态发送 `STATE_OFF`。
|
||||
- Home All:`home_all_joints()` / `c.home(-1)`。
|
||||
- Run:`task_run()` / `AUTO_RUN`,要求上电、已回零、程序打开。
|
||||
- Pause:`task_pause()` / `AUTO_PAUSE`,要求 AUTO 且解释器 READING/WAITING。
|
||||
- Resume:`task_resume()` / `AUTO_RESUME`,要求 paused 且 AUTO/MDI。
|
||||
- Pause/Resume 工具栏合并按钮:`task_pauseresume()`,要求 AUTO/MDI,paused 时恢复,非 idle 时暂停。
|
||||
- Step:`task_step()` / `AUTO_STEP`,支持自动空闲初次单步,也支持 reading/waiting/paused 队列单步推进。
|
||||
|
||||
## 本轮发现和修正
|
||||
|
||||
### P-016-001 电源按钮 ESTOP/OFF 语义偏差
|
||||
|
||||
问题:
|
||||
|
||||
Web 原 `TOGGLE_POWER` 在 `STATE_ESTOP` 下会被策略阻止并提示先 reset;在非 on 状态下容易按“切换”理解直接进入 on。LinuxCNC AXIS 的 `onoff_clicked()` 并不是“任意非 on 上电”,而是:
|
||||
|
||||
```python
|
||||
if s.task_state == linuxcnc.STATE_ESTOP_RESET:
|
||||
c.state(linuxcnc.STATE_ON)
|
||||
else:
|
||||
c.state(linuxcnc.STATE_OFF)
|
||||
```
|
||||
|
||||
修正:
|
||||
|
||||
- `app/src/state/linuxcnc-task-policy.js`
|
||||
- `TOGGLE_POWER` 不再在 `STATE_ESTOP` 下阻止,允许按钮动作进入 OFF 分支。
|
||||
|
||||
- `app/src/state/store.js`
|
||||
- `TOGGLE_POWER` 改为 `taskState === "estop-reset"` 时上电,否则下电到 `taskState="off"`。
|
||||
- 下电时关闭 power、motion、RTCP、冷却、主轴速度,并清除 `allHomed`,对标 `emcJointUnhome(-2)` 的 volatile home 清除效果。
|
||||
- task/HAL 命令改为上电发送 `EMC_TASK_SET_STATE ON`,否则发送 `EMC_TASK_SET_STATE OFF`。
|
||||
|
||||
### P-016-002 自动化验证补齐
|
||||
|
||||
- `tests/node/verify_xyzbc_trt_web_app.mjs`
|
||||
- 新增 ESTOP 下点击 Power 进入 OFF 的断言。
|
||||
- 新增 OFF 下继续点击 Power 仍保持 OFF,不能绕过 reset 直接上电的断言。
|
||||
- 新增下电清除 `allHomed` 的断言。
|
||||
- 将主按钮链路测试和后续 MDI/JOG/override 测试拆分为独立 store,避免异步运行状态污染。
|
||||
|
||||
- `tests/browser/xyzbc_trt_browser_smoke.html`
|
||||
- 新增真实 DOM 按钮路径:ESTOP 后点 Power 进入 OFF;OFF 下点 Power 仍保持 OFF;再 ESTOP/RESET 后才能上电。
|
||||
|
||||
## 验证结果
|
||||
|
||||
```text
|
||||
npm --prefix app run smoke:node
|
||||
xyzbc_trt_web_app_smoke=ok
|
||||
|
||||
npm --prefix app run build
|
||||
gmoccapy_static_build=ok
|
||||
|
||||
npm --prefix app run smoke:browser
|
||||
xyzbc_trt_browser_smoke=ok
|
||||
|
||||
npm --prefix app run evidence:web
|
||||
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
|
||||
web status=ready-for-wasm-runtime
|
||||
blockers=[]
|
||||
|
||||
npm --prefix app run evidence:compare
|
||||
compare_xyzbc_trt_status=pass
|
||||
checkCount=60
|
||||
passCount=60
|
||||
failCount=0
|
||||
blockers=[]
|
||||
```
|
||||
|
||||
## 结论
|
||||
|
||||
本轮按参考文档完成主控制按钮全量复核,并修正电源按钮与 AXIS `onoff_clicked()` 不一致的问题。当前 ESTOP、RESET、POWER、HOME、RUN、PAUSE、RESUME、PAUSE_RESUME、STEP 均有源码门禁和自动化验证覆盖,Web/native evidence compare 为 60/60 pass。
|
||||
@@ -0,0 +1,115 @@
|
||||
# 2026-07-06 暂停按钮严格测试报告
|
||||
|
||||
## 用户提问
|
||||
|
||||
严格测试“暂停”按钮的功能。
|
||||
|
||||
## 测试目标
|
||||
|
||||
按 `working/14-20260706-xyzbc-trt-暂停按钮严格对标.md` 的预期语义验证:
|
||||
|
||||
- 工具栏双竖线按钮对标 AXIS `task_pauseresume`:运行中暂停,暂停中恢复。
|
||||
- 菜单 `Pause` 对标 `task_pause`:仅 AUTO 且 interpreter 为 reading/waiting 时暂停。
|
||||
- 菜单 `Resume` 对标 `task_resume`:paused 且 AUTO/MDI 时恢复。
|
||||
- 暂停后速度归零,G-code 采样不继续推进,DRO、axisPose、canvas toolhead 保持冻结。
|
||||
|
||||
## 执行命令和结果
|
||||
|
||||
### 1. 构建与回归
|
||||
|
||||
```text
|
||||
npm --prefix app run build
|
||||
gmoccapy_static_build=ok
|
||||
|
||||
npm --prefix app run smoke:node
|
||||
xyzbc_trt_web_app_smoke=ok
|
||||
|
||||
npm --prefix app run smoke:browser
|
||||
xyzbc_trt_browser_smoke=ok
|
||||
```
|
||||
|
||||
### 2. 暂停位置 JSON trace
|
||||
|
||||
命令:
|
||||
|
||||
```text
|
||||
APP_URL_PATH=/web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist/index.html node tools/trace-pause-position-json.mjs
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
```text
|
||||
pause_position_status=passed-position-frozen
|
||||
trace=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/pause-position-traces/pause-position-20260706T063131Z/trace.json
|
||||
position_changed=false
|
||||
changed_fields=
|
||||
```
|
||||
|
||||
关键证据:
|
||||
|
||||
```text
|
||||
pausedSampleCount=35
|
||||
baselineLabel=pause-start
|
||||
sampleIndex=48
|
||||
currentVelocity=0
|
||||
changedFields=[]
|
||||
```
|
||||
|
||||
暂停开始到最后一个暂停采样期间:
|
||||
|
||||
- `runState=paused`
|
||||
- `taskState=on`
|
||||
- `mode=auto`
|
||||
- `interpState=paused`
|
||||
- `taskPaused=true`
|
||||
- `sampleIndex=48` 保持不变
|
||||
- `currentVelocity=0`
|
||||
- `axisPose`、`dro`、`runtimeAxisPose`、`runtimeTcp`、`uiExecution.joint`、`uiExecution.tcp`、`canvasToolhead` 均无变化
|
||||
- 暂停按钮状态为 `paused=true`,标题为 `Resume program`
|
||||
|
||||
### 3. 50ms 长流程截图验证
|
||||
|
||||
命令:
|
||||
|
||||
```text
|
||||
RUN_STABLE_BEFORE_FIRST_PAUSE_MS=3000 node tools/verify-estop-power-home-run-pause-50ms.mjs
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
```text
|
||||
verification_status=passed
|
||||
screenshots=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260706T063233Z
|
||||
captured_frames=403
|
||||
sample_period_ms=50
|
||||
manifest=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260706T063233Z/manifest.json
|
||||
```
|
||||
|
||||
关键断言:
|
||||
|
||||
| 阶段 | 结果 | runState | mode | interpState | taskPaused | sampleIndex | currentVelocity |
|
||||
|---|---|---|---|---|---|---:|---:|
|
||||
| 第一次暂停 | 通过 | paused | auto | paused | true | 111 | 0 |
|
||||
| 第一次暂停保持 5 秒 | 通过 | paused | auto | paused | true | 111 | 0 |
|
||||
| 第二次暂停 | 通过 | paused | auto | paused | true | 405 | 0 |
|
||||
| 第二次暂停保持 5 秒 | 通过 | paused | auto | paused | true | 405 | 0 |
|
||||
|
||||
两次暂停都发生在真实展开程序 `helix_bc.ngc` 第 17 行:
|
||||
|
||||
```text
|
||||
f#<frate> g2i#<r>z#<zmin> p#<n>
|
||||
```
|
||||
|
||||
### 4. Web/native evidence
|
||||
|
||||
```text
|
||||
npm --prefix app run evidence:web
|
||||
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
|
||||
|
||||
npm --prefix app run evidence:compare
|
||||
compare_xyzbc_trt_status=pass
|
||||
```
|
||||
|
||||
## 结论
|
||||
|
||||
暂停按钮严格测试通过。工具栏暂停/恢复、菜单 Pause/Resume 的回归测试通过;真实浏览器中暂停后状态稳定为 `paused`,速度为 0,采样索引不推进,DRO/axisPose/runtime/canvas toolhead 均保持冻结;两次 5 秒暂停保持均通过,50ms 截图长流程验证通过,Web/native compare 仍为 pass。
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
当前新增关注点:
|
||||
|
||||
- 2026-07-06 00:22 EDT 新任务:完全对标 `/home/mes123456/cnc_wams/linuxcnc` 中 `xyzbc-trt` 的 AXIS/task 状态联锁,重整 Web 仿真系统 `解除 ESTOP`、`上电`、`Home All`、`Run`、`暂停/继续` 功能逻辑;要求修复当前混乱状态流,并通过源码对照、自动化 smoke、browser 验证和 evidence/compare 严格复验。
|
||||
- 2026-07-05 18:57 EDT 已按 LinuxCNC AXIS 源码修复 Pause:工具栏按钮恢复为 `.toolbar.program_pause -> task_pauseresume` 语义,运行中点击暂停、暂停中点击继续;菜单 Pause/Resume 仍为独立命令。Node smoke、browser smoke、build、native/Web/compare 均通过,最新 compare 为 `60/60 pass`。
|
||||
- 2026-07-05 18:18 EDT 已按 `working/12-20260704-真实执行复验与缺失功能工作计划.md` 的 P-002 规则再次执行全量复验:native LinuxCNC、Web evidence、compare、build、Node smoke、browser smoke 均通过;最新 `compare-xyzbc-trt-evidence.json` 为 `60/60 pass`、`blockers=[]`、`requiredImprovements=[]`。
|
||||
- 2026-07-05 18:08 EDT 已按用户要求重新执行“除硬件相关外完全对标”复验:native LinuxCNC、Web evidence、compare、build、Node smoke、browser smoke 均通过;最新 `compare-xyzbc-trt-evidence.json` 为 `60/60 pass`、`blockers=[]`、`requiredImprovements=[]`。
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"apiName": "xyzbc-trt-native-web-evidence-comparison",
|
||||
"status": "pass",
|
||||
"comparedAt": "2026-07-05T22:57:05.625Z",
|
||||
"comparedAt": "2026-07-06T06:35:08.413Z",
|
||||
"nativePath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json",
|
||||
"webPath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json",
|
||||
"summary": {
|
||||
@@ -973,8 +973,8 @@
|
||||
"id": "menu-run-ready",
|
||||
"action": "run-ready",
|
||||
"sourceSymbol": "AXIS run preconditions",
|
||||
"sourceLines": "axis.py:2308-2320",
|
||||
"expected": "power on, home, auto mode and TCP kins ready"
|
||||
"sourceLines": "axis.py:2379-2391",
|
||||
"expected": "open/stage the selected program without substituting power, Home All, or Run"
|
||||
},
|
||||
{
|
||||
"id": "menu-run",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"apiName": "xyzbc-trt-web-opfs-wasm-evidence",
|
||||
"status": "ready-for-wasm-runtime",
|
||||
"collectedAt": "2026-07-05T22:56:54.459Z",
|
||||
"collectedAt": "2026-07-06T06:35:07.906Z",
|
||||
"profile": {
|
||||
"id": "xyzbc-trt",
|
||||
"machineName": "sim-xyzbc-trt-kins (switchkins)",
|
||||
@@ -227889,8 +227889,8 @@
|
||||
"id": "menu-run-ready",
|
||||
"action": "run-ready",
|
||||
"sourceSymbol": "AXIS run preconditions",
|
||||
"sourceLines": "axis.py:2308-2320",
|
||||
"expected": "power on, home, auto mode and TCP kins ready"
|
||||
"sourceLines": "axis.py:2379-2391",
|
||||
"expected": "open/stage the selected program without substituting power, Home All, or Run"
|
||||
},
|
||||
{
|
||||
"id": "menu-run",
|
||||
@@ -230061,8 +230061,8 @@
|
||||
"id": "menu-run-ready",
|
||||
"action": "run-ready",
|
||||
"sourceSymbol": "AXIS run preconditions",
|
||||
"sourceLines": "axis.py:2308-2320",
|
||||
"expected": "power on, home, auto mode and TCP kins ready"
|
||||
"sourceLines": "axis.py:2379-2391",
|
||||
"expected": "open/stage the selected program without substituting power, Home All, or Run"
|
||||
},
|
||||
{
|
||||
"id": "menu-run",
|
||||
|
||||
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |