Commit Graph
153 Commits
Author SHA1 Message Date
ldm0 cd2744c59e fix(benchmark): recognize Chromium error document completion
Chromium reports loadingFailed for a failed document request and later
loadingFinished when its internal error Document commits and loads under
the same request identity. The sequential navigation audit incorrectly
reported duplicate terminals and a successful terminal without a response.

Recognize this pair only when a same-session chrome-error frame commit
matches the request's frame, loader, and final unreachable URL between
the failure and completion. Keep ordinary request ordering and duplicate
terminal checks, and retain the transport failure in request summaries.

Cover direct and redirected failures, identity mismatches, missing or
misordered commits, extra terminals, and preservation of failure details.
2026-11-03 16:22:10 +08:00
ldm0 cb3977d4e4 chore(wpt): refresh full wpt-cross case statuses 2026-10-30 22:16:51 +08:00
ldm0 699464bd5d test(wpt-cross): refresh cases from full post-SQLite run
Refresh classifications from the unfiltered all-profile CDP run of
14,064 cases against the release build of 909ea48c37.

Results: 10,282 pass, 3,503 fail, 246 timeout, 25 harness-stalled,
7 error, and 1 existing crash. IndexedDB has 396 pass, 46 fail,
and no timeouts; all 35 original regression cases and 660 subtests pass.

Keep the first full-run results, including two Trusted Types stalls
and the existing Worker CSP timeout. Candidate reruns passed on both
HEAD and the pre-migration baseline; subsequent neighbor runs also
passed without replacing the original full-run classifications.

Validation: full WPT Cross run, case-list/report integrity checks,
and git diff --check. No Rust source or build metadata changes.
2026-10-30 03:31:32 +08:00
ldm0 4a271e0796 test(wpt-cross): refresh SQLite migration case classifications
Refresh the full-run case lists and merge the 35 verified regression recoveries. Keep unmeasured cases at their full-run classifications.
2026-10-30 03:31:32 +08:00
ldm0 064134b6fe test(wpt): refresh baseline after readiness fixes
Refresh all case lists from the final complete Moli-only run: 14,064 entries, 10,247 passes, 3,547 failures, 239 timeouts, 23 stalled harnesses, 7 errors, and 1 crash. The three corrected crashtests now pass. IndexedDB remains 360 passing, 77 failing, and 5 timing out across 442 entries.
2026-10-29 20:11:17 +08:00
ldm0 81551786f4 fix(wpt): follow document changes during crashtest readiness
Validate the initial Session/Frame/Loader commit before running readiness. Follow same-frame document replacement after a destroyed execution context within the original case deadline, and allow legitimate URL changes while preserving readiness and crash checks.

Validation: 500 Python WPT tests passed; navigation reproducer passed 20/20 runs. All 606 crashtests executed with 596 passing, 9 existing timeouts, and 1 existing crash. All 593 previously passing crashtests remained passing.
2026-10-29 20:11:17 +08:00
ldm0 d06f7ebe90 test(wpt): expand IndexedDB coverage and refresh case lists
Include Window and DedicatedWorker scripts and supported HTTPS/template HTML cases in the default and all profiles. Add enumeration regression coverage and refresh statuses from the complete release-Moli run.

Validation: 494 Python WPT tests passed. Executed 14,064 Moli WPT entries, including 442 IndexedDB entries (228 Window and 214 DedicatedWorker): 360 passed, 77 failed, and 5 timed out.
2026-10-29 20:11:17 +08:00
ldm0 7f7b2c10a1 test(wpt): refresh cases after release regression verification
Run all 13,631 WPT Cross cases with the release binary from 3dc8bcef3a
against WPT db95fafd1fce, using the standard schedule and zero retries.

Record the first full-run results: 9,894 pass, 3,471 fail, 234 timeout,
23 harness-stalled, 8 error and 1 crash. The sorted status lists form
an exact partition, with no missing or duplicate cases.

Confirmed template document and SVGLength regressions were fixed in
separate commits. Compare subtest failures with the preserved 672118c9fa
release and retain the original full-run failures after bounded probes.
2026-10-28 15:07:56 +08:00
ldm0 3f78315c54 test(wpt): refresh font resource verification cases
Record the final WPT Cross classifications from Release verification
of resource-driven font loading.
2026-10-28 05:55:19 +08:00
ldm0 871d57edd3 fix(benchmark): retain browser context for native WPT input 2026-10-25 01:45:25 +08:00
ldm0 1db737df98 test(wpt): refresh cases from full release run
Run all 13631 WPT Cross cases against Release a9e54b4a0a at upstream
db95fafd1fcef8428805e41eb5705d444e8c67ce. Record 9866 pass, 3489 fail,
238 timeout, 28 harness-stalled, 9 error and 1 crash, with zero missing.

Keep original full-run statuses. Replay all 32 changed cases for three
focused rounds (96 executions) without rewriting the lists. Nine cases
changed from pass to nonpass; four stay nonpass in all focused rounds
and five vary. Preserve the two new consistent font failures and the
font-face-reject fail-to-timeout change for follow-up investigation.

Verify lists are sorted, disjoint, and exactly partition the full matrix.
Release binary SHA-256:
a388b701c7da01cc104f535d6d8fa1a89b7638bd994531fca3622e22f9afbe85
2026-10-24 20:41:57 +08:00
ldm0 cf51cefb7d fix(benchmark): route WPT permission changes through CDP 2026-10-22 14:28:24 +08:00
ldm0 9befcbda23 fix(benchmark): select CDP for WPT testdriver cases 2026-10-22 14:28:24 +08:00
ldm0 0ca924c266 fix(benchmark): run explicit CDP WPT input through native automation 2026-10-22 14:28:24 +08:00
ldm0 32df201d63 fix(benchmark): confirm target removal after close races 2026-10-22 14:28:24 +08:00
ldm0 8d57e02b3c test(wpt): refresh Cases after rebasing latest main
Refresh all 13631 WPT cases at db95fafd1fcef8428805e41eb5705d444e8c67ce after rebasing the style stack and XML fork migration onto main 3ca6888b9d.

9863 pass, 3483 fail, 249 timeout, 26 harness-stalled, 9 error, 1 crash; zero missing. Lists exactly partition frozen Release 8eefbbace618edfbe851b6f2ba2a6231db214e5fbc202bf35d0e16f23d606004.

All 16 status/subtest changes versus the prior validated build were replayed against both binaries for three rounds (96 case executions). No new stable or possible flaky regression; existing variations are recorded without rewriting full-run outcomes. Root fmt, strict workspace/all-target/all-feature Clippy and complete Nextest (20427 passed, 18 skipped) pass. XML 312-case and Chromium overflow 840-case comparisons have no differences.
2026-10-21 17:55:02 +08:00
ldm0 dc1d8f90be test(wpt): refresh Cases after XML fork migration and main rebase
Refresh the complete 13631-case snapshot at WPT db95fafd1fcef8428805e41eb5705d444e8c67ce after the XML fork migration and main rebase.

9866 pass, 3487 fail, 240 timeout, 28 harness-stalled, 9 error, 1 crash; zero missing. Frozen Release SHA-256: b6408a72a6ad26dcd613ced3b0998d6fcf3c9d510d7657011057e294b1637f60.

All nine apparent case/subtest/status regressions were replayed against both frozen builds. No new stable regression; the Trusted Types navigation delta is preexisting flaky behavior. Keep the full-run statuses in these lists.
2026-10-21 17:55:02 +08:00
ldm0 a4a188d503 test(wpt): refresh Cases for standalone style upgrade 2026-10-21 17:55:02 +08:00
ldm0 b8ca3b075c test(benchmark): verify consumed-fragment styles and retention 2026-10-21 01:27:34 +08:00
ldm0 3ca6888b9d perf(style): preserve unaffected styles after consuming ordinary fragments
Extract shared invalidation from realtime layout commit dfeda25e6d. Retain original source ownership, detached-subtree cleanup, real splice ordering and structural-effect limits. Add selector/cache regressions and a normal-CLI before/after benchmark.
2026-10-20 05:52:15 +08:00
ldm0 b35056ac82 fix(wpt): absorb parallel fixture connection bursts
The inherited listen backlog of five makes concurrent browser connections
wait for TCP retries before fixture handlers run. Match wptserve's backlog
of 2000 for every IPv4/IPv6 origin without changing test timeouts.

Add real socket tests that queue a complete 50-worker burst before the
accept loop starts. Both address families time out before this change and
connect successfully afterward.

With the same frozen release binary, Worker error stress changes from
86/100 passes to 150/150 after changing only the backlog. Script-order
and worker XHR timing cases each pass all 30 additional trials.

Validation: 81 Python tests across connection backlog, fixture resources,
fixture responses and runner orchestration; git diff --check.
2026-10-18 20:13:58 +08:00
ldm0 7575a0d3d7 fix(benchmark): retain sampling and teardown failure evidence 2026-10-17 23:26:19 +08:00
ldm0 61790a2b2a chore(wpt): refresh release case statuses and version probe 2026-10-13 04:56:16 +08:00
ldm0 147bd6035c chore(wpt): refresh verified parent browsing-context cases
Move choose-_parent-001/002/004 to passed after receiver-based target
resolution. Each passed five isolated release runs on this main-based
branch. Refresh only these three cases and preserve all other recorded
outcomes; this is not a new full-suite run.
2026-10-12 00:20:39 +08:00
ldm0 1404fa344b perf(accessibility): avoid JSON intermediates in semantic dumps
Large semantic dumps retain a JSON object graph with allocated field names
and string node references for every AX node before formatting the output.

Build compact typed nodes with numeric references and pass them directly
from the renderer to the CLI. Keep one AX traversal for both typed nodes
and CDP payloads, converting protocol nodes individually as they are built.
Preserve omitted/empty fields, field insertion order, list markers, and
frame-root attachment order. Render text iteratively and trim in place.

Add compatibility coverage and a standalone benchmark that stages both
executables on the same filesystem, alternates runs, records peak RSS and
wall time, and rejects changes to dump output bytes.

Against main at 5f5e1fff3 on a generated 40,000-row list (three interleaved
runs, medians):
- semantic_tree_text: 718.42 -> 390.96 MiB; 2.919 -> 2.204 s.
- semantic_tree: 815.71 -> 483.81 MiB; 2.484 -> 2.369 s.
- markdown control: 95.52 -> 95.59 MiB; 0.895 -> 0.913 s.

A generated 200,000-row list also completes with identical bytes (one run):
- semantic_tree_text: 3473.02 -> 1775.07 MiB; 13.245 -> 10.015 s.
- semantic_tree: 3803.45 -> 2137.26 MiB; 12.626 -> 10.397 s.

JSON/text comparisons also match the baseline on a mixed fixture containing
hidden/ignored nodes, form values, list markers, shadow DOM, and child frames.
These generated fixtures are independent of the external MOL-269 evidence.

Validation:
- cargo fmt --all
- cargo clippy --workspace --all-targets --all-features -- -D warnings
- cargo nextest run --no-fail-fast (19,885 passed, 17 skipped)
- cargo build --release -p moli

Refs: MOL-269
2026-10-11 17:37:40 +08:00
ldm0 77f70f6e30 chore(wpt): refresh full release case status lists
Refresh all-profile WPT Cross lists from Moli 1.1.16 release at 23c6bb5754
against WPT db95fafd1f, using CDP with 50 workers. Each of 13,631 cases
ran once: 9,674 pass, 3,656 fail, 253 timeout, 37 harness-stalled,
10 error and 1 crash. Pass count rises by 86 (132 gained, 46 lost).

Review all 46 lost passes against the previous snapshot's binary:
41 stable version regressions, 2 existing flaky cases, 1 existing runner
readiness race and 2 cases failing in both versions. Preserve original
full-run outcomes in the lists. Validate exact report agreement, sorted
disjoint coverage and no missing cases; git diff --cached --check passes.
2026-10-11 09:12:27 +08:00
ldm0 3edd4b0aa9 refactor(wpt): consolidate common redirect fixtures 2026-10-07 18:51:53 +08:00
ldm0 84cdb55797 test(cdp): add reproducible Chromium multipage comparisons
Add bounded fixed and random Chromium/Moli comparisons for target lifecycle,
window activity, named-window reuse, opener references and navigation inheritance,
plus a real DevTools frontend probe. Preserve action replay, raw protocol evidence
and target/session mappings while normalizing observed equivalent focus-event
orders and retaining exception identity in comparisons.

Validation: PYTHONPATH=moli-benchmark moli-benchmark/.venv/bin/python -m unittest discover -s moli-benchmark/tests -p test_multipage_cdp_fuzz.py -v.
2026-10-06 01:01:03 +08:00
ldm0 6f9e3a3270 test(wpt): cover trickle response streaming and upload ordering 2026-10-05 05:26:34 +08:00
ldm0 f4ee76bffa fix(wpt): honor CORS opt-in for common redirects 2026-10-05 05:21:30 +08:00
ldm0 4ce0b82a45 chore(wpt): refresh cases after retired Window query fix 2026-10-04 01:38:57 +08:00
ldm0 5fee158929 chore(wpt): refresh cases after callback realm fix
Run the 451451cec release against WPT db95fafd1f with the full all profile,
CDP mode, and 50 workers. Record all 13,631 executed cases: 9,583 passed,
3,724 failed, 259 timed out, 10 errored, 1 crashed, and 54 stalled.

Both Promise and both Wasm entry-settings regressions now pass in the full
run and in all five focused release rounds. Keep the other original full-run
statuses, including errors and intermittent failures; diagnostic comparisons
with main and the previous release do not replace snapshot results.

Audit confirms every raw result agrees with the engine report, matrix, and
eight sorted, disjoint status lists, with no missing or unexecuted cases.
2026-10-04 01:38:57 +08:00
ldm0 452d385891 test(wpt): refresh cases after rebasing global scope fixes
Run the unfiltered all profile with release Moli 1.1.12 built from
0c5f83969f after rebasing onto main
8f7598a30f, using WPT
db95fafd1fcef8428805e41eb5705d444e8c67ce and 50 CDP workers.

Complete all 13,631 cases: 9,578 pass, 3,730 fail, 261 timeout, 9 error,
one crash and 52 harness-stalled. Against main's lists, 11 cases gain pass
and 16 lose pass, for a net decrease of five. Preserve the raw full-run
outcomes.

Validate the unchanged case set and exactly one recorded result per case.
Raw live results, engine output, matrix and all eight sorted, disjoint,
exhaustive status lists agree. No setup errors, missing cases, unknown
statuses or unexecuted recovery placeholders. git diff --check passes.

Check all 16 pass losses against the same release main source and WPT.
Four Promise/Wasm entry tests reproduce a source regression: HEAD times
out in 8/8 paired trials while main passes 8/8. The callback retirement
guard added in 77d2700c6 is the cause; a diagnostic-only fallback restores
all four in 3/3 trials. Keep these failures in the raw timeout list.

Nine losses also fail on main; two original failures remain unreproduced.
rel-attribute-clearing remains suspicious (HEAD 3/28 failures, main 0/28).
Filtered validation does not alter this full-run snapshot.
2026-10-04 01:38:57 +08:00
ldm0 ec8b1d9330 fix(wpt): let harness probes use the remaining case deadline 2026-10-04 00:09:13 +08:00
ldm0 1239fe6888 test(wpt): cover Fetch status fixture response semantics
Cover WPT Fetch status fixture handling, including no-body statuses, preserved HTTP status metadata and redirect targets, through the actual fixture server.
2026-10-03 17:45:10 +08:00
ldm0 8f7598a30f test(wpt): refresh full release case status lists
Run the unfiltered all profile with release Moli 1.1.12 built from
cbb41950af, using WPT
db95fafd1fcef8428805e41eb5705d444e8c67ce and 50 CDP workers.
All 13,631 cases have exactly one recorded Moli attempt.

Moli: 9,583 pass, 3,727 fail, 259 timeout, 9 error, 1 crash,
and 52 harness-stalled. The case set matches the previous refresh;
51 cases gain pass and eight lose pass, for a net gain of 43.
Keep the raw full-run outcomes.

Validate all eight status lists against the raw results and matrix:
sorted, disjoint, exhaustive, with no setup errors, missing cases,
unknown statuses, or unexecuted recovery placeholders.
git diff --check passes.
2026-10-03 13:38:59 +08:00
ldm0 d92d4da858 test(wpt): refresh cases after MIME fixes
Run the full 13,631-case profile on source 112a97e61 with Moli and Chromium
145.0.7632.116 at parallelism 50, using WPT db95fafd1fcef8428805e41eb5705d444e8c67ce.
The case set and fixed scheduling order match the previous full run.

Moli: 9,540 pass, 3,704 fail, 263 timeout, 61 error, 10 crash, 53 harness-stalled.
Chromium: 11,388 pass, 1,897 fail, 242 timeout, 16 error, 18 crash, 70 harness-stalled.
All three JSON module regressions pass on both engines. Relative to 7d9a0a98c,
11 cases gain pass and five lose pass, for a net increase of six.

Keep raw full-run outcomes. Four pass losses pass once on both frozen binaries
in focused diagnostics; SharedWorker-extendedLifetime fails identically in
all three focused runs on each binary, including the pre-fix build.

Validate complete per-engine execution, exact raw/matrix agreement, and sorted,
disjoint, exhaustive status lists. No missing cases or recovery placeholders.
2026-09-29 23:17:46 +08:00
ldm0 9d78cb34af test(wpt): refresh full cases on current head
Run the unfiltered all profile against WPT db95fafd1f with Moli built
from 7f9b8b63d (dev, debug=0) and Chromium 145.0.7632.116, using 50 CDP
workers. Both engines execute all 13,631 cases without setup errors,
missing results, or unexecuted recovery placeholders.

Moli: 9,534 pass, 3,708 fail, 264 timeout, 63 error, 52 harness-stalled,
and 10 crash. Chromium: 11,383 pass, 1,899 fail, 242 timeout, 17 error,
72 harness-stalled, and 18 crash.

Compared with the previous lists, 171 cases gain pass and 11 lose pass,
for a net gain of 160. Of the previous refresh's 104 pass losses, 101
now pass, two fail, and one errors. Retain the original full-run
outcomes; separate diagnostic reruns do not replace list statuses.

Validate all eight lists against the raw results and matrix: sorted,
disjoint, exhaustive, and complete. git diff --check passes.
2026-09-29 23:17:46 +08:00
ldm0 7f9b8b63d7 test(wpt): refresh full cases after navigation preload fix
Run unfiltered profile all on WPT db95fafd1fcef8428805e41eb5705d444e8c67ce
with Moli built from 8ba39c4aa1 and Chromium 145.0.7632.116, 50 workers.
Both engines produced results for all 13,631 cases.

Moli: 9,374 pass, 3,686 fail, 260 timeout, 247 error, 54 harness-stalled,
10 crash. Chromium: 11,334 pass, 1,888 fail, 272 timeout, 30 error,
89 harness-stalled, 18 crash.

Complete 91 previously unexecuted cases after a worker exhausted its
restart budget, using the same binary and fixture in bounded batches.
Use their first measured outcomes (63 pass, 26 fail, 2 timeout); preserve
all actual full-run failures and crashes. Both samesite-iframe and
empty-preload-response-body now pass in both engines.

Validate all eight status lists against the raw results and matrix:
sorted, disjoint, exhaustive, with no missing or unexecuted cases.
Compared with the previous refresh, 65 cases gain pass and 104 lose pass
(98 probe errors, 6 failures). Before/after diagnostic rechecks recover
31 of those 104 on the fixed binary; the other 73 also fail or error on
the old binary. Diagnostic retries do not replace full-run outcomes.
2026-09-29 19:03:23 +08:00
ldm0 ac9b83d21e chore(wpt): refresh full cases with consolidated fixtures
Run the unfiltered all profile on Moli c429911cdf and Chromium
145.0.7632.116 using WPT db95fafd1f and 50 CDP workers. Moli was
built from this branch with cargo build --locked (dev, debug=0).

Both engines completed all 13,631 cases without setup errors or
recovery-aborted cases. Keep the existing 13,558 cases and add 73.
Moli: 9,413 pass, 3,687 fail, 264 timeout, 202 error, 55
harness-stalled, and 10 crash. Chromium: 11,380 pass, 1,899 fail,
243 timeout, 19 error, 72 harness-stalled, and 18 crash.

Verify all eight lists are sorted, disjoint, complete and exactly
match the Moli matrix. Preserve the raw statuses, including 200
five-second CDP evaluate probe timeouts. The previous snapshot
used Moli d40181f729; this refresh is not a controlled fixture A/B.
2026-09-29 19:03:23 +08:00
ldm0 5e80001318 refactor(wpt): unify fixture dispatch and preserve raw response headers
Reconcile the shared HTTP handlers and discovery rules from the split PRs with the complete fixture surface in wpt-misc-fix. Share stash namespaces and XHR dispatch, retain the existing testdriver bridge, preserve raw header values, and carry forward the remaining pipe, template, and dynamic-import regressions.

Validation: 742 Python tests across 74 modules pass; focused Ruff checks and git diff --check pass. With fixed Moli and Chromium binaries, a 27-case WPT comparison against main improves whole-case passes from 7 to 26 and 6 to 23 respectively, with no previously passing case regressing.
2026-09-29 19:03:23 +08:00
ldm0 4473d42935 fix(wpt): serve MIME-controlled nosniff scripts
Carry the remaining HTTP fixture and its regression tests from wpt-misc-fix at 3cd3c8968b.
2026-09-29 19:03:23 +08:00
ldm0 a9dc675b0a fix(wpt): serve form echo bodies as hexadecimal bytes
Carry the remaining HTTP fixture and its regression tests from wpt-misc-fix at 3cd3c8968b.
2026-09-29 19:03:23 +08:00
ldm0 446ac04b9b fix(wpt): serve worker URL encoding fixtures
Carry the remaining HTTP fixture and its regression tests from wpt-misc-fix at 3cd3c8968b.
2026-09-29 19:03:23 +08:00
ldm0 cccefdc7d9 fix(wpt): inspect Fetch request headers across HTTP methods
Bring the remaining Fetch header fixtures from wpt-misc-fix, including early responses to unread uploads, CORS metadata, response status pipes, and handler discovery. Consolidates d210a13a5d and 8e2764e6cd with their current regression tests.
2026-09-29 19:03:23 +08:00
ldm0 bde57e580c fix(wpt): serve the preload request counter fixture
Implement preload/resources/preload-count.py and admit its exact references
during case discovery. Resource requests increment a shared counter and fail
with 404; result requests return JavaScript and consume the count. This lets
the unsupported-type WPT verify that no preload request was sent.

Validation: 432 Python WPT tests across 31 modules, run with 32 workers.
Moli and Chromium both pass the affected WPT and the two related MIME cases
(47 subtests per engine). Only Python and the WPT pass ledger changed.

(cherry picked from commit b8a3d0497d3575200ce28896c8bcde7f8c4719c4)
2026-09-29 19:03:23 +08:00
ldm0 a4604a1939 fix(wpt): model Fetch redirect fixtures
Serve Fetch redirect.py with upstream Origin and credentials responses,
preflight handling, query inheritance, counters, delays and form status codes.
Recognize its relative, absolute and RESOURCES_DIR references during discovery.

Cover the HTTP behavior and discovery with regressions. Verify the fixture
against upstream wptserve, including byte parsing and unread request bodies.

(cherry picked from commit 813bb1b3ecb4e55c5a0167df22494ca5269b1ef1)
2026-09-29 19:03:23 +08:00
ldm0 7ec4a3ac15 fix(wpt): serve XHR request URI and redirect fixtures
Implement requri.py and redirect.py with their upstream query, status,
Location, delay, and method behavior. Preserve raw request URIs and allow
redirect responses before the upload completes.

Recognize supported XHR references during case selection and cover the
fixtures through real HTTP requests.

Validation: all 510 benchmark unit tests pass. With the unchanged Moli
binary, 17 WPT cases improve from 6 to 9 passes and 72 to 79 passing
subtests; both redirected Worker harnesses now execute their assertions.

(cherry picked from commit 456c59b63e4ef997d35dbf984b2406a6c3c75926)
2026-09-29 19:03:23 +08:00
ldm0 53c7e7073f fix(wpt): serve iframe parentage stash results
Support the iframe parentage stash fixture with write-once POST and read-once retrieval, preserving UUID/path namespaces and the difference between an absent value and empty bytes. Reuse the Python-handler response path for pipe processing. Tests cover requests, methods, body framing and case selection.

Validation: all branch checks passed. Ran 333 tests in 135.692s; OK
(cherry picked from commit 39dc2130dc)
2026-09-29 19:03:23 +08:00
ldm0 ef25ac681f fix(wpt): serve charset inheritance handler responses
Serve the bogus HTTP charset fixtures with their original bytes and optional valid meta charset. Match upstream response behavior for HEAD, extension methods and response-pipe bypass. Include exact reference selection and byte-level response tests.

Validation: all branch checks passed. Ran 325 tests in 122.514s; OK
(cherry picked from commit 9827403ad3)
2026-09-29 19:03:23 +08:00