diff --git a/README.md b/README.md index 373d2b0..845be88 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ Under each game: the IPA's size, and "60 fps with 1.2.0" where the game runs at Taiko Risshiden V DX
Taiko Risshiden V DX
~3.3 GB · Japanese · played by touch Unicorn Overlord
Unicorn Overlord
~4 GB +NieR:Automata The End of YoRHa Edition
NieR:Automata The End of YoRHa Edition
~10.9 GB · 60 fps with 1.0.3 diff --git a/dm/games/010056B015FE8000/README.md b/dm/games/010056B015FE8000/README.md new file mode 100644 index 0000000..b8efa1f --- /dev/null +++ b/dm/games/010056B015FE8000/README.md @@ -0,0 +1,76 @@ +# NieR:Automata The End of YoRHa Edition (`010056B015FE8000`) + +Update 1.0.3 (v131072) over the base cartridge dump. PlatinumGames' engine, SDK 12.3.9, NVN, CRI CPK archives and Sofdec USM movies, Wwise audio through `AudioOut`. Modules `main`, `subsdk0` (NintendoSDK_movie) and `sdk`. Mac startup, save creation/loading and opening flight gameplay pass; iPhone testing is pending. + +## What it needs + +| Setting | Where | Why | +|---|---|---| +| `mem_reserve 0x140000000`, `mem_alias 0x118000000`, `mem_stack 0x10000000`, `app_pool 0xCD500000` | [`game.tsv`](game.tsv) | 5 GB guest block with a 4.375 GB alias region; the game maps its own memory there and never sets a heap during startup | +| `sys_resource 0x1000000` | `game.tsv` | the NPDM declares 16 MB of system resource, enabling virtual address memory | +| `pad_layout full` | `game.tsv` | movement and camera/aiming use both sticks | +| `tex_flush_upload on` | `game.tsv` | CPU-filled texture storage is published through mapped-range flushes; without uploads the title background is magenta | +| `feedback_snap fd2c47b73f0e7e24` | `game.tsv` | `filter09.pso` samples the HDR attachment it writes through separate texture slot 128; a snapshot prevents NaNs spreading through bloom | +| `present_interval display` | `game.tsv` | replaces the game's interval-two presentation target with 60 Hz; the native clock already measures elapsed time | +| `gpu_timestamps segment` | `game.tsv` | the renderer subtracts two raw timestamp reports; one timestamp for the whole submission makes its measured GPU cost zero | +| Four dynamic-resolution threshold cuts | [`patches.py`](patches.py) | the verified 1.0.3 main build uses 22.5 / 16.005 / 15 ms thresholds for a 60 fps budget | + +## Files and shaders + +- 660 RomFS files, 10.84 GB: 30 CRI CPK archives (6.20 GB), 162 USM movies (3.52 GB), loose Wwise banks and streams, and Enlighten data. +- **Resolved: the shader split found zero shaders.** Five DAT archives in `data000.cpk` contain 1,371 size-delimited shader objects: 819 pixel, 517 vertex, 31 compute and four geometry objects, before deduplication. Every object has a 0x88-byte binding prefix, a length-prefixed NVN code area, then a length-prefixed 0x880-byte control section. All section bounds and control code lengths agree. They produce 1,225 distinct keys, including the initial runtime keys `f2fd6cfd0ff14a18`, `7855550732b71e48` and `62026f624061e259`. The general reader is linked below. +- The full RomFS scan finds 451 distinct vertex, 739 pixel, 31 compute and four geometry shaders, with 902 single-stage cover pairs. +- **Resolved: magenta title background.** The `render02` / `flush01` route captures frame 1,200 with identical inputs; enabling `tex_flush_upload` alone changes the magenta pixel share from 91.8% to zero and restores the cream title background. `TEXINFO` also finds populated guest texture storage without packaged layouts (for example a 1024×1024 format `0x7d` texture, 279,870 nonzero bytes of 704,512). No dirty-write tracking is enabled. +- **Resolved: geometry shader compilation and binding failures.** All four geometry objects use viewport-mask output in their generated raster reader. The reader's scalar/array mismatch, missing geometry storage-buffer table and incorrect write-flag interpretation are general chain/host fixes linked below. All 1,225 shaders build for Mac and iOS after these changes. +- **Resolved: passthrough output bounds and raster emission.** All four geometry objects set SPH `GpPassthrough` with a raw output bound of one. The earlier metadata underallocated the raw scratch/index region and read the wrong stride, while native passthrough support left compute raster output absent. The shared fixes derive bounds/output topology from input, explicitly emit positions and generic attributes, and preserve viewport-zero culling. Native canaries, compaction and real-translator GPU tests cover every topology and the full capture map. Rebuilt flight scenes render the ship models and effects. +- **Resolved: green flight scene and dark rectangles.** HDR targets contained sparse red/blue NaNs, most on 16-pixel seams; bloom spread them across both channels. `filter09.pso` (`fd2c47b73f0e7e24`) samples the HDR attachment it also writes, through a separate texture slot. The host's snapshot path skipped separate slots before its general fix. `snap01` with the snapshot restores ship, cloud and exhaust colors; scans at frames 3,000, 3,060, 3,540 and 3,600 find no non-finite passes. Both default and active LUTs matched deswizzled guest storage byte-for-byte, ruling out their upload/layout. Enabling dirty-write tracking alone did not fix the green output and is left off. + +## Status on the Mac + +- The title, menus, keyboard naming, a new Easy game with auto-chips, save creation and save loading pass. The opening formation cinematic and ocean combat render ships, clouds, lighting, exhaust, shots and HUD correctly. Left/right movement and firing respond to input (`snap01_control_*`, `fps60_opt_*`). +- Both logo movies decode through NintendoSDK_movie. The final 300-second run exits cleanly after the test's SIGTERM; Wwise output has zero underruns through 28,000 device callbacks. Resident memory peaks around 2,811 MB and Metal allocations around 2,995 MB, then settle below those peaks while the route streams more objects; its last report is 2,794 / 2,933 MB at frame 17,700. +- **Resolved: repeated geometry drains and sorting.** The original heavy flight route spent most sampled main-thread time waiting in `mdi_wait`, followed by sorting capture indices. The shared synchronization/bitset fix linked below removes those hotspots. +- **Resolved: serial geometry prefix scan.** A GPU profile of frame 4,600 in the 720p `fps60_seg` records 79 geometry sequences: 7.246 ms in their serial scans out of a 16.19 ms GPU span, with 521 encoders. The general parallel scan and combined compute encoder preserve ordered primitive compaction; native checks cover 129,032 groups and the translated geometry stages. The final 1080p route's frame 4,600 uses 284 encoders, 4.19 ms compute/copy and an 11.17 ms GPU span. The mode and camera timing differ, so these totals are supporting encoder evidence rather than an isolated same-frame speedup. +- Both standard NSP build workflows pass. The unsigned `NieRAutomata.ipa` is 11,712,290,740 bytes (about 10.9 GiB), with all 1,225 Mac/iOS shader libraries on chain `20fe3d62b9f6` and 331 recorded prewarm entries. Its four cuts and all three embedded main sections match the tested rewrite; all 3,551 archive entries pass CRC verification. The normal Mac executable is `010056B015FE8000_build/tools/dmhost`. +- Work folder: `/Volumes/T7/nsp/NieR Automata The End of YoRHa Edition/010056B015FE8000-work`. `run/boot.py [KEY=VALUE ...]` runs the adjacent `010056B015FE8000_build/tools/dmhost` with bounded duration, control file `run/.ctl`, logs and save data beside it. + +## 60 fps + +Only main build `3c10ec35c5ef4c3686b4053afb0e58e7` gets the four cuts. They replace immediate constants at `0x9bf434`, `0x9bf484`, `0x9bf4d4` and `0x9bf4f8`, with original-byte assertions, following the [FPSLocker 1.0.3 threshold sites](https://github.com/masagrator/FPSLocker-Warehouse/blob/v4/SaltySD/plugins/FPSLocker/patches/010056B015FE8000/3C10EC35C5EF4C36.yaml). No address is carried to another build and no function-matched cuts are enabled. + +The native clock at `main+0x8fc7a8` converts elapsed milliseconds to 60 Hz ticks and clamps each step to [1, 2]. It needs no clock rewrite. Probe `main:8fc888@x19+b0` reads step, accumulator, scale and elapsed milliseconds. The paired title runs measure 33.34 ms / step 2 at the original target and 16.66 ms / step 1 at 60 Hz. Slow flight before the geometry fix clamps to step 2 and loses game time; raising the presentation target alone was insufficient. + +The final M4 Pro run, `fps60_final`, uses the profile's default console mode (1920×1080), 60 Hz presentation, the four 1.0.3 cuts, the current shader chain, sound and native-clock/DR probes. No resolution reduction is required for this route: + +| Window after launch | Average fps | Frame p50 / p95 | Average GPU time | Game seconds / wall second | +|---|---:|---:|---:|---:| +| 80–110 s, heavy opening formation | 59.79 | 16.67 / 17.99 ms | 10.15 ms | 1.011 | +| 120–150 s, flight transition | 60.03 | 16.67 / 17.23 ms | 10.99 ms | 1.010 | +| 170–200 s, free flight | 60.00 | 16.66 / 17.39 ms | 10.93 ms | 1.011 | +| 220–250 s, ocean combat | 59.92 | 16.66 / 17.26 ms | 10.06 ms | 1.009 | + +These are measured windows, not a full-game or iPhone frame-rate guarantee. The frame rate stays near 60 with occasional longer frames; the native clock's minimum-one-tick clamp gives about 1% timing bias with host jitter in these flight windows. + +Reproduce the save-load route with `DM_KEYS=40:A,45:A,50:A,52:Left,53:A,60:A`, `DM_PRESENT_LINK=0` and sound enabled. Headless timing runs unset `DM_WINDOW`. To compare the original presentation target, set `DM_PRESENT_INTERVAL=game`; `display` selects 60 Hz. `DM_OPMODE=0` selects the game's native 720p handheld mode; `1` selects 1080p console mode. + +**Resolved: dynamic-resolution cost reads zero or 32 times too small.** The renderer's producer at `main+0x9ba6d4` waits for a ring fence, maps its counter buffer and subtracts timestamp fields at +8 and +0x18; its inline conversion publishes milliseconds through renderer +0x10c4. Submission timestamps gave zero. Segment timestamps need the shared raw-unit fix linked below: this consumer expects 614.4 MHz, while the host previously wrote 19.2 MHz. Both report paths and the nanosecond API now use the proper rate. The native scale floor is currently 1.0; its existing preset setter can select 0.7. No floor override is applied. + +## Found on this game + +- [Size-delimited PlatinumGames shader objects](../../../docs/reference/shaders.md#size-delimited-platinumgames-shader-objects). +- [Mapped-range flushes taken as uploads](../../../docs/reference/nvn-objects.md#mapped-range-flushes-taken-as-uploads-tex_flush_upload). +- [Geometry reader viewport masks](../../../docs/reference/shaders.md#geometry-reader-viewport-masks). +- [Geometry-stage storage-buffer table](../../../docs/reference/shaders.md#geometry-stage-storage-buffer-table). +- [Storage-buffer write flag in translation metadata](../../../docs/reference/shaders.md#storage-buffer-write-flag-in-translation-metadata). +- [Passthrough geometry output bounds follow input topology](../../../docs/reference/shaders.md#passthrough-geometry-output-bounds-follow-input-topology). +- [Passthrough geometry kernels lose raster vertices](../../../docs/reference/shaders.md#passthrough-geometry-kernels-lose-raster-vertices). +- [Same-pass feedback read through a snapshot](../../../docs/reference/rendering.md#same-pass-feedback-read-through-a-snapshot). +- [Geometry capture waits for every indexed draw](../../../docs/reference/shaders.md#geometry-capture-waits-for-every-indexed-draw). +- [Geometry compaction serial prefix scan](../../../docs/reference/shaders.md#geometry-compaction-serial-prefix-scan). +- [Raw NVN timestamp units](../../../docs/reference/frame-rate.md#raw-nvn-timestamp-units). +- [GPU timestamps per submission segment](../../../docs/reference/frame-rate.md#gpu-timestamps-per-submission-segment). + +## Open + +- Conditional rendering is still drawn unconditionally (`SetRenderEnableConditional` is the route's only `[RED]` warning); no visible fault was found from it in this route. +- Validate on an iPhone and test beyond the opening flight; full-game coverage is pending. diff --git a/dm/games/010056B015FE8000/bf_want.tsv b/dm/games/010056B015FE8000/bf_want.tsv new file mode 100644 index 0000000..54caeb8 --- /dev/null +++ b/dm/games/010056B015FE8000/bf_want.tsv @@ -0,0 +1 @@ +# generated diff --git a/dm/games/010056B015FE8000/game.tsv b/dm/games/010056B015FE8000/game.tsv new file mode 100644 index 0000000..c680d37 --- /dev/null +++ b/dm/games/010056B015FE8000/game.tsv @@ -0,0 +1,47 @@ +# NieR:Automata 1.0.3 (v131072), PlatinumGames engine, SDK 12.3.9, NVN. +# Format: see dm/games/README.md; bring-up evidence and status: README.md. + +# ---- Identity ---- +title_id 010056B015FE8000 +program_id 010056B015FE8000 + +# ---- App ---- +name NieR:Automata The End of YoRHa Edition +ipa NieRAutomata.ipa +app_category public.app-category.action-games +# Movement and aiming/camera use both sticks. +pad_layout full + +# ---- Versions ---- +build v131072 1.0.3 main=3c10ec35c5ef4c3686b4053afb0e58e7 subsdk0=be1ee79a9968a35a6b63fc8f1036a6d4 sdk=e8cdceb1e77a8465fe20f21928e8d296 +package v131072 +shader_versions v131072 + +# ---- Files ---- +# every module main imports from +modules main subsdk0 sdk +romfs_marker data014.cpk +zip_store .bnk:.cpk:.usm:.wem:.wsp:.metallib + +# ---- Memory ---- +# the NPDM declares 16 MB of system resource (virtual address memory) and main never sets a heap: a 5 GB block with a 4.375 GB alias region, where the game maps its memory itself +mem_reserve 0x140000000 +mem_alias 0x118000000 +mem_stack 0x10000000 +app_pool 0xCD500000 +# the NPDM declares 16 MB of system resource +sys_resource 0x1000000 + +# ---- Rendering ---- +# The native clock measures elapsed time; dynamic-resolution thresholds target 60 fps in patches.py. +present_interval display +# The renderer subtracts two raw timestamp reports to measure its GPU cost. +gpu_timestamps segment +# The game fills texture storage on the CPU and publishes it with mapped-range flushes. +tex_flush_upload on +# filter09 samples its own HDR attachment through a separate texture slot. +feedback_snap fd2c47b73f0e7e24 + +# ---- Shader split ---- +shader_groups /Enlighten/=enlighten /movie/=movie /sound/=sound /movie_logo/=movielogo +shader_note NieR:Automata The End of YoRHa Edition shaders diff --git a/dm/games/010056B015FE8000/patches.py b/dm/games/010056B015FE8000/patches.py new file mode 100644 index 0000000..45c1b78 --- /dev/null +++ b/dm/games/010056B015FE8000/patches.py @@ -0,0 +1,15 @@ +# NieR:Automata (010056B015FE8000): patches of this game's own builds, keyed by NSO build ID. +# The rewriter asserts each original byte sequence before applying a CUTS entry. +CUTS = { + # 1.0.3 (v131072) main: dynamic resolution compares measured frame cost with 45 / 32.01 / 30 ms thresholds for the Switch's 30 fps target. + # At 60 fps use 1.35 / 0.9603 / 0.9 times 1000/60 ms: 22.5 / 16.005 / 15 ms. These are the four sites verified by FPSLocker Warehouse: + # https://github.com/masagrator/FPSLocker-Warehouse/blob/v4/SaltySD/plugins/FPSLocker/patches/010056B015FE8000/3C10EC35C5EF4C36.yaml + # Keep the instruction sequence and replace its constants directly; the profile's present_interval display supplies the 60 Hz presentation target. + # The game clock already measures elapsed time at 60 ticks per second (main+0x8fc7a8); it needs no frame-step rewrite. + '3c10ec35c5ef4c3686b4053afb0e58e7': [ + (0x9bf434, '8c46a8528301271e', '8c36a8528301271e', 'dynamic resolution: bad frame cost 45 -> 22.5 ms at 60 fps'), + (0x9bf484, 'ac4781520c40a872', 'ac4781520c30a872', 'dynamic resolution: optimal frame cost 32.01 -> 16.005 ms at 60 fps (first load)'), + (0x9bf4d4, 'ac4781520c40a87283cc201e8001271e', 'ac4781520c30a87283cc201e8001271e', 'dynamic resolution: optimal frame cost 32.01 -> 16.005 ms at 60 fps (second load)'), + (0x9bf4f8, '00d0271e', '00d0251e', 'dynamic resolution: good frame cost 30 -> 15 ms at 60 fps'), + ], +} diff --git a/dm/games/010056B015FE8000/pso_manifest.tsv b/dm/games/010056B015FE8000/pso_manifest.tsv new file mode 100644 index 0000000..a0ac333 --- /dev/null +++ b/dm/games/010056B015FE8000/pso_manifest.tsv @@ -0,0 +1,333 @@ +# Prewarm seed list: NieR:Automata 1.0.3, Mac title, save load and opening flight combat. +# Rows: Sshader keystage / Rrender pipeline key / Ccompute shader key. +S f2fd6cfd0ff14a18_b 0 +S 7855550732b71e48_b 1 +R 663266643663666430666631346131385f62000000000000373835353535303733326237316534385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 65426d1f51dbaa57_b 0 +S b437477297003e29_b 1 +R 363534323664316635316462616135375f62000000000000623433373437373239373030336532395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 54855c38a82e3f39_b 0 +S ce2642e6452fe67c_b 1 +S 5578d381f2aba12e_b 1 +R 353438353563333861383265336633395f62000000000000636532363432653634353266653637635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 4072f08f140e1da8_b 5 +C 4072f08f140e1da8_b +R 353438353563333861383265336633395f62000000000000353537386433383166326162613132655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f897d9ae7bc2050f_b 5 +C f897d9ae7bc2050f_b +S 5a5c9133d0f16649_b 0 +S f7dfe9e15839daa3_b 1 +R 356135633931333364306631363634395f62000000000000663764666539653135383339646161335f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 46e8cd0de7414e7f_b 0 +S 62026f624061e259_b 1 +R 343665386364306465373431346537665f62000000000000363230323666363234303631653235395f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 3075f4bd6e97a74b_b 0 +S 6be4be1df7441a64_b 1 +R 333037356634626436653937613734625f62000000000000366265346265316466373434316136345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 216aa0959283e224_b 1 +S fe25a5abd42c1333_b 1 +S 869fc2472b4ea013_b 1 +S df6e63a1cf5740a7_b 1 +S af6be82ada4ab609_b 1 +S 7b61c45a469b1f1b_b 1 +S b41adaf519bed4dc_b 1 +R 353438353563333861383265336633395f62000000000000323136616130393539323833653232345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353438353563333861383265336633395f62000000000000666532356135616264343263313333335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 663266643663666430666631346131385f62000000000000383639666332343732623465613031335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff00000000088b0581040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353438353563333861383265336633395f62000000000000646636653633613163663537343061375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000005c000000000000000000000000000000000000000000000000000000000000000000000001000000000000007700ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353438353563333861383265336633395f62000000000000616636626538326164613461623630395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353438353563333861383265336633395f62000000000000376236316334356134363962316631625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 663266643663666430666631346131385f62000000000000383639666332343732623465613031335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000700ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 663266643663666430666631346131385f62000000000000383639666332343732623465613031335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff0000000010080481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 663266643663666430666631346131385f62000000000000623431616461663531396265643464635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 167b8b8aa79b4262_b 0 +S 38576bae7718d067_b 1 +R 313637623862386161373962343236325f62000000000000333835373662616537373138643036375f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S c0ed2509be567cef_b 1 +S 8cc2ef399c68e1e0_b 0 +S a176007d74d54879_b 1 +S 9e275b948823ffb2_b 1 +S 2a4420c4331b87e7_b 0 +S c56225e38c167f60_b 1 +S 9a2be07bdef5ad90_b 1 +R 313637623862386161373962343236325f62000000000000633065643235303962653536376365665f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000280804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386363326566333939633638653165305f62000000000000613137363030376437346435343837395f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff0000000028180a860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e100000000000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000396532373562393438383233666662325f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326134343230633433333162383765375f62000000000000633536323235653338633136376636305f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff0000000028180a860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e100000000000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000396132626530376264656635616439305f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000633065643235303962653536376365665f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000396532373562393438383233666662325f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000280804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000333835373662616537373138643036375f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000280804810500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000396132626530376264656635616439305f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000280804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386363326566333939633638653165305f62000000000000613137363030376437346435343837395f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000280804810500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e100000000000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S fbcd81e58fa6bf78_b 0 +S 49bd7a780255b6e9_b 1 +S 137b54dc5462e5bb_b 2 +S 137b54dc5462e5bb_bg3 2 +S 137b54dc5462e5bb_bgv 0 +R 313337623534646335343632653562625f62677600000000343962643761373830323535623665395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 5c55eae177dace24_b 0 +S 57290de615ee7295_b 1 +S e7a8b3a1f5573ed5_b 5 +C e7a8b3a1f5573ed5_b +R 356335356561653137376461636532345f62000000000000353732393064653631356565373239355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 9be04df03c735fe6_b 5 +C 9be04df03c735fe6_b +S 13fb7b749ddae3e3_b 5 +C 13fb7b749ddae3e3_b +S 18a435d220de55ff_b 0 +R 313861343335643232306465353566665f62000000000000343962643761373830323535623665395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313637623862386161373962343236325f62000000000000633065643235303962653536376365665f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000280804810500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e2000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 85676cd8b3df3c91_b 0 +S 05daf17a1d8bc556_b 1 +R 383536373663643862336466336339315f62000000000000303564616631376131643862633535365f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000016100000161800002e2000002e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 9000f50a7f75f079_b 5 +C 9000f50a7f75f079_b +S a1702cc1957ebba5_b 5 +C a1702cc1957ebba5_b +S a8dd21c1a70c4f58_b 5 +C a8dd21c1a70c4f58_b +S 957b438fe26d42d7_b 5 +C 957b438fe26d42d7_b +S 0bc5457eddc461e0_b 5 +C 0bc5457eddc461e0_b +S d60cb43c9eec8a9e_b 5 +C d60cb43c9eec8a9e_b +S 5f880399702b500c_b 0 +S ac309751c3e03b53_b 1 +R 356638383033393937303262353030635f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 187155c4af22ae76_b 0 +S 951331942e24f535_b 1 +S c119ee64a3e14a6d_b 1 +S 8c35b63ea0e416f8_b 0 +S ba879d1a5066adcb_b 1 +R 313837313535633461663232616537365f62000000000000393531333331393432653234663533355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000633131396565363461336531346136645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386333356236336561306534313666385f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000626138373964316135303636616463625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000616333303937353163336530336235335f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 00086b38854dbb7d_b 0 +S 32b1ff538c7f5a22_b 1 +R 303030383662333838353464626237645f62000000000000333262316666353338633766356132325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f87b8075106ce3d1_b 1 +R 356638383033393937303262353030635f62000000000000663837623830373531303663653364315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000005018028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 35918cd6ef409d47_b 0 +S c2f38b84d2c4e4d2_b 1 +R 333539313863643665663430396434375f62000000000000633266333862383464326334653464325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 5b7145817478b9e7_b 0 +S ea056aefdcc718fa_b 1 +R 356237313435383137343738623965375f62000000000000656130353661656664636337313866615f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000700ffff00000000281804810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e100000000000002e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 27e74443a67249cf_b 0 +S fd2c47b73f0e7e24_b 1 +R 323765373434343361363732343963665f62000000000000666432633437623733663065376532345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000700ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S eaf2df477c4919a3_b 0 +S 317bc48071a2dad7_b 0 +S 7b1100e8e9c11eca_b 1 +S 4a2b0df808307d63_b 2 +S 4a2b0df808307d63_bg3 2 +S 4a2b0df808307d63_bgv 0 +R 346132623064663830383330376436335f62677600000000376231313030653865396331316563615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 23522240236d2b54_b 0 +S 4ea5793c080d8942_b 0 +S 4b89d7798c7db77e_b 1 +S 8d9d5331523f7131_b 0 +S 176547245fdff6b1_b 1 +S 6f93dc566009c1a0_b 0 +S a27ababf8a8adb96_b 1 +S c0693ab8b19c70c9_b 0 +S 1c487ae9c00f701a_b 1 +S 15f99d6b2584dc48_b 0 +S 0e46d7a4f4ad2f7f_b 1 +S 31d3215892261509_b 1 +S c57286ef1fde5711_b 0 +R 323335323232343032333664326235345f62000000000000343962643761373830323535623665395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000002714000025180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346561353739336330383064383934325f62000000000000346238396437373938633764623737655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386439643533333135323366373133315f62000000000000313736353437323435666466663662315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366639336463353636303039633161305f62000000000000613237616261626638613861646239365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290400080000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633036393361623862313963373063395f62000000000000316334383761653963303066373031615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313566393964366232353834646334385f62000000000000306534366437613466346164326637665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346561353739336330383064383934325f62000000000000333164333231353839323236313530395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633537323836656631666465353731315f62000000000000353732393064653631356565373239355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff0000000048040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 5bc10e8e62fdf92b_b 1 +R 386439643533333135323366373133315f62000000000000356263313065386536326664663932625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 317b2aa94bc181e2_b 0 +S 915f419ee6ec9147_b 1 +S 4af18498a895f57b_b 0 +S 480167c6e07ebabb_b 1 +S 097ff49ca182250e_b 0 +S 8166d5ef5dec556c_b 1 +R 356335356561653137376461636532345f62000000000000353732393064653631356565373239355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333137623261613934626331383165325f62000000000000393135663431396565366563393134375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002518000029000008000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346166313834393861383935663537625f62000000000000343830313637633665303765626162625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002518000029000008000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303937666634396361313832323530655f62000000000000383136366435656635646563353536635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 44bf8b3fb1a520f3_b 0 +S 3601f0cbce8c8fae_b 1 +R 343462663862336662316135323066335f62000000000000333630316630636263653863386661655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 66ba9531fa973a4b_b 1 +S 1865bf0505118a21_b 1 +S cabfe9953b061521_b 0 +R 356638383033393937303262353030635f62000000000000363662613935333166613937336134625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000313836356266303530353131386132315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 636162666539393533623036313532315f62000000000000313836356266303530353131386132315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800002504000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 22559a5d012bcfe9_b 0 +S ab378ee0b46b3bf1_b 1 +R 323235353961356430313262636665395f62000000000000616233373865653062343662336266315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 6d95d272391f899b_b 0 +S 7c7dec85e83167ed_b 1 +R 366439356432373233393166383939625f62000000000000376337646563383565383331363765645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 47303205c5b2b2db_b 1 +R 366439356432373233393166383939625f62000000000000343733303332303563356232623264625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 924549389994d73c_b 0 +R 393234353439333839393934643733635f62000000000000343962643761373830323535623665395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290000002e0000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S ad605bb71408b791_b 1 +R 313337623534646335343632653562625f62677600000000616436303562623731343038623739315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 3ff064bdad4f2152_b 1 +S b487b287f7eba379_b 1 +R 346132623064663830383330376436335f62677600000000336666303634626461643466323135325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633537323836656631666465353731315f62000000000000623438376232383766376562613337395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff0000000048040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 0ca08863622f48e3_b 1 +R 356335356561653137376461636532345f62000000000000306361303838363336323266343865335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 1f85d195cc4880d7_b 1 +S f587a5955e3880b5_b 1 +R 386439643533333135323366373133315f62000000000000316638356431393563633438383064375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366639336463353636303039633161305f62000000000000663538376135393535653338383062355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290400080000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633537323836656631666465353731315f62000000000000306361303838363336323266343865335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff0000000048040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 147106bbef6f8b1a_b 1 +R 313566393964366232353834646334385f62000000000000313437313036626265663666386231615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000383136366435656635646563353536635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366439356432373233393166383939625f62000000000000616233373865653062343662336266315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000700ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000383136366435656635646563353536635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303937666634396361313832323530655f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 87f4ea2936a0e90b_b 1 +R 386439643533333135323366373133315f62000000000000383766346561323933366130653930625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000011000008290800080000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 30c40d9559b78eab_b 0 +R 333063343064393535396237386561625f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000025180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 8317525804b1f341_b 0 +S 242ad8600bfc2b6f_b 1 +R 383331373532353830346231663334315f62000000000000323432616438363030626663326236665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000025180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S c802fe0a8cd8de2e_b 0 +S 335c6a03b18ba361_b 1 +R 633830326665306138636438646532655f62000000000000333335633661303362313862613336315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000290000082900001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S dbdd4a4c311713f2_b 0 +S 2a709697b3633bff_b 1 +R 646264643461346333313137313366325f62000000000000326137303936393762333633336266665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 27d006f56f9e71cf_b 1 +S aa7e9ae5cceebd07_b 0 +S 5cbe7c78863df41f_b 1 +R 646264643461346333313137313366325f62000000000000323764303036663536663965373163665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 616137653961653563636565626430375f62000000000000356362653763373838363364663431665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 686414e8eef18e19_b 1 +R 356638383033393937303262353030635f62000000000000363836343134653865656631386531395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 2fec68ad345a00ce_b 0 +S d56528d0b0b6ac87_b 1 +S d2605ef087e446a1_b 0 +S 07de47162192fec7_b 1 +S 45d81a473a5f853a_b 1 +S cfa6e5b9379506fe_b 1 +S 004f3abb6c4ac1d8_b 1 +R 326665633638616433343561303063655f62000000000000643536353238643062306236616338375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000290000082900001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000008000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000363662613935333166613937336134625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643236303565663038376534343661315f62000000000000303764653437313632313932666563375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000343564383161343733613566383533615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000636661366535623933373935303666655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 616137653961653563636565626430375f62000000000000303034663361626236633461633164385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303937666634396361313832323530655f62000000000000383136366435656635646563353536635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028080a860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 7dda3d1efa67bfa0_b 0 +S c195767a8b43a6ea_b 1 +R 376464613364316566613637626661305f62000000000000633139353736376138623433613665615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001022000018250c00180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 1c51616cce770866_b 0 +S d7c9a92fe3ab4385_b 1 +S 5d54918ab58471fa_b 1 +R 316335313631366363653737303836365f62000000000000643763396139326665336162343338355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001022000018250c00180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 316335313631366363653737303836365f62000000000000356435343931386162353834373166615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001022000018250c00180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 018d05d06e74d76f_b 5 +C 018d05d06e74d76f_b +R 326665633638616433343561303063655f62000000000000643536353238643062306236616338375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000290000082900001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000008000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 4fbd33883a8d4656_b 1 +R 343462663862336662316135323066335f62000000000000346662643333383833613864343635365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000001004028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 72a5eb8f7c029309_b 1 +R 343462663862336662316135323066335f62000000000000346662643333383833613864343635365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028605000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 343462663862336662316135323066335f62000000000000373261356562386637633032393330395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 8971677029c75df0_b 0 +R 383937313637373032396337356466305f62000000000000313736353437323435666466663662315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 13386def4bfcabe5_b 0 +R 313333383664656634626663616265355f62000000000000313836356266303530353131386132315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 063c1af58c3213f2_b 0 +R 356638383033393937303262353030635f62000000000000343564383161343733613566383533615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303633633161663538633332313366325f62000000000000643763396139326665336162343338355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800002e000008250c0008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000343564383161343733613566383533615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028080a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S de59ef04e8eadad0_b 5 +C de59ef04e8eadad0_b +S ee57bd3b73c9fe7d_b 5 +C ee57bd3b73c9fe7d_b +S 59531a4ae5e35b53_b 5 +C 59531a4ae5e35b53_b +S db5f9ca88a17671b_b 5 +C db5f9ca88a17671b_b +R 356638383033393937303262353030635f62000000000000616333303937353163336530336235335f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff0000000028180a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 1eb8d5b0fcd3627e_b 0 +S d653f2bfc07a7c75_b 1 +S 9ff4a40f4e4d72c1_b 0 +S 0d3e57ccad0e0335_b 0 +S c9f0217965db1050_b 1 +S 16130a95a06ad436_b 0 +S 29a1250c30216387_b 1 +R 316562386435623066636433363237655f62000000000000643635336632626663303761376337355f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff0000000028180a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000290000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 396666346134306634653464373263315f62000000000000356435343931386162353834373166615f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff0000000028180a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000251800002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 306433653537636361643065303333355f62000000000000633966303231373936356462313035305f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000000000000000000000010000000f0000000f00ffff0000000028180a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000290000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313631333061393561303661643433365f62000000000000323961313235306333303231363338375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 4cee2136a047e8be_b 0 +S 42be10c2fd8feb1e_b 1 +R 346365653231333661303437653862655f62000000000000343262653130633266643866656231655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000251800002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S d8aed7e827ac0817_b 0 +S 5aa81f6bd90fb6d5_b 1 +R 643861656437653832376163303831375f62000000000000356161383166366264393066623664355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000251800002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 396666346134306634653464373263315f62000000000000356435343931386162353834373166615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000251800002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 0dfbe641afa019fe_b 1 +R 343462663862336662316135323066335f62000000000000306466626536343161666130313966655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028080a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S d96667c18c3d1d9d_b 0 +S a5486013a179d13a_b 1 +R 643936363637633138633364316439645f62000000000000613534383630313361313739643133615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000002714000025180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028605000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S d4163f0e3fa71736_b 1 +R 366439356432373233393166383939625f62000000000000643431363366306533666137313733365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366439356432373233393166383939625f62000000000000343733303332303563356232623264625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 616137653961653563636565626430375f62000000000000303034663361626236633461633164385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000700ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366439356432373233393166383939625f62000000000000323764303036663536663965373163665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356638383033393937303262353030635f62000000000000626138373964316135303636616463625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 23269153708c4022_b 1 +R 366439356432373233393166383939625f62000000000000323332363931353337303863343032325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386333356236336561306534313666385f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S bd6a98605d7d8dda_b 1 +R 303937666634396361313832323530655f62000000000000626436613938363035643764386464615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S edae9db9494d0d8d_b 1 +R 303030383662333838353464626237645f62000000000000656461653964623934393464306438645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030383662333838353464626237645f62000000000000656461653964623934393464306438645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002808028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 636162666539393533623036313532315f62000000000000616333303937353163336530336235335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800002504000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e3b4b7cc9fe7f581_b 0 +S 7564b55d5e84edbc_b 1 +R 653362346237636339666537663538315f62000000000000373536346235356435653834656462635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 01d32dbfe956c1f3_b 1 +R 333539313863643665663430396434375f62000000000000303164333264626665393536633166335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000700ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303937666634396361313832323530655f62000000000000633131396565363461336531346136645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff00000000281802860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303937666634396361313832323530655f62000000000000383136366435656635646563353536635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180a860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000160000081600001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 66db13312407223e_b 0 +R 383937313637373032396337356466305f62000000000000356263313065386536326664663932625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f6ec5c17a2390753_b 1 +R 356335356561653137376461636532345f62000000000000663665633563313761323339303735335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 143c95fa6bb7fc68_b 0 +S 216abf94edd48257_b 1 +R 313433633935666136626237666336385f62000000000000323136616266393465646434383235375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800002e000008250c0008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 8ad6cf0376b55912_b 1 +R 343462663862336662316135323066335f62000000000000386164366366303337366235353931325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029000000110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 383937313637373032396337356466305f62000000000000356263313065386536326664663932625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 383937313637373032396337356466305f62000000000000313736353437323435666466663662315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 0ff2b3373c66d85e_b 1 +R 383937313637373032396337356466305f62000000000000306666326233333733633636643835655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 0cb53cd5f310dc2e_b 1 +R 383937313637373032396337356466305f62000000000000306362353363643566333130646332655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000111400002900000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313333383664656634626663616265355f62000000000000383136366435656635646563353536635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff0000000028180286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000001110000027140000251800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 87be4f2b6e0ccb2e_b 0 +S 9c6f16c9691a0414_b 1 +R 383762653466326236653063636232655f62000000000000396336663136633936393161303431345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000000401000004010000010000000f0000000f00ffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c000011100000271400002518000029080008000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 diff --git a/dm/games/010056B015FE8000/shader_facts.tsv b/dm/games/010056B015FE8000/shader_facts.tsv new file mode 100644 index 0000000..a5e3e0b --- /dev/null +++ b/dm/games/010056B015FE8000/shader_facts.tsv @@ -0,0 +1,32 @@ +# Answer table for translation queries (generated by dm/gfx/tools/shader_split.py, do not edit): key fact JSON. This game has no PC version to pair with: only the thread group / shared memory of compute shaders (taken from the control section); other queries get the translator defaults +018d05d06e74d76f {"local":[1024,1,1],"shared":0} +0bc5457eddc461e0 {"local":[1024,1,1],"shared":0} +0febe44312c0d328 {"local":[1024,1,1],"shared":0} +13fb7b749ddae3e3 {"local":[256,1,1],"shared":1024} +14206a699c7c386c {"local":[1024,1,1],"shared":0} +4072f08f140e1da8 {"local":[16,16,1],"shared":0} +50ada2c643a0588e {"local":[1024,1,1],"shared":0} +59531a4ae5e35b53 {"local":[1024,1,1],"shared":0} +674bfb353124bc97 {"local":[1024,1,1],"shared":0} +77a0de8243f56f03 {"local":[1024,1,1],"shared":0} +80a484813d46c213 {"local":[32,32,1],"shared":0} +80b069d0f0564d71 {"local":[4,1,1],"shared":0} +80c196aa5760ce34 {"local":[32,30,1],"shared":18432} +83d07e6559f93bd9 {"local":[4,1,1],"shared":0} +9000f50a7f75f079 {"local":[1024,1,1],"shared":0} +957b438fe26d42d7 {"local":[1024,1,1],"shared":20480} +9be04df03c735fe6 {"local":[8,8,1],"shared":256} +a1702cc1957ebba5 {"local":[1024,1,1],"shared":0} +a23ffa20896a1366 {"local":[1024,1,1],"shared":0} +a8dd21c1a70c4f58 {"local":[16,1,1],"shared":0} +bc4ab6938c1bceac {"local":[4,1,1],"shared":0} +d3cd49deb376ac1f {"local":[32,30,1],"shared":18240} +d481918e7ee673c6 {"local":[32,30,1],"shared":0} +d5077e43ea265ae8 {"local":[32,18,1],"shared":0} +d60cb43c9eec8a9e {"local":[16,1,1],"shared":0} +db5f9ca88a17671b {"local":[1024,1,1],"shared":8192} +dd75cd3bcb3407bc {"local":[40,24,1],"shared":0} +de59ef04e8eadad0 {"local":[1024,1,1],"shared":0} +e7a8b3a1f5573ed5 {"local":[16,16,1],"shared":6448} +ee57bd3b73c9fe7d {"local":[1,1,1],"shared":0} +f897d9ae7bc2050f {"local":[16,16,1],"shared":2048} diff --git a/dm/games/010056B015FE8000/shader_map.tsv b/dm/games/010056B015FE8000/shader_map.tsv new file mode 100644 index 0000000..ce991cb --- /dev/null +++ b/dm/games/010056B015FE8000/shader_map.tsv @@ -0,0 +1,1228 @@ +# kind: evidence NieR:Automata The End of YoRHa Edition shaders (PlatinumGames shader objects in RomFS + main) → control section + code area keys (dm/gfx/tools/shader_split.py) +# column 5 records where each key first appears; this game has no PC version to pair with +package index stage dm_ctl_sha16 source +ps_other.bin 0 pixel 6d5f4da2a060e14d /data000.cpk/autoshadereff.dat/PS_BASE_SBLMCFXXXXXX.pso#PGSO +ps_other.bin 1 pixel e73ad46523db55d9 /data000.cpk/autoshadereff.dat/PS_BASE_SBLMCXXXXXXX.pso#PGSO +ps_other.bin 2 pixel ee5918a17a87266c /data000.cpk/autoshadereff.dat/PS_BASE_SBLMXXXXXXXX.pso#PGSO +ps_other.bin 3 pixel abc45aa3d28ce9d4 /data000.cpk/autoshadereff.dat/PS_BASE_SBXMCFXXXXXX.pso#PGSO +ps_other.bin 4 pixel e0b6eb12591e3f01 /data000.cpk/autoshadereff.dat/PS_BASE_SBXMCXXXXXXX.pso#PGSO +ps_other.bin 5 pixel 4794a15c89b8ec93 /data000.cpk/autoshadereff.dat/PS_BASE_SBXMXFXXXXXX.pso#PGSO +ps_other.bin 6 pixel 12bf82ade4eec812 /data000.cpk/autoshadereff.dat/PS_BASE_SBXMXXXXXXXX.pso#PGSO +ps_other.bin 7 pixel 994e97bd1ae16eb8 /data000.cpk/autoshadereff.dat/PS_BASE_SBXXCFXXXXXX.pso#PGSO +ps_other.bin 8 pixel 3da542f6dd716e8c /data000.cpk/autoshadereff.dat/PS_BASE_SBXXCXXXXXXD.pso#PGSO +ps_other.bin 9 pixel 3b3b433ae636efa4 /data000.cpk/autoshadereff.dat/PS_BASE_SBXXCXXXXXXX.pso#PGSO +ps_other.bin 10 pixel d9b494b938417bde /data000.cpk/autoshadereff.dat/PS_BASE_SBXXXFXXXXXX.pso#PGSO +ps_other.bin 11 pixel 07de47162192fec7 /data000.cpk/autoshadereff.dat/PS_BASE_SBXXXXXXXXXX.pso#PGSO +ps_other.bin 12 pixel 2b2728804616b5bf /data000.cpk/autoshadereff.dat/PS_BASE_SXLMCFXXXXXX.pso#PGSO +ps_other.bin 13 pixel d632918223c2a948 /data000.cpk/autoshadereff.dat/PS_BASE_SXLMCXXXXXXX.pso#PGSO +ps_other.bin 14 pixel 9b061f7660349f8e /data000.cpk/autoshadereff.dat/PS_BASE_SXLMXFXXXXXX.pso#PGSO +ps_other.bin 15 pixel 121db1047588813c /data000.cpk/autoshadereff.dat/PS_BASE_SXLMXXXXXXXX.pso#PGSO +ps_other.bin 16 pixel 906969a2b6c964de /data000.cpk/autoshadereff.dat/PS_BASE_SXXMCFXRXXXX.pso#PGSO +ps_other.bin 17 pixel 953f601f3e130898 /data000.cpk/autoshadereff.dat/PS_BASE_SXXMCFXXXXXD.pso#PGSO +ps_other.bin 18 pixel 6331352500653159 /data000.cpk/autoshadereff.dat/PS_BASE_SXXMCFXXXXXX.pso#PGSO +ps_other.bin 19 pixel fe7579dd1b24a93b /data000.cpk/autoshadereff.dat/PS_BASE_SXXMCXXXXXXX.pso#PGSO +ps_other.bin 20 pixel bf3b2717c00b1523 /data000.cpk/autoshadereff.dat/PS_BASE_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 21 pixel f3e3a29a7fd2ee36 /data000.cpk/autoshadereff.dat/PS_BASE_SXXMXXXRXXXX.pso#PGSO +ps_other.bin 22 pixel 45d81a473a5f853a /data000.cpk/autoshadereff.dat/PS_BASE_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 23 pixel 3601f0cbce8c8fae /data000.cpk/autoshadereff.dat/PS_BASE_SXXXCFXXXXXX.pso#PGSO +ps_other.bin 24 pixel cfa6e5b9379506fe /data000.cpk/autoshadereff.dat/PS_BASE_SXXXCXXXXXXX.pso#PGSO +ps_other.bin 25 pixel 4b963678d44893ea /data000.cpk/autoshadereff.dat/PS_BASE_SXXXXFXRXXXX.pso#PGSO +ps_other.bin 26 pixel 8ad6cf0376b55912 /data000.cpk/autoshadereff.dat/PS_BASE_SXXXXFXXXXXX.pso#PGSO +ps_other.bin 27 pixel 26d6d0a8c585c6e2 /data000.cpk/autoshadereff.dat/PS_BASE_SXXXXXXRUXXX.pso#PGSO +ps_other.bin 28 pixel 5171c2253073456a /data000.cpk/autoshadereff.dat/PS_BASE_SXXXXXXRXXXX.pso#PGSO +ps_other.bin 29 pixel 63446ee1fa9ade0b /data000.cpk/autoshadereff.dat/PS_BASE_SXXXXXXXXXWX.pso#PGSO +ps_other.bin 30 pixel 66ba9531fa973a4b /data000.cpk/autoshadereff.dat/PS_BASE_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 31 pixel e5a74d70fe7adbc7 /data000.cpk/autoshadereff.dat/PS_BASE_XBLMCFXXXXXX.pso#PGSO +ps_other.bin 32 pixel 5aae5fc71eb52e6d /data000.cpk/autoshadereff.dat/PS_BASE_XBLMCXXXXXXX.pso#PGSO +ps_other.bin 33 pixel 95ca8818e571f300 /data000.cpk/autoshadereff.dat/PS_BASE_XBXMCFXXXXXX.pso#PGSO +ps_other.bin 34 pixel 242ad8600bfc2b6f /data000.cpk/autoshadereff.dat/PS_BASE_XBXMCXXXXXXX.pso#PGSO +ps_other.bin 35 pixel 1db717e8c67c8272 /data000.cpk/autoshadereff.dat/PS_BASE_XBXMXFXXXXXX.pso#PGSO +ps_other.bin 36 pixel a261f50c76af12e3 /data000.cpk/autoshadereff.dat/PS_BASE_XBXMXXXXXXXX.pso#PGSO +ps_other.bin 37 pixel 8bad9e6f759a873c /data000.cpk/autoshadereff.dat/PS_BASE_XBXXCFXXXXXX.pso#PGSO +ps_other.bin 38 pixel fb9589d75b08a6b7 /data000.cpk/autoshadereff.dat/PS_BASE_XBXXCXXXXXXX.pso#PGSO +ps_other.bin 39 pixel 544ffab820d1151b /data000.cpk/autoshadereff.dat/PS_BASE_XBXXXFXXXXXX.pso#PGSO +ps_other.bin 40 pixel f44d560b5dcef964 /data000.cpk/autoshadereff.dat/PS_BASE_XBXXXXXRXXXX.pso#PGSO +ps_other.bin 41 pixel b3e08bb6f65ca8e7 /data000.cpk/autoshadereff.dat/PS_BASE_XBXXXXXXXXXX.pso#PGSO +ps_other.bin 42 pixel 22e143b86140198b /data000.cpk/autoshadereff.dat/PS_BASE_XXLMXXXXXXXX.pso#PGSO +ps_other.bin 43 pixel 33c2355fad91e916 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMCFXXXXXX.pso#PGSO +ps_other.bin 44 pixel 4e575befcc89ec7a /data000.cpk/autoshadereff.dat/PS_BASE_XXXMCXPXXXXX.pso#PGSO +ps_other.bin 45 pixel c119ee64a3e14a6d /data000.cpk/autoshadereff.dat/PS_BASE_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 46 pixel e0b87caf3670d352 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXFPXXXWX.pso#PGSO +ps_other.bin 47 pixel 600dbafb88bbcf8a /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXFPXXXXX.pso#PGSO +ps_other.bin 48 pixel 2c49aaec9e05b99c /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXFXRXXXX.pso#PGSO +ps_other.bin 49 pixel 72a5eb8f7c029309 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 50 pixel d9692dfcfa20d6e3 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXXPXXXWX.pso#PGSO +ps_other.bin 51 pixel 4be614fea84bd370 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXXPXXXXX.pso#PGSO +ps_other.bin 52 pixel 4350cb3e21e5eb06 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXXXRXXXD.pso#PGSO +ps_other.bin 53 pixel 9c6f16c9691a0414 /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXXXRXXXX.pso#PGSO +ps_other.bin 54 pixel 8166d5ef5dec556c /data000.cpk/autoshadereff.dat/PS_BASE_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 55 pixel b16072300e0c06ff /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCFPXXXXX.pso#PGSO +ps_other.bin 56 pixel 3ba01c17ca01ffe0 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCFXXXXXX.pso#PGSO +ps_other.bin 57 pixel c22cd67b009a6313 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCXPXXXWX.pso#PGSO +ps_other.bin 58 pixel 01269fb15c97d1cc /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCXPXXXXX.pso#PGSO +ps_other.bin 59 pixel 13e5e33de03f8783 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCXXRXXXX.pso#PGSO +ps_other.bin 60 pixel 21cfe61c91a0834e /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCXXXXXWX.pso#PGSO +ps_other.bin 61 pixel ba879d1a5066adcb /data000.cpk/autoshadereff.dat/PS_BASE_XXXXCXXXXXXX.pso#PGSO +ps_other.bin 62 pixel 42ae310635afbfd9 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXFPXXXWX.pso#PGSO +ps_other.bin 63 pixel 5aa68cd0eb27bcf3 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXFPXXXXX.pso#PGSO +ps_other.bin 64 pixel 4c84195d5a611fcc /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXFXXUXXX.pso#PGSO +ps_other.bin 65 pixel 282b6f24c02d11bf /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXFXXXXWX.pso#PGSO +ps_other.bin 66 pixel 9062b59952fdd2d0 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXFXXXXXD.pso#PGSO +ps_other.bin 67 pixel 4fbd33883a8d4656 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXFXXXXXX.pso#PGSO +ps_other.bin 68 pixel fc09c39117bf9e41 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXPRXXXX.pso#PGSO +ps_other.bin 69 pixel b8e7ad67fe39996b /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXPXXXWX.pso#PGSO +ps_other.bin 70 pixel 832b8c37b317ad97 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXPXXXXX.pso#PGSO +ps_other.bin 71 pixel 5aa81f6bd90fb6d5 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXXRXXXX.pso#PGSO +ps_other.bin 72 pixel 2660e725592a2a1e /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXXXUXXX.pso#PGSO +ps_other.bin 73 pixel e0c7e2f5235ea877 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXXXXXWX.pso#PGSO +ps_other.bin 74 pixel 82711edd3ddc4360 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXXXXXXD.pso#PGSO +ps_other.bin 75 pixel ac309751c3e03b53 /data000.cpk/autoshadereff.dat/PS_BASE_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 76 pixel 5cbe7c78863df41f /data000.cpk/autoshadereff.dat/PS_DIRECTIONALBLUR_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 77 pixel d6e2aedec0877c86 /data000.cpk/autoshadereff.dat/PS_DISTORTION3D_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 78 pixel 4f237d10102ef38e /data000.cpk/autoshadereff.dat/PS_DISTORTION3D_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 79 pixel 730d8583de3c73e8 /data000.cpk/autoshadereff.dat/PS_DISTORTION3D_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 80 pixel 2e4ce30bf95d21e4 /data000.cpk/autoshadereff.dat/PS_DISTORTION3D_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 81 pixel cdda7c80f7008fbc /data000.cpk/autoshadereff.dat/PS_DISTORTION3D_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 82 pixel c9258e36e267fc71 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXLMCXXXUXXX.pso#PGSO +ps_other.bin 83 pixel 89fb3574a469bee7 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXMXXXXUXXX.pso#PGSO +ps_other.bin 84 pixel 38e397c7446e7766 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXMXXXXXEXX.pso#PGSO +ps_other.bin 85 pixel e56572b08f609dcb /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 86 pixel c82e7c4738bcd6bb /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXXCXXXXXXX.pso#PGSO +ps_other.bin 87 pixel 29409290c370fbb3 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXXXXXRUEXX.pso#PGSO +ps_other.bin 88 pixel 7c8673560a3b2f70 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXXXXXXXEXX.pso#PGSO +ps_other.bin 89 pixel ebe5c610f5196376 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 90 pixel d03be719cdbdef45 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XBXXCFXXXXXX.pso#PGSO +ps_other.bin 91 pixel 1374841721b63e8a /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 92 pixel 55ee4b2fb76210ff /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXXPXUXXX.pso#PGSO +ps_other.bin 93 pixel c9f0217965db1050 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXXXRUXXX.pso#PGSO +ps_other.bin 94 pixel cf3a41759f91a24e /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXXXRXEXX.pso#PGSO +ps_other.bin 95 pixel c195767a8b43a6ea /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXXXRXXXX.pso#PGSO +ps_other.bin 96 pixel c04f9db0878894ce /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXXXXXEXX.pso#PGSO +ps_other.bin 97 pixel d7c9a92fe3ab4385 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 98 pixel 9a1de33f9cca642a /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXCFXXXXXX.pso#PGSO +ps_other.bin 99 pixel af321fce8428df14 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXCXXRXXXX.pso#PGSO +ps_other.bin 100 pixel 9afae4f5089e03f0 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXCXXXXXXX.pso#PGSO +ps_other.bin 101 pixel cca9d59ab90b4c85 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXFXRXXXX.pso#PGSO +ps_other.bin 102 pixel 2b72067a02729860 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXFXXXXXX.pso#PGSO +ps_other.bin 103 pixel c1ec54323469403e /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXXPXUXXX.pso#PGSO +ps_other.bin 104 pixel d653f2bfc07a7c75 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXXXRUEXX.pso#PGSO +ps_other.bin 105 pixel 30ac871dc12e82ab /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXXXRXXXX.pso#PGSO +ps_other.bin 106 pixel 12d7aafe3d12eaa9 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXXXXUEXX.pso#PGSO +ps_other.bin 107 pixel 90af20f3a08bcd39 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXXXXXEXX.pso#PGSO +ps_other.bin 108 pixel 5d54918ab58471fa /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR3D_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 109 pixel 2859901e6814102c /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SBXMCXXXUXXX.pso#PGSO +ps_other.bin 110 pixel 44c846f4fce8d2ac /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SBXXCFXXXXXX.pso#PGSO +ps_other.bin 111 pixel 2acd7ba6a09a222e /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SBXXCXXXXXXX.pso#PGSO +ps_other.bin 112 pixel eb7328d898d61acd /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SBXXXFXXXXXX.pso#PGSO +ps_other.bin 113 pixel 08f65ee253d3ba30 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SBXXXXXXXXXX.pso#PGSO +ps_other.bin 114 pixel 4d2255c39ac09fac /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXLMXFXXXXXX.pso#PGSO +ps_other.bin 115 pixel b7b1df6030844335 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXMCXXXUXWX.pso#PGSO +ps_other.bin 116 pixel 06b4e254aa1c48b0 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXMCXXXUXXX.pso#PGSO +ps_other.bin 117 pixel 3a2f29819e3896f2 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXMCXXXXXXX.pso#PGSO +ps_other.bin 118 pixel b155ddbe84fb271b /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 119 pixel 5a43c04b0235056f /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXMXXXXXEXX.pso#PGSO +ps_other.bin 120 pixel 7c7dec85e83167ed /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 121 pixel 4489ce69b814670c /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXXCFXXXXXX.pso#PGSO +ps_other.bin 122 pixel d2555f12d58616c2 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXXCXXXXXXX.pso#PGSO +ps_other.bin 123 pixel 8bc7f65660c15387 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXXXFXXXXXX.pso#PGSO +ps_other.bin 124 pixel db1376b7c9db4dea /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 125 pixel 4bf62c127e7b613a /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XBXMCXXXUXXX.pso#PGSO +ps_other.bin 126 pixel 32c054c6174bd97d /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMCFXXXXXX.pso#PGSO +ps_other.bin 127 pixel 29721058d402934a /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMCXPXUXWX.pso#PGSO +ps_other.bin 128 pixel 2b49373fb4c39f09 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMCXXXUXXX.pso#PGSO +ps_other.bin 129 pixel 5dc51ee390746d07 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 130 pixel 626807092532eb39 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 131 pixel 89082360393f78e4 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMXXPXUXXX.pso#PGSO +ps_other.bin 132 pixel 951331942e24f535 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMXXXXXEXX.pso#PGSO +ps_other.bin 133 pixel 47303205c5b2b2db /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 134 pixel 89f05ae94e73bf25 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXCFXXUXXX.pso#PGSO +ps_other.bin 135 pixel 4b3e41583fdb0874 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXCXXXXXXX.pso#PGSO +ps_other.bin 136 pixel 585ec55142a4de75 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXXFXRXXXX.pso#PGSO +ps_other.bin 137 pixel 8f7227973c88067b /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXXFXXXXXX.pso#PGSO +ps_other.bin 138 pixel fb8a171fdd607dc1 /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXXXPXXXXX.pso#PGSO +ps_other.bin 139 pixel a98733a7fe24d4be /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXXXXRXXXX.pso#PGSO +ps_other.bin 140 pixel 27d006f56f9e71cf /data000.cpk/autoshadereff.dat/PS_DISTORTIONCOLOR_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 141 pixel 74767ad4919b5ae1 /data000.cpk/autoshadereff.dat/PS_DISTORTION_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 142 pixel d4163f0e3fa71736 /data000.cpk/autoshadereff.dat/PS_DISTORTION_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 143 pixel 30cb7eb4a2218aaf /data000.cpk/autoshadereff.dat/PS_DISTORTION_SXXXCFXXXXXX.pso#PGSO +ps_other.bin 144 pixel c0491fb434b17895 /data000.cpk/autoshadereff.dat/PS_DISTORTION_SXXXXFXXXXXX.pso#PGSO +ps_other.bin 145 pixel 63c44204d9d51f88 /data000.cpk/autoshadereff.dat/PS_DISTORTION_SXXXXXXRXXXX.pso#PGSO +ps_other.bin 146 pixel 01d32dbfe956c1f3 /data000.cpk/autoshadereff.dat/PS_DISTORTION_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 147 pixel 23269153708c4022 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 148 pixel 93c3faabc416361c /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXFXXUXXX.pso#PGSO +ps_other.bin 149 pixel c8c93da5372c4a31 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 150 pixel 1691f90d60c86b6e /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXXPXXXXX.pso#PGSO +ps_other.bin 151 pixel c19201a5982fc4ab /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXXXRXXXX.pso#PGSO +ps_other.bin 152 pixel 4af61d8072e30032 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXXXXUXXX.pso#PGSO +ps_other.bin 153 pixel 8381b3493595c90d /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXXXXXEXX.pso#PGSO +ps_other.bin 154 pixel ab378ee0b46b3bf1 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 155 pixel 4f0694e1154f60bb /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXCXXRXXXX.pso#PGSO +ps_other.bin 156 pixel 25057a52014ad751 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXCXXXXXXD.pso#PGSO +ps_other.bin 157 pixel c2f38b84d2c4e4d2 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXCXXXXXXX.pso#PGSO +ps_other.bin 158 pixel 6d32aa4d16ee8c74 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXFXRXXXX.pso#PGSO +ps_other.bin 159 pixel bb7a954e5d62b99d /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXFXXUXXX.pso#PGSO +ps_other.bin 160 pixel dec0996b20d3e0d1 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXFXXXXXX.pso#PGSO +ps_other.bin 161 pixel d2ddeebc233e9449 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXXPXXXXX.pso#PGSO +ps_other.bin 162 pixel 42be10c2fd8feb1e /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXXXRXXXX.pso#PGSO +ps_other.bin 163 pixel 8d6eb36b84faa984 /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXXXXUXXX.pso#PGSO +ps_other.bin 164 pixel 6022bd6486b52a2f /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXXXXXXXD.pso#PGSO +ps_other.bin 165 pixel b3a0dbe65a9ca49c /data000.cpk/autoshadereff.dat/PS_DISTORTION_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 166 pixel aaa783684b05a578 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SBXMCFXXXXXX.pso#PGSO +ps_other.bin 167 pixel be3a96a9b436d036 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SBXMCXXXXXXX.pso#PGSO +ps_other.bin 168 pixel d9caad4409de0609 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SBXMXFXXXXXX.pso#PGSO +ps_other.bin 169 pixel c9633e29d721f814 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SBXXCXXXXXXX.pso#PGSO +ps_other.bin 170 pixel d5191b33e49045e5 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 171 pixel 6fc59810656dbd4c /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SXXXCXXXXXXX.pso#PGSO +ps_other.bin 172 pixel d576918c1deed202 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_SXXXXFXXXXXX.pso#PGSO +ps_other.bin 173 pixel 810240aaa7f3c8b9 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_XBXMXXXXXXXX.pso#PGSO +ps_other.bin 174 pixel ab3b0e1cca322f37 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP1_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 175 pixel 2d203f668b2488ec /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2ONLY_SBXMXFXXXXXX.pso#PGSO +ps_other.bin 176 pixel cb59944fef9ce617 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2ONLY_XBXMXXXXXXXX.pso#PGSO +ps_other.bin 177 pixel fed19086df2868ed /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SBXMCXXXXXXX.pso#PGSO +ps_other.bin 178 pixel 61be3400bd0cf660 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SBXMXXXXXXXX.pso#PGSO +ps_other.bin 179 pixel cf47c6d852909ae2 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SBXXCXXXXXXX.pso#PGSO +ps_other.bin 180 pixel cb168339a2a8e9cc /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SBXXXXXXXXXX.pso#PGSO +ps_other.bin 181 pixel 136e777fd14fc0cc /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SXXMCFXXXXXX.pso#PGSO +ps_other.bin 182 pixel 9f8e8a9966245dee /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 183 pixel 5c2047e1f06317c5 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 184 pixel 74a3e54206b2daf1 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_XBXXXXXXXXXX.pso#PGSO +ps_other.bin 185 pixel 4cc1d675532793b2 /data000.cpk/autoshadereff.dat/PS_LIGHTINGP2_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 186 pixel fd66c867537463f0 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SBXMCFXXXXXX.pso#PGSO +ps_other.bin 187 pixel 05d043aa723a5032 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SBXMXFXXXXXX.pso#PGSO +ps_other.bin 188 pixel 0de6d5540a3bad8b /data000.cpk/autoshadereff.dat/PS_LIGHTING_SBXXXXXXXXXX.pso#PGSO +ps_other.bin 189 pixel 851ca0380e4bf773 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SXXMCFXXXXXX.pso#PGSO +ps_other.bin 190 pixel 216abf94edd48257 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 191 pixel 7c2714530f4935c6 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 192 pixel c50b4245549c6469 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SXXXXFXXXXXX.pso#PGSO +ps_other.bin 193 pixel cf938798e0ddff77 /data000.cpk/autoshadereff.dat/PS_LIGHTING_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 194 pixel dfcb634f24239ea5 /data000.cpk/autoshadereff.dat/PS_LIGHTING_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 195 pixel 52d4583b2f998d81 /data000.cpk/autoshadereff.dat/PS_LIGHTING_XXXXXFXXXXXX.pso#PGSO +ps_other.bin 196 pixel adc2510ad26032fd /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SBLMXFXXXXXX.pso#PGSO +ps_other.bin 197 pixel 319612e2a3407b7f /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SBXMCFXXXXXX.pso#PGSO +ps_other.bin 198 pixel c88464ad63c0e745 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SBXMCXXXXXXX.pso#PGSO +ps_other.bin 199 pixel 41b3f9720f6cbfa5 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SBXMXFXXXXXX.pso#PGSO +ps_other.bin 200 pixel 916852131a5c36b5 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SBXMXXXXXXXX.pso#PGSO +ps_other.bin 201 pixel 6e618b546f782745 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMCFXXXXXX.pso#PGSO +ps_other.bin 202 pixel f641dbaf396df72d /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMCXXXXXXX.pso#PGSO +ps_other.bin 203 pixel cb683717cdf9a2aa /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMXFXXUXXX.pso#PGSO +ps_other.bin 204 pixel a31550d2f32cdf07 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 205 pixel b6caea544e7dbf17 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMXXXRXXXX.pso#PGSO +ps_other.bin 206 pixel e25e11d2bcab5716 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMXXXXUXXX.pso#PGSO +ps_other.bin 207 pixel d7983f7a5fffb5fc /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMXXXXXEXX.pso#PGSO +ps_other.bin 208 pixel 1e6a7f76add83a3a /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 209 pixel 36f9790c58405ac5 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XBLMXFXXXXXX.pso#PGSO +ps_other.bin 210 pixel 26f0b833d6ada980 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XBXMCXXXUXXX.pso#PGSO +ps_other.bin 211 pixel 1fdf9c3cb4a1d3be /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XBXMXFXXXXXX.pso#PGSO +ps_other.bin 212 pixel ae2ee27f1d36e1c4 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCFPXXXXX.pso#PGSO +ps_other.bin 213 pixel cbfe80ffc9851695 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCFXXXXXD.pso#PGSO +ps_other.bin 214 pixel 13ad30e9bf33fd69 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCFXXXXXX.pso#PGSO +ps_other.bin 215 pixel 715f4de9fa50818a /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCXPXUXXX.pso#PGSO +ps_other.bin 216 pixel aed7cfaa107b0a8f /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCXXRXXXX.pso#PGSO +ps_other.bin 217 pixel 0d1373fe36a179c5 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCXXXUXXX.pso#PGSO +ps_other.bin 218 pixel f7f358a008f02f1a /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 219 pixel c018d2b6e0017440 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXFXRXXXX.pso#PGSO +ps_other.bin 220 pixel a4c128b902ad043a /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXFXXUXXX.pso#PGSO +ps_other.bin 221 pixel 9652ad6f98889712 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 222 pixel 07edcacca761edbb /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXXPXXXXX.pso#PGSO +ps_other.bin 223 pixel 7c0bad2ac3c2815e /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXXXRXXXX.pso#PGSO +ps_other.bin 224 pixel 28a08b6061af9580 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXXXXUXXX.pso#PGSO +ps_other.bin 225 pixel 2ac9c2f67cbab4b2 /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXXXXXEXX.pso#PGSO +ps_other.bin 226 pixel 2a709697b3633bff /data000.cpk/autoshadereff.dat/PS_PSMASKDISTORTIONCOLOR_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 227 pixel f010331b337482a5 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGEMUL_SBXMCFXXXXXX.pso#PGSO +ps_other.bin 228 pixel ee2906fe3a7fa19b /data000.cpk/autoshadereff.dat/PS_PSMASKEDGEMUL_SBXMCXXXXXXX.pso#PGSO +ps_other.bin 229 pixel 7a1786766179f95a /data000.cpk/autoshadereff.dat/PS_PSMASKEDGEMUL_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 230 pixel a5bd6fc22e1a5e17 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGEMUL_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 231 pixel 3bd33d7220925f02 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGE_SXXMCXXXXXXX.pso#PGSO +ps_other.bin 232 pixel 065b5a9a031f4c97 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGE_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 233 pixel d20d30f330203a26 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGE_XXXMCFXXXXXX.pso#PGSO +ps_other.bin 234 pixel 686414e8eef18e19 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGE_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 235 pixel 6a484d120ad53af5 /data000.cpk/autoshadereff.dat/PS_PSMASKEDGE_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 236 pixel 5de3a0989deb2e5c /data000.cpk/autoshadereff.dat/PS_PSMASKEDGE_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 237 pixel c1ee8e2c2093649d /data000.cpk/autoshadereff.dat/PS_PSMASK_SBXMCFXXXXXX.pso#PGSO +ps_other.bin 238 pixel cd78ad042191d7ac /data000.cpk/autoshadereff.dat/PS_PSMASK_SBXMCXXXXXXX.pso#PGSO +ps_other.bin 239 pixel 582bdb6ce694313f /data000.cpk/autoshadereff.dat/PS_PSMASK_SBXMXFXXXXXX.pso#PGSO +ps_other.bin 240 pixel 7035d0ba7492cbda /data000.cpk/autoshadereff.dat/PS_PSMASK_SBXMXXXXXXXX.pso#PGSO +ps_other.bin 241 pixel 91fce94e94ff6e92 /data000.cpk/autoshadereff.dat/PS_PSMASK_SXLMCFXXXXXX.pso#PGSO +ps_other.bin 242 pixel 25997224c146d2fb /data000.cpk/autoshadereff.dat/PS_PSMASK_SXXMCFXXXXXX.pso#PGSO +ps_other.bin 243 pixel ea451809dab5fd15 /data000.cpk/autoshadereff.dat/PS_PSMASK_SXXMCXXXXXXX.pso#PGSO +ps_other.bin 244 pixel 0dfbe641afa019fe /data000.cpk/autoshadereff.dat/PS_PSMASK_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 245 pixel d1981c1e3e74eb6d /data000.cpk/autoshadereff.dat/PS_PSMASK_SXXMXXXRXXXX.pso#PGSO +ps_other.bin 246 pixel bd6a98605d7d8dda /data000.cpk/autoshadereff.dat/PS_PSMASK_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 247 pixel 4e29a983ded911eb /data000.cpk/autoshadereff.dat/PS_PSMASK_XBXMXFXXXXXX.pso#PGSO +ps_other.bin 248 pixel 2cc4c74881becb44 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXLMCFXXXXXX.pso#PGSO +ps_other.bin 249 pixel caa55717602b6ccb /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMCFXXXXWX.pso#PGSO +ps_other.bin 250 pixel 127c48809ab0f63d /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMCXPXXXXX.pso#PGSO +ps_other.bin 251 pixel c0a7ff9645515f00 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMCXXXXXWX.pso#PGSO +ps_other.bin 252 pixel f87b8075106ce3d1 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMCXXXXXXX.pso#PGSO +ps_other.bin 253 pixel 84abc1ea2c31bd2b /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXFPXXXXX.pso#PGSO +ps_other.bin 254 pixel 547890aee9532302 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXFXXUXXX.pso#PGSO +ps_other.bin 255 pixel 4e2a483d3530d3a5 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXFXXXXXX.pso#PGSO +ps_other.bin 256 pixel 7fa8f806f9ee27eb /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXXPXXXWX.pso#PGSO +ps_other.bin 257 pixel 34ee34a4c16d0504 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXXPXXXXX.pso#PGSO +ps_other.bin 258 pixel 77033272e05b0026 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXXXRXXXX.pso#PGSO +ps_other.bin 259 pixel af6ac0c00d5bb36d /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXXXXUXXX.pso#PGSO +ps_other.bin 260 pixel 1865bf0505118a21 /data000.cpk/autoshadereff.dat/PS_PSMASK_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 261 pixel 13aa6bfb452c956d /data000.cpk/autoshadereff.dat/PS_RADIALBLURCA_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 262 pixel 790daaa5d4dd8228 /data000.cpk/autoshadereff.dat/PS_RADIALBLURCA_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 263 pixel 57cd419cf493e5f1 /data000.cpk/autoshadereff.dat/PS_RADIALBLURCA_XXXXCXXXXXXX.pso#PGSO +ps_other.bin 264 pixel e0931cc1970412dd /data000.cpk/autoshadereff.dat/PS_RADIALBLURCA_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 265 pixel e5f4e6dc07bad5f9 /data000.cpk/autoshadereff.dat/PS_RADIALBLUR_SXXMXFXXXXXX.pso#PGSO +ps_other.bin 266 pixel 1b0909ba5d0c1ffe /data000.cpk/autoshadereff.dat/PS_RADIALBLUR_SXXMXXXXXXXX.pso#PGSO +ps_other.bin 267 pixel d232e039357cb1e8 /data000.cpk/autoshadereff.dat/PS_RADIALBLUR_SXXXXXXXXXXX.pso#PGSO +ps_other.bin 268 pixel 59faf32ca726057b /data000.cpk/autoshadereff.dat/PS_RADIALBLUR_XXXMXXXXXXXX.pso#PGSO +ps_other.bin 269 pixel 004f3abb6c4ac1d8 /data000.cpk/autoshadereff.dat/PS_RADIALBLUR_XXXXXXXXXXXX.pso#PGSO +ps_other.bin 270 pixel 1569ea38808968fd /data000.cpk/autoshadereff.dat/PS_SPOTLIGHTING_SBXXXFXXXXXX.pso#PGSO +ps_other.bin 271 pixel 8348f5ddf3ba4e1f /data000.cpk/autoshadereff.dat/PS_SPOTLIGHTING_SXXXCFXXXXXX.pso#PGSO +vs_other.bin 0 vertex beee5b62246fe9d9 /data000.cpk/autoshadereff.dat/VS_BASE_2XCX_1XXNXEXXXX.vso#PGSO +vs_other.bin 1 vertex 0693aad293de4625 /data000.cpk/autoshadereff.dat/VS_BASE_2XCX_1XXXXXXXXX.vso#PGSO +vs_other.bin 2 vertex bf7d3982cb787842 /data000.cpk/autoshadereff.dat/VS_BASE_2XCX_X2XXXXXOAX.vso#PGSO +vs_other.bin 3 vertex e7687846a25a34da /data000.cpk/autoshadereff.dat/VS_BASE_2XCX_X2XXXXXXXX.vso#PGSO +vs_other.bin 4 vertex b11ee5716261b91a /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12BNTEXOAX.vso#PGSO +vs_other.bin 5 vertex f7d79b2e216932c9 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12BXXEXXXX.vso#PGSO +vs_other.bin 6 vertex 95216b02a9a7dc40 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12BXXXXXXX.vso#PGSO +vs_other.bin 7 vertex 381c70bf5a519c9f /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XNTEXOAX.vso#PGSO +vs_other.bin 8 vertex 4a25362eea9931a0 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XNTEXXXX.vso#PGSO +vs_other.bin 9 vertex 761e0ee659291f78 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XXXEVOAX.vso#PGSO +vs_other.bin 10 vertex 8c74b8315a452ed4 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XXXEXXXX.vso#PGSO +vs_other.bin 11 vertex 7dda3d1efa67bfa0 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XXXXVOAX.vso#PGSO +vs_other.bin 12 vertex 1c51616cce770866 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XXXXXOAX.vso#PGSO +vs_other.bin 13 vertex dbdd4a4c311713f2 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_12XXXXXXXX.vso#PGSO +vs_other.bin 14 vertex 0fcbbb58b684b5f1 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XBXXEXXXX.vso#PGSO +vs_other.bin 15 vertex afa437dfea94da6f /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XBXXXXXXX.vso#PGSO +vs_other.bin 16 vertex 47949807306be426 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XXNXEXXXX.vso#PGSO +vs_other.bin 17 vertex 115786ab3509ab61 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XXXXEXXXD.vso#PGSO +vs_other.bin 18 vertex a38809153bc9f336 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 19 vertex 1b0bd03e1815f8cc /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XXXXXVOAX.vso#PGSO +vs_other.bin 20 vertex 097ff49ca182250e /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 21 vertex 20d738034dc188a3 /data000.cpk/autoshadereff.dat/VS_BASE_2XXX_X2XXXXXOAX.vso#PGSO +vs_other.bin 22 vertex 426e4ffb80f1bcce /data000.cpk/autoshadereff.dat/VS_BASE_XIXX_1XXXXEVXXX.vso#PGSO +vs_other.bin 23 vertex 75db9ce3f57d8d3f /data000.cpk/autoshadereff.dat/VS_BASE_XIXX_1XXXXEXXXD.vso#PGSO +vs_other.bin 24 vertex 714905b9d69c454d /data000.cpk/autoshadereff.dat/VS_BASE_XIXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 25 vertex a34248d56ac62380 /data000.cpk/autoshadereff.dat/VS_BASE_XIXX_1XXXXXXXXD.vso#PGSO +vs_other.bin 26 vertex 8c35b63ea0e416f8 /data000.cpk/autoshadereff.dat/VS_BASE_XIXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 27 vertex 527a21a215dedb48 /data000.cpk/autoshadereff.dat/VS_BASE_XXCX_1XXNXEXXXX.vso#PGSO +vs_other.bin 28 vertex d0391cf29b76c91e /data000.cpk/autoshadereff.dat/VS_BASE_XXCX_X2XXXXXOAX.vso#PGSO +vs_other.bin 29 vertex 997ac1e6edd764bc /data000.cpk/autoshadereff.dat/VS_BASE_XXCX_X2XXXXXXXX.vso#PGSO +vs_other.bin 30 vertex 23f84817448387c6 /data000.cpk/autoshadereff.dat/VS_BASE_XXCX_XXXNXEXXXX.vso#PGSO +vs_other.bin 31 vertex 6ea7b8809476c3f9 /data000.cpk/autoshadereff.dat/VS_BASE_XXCX_XXXXXXVOAX.vso#PGSO +vs_other.bin 32 vertex d7278048d5116989 /data000.cpk/autoshadereff.dat/VS_BASE_XXCX_XXXXXXXXXX.vso#PGSO +vs_other.bin 33 vertex ae0e4109b70060eb /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_12BNTEXXXX.vso#PGSO +vs_other.bin 34 vertex b7bd7e52f0ce3a0f /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_12BXXXXXXX.vso#PGSO +vs_other.bin 35 vertex 4243a4b49cbfe516 /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_12XXXXXXXX.vso#PGSO +vs_other.bin 36 vertex 86ee1eeb894ffdc0 /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_1XBXXEXXXX.vso#PGSO +vs_other.bin 37 vertex ee82a709f025499b /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_1XBXXXXXXX.vso#PGSO +vs_other.bin 38 vertex 93683ad476b7d2e1 /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_1XXXXEXXXX.vso#PGSO +vs_other.bin 39 vertex 6c56bc83bdeb399f /data000.cpk/autoshadereff.dat/VS_BASE_XXXS_1XXXXXXXXX.vso#PGSO +vs_other.bin 40 vertex 3442455a6629a3e8 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BNTEVXXX.vso#PGSO +vs_other.bin 41 vertex 245246ecc69b9520 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BNTEXOAX.vso#PGSO +vs_other.bin 42 vertex 0b5767dc98685b4b /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BNTEXXXX.vso#PGSO +vs_other.bin 43 vertex 839502121e8dc98c /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BNTXVXXX.vso#PGSO +vs_other.bin 44 vertex d1f396ef263d2116 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BNTXXXXX.vso#PGSO +vs_other.bin 45 vertex 633b77f5411adf73 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BXXEXXXX.vso#PGSO +vs_other.bin 46 vertex 187155c4af22ae76 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12BXXXXXXX.vso#PGSO +vs_other.bin 47 vertex 48e8a2852445c753 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XNTEVXXX.vso#PGSO +vs_other.bin 48 vertex 143c95fa6bb7fc68 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XNTEXXXX.vso#PGSO +vs_other.bin 49 vertex f75555232ab8c6d9 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XNTXVXXX.vso#PGSO +vs_other.bin 50 vertex b77aa46089eb19cc /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XNTXXXXX.vso#PGSO +vs_other.bin 51 vertex 02888586097d15b7 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XXXEXXXD.vso#PGSO +vs_other.bin 52 vertex 025102bf43e81a7d /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XXXEXXXX.vso#PGSO +vs_other.bin 53 vertex aadbeef39fa4fecd /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XXXXVOAX.vso#PGSO +vs_other.bin 54 vertex 063c1af58c3213f2 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XXXXXOAX.vso#PGSO +vs_other.bin 55 vertex 6d95d272391f899b /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_12XXXXXXXX.vso#PGSO +vs_other.bin 56 vertex 22a19e095bbc59bf /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XBXXEXXXX.vso#PGSO +vs_other.bin 57 vertex b72253dc348b4fc0 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XBXXXXXXD.vso#PGSO +vs_other.bin 58 vertex d2605ef087e446a1 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XBXXXXXXX.vso#PGSO +vs_other.bin 59 vertex 95e7d53ed7584047 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXNXEXXXX.vso#PGSO +vs_other.bin 60 vertex ab008b65280a6dcc /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXEVOAX.vso#PGSO +vs_other.bin 61 vertex 8b8b5d7e70d853ff /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXEVXXX.vso#PGSO +vs_other.bin 62 vertex 44bf8b3fb1a520f3 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 63 vertex 4b504cb00ac17c32 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXXVOAX.vso#PGSO +vs_other.bin 64 vertex 9717c92c548b9a52 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXXVXXX.vso#PGSO +vs_other.bin 65 vertex e066d5a81aae7579 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXXXXXD.vso#PGSO +vs_other.bin 66 vertex 5f880399702b500c /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 67 vertex e98511d54fb82bc8 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_X2XNTEVXXX.vso#PGSO +vs_other.bin 68 vertex 28bf04958fb618ba /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_X2XNTEXOAX.vso#PGSO +vs_other.bin 69 vertex 9f11a2b3be5b1317 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_X2XNTEXXXX.vso#PGSO +vs_other.bin 70 vertex 832c75a10e2936b1 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_X2XXXEXXXX.vso#PGSO +vs_other.bin 71 vertex c4b48feb6aa428af /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_X2XXXXXOAX.vso#PGSO +vs_other.bin 72 vertex 35918cd6ef409d47 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_X2XXXXXXXX.vso#PGSO +vs_other.bin 73 vertex fc5ca0a7ec242066 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_XXXNXEXXXX.vso#PGSO +vs_other.bin 74 vertex 896eaabe86861d6f /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_XXXXXEVXXX.vso#PGSO +vs_other.bin 75 vertex e7021b4cf387fd43 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_XXXXXEXXXX.vso#PGSO +vs_other.bin 76 vertex 1f67c861e4121c15 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_XXXXXXVOAX.vso#PGSO +vs_other.bin 77 vertex 0702bf2f8170e6af /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_XXXXXXVXXX.vso#PGSO +vs_other.bin 78 vertex aa7e9ae5cceebd07 /data000.cpk/autoshadereff.dat/VS_BASE_XXXX_XXXXXXXXXX.vso#PGSO +vs_other.bin 79 vertex cbbdea5dccfdfc00 /data000.cpk/autoshadereff.dat/VS_MODEL_WCFA_12XXXXXXXX.vso#PGSO +vs_other.bin 80 vertex c6651a43c886e208 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12BXXXXOAX.vso#PGSO +vs_other.bin 81 vertex 516d7dd5b5c25e66 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12BXXXXXXX.vso#PGSO +vs_other.bin 82 vertex 9cdd4aa5e9b0ad25 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12XXXEVOAX.vso#PGSO +vs_other.bin 83 vertex 7a3fc512451d2158 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12XXXEXXXX.vso#PGSO +vs_other.bin 84 vertex 13f9509ae8ef5388 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12XXXXVOAX.vso#PGSO +vs_other.bin 85 vertex 376ce02e4efdcc95 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12XXXXXOAX.vso#PGSO +vs_other.bin 86 vertex 979181b0e49f979f /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_12XXXXXXXX.vso#PGSO +vs_other.bin 87 vertex 3df89f36b5ff6f8a /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_1XBXXXXXXX.vso#PGSO +vs_other.bin 88 vertex e79097551ae9aca6 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_1XXXXEVOAX.vso#PGSO +vs_other.bin 89 vertex 5bc4618af9175578 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_1XXXXEXXXX.vso#PGSO +vs_other.bin 90 vertex 77761daa405f8b2e /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_1XXXXXXXXX.vso#PGSO +vs_other.bin 91 vertex 33915f0dfe0a2f0f /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_X2XXXXXXXX.vso#PGSO +vs_other.bin 92 vertex b14660d17d527147 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXA_XXXXXXXXXX.vso#PGSO +vs_other.bin 93 vertex 1180bb74a61ba5aa /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12BNTEVOAX.vso#PGSO +vs_other.bin 94 vertex e2f0ebe796307a0f /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12BXXEXOAX.vso#PGSO +vs_other.bin 95 vertex fd2bb3f2a89bfda8 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12BXXXVOAX.vso#PGSO +vs_other.bin 96 vertex ec12ffab66265c55 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12BXXXXOAX.vso#PGSO +vs_other.bin 97 vertex 0acb636a5add55dd /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12BXXXXXXX.vso#PGSO +vs_other.bin 98 vertex c54a5d9f61c279c1 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12XXXEVOAX.vso#PGSO +vs_other.bin 99 vertex 538c428a5a300101 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12XXXEXOAX.vso#PGSO +vs_other.bin 100 vertex 973780a354d0dd71 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12XXXEXXXX.vso#PGSO +vs_other.bin 101 vertex a909766e4c3c5b65 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12XXXXVOAX.vso#PGSO +vs_other.bin 102 vertex dbfec15f2f3704e0 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12XXXXXOAX.vso#PGSO +vs_other.bin 103 vertex 3d91412b0e5ba0f1 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_12XXXXXXXX.vso#PGSO +vs_other.bin 104 vertex a9849d62a26d8be8 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XBXXXVOAX.vso#PGSO +vs_other.bin 105 vertex 814722586879cba9 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XBXXXXXXX.vso#PGSO +vs_other.bin 106 vertex 8e71d5dd0634163d /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XXNXEVOAX.vso#PGSO +vs_other.bin 107 vertex 6c713ff6aa3952e0 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XXNXEXXXX.vso#PGSO +vs_other.bin 108 vertex c537ca0faa209796 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XXXXEVOAX.vso#PGSO +vs_other.bin 109 vertex d39266d2d141f073 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 110 vertex 3c0314978d8f875d /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XXXXXVOAX.vso#PGSO +vs_other.bin 111 vertex cabfe9953b061521 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 112 vertex fc63930d46014f2d /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_X2XXXXVOAX.vso#PGSO +vs_other.bin 113 vertex 05e8db074e60df57 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_X2XXXXXOAX.vso#PGSO +vs_other.bin 114 vertex 10800de3d176cc00 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_X2XXXXXXXX.vso#PGSO +vs_other.bin 115 vertex 5716b91f0a823f72 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_XXXXXXVOAX.vso#PGSO +vs_other.bin 116 vertex d9759eec27700316 /data000.cpk/autoshadereff.dat/VS_MODEL_WCXX_XXXXXXXXXX.vso#PGSO +vs_other.bin 117 vertex 9d3680589c217e3d /data000.cpk/autoshadereff.dat/VS_MODEL_WXFA_12XXXXXXXX.vso#PGSO +vs_other.bin 118 vertex d06883a417d22518 /data000.cpk/autoshadereff.dat/VS_MODEL_WXFA_1XXXXEXXXX.vso#PGSO +vs_other.bin 119 vertex 076504bba2a2af9e /data000.cpk/autoshadereff.dat/VS_MODEL_WXFA_1XXXXXVOAX.vso#PGSO +vs_other.bin 120 vertex 2e5cd104ff68700c /data000.cpk/autoshadereff.dat/VS_MODEL_WXFA_1XXXXXXXXX.vso#PGSO +vs_other.bin 121 vertex d327cfe5bbbacd2b /data000.cpk/autoshadereff.dat/VS_MODEL_WXFA_X2XXXEVOAX.vso#PGSO +vs_other.bin 122 vertex 3060931a7a3ebec5 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_12XXXEXXXX.vso#PGSO +vs_other.bin 123 vertex ae1a4c7b1a79f5de /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_12XXXXVOAX.vso#PGSO +vs_other.bin 124 vertex 0f49664d230b7cc1 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_12XXXXXOAX.vso#PGSO +vs_other.bin 125 vertex a2827aae7cf93b1a /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_12XXXXXXXX.vso#PGSO +vs_other.bin 126 vertex 7afeb2f654fd1d85 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_1XXXXEVOAX.vso#PGSO +vs_other.bin 127 vertex c36c80e2342b6a3f /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_1XXXXEXXXX.vso#PGSO +vs_other.bin 128 vertex 8493734b79f86ce9 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_1XXXXXVOAD.vso#PGSO +vs_other.bin 129 vertex 3172794a7c1c4a89 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_1XXXXXVOAX.vso#PGSO +vs_other.bin 130 vertex e87106e9c5d3826c /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_1XXXXXXXXX.vso#PGSO +vs_other.bin 131 vertex 729cacd79f798cce /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_X2XXXXVOAX.vso#PGSO +vs_other.bin 132 vertex 5937c2f58eb77b3a /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_X2XXXXXXXD.vso#PGSO +vs_other.bin 133 vertex d9da67c9b7283100 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_X2XXXXXXXX.vso#PGSO +vs_other.bin 134 vertex 8a8ff4eef2621073 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXA_XXXXXXXXXX.vso#PGSO +vs_other.bin 135 vertex 3e2e98bafd67d1aa /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12BNTEVOAX.vso#PGSO +vs_other.bin 136 vertex 834f02f8ff2639ab /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12BXXXXXXX.vso#PGSO +vs_other.bin 137 vertex 6bdf8484cbb69b7f /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XNTEVOAX.vso#PGSO +vs_other.bin 138 vertex 4ce29aa1f7e99c6b /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XNTEXXXX.vso#PGSO +vs_other.bin 139 vertex 2927d1cc4a4bc614 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XXXEVOAX.vso#PGSO +vs_other.bin 140 vertex bc0e9846b60db73a /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XXXEXXXX.vso#PGSO +vs_other.bin 141 vertex c8820ae63c6627e5 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XXXXVOAX.vso#PGSO +vs_other.bin 142 vertex 4c21a42cc8eb836d /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XXXXXOAX.vso#PGSO +vs_other.bin 143 vertex 22559a5d012bcfe9 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_12XXXXXXXX.vso#PGSO +vs_other.bin 144 vertex 2951a62451bc8cc3 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXEVXXX.vso#PGSO +vs_other.bin 145 vertex b3bd0a92c3852b18 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 146 vertex 3200818d3576ee6e /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXXVOAD.vso#PGSO +vs_other.bin 147 vertex 87be4f2b6e0ccb2e /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXXVOAX.vso#PGSO +vs_other.bin 148 vertex 9630116e931a0caf /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXXVXXX.vso#PGSO +vs_other.bin 149 vertex d2fe18f2217d1d99 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXXXXXD.vso#PGSO +vs_other.bin 150 vertex 13386def4bfcabe5 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 151 vertex aaed1af8aecf585e /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_X2XNTEXXXX.vso#PGSO +vs_other.bin 152 vertex eb03699d1d2ff7db /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_X2XXXEXXXX.vso#PGSO +vs_other.bin 153 vertex 495ebfcad1b0de03 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_X2XXXXVOAX.vso#PGSO +vs_other.bin 154 vertex 0df1af6bd808eff9 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_X2XXXXXOAX.vso#PGSO +vs_other.bin 155 vertex dbb2220b85bc89d4 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_X2XXXXXXXD.vso#PGSO +vs_other.bin 156 vertex baea40ab3b7b2400 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_X2XXXXXXXX.vso#PGSO +vs_other.bin 157 vertex eaa51ebf13679257 /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_XXXXXXVOAX.vso#PGSO +vs_other.bin 158 vertex a0297cce3a2664cc /data000.cpk/autoshadereff.dat/VS_MODEL_WXXX_XXXXXXXXXX.vso#PGSO +vs_other.bin 159 vertex 9db77a31add7e6e7 /data000.cpk/autoshadereff.dat/VS_MODEL_XCFA_12XXXXXXXX.vso#PGSO +vs_other.bin 160 vertex bf35982bafaad392 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12BXXXXOAX.vso#PGSO +vs_other.bin 161 vertex 4335c6476c8e077a /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12BXXXXXXX.vso#PGSO +vs_other.bin 162 vertex f8b63f0517d55324 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12XXXEVOAX.vso#PGSO +vs_other.bin 163 vertex 295b294220f90e24 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12XXXEXXXX.vso#PGSO +vs_other.bin 164 vertex fdc856af7c36349d /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12XXXXVOAX.vso#PGSO +vs_other.bin 165 vertex eaf3bc1596a04691 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12XXXXXOAX.vso#PGSO +vs_other.bin 166 vertex e31c5472b9a02392 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_12XXXXXXXX.vso#PGSO +vs_other.bin 167 vertex df059ddd471f1625 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_1XBXXXXXXX.vso#PGSO +vs_other.bin 168 vertex 69ecb19157e68527 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_1XXXXEVOAX.vso#PGSO +vs_other.bin 169 vertex 2699352be721c40d /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_1XXXXEXXXX.vso#PGSO +vs_other.bin 170 vertex e55cdf7241b4c37b /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_1XXXXXXXXX.vso#PGSO +vs_other.bin 171 vertex 1c4111920c273418 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_X2XXXXXXXX.vso#PGSO +vs_other.bin 172 vertex 620bb1048fcba35c /data000.cpk/autoshadereff.dat/VS_MODEL_XCXA_XXXXXXXXXX.vso#PGSO +vs_other.bin 173 vertex f3bc48abc1137f59 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12BNTEVOAX.vso#PGSO +vs_other.bin 174 vertex e516a21d097921b1 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12BXXEXOAX.vso#PGSO +vs_other.bin 175 vertex bcdf492944f07b1a /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12BXXXVOAX.vso#PGSO +vs_other.bin 176 vertex 1b5dd369daedddc2 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12BXXXXOAX.vso#PGSO +vs_other.bin 177 vertex a2de1b9e3ed333e0 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12BXXXXXXX.vso#PGSO +vs_other.bin 178 vertex 7cf5a3649909c1cd /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12XXXEVOAX.vso#PGSO +vs_other.bin 179 vertex 2a8a3b0b4a9ec8fa /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12XXXEXOAX.vso#PGSO +vs_other.bin 180 vertex b20d5f1ca502b96b /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12XXXEXXXX.vso#PGSO +vs_other.bin 181 vertex 9c5cb393add3099a /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12XXXXVOAX.vso#PGSO +vs_other.bin 182 vertex 9ff4a40f4e4d72c1 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12XXXXXOAX.vso#PGSO +vs_other.bin 183 vertex e39fba587301e272 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_12XXXXXXXX.vso#PGSO +vs_other.bin 184 vertex d49701500ef16c35 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XBXXXVOAX.vso#PGSO +vs_other.bin 185 vertex 8317525804b1f341 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XBXXXXXXX.vso#PGSO +vs_other.bin 186 vertex 9b8b89aed614281a /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XXNXEVOAX.vso#PGSO +vs_other.bin 187 vertex 84d42b630f551588 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XXNXEXXXX.vso#PGSO +vs_other.bin 188 vertex ef230a8b1fad34e0 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XXXXEVOAX.vso#PGSO +vs_other.bin 189 vertex f67708bff2af6b1e /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 190 vertex d8aed7e827ac0817 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XXXXXVOAX.vso#PGSO +vs_other.bin 191 vertex 30c40d9559b78eab /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 192 vertex 4cee2136a047e8be /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_X2XXXXVOAX.vso#PGSO +vs_other.bin 193 vertex 9b21c1feeab01eee /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_X2XXXXXOAX.vso#PGSO +vs_other.bin 194 vertex 5b0cd4648ce3fc42 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_X2XXXXXXXX.vso#PGSO +vs_other.bin 195 vertex 4f1f3fedbaa30b31 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_XXXXXXVOAX.vso#PGSO +vs_other.bin 196 vertex c4fb9df6b9be6f95 /data000.cpk/autoshadereff.dat/VS_MODEL_XCXX_XXXXXXXXXX.vso#PGSO +vs_other.bin 197 vertex 211736e6fda6162d /data000.cpk/autoshadereff.dat/VS_MODEL_XXFA_12XXXXXXXX.vso#PGSO +vs_other.bin 198 vertex e3dcf71f5d467eda /data000.cpk/autoshadereff.dat/VS_MODEL_XXFA_1XXXXEXXXX.vso#PGSO +vs_other.bin 199 vertex 8dd44e4fb7e0ccda /data000.cpk/autoshadereff.dat/VS_MODEL_XXFA_1XXXXXVOAX.vso#PGSO +vs_other.bin 200 vertex c053e0d90c05e920 /data000.cpk/autoshadereff.dat/VS_MODEL_XXFA_1XXXXXXXXX.vso#PGSO +vs_other.bin 201 vertex afcc06ac32ed22bc /data000.cpk/autoshadereff.dat/VS_MODEL_XXFA_X2XXXEVOAX.vso#PGSO +vs_other.bin 202 vertex f9e2bbfbd3f28b5c /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_12XXXEXXXX.vso#PGSO +vs_other.bin 203 vertex af4356dd3fcea48e /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_12XXXXVOAX.vso#PGSO +vs_other.bin 204 vertex ca654998a0e0d5ed /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_12XXXXXOAX.vso#PGSO +vs_other.bin 205 vertex 7dce6394debb6626 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_12XXXXXXXX.vso#PGSO +vs_other.bin 206 vertex c6efab8738be05cd /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_1XXXXEVOAX.vso#PGSO +vs_other.bin 207 vertex 6ab0a50ad4cfbebc /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_1XXXXEXXXX.vso#PGSO +vs_other.bin 208 vertex 4b8e46eb92a07042 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_1XXXXXVOAD.vso#PGSO +vs_other.bin 209 vertex 06ad2817f4f78941 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_1XXXXXVOAX.vso#PGSO +vs_other.bin 210 vertex 0ddb1f1c36043a79 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_1XXXXXXXXX.vso#PGSO +vs_other.bin 211 vertex ceb9b40fa25e0334 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_X2XXXXVOAX.vso#PGSO +vs_other.bin 212 vertex 8889f9c128c017cb /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_X2XXXXXXXD.vso#PGSO +vs_other.bin 213 vertex 62dcb5a12f6c4f1a /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_X2XXXXXXXX.vso#PGSO +vs_other.bin 214 vertex 8b5876f088e53b59 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXA_XXXXXXXXXX.vso#PGSO +vs_other.bin 215 vertex 1eb8d5b0fcd3627e /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12BNTEVOAX.vso#PGSO +vs_other.bin 216 vertex 06fd5958059102a7 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12BXXXXXXX.vso#PGSO +vs_other.bin 217 vertex 0d3e57ccad0e0335 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XNTEVOAX.vso#PGSO +vs_other.bin 218 vertex aa25e3c5744607c7 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XNTEXXXX.vso#PGSO +vs_other.bin 219 vertex c48011d4f360342b /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XXXEVOAX.vso#PGSO +vs_other.bin 220 vertex 6c5de24d75200f4d /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XXXEXXXX.vso#PGSO +vs_other.bin 221 vertex fb064fc657a7e0e9 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XXXXVOAX.vso#PGSO +vs_other.bin 222 vertex 2bca666743d245d4 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XXXXXOAX.vso#PGSO +vs_other.bin 223 vertex bdfd132010d67f46 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_12XXXXXXXX.vso#PGSO +vs_other.bin 224 vertex b3397155c49b686d /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXEVXXX.vso#PGSO +vs_other.bin 225 vertex 564a41fa6fd0f33f /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXEXXXX.vso#PGSO +vs_other.bin 226 vertex e0c6a0852df1e723 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXXVOAD.vso#PGSO +vs_other.bin 227 vertex 13c91d98579483b8 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXXVOAX.vso#PGSO +vs_other.bin 228 vertex 938d74daef7caf9e /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXXVXXX.vso#PGSO +vs_other.bin 229 vertex 381529be7a9052e5 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXXXXXD.vso#PGSO +vs_other.bin 230 vertex 3478e636faeea720 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_1XXXXXXXXX.vso#PGSO +vs_other.bin 231 vertex 08b59f8aaf517fed /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_X2XNTEXXXX.vso#PGSO +vs_other.bin 232 vertex 1e53d5a1ada08a71 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_X2XXXEXXXX.vso#PGSO +vs_other.bin 233 vertex 79dc0bdf302fa006 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_X2XXXXVOAX.vso#PGSO +vs_other.bin 234 vertex ce9fb573b0eef687 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_X2XXXXXOAX.vso#PGSO +vs_other.bin 235 vertex d6b6df684e3a4f0b /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_X2XXXXXXXD.vso#PGSO +vs_other.bin 236 vertex 403bf2b2b7c59f69 /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_X2XXXXXXXX.vso#PGSO +vs_other.bin 237 vertex 0cdca2296de6edba /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_XXXXXXVOAX.vso#PGSO +vs_other.bin 238 vertex 27f84887ba047a0f /data000.cpk/autoshadereff.dat/VS_MODEL_XXXX_XXXXXXXXXX.vso#PGSO +ps_other.bin 272 pixel 6261fc25d980f6a1 /data000.cpk/shader.dat/DeferredDirLight.pso#PGSO +ps_other.bin 273 pixel 5578d381f2aba12e /data000.cpk/shader.dat/FilterSelectCube.pso#PGSO +gs_other.bin 0 geometry 4a2b0df808307d63 /data000.cpk/shader.dat/IndexBuildIndependent_bccw.gso#PGSO +gs_other.bin 1 geometry 5dc6fcf19e502bf2 /data000.cpk/shader.dat/IndexBuildIndependent_bcw.gso#PGSO +gs_other.bin 2 geometry 137b54dc5462e5bb /data000.cpk/shader.dat/IndexBuildIndependent_xccw.gso#PGSO +gs_other.bin 3 geometry 636a45f7fa065f43 /data000.cpk/shader.dat/IndexBuildIndependent_xcw.gso#PGSO +ps_other.bin 274 pixel 00c05859b72da4f5 /data000.cpk/shader.dat/ModelShaderBlurPass5.pso#PGSO +cs_other.bin 0 compute d5077e43ea265ae8 /data000.cpk/shader.dat/SelectCubeTex.cso#PGSO +cs_other.bin 1 compute f897d9ae7bc2050f /data000.cpk/shader.dat/SelectCubeTileMinMaxDepth.cso#PGSO +cs_other.bin 2 compute 4072f08f140e1da8 /data000.cpk/shader.dat/TileCubeCS.cso#PGSO +cs_other.bin 3 compute 9be04df03c735fe6 /data000.cpk/shader.dat/averagebrightness.cso#PGSO +cs_other.bin 4 compute 13fb7b749ddae3e3 /data000.cpk/shader.dat/averagebrightness2.cso#PGSO +ps_other.bin 275 pixel f0c5b1986a65a225 /data000.cpk/shader.dat/enlightenalbedo.pso#PGSO +vs_other.bin 239 vertex 70c45d397c6ea923 /data000.cpk/shader.dat/enlightenalbedo.vso#PGSO +ps_other.bin 276 pixel 3601519118cd6126 /data000.cpk/shader.dat/enlightenalbedoblend.pso#PGSO +vs_other.bin 240 vertex ca869f9f731aa601 /data000.cpk/shader.dat/enlightenalbedoblend.vso#PGSO +vs_other.bin 241 vertex 1a6ef47568d1adaa /data000.cpk/shader.dat/enlightenalbedocns.vso#PGSO +ps_other.bin 277 pixel ed56a544d45635d5 /data000.cpk/shader.dat/enlightenbakedisp.pso#PGSO +vs_other.bin 242 vertex 7125a9f1fa9ff7f3 /data000.cpk/shader.dat/enlightenbakedisp.vso#PGSO +ps_other.bin 278 pixel 589986948ba6d2ad /data000.cpk/shader.dat/enlightencubealbedo.pso#PGSO +vs_other.bin 243 vertex 53ff15f43c32fe44 /data000.cpk/shader.dat/enlightencubealbedo.vso#PGSO +ps_other.bin 279 pixel fe3f7a4ebf637cda /data000.cpk/shader.dat/enlightencubealbedo1bm.pso#PGSO +ps_other.bin 280 pixel b247f12a975063c5 /data000.cpk/shader.dat/enlightencubealbedoblend.pso#PGSO +vs_other.bin 244 vertex e54a62db3d6fa8f1 /data000.cpk/shader.dat/enlightencubealbedoblend.vso#PGSO +ps_other.bin 281 pixel 8165db9e0a088437 /data000.cpk/shader.dat/enlightencubealbedocns.pso#PGSO +ps_other.bin 282 pixel a2ae650cf7b313d1 /data000.cpk/shader.dat/enlightentestshader.pso#PGSO +vs_other.bin 245 vertex 3798a8667a4e8bb4 /data000.cpk/shader.dat/enlightentestshader.vso#PGSO +ps_other.bin 283 pixel 484f82b822d123b7 /data000.cpk/shader.dat/filter01.pso#PGSO +ps_other.bin 284 pixel 24337b82ee53e9fc /data000.cpk/shader.dat/filter02.pso#PGSO +ps_other.bin 285 pixel f362152a3951ab42 /data000.cpk/shader.dat/filter03.pso#PGSO +ps_other.bin 286 pixel 057c65887d5f8ce7 /data000.cpk/shader.dat/filter05.pso#PGSO +ps_other.bin 287 pixel e85067c024b6ad34 /data000.cpk/shader.dat/filter06.pso#PGSO +ps_other.bin 288 pixel 3818b76c380bd44c /data000.cpk/shader.dat/filter07.pso#PGSO +ps_other.bin 289 pixel fd2c47b73f0e7e24 /data000.cpk/shader.dat/filter09.pso#PGSO +vs_other.bin 246 vertex 27e74443a67249cf /data000.cpk/shader.dat/filter09.vso#PGSO +ps_other.bin 290 pixel d06ba3260f680d28 /data000.cpk/shader.dat/filter09_Sub2.pso#PGSO +vs_other.bin 247 vertex 6e18499028aead6a /data000.cpk/shader.dat/filter09_Sub2.vso#PGSO +ps_other.bin 291 pixel df6e63a1cf5740a7 /data000.cpk/shader.dat/filterbloom.pso#PGSO +ps_other.bin 292 pixel 7b61c45a469b1f1b /data000.cpk/shader.dat/filterbloomblur_ps.pso#PGSO +vs_other.bin 248 vertex 54855c38a82e3f39 /data000.cpk/shader.dat/filterbloomblur_vs.vso#PGSO +ps_other.bin 293 pixel 02c197300adc98cc /data000.cpk/shader.dat/filtercraa.pso#PGSO +ps_other.bin 294 pixel 25618895c315f986 /data000.cpk/shader.dat/filterdof.pso#PGSO +ps_other.bin 295 pixel 933454821bc99b16 /data000.cpk/shader.dat/filterdofready.pso#PGSO +ps_other.bin 296 pixel af6be82ada4ab609 /data000.cpk/shader.dat/filterdownsample.pso#PGSO +ps_other.bin 297 pixel 11674732fb1a96e2 /data000.cpk/shader.dat/filtershaderblendmlaa.pso#PGSO +ps_other.bin 298 pixel 54abcb54d00b36b0 /data000.cpk/shader.dat/filtershadercameravelocity.pso#PGSO +ps_other.bin 299 pixel 5f224066cee38b15 /data000.cpk/shader.dat/filtershaderdirectionvelocitymap.pso#PGSO +ps_other.bin 300 pixel dbe764439bb40c88 /data000.cpk/shader.dat/filtershaderdlaa1.pso#PGSO +ps_other.bin 301 pixel c346deb47f9fbc5d /data000.cpk/shader.dat/filtershaderdlaa2.pso#PGSO +ps_other.bin 302 pixel a9474f5b8af94c96 /data000.cpk/shader.dat/filtershaderedgemlaa.pso#PGSO +ps_other.bin 303 pixel 9b26d1dbb9b146d0 /data000.cpk/shader.dat/filtershaderhair.pso#PGSO +ps_other.bin 304 pixel bd4a2acfdbb19ba7 /data000.cpk/shader.dat/filtershaderhdrcomposite.pso#PGSO +ps_other.bin 305 pixel 41797b81b28e2e9f /data000.cpk/shader.dat/filtershadermlaa.pso#PGSO +ps_other.bin 306 pixel 216aa0959283e224 /data000.cpk/shader.dat/filtershadersssssblurh.pso#PGSO +ps_other.bin 307 pixel fe25a5abd42c1333 /data000.cpk/shader.dat/filtershadersssssblurv.pso#PGSO +ps_other.bin 308 pixel b437477297003e29 /data000.cpk/shader.dat/filtershaderzlinearconversion.pso#PGSO +vs_other.bin 249 vertex 65426d1f51dbaa57 /data000.cpk/shader.dat/filtershaderzlinearconversion.vso#PGSO +ps_other.bin 309 pixel ba848435d11756cb /data000.cpk/shader.dat/filtersmaablend.pso#PGSO +ps_other.bin 310 pixel 4c468c6444bbc118 /data000.cpk/shader.dat/filtersmaacopy.pso#PGSO +ps_other.bin 311 pixel aa882fafe5929761 /data000.cpk/shader.dat/filtersmaaedge.pso#PGSO +ps_other.bin 312 pixel ec0782d1dedbfac2 /data000.cpk/shader.dat/filtersmaaweight.pso#PGSO +ps_other.bin 313 pixel d47c8211f5c4dbfa /data000.cpk/shader.dat/gbuffercloth.pso#PGSO +ps_other.bin 314 pixel 4df07e39333a983e /data000.cpk/shader.dat/gbuffercns.pso#PGSO +ps_other.bin 315 pixel 1b1058a9b975d2e3 /data000.cpk/shader.dat/gbuffereye.pso#PGSO +ps_other.bin 316 pixel 91b49f479f794de5 /data000.cpk/shader.dat/gbufferhair01.pso#PGSO +ps_other.bin 317 pixel 16114ffe426a3561 /data000.cpk/shader.dat/gbufferlambert00.pso#PGSO +ps_other.bin 318 pixel 27fa83dd220a4d28 /data000.cpk/shader.dat/gbufferpbs.pso#PGSO +ps_other.bin 319 pixel 8079cd89bb7ba2e6 /data000.cpk/shader.dat/gbufferplant.pso#PGSO +ps_other.bin 320 pixel a8b4cadc5e975a43 /data000.cpk/shader.dat/gbufferskin.pso#PGSO +ps_other.bin 321 pixel 0b57cefad06f2553 /data000.cpk/shader.dat/hexagonalblur1.pso#PGSO +ps_other.bin 322 pixel 43c69327cb72c749 /data000.cpk/shader.dat/hexagonalblur2.pso#PGSO +ps_other.bin 323 pixel 19adbe4a4863fdd7 /data000.cpk/shader.dat/hexagonalblur3.pso#PGSO +ps_other.bin 324 pixel 98f4289515ef293e /data000.cpk/shader.dat/makehalfshadowmap.pso#PGSO +ps_other.bin 325 pixel ce2642e6452fe67c /data000.cpk/shader.dat/makehalfzbuffer.pso#PGSO +ps_other.bin 326 pixel bd9bc7d181587501 /data000.cpk/shader.dat/modelshaderCustomshadowreceiver.pso#PGSO +ps_other.bin 327 pixel 2b38a5ce1c45f7b6 /data000.cpk/shader.dat/modelshaderblur.pso#PGSO +ps_other.bin 328 pixel 72730c8c9e1d6811 /data000.cpk/shader.dat/modelshadercloth.pso#PGSO +vs_other.bin 250 vertex 876fa391da6d971d /data000.cpk/shader.dat/modelshadercloth_vs_obj.vso#PGSO +vs_other.bin 251 vertex 0b935131beed4743 /data000.cpk/shader.dat/modelshadercloth_vs_scr.vso#PGSO +ps_other.bin 329 pixel 0ca08863622f48e3 /data000.cpk/shader.dat/modelshadercns.pso#PGSO +vs_other.bin 252 vertex 58b01056e8e1d0e1 /data000.cpk/shader.dat/modelshadercns_vs_obj.vso#PGSO +vs_other.bin 253 vertex 6339e2754623a767 /data000.cpk/shader.dat/modelshadercns_vs_scr.vso#PGSO +ps_other.bin 330 pixel f587a5955e3880b5 /data000.cpk/shader.dat/modelshadereye.pso#PGSO +vs_other.bin 254 vertex dd1168979ad75928 /data000.cpk/shader.dat/modelshadereye_vs_obj.vso#PGSO +vs_other.bin 255 vertex 82aa28863ce57170 /data000.cpk/shader.dat/modelshadereye_vs_scr.vso#PGSO +ps_other.bin 331 pixel ccb4f8d24c7631bf /data000.cpk/shader.dat/modelshaderfixed.pso#PGSO +vs_other.bin 256 vertex 05dea90b96ac259b /data000.cpk/shader.dat/modelshaderfixed.vso#PGSO +ps_other.bin 332 pixel 01320942316ab506 /data000.cpk/shader.dat/modelshaderhair.pso#PGSO +ps_other.bin 333 pixel 147106bbef6f8b1a /data000.cpk/shader.dat/modelshaderhair01.pso#PGSO +vs_other.bin 257 vertex 3c827071d2e51c47 /data000.cpk/shader.dat/modelshaderhair_vs_obj.vso#PGSO +vs_other.bin 258 vertex c095fa961fef42f7 /data000.cpk/shader.dat/modelshaderhair_vs_scr.vso#PGSO +ps_other.bin 334 pixel 19049b3c8323708c /data000.cpk/shader.dat/modelshadernewshadowreceiver.pso#PGSO +vs_other.bin 259 vertex 3075f4bd6e97a74b /data000.cpk/shader.dat/modelshadernewshadowreceiver.vso#PGSO +ps_other.bin 335 pixel 6be4be1df7441a64 /data000.cpk/shader.dat/modelshadernewshadowreceiver2.pso#PGSO +ps_other.bin 336 pixel 382d44daf244e9b3 /data000.cpk/shader.dat/modelshadernewshadowreceiver3.pso#PGSO +vs_other.bin 260 vertex 29ddf580a55222ae /data000.cpk/shader.dat/modelshadernull_vs_obj.vso#PGSO +vs_other.bin 261 vertex 0fa9cef06a5f2fde /data000.cpk/shader.dat/modelshadernull_vs_scr.vso#PGSO +ps_other.bin 337 pixel 1f85d195cc4880d7 /data000.cpk/shader.dat/modelshaderpbs00.pso#PGSO +ps_other.bin 338 pixel cd4eb940031aa4b8 /data000.cpk/shader.dat/modelshaderpbs10.pso#PGSO +vs_other.bin 262 vertex 621589bd6c91847f /data000.cpk/shader.dat/modelshaderpbs10_vs_obj.vso#PGSO +vs_other.bin 263 vertex 5612e3d2cd7cd78d /data000.cpk/shader.dat/modelshaderpbs10_vs_scr.vso#PGSO +vs_other.bin 264 vertex 89e1d6f2b304ae32 /data000.cpk/shader.dat/modelshaderpbs_vs_obj.vso#PGSO +vs_other.bin 265 vertex f3919c82e489b011 /data000.cpk/shader.dat/modelshaderpbs_vs_scr.vso#PGSO +ps_other.bin 339 pixel a1b88d7a41343421 /data000.cpk/shader.dat/modelshaderplant.pso#PGSO +vs_other.bin 266 vertex c1b2e3d056378866 /data000.cpk/shader.dat/modelshaderplant01_vs_obj.vso#PGSO +vs_other.bin 267 vertex b573c5dd40a228f2 /data000.cpk/shader.dat/modelshaderplant01_vs_scr.vso#PGSO +vs_other.bin 268 vertex 2f64b946ae766851 /data000.cpk/shader.dat/modelshaderplant_vs_obj.vso#PGSO +vs_other.bin 269 vertex fc27b3452fa63d5d /data000.cpk/shader.dat/modelshaderplant_vs_scr.vso#PGSO +ps_other.bin 340 pixel 82185ffc0e97d173 /data000.cpk/shader.dat/modelshaderskin.pso#PGSO +vs_other.bin 270 vertex 38cd449544dbe683 /data000.cpk/shader.dat/modelshaderskin_vs_obj.vso#PGSO +vs_other.bin 271 vertex ac2629ecce1ec96d /data000.cpk/shader.dat/modelshaderskin_vs_scr.vso#PGSO +ps_other.bin 341 pixel f0d1b0d690104838 /data000.cpk/shader.dat/modelshaderskinsssss.pso#PGSO +ps_other.bin 342 pixel a37fe599e409353a /data000.cpk/shader.dat/modelshadervelocitymap.pso#PGSO +vs_other.bin 272 vertex ad33d76034eab219 /data000.cpk/shader.dat/modelshadervelocitymap.vso#PGSO +vs_other.bin 273 vertex ff48ccf774f7f2dd /data000.cpk/shader.dat/modelshadervelocitymapscr.vso#PGSO +vs_other.bin 274 vertex 1b3dfee2dc5fbae7 /data000.cpk/shader.dat/modelshaderweight.vso#PGSO +ps_other.bin 343 pixel 9cb4c5f684ceae8d /data000.cpk/shader.dat/ps_cns_bdxxx.pso#PGSO +ps_other.bin 344 pixel f6ec5c17a2390753 /data000.cpk/shader.dat/ps_cns_bxxxx.pso#PGSO +ps_other.bin 345 pixel b487b287f7eba379 /data000.cpk/shader.dat/ps_cns_xdxxx.pso#PGSO +ps_other.bin 346 pixel 57290de615ee7295 /data000.cpk/shader.dat/ps_cns_xxxxx.pso#PGSO +ps_other.bin 347 pixel 63f5b8a6e6bff8f8 /data000.cpk/shader.dat/ps_cnsev_bdxxx.pso#PGSO +ps_other.bin 348 pixel eea57779c79d4e7c /data000.cpk/shader.dat/ps_cnsev_bxxxx.pso#PGSO +ps_other.bin 349 pixel f19b80c5fa81b727 /data000.cpk/shader.dat/ps_cnsev_xdxxx.pso#PGSO +ps_other.bin 350 pixel b092b2e7c5483dac /data000.cpk/shader.dat/ps_cnsev_xxxxx.pso#PGSO +ps_other.bin 351 pixel 2789ec3ac9bdcbc1 /data000.cpk/shader.dat/ps_fp_cloth_bdewx.pso#PGSO +ps_other.bin 352 pixel 118bafb2989d4bf1 /data000.cpk/shader.dat/ps_fp_cloth_bdexx.pso#PGSO +ps_other.bin 353 pixel 27ad18e45b78ce48 /data000.cpk/shader.dat/ps_fp_cloth_bdhwx.pso#PGSO +ps_other.bin 354 pixel 54b872c6778926db /data000.cpk/shader.dat/ps_fp_cloth_bdhxx.pso#PGSO +ps_other.bin 355 pixel 177a3c478af14d3c /data000.cpk/shader.dat/ps_fp_cloth_bdxwx.pso#PGSO +ps_other.bin 356 pixel 59ab77db286c4be9 /data000.cpk/shader.dat/ps_fp_cloth_bdxxx.pso#PGSO +ps_other.bin 357 pixel f4937b7642e71181 /data000.cpk/shader.dat/ps_fp_cloth_bxewx.pso#PGSO +ps_other.bin 358 pixel 81bbdcbbec8199ae /data000.cpk/shader.dat/ps_fp_cloth_bxexx.pso#PGSO +ps_other.bin 359 pixel 03b8713733aefd85 /data000.cpk/shader.dat/ps_fp_cloth_bxhwx.pso#PGSO +ps_other.bin 360 pixel 1079345afdc769d0 /data000.cpk/shader.dat/ps_fp_cloth_bxhxx.pso#PGSO +ps_other.bin 361 pixel fe82bdd78a289c4c /data000.cpk/shader.dat/ps_fp_cloth_bxxwx.pso#PGSO +ps_other.bin 362 pixel 61f08480b99e21f0 /data000.cpk/shader.dat/ps_fp_cloth_bxxxx.pso#PGSO +ps_other.bin 363 pixel 7f854100c699b027 /data000.cpk/shader.dat/ps_fp_cloth_xdewx.pso#PGSO +ps_other.bin 364 pixel e604ebd0fcd9a42e /data000.cpk/shader.dat/ps_fp_cloth_xdexx.pso#PGSO +ps_other.bin 365 pixel 62bb4b88ce5938fb /data000.cpk/shader.dat/ps_fp_cloth_xdhwx.pso#PGSO +ps_other.bin 366 pixel dcb9218a1f683a17 /data000.cpk/shader.dat/ps_fp_cloth_xdhxx.pso#PGSO +ps_other.bin 367 pixel 9f7719b82a5cc42c /data000.cpk/shader.dat/ps_fp_cloth_xdxwx.pso#PGSO +ps_other.bin 368 pixel 339bcc421a3fed9e /data000.cpk/shader.dat/ps_fp_cloth_xdxxx.pso#PGSO +ps_other.bin 369 pixel d969ed9c8c23bb34 /data000.cpk/shader.dat/ps_fp_cloth_xxewx.pso#PGSO +ps_other.bin 370 pixel 223029577754f6e7 /data000.cpk/shader.dat/ps_fp_cloth_xxexx.pso#PGSO +ps_other.bin 371 pixel 32bcec592adf5412 /data000.cpk/shader.dat/ps_fp_cloth_xxhwx.pso#PGSO +ps_other.bin 372 pixel 3921f4800275ac71 /data000.cpk/shader.dat/ps_fp_cloth_xxhxx.pso#PGSO +ps_other.bin 373 pixel d9cba3e1027dcb5a /data000.cpk/shader.dat/ps_fp_cloth_xxxwx.pso#PGSO +ps_other.bin 374 pixel 1c487ae9c00f701a /data000.cpk/shader.dat/ps_fp_cloth_xxxxx.pso#PGSO +ps_other.bin 375 pixel 39bb0e71eea349f6 /data000.cpk/shader.dat/ps_fp_eye_xdhxx.pso#PGSO +ps_other.bin 376 pixel dc6087eb880f6c77 /data000.cpk/shader.dat/ps_fp_eye_xdxxx.pso#PGSO +ps_other.bin 377 pixel 0dc25e17bac22c25 /data000.cpk/shader.dat/ps_fp_eye_xxhxx.pso#PGSO +ps_other.bin 378 pixel a27ababf8a8adb96 /data000.cpk/shader.dat/ps_fp_eye_xxxxx.pso#PGSO +ps_other.bin 379 pixel 88d180d403bd7704 /data000.cpk/shader.dat/ps_fp_glass_xdxxx.pso#PGSO +ps_other.bin 380 pixel e579dcf86f5d5884 /data000.cpk/shader.dat/ps_fp_glass_xxxxx.pso#PGSO +ps_other.bin 381 pixel ce4b42ac23f4ebac /data000.cpk/shader.dat/ps_fp_hair01_bdhwx.pso#PGSO +ps_other.bin 382 pixel 957fe8fb44954ff5 /data000.cpk/shader.dat/ps_fp_hair01_bdhxx.pso#PGSO +ps_other.bin 383 pixel fdbd44b7fef9fdb2 /data000.cpk/shader.dat/ps_fp_hair01_bdxwx.pso#PGSO +ps_other.bin 384 pixel 5ff1d23dae22be64 /data000.cpk/shader.dat/ps_fp_hair01_bdxxx.pso#PGSO +ps_other.bin 385 pixel e31d14d2f93b041d /data000.cpk/shader.dat/ps_fp_hair01_bxhwx.pso#PGSO +ps_other.bin 386 pixel 9879d4718f599aec /data000.cpk/shader.dat/ps_fp_hair01_bxhxx.pso#PGSO +ps_other.bin 387 pixel 9aca85bd6f65c0d2 /data000.cpk/shader.dat/ps_fp_hair01_bxxwx.pso#PGSO +ps_other.bin 388 pixel 0e46d7a4f4ad2f7f /data000.cpk/shader.dat/ps_fp_hair01_bxxxx.pso#PGSO +ps_other.bin 389 pixel c46aed25da92659b /data000.cpk/shader.dat/ps_fp_hair01_xdhwx.pso#PGSO +ps_other.bin 390 pixel 917ae9c5c5b11860 /data000.cpk/shader.dat/ps_fp_hair01_xdhxx.pso#PGSO +ps_other.bin 391 pixel 18b87f17e6b0004e /data000.cpk/shader.dat/ps_fp_hair01_xdxwx.pso#PGSO +ps_other.bin 392 pixel bebc42a10ff30be1 /data000.cpk/shader.dat/ps_fp_hair01_xdxxx.pso#PGSO +ps_other.bin 393 pixel 43fedaefc865e676 /data000.cpk/shader.dat/ps_fp_hair01_xxhwx.pso#PGSO +ps_other.bin 394 pixel 7939e582d3085f21 /data000.cpk/shader.dat/ps_fp_hair01_xxhxx.pso#PGSO +ps_other.bin 395 pixel caa896a928c89477 /data000.cpk/shader.dat/ps_fp_hair01_xxxwx.pso#PGSO +ps_other.bin 396 pixel 96a6d450801e1360 /data000.cpk/shader.dat/ps_fp_hair01_xxxxx.pso#PGSO +ps_other.bin 397 pixel 3d6154f9bfd94787 /data000.cpk/shader.dat/ps_fp_hair02_bdxxx.pso#PGSO +ps_other.bin 398 pixel 781b9bf0c8a320cf /data000.cpk/shader.dat/ps_fp_hair02_bxxxx.pso#PGSO +ps_other.bin 399 pixel 84b95d245e56436c /data000.cpk/shader.dat/ps_fp_hair02_xdxxx.pso#PGSO +ps_other.bin 400 pixel fe3ed6c8c43cc321 /data000.cpk/shader.dat/ps_fp_hair02_xxxxx.pso#PGSO +ps_other.bin 401 pixel 66ffcc217874db5b /data000.cpk/shader.dat/ps_fp_lambert00_bdewix.pso#PGSO +ps_other.bin 402 pixel 9c8f15a247b69214 /data000.cpk/shader.dat/ps_fp_lambert00_bdewx.pso#PGSO +ps_other.bin 403 pixel c2aadf7db6fc9a29 /data000.cpk/shader.dat/ps_fp_lambert00_bdewxx.pso#PGSO +ps_other.bin 404 pixel e895f5d9293ea9c8 /data000.cpk/shader.dat/ps_fp_lambert00_bdexix.pso#PGSO +ps_other.bin 405 pixel ef0b6569b70c54c2 /data000.cpk/shader.dat/ps_fp_lambert00_bdexx.pso#PGSO +ps_other.bin 406 pixel 4b208cec07ecd33d /data000.cpk/shader.dat/ps_fp_lambert00_bdexxx.pso#PGSO +ps_other.bin 407 pixel 580399eee628b48f /data000.cpk/shader.dat/ps_fp_lambert00_bdhwix.pso#PGSO +ps_other.bin 408 pixel e10fa9798ae8c9c1 /data000.cpk/shader.dat/ps_fp_lambert00_bdhwx.pso#PGSO +ps_other.bin 409 pixel 6691c90e6aa6f16f /data000.cpk/shader.dat/ps_fp_lambert00_bdhwxx.pso#PGSO +ps_other.bin 410 pixel 3e575f1a924d294f /data000.cpk/shader.dat/ps_fp_lambert00_bdhxx.pso#PGSO +ps_other.bin 411 pixel 966a51d807b0a97f /data000.cpk/shader.dat/ps_fp_lambert00_bdxwx.pso#PGSO +ps_other.bin 412 pixel b264a4dd37c31fbb /data000.cpk/shader.dat/ps_fp_lambert00_bdxxix.pso#PGSO +ps_other.bin 413 pixel b25e4ee1cff279f3 /data000.cpk/shader.dat/ps_fp_lambert00_bdxxx.pso#PGSO +ps_other.bin 414 pixel 0eaaa0915d6209a6 /data000.cpk/shader.dat/ps_fp_lambert00_bdxxxx.pso#PGSO +ps_other.bin 415 pixel ff88562a3e97a6b8 /data000.cpk/shader.dat/ps_fp_lambert00_bxewix.pso#PGSO +ps_other.bin 416 pixel b0fb56fd1f71c4a8 /data000.cpk/shader.dat/ps_fp_lambert00_bxewx.pso#PGSO +ps_other.bin 417 pixel 3dbd84c60e999af1 /data000.cpk/shader.dat/ps_fp_lambert00_bxewxx.pso#PGSO +ps_other.bin 418 pixel 7133623f4c4dc4a3 /data000.cpk/shader.dat/ps_fp_lambert00_bxexix.pso#PGSO +ps_other.bin 419 pixel 6a286e5c653d0450 /data000.cpk/shader.dat/ps_fp_lambert00_bxexx.pso#PGSO +ps_other.bin 420 pixel 17490c8c54c52a55 /data000.cpk/shader.dat/ps_fp_lambert00_bxexxx.pso#PGSO +ps_other.bin 421 pixel 8d98ff3c7be908bd /data000.cpk/shader.dat/ps_fp_lambert00_bxhwx.pso#PGSO +ps_other.bin 422 pixel 1bb06530dee1856c /data000.cpk/shader.dat/ps_fp_lambert00_bxhxix.pso#PGSO +ps_other.bin 423 pixel b8ca41c2fb38a7b8 /data000.cpk/shader.dat/ps_fp_lambert00_bxhxx.pso#PGSO +ps_other.bin 424 pixel 0cb53cd5f310dc2e /data000.cpk/shader.dat/ps_fp_lambert00_bxhxxx.pso#PGSO +ps_other.bin 425 pixel f9360a0b07e55954 /data000.cpk/shader.dat/ps_fp_lambert00_bxxwix.pso#PGSO +ps_other.bin 426 pixel 6db6ca5af1907825 /data000.cpk/shader.dat/ps_fp_lambert00_bxxwx.pso#PGSO +ps_other.bin 427 pixel 3079c878f09933a7 /data000.cpk/shader.dat/ps_fp_lambert00_bxxwxx.pso#PGSO +ps_other.bin 428 pixel 075aafb51cb01716 /data000.cpk/shader.dat/ps_fp_lambert00_bxxxx.pso#PGSO +ps_other.bin 429 pixel c18fcfc844ab9408 /data000.cpk/shader.dat/ps_fp_lambert00_xdewix.pso#PGSO +ps_other.bin 430 pixel 90f30429e8e29847 /data000.cpk/shader.dat/ps_fp_lambert00_xdewx.pso#PGSO +ps_other.bin 431 pixel 2c9b625ee3684b9a /data000.cpk/shader.dat/ps_fp_lambert00_xdewxx.pso#PGSO +ps_other.bin 432 pixel 403f9f46aefc57c5 /data000.cpk/shader.dat/ps_fp_lambert00_xdexix.pso#PGSO +ps_other.bin 433 pixel 8f013667aa7dca81 /data000.cpk/shader.dat/ps_fp_lambert00_xdexx.pso#PGSO +ps_other.bin 434 pixel 6cf77e340cec2f1e /data000.cpk/shader.dat/ps_fp_lambert00_xdexxx.pso#PGSO +ps_other.bin 435 pixel f7a20ca368b9a8ac /data000.cpk/shader.dat/ps_fp_lambert00_xdhwix.pso#PGSO +ps_other.bin 436 pixel a99bffd7a5e768a0 /data000.cpk/shader.dat/ps_fp_lambert00_xdhwx.pso#PGSO +ps_other.bin 437 pixel 003014fbe32aebf4 /data000.cpk/shader.dat/ps_fp_lambert00_xdhwxx.pso#PGSO +ps_other.bin 438 pixel 52c7997e21d1eb36 /data000.cpk/shader.dat/ps_fp_lambert00_xdhxx.pso#PGSO +ps_other.bin 439 pixel 202923e5c813d4aa /data000.cpk/shader.dat/ps_fp_lambert00_xdxwix.pso#PGSO +ps_other.bin 440 pixel 719f634bb895c353 /data000.cpk/shader.dat/ps_fp_lambert00_xdxwx.pso#PGSO +ps_other.bin 441 pixel eb0922befdb7b043 /data000.cpk/shader.dat/ps_fp_lambert00_xdxwxx.pso#PGSO +ps_other.bin 442 pixel 8e5cff80be5c874f /data000.cpk/shader.dat/ps_fp_lambert00_xdxxix.pso#PGSO +ps_other.bin 443 pixel 20b64c203706a52f /data000.cpk/shader.dat/ps_fp_lambert00_xdxxx.pso#PGSO +ps_other.bin 444 pixel 8bef09dad5a103e1 /data000.cpk/shader.dat/ps_fp_lambert00_xdxxxx.pso#PGSO +ps_other.bin 445 pixel b0627b7e3823275c /data000.cpk/shader.dat/ps_fp_lambert00_xxewix.pso#PGSO +ps_other.bin 446 pixel b260462137df5427 /data000.cpk/shader.dat/ps_fp_lambert00_xxewx.pso#PGSO +ps_other.bin 447 pixel 17eaed65b43ac6f4 /data000.cpk/shader.dat/ps_fp_lambert00_xxewxx.pso#PGSO +ps_other.bin 448 pixel faa468864b8110ef /data000.cpk/shader.dat/ps_fp_lambert00_xxexix.pso#PGSO +ps_other.bin 449 pixel bf08a5dc06a7d112 /data000.cpk/shader.dat/ps_fp_lambert00_xxexx.pso#PGSO +ps_other.bin 450 pixel 9495e6b01c756c43 /data000.cpk/shader.dat/ps_fp_lambert00_xxexxx.pso#PGSO +ps_other.bin 451 pixel 24a4cd12e800f95e /data000.cpk/shader.dat/ps_fp_lambert00_xxhwix.pso#PGSO +ps_other.bin 452 pixel db65c817fb9d1861 /data000.cpk/shader.dat/ps_fp_lambert00_xxhwx.pso#PGSO +ps_other.bin 453 pixel 15d18a598340fb88 /data000.cpk/shader.dat/ps_fp_lambert00_xxhwxx.pso#PGSO +ps_other.bin 454 pixel 67c88c743f9a871e /data000.cpk/shader.dat/ps_fp_lambert00_xxhxix.pso#PGSO +ps_other.bin 455 pixel d79ccce6eb89f289 /data000.cpk/shader.dat/ps_fp_lambert00_xxhxx.pso#PGSO +ps_other.bin 456 pixel 0ff2b3373c66d85e /data000.cpk/shader.dat/ps_fp_lambert00_xxhxxx.pso#PGSO +ps_other.bin 457 pixel a9632fde873ee921 /data000.cpk/shader.dat/ps_fp_lambert00_xxxwix.pso#PGSO +ps_other.bin 458 pixel 5bb2c43641188932 /data000.cpk/shader.dat/ps_fp_lambert00_xxxwx.pso#PGSO +ps_other.bin 459 pixel 2d4899a7ef57eba9 /data000.cpk/shader.dat/ps_fp_lambert00_xxxwxx.pso#PGSO +ps_other.bin 460 pixel d0867487b2c4d016 /data000.cpk/shader.dat/ps_fp_lambert00_xxxxx.pso#PGSO +ps_other.bin 461 pixel 20c95d29aaf93306 /data000.cpk/shader.dat/ps_fp_lambert10_xdewsix.pso#PGSO +ps_other.bin 462 pixel e1faa11b31b881df /data000.cpk/shader.dat/ps_fp_lambert10_xdewsxx.pso#PGSO +ps_other.bin 463 pixel 5e2ee67857cdf104 /data000.cpk/shader.dat/ps_fp_lambert10_xdewx.pso#PGSO +ps_other.bin 464 pixel 0b4ba101ab8d927d /data000.cpk/shader.dat/ps_fp_lambert10_xdewxix.pso#PGSO +ps_other.bin 465 pixel 1e4f9535ee1cc478 /data000.cpk/shader.dat/ps_fp_lambert10_xdewxxx.pso#PGSO +ps_other.bin 466 pixel 55023f3c47c8fce0 /data000.cpk/shader.dat/ps_fp_lambert10_xdexsix.pso#PGSO +ps_other.bin 467 pixel ebcb177421c5fe9c /data000.cpk/shader.dat/ps_fp_lambert10_xdexsxx.pso#PGSO +ps_other.bin 468 pixel c57f095eacf1542e /data000.cpk/shader.dat/ps_fp_lambert10_xdexx.pso#PGSO +ps_other.bin 469 pixel 63cbf756b4b21ec8 /data000.cpk/shader.dat/ps_fp_lambert10_xdexxix.pso#PGSO +ps_other.bin 470 pixel dc01ab73178bc0ba /data000.cpk/shader.dat/ps_fp_lambert10_xdexxxx.pso#PGSO +ps_other.bin 471 pixel 26f49ea2c81507a3 /data000.cpk/shader.dat/ps_fp_lambert10_xdxwsix.pso#PGSO +ps_other.bin 472 pixel 2633cce6b1975d2c /data000.cpk/shader.dat/ps_fp_lambert10_xdxwsxx.pso#PGSO +ps_other.bin 473 pixel ca0b2591d770533e /data000.cpk/shader.dat/ps_fp_lambert10_xdxwx.pso#PGSO +ps_other.bin 474 pixel 4916fee6e3c5ed85 /data000.cpk/shader.dat/ps_fp_lambert10_xdxwxix.pso#PGSO +ps_other.bin 475 pixel b71d445a46e02886 /data000.cpk/shader.dat/ps_fp_lambert10_xdxwxxx.pso#PGSO +ps_other.bin 476 pixel 487a13557533a785 /data000.cpk/shader.dat/ps_fp_lambert10_xdxxsix.pso#PGSO +ps_other.bin 477 pixel 7e992f26370a6b44 /data000.cpk/shader.dat/ps_fp_lambert10_xdxxsxx.pso#PGSO +ps_other.bin 478 pixel 4b89fab5d26ed81c /data000.cpk/shader.dat/ps_fp_lambert10_xdxxx.pso#PGSO +ps_other.bin 479 pixel ad1cec31c7bca485 /data000.cpk/shader.dat/ps_fp_lambert10_xdxxxix.pso#PGSO +ps_other.bin 480 pixel 39a47047f1ab9a83 /data000.cpk/shader.dat/ps_fp_lambert10_xdxxxxx.pso#PGSO +ps_other.bin 481 pixel e2b88b8922c27f73 /data000.cpk/shader.dat/ps_fp_lambert10_xxewsix.pso#PGSO +ps_other.bin 482 pixel 78cf40ed039f07c1 /data000.cpk/shader.dat/ps_fp_lambert10_xxewsxx.pso#PGSO +ps_other.bin 483 pixel c63efd084cbe9480 /data000.cpk/shader.dat/ps_fp_lambert10_xxewx.pso#PGSO +ps_other.bin 484 pixel 473f6ab8c59b1f3d /data000.cpk/shader.dat/ps_fp_lambert10_xxewxix.pso#PGSO +ps_other.bin 485 pixel d3acfba46574bfb8 /data000.cpk/shader.dat/ps_fp_lambert10_xxewxxx.pso#PGSO +ps_other.bin 486 pixel e1454b7d0252d0db /data000.cpk/shader.dat/ps_fp_lambert10_xxexsix.pso#PGSO +ps_other.bin 487 pixel 0e3db0a47ceb7f80 /data000.cpk/shader.dat/ps_fp_lambert10_xxexsxx.pso#PGSO +ps_other.bin 488 pixel f5c15400da0a379a /data000.cpk/shader.dat/ps_fp_lambert10_xxexx.pso#PGSO +ps_other.bin 489 pixel cf94090093979443 /data000.cpk/shader.dat/ps_fp_lambert10_xxexxix.pso#PGSO +ps_other.bin 490 pixel 884473299c5c799f /data000.cpk/shader.dat/ps_fp_lambert10_xxexxxx.pso#PGSO +ps_other.bin 491 pixel de895233d8fd5367 /data000.cpk/shader.dat/ps_fp_lambert10_xxxwsix.pso#PGSO +ps_other.bin 492 pixel 38e533b6fa493721 /data000.cpk/shader.dat/ps_fp_lambert10_xxxwsxx.pso#PGSO +ps_other.bin 493 pixel cc08b87595d589b7 /data000.cpk/shader.dat/ps_fp_lambert10_xxxwx.pso#PGSO +ps_other.bin 494 pixel dfdaa2f15acc9a45 /data000.cpk/shader.dat/ps_fp_lambert10_xxxwxix.pso#PGSO +ps_other.bin 495 pixel ae35943743a52f86 /data000.cpk/shader.dat/ps_fp_lambert10_xxxwxxx.pso#PGSO +ps_other.bin 496 pixel 6efd44a7cebb5f16 /data000.cpk/shader.dat/ps_fp_lambert10_xxxxsix.pso#PGSO +ps_other.bin 497 pixel c31e0772f4bd9add /data000.cpk/shader.dat/ps_fp_lambert10_xxxxsxx.pso#PGSO +ps_other.bin 498 pixel 64c12f0776b74fad /data000.cpk/shader.dat/ps_fp_lambert10_xxxxx.pso#PGSO +ps_other.bin 499 pixel 6c53ffac7c94ece0 /data000.cpk/shader.dat/ps_fp_lambert10_xxxxxix.pso#PGSO +ps_other.bin 500 pixel ee8bcdee3b18ef1c /data000.cpk/shader.dat/ps_fp_lambert10_xxxxxxx.pso#PGSO +ps_other.bin 501 pixel ababdc6b3d751ab0 /data000.cpk/shader.dat/ps_fp_pbs00_bdewix.pso#PGSO +ps_other.bin 502 pixel 1bc9ea81701935a0 /data000.cpk/shader.dat/ps_fp_pbs00_bdewx.pso#PGSO +ps_other.bin 503 pixel 32558749e7bc6471 /data000.cpk/shader.dat/ps_fp_pbs00_bdexix.pso#PGSO +ps_other.bin 504 pixel 54fdf663c4c09128 /data000.cpk/shader.dat/ps_fp_pbs00_bdexx.pso#PGSO +ps_other.bin 505 pixel 545c8be2d0186fb1 /data000.cpk/shader.dat/ps_fp_pbs00_bdhwix.pso#PGSO +ps_other.bin 506 pixel 81d5847423e5c057 /data000.cpk/shader.dat/ps_fp_pbs00_bdhwx.pso#PGSO +ps_other.bin 507 pixel 712e18bd714c6efd /data000.cpk/shader.dat/ps_fp_pbs00_bdhxix.pso#PGSO +ps_other.bin 508 pixel 780dff89cce8dce8 /data000.cpk/shader.dat/ps_fp_pbs00_bdhxx.pso#PGSO +ps_other.bin 509 pixel 9b5f854316119b72 /data000.cpk/shader.dat/ps_fp_pbs00_bdxwix.pso#PGSO +ps_other.bin 510 pixel 096db26d29b185b7 /data000.cpk/shader.dat/ps_fp_pbs00_bdxwx.pso#PGSO +ps_other.bin 511 pixel d1f25f4b58df740c /data000.cpk/shader.dat/ps_fp_pbs00_bdxxix.pso#PGSO +ps_other.bin 512 pixel 87f4ea2936a0e90b /data000.cpk/shader.dat/ps_fp_pbs00_bdxxx.pso#PGSO +ps_other.bin 513 pixel 6d5cd83307c9b6f4 /data000.cpk/shader.dat/ps_fp_pbs00_bxewix.pso#PGSO +ps_other.bin 514 pixel e995023e49b43ae3 /data000.cpk/shader.dat/ps_fp_pbs00_bxewx.pso#PGSO +ps_other.bin 515 pixel bb31fbcc24d693af /data000.cpk/shader.dat/ps_fp_pbs00_bxexix.pso#PGSO +ps_other.bin 516 pixel 86f5825b1b55fb14 /data000.cpk/shader.dat/ps_fp_pbs00_bxexx.pso#PGSO +ps_other.bin 517 pixel 253896796c6c1d0c /data000.cpk/shader.dat/ps_fp_pbs00_bxhwix.pso#PGSO +ps_other.bin 518 pixel 156489f56146ead4 /data000.cpk/shader.dat/ps_fp_pbs00_bxhwx.pso#PGSO +ps_other.bin 519 pixel 8d8f22c0bf7ff34b /data000.cpk/shader.dat/ps_fp_pbs00_bxhxix.pso#PGSO +ps_other.bin 520 pixel 1651b03b48360813 /data000.cpk/shader.dat/ps_fp_pbs00_bxhxx.pso#PGSO +ps_other.bin 521 pixel 090b1be308884035 /data000.cpk/shader.dat/ps_fp_pbs00_bxxwix.pso#PGSO +ps_other.bin 522 pixel 545abf85c3172d37 /data000.cpk/shader.dat/ps_fp_pbs00_bxxwx.pso#PGSO +ps_other.bin 523 pixel ecc9f042ea1982fd /data000.cpk/shader.dat/ps_fp_pbs00_bxxxix.pso#PGSO +ps_other.bin 524 pixel 5bc10e8e62fdf92b /data000.cpk/shader.dat/ps_fp_pbs00_bxxxx.pso#PGSO +ps_other.bin 525 pixel 4708c715c69727c4 /data000.cpk/shader.dat/ps_fp_pbs00_xdewix.pso#PGSO +ps_other.bin 526 pixel 018560911b5db7f7 /data000.cpk/shader.dat/ps_fp_pbs00_xdewx.pso#PGSO +ps_other.bin 527 pixel 13ba1c4c9707f3e8 /data000.cpk/shader.dat/ps_fp_pbs00_xdexix.pso#PGSO +ps_other.bin 528 pixel e11144a5608ee48c /data000.cpk/shader.dat/ps_fp_pbs00_xdexx.pso#PGSO +ps_other.bin 529 pixel 6845415fe417440b /data000.cpk/shader.dat/ps_fp_pbs00_xdhwix.pso#PGSO +ps_other.bin 530 pixel 2dcc61dd56e79770 /data000.cpk/shader.dat/ps_fp_pbs00_xdhwx.pso#PGSO +ps_other.bin 531 pixel 07bede406a018f16 /data000.cpk/shader.dat/ps_fp_pbs00_xdhxix.pso#PGSO +ps_other.bin 532 pixel 319a38ed84b54f01 /data000.cpk/shader.dat/ps_fp_pbs00_xdhxx.pso#PGSO +ps_other.bin 533 pixel d86daada7f12ade1 /data000.cpk/shader.dat/ps_fp_pbs00_xdxwix.pso#PGSO +ps_other.bin 534 pixel e9557bff9c82567e /data000.cpk/shader.dat/ps_fp_pbs00_xdxwx.pso#PGSO +ps_other.bin 535 pixel 526e0c999bb356bd /data000.cpk/shader.dat/ps_fp_pbs00_xdxxix.pso#PGSO +ps_other.bin 536 pixel 36789b1df5079eb8 /data000.cpk/shader.dat/ps_fp_pbs00_xdxxx.pso#PGSO +ps_other.bin 537 pixel 116cf104454b4e9c /data000.cpk/shader.dat/ps_fp_pbs00_xxewix.pso#PGSO +ps_other.bin 538 pixel 112c5544be5e6439 /data000.cpk/shader.dat/ps_fp_pbs00_xxewx.pso#PGSO +ps_other.bin 539 pixel 3f57ffc7d4bc7876 /data000.cpk/shader.dat/ps_fp_pbs00_xxexix.pso#PGSO +ps_other.bin 540 pixel 50cc690ca8b3e989 /data000.cpk/shader.dat/ps_fp_pbs00_xxexx.pso#PGSO +ps_other.bin 541 pixel 54742e1407bd80d4 /data000.cpk/shader.dat/ps_fp_pbs00_xxhwix.pso#PGSO +ps_other.bin 542 pixel 1f4c9fb58ebb69cb /data000.cpk/shader.dat/ps_fp_pbs00_xxhwx.pso#PGSO +ps_other.bin 543 pixel 16a15f943f815639 /data000.cpk/shader.dat/ps_fp_pbs00_xxhxix.pso#PGSO +ps_other.bin 544 pixel d4ea9f0584660c7f /data000.cpk/shader.dat/ps_fp_pbs00_xxhxx.pso#PGSO +ps_other.bin 545 pixel 2f0eb48d1e1fb080 /data000.cpk/shader.dat/ps_fp_pbs00_xxxwix.pso#PGSO +ps_other.bin 546 pixel 23f80d2f2f05c026 /data000.cpk/shader.dat/ps_fp_pbs00_xxxwx.pso#PGSO +ps_other.bin 547 pixel 60721fcd51d917e2 /data000.cpk/shader.dat/ps_fp_pbs00_xxxxix.pso#PGSO +ps_other.bin 548 pixel 176547245fdff6b1 /data000.cpk/shader.dat/ps_fp_pbs00_xxxxx.pso#PGSO +ps_other.bin 549 pixel a592cde3d913a598 /data000.cpk/shader.dat/ps_fp_pbs10_xdewsix.pso#PGSO +ps_other.bin 550 pixel d7fb29006930e50d /data000.cpk/shader.dat/ps_fp_pbs10_xdewx.pso#PGSO +ps_other.bin 551 pixel 13ed35d4012e65f3 /data000.cpk/shader.dat/ps_fp_pbs10_xdewxix.pso#PGSO +ps_other.bin 552 pixel 1eac6ab114e572c8 /data000.cpk/shader.dat/ps_fp_pbs10_xdewxxx.pso#PGSO +ps_other.bin 553 pixel 30c8e018449a7cb0 /data000.cpk/shader.dat/ps_fp_pbs10_xdexsix.pso#PGSO +ps_other.bin 554 pixel 6ddae9a52c2c55f2 /data000.cpk/shader.dat/ps_fp_pbs10_xdexx.pso#PGSO +ps_other.bin 555 pixel a8ce45697013a3c5 /data000.cpk/shader.dat/ps_fp_pbs10_xdexxix.pso#PGSO +ps_other.bin 556 pixel e5f43c0b123b3249 /data000.cpk/shader.dat/ps_fp_pbs10_xdexxxx.pso#PGSO +ps_other.bin 557 pixel 4bb7cc9fcf499bd1 /data000.cpk/shader.dat/ps_fp_pbs10_xdxwsix.pso#PGSO +ps_other.bin 558 pixel f8fcfde983de68d4 /data000.cpk/shader.dat/ps_fp_pbs10_xdxwx.pso#PGSO +ps_other.bin 559 pixel d748305e611b7ad6 /data000.cpk/shader.dat/ps_fp_pbs10_xdxwxix.pso#PGSO +ps_other.bin 560 pixel 2dd81dea4c20a423 /data000.cpk/shader.dat/ps_fp_pbs10_xdxwxxx.pso#PGSO +ps_other.bin 561 pixel 4a679ea1a87a1e45 /data000.cpk/shader.dat/ps_fp_pbs10_xdxxsix.pso#PGSO +ps_other.bin 562 pixel a4b56915cb9e9c79 /data000.cpk/shader.dat/ps_fp_pbs10_xdxxx.pso#PGSO +ps_other.bin 563 pixel e77034a97f3b8457 /data000.cpk/shader.dat/ps_fp_pbs10_xdxxxix.pso#PGSO +ps_other.bin 564 pixel dc970228d132d855 /data000.cpk/shader.dat/ps_fp_pbs10_xdxxxxx.pso#PGSO +ps_other.bin 565 pixel de0e183df55e7060 /data000.cpk/shader.dat/ps_fp_pbs10_xxewsix.pso#PGSO +ps_other.bin 566 pixel 57fb720c8b6428f7 /data000.cpk/shader.dat/ps_fp_pbs10_xxewx.pso#PGSO +ps_other.bin 567 pixel dd7c26bed7270ffb /data000.cpk/shader.dat/ps_fp_pbs10_xxewxix.pso#PGSO +ps_other.bin 568 pixel 2213bb47b1935dd8 /data000.cpk/shader.dat/ps_fp_pbs10_xxewxxx.pso#PGSO +ps_other.bin 569 pixel d26ef78bbb6aefa8 /data000.cpk/shader.dat/ps_fp_pbs10_xxexsix.pso#PGSO +ps_other.bin 570 pixel 4cce8e8327123350 /data000.cpk/shader.dat/ps_fp_pbs10_xxexx.pso#PGSO +ps_other.bin 571 pixel 113981de4d038fe3 /data000.cpk/shader.dat/ps_fp_pbs10_xxexxix.pso#PGSO +ps_other.bin 572 pixel 57a908753fb7f59e /data000.cpk/shader.dat/ps_fp_pbs10_xxexxxx.pso#PGSO +ps_other.bin 573 pixel 6a9aac57b02b89cb /data000.cpk/shader.dat/ps_fp_pbs10_xxxwsix.pso#PGSO +ps_other.bin 574 pixel 64491f85913891eb /data000.cpk/shader.dat/ps_fp_pbs10_xxxwx.pso#PGSO +ps_other.bin 575 pixel 3c6ae8ff4c14237b /data000.cpk/shader.dat/ps_fp_pbs10_xxxwxix.pso#PGSO +ps_other.bin 576 pixel 3f66c82fc30cac8c /data000.cpk/shader.dat/ps_fp_pbs10_xxxwxxx.pso#PGSO +ps_other.bin 577 pixel 5a5085038cb2ab04 /data000.cpk/shader.dat/ps_fp_pbs10_xxxxsix.pso#PGSO +ps_other.bin 578 pixel e69aa10595df099a /data000.cpk/shader.dat/ps_fp_pbs10_xxxxx.pso#PGSO +ps_other.bin 579 pixel 6f8245e187b63911 /data000.cpk/shader.dat/ps_fp_pbs10_xxxxxix.pso#PGSO +ps_other.bin 580 pixel fe8d76ddf7d6a1c9 /data000.cpk/shader.dat/ps_fp_pbs10_xxxxxxx.pso#PGSO +ps_other.bin 581 pixel aa67a66acd930ac3 /data000.cpk/shader.dat/ps_fp_pbs11_xdewx.pso#PGSO +ps_other.bin 582 pixel 14a47dbe08bd3496 /data000.cpk/shader.dat/ps_fp_pbs11_xdexx.pso#PGSO +ps_other.bin 583 pixel ed9dba18b1348ffa /data000.cpk/shader.dat/ps_fp_pbs11_xdxwx.pso#PGSO +ps_other.bin 584 pixel 656988371d06b37e /data000.cpk/shader.dat/ps_fp_pbs11_xdxxx.pso#PGSO +ps_other.bin 585 pixel 2a398b2259a727f9 /data000.cpk/shader.dat/ps_fp_pbs11_xxewx.pso#PGSO +ps_other.bin 586 pixel 3f557bb94a6f96fb /data000.cpk/shader.dat/ps_fp_pbs11_xxexx.pso#PGSO +ps_other.bin 587 pixel a0a63f90c8fd16ef /data000.cpk/shader.dat/ps_fp_pbs11_xxxwx.pso#PGSO +ps_other.bin 588 pixel 6dd750ba4ea7411e /data000.cpk/shader.dat/ps_fp_pbs11_xxxxx.pso#PGSO +ps_other.bin 589 pixel 5aebd551e63383c9 /data000.cpk/shader.dat/ps_fp_pbs20_bdhwx.pso#PGSO +ps_other.bin 590 pixel 2726846897b19fd6 /data000.cpk/shader.dat/ps_fp_pbs20_bdhxx.pso#PGSO +ps_other.bin 591 pixel 99520cb4d5479af4 /data000.cpk/shader.dat/ps_fp_pbs20_bdxwx.pso#PGSO +ps_other.bin 592 pixel 0239a41f0ab2b42d /data000.cpk/shader.dat/ps_fp_pbs20_bdxxx.pso#PGSO +ps_other.bin 593 pixel 2364f96c5762ebeb /data000.cpk/shader.dat/ps_fp_pbs20_bxhwx.pso#PGSO +ps_other.bin 594 pixel b0fc8f10096867da /data000.cpk/shader.dat/ps_fp_pbs20_bxhxx.pso#PGSO +ps_other.bin 595 pixel 97033f7925975482 /data000.cpk/shader.dat/ps_fp_pbs20_bxxwx.pso#PGSO +ps_other.bin 596 pixel cc1395ceb880d8a9 /data000.cpk/shader.dat/ps_fp_pbs20_bxxxx.pso#PGSO +ps_other.bin 597 pixel 0b3eee75d42033e4 /data000.cpk/shader.dat/ps_fp_pbs20_xdhwx.pso#PGSO +ps_other.bin 598 pixel 686b038872de7117 /data000.cpk/shader.dat/ps_fp_pbs20_xdhxx.pso#PGSO +ps_other.bin 599 pixel f11836958c328103 /data000.cpk/shader.dat/ps_fp_pbs20_xdxwx.pso#PGSO +ps_other.bin 600 pixel 5ba44961c6822442 /data000.cpk/shader.dat/ps_fp_pbs20_xdxxx.pso#PGSO +ps_other.bin 601 pixel 1306ee9059c31700 /data000.cpk/shader.dat/ps_fp_pbs20_xxhwx.pso#PGSO +ps_other.bin 602 pixel c7b7ecb174350c45 /data000.cpk/shader.dat/ps_fp_pbs20_xxhxx.pso#PGSO +ps_other.bin 603 pixel 36cb561ddde50069 /data000.cpk/shader.dat/ps_fp_pbs20_xxxwx.pso#PGSO +ps_other.bin 604 pixel cffd3d1c919b1f99 /data000.cpk/shader.dat/ps_fp_pbs20_xxxxx.pso#PGSO +ps_other.bin 605 pixel d076f953d9b4fd5b /data000.cpk/shader.dat/ps_fp_plant_bdewx.pso#PGSO +ps_other.bin 606 pixel 94c58cbb14192870 /data000.cpk/shader.dat/ps_fp_plant_bdexx.pso#PGSO +ps_other.bin 607 pixel 4a3daa9092bbda07 /data000.cpk/shader.dat/ps_fp_plant_bdxwx.pso#PGSO +ps_other.bin 608 pixel a0879771640c650d /data000.cpk/shader.dat/ps_fp_plant_bdxxx.pso#PGSO +ps_other.bin 609 pixel d05065f97847eefc /data000.cpk/shader.dat/ps_fp_plant_bxewx.pso#PGSO +ps_other.bin 610 pixel f65f142d64b18ca4 /data000.cpk/shader.dat/ps_fp_plant_bxexx.pso#PGSO +ps_other.bin 611 pixel 13b1455069452eed /data000.cpk/shader.dat/ps_fp_plant_bxxwx.pso#PGSO +ps_other.bin 612 pixel af9d87996e792d82 /data000.cpk/shader.dat/ps_fp_plant_bxxxx.pso#PGSO +ps_other.bin 613 pixel 748ccd4d8fa6066b /data000.cpk/shader.dat/ps_fp_plant_xdewx.pso#PGSO +ps_other.bin 614 pixel 2cd6f61cd71b79b9 /data000.cpk/shader.dat/ps_fp_plant_xdexx.pso#PGSO +ps_other.bin 615 pixel daae087d0ea47728 /data000.cpk/shader.dat/ps_fp_plant_xdxwx.pso#PGSO +ps_other.bin 616 pixel a8c8d6526f800ffe /data000.cpk/shader.dat/ps_fp_plant_xdxxx.pso#PGSO +ps_other.bin 617 pixel 5f6566c7fde7a94b /data000.cpk/shader.dat/ps_fp_plant_xxewx.pso#PGSO +ps_other.bin 618 pixel bfaac1a9b01e982e /data000.cpk/shader.dat/ps_fp_plant_xxexx.pso#PGSO +ps_other.bin 619 pixel 3f65124fb692cdb1 /data000.cpk/shader.dat/ps_fp_plant_xxxwx.pso#PGSO +ps_other.bin 620 pixel e05d79b013f72e99 /data000.cpk/shader.dat/ps_fp_plant_xxxxx.pso#PGSO +ps_other.bin 621 pixel ac6f42962bfb3318 /data000.cpk/shader.dat/ps_fp_skin01_xdxxx.pso#PGSO +ps_other.bin 622 pixel 78c88bc2dc969e9b /data000.cpk/shader.dat/ps_fp_skin01_xxxxx.pso#PGSO +ps_other.bin 623 pixel 63572e0d4908d788 /data000.cpk/shader.dat/ps_fp_skin01sssss_xxxxx.pso#PGSO +ps_other.bin 624 pixel e645a7285d7245c8 /data000.cpk/shader.dat/ps_fp_skin10_xdxxx.pso#PGSO +ps_other.bin 625 pixel a7b1c5fc32326f28 /data000.cpk/shader.dat/ps_fp_skin10_xxxxx.pso#PGSO +ps_other.bin 626 pixel 96361637483bda58 /data000.cpk/shader.dat/ps_fp_skin10sssss_xxxxx.pso#PGSO +ps_other.bin 627 pixel c044ed78eb2862b6 /data000.cpk/shader.dat/ps_fp_skin11_xdxxx.pso#PGSO +ps_other.bin 628 pixel 0dc1c061053c78e5 /data000.cpk/shader.dat/ps_fp_skin11_xxxxx.pso#PGSO +ps_other.bin 629 pixel c58f9e38001f0dd0 /data000.cpk/shader.dat/ps_fp_skin11sssss_xxxxx.pso#PGSO +ps_other.bin 630 pixel acf1a0bde58b727b /data000.cpk/shader.dat/ps_fp_skin_xdhwx.pso#PGSO +ps_other.bin 631 pixel 9c1f9695e0cfdaba /data000.cpk/shader.dat/ps_fp_skin_xdhxx.pso#PGSO +ps_other.bin 632 pixel f1805ff150c560c2 /data000.cpk/shader.dat/ps_fp_skin_xdxwx.pso#PGSO +ps_other.bin 633 pixel 9f103981b2b68c00 /data000.cpk/shader.dat/ps_fp_skin_xdxxx.pso#PGSO +ps_other.bin 634 pixel eb04b6d506298d30 /data000.cpk/shader.dat/ps_fp_skin_xxhwx.pso#PGSO +ps_other.bin 635 pixel cb1b426f1cba596b /data000.cpk/shader.dat/ps_fp_skin_xxhxx.pso#PGSO +ps_other.bin 636 pixel 6260ff95ff3cc483 /data000.cpk/shader.dat/ps_fp_skin_xxxwx.pso#PGSO +ps_other.bin 637 pixel 31d3215892261509 /data000.cpk/shader.dat/ps_fp_skin_xxxxx.pso#PGSO +ps_other.bin 638 pixel cbc4ba88b8cda77a /data000.cpk/shader.dat/ps_fp_skinsssss_xxewx.pso#PGSO +ps_other.bin 639 pixel 4b89d7798c7db77e /data000.cpk/shader.dat/ps_fp_skinsssss_xxexx.pso#PGSO +ps_other.bin 640 pixel bced1235590ef96c /data000.cpk/shader.dat/ps_fp_water00_xxxxx.pso#PGSO +ps_other.bin 641 pixel f84a726721212ced /data000.cpk/shader.dat/ps_fp_water01_xxxxx.pso#PGSO +ps_other.bin 642 pixel 480167c6e07ebabb /data000.cpk/shader.dat/ps_fp_wtr00_xxxxx.pso#PGSO +ps_other.bin 643 pixel bcda1b60040bf224 /data000.cpk/shader.dat/ps_fp_wtr01_xxxxx.pso#PGSO +ps_other.bin 644 pixel a02b5e8b8c0bb198 /data000.cpk/shader.dat/ps_fp_wtr02_xdxxx.pso#PGSO +ps_other.bin 645 pixel 915f419ee6ec9147 /data000.cpk/shader.dat/ps_fp_wtr02_xxxxx.pso#PGSO +ps_other.bin 646 pixel 80d7926f57758276 /data000.cpk/shader.dat/ps_fp_wtr10_xxxxx.pso#PGSO +ps_other.bin 647 pixel f26464e88448980e /data000.cpk/shader.dat/saoblur.pso#PGSO +ps_other.bin 648 pixel 57e3f79f1670e618 /data000.cpk/shader.dat/saoblur2x.pso#PGSO +ps_other.bin 649 pixel 0f2b54db88558b2f /data000.cpk/shader.dat/saocopyz.pso#PGSO +ps_other.bin 650 pixel 6378d7ab137d8cd1 /data000.cpk/shader.dat/saocreatehizmip.pso#PGSO +ps_other.bin 651 pixel f6c856716c355270 /data000.cpk/shader.dat/saomain.pso#PGSO +ps_other.bin 652 pixel 9aa9114e0304b5f7 /data000.cpk/shader.dat/saoupsampling.pso#PGSO +ps_other.bin 653 pixel 7564b55d5e84edbc /data000.cpk/shader.dat/shadowcast_ps_oxxxx.pso#PGSO +vs_other.bin 275 vertex f8783d3bbec69c31 /data000.cpk/shader.dat/shadowcast_vs_oooxo.vso#PGSO +vs_other.bin 276 vertex 8d6ec6ca914d4aca /data000.cpk/shader.dat/shadowcast_vs_oooxx.vso#PGSO +vs_other.bin 277 vertex 558515d7412057c3 /data000.cpk/shader.dat/shadowcast_vs_ooxxo.vso#PGSO +vs_other.bin 278 vertex ec2e6a4bea800289 /data000.cpk/shader.dat/shadowcast_vs_ooxxx.vso#PGSO +vs_other.bin 279 vertex 693ed4a0cce8633b /data000.cpk/shader.dat/shadowcast_vs_oxooo.vso#PGSO +vs_other.bin 280 vertex 35bdf55d0b9c2b59 /data000.cpk/shader.dat/shadowcast_vs_oxoox.vso#PGSO +vs_other.bin 281 vertex 570bb14e98ed8be0 /data000.cpk/shader.dat/shadowcast_vs_oxoxo.vso#PGSO +vs_other.bin 282 vertex f71613f753032bdc /data000.cpk/shader.dat/shadowcast_vs_oxoxx.vso#PGSO +vs_other.bin 283 vertex bac25df2344c12b6 /data000.cpk/shader.dat/shadowcast_vs_oxxoo.vso#PGSO +vs_other.bin 284 vertex 91469cbd164aca18 /data000.cpk/shader.dat/shadowcast_vs_oxxox.vso#PGSO +vs_other.bin 285 vertex 89e34eeb688730ef /data000.cpk/shader.dat/shadowcast_vs_oxxxo.vso#PGSO +vs_other.bin 286 vertex e3b4b7cc9fe7f581 /data000.cpk/shader.dat/shadowcast_vs_oxxxx.vso#PGSO +vs_other.bin 287 vertex 67ddcaa39b8473c5 /data000.cpk/shader.dat/shadowcast_vs_xooxo.vso#PGSO +vs_other.bin 288 vertex dd7f5569ca37bd0e /data000.cpk/shader.dat/shadowcast_vs_xooxx.vso#PGSO +vs_other.bin 289 vertex 663373274dd577f3 /data000.cpk/shader.dat/shadowcast_vs_xoxxo.vso#PGSO +vs_other.bin 290 vertex 23522240236d2b54 /data000.cpk/shader.dat/shadowcast_vs_xoxxx.vso#PGSO +vs_other.bin 291 vertex 7b77d30b615a7da8 /data000.cpk/shader.dat/shadowcast_vs_xxooo.vso#PGSO +vs_other.bin 292 vertex 9e44b177fc95bcdf /data000.cpk/shader.dat/shadowcast_vs_xxoox.vso#PGSO +vs_other.bin 293 vertex ad6702c9bda26e00 /data000.cpk/shader.dat/shadowcast_vs_xxoxo.vso#PGSO +vs_other.bin 294 vertex 9917eb8c593b3da7 /data000.cpk/shader.dat/shadowcast_vs_xxoxx.vso#PGSO +vs_other.bin 295 vertex d46edf962074a484 /data000.cpk/shader.dat/shadowcast_vs_xxxoo.vso#PGSO +vs_other.bin 296 vertex 97cf973d9f71d31a /data000.cpk/shader.dat/shadowcast_vs_xxxox.vso#PGSO +vs_other.bin 297 vertex 50f2180636058b9d /data000.cpk/shader.dat/shadowcast_vs_xxxxo.vso#PGSO +vs_other.bin 298 vertex 18a435d220de55ff /data000.cpk/shader.dat/shadowcast_vs_xxxxx.vso#PGSO +ps_other.bin 654 pixel d5829da27449a983 /data000.cpk/shader.dat/shadowreceiver_sign.pso#PGSO +ps_other.bin 655 pixel d3fd0315266772ff /data000.cpk/shader.dat/shadowreceiverspot.pso#PGSO +ps_other.bin 656 pixel 16a0116818840bd4 /data000.cpk/shader.dat/shadowreceiverspot2.pso#PGSO +ps_other.bin 657 pixel 1f5de2887f1a3d05 /data000.cpk/shader.dat/shadowreceiverspot3.pso#PGSO +ps_other.bin 658 pixel 0f136359270d69d4 /data000.cpk/shader.dat/shadowreceiverspot_sign.pso#PGSO +cs_other.bin 5 compute dd75cd3bcb3407bc /data000.cpk/shader.dat/tilebaseddeferredlight.cso#PGSO +cs_other.bin 6 compute e7a8b3a1f5573ed5 /data000.cpk/shader.dat/tilebasedfowardplus.cso#PGSO +cs_other.bin 7 compute 77a0de8243f56f03 /data000.cpk/shader.dat/viewlightposcalc.cso#PGSO +ps_other.bin 659 pixel dc081ec452b429dd /data000.cpk/shader.dat/vledirectional.pso#PGSO +cs_other.bin 8 compute d3cd49deb376ac1f /data000.cpk/shader.dat/vlegaussianblurcomputeh.cso#PGSO +cs_other.bin 9 compute 80c196aa5760ce34 /data000.cpk/shader.dat/vlegaussianblurcomputev.cso#PGSO +ps_other.bin 660 pixel 12d206f05fd5a062 /data000.cpk/shader.dat/vlegaussianblurh.pso#PGSO +ps_other.bin 661 pixel 91a2bd080ba74ad9 /data000.cpk/shader.dat/vlegaussianblurv.pso#PGSO +ps_other.bin 662 pixel 96a6b55a2aa0fce6 /data000.cpk/shader.dat/vleparticletexture.pso#PGSO +ps_other.bin 663 pixel 5b2756a72f17f44f /data000.cpk/shader.dat/vlespotlight.pso#PGSO +ps_other.bin 664 pixel 6af0f76c45e8d868 /data000.cpk/shader.dat/vleupsampling.pso#PGSO +vs_other.bin 299 vertex a5fe1b142e455790 /data000.cpk/shader.dat/vs_cloth_sxxwx.vso#PGSO +vs_other.bin 300 vertex c0693ab8b19c70c9 /data000.cpk/shader.dat/vs_cloth_sxxxx.vso#PGSO +vs_other.bin 301 vertex 93f1b4ad7ef277a9 /data000.cpk/shader.dat/vs_cloth_xixwx.vso#PGSO +vs_other.bin 302 vertex fbb4cc245f84df08 /data000.cpk/shader.dat/vs_cloth_xixxx.vso#PGSO +vs_other.bin 303 vertex 008fbe3f0ef72297 /data000.cpk/shader.dat/vs_cloth_xxewx.vso#PGSO +vs_other.bin 304 vertex cd7bc819e2763806 /data000.cpk/shader.dat/vs_cloth_xxexx.vso#PGSO +vs_other.bin 305 vertex c6dd69f31fd331a7 /data000.cpk/shader.dat/vs_cloth_xxxwx.vso#PGSO +vs_other.bin 306 vertex 2684e72f470ead30 /data000.cpk/shader.dat/vs_cloth_xxxxx.vso#PGSO +vs_other.bin 307 vertex c57286ef1fde5711 /data000.cpk/shader.dat/vs_cns_sxxxx.vso#PGSO +vs_other.bin 308 vertex 6c9e7daf527cea9d /data000.cpk/shader.dat/vs_cns_xixxx.vso#PGSO +vs_other.bin 309 vertex 5c55eae177dace24 /data000.cpk/shader.dat/vs_cns_xxxxx.vso#PGSO +vs_other.bin 310 vertex 6f93dc566009c1a0 /data000.cpk/shader.dat/vs_eye_sxxxx.vso#PGSO +vs_other.bin 311 vertex 60efcbb6068d4311 /data000.cpk/shader.dat/vs_eye_xixxx.vso#PGSO +vs_other.bin 312 vertex 0d9a66edbbdc52dc /data000.cpk/shader.dat/vs_eye_xxexx.vso#PGSO +vs_other.bin 313 vertex 0b56a3660c83e994 /data000.cpk/shader.dat/vs_eye_xxxxx.vso#PGSO +vs_other.bin 314 vertex 4481bf793f39a968 /data000.cpk/shader.dat/vs_hair_sxxwx.vso#PGSO +vs_other.bin 315 vertex 15f99d6b2584dc48 /data000.cpk/shader.dat/vs_hair_sxxxx.vso#PGSO +vs_other.bin 316 vertex e3b63dda66e1cdf6 /data000.cpk/shader.dat/vs_hair_xixwx.vso#PGSO +vs_other.bin 317 vertex dee839d6734828da /data000.cpk/shader.dat/vs_hair_xixxx.vso#PGSO +vs_other.bin 318 vertex 4dd8e12bbc0ef039 /data000.cpk/shader.dat/vs_hair_xxewx.vso#PGSO +vs_other.bin 319 vertex 34be2668d5c14ce4 /data000.cpk/shader.dat/vs_hair_xxexx.vso#PGSO +vs_other.bin 320 vertex b67cfa491cce2186 /data000.cpk/shader.dat/vs_hair_xxxwx.vso#PGSO +vs_other.bin 321 vertex a45798e7e5405bce /data000.cpk/shader.dat/vs_hair_xxxxx.vso#PGSO +vs_other.bin 322 vertex 27bb7ba5acb49f2e /data000.cpk/shader.dat/vs_pbs10_sxexx.vso#PGSO +vs_other.bin 323 vertex 66260b27255ca9db /data000.cpk/shader.dat/vs_pbs10_sxxxx.vso#PGSO +vs_other.bin 324 vertex b51857c9e702891e /data000.cpk/shader.dat/vs_pbs10_xixxx.vso#PGSO +vs_other.bin 325 vertex 2fa0719caa180198 /data000.cpk/shader.dat/vs_pbs10_xxbxx.vso#PGSO +vs_other.bin 326 vertex e2faa4237bfc09c7 /data000.cpk/shader.dat/vs_pbs10_xxexx.vso#PGSO +vs_other.bin 327 vertex 3ee3760b773ea1d4 /data000.cpk/shader.dat/vs_pbs10_xxxxx.vso#PGSO +vs_other.bin 328 vertex d20896dc8e3ba12f /data000.cpk/shader.dat/vs_pbs_sxexx.vso#PGSO +vs_other.bin 329 vertex 66e3950216a635cf /data000.cpk/shader.dat/vs_pbs_sxxwx.vso#PGSO +vs_other.bin 330 vertex 8d9d5331523f7131 /data000.cpk/shader.dat/vs_pbs_sxxxx.vso#PGSO +vs_other.bin 331 vertex ee1d03f1dd7bdd27 /data000.cpk/shader.dat/vs_pbs_xixwx.vso#PGSO +vs_other.bin 332 vertex a6722e943cd49d24 /data000.cpk/shader.dat/vs_pbs_xixxx.vso#PGSO +vs_other.bin 333 vertex 76fd7922ed50d4f6 /data000.cpk/shader.dat/vs_pbs_xxbxx.vso#PGSO +vs_other.bin 334 vertex 98dd8d75472885e6 /data000.cpk/shader.dat/vs_pbs_xxewx.vso#PGSO +vs_other.bin 335 vertex 159b3c8dcf639c37 /data000.cpk/shader.dat/vs_pbs_xxexx.vso#PGSO +vs_other.bin 336 vertex f232a7250ab2d860 /data000.cpk/shader.dat/vs_pbs_xxxwx.vso#PGSO +vs_other.bin 337 vertex 8971677029c75df0 /data000.cpk/shader.dat/vs_pbs_xxxxx.vso#PGSO +vs_other.bin 338 vertex eba8a2e7dea8ee96 /data000.cpk/shader.dat/vs_plant01_sxxwx.vso#PGSO +vs_other.bin 339 vertex 33abe98dd91667f7 /data000.cpk/shader.dat/vs_plant01_sxxxx.vso#PGSO +vs_other.bin 340 vertex d5bd18c5953449ee /data000.cpk/shader.dat/vs_plant01_xixwx.vso#PGSO +vs_other.bin 341 vertex 3120a2170b7f30b7 /data000.cpk/shader.dat/vs_plant01_xixxx.vso#PGSO +vs_other.bin 342 vertex 9dc6d7c6d52db5c6 /data000.cpk/shader.dat/vs_plant01_xxewx.vso#PGSO +vs_other.bin 343 vertex 5d589a8c4f58dfeb /data000.cpk/shader.dat/vs_plant01_xxexx.vso#PGSO +vs_other.bin 344 vertex 049dc69f46e23a20 /data000.cpk/shader.dat/vs_plant01_xxxwx.vso#PGSO +vs_other.bin 345 vertex ed27fd9b8d01b781 /data000.cpk/shader.dat/vs_plant01_xxxxx.vso#PGSO +vs_other.bin 346 vertex 420342ab9fc06e85 /data000.cpk/shader.dat/vs_plant_sxxwx.vso#PGSO +vs_other.bin 347 vertex 79db7c61c0eea8aa /data000.cpk/shader.dat/vs_plant_sxxxx.vso#PGSO +vs_other.bin 348 vertex ed9240b3cdb51327 /data000.cpk/shader.dat/vs_plant_xixwx.vso#PGSO +vs_other.bin 349 vertex 6b5c6bbf33603eda /data000.cpk/shader.dat/vs_plant_xixxx.vso#PGSO +vs_other.bin 350 vertex 09a3cf31af3d29b4 /data000.cpk/shader.dat/vs_plant_xxewx.vso#PGSO +vs_other.bin 351 vertex 1df5ab32043dd29d /data000.cpk/shader.dat/vs_plant_xxexx.vso#PGSO +vs_other.bin 352 vertex 8ec452184db7c614 /data000.cpk/shader.dat/vs_plant_xxxwx.vso#PGSO +vs_other.bin 353 vertex 2e4f678dbc818b58 /data000.cpk/shader.dat/vs_plant_xxxxx.vso#PGSO +vs_other.bin 354 vertex 759e816ddf716ada /data000.cpk/shader.dat/vs_skin10_sxxwx.vso#PGSO +vs_other.bin 355 vertex 8dd406037cbad7d6 /data000.cpk/shader.dat/vs_skin10_sxxxx.vso#PGSO +vs_other.bin 356 vertex eae85c777336bce3 /data000.cpk/shader.dat/vs_skin10_xxxwx.vso#PGSO +vs_other.bin 357 vertex a6570dda8e02225c /data000.cpk/shader.dat/vs_skin10_xxxxx.vso#PGSO +vs_other.bin 358 vertex 4ea5793c080d8942 /data000.cpk/shader.dat/vs_skin_sxxxx.vso#PGSO +vs_other.bin 359 vertex 8916a280e66a48fc /data000.cpk/shader.dat/vs_skin_xixxx.vso#PGSO +vs_other.bin 360 vertex e5a38229a95b1005 /data000.cpk/shader.dat/vs_skin_xxexx.vso#PGSO +vs_other.bin 361 vertex 74e5d663cb14a321 /data000.cpk/shader.dat/vs_skin_xxxxx.vso#PGSO +vs_other.bin 362 vertex 9120f4bd1b68706c /data000.cpk/shader.dat/vs_tv3w.vso#PGSO +vs_other.bin 363 vertex 99be8b2d637faa41 /data000.cpk/shader.dat/vs_wtr01_sxxxx.vso#PGSO +vs_other.bin 364 vertex 4af18498a895f57b /data000.cpk/shader.dat/vs_wtr01_xxxxx.vso#PGSO +vs_other.bin 365 vertex b36ac8dfd38e7351 /data000.cpk/shader.dat/vs_wtr02_sxxxx.vso#PGSO +vs_other.bin 366 vertex 317b2aa94bc181e2 /data000.cpk/shader.dat/vs_wtr02_xxxxx.vso#PGSO +ps_other.bin 665 pixel 42a4a5f25bdd1258 /data000.cpk/shader.dat/zmap_ps_ooxox.pso#PGSO +ps_other.bin 666 pixel 3ff064bdad4f2152 /data000.cpk/shader.dat/zmap_ps_ooxxx.pso#PGSO +ps_other.bin 667 pixel 7b1100e8e9c11eca /data000.cpk/shader.dat/zmap_ps_oxxxx.pso#PGSO +ps_other.bin 668 pixel 1bf0e97625aa247a /data000.cpk/shader.dat/zmap_ps_xoxox.pso#PGSO +ps_other.bin 669 pixel ad605bb71408b791 /data000.cpk/shader.dat/zmap_ps_xoxxx.pso#PGSO +ps_other.bin 670 pixel 49bd7a780255b6e9 /data000.cpk/shader.dat/zmap_ps_xxxxx.pso#PGSO +vs_other.bin 367 vertex 6738fc27e8a94cf2 /data000.cpk/shader.dat/zmap_vs_oooxo.vso#PGSO +vs_other.bin 368 vertex 26f4501e9a33b938 /data000.cpk/shader.dat/zmap_vs_oooxx.vso#PGSO +vs_other.bin 369 vertex 4c6f1a3f92b40935 /data000.cpk/shader.dat/zmap_vs_ooxxo.vso#PGSO +vs_other.bin 370 vertex 317bc48071a2dad7 /data000.cpk/shader.dat/zmap_vs_ooxxx.vso#PGSO +vs_other.bin 371 vertex f3d7b5da7e812a20 /data000.cpk/shader.dat/zmap_vs_oxooo.vso#PGSO +vs_other.bin 372 vertex 56ad169bb86186c9 /data000.cpk/shader.dat/zmap_vs_oxoox.vso#PGSO +vs_other.bin 373 vertex 690c747bec63bdbf /data000.cpk/shader.dat/zmap_vs_oxoxo.vso#PGSO +vs_other.bin 374 vertex db83bdf58f818682 /data000.cpk/shader.dat/zmap_vs_oxoxx.vso#PGSO +vs_other.bin 375 vertex 0110d92b5ae3921d /data000.cpk/shader.dat/zmap_vs_oxxoo.vso#PGSO +vs_other.bin 376 vertex 24ea2d84b2a209ee /data000.cpk/shader.dat/zmap_vs_oxxox.vso#PGSO +vs_other.bin 377 vertex 1742b4f98bd0989b /data000.cpk/shader.dat/zmap_vs_oxxxo.vso#PGSO +vs_other.bin 378 vertex 66db13312407223e /data000.cpk/shader.dat/zmap_vs_oxxxx.vso#PGSO +vs_other.bin 379 vertex f98fd91e702894bf /data000.cpk/shader.dat/zmap_vs_xooxo.vso#PGSO +vs_other.bin 380 vertex 91fbe24d458ab15f /data000.cpk/shader.dat/zmap_vs_xooxx.vso#PGSO +vs_other.bin 381 vertex ae362216b7a3264b /data000.cpk/shader.dat/zmap_vs_xoxxo.vso#PGSO +vs_other.bin 382 vertex eaf2df477c4919a3 /data000.cpk/shader.dat/zmap_vs_xoxxx.vso#PGSO +vs_other.bin 383 vertex c7758a32b5a4077e /data000.cpk/shader.dat/zmap_vs_xxooo.vso#PGSO +vs_other.bin 384 vertex d302a65eee05990c /data000.cpk/shader.dat/zmap_vs_xxoox.vso#PGSO +vs_other.bin 385 vertex 28fab3ac6021643c /data000.cpk/shader.dat/zmap_vs_xxoxo.vso#PGSO +vs_other.bin 386 vertex f85271204f42be88 /data000.cpk/shader.dat/zmap_vs_xxoxx.vso#PGSO +vs_other.bin 387 vertex 166ed938a94ad3ab /data000.cpk/shader.dat/zmap_vs_xxxoo.vso#PGSO +vs_other.bin 388 vertex 1b3ae40f334887a5 /data000.cpk/shader.dat/zmap_vs_xxxox.vso#PGSO +vs_other.bin 389 vertex 9e5bb361ded7fec1 /data000.cpk/shader.dat/zmap_vs_xxxxo.vso#PGSO +vs_other.bin 390 vertex fbcd81e58fa6bf78 /data000.cpk/shader.dat/zmap_vs_xxxxx.vso#PGSO +ps_other.bin 671 pixel b292f90eb19deda4 /data000.cpk/shader2.dat/FilterShaderCopyTexExpansion.pso#PGSO +cs_other.bin 10 compute d481918e7ee673c6 /data000.cpk/shader2.dat/cleartexturecompute32x30.cso#PGSO +ps_other.bin 672 pixel 869fc2472b4ea013 /data000.cpk/shader2.dat/filtershadercopytex.pso#PGSO +vs_other.bin 391 vertex f2fd6cfd0ff14a18 /data000.cpk/shader2.dat/filtershadercopytex.vso#PGSO +ps_other.bin 673 pixel b2bcaeab2f50e6f3 /data000.cpk/shader2.dat/filtershadercopytexDynRes.pso#PGSO +ps_other.bin 674 pixel 0c40d6c573abc9d5 /data000.cpk/shader2.dat/filtershadercopytexalp.pso#PGSO +ps_other.bin 675 pixel 7855550732b71e48 /data000.cpk/shader2.dat/filtershadercopytexsrgb.pso#PGSO +ps_other.bin 676 pixel 7b731978cbff6440 /data000.cpk/shader2.dat/filtershadergather.pso#PGSO +ps_other.bin 677 pixel b41a4a9d6d4f999e /data000.cpk/shader2.dat/filtershadergathernoise.pso#PGSO +ps_other.bin 678 pixel b41adaf519bed4dc /data000.cpk/shader2.dat/filtershadertonemap.pso#PGSO +ps_other.bin 679 pixel f34539d0f8061763 /data000.cpk/shader2.dat/fontdistancefield.pso#PGSO +ps_other.bin 680 pixel 05daf17a1d8bc556 /data000.cpk/shader2.dat/fontrender.pso#PGSO +vs_other.bin 392 vertex 85676cd8b3df3c91 /data000.cpk/shader2.dat/fontrender.vso#PGSO +ps_other.bin 681 pixel 8ce00f604928f220 /data000.cpk/shader2.dat/hwclearcolor.pso#PGSO +ps_other.bin 682 pixel f7dfe9e15839daa3 /data000.cpk/shader2.dat/hwfillcolor.pso#PGSO +vs_other.bin 393 vertex 5a5c9133d0f16649 /data000.cpk/shader2.dat/hwfillcolor.vso#PGSO +ps_other.bin 683 pixel 44736550b9c893ad /data000.cpk/shader2.dat/hwresolve.pso#PGSO +vs_other.bin 394 vertex 56fe21797160696d /data000.cpk/shader2.dat/hwresolve.vso#PGSO +vs_other.bin 395 vertex 8582074f224ca0b8 /data000.cpk/shader2.dat/hwshaderpf.vso#PGSO +ps_other.bin 684 pixel 50cfa5f043d1df6d /data000.cpk/shader2.dat/hwshaderpft.pso#PGSO +vs_other.bin 396 vertex 7d4a2886de306898 /data000.cpk/shader2.dat/hwshaderpft.vso#PGSO +ps_other.bin 685 pixel 9f08a58fac38c604 /data000.cpk/shader2.dat/hwshaderpfta8.pso#PGSO +ps_other.bin 686 pixel 62026f624061e259 /data000.cpk/shader2.dat/hwshaderpftyuv.pso#PGSO +vs_other.bin 397 vertex 46e8cd0de7414e7f /data000.cpk/shader2.dat/hwshaderpftyuv.vso#PGSO +ps_other.bin 687 pixel ddc154a4c394067e /data000.cpk/shader2.dat/hwshaderpftyuva.pso#PGSO +ps_other.bin 688 pixel f6dc3677c223881f /data000.cpk/shader2.dat/hwshaderpfv.pso#PGSO +vs_other.bin 398 vertex ecfd669875be7073 /data000.cpk/shader2.dat/hwshaderpfv.vso#PGSO +vs_other.bin 399 vertex 8185a60f85543d50 /data000.cpk/shader2.dat/hwshaderpg.vso#PGSO +ps_other.bin 689 pixel c0ed2509be567cef /data000.cpk/shader2.dat/uibaseshader.pso#PGSO +vs_other.bin 400 vertex 167b8b8aa79b4262 /data000.cpk/shader2.dat/uibaseshader.vso#PGSO +ps_other.bin 690 pixel 38576bae7718d067 /data000.cpk/shader2.dat/uibaseshader_m_1111_disprate_0000_gradation_0000.pso#PGSO +ps_other.bin 691 pixel 9e275b948823ffb2 /data000.cpk/shader2.dat/uibaseshader_m_1111_disprate_1000_gradation_0000.pso#PGSO +ps_other.bin 692 pixel 9a2be07bdef5ad90 /data000.cpk/shader2.dat/uibaseshader_m_1111_disprate_1100_gradation_0000.pso#PGSO +ps_other.bin 693 pixel 8a0677267eb686c0 /data000.cpk/shader2.dat/uiblackalphashader.pso#PGSO +ps_other.bin 694 pixel a176007d74d54879 /data000.cpk/shader2.dat/uichromatshader.pso#PGSO +vs_other.bin 401 vertex 8cc2ef399c68e1e0 /data000.cpk/shader2.dat/uichromatshader.vso#PGSO +ps_other.bin 695 pixel 1b880619f9af8ab3 /data000.cpk/shader2.dat/uicolornoise.pso#PGSO +vs_other.bin 402 vertex fa1d30612fbae734 /data000.cpk/shader2.dat/uicolornoise.vso#PGSO +ps_other.bin 696 pixel 50533d2c281b76bf /data000.cpk/shader2.dat/uigaussshader.pso#PGSO +vs_other.bin 403 vertex 202cd4ed023df975 /data000.cpk/shader2.dat/uigaussshader.vso#PGSO +ps_other.bin 697 pixel 143e273f3a1ed577 /data000.cpk/shader2.dat/uinostalgic.pso#PGSO +vs_other.bin 404 vertex 5c5804269a156941 /data000.cpk/shader2.dat/uinostalgic.vso#PGSO +ps_other.bin 698 pixel 81d6ab325e063c38 /data000.cpk/shader2.dat/uipowshader.pso#PGSO +ps_other.bin 699 pixel ea056aefdcc718fa /data000.cpk/shader2.dat/uipunchthrough.pso#PGSO +vs_other.bin 405 vertex 5b7145817478b9e7 /data000.cpk/shader2.dat/uipunchthrough.vso#PGSO +ps_other.bin 700 pixel 19ac78cbf0a5f197 /data000.cpk/shader2.dat/uipunchthrough2.pso#PGSO +ps_other.bin 701 pixel c56225e38c167f60 /data000.cpk/shader2.dat/uiradialchromatic.pso#PGSO +vs_other.bin 406 vertex 2a4420c4331b87e7 /data000.cpk/shader2.dat/uiradialchromatic.vso#PGSO +ps_other.bin 702 pixel c0f1d8cb122c4088 /data000.cpk/shader2.dat/uiradialchromatic_c1_0000_disprate_0001_5_gradation_0000.pso#PGSO +ps_other.bin 703 pixel 3f0a8a30323b38bd /data000.cpk/shader2.dat/uiradialchromatic_c1_0001_disprate_0000.pso#PGSO +ps_other.bin 704 pixel 9b045a1e7f25b781 /data000.cpk/shadereff.dat/EffectMetaballDistortion.pso#PGSO +ps_other.bin 705 pixel 2e908e21e2ac0d6c /data000.cpk/shadereff.dat/EffectMetaballNormal.pso#PGSO +vs_other.bin 407 vertex 9e7d815ba0bc5004 /data000.cpk/shadereff.dat/EffectMetaballNormal.vso#PGSO +ps_other.bin 706 pixel 2d7835798ece2830 /data000.cpk/shadereff.dat/EffectShaderFillScreen.pso#PGSO +vs_other.bin 408 vertex 8748eb8a3aff0784 /data000.cpk/shadereff.dat/EffectShaderFillScreen.vso#PGSO +ps_other.bin 707 pixel 9238af4fe661dfa2 /data000.cpk/shadereff.dat/EffectShaderFluidRender.pso#PGSO +vs_other.bin 409 vertex c3f2d89cd13798f5 /data000.cpk/shadereff.dat/EffectShaderFluidRender.vso#PGSO +ps_other.bin 708 pixel d0e3ee6b3e2ed173 /data000.cpk/shadereff.dat/EffectShaderFluidRenderSmoke.pso#PGSO +vs_other.bin 410 vertex dea3924af7d6bab7 /data000.cpk/shadereff.dat/EffectShaderFluidRenderSmoke.vso#PGSO +ps_other.bin 709 pixel a70ec5260ba49479 /data000.cpk/shadereff.dat/EffectShaderFluidRenderWater.pso#PGSO +vs_other.bin 411 vertex 49bdc22d873840fc /data000.cpk/shadereff.dat/EffectShaderFluidRenderWater.vso#PGSO +vs_other.bin 412 vertex 924549389994d73c /data000.cpk/shadereff.dat/EffectShaderOcclusion.vso#PGSO +ps_other.bin 710 pixel dac092db627ac7b3 /data000.cpk/shadereff.dat/EffectShaderShellParticleEmitterSkinning.pso#PGSO +vs_other.bin 413 vertex 539866479aac520f /data000.cpk/shadereff.dat/EffectShaderShellParticleEmitterSkinning.vso#PGSO +vs_other.bin 414 vertex 1df4301e765cd0bc /data000.cpk/shadereff.dat/EffectShaderShellParticleEmitterStatic.vso#PGSO +ps_other.bin 711 pixel a5486013a179d13a /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvProjectionSkinning.pso#PGSO +vs_other.bin 415 vertex d96667c18c3d1d9d /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvProjectionSkinning.vso#PGSO +ps_other.bin 712 pixel 010cf965d353b346 /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvProjectionStatic.pso#PGSO +vs_other.bin 416 vertex 826a7d03f858d621 /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvProjectionStatic.vso#PGSO +ps_other.bin 713 pixel 2b9da3951ff03be7 /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvScreenSkinning.pso#PGSO +vs_other.bin 417 vertex c0fb5fe67a335c04 /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvScreenSkinning.vso#PGSO +ps_other.bin 714 pixel 4b58c1d2d6b47278 /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvScreenStatic.pso#PGSO +vs_other.bin 418 vertex 4b267a484535e791 /data000.cpk/shadereff.dat/EffectShaderShellPolygonUvScreenStatic.vso#PGSO +ps_other.bin 715 pixel 75663b1e349f3a97 /data000.cpk/shadereff.dat/EspShaderLine.pso#PGSO +vs_other.bin 419 vertex 92edc9746a27d939 /data000.cpk/shadereff.dat/EspShaderLine.vso#PGSO +vs_other.bin 420 vertex 5abfc76b38083f5c /data000.cpk/shadereff.dat/EspShaderMultiMoveLine.vso#PGSO +vs_other.bin 421 vertex 3228d0f8b5e49bcf /data000.cpk/shadereff.dat/EspShaderMultiMoveLineCam.vso#PGSO +ps_other.bin 716 pixel 7019669aa82a97bc /data000.cpk/shadereff.dat/EspShaderMultiParticleShadowReceive.pso#PGSO +vs_other.bin 422 vertex cf64f4081d2719bd /data000.cpk/shadereff.dat/EspShaderMultiParticleShadowReceive.vso#PGSO +ps_other.bin 717 pixel edae9db9494d0d8d /data000.cpk/shadereff.dat/EspShaderPointLight2.pso#PGSO +ps_other.bin 718 pixel db5b7090225c82cc /data000.cpk/shadereff.dat/EspShaderPointLight3D.pso#PGSO +vs_other.bin 423 vertex 00086b38854dbb7d /data000.cpk/shadereff.dat/EspShaderPointLight3D.vso#PGSO +ps_other.bin 719 pixel 19ae3d380245cc0f /data000.cpk/shadereff.dat/EspShaderPointLight3D_Fog.pso#PGSO +ps_other.bin 720 pixel b3fae3e0a0d622fe /data000.cpk/shadereff.dat/EspShaderRangeLight.pso#PGSO +vs_other.bin 424 vertex 275ba46b2d284f96 /data000.cpk/shadereff.dat/EspShaderRangeLight.vso#PGSO +ps_other.bin 721 pixel cdcfb007de2619d2 /data000.cpk/shadereff.dat/EspShaderRangeLightCylinder.pso#PGSO +ps_other.bin 722 pixel 5aaf7be4f2ede609 /data000.cpk/shadereff.dat/EspShaderRangeLightTex.pso#PGSO +ps_other.bin 723 pixel c261457c43e00c5f /data000.cpk/shadereff.dat/EspShaderScreenDirtDetection.pso#PGSO +ps_other.bin 724 pixel d66937a689d5cb94 /data000.cpk/shadereff.dat/EspShaderScreenMaskDetection.pso#PGSO +ps_other.bin 725 pixel 342a2ca235be867d /data000.cpk/shadereff.dat/EspShaderShadowReceive.pso#PGSO +vs_other.bin 425 vertex e9390fcd0f89d286 /data000.cpk/shadereff.dat/EspShaderShadowReceive.vso#PGSO +ps_other.bin 726 pixel 78eba98b9eb5d175 /data000.cpk/shadereff.dat/EspShaderTvGhost.pso#PGSO +ps_other.bin 727 pixel 036f78fa93295d07 /data000.cpk/shadereff.dat/EspShaderTvGhostMask.pso#PGSO +ps_other.bin 728 pixel 32b1ff538c7f5a22 /data000.cpk/shadereff.dat/EspShaderUIChromat.pso#PGSO +ps_other.bin 729 pixel d1e5f8fb15ca39dc /data000.cpk/shadereff.dat/EspShaderVertexShadowReceive.pso#PGSO +vs_other.bin 426 vertex e005ab8f4502e4f8 /data000.cpk/shadereff.dat/EspShaderVertexShadowReceive.vso#PGSO +ps_other.bin 730 pixel 0989d43e90587d43 /data000.cpk/shadereff.dat/GpuBulletRender.pso#PGSO +vs_other.bin 427 vertex 4b04fe80f4563802 /data000.cpk/shadereff.dat/GpuBulletRender.vso#PGSO +ps_other.bin 731 pixel 29a1250c30216387 /data000.cpk/shadereff.dat/GpuBulletRenderAtras.pso#PGSO +vs_other.bin 428 vertex 16130a95a06ad436 /data000.cpk/shadereff.dat/GpuBulletRenderAtras.vso#PGSO +ps_other.bin 732 pixel ca11f77098c1d3c8 /data000.cpk/shadereff.dat/GpuBulletRenderLight.pso#PGSO +vs_other.bin 429 vertex bd62d0be7821db4d /data000.cpk/shadereff.dat/GpuBulletRenderLight.vso#PGSO +ps_other.bin 733 pixel 81a670bafba8208d /data000.cpk/shadereff.dat/GpuBulletRenderLightBlend.pso#PGSO +vs_other.bin 430 vertex 079f7d55c336ce54 /data000.cpk/shadereff.dat/GpuBulletRenderLightBlend.vso#PGSO +vs_other.bin 431 vertex 5167197e20b9f6da /data000.cpk/shadereff.dat/espshaderMultiDirBillbord.vso#PGSO +ps_other.bin 734 pixel d56528d0b0b6ac87 /data000.cpk/shadereff.dat/espshaderPolyLine.pso#PGSO +vs_other.bin 432 vertex 2fec68ad345a00ce /data000.cpk/shadereff.dat/espshaderPolyLine.vso#PGSO +vs_other.bin 433 vertex 9012452bd73f8362 /data000.cpk/shadereff.dat/espshaderPolyLineCam.vso#PGSO +vs_other.bin 434 vertex 0dd3ed4fa5eafa7f /data000.cpk/shadereff.dat/espshadermultimoveparticleCB.vso#PGSO +ps_other.bin 735 pixel e238f3549927dc8a /data000.cpk/shadereff.dat/espshadermultimoveparticleCBAnimation.pso#PGSO +vs_other.bin 435 vertex 60b0fdd0212bf1b1 /data000.cpk/shadereff.dat/espshadermultimoveparticleCBAnimation.vso#PGSO +vs_other.bin 436 vertex e8562eb57530b1db /data000.cpk/shadereff.dat/espshadermultimoveparticleCBAtl.vso#PGSO +vs_other.bin 437 vertex 802a6975d5b720c5 /data000.cpk/shadereff.dat/espshadermultimoveparticleSSB.vso#PGSO +vs_other.bin 438 vertex 930171e5a698ecb0 /data000.cpk/shadereff.dat/espshadermultimoveparticleSSBAtl.vso#PGSO +vs_other.bin 439 vertex c802fe0a8cd8de2e /data000.cpk/shadereff.dat/espshadermultimoveparticlebillbord.vso#PGSO +vs_other.bin 440 vertex fc8f349c4e5a634c /data000.cpk/shadereff.dat/espshadermultimoveparticlebillbordAtl.vso#PGSO +vs_other.bin 441 vertex 57b294603b0d5af0 /data000.cpk/shadereff.dat/espshadermultimoveparticlebillbordAtlShadow.vso#PGSO +vs_other.bin 442 vertex 049dd89064d11d5d /data000.cpk/shadereff.dat/espshadermultimoveparticlebillbordAtldof.vso#PGSO +vs_other.bin 443 vertex 2b584d16178d8578 /data000.cpk/shadereff.dat/espshadermultimoveparticlebillbordShadow.vso#PGSO +ps_other.bin 736 pixel 35351801109667d4 /data000.cpk/shadereff.dat/espshadermultimoveparticlebillbord_Shimmer.pso#PGSO +vs_other.bin 444 vertex ecfb82c08ca1adb5 /data000.cpk/shadereff.dat/espshadermultimoveparticlebillborddof.vso#PGSO +vs_other.bin 445 vertex f288addb4bff850a /data000.cpk/shadereff.dat/espshadermultimoveparticlecylinder.vso#PGSO +ps_other.bin 737 pixel 335c6a03b18ba361 /data000.cpk/shadereff.dat/espshadermultiparticle3d.pso#PGSO +vs_other.bin 446 vertex d32edce903afc320 /data000.cpk/shadereff.dat/espshadermultiparticle3d.vso#PGSO +vs_other.bin 447 vertex 762884900028e9ca /data000.cpk/shadereff.dat/espshadermultiparticlebillbord.vso#PGSO +vs_other.bin 448 vertex f5eabfdffd8ebb91 /data000.cpk/shadereff.dat/espshadermultiparticlebillbordAtl.vso#PGSO +vs_other.bin 449 vertex eb14335f4c471c0c /data000.cpk/shadereff.dat/espshadermultiparticlebillbordAtldof.vso#PGSO +ps_other.bin 738 pixel b1771678097a8424 /data000.cpk/shadereff.dat/espshadermultiparticlebillborddof.pso#PGSO +vs_other.bin 450 vertex c8d0df92d94249c5 /data000.cpk/shadereff.dat/espshadermultiparticlebillborddof.vso#PGSO +cs_other.bin 11 compute a8dd21c1a70c4f58 /data000.cpk/shadereffcs.dat/EffectClearAliveCounter.cso#PGSO +cs_other.bin 12 compute 80a484813d46c213 /data000.cpk/shadereffcs.dat/EffectClearBulletLightTexture.cso#PGSO +cs_other.bin 13 compute 9000f50a7f75f079 /data000.cpk/shadereffcs.dat/EffectClearParticlesFixed.cso#PGSO +cs_other.bin 14 compute 0bc5457eddc461e0 /data000.cpk/shadereffcs.dat/EffectCreateInstanceParticlesFixed.cso#PGSO +cs_other.bin 15 compute 0febe44312c0d328 /data000.cpk/shadereffcs.dat/EffectDepthCollision.cso#PGSO +cs_other.bin 16 compute a1702cc1957ebba5 /data000.cpk/shadereffcs.dat/EffectEmissionParticlesFixed.cso#PGSO +cs_other.bin 17 compute 50ada2c643a0588e /data000.cpk/shadereffcs.dat/EffectEmissionParticlesFixedUsePosBuffer.cso#PGSO +cs_other.bin 18 compute 018d05d06e74d76f /data000.cpk/shadereffcs.dat/EffectLocalVectorField.cso#PGSO +cs_other.bin 19 compute d60cb43c9eec8a9e /data000.cpk/shadereffcs.dat/EffectOutputAliveCounter.cso#PGSO +cs_other.bin 20 compute 957b438fe26d42d7 /data000.cpk/shadereffcs.dat/EffectUpdateParticlesFixed.cso#PGSO +cs_other.bin 21 compute a23ffa20896a1366 /data000.cpk/shadereffcs.dat/EffectUpdateParticlesFixed1.cso#PGSO +cs_other.bin 22 compute 674bfb353124bc97 /data000.cpk/shadereffcs.dat/EffectUpdateParticlesFixed2.cso#PGSO +cs_other.bin 23 compute 14206a699c7c386c /data000.cpk/shadereffcs.dat/EffectVectorField.cso#PGSO +cs_other.bin 24 compute 59531a4ae5e35b53 /data000.cpk/shadereffcs.dat/GpuBulletAddDummy.cso#PGSO +cs_other.bin 25 compute db5f9ca88a17671b /data000.cpk/shadereffcs.dat/GpuBulletBitonicSort.cso#PGSO +cs_other.bin 26 compute de59ef04e8eadad0 /data000.cpk/shadereffcs.dat/GpuBulletCreateInstance.cso#PGSO +cs_other.bin 27 compute ee57bd3b73c9fe7d /data000.cpk/shadereffcs.dat/GpuBulletPreAddDummy.cso#PGSO +cs_other.bin 28 compute 80b069d0f0564d71 /data000.cpk/shadereffcs.dat/effectclearnormaltangent.cso#PGSO +cs_other.bin 29 compute bc4ab6938c1bceac /data000.cpk/shadereffcs.dat/effectcreatenormaltangent.cso#PGSO +cs_other.bin 30 compute 83d07e6559f93bd9 /data000.cpk/shadereffcs.dat/effectoutputnormaltangent.cso#PGSO diff --git a/dm/games/010056B015FE8000/shader_map.tsv.conflicts.tsv b/dm/games/010056B015FE8000/shader_map.tsv.conflicts.tsv new file mode 100644 index 0000000..35c1b4d --- /dev/null +++ b/dm/games/010056B015FE8000/shader_map.tsv.conflicts.tsv @@ -0,0 +1,2 @@ +# kind: evidence control-section key conflict rulings: empty +dm_ctl_sha16 chosen_pc class candidates records diff --git a/dm/games/010056B015FE8000/shader_pairs.tsv b/dm/games/010056B015FE8000/shader_pairs.tsv new file mode 100644 index 0000000..b58c904 --- /dev/null +++ b/dm/games/010056B015FE8000/shader_pairs.tsv @@ -0,0 +1,903 @@ +# kind: evidence vertex / pixel shader pairs within BNSH variations (generated by dm/gfx/tools/shader_split.py, do not edit): vertex key pixel key +00086b38854dbb7d 003014fbe32aebf4 +00086b38854dbb7d 29409290c370fbb3 +008fbe3f0ef72297 003014fbe32aebf4 +008fbe3f0ef72297 29409290c370fbb3 +0110d92b5ae3921d 003014fbe32aebf4 +0110d92b5ae3921d 29409290c370fbb3 +025102bf43e81a7d 003014fbe32aebf4 +025102bf43e81a7d 29409290c370fbb3 +02888586097d15b7 003014fbe32aebf4 +02888586097d15b7 29409290c370fbb3 +049dc69f46e23a20 003014fbe32aebf4 +049dc69f46e23a20 29409290c370fbb3 +049dd89064d11d5d 003014fbe32aebf4 +049dd89064d11d5d 29409290c370fbb3 +05dea90b96ac259b 003014fbe32aebf4 +05dea90b96ac259b 29409290c370fbb3 +05e8db074e60df57 003014fbe32aebf4 +05e8db074e60df57 29409290c370fbb3 +063c1af58c3213f2 003014fbe32aebf4 +063c1af58c3213f2 29409290c370fbb3 +0693aad293de4625 003014fbe32aebf4 +0693aad293de4625 29409290c370fbb3 +06ad2817f4f78941 003014fbe32aebf4 +06ad2817f4f78941 29409290c370fbb3 +06fd5958059102a7 003014fbe32aebf4 +06fd5958059102a7 29409290c370fbb3 +0702bf2f8170e6af 003014fbe32aebf4 +0702bf2f8170e6af 29409290c370fbb3 +076504bba2a2af9e 003014fbe32aebf4 +076504bba2a2af9e 29409290c370fbb3 +079f7d55c336ce54 003014fbe32aebf4 +079f7d55c336ce54 29409290c370fbb3 +08b59f8aaf517fed 003014fbe32aebf4 +08b59f8aaf517fed 29409290c370fbb3 +097ff49ca182250e 003014fbe32aebf4 +097ff49ca182250e 29409290c370fbb3 +09a3cf31af3d29b4 003014fbe32aebf4 +09a3cf31af3d29b4 29409290c370fbb3 +0acb636a5add55dd 003014fbe32aebf4 +0acb636a5add55dd 29409290c370fbb3 +0b56a3660c83e994 003014fbe32aebf4 +0b56a3660c83e994 29409290c370fbb3 +0b5767dc98685b4b 003014fbe32aebf4 +0b5767dc98685b4b 29409290c370fbb3 +0b935131beed4743 003014fbe32aebf4 +0b935131beed4743 29409290c370fbb3 +0cdca2296de6edba 003014fbe32aebf4 +0cdca2296de6edba 29409290c370fbb3 +0d3e57ccad0e0335 003014fbe32aebf4 +0d3e57ccad0e0335 29409290c370fbb3 +0d9a66edbbdc52dc 003014fbe32aebf4 +0d9a66edbbdc52dc 29409290c370fbb3 +0dd3ed4fa5eafa7f 003014fbe32aebf4 +0dd3ed4fa5eafa7f 29409290c370fbb3 +0ddb1f1c36043a79 003014fbe32aebf4 +0ddb1f1c36043a79 29409290c370fbb3 +0df1af6bd808eff9 003014fbe32aebf4 +0df1af6bd808eff9 29409290c370fbb3 +0f49664d230b7cc1 003014fbe32aebf4 +0f49664d230b7cc1 29409290c370fbb3 +0fa9cef06a5f2fde 003014fbe32aebf4 +0fa9cef06a5f2fde 29409290c370fbb3 +0fcbbb58b684b5f1 003014fbe32aebf4 +0fcbbb58b684b5f1 29409290c370fbb3 +10800de3d176cc00 003014fbe32aebf4 +10800de3d176cc00 29409290c370fbb3 +115786ab3509ab61 003014fbe32aebf4 +115786ab3509ab61 29409290c370fbb3 +1180bb74a61ba5aa 003014fbe32aebf4 +1180bb74a61ba5aa 29409290c370fbb3 +13386def4bfcabe5 003014fbe32aebf4 +13386def4bfcabe5 29409290c370fbb3 +13c91d98579483b8 003014fbe32aebf4 +13c91d98579483b8 29409290c370fbb3 +13f9509ae8ef5388 003014fbe32aebf4 +13f9509ae8ef5388 29409290c370fbb3 +143c95fa6bb7fc68 003014fbe32aebf4 +143c95fa6bb7fc68 29409290c370fbb3 +159b3c8dcf639c37 003014fbe32aebf4 +159b3c8dcf639c37 29409290c370fbb3 +15f99d6b2584dc48 003014fbe32aebf4 +15f99d6b2584dc48 29409290c370fbb3 +16130a95a06ad436 003014fbe32aebf4 +16130a95a06ad436 29409290c370fbb3 +166ed938a94ad3ab 003014fbe32aebf4 +166ed938a94ad3ab 29409290c370fbb3 +167b8b8aa79b4262 003014fbe32aebf4 +167b8b8aa79b4262 29409290c370fbb3 +1742b4f98bd0989b 003014fbe32aebf4 +1742b4f98bd0989b 29409290c370fbb3 +187155c4af22ae76 003014fbe32aebf4 +187155c4af22ae76 29409290c370fbb3 +18a435d220de55ff 003014fbe32aebf4 +18a435d220de55ff 29409290c370fbb3 +1a6ef47568d1adaa 003014fbe32aebf4 +1a6ef47568d1adaa 29409290c370fbb3 +1b0bd03e1815f8cc 003014fbe32aebf4 +1b0bd03e1815f8cc 29409290c370fbb3 +1b3ae40f334887a5 003014fbe32aebf4 +1b3ae40f334887a5 29409290c370fbb3 +1b3dfee2dc5fbae7 003014fbe32aebf4 +1b3dfee2dc5fbae7 29409290c370fbb3 +1b5dd369daedddc2 003014fbe32aebf4 +1b5dd369daedddc2 29409290c370fbb3 +1c4111920c273418 003014fbe32aebf4 +1c4111920c273418 29409290c370fbb3 +1c51616cce770866 003014fbe32aebf4 +1c51616cce770866 29409290c370fbb3 +1df4301e765cd0bc 003014fbe32aebf4 +1df4301e765cd0bc 29409290c370fbb3 +1df5ab32043dd29d 003014fbe32aebf4 +1df5ab32043dd29d 29409290c370fbb3 +1e53d5a1ada08a71 003014fbe32aebf4 +1e53d5a1ada08a71 29409290c370fbb3 +1eb8d5b0fcd3627e 003014fbe32aebf4 +1eb8d5b0fcd3627e 29409290c370fbb3 +1f67c861e4121c15 003014fbe32aebf4 +1f67c861e4121c15 29409290c370fbb3 +202cd4ed023df975 003014fbe32aebf4 +202cd4ed023df975 29409290c370fbb3 +20d738034dc188a3 003014fbe32aebf4 +20d738034dc188a3 29409290c370fbb3 +211736e6fda6162d 003014fbe32aebf4 +211736e6fda6162d 29409290c370fbb3 +22559a5d012bcfe9 003014fbe32aebf4 +22559a5d012bcfe9 29409290c370fbb3 +22a19e095bbc59bf 003014fbe32aebf4 +22a19e095bbc59bf 29409290c370fbb3 +23522240236d2b54 003014fbe32aebf4 +23522240236d2b54 29409290c370fbb3 +23f84817448387c6 003014fbe32aebf4 +23f84817448387c6 29409290c370fbb3 +245246ecc69b9520 003014fbe32aebf4 +245246ecc69b9520 29409290c370fbb3 +24ea2d84b2a209ee 003014fbe32aebf4 +24ea2d84b2a209ee 29409290c370fbb3 +2684e72f470ead30 003014fbe32aebf4 +2684e72f470ead30 29409290c370fbb3 +2699352be721c40d 003014fbe32aebf4 +2699352be721c40d 29409290c370fbb3 +26f4501e9a33b938 003014fbe32aebf4 +26f4501e9a33b938 29409290c370fbb3 +275ba46b2d284f96 003014fbe32aebf4 +275ba46b2d284f96 29409290c370fbb3 +27bb7ba5acb49f2e 003014fbe32aebf4 +27bb7ba5acb49f2e 29409290c370fbb3 +27e74443a67249cf 003014fbe32aebf4 +27e74443a67249cf 29409290c370fbb3 +27f84887ba047a0f 003014fbe32aebf4 +27f84887ba047a0f 29409290c370fbb3 +28bf04958fb618ba 003014fbe32aebf4 +28bf04958fb618ba 29409290c370fbb3 +28fab3ac6021643c 003014fbe32aebf4 +28fab3ac6021643c 29409290c370fbb3 +2927d1cc4a4bc614 003014fbe32aebf4 +2927d1cc4a4bc614 29409290c370fbb3 +2951a62451bc8cc3 003014fbe32aebf4 +2951a62451bc8cc3 29409290c370fbb3 +295b294220f90e24 003014fbe32aebf4 +295b294220f90e24 29409290c370fbb3 +29ddf580a55222ae 003014fbe32aebf4 +29ddf580a55222ae 29409290c370fbb3 +2a4420c4331b87e7 003014fbe32aebf4 +2a4420c4331b87e7 29409290c370fbb3 +2a8a3b0b4a9ec8fa 003014fbe32aebf4 +2a8a3b0b4a9ec8fa 29409290c370fbb3 +2b584d16178d8578 003014fbe32aebf4 +2b584d16178d8578 29409290c370fbb3 +2bca666743d245d4 003014fbe32aebf4 +2bca666743d245d4 29409290c370fbb3 +2e4f678dbc818b58 003014fbe32aebf4 +2e4f678dbc818b58 29409290c370fbb3 +2e5cd104ff68700c 003014fbe32aebf4 +2e5cd104ff68700c 29409290c370fbb3 +2f64b946ae766851 003014fbe32aebf4 +2f64b946ae766851 29409290c370fbb3 +2fa0719caa180198 003014fbe32aebf4 +2fa0719caa180198 29409290c370fbb3 +2fec68ad345a00ce 003014fbe32aebf4 +2fec68ad345a00ce 29409290c370fbb3 +3060931a7a3ebec5 003014fbe32aebf4 +3060931a7a3ebec5 29409290c370fbb3 +3075f4bd6e97a74b 003014fbe32aebf4 +3075f4bd6e97a74b 29409290c370fbb3 +30c40d9559b78eab 003014fbe32aebf4 +30c40d9559b78eab 29409290c370fbb3 +3120a2170b7f30b7 003014fbe32aebf4 +3120a2170b7f30b7 29409290c370fbb3 +3172794a7c1c4a89 003014fbe32aebf4 +3172794a7c1c4a89 29409290c370fbb3 +317b2aa94bc181e2 003014fbe32aebf4 +317b2aa94bc181e2 29409290c370fbb3 +317bc48071a2dad7 003014fbe32aebf4 +317bc48071a2dad7 29409290c370fbb3 +3200818d3576ee6e 003014fbe32aebf4 +3200818d3576ee6e 29409290c370fbb3 +3228d0f8b5e49bcf 003014fbe32aebf4 +3228d0f8b5e49bcf 29409290c370fbb3 +33915f0dfe0a2f0f 003014fbe32aebf4 +33915f0dfe0a2f0f 29409290c370fbb3 +33abe98dd91667f7 003014fbe32aebf4 +33abe98dd91667f7 29409290c370fbb3 +3442455a6629a3e8 003014fbe32aebf4 +3442455a6629a3e8 29409290c370fbb3 +3478e636faeea720 003014fbe32aebf4 +3478e636faeea720 29409290c370fbb3 +34be2668d5c14ce4 003014fbe32aebf4 +34be2668d5c14ce4 29409290c370fbb3 +35918cd6ef409d47 003014fbe32aebf4 +35918cd6ef409d47 29409290c370fbb3 +35bdf55d0b9c2b59 003014fbe32aebf4 +35bdf55d0b9c2b59 29409290c370fbb3 +376ce02e4efdcc95 003014fbe32aebf4 +376ce02e4efdcc95 29409290c370fbb3 +3798a8667a4e8bb4 003014fbe32aebf4 +3798a8667a4e8bb4 29409290c370fbb3 +381529be7a9052e5 003014fbe32aebf4 +381529be7a9052e5 29409290c370fbb3 +381c70bf5a519c9f 003014fbe32aebf4 +381c70bf5a519c9f 29409290c370fbb3 +38cd449544dbe683 003014fbe32aebf4 +38cd449544dbe683 29409290c370fbb3 +3c0314978d8f875d 003014fbe32aebf4 +3c0314978d8f875d 29409290c370fbb3 +3c827071d2e51c47 003014fbe32aebf4 +3c827071d2e51c47 29409290c370fbb3 +3d91412b0e5ba0f1 003014fbe32aebf4 +3d91412b0e5ba0f1 29409290c370fbb3 +3df89f36b5ff6f8a 003014fbe32aebf4 +3df89f36b5ff6f8a 29409290c370fbb3 +3e2e98bafd67d1aa 003014fbe32aebf4 +3e2e98bafd67d1aa 29409290c370fbb3 +3ee3760b773ea1d4 003014fbe32aebf4 +3ee3760b773ea1d4 29409290c370fbb3 +403bf2b2b7c59f69 003014fbe32aebf4 +403bf2b2b7c59f69 29409290c370fbb3 +420342ab9fc06e85 003014fbe32aebf4 +420342ab9fc06e85 29409290c370fbb3 +4243a4b49cbfe516 003014fbe32aebf4 +4243a4b49cbfe516 29409290c370fbb3 +426e4ffb80f1bcce 003014fbe32aebf4 +426e4ffb80f1bcce 29409290c370fbb3 +4335c6476c8e077a 003014fbe32aebf4 +4335c6476c8e077a 29409290c370fbb3 +4481bf793f39a968 003014fbe32aebf4 +4481bf793f39a968 29409290c370fbb3 +44bf8b3fb1a520f3 003014fbe32aebf4 +44bf8b3fb1a520f3 29409290c370fbb3 +46e8cd0de7414e7f 003014fbe32aebf4 +46e8cd0de7414e7f 29409290c370fbb3 +47949807306be426 003014fbe32aebf4 +47949807306be426 29409290c370fbb3 +48e8a2852445c753 003014fbe32aebf4 +48e8a2852445c753 29409290c370fbb3 +495ebfcad1b0de03 003014fbe32aebf4 +495ebfcad1b0de03 29409290c370fbb3 +49bdc22d873840fc 003014fbe32aebf4 +49bdc22d873840fc 29409290c370fbb3 +4a25362eea9931a0 003014fbe32aebf4 +4a25362eea9931a0 29409290c370fbb3 +4af18498a895f57b 003014fbe32aebf4 +4af18498a895f57b 29409290c370fbb3 +4b04fe80f4563802 003014fbe32aebf4 +4b04fe80f4563802 29409290c370fbb3 +4b267a484535e791 003014fbe32aebf4 +4b267a484535e791 29409290c370fbb3 +4b504cb00ac17c32 003014fbe32aebf4 +4b504cb00ac17c32 29409290c370fbb3 +4b8e46eb92a07042 003014fbe32aebf4 +4b8e46eb92a07042 29409290c370fbb3 +4c21a42cc8eb836d 003014fbe32aebf4 +4c21a42cc8eb836d 29409290c370fbb3 +4c6f1a3f92b40935 003014fbe32aebf4 +4c6f1a3f92b40935 29409290c370fbb3 +4ce29aa1f7e99c6b 003014fbe32aebf4 +4ce29aa1f7e99c6b 29409290c370fbb3 +4cee2136a047e8be 003014fbe32aebf4 +4cee2136a047e8be 29409290c370fbb3 +4dd8e12bbc0ef039 003014fbe32aebf4 +4dd8e12bbc0ef039 29409290c370fbb3 +4ea5793c080d8942 003014fbe32aebf4 +4ea5793c080d8942 29409290c370fbb3 +4f1f3fedbaa30b31 003014fbe32aebf4 +4f1f3fedbaa30b31 29409290c370fbb3 +50f2180636058b9d 003014fbe32aebf4 +50f2180636058b9d 29409290c370fbb3 +5167197e20b9f6da 003014fbe32aebf4 +5167197e20b9f6da 29409290c370fbb3 +516d7dd5b5c25e66 003014fbe32aebf4 +516d7dd5b5c25e66 29409290c370fbb3 +527a21a215dedb48 003014fbe32aebf4 +527a21a215dedb48 29409290c370fbb3 +538c428a5a300101 003014fbe32aebf4 +538c428a5a300101 29409290c370fbb3 +539866479aac520f 003014fbe32aebf4 +539866479aac520f 29409290c370fbb3 +53ff15f43c32fe44 003014fbe32aebf4 +53ff15f43c32fe44 29409290c370fbb3 +54855c38a82e3f39 003014fbe32aebf4 +54855c38a82e3f39 29409290c370fbb3 +558515d7412057c3 003014fbe32aebf4 +558515d7412057c3 29409290c370fbb3 +5612e3d2cd7cd78d 003014fbe32aebf4 +5612e3d2cd7cd78d 29409290c370fbb3 +564a41fa6fd0f33f 003014fbe32aebf4 +564a41fa6fd0f33f 29409290c370fbb3 +56ad169bb86186c9 003014fbe32aebf4 +56ad169bb86186c9 29409290c370fbb3 +56fe21797160696d 003014fbe32aebf4 +56fe21797160696d 29409290c370fbb3 +570bb14e98ed8be0 003014fbe32aebf4 +570bb14e98ed8be0 29409290c370fbb3 +5716b91f0a823f72 003014fbe32aebf4 +5716b91f0a823f72 29409290c370fbb3 +57b294603b0d5af0 003014fbe32aebf4 +57b294603b0d5af0 29409290c370fbb3 +58b01056e8e1d0e1 003014fbe32aebf4 +58b01056e8e1d0e1 29409290c370fbb3 +5937c2f58eb77b3a 003014fbe32aebf4 +5937c2f58eb77b3a 29409290c370fbb3 +5a5c9133d0f16649 003014fbe32aebf4 +5a5c9133d0f16649 29409290c370fbb3 +5abfc76b38083f5c 003014fbe32aebf4 +5abfc76b38083f5c 29409290c370fbb3 +5b0cd4648ce3fc42 003014fbe32aebf4 +5b0cd4648ce3fc42 29409290c370fbb3 +5b7145817478b9e7 003014fbe32aebf4 +5b7145817478b9e7 29409290c370fbb3 +5bc4618af9175578 003014fbe32aebf4 +5bc4618af9175578 29409290c370fbb3 +5c55eae177dace24 003014fbe32aebf4 +5c55eae177dace24 29409290c370fbb3 +5c5804269a156941 003014fbe32aebf4 +5c5804269a156941 29409290c370fbb3 +5d589a8c4f58dfeb 003014fbe32aebf4 +5d589a8c4f58dfeb 29409290c370fbb3 +5f880399702b500c 003014fbe32aebf4 +5f880399702b500c 29409290c370fbb3 +60b0fdd0212bf1b1 003014fbe32aebf4 +60b0fdd0212bf1b1 29409290c370fbb3 +60efcbb6068d4311 003014fbe32aebf4 +60efcbb6068d4311 29409290c370fbb3 +620bb1048fcba35c 003014fbe32aebf4 +620bb1048fcba35c 29409290c370fbb3 +621589bd6c91847f 003014fbe32aebf4 +621589bd6c91847f 29409290c370fbb3 +62dcb5a12f6c4f1a 003014fbe32aebf4 +62dcb5a12f6c4f1a 29409290c370fbb3 +6339e2754623a767 003014fbe32aebf4 +6339e2754623a767 29409290c370fbb3 +633b77f5411adf73 003014fbe32aebf4 +633b77f5411adf73 29409290c370fbb3 +65426d1f51dbaa57 003014fbe32aebf4 +65426d1f51dbaa57 29409290c370fbb3 +66260b27255ca9db 003014fbe32aebf4 +66260b27255ca9db 29409290c370fbb3 +663373274dd577f3 003014fbe32aebf4 +663373274dd577f3 29409290c370fbb3 +66db13312407223e 003014fbe32aebf4 +66db13312407223e 29409290c370fbb3 +66e3950216a635cf 003014fbe32aebf4 +66e3950216a635cf 29409290c370fbb3 +6738fc27e8a94cf2 003014fbe32aebf4 +6738fc27e8a94cf2 29409290c370fbb3 +67ddcaa39b8473c5 003014fbe32aebf4 +67ddcaa39b8473c5 29409290c370fbb3 +690c747bec63bdbf 003014fbe32aebf4 +690c747bec63bdbf 29409290c370fbb3 +693ed4a0cce8633b 003014fbe32aebf4 +693ed4a0cce8633b 29409290c370fbb3 +69ecb19157e68527 003014fbe32aebf4 +69ecb19157e68527 29409290c370fbb3 +6ab0a50ad4cfbebc 003014fbe32aebf4 +6ab0a50ad4cfbebc 29409290c370fbb3 +6b5c6bbf33603eda 003014fbe32aebf4 +6b5c6bbf33603eda 29409290c370fbb3 +6bdf8484cbb69b7f 003014fbe32aebf4 +6bdf8484cbb69b7f 29409290c370fbb3 +6c56bc83bdeb399f 003014fbe32aebf4 +6c56bc83bdeb399f 29409290c370fbb3 +6c5de24d75200f4d 003014fbe32aebf4 +6c5de24d75200f4d 29409290c370fbb3 +6c713ff6aa3952e0 003014fbe32aebf4 +6c713ff6aa3952e0 29409290c370fbb3 +6c9e7daf527cea9d 003014fbe32aebf4 +6c9e7daf527cea9d 29409290c370fbb3 +6d95d272391f899b 003014fbe32aebf4 +6d95d272391f899b 29409290c370fbb3 +6e18499028aead6a 003014fbe32aebf4 +6e18499028aead6a 29409290c370fbb3 +6ea7b8809476c3f9 003014fbe32aebf4 +6ea7b8809476c3f9 29409290c370fbb3 +6f93dc566009c1a0 003014fbe32aebf4 +6f93dc566009c1a0 29409290c370fbb3 +70c45d397c6ea923 003014fbe32aebf4 +70c45d397c6ea923 29409290c370fbb3 +7125a9f1fa9ff7f3 003014fbe32aebf4 +7125a9f1fa9ff7f3 29409290c370fbb3 +714905b9d69c454d 003014fbe32aebf4 +714905b9d69c454d 29409290c370fbb3 +729cacd79f798cce 003014fbe32aebf4 +729cacd79f798cce 29409290c370fbb3 +74e5d663cb14a321 003014fbe32aebf4 +74e5d663cb14a321 29409290c370fbb3 +759e816ddf716ada 003014fbe32aebf4 +759e816ddf716ada 29409290c370fbb3 +75db9ce3f57d8d3f 003014fbe32aebf4 +75db9ce3f57d8d3f 29409290c370fbb3 +761e0ee659291f78 003014fbe32aebf4 +761e0ee659291f78 29409290c370fbb3 +762884900028e9ca 003014fbe32aebf4 +762884900028e9ca 29409290c370fbb3 +76fd7922ed50d4f6 003014fbe32aebf4 +76fd7922ed50d4f6 29409290c370fbb3 +77761daa405f8b2e 003014fbe32aebf4 +77761daa405f8b2e 29409290c370fbb3 +79db7c61c0eea8aa 003014fbe32aebf4 +79db7c61c0eea8aa 29409290c370fbb3 +79dc0bdf302fa006 003014fbe32aebf4 +79dc0bdf302fa006 29409290c370fbb3 +7a3fc512451d2158 003014fbe32aebf4 +7a3fc512451d2158 29409290c370fbb3 +7afeb2f654fd1d85 003014fbe32aebf4 +7afeb2f654fd1d85 29409290c370fbb3 +7b77d30b615a7da8 003014fbe32aebf4 +7b77d30b615a7da8 29409290c370fbb3 +7cf5a3649909c1cd 003014fbe32aebf4 +7cf5a3649909c1cd 29409290c370fbb3 +7d4a2886de306898 003014fbe32aebf4 +7d4a2886de306898 29409290c370fbb3 +7dce6394debb6626 003014fbe32aebf4 +7dce6394debb6626 29409290c370fbb3 +7dda3d1efa67bfa0 003014fbe32aebf4 +7dda3d1efa67bfa0 29409290c370fbb3 +802a6975d5b720c5 003014fbe32aebf4 +802a6975d5b720c5 29409290c370fbb3 +814722586879cba9 003014fbe32aebf4 +814722586879cba9 29409290c370fbb3 +8185a60f85543d50 003014fbe32aebf4 +8185a60f85543d50 29409290c370fbb3 +826a7d03f858d621 003014fbe32aebf4 +826a7d03f858d621 29409290c370fbb3 +82aa28863ce57170 003014fbe32aebf4 +82aa28863ce57170 29409290c370fbb3 +8317525804b1f341 003014fbe32aebf4 +8317525804b1f341 29409290c370fbb3 +832c75a10e2936b1 003014fbe32aebf4 +832c75a10e2936b1 29409290c370fbb3 +834f02f8ff2639ab 003014fbe32aebf4 +834f02f8ff2639ab 29409290c370fbb3 +839502121e8dc98c 003014fbe32aebf4 +839502121e8dc98c 29409290c370fbb3 +8493734b79f86ce9 003014fbe32aebf4 +8493734b79f86ce9 29409290c370fbb3 +84d42b630f551588 003014fbe32aebf4 +84d42b630f551588 29409290c370fbb3 +85676cd8b3df3c91 003014fbe32aebf4 +85676cd8b3df3c91 29409290c370fbb3 +8582074f224ca0b8 003014fbe32aebf4 +8582074f224ca0b8 29409290c370fbb3 +86ee1eeb894ffdc0 003014fbe32aebf4 +86ee1eeb894ffdc0 29409290c370fbb3 +8748eb8a3aff0784 003014fbe32aebf4 +8748eb8a3aff0784 29409290c370fbb3 +876fa391da6d971d 003014fbe32aebf4 +876fa391da6d971d 29409290c370fbb3 +87be4f2b6e0ccb2e 003014fbe32aebf4 +87be4f2b6e0ccb2e 29409290c370fbb3 +8889f9c128c017cb 003014fbe32aebf4 +8889f9c128c017cb 29409290c370fbb3 +8916a280e66a48fc 003014fbe32aebf4 +8916a280e66a48fc 29409290c370fbb3 +896eaabe86861d6f 003014fbe32aebf4 +896eaabe86861d6f 29409290c370fbb3 +8971677029c75df0 003014fbe32aebf4 +8971677029c75df0 29409290c370fbb3 +89e1d6f2b304ae32 003014fbe32aebf4 +89e1d6f2b304ae32 29409290c370fbb3 +89e34eeb688730ef 003014fbe32aebf4 +89e34eeb688730ef 29409290c370fbb3 +8a8ff4eef2621073 003014fbe32aebf4 +8a8ff4eef2621073 29409290c370fbb3 +8b5876f088e53b59 003014fbe32aebf4 +8b5876f088e53b59 29409290c370fbb3 +8b8b5d7e70d853ff 003014fbe32aebf4 +8b8b5d7e70d853ff 29409290c370fbb3 +8c35b63ea0e416f8 003014fbe32aebf4 +8c35b63ea0e416f8 29409290c370fbb3 +8c74b8315a452ed4 003014fbe32aebf4 +8c74b8315a452ed4 29409290c370fbb3 +8cc2ef399c68e1e0 003014fbe32aebf4 +8cc2ef399c68e1e0 29409290c370fbb3 +8d6ec6ca914d4aca 003014fbe32aebf4 +8d6ec6ca914d4aca 29409290c370fbb3 +8d9d5331523f7131 003014fbe32aebf4 +8d9d5331523f7131 29409290c370fbb3 +8dd406037cbad7d6 003014fbe32aebf4 +8dd406037cbad7d6 29409290c370fbb3 +8dd44e4fb7e0ccda 003014fbe32aebf4 +8dd44e4fb7e0ccda 29409290c370fbb3 +8e71d5dd0634163d 003014fbe32aebf4 +8e71d5dd0634163d 29409290c370fbb3 +8ec452184db7c614 003014fbe32aebf4 +8ec452184db7c614 29409290c370fbb3 +9012452bd73f8362 003014fbe32aebf4 +9012452bd73f8362 29409290c370fbb3 +9120f4bd1b68706c 003014fbe32aebf4 +9120f4bd1b68706c 29409290c370fbb3 +91469cbd164aca18 003014fbe32aebf4 +91469cbd164aca18 29409290c370fbb3 +91fbe24d458ab15f 003014fbe32aebf4 +91fbe24d458ab15f 29409290c370fbb3 +924549389994d73c 003014fbe32aebf4 +924549389994d73c 29409290c370fbb3 +92edc9746a27d939 003014fbe32aebf4 +92edc9746a27d939 29409290c370fbb3 +930171e5a698ecb0 003014fbe32aebf4 +930171e5a698ecb0 29409290c370fbb3 +93683ad476b7d2e1 003014fbe32aebf4 +93683ad476b7d2e1 29409290c370fbb3 +938d74daef7caf9e 003014fbe32aebf4 +938d74daef7caf9e 29409290c370fbb3 +93f1b4ad7ef277a9 003014fbe32aebf4 +93f1b4ad7ef277a9 29409290c370fbb3 +95216b02a9a7dc40 003014fbe32aebf4 +95216b02a9a7dc40 29409290c370fbb3 +95e7d53ed7584047 003014fbe32aebf4 +95e7d53ed7584047 29409290c370fbb3 +9630116e931a0caf 003014fbe32aebf4 +9630116e931a0caf 29409290c370fbb3 +9717c92c548b9a52 003014fbe32aebf4 +9717c92c548b9a52 29409290c370fbb3 +973780a354d0dd71 003014fbe32aebf4 +973780a354d0dd71 29409290c370fbb3 +979181b0e49f979f 003014fbe32aebf4 +979181b0e49f979f 29409290c370fbb3 +97cf973d9f71d31a 003014fbe32aebf4 +97cf973d9f71d31a 29409290c370fbb3 +98dd8d75472885e6 003014fbe32aebf4 +98dd8d75472885e6 29409290c370fbb3 +9917eb8c593b3da7 003014fbe32aebf4 +9917eb8c593b3da7 29409290c370fbb3 +997ac1e6edd764bc 003014fbe32aebf4 +997ac1e6edd764bc 29409290c370fbb3 +99be8b2d637faa41 003014fbe32aebf4 +99be8b2d637faa41 29409290c370fbb3 +9b21c1feeab01eee 003014fbe32aebf4 +9b21c1feeab01eee 29409290c370fbb3 +9b8b89aed614281a 003014fbe32aebf4 +9b8b89aed614281a 29409290c370fbb3 +9c5cb393add3099a 003014fbe32aebf4 +9c5cb393add3099a 29409290c370fbb3 +9cdd4aa5e9b0ad25 003014fbe32aebf4 +9cdd4aa5e9b0ad25 29409290c370fbb3 +9d3680589c217e3d 003014fbe32aebf4 +9d3680589c217e3d 29409290c370fbb3 +9db77a31add7e6e7 003014fbe32aebf4 +9db77a31add7e6e7 29409290c370fbb3 +9dc6d7c6d52db5c6 003014fbe32aebf4 +9dc6d7c6d52db5c6 29409290c370fbb3 +9e44b177fc95bcdf 003014fbe32aebf4 +9e44b177fc95bcdf 29409290c370fbb3 +9e5bb361ded7fec1 003014fbe32aebf4 +9e5bb361ded7fec1 29409290c370fbb3 +9e7d815ba0bc5004 003014fbe32aebf4 +9e7d815ba0bc5004 29409290c370fbb3 +9f11a2b3be5b1317 003014fbe32aebf4 +9f11a2b3be5b1317 29409290c370fbb3 +9ff4a40f4e4d72c1 003014fbe32aebf4 +9ff4a40f4e4d72c1 29409290c370fbb3 +a0297cce3a2664cc 003014fbe32aebf4 +a0297cce3a2664cc 29409290c370fbb3 +a2827aae7cf93b1a 003014fbe32aebf4 +a2827aae7cf93b1a 29409290c370fbb3 +a2de1b9e3ed333e0 003014fbe32aebf4 +a2de1b9e3ed333e0 29409290c370fbb3 +a34248d56ac62380 003014fbe32aebf4 +a34248d56ac62380 29409290c370fbb3 +a38809153bc9f336 003014fbe32aebf4 +a38809153bc9f336 29409290c370fbb3 +a45798e7e5405bce 003014fbe32aebf4 +a45798e7e5405bce 29409290c370fbb3 +a5fe1b142e455790 003014fbe32aebf4 +a5fe1b142e455790 29409290c370fbb3 +a6570dda8e02225c 003014fbe32aebf4 +a6570dda8e02225c 29409290c370fbb3 +a6722e943cd49d24 003014fbe32aebf4 +a6722e943cd49d24 29409290c370fbb3 +a909766e4c3c5b65 003014fbe32aebf4 +a909766e4c3c5b65 29409290c370fbb3 +a9849d62a26d8be8 003014fbe32aebf4 +a9849d62a26d8be8 29409290c370fbb3 +aa25e3c5744607c7 003014fbe32aebf4 +aa25e3c5744607c7 29409290c370fbb3 +aa7e9ae5cceebd07 003014fbe32aebf4 +aa7e9ae5cceebd07 29409290c370fbb3 +aadbeef39fa4fecd 003014fbe32aebf4 +aadbeef39fa4fecd 29409290c370fbb3 +aaed1af8aecf585e 003014fbe32aebf4 +aaed1af8aecf585e 29409290c370fbb3 +ab008b65280a6dcc 003014fbe32aebf4 +ab008b65280a6dcc 29409290c370fbb3 +ac2629ecce1ec96d 003014fbe32aebf4 +ac2629ecce1ec96d 29409290c370fbb3 +ad33d76034eab219 003014fbe32aebf4 +ad33d76034eab219 29409290c370fbb3 +ad6702c9bda26e00 003014fbe32aebf4 +ad6702c9bda26e00 29409290c370fbb3 +ae0e4109b70060eb 003014fbe32aebf4 +ae0e4109b70060eb 29409290c370fbb3 +ae1a4c7b1a79f5de 003014fbe32aebf4 +ae1a4c7b1a79f5de 29409290c370fbb3 +ae362216b7a3264b 003014fbe32aebf4 +ae362216b7a3264b 29409290c370fbb3 +af4356dd3fcea48e 003014fbe32aebf4 +af4356dd3fcea48e 29409290c370fbb3 +afa437dfea94da6f 003014fbe32aebf4 +afa437dfea94da6f 29409290c370fbb3 +afcc06ac32ed22bc 003014fbe32aebf4 +afcc06ac32ed22bc 29409290c370fbb3 +b11ee5716261b91a 003014fbe32aebf4 +b11ee5716261b91a 29409290c370fbb3 +b14660d17d527147 003014fbe32aebf4 +b14660d17d527147 29409290c370fbb3 +b20d5f1ca502b96b 003014fbe32aebf4 +b20d5f1ca502b96b 29409290c370fbb3 +b3397155c49b686d 003014fbe32aebf4 +b3397155c49b686d 29409290c370fbb3 +b36ac8dfd38e7351 003014fbe32aebf4 +b36ac8dfd38e7351 29409290c370fbb3 +b3bd0a92c3852b18 003014fbe32aebf4 +b3bd0a92c3852b18 29409290c370fbb3 +b51857c9e702891e 003014fbe32aebf4 +b51857c9e702891e 29409290c370fbb3 +b573c5dd40a228f2 003014fbe32aebf4 +b573c5dd40a228f2 29409290c370fbb3 +b67cfa491cce2186 003014fbe32aebf4 +b67cfa491cce2186 29409290c370fbb3 +b72253dc348b4fc0 003014fbe32aebf4 +b72253dc348b4fc0 29409290c370fbb3 +b77aa46089eb19cc 003014fbe32aebf4 +b77aa46089eb19cc 29409290c370fbb3 +b7bd7e52f0ce3a0f 003014fbe32aebf4 +b7bd7e52f0ce3a0f 29409290c370fbb3 +bac25df2344c12b6 003014fbe32aebf4 +bac25df2344c12b6 29409290c370fbb3 +baea40ab3b7b2400 003014fbe32aebf4 +baea40ab3b7b2400 29409290c370fbb3 +bc0e9846b60db73a 003014fbe32aebf4 +bc0e9846b60db73a 29409290c370fbb3 +bcdf492944f07b1a 003014fbe32aebf4 +bcdf492944f07b1a 29409290c370fbb3 +bd62d0be7821db4d 003014fbe32aebf4 +bd62d0be7821db4d 29409290c370fbb3 +bdfd132010d67f46 003014fbe32aebf4 +bdfd132010d67f46 29409290c370fbb3 +beee5b62246fe9d9 003014fbe32aebf4 +beee5b62246fe9d9 29409290c370fbb3 +bf35982bafaad392 003014fbe32aebf4 +bf35982bafaad392 29409290c370fbb3 +bf7d3982cb787842 003014fbe32aebf4 +bf7d3982cb787842 29409290c370fbb3 +c053e0d90c05e920 003014fbe32aebf4 +c053e0d90c05e920 29409290c370fbb3 +c0693ab8b19c70c9 003014fbe32aebf4 +c0693ab8b19c70c9 29409290c370fbb3 +c095fa961fef42f7 003014fbe32aebf4 +c095fa961fef42f7 29409290c370fbb3 +c0fb5fe67a335c04 003014fbe32aebf4 +c0fb5fe67a335c04 29409290c370fbb3 +c1b2e3d056378866 003014fbe32aebf4 +c1b2e3d056378866 29409290c370fbb3 +c36c80e2342b6a3f 003014fbe32aebf4 +c36c80e2342b6a3f 29409290c370fbb3 +c3f2d89cd13798f5 003014fbe32aebf4 +c3f2d89cd13798f5 29409290c370fbb3 +c48011d4f360342b 003014fbe32aebf4 +c48011d4f360342b 29409290c370fbb3 +c4b48feb6aa428af 003014fbe32aebf4 +c4b48feb6aa428af 29409290c370fbb3 +c4fb9df6b9be6f95 003014fbe32aebf4 +c4fb9df6b9be6f95 29409290c370fbb3 +c537ca0faa209796 003014fbe32aebf4 +c537ca0faa209796 29409290c370fbb3 +c54a5d9f61c279c1 003014fbe32aebf4 +c54a5d9f61c279c1 29409290c370fbb3 +c57286ef1fde5711 003014fbe32aebf4 +c57286ef1fde5711 29409290c370fbb3 +c6651a43c886e208 003014fbe32aebf4 +c6651a43c886e208 29409290c370fbb3 +c6dd69f31fd331a7 003014fbe32aebf4 +c6dd69f31fd331a7 29409290c370fbb3 +c6efab8738be05cd 003014fbe32aebf4 +c6efab8738be05cd 29409290c370fbb3 +c7758a32b5a4077e 003014fbe32aebf4 +c7758a32b5a4077e 29409290c370fbb3 +c802fe0a8cd8de2e 003014fbe32aebf4 +c802fe0a8cd8de2e 29409290c370fbb3 +c8820ae63c6627e5 003014fbe32aebf4 +c8820ae63c6627e5 29409290c370fbb3 +c8d0df92d94249c5 003014fbe32aebf4 +c8d0df92d94249c5 29409290c370fbb3 +ca654998a0e0d5ed 003014fbe32aebf4 +ca654998a0e0d5ed 29409290c370fbb3 +ca869f9f731aa601 003014fbe32aebf4 +ca869f9f731aa601 29409290c370fbb3 +cabfe9953b061521 003014fbe32aebf4 +cabfe9953b061521 29409290c370fbb3 +cbbdea5dccfdfc00 003014fbe32aebf4 +cbbdea5dccfdfc00 29409290c370fbb3 +cd7bc819e2763806 003014fbe32aebf4 +cd7bc819e2763806 29409290c370fbb3 +ce9fb573b0eef687 003014fbe32aebf4 +ce9fb573b0eef687 29409290c370fbb3 +ceb9b40fa25e0334 003014fbe32aebf4 +ceb9b40fa25e0334 29409290c370fbb3 +cf64f4081d2719bd 003014fbe32aebf4 +cf64f4081d2719bd 29409290c370fbb3 +d0391cf29b76c91e 003014fbe32aebf4 +d0391cf29b76c91e 29409290c370fbb3 +d06883a417d22518 003014fbe32aebf4 +d06883a417d22518 29409290c370fbb3 +d1f396ef263d2116 003014fbe32aebf4 +d1f396ef263d2116 29409290c370fbb3 +d20896dc8e3ba12f 003014fbe32aebf4 +d20896dc8e3ba12f 29409290c370fbb3 +d2605ef087e446a1 003014fbe32aebf4 +d2605ef087e446a1 29409290c370fbb3 +d2fe18f2217d1d99 003014fbe32aebf4 +d2fe18f2217d1d99 29409290c370fbb3 +d302a65eee05990c 003014fbe32aebf4 +d302a65eee05990c 29409290c370fbb3 +d327cfe5bbbacd2b 003014fbe32aebf4 +d327cfe5bbbacd2b 29409290c370fbb3 +d32edce903afc320 003014fbe32aebf4 +d32edce903afc320 29409290c370fbb3 +d39266d2d141f073 003014fbe32aebf4 +d39266d2d141f073 29409290c370fbb3 +d46edf962074a484 003014fbe32aebf4 +d46edf962074a484 29409290c370fbb3 +d49701500ef16c35 003014fbe32aebf4 +d49701500ef16c35 29409290c370fbb3 +d5bd18c5953449ee 003014fbe32aebf4 +d5bd18c5953449ee 29409290c370fbb3 +d6b6df684e3a4f0b 003014fbe32aebf4 +d6b6df684e3a4f0b 29409290c370fbb3 +d7278048d5116989 003014fbe32aebf4 +d7278048d5116989 29409290c370fbb3 +d8aed7e827ac0817 003014fbe32aebf4 +d8aed7e827ac0817 29409290c370fbb3 +d96667c18c3d1d9d 003014fbe32aebf4 +d96667c18c3d1d9d 29409290c370fbb3 +d9759eec27700316 003014fbe32aebf4 +d9759eec27700316 29409290c370fbb3 +d9da67c9b7283100 003014fbe32aebf4 +d9da67c9b7283100 29409290c370fbb3 +db83bdf58f818682 003014fbe32aebf4 +db83bdf58f818682 29409290c370fbb3 +dbb2220b85bc89d4 003014fbe32aebf4 +dbb2220b85bc89d4 29409290c370fbb3 +dbdd4a4c311713f2 003014fbe32aebf4 +dbdd4a4c311713f2 29409290c370fbb3 +dbfec15f2f3704e0 003014fbe32aebf4 +dbfec15f2f3704e0 29409290c370fbb3 +dd1168979ad75928 003014fbe32aebf4 +dd1168979ad75928 29409290c370fbb3 +dd7f5569ca37bd0e 003014fbe32aebf4 +dd7f5569ca37bd0e 29409290c370fbb3 +dea3924af7d6bab7 003014fbe32aebf4 +dea3924af7d6bab7 29409290c370fbb3 +dee839d6734828da 003014fbe32aebf4 +dee839d6734828da 29409290c370fbb3 +df059ddd471f1625 003014fbe32aebf4 +df059ddd471f1625 29409290c370fbb3 +e005ab8f4502e4f8 003014fbe32aebf4 +e005ab8f4502e4f8 29409290c370fbb3 +e066d5a81aae7579 003014fbe32aebf4 +e066d5a81aae7579 29409290c370fbb3 +e0c6a0852df1e723 003014fbe32aebf4 +e0c6a0852df1e723 29409290c370fbb3 +e2f0ebe796307a0f 003014fbe32aebf4 +e2f0ebe796307a0f 29409290c370fbb3 +e2faa4237bfc09c7 003014fbe32aebf4 +e2faa4237bfc09c7 29409290c370fbb3 +e31c5472b9a02392 003014fbe32aebf4 +e31c5472b9a02392 29409290c370fbb3 +e39fba587301e272 003014fbe32aebf4 +e39fba587301e272 29409290c370fbb3 +e3b4b7cc9fe7f581 003014fbe32aebf4 +e3b4b7cc9fe7f581 29409290c370fbb3 +e3b63dda66e1cdf6 003014fbe32aebf4 +e3b63dda66e1cdf6 29409290c370fbb3 +e3dcf71f5d467eda 003014fbe32aebf4 +e3dcf71f5d467eda 29409290c370fbb3 +e516a21d097921b1 003014fbe32aebf4 +e516a21d097921b1 29409290c370fbb3 +e54a62db3d6fa8f1 003014fbe32aebf4 +e54a62db3d6fa8f1 29409290c370fbb3 +e55cdf7241b4c37b 003014fbe32aebf4 +e55cdf7241b4c37b 29409290c370fbb3 +e5a38229a95b1005 003014fbe32aebf4 +e5a38229a95b1005 29409290c370fbb3 +e7021b4cf387fd43 003014fbe32aebf4 +e7021b4cf387fd43 29409290c370fbb3 +e7687846a25a34da 003014fbe32aebf4 +e7687846a25a34da 29409290c370fbb3 +e79097551ae9aca6 003014fbe32aebf4 +e79097551ae9aca6 29409290c370fbb3 +e8562eb57530b1db 003014fbe32aebf4 +e8562eb57530b1db 29409290c370fbb3 +e87106e9c5d3826c 003014fbe32aebf4 +e87106e9c5d3826c 29409290c370fbb3 +e9390fcd0f89d286 003014fbe32aebf4 +e9390fcd0f89d286 29409290c370fbb3 +e98511d54fb82bc8 003014fbe32aebf4 +e98511d54fb82bc8 29409290c370fbb3 +eaa51ebf13679257 003014fbe32aebf4 +eaa51ebf13679257 29409290c370fbb3 +eae85c777336bce3 003014fbe32aebf4 +eae85c777336bce3 29409290c370fbb3 +eaf2df477c4919a3 003014fbe32aebf4 +eaf2df477c4919a3 29409290c370fbb3 +eaf3bc1596a04691 003014fbe32aebf4 +eaf3bc1596a04691 29409290c370fbb3 +eb03699d1d2ff7db 003014fbe32aebf4 +eb03699d1d2ff7db 29409290c370fbb3 +eb14335f4c471c0c 003014fbe32aebf4 +eb14335f4c471c0c 29409290c370fbb3 +eba8a2e7dea8ee96 003014fbe32aebf4 +eba8a2e7dea8ee96 29409290c370fbb3 +ec12ffab66265c55 003014fbe32aebf4 +ec12ffab66265c55 29409290c370fbb3 +ec2e6a4bea800289 003014fbe32aebf4 +ec2e6a4bea800289 29409290c370fbb3 +ecfb82c08ca1adb5 003014fbe32aebf4 +ecfb82c08ca1adb5 29409290c370fbb3 +ecfd669875be7073 003014fbe32aebf4 +ecfd669875be7073 29409290c370fbb3 +ed27fd9b8d01b781 003014fbe32aebf4 +ed27fd9b8d01b781 29409290c370fbb3 +ed9240b3cdb51327 003014fbe32aebf4 +ed9240b3cdb51327 29409290c370fbb3 +ee1d03f1dd7bdd27 003014fbe32aebf4 +ee1d03f1dd7bdd27 29409290c370fbb3 +ee82a709f025499b 003014fbe32aebf4 +ee82a709f025499b 29409290c370fbb3 +ef230a8b1fad34e0 003014fbe32aebf4 +ef230a8b1fad34e0 29409290c370fbb3 +f232a7250ab2d860 003014fbe32aebf4 +f232a7250ab2d860 29409290c370fbb3 +f288addb4bff850a 003014fbe32aebf4 +f288addb4bff850a 29409290c370fbb3 +f2fd6cfd0ff14a18 003014fbe32aebf4 +f2fd6cfd0ff14a18 29409290c370fbb3 +f3919c82e489b011 003014fbe32aebf4 +f3919c82e489b011 29409290c370fbb3 +f3bc48abc1137f59 003014fbe32aebf4 +f3bc48abc1137f59 29409290c370fbb3 +f3d7b5da7e812a20 003014fbe32aebf4 +f3d7b5da7e812a20 29409290c370fbb3 +f5eabfdffd8ebb91 003014fbe32aebf4 +f5eabfdffd8ebb91 29409290c370fbb3 +f67708bff2af6b1e 003014fbe32aebf4 +f67708bff2af6b1e 29409290c370fbb3 +f71613f753032bdc 003014fbe32aebf4 +f71613f753032bdc 29409290c370fbb3 +f75555232ab8c6d9 003014fbe32aebf4 +f75555232ab8c6d9 29409290c370fbb3 +f7d79b2e216932c9 003014fbe32aebf4 +f7d79b2e216932c9 29409290c370fbb3 +f85271204f42be88 003014fbe32aebf4 +f85271204f42be88 29409290c370fbb3 +f8783d3bbec69c31 003014fbe32aebf4 +f8783d3bbec69c31 29409290c370fbb3 +f8b63f0517d55324 003014fbe32aebf4 +f8b63f0517d55324 29409290c370fbb3 +f98fd91e702894bf 003014fbe32aebf4 +f98fd91e702894bf 29409290c370fbb3 +f9e2bbfbd3f28b5c 003014fbe32aebf4 +f9e2bbfbd3f28b5c 29409290c370fbb3 +fa1d30612fbae734 003014fbe32aebf4 +fa1d30612fbae734 29409290c370fbb3 +fb064fc657a7e0e9 003014fbe32aebf4 +fb064fc657a7e0e9 29409290c370fbb3 +fbb4cc245f84df08 003014fbe32aebf4 +fbb4cc245f84df08 29409290c370fbb3 +fbcd81e58fa6bf78 003014fbe32aebf4 +fbcd81e58fa6bf78 29409290c370fbb3 +fc27b3452fa63d5d 003014fbe32aebf4 +fc27b3452fa63d5d 29409290c370fbb3 +fc5ca0a7ec242066 003014fbe32aebf4 +fc5ca0a7ec242066 29409290c370fbb3 +fc63930d46014f2d 003014fbe32aebf4 +fc63930d46014f2d 29409290c370fbb3 +fc8f349c4e5a634c 003014fbe32aebf4 +fc8f349c4e5a634c 29409290c370fbb3 +fd2bb3f2a89bfda8 003014fbe32aebf4 +fd2bb3f2a89bfda8 29409290c370fbb3 +fdc856af7c36349d 003014fbe32aebf4 +fdc856af7c36349d 29409290c370fbb3 +ff48ccf774f7f2dd 003014fbe32aebf4 +ff48ccf774f7f2dd 29409290c370fbb3 diff --git a/dm/games/README.md b/dm/games/README.md index 2da5628..1fe82b6 100644 --- a/dm/games/README.md +++ b/dm/games/README.md @@ -77,6 +77,7 @@ One row per profile; the notes are each profile's `README.md`. | [Metroid Dread](010093801237C000/README.md) | `010093801237C000` | 2.1.0 | 11.4.3 | MercurySteam's engine | NVN | | [Monster Hunter Rise](0100B04011742000/README.md) | `0100B04011742000` | 16.0.2 | 11.4.3 | Capcom's RE Engine | NVN | | [Monster Train 2](010051701FB46000/README.md) | `010051701FB46000` | 1.1.1 | 18.3.5 | Unity 2022.3.54f1 IL2CPP | NVN | +| [NieR:Automata The End of YoRHa Edition](010056B015FE8000/README.md) | `010056B015FE8000` | 1.0.3 | 12.3.9 | PlatinumGames' engine | NVN | | [Octopath Traveler 0](01005270232F2000/README.md) | `01005270232F2000` | 1.0.5 | 19.3.13 | Unreal Engine 5 | NVN | | [OCTOPATH TRAVELER II](0100A3501946E000/README.md) | `0100A3501946E000` | 1.1.1 | 12.3.2 | Unreal Engine 4.27 | NVN | | [Paper Mario: The Thousand-Year Door](0100ECD018EBE000/README.md) | `0100ECD018EBE000` | 1.0.1 | 15.3.2 | Intelligent Systems' engine on NintendoWare | NVN | diff --git a/dm/gfx/nvn/dmsh_chain.h b/dm/gfx/nvn/dmsh_chain.h index 0bedafc..f5d4442 100644 --- a/dm/gfx/nvn/dmsh_chain.h +++ b/dm/gfx/nvn/dmsh_chain.h @@ -1,3 +1,3 @@ // Generated file (dm/gfx/tools/dmsh_chain.py --header): the B shader library translation chain version this source tree expects (default options), one for every game; // the host loads only /b-/. Run dmsh_chain.py --header after changing the chain's tools and commit this file with the change -#define DMSH_CHAIN "467efdfd0b62" +#define DMSH_CHAIN "20fe3d62b9f6" diff --git a/dm/gfx/nvn/hle_nvn.c b/dm/gfx/nvn/hle_nvn.c index 208cb05..2782f27 100644 --- a/dm/gfx/nvn/hle_nvn.c +++ b/dm/gfx/nvn/hle_nvn.c @@ -15,6 +15,7 @@ #include "nvn_mtl.h" #include "nvn_pace.h" #include "nvn_fstep.h" +#include "nvn_timestamp.h" #include "../../host/front.h" #include "nvn_dirty.h" #include @@ -2096,8 +2097,8 @@ NVN(nvnCommandBufferDrawTransformFeedback, void, NVNcommandBuffer *c, NVNdrawPri NVN(nvnDeviceGetTextureHandle, NVNtextureHandle, const NVNdevice *d, int tex, int samp) { (void)d; return (NVNtextureHandle)((uint64_t)(uint32_t)tex | (uint64_t)(uint32_t)samp << 20); } // Handle for texel fetches only (Monster Hunter Rise): a fetch reads the texture descriptor and no sampler, so the handle is the texture ID with sampler ID 0 NVN(nvnDeviceGetTexelFetchHandle, NVNtextureHandle, const NVNdevice *d, int tex) { (void)d; return (NVNtextureHandle)(uint64_t)(uint32_t)tex; } -// Counter timestamps are 19.2 MHz GPU ticks (nvn_mtl.m gpu_ticks: ns × 12 / 625); convert back to ns. They used to be returned as is, about 52 times smaller than GetCurrentTimestampInNanoseconds, so subtracting one from the other gave garbage -NVN(nvnDeviceGetTimestampInNanoseconds, uint64_t, const NVNdevice *d, const NVNcounterData *c) { (void)d; return c->timestamp * 625 / 12; } +// Convert the raw 614.4 MHz report to ns on the same guest clock as GetCurrentTimestampInNanoseconds. +NVN(nvnDeviceGetTimestampInNanoseconds, uint64_t, const NVNdevice *d, const NVNcounterData *c) { (void)d; return nvn_timestamp_to_ns(c->timestamp); } // Current GPU time (ns): the same clock as the counter timestamps -- the guest clock (guest_ns, nvn_mtl.m gpu_ticks) NVN(nvnDeviceGetCurrentTimestampInNanoseconds, uint64_t, const NVNdevice *d) { (void)d; return guest_ns(); } NVN(nvnDeviceRegisterFastClearColor, NVNboolean, NVNdevice *d, const float *c, NVNformat f) { (void)d; (void)c; (void)f; return 1; } diff --git a/dm/gfx/nvn/nvn_geometry.h b/dm/gfx/nvn/nvn_geometry.h index ba0e8f9..10ab4b7 100644 --- a/dm/gfx/nvn/nvn_geometry.h +++ b/dm/gfx/nvn/nvn_geometry.h @@ -71,29 +71,34 @@ static size_t nvn_geo_assemble(int prim, const uint32_t *src, size_t count, int // does not depend on Metal primitive-restart behaviour. Preserve triangle-strip // winding and the last vertex. Unwritten GS index slots are UINT_MAX. // Three dispatches, in order: geo_pack_count (a thread per invocation group counts the indices it -// emits), geo_pack_scan (one thread turns the counts into offsets and writes the indirect arguments) +// emits), geo_pack_scan (one workgroup scans contiguous chunks into ordered offsets and writes the indirect arguments) // and geo_pack_write (a thread per group writes its indices at its offset). A single thread used to // walk every group: with it, each frame that drew OCTOPATH TRAVELER II's 129,032-triangle cube shadow mesh // (drawn in runs, nvn_geometry.inc geo_split) took about 300 ms; now only the first one is long. static const char k_nvn_geo_pack_msl[] = "#include \nusing namespace metal;\n" "struct geo_pack { device const uint *src; device uint *dst; device uint *args; uint groups, stride, topology, capacity; device uint *cnt; };\n" +"static bool geo_room(constant geo_pack&j,uint o,uint k,uint n){return o<=j.capacity&&k<=j.capacity-o&&n<=j.capacity-o-k;}\n" "static uint geo_group(constant geo_pack& j, uint g, bool w, uint o) {\n" " uint a=0,b=0,n=0,k=0;\n" " for(uint i=0;i=2) {if(w && o+k+3<=j.capacity) {j.dst[o+k]=(n&1)?b:a;j.dst[o+k+1]=(n&1)?a:b;j.dst[o+k+2]=v;} k+=3;}\n" +" if(j.topology==1) {if(w && geo_room(j,o,k,1)) j.dst[o+k]=v; k+=1;}\n" +" else if(j.topology==6) {if(n) {if(w && geo_room(j,o,k,2)) {j.dst[o+k]=b;j.dst[o+k+1]=v;} k+=2;}}\n" +" else if(n>=2) {if(w && geo_room(j,o,k,3)) {j.dst[o+k]=(n&1)?b:a;j.dst[o+k+1]=(n&1)?a:b;j.dst[o+k+2]=v;} k+=3;}\n" " a=b;b=v;n++;\n" " }\n" " return k;\n" "}\n" "kernel void geo_pack_count(constant geo_pack& j [[buffer(0)]], uint g [[thread_position_in_grid]]) { if(g=d?sums[t-d]:0;threadgroup_barrier(mem_flags::mem_threadgroup);sums[t]+=a;threadgroup_barrier(mem_flags::mem_threadgroup);}\n" +" s=t?sums[t-1]:0;for(uint g=begin;g y) - (x < y); } +enum { GEO_CAPTURE_VERTICES = (256u << 20) / (144 * 4) }; +// The capture span is already bounded by its scratch allocation. A bit per +// vertex gives the same ascending unique list without sorting every reference. +// Keep an in-place sort fallback for allocation failure or a wider caller. +// order may be changed; a short destination is never partially written. +static size_t geo_capture_unique(uint32_t *order, size_t count, int restart, uint32_t restart_index, + uint32_t lo, uint64_t span, uint32_t *dst, size_t capacity) { + if (!span || span > (uint64_t)UINT32_MAX + 1 - lo) return SIZE_MAX; + for (size_t i = 0; i < count; i++) if (!(restart && order[i] == restart_index) && + (order[i] < lo || (uint64_t)order[i] - lo >= span)) return SIZE_MAX; + size_t nw = (size_t)((span + 63) / 64), n = 0; + uint64_t *bits = span <= GEO_CAPTURE_VERTICES ? calloc(nw, sizeof *bits) : NULL; + if (bits) { + for (size_t i = 0; i < count; i++) if (!(restart && order[i] == restart_index)) { + uint32_t v = order[i] - lo; bits[v >> 6] |= 1ull << (v & 63); + } + for (size_t i = 0; i < nw; i++) n += (size_t)__builtin_popcountll(bits[i]); + if (n <= capacity) for (size_t i = 0, k = 0; i < nw; i++) { + uint64_t word = bits[i]; + while (word) { dst[k++] = lo + (uint32_t)(i * 64 + __builtin_ctzll(word)); word &= word - 1; } + } + free(bits); + } else { + size_t references = 0; + for (size_t i = 0; i < count; i++) if (!(restart && order[i] == restart_index)) order[references++] = order[i]; + qsort(order, references, sizeof *order, geo_cmp_index); + for (size_t i = 0; i < references; i++) if (!i || order[i] != order[i - 1]) n++; + if (n <= capacity) for (size_t i = 0, k = 0; i < references; i++) + if (!i || order[i] != order[i - 1]) dst[k++] = order[i]; + } + return n <= capacity ? n : SIZE_MAX; +} +// Only CPU reads need a completed snapshot. Native vertex capture stays on the +// GPU and follows earlier writes through normal encoder ordering. Unknown or +// overflowing write sets always retain the conservative drain. +static int geo_cpu_hazard(uint64_t lo, uint64_t n) { + if (!n) return 0; + if (!lo || n > UINT64_MAX - lo || g_sbw_over) return 1; + return pend_hits(lo, n) || sbw_hits(lo, lo + n) || gw_live(lo, lo + n); +} +static int geo_conversion_hazard(NvShader *vs) { + for (int v = 0; v < vs->rf.nv; v++) { + int a = vs->rf.v[v].nvn; + if (a >= S.nattr || !vconv_wanted(&vs->rf, v, NULL, 0)) continue; + int st = S.attr[a].stream; + if (st < 16 && S.vbuf[st].address && geo_cpu_hazard(S.vbuf[st].address, S.vbuf[st].size)) return 1; + } + return 0; +} +// GS output -> counts -> offsets/indirect args -> packed indices stay in one +// compute encoder. Each transition needs dispatch ordering and device-memory +// visibility; full queue barriers remain at the encoder's boundaries. +static void geo_pack_encode(id ce, id __strong *pack, uint64_t job, uint32_t groups) { + enc_c_args(ce, job, 0); + for (int i = 0; i < 3; i++) { + [ce barrierAfterEncoderStages:MTLStageDispatch beforeEncoderStages:MTLStageDispatch visibilityOptions:MTL4VisibilityOptionDevice]; + enc_c_pso(ce, pack[i]); + NSUInteger threads = i == 1 ? MIN((NSUInteger)256, pack[i].maxTotalThreadsPerThreadgroup) : 64; + enc_c_dispatch(ce, i == 1 ? MTLSizeMake(1, 1, 1) : MTLSizeMake((groups + 63) / 64, 1, 1), MTLSizeMake(threads, 1, 1)); + } +} static id geo_capture_pso(NvShader *vs) { pso_key k; static const uint32_t cf[8]; pso_key_fill(&k, vs, nil, cf, 0, 0, 1, 0); k.fsfn = GEO_MARK; id ps = hm_get_id(&g_pso, &k); @@ -31,6 +92,13 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0); // Returns 0 when the draw cannot be split (the caller reports it) enum { GEO_RUN_PRIMS = 4096 }; static const uint64_t GEO_RUN_SPAN = 64ull << 20; static int g_geo_split_depth; // > 0 while geo_split draws its runs: they skip the GPU wait +static int geo_sync_cpu(int *drained) { + if (*drained) return 1; + mdi_wait(); + if (g_mdi_ev.signaledValue < g_mdi_v) return 0; + memset(g_vconv, 0, sizeof g_vconv); *drained = 1; + return 1; +} static int geo_split(NvProg *pr, const p_draw *dw, const p_draw_idx *di, int count, int instances, uint32_t first_instance) { int prim = dw ? dw->prim : di->prim, per = prim == 0 ? 1 : prim == 1 ? 2 : prim == 4 ? 3 : prim == 10 ? 4 : prim == 12 ? 6 : 0; if (!per || (di && S.restart.on) || count / per < 1) return 0; @@ -76,15 +144,13 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0) { p_draw dw = dw0 ? *dw0 : (p_draw){0}; p_draw_idx di = di0 ? *di0 : (p_draw_idx){0}; if (di0 && (di.itype < 0 || di.itype > 2)) { MLOG("[RED] geometry index type %d is invalid", di.itype); return; } uint64_t ind = dw0 ? dw.ind : di.ind; - // Indirect records and GPU-written index data need a coherent CPU snapshot - // for primitive assembly. This is deliberately a correctness path; no such - // wait is added to ordinary VS/FS draws. - int wait = ind != 0 || di0 != NULL; // CPU assembly must also see writes from earlier submissions. - for (int i = 0; i < 16; i++) if (S.vbuf[i].size && pend_hits(S.vbuf[i].address, S.vbuf[i].size)) wait = 1; - for (int i = 0; i < vs->rf.nv; i++) if (vconv_wanted(&vs->rf, i, NULL, 0)) wait = 1; if (defer_has_active()) defer_fallback(); lc_land(); rp_flush(); rp_end(); ubd_land(); - if (wait && !g_geo_split_depth) { mdi_wait(); if (g_mdi_ev.signaledValue < g_mdi_v) return; memset(g_vconv, 0, sizeof g_vconv); } + int drained = g_geo_split_depth != 0; + // Decode indirect arguments only after their CPU snapshot is safe. They + // select the index range checked below; no GPU work is encoded between the + // two checks, so a successful drain covers both and the converted streams. + if ((geo_conversion_hazard(vs) || (ind && geo_cpu_hazard(ind, dw0 ? 16 : 20))) && !geo_sync_cpu(&drained)) return; if (ind) { uint32_t a[5] = {0}; size_t n = dw0 ? 16 : 20; if (!nvn_host_readable(ind, n)) { MLOG("[RED] geometry indirect arguments are not readable"); return; } @@ -101,6 +167,7 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0) { if (count <= 0 || instances < 0) return; if (!instances) instances = 1; if (topology < 0 || count > (1 << 22)) { MLOG("[RED] geometry primitive %d or count %d exceeds the assembly path", prim, count); return; } + if (di0 && geo_cpu_hazard(di.ibuf, (uint64_t)count << di.itype) && !geo_sync_cpu(&drained)) return; NSString *key = [[NSString stringWithUTF8String:base->key] substringToIndex:16]; NvShader *gs = shader_get([key stringByAppendingFormat:@"_bg%d", topology], 2); NvShader *reader = shader_get([key stringByAppendingString:@"_bgv"], 0); @@ -115,36 +182,36 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0) { for (int i = 0; i < 3 && lib; i++) if (!(pack[i] = [g_dev newComputePipelineStateWithFunction:[lib newFunctionWithName:@(fn[i])] error:&e])) break; if (!pack[2]) { pack[0] = pack[1] = nil; MLOG("[RED] geometry index compaction: %s", e.localizedDescription.UTF8String); return; } } - uint32_t *order = malloc((size_t)count * 4), *unique = malloc((size_t)count * 4); - if (!order || !unique) { free(order); free(unique); MLOG("[RED] geometry index allocation failed"); return; } + uint32_t *order = malloc((size_t)count * 4); + if (!order) { MLOG("[RED] geometry index allocation failed"); return; } uint32_t lo = UINT32_MAX, hi = 0; size_t nu = 0; int restart = di0 && S.restart.on; int isz = di0 ? 1 << di.itype : 0; uint32_t restart_index = S.restart.index & (isz == 1 ? UINT8_MAX : isz == 2 ? UINT16_MAX : UINT32_MAX); if (di0 && (di.itype < 0 || di.itype > 2 || !nvn_host_readable(di.ibuf, (uint64_t)count * isz))) { - free(order); free(unique); MLOG("[RED] geometry index buffer is not readable"); return; + free(order); MLOG("[RED] geometry index buffer is not readable"); return; } for (int i = 0; i < count; i++) { uint32_t v = (uint32_t)i; if (di0) { v = 0; memcpy(&v, (const uint8_t *)(uintptr_t)di.ibuf + (size_t)i * isz, isz); } order[i] = v; if (restart && v == restart_index) continue; - lo = MIN(lo, v); hi = MAX(hi, v); unique[nu++] = v; + lo = MIN(lo, v); hi = MAX(hi, v); nu++; } - if (!nu) { free(order); free(unique); return; } + if (!nu) { free(order); return; } int64_t first = di0 ? (int64_t)lo + di.base_vertex : dw.first; uint64_t span = (uint64_t)hi - lo + 1; - if (first < 0 || first + span > (uint64_t)UINT32_MAX + 1) { free(order); free(unique); MLOG("[RED] geometry vertex range is outside 32-bit vertex IDs"); return; } + if (first < 0 || first + span > (uint64_t)UINT32_MAX + 1) { free(order); MLOG("[RED] geometry vertex range is outside 32-bit vertex IDs"); return; } // Normalize only after assembly, so a restart value cannot collide with a // normalized vertex number. Indexed captures use a sorted unique index list. size_t words = nvn_geo_assemble(prim, order, count, restart, restart_index, NULL, 0); int width = nvn_geo_width(topology); uint64_t np = words == SIZE_MAX ? 0 : words / width; - if (!np) { free(order); free(unique); return; } + if (!np) { free(order); return; } uint64_t groups = np * (uint64_t)instances * gs->geo_invocations; - if (groups > UINT32_MAX || span * (uint64_t)instances > (256ull << 20) / (144 * 4) || + if (groups > UINT32_MAX || span * (uint64_t)instances > GEO_CAPTURE_VERTICES || (uint64_t)first_instance + instances > (uint64_t)UINT32_MAX + 1) { - free(order); free(unique); + free(order); if (!geo_split(pr, dw0 ? &dw : NULL, dw0 ? NULL : &di, count, instances, first_instance)) MLOG("[RED] geometry draw exceeds the capture or invocation bound"); return; } uint64_t input_size = span * instances * 144 * 4; @@ -153,7 +220,7 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0) { uint64_t packed_size = groups * gs->geo_vertices * (gs->geo_output == 7 ? 3 : gs->geo_output == 6 ? 2 : 1) * 4; uint64_t total = input_size + output_size + raw_size + packed_size + groups * 4 + words * 4 + nu * 4 + 4096; if (groups > UINT32_MAX || total > (256ull << 20) || np > UINT32_MAX) { - free(order); free(unique); + free(order); if (!geo_split(pr, dw0 ? &dw : NULL, dw0 ? NULL : &di, count, instances, first_instance)) MLOG("[RED] geometry draw needs %llu MiB of scratch, above the 256 MiB bound", (unsigned long long)(total >> 20)); return; } id scratch; size_t off = arena_alloc((size_t)total, &scratch); @@ -170,10 +237,9 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0) { if (used > total) MDIE("geometry scratch size accounting"); nvn_geo_assemble(prim, order, count, restart, restart_index, pmap, words); for (size_t i = 0; i < words; i++) ((uint32_t *)pmap)[i] -= lo; - qsort(unique, nu, 4, geo_cmp_index); - size_t unique_count = 0; - for (size_t i = 0; i < nu; i++) if (!i || unique[i] != unique[i - 1]) ((uint32_t *)pcapture_ix)[unique_count++] = unique[i]; - free(order); free(unique); + size_t unique_count = di0 ? geo_capture_unique(order, count, restart, restart_index, lo, span, pcapture_ix, nu) : 0; + free(order); + if (unique_count == SIZE_MAX) { MLOG("[RED] geometry capture indices exceed their range or allocation"); return; } uint32_t vi[8] = {(uint32_t)span, (uint32_t)instances, 0, 0, (uint32_t)np, 0, 0, 0}; memcpy(pinfo, vi, 32); uint64_t ci[2] = {input, 0}; memcpy(pcapture_info, ci, 16); uint32_t cc[4] = {(uint32_t)first, (uint32_t)span, first_instance, (uint32_t)instances}; memcpy((uint8_t *)pcapture_info + 16, cc, 16); @@ -192,11 +258,8 @@ static void geo_draw(NvProg *pr, const p_draw *dw0, const p_draw_idx *di0) { g_geo_bind[0] = input; g_geo_bind[1] = output; g_geo_bind[2] = raw; g_geo_bind[3] = info; g_geo_bind[4] = map; id ce = enc_c_begin(NULL); args_dirty_all(); encode_args(ce, gs, 2, 0); enc_c_pso(ce, gs->geo_pso); - enc_c_dispatch(ce, MTLSizeMake((np + 31) / 32, instances, gs->geo_invocations), MTLSizeMake(32, 1, 1)); enc_c_end(ce); - for (int i = 0; i < 3; i++) { // count per group, offsets (one thread), write per group: each waits for the one before - ce = enc_c_begin(NULL); enc_c_pso(ce, pack[i]); enc_c_args(ce, job, 0); - enc_c_dispatch(ce, i == 1 ? MTLSizeMake(1, 1, 1) : MTLSizeMake((groups + 63) / 64, 1, 1), MTLSizeMake(i == 1 ? 1 : 64, 1, 1)); enc_c_end(ce); - } + enc_c_dispatch(ce, MTLSizeMake((np + 31) / 32, instances, gs->geo_invocations), MTLSizeMake(32, 1, 1)); + geo_pack_encode(ce, pack, job, (uint32_t)groups); enc_c_end(ce); args_dirty_all(); g_enc_pso = nil; g_enc_dss = nil; g_ed.ok = 0; swrite_note(pr); udc_note_draw(pr); g_wr_epoch++; g_mdx_epoch++; if (S.rast_discard) return; diff --git a/dm/gfx/nvn/nvn_mtl.m b/dm/gfx/nvn/nvn_mtl.m index 6674908..f5ae62b 100644 --- a/dm/gfx/nvn/nvn_mtl.m +++ b/dm/gfx/nvn/nvn_mtl.m @@ -25,16 +25,18 @@ #include "nvn_refl.h" #include "nvn_cover.h" #include "nvn_primitive.h" +#include "nvn_timestamp.h" #include "dmsh_chain.h" // DMSH_CHAIN: the translation chain version of the B shader library expected by this source tree, one for every game (beside this file, tools/dmsh_chain.py --header) #include "game_profile.h" // game profile constants (profile id, the profile's switches) // Texture slot table per stage: 0-127 the combined handles (nvnCommandBufferBindTexture), 128-255 the separate texture binds (NVN_SEPTEX_SLOT0, nvn_obj.h) #define NTEX 256 // The NVN driver's constant segments, one layout in every game (dm/gfx/tools/dmsh_build.py), byte offsets: c2 holds the combined handles at 0x20 + 8 r (41 slots up to the separate table: // past slot 31 they lie in the image table, 0x120 + 8 r, 8 slots), the separate textures at 0x168 + 8 r and the separate samplers at 0x568 + 8 r (128 each); -// c0 the storage buffer table at base + 0x10 r (address 64 bits, size 32 bits), base vertex 0x110, compute 0x310, pixel 0x510. The replay fills one DRV_SIZE buffer per segment a shader reads +// c0 the storage buffer table at base + 0x10 r (address 64 bits, size 32 bits), base vertex 0x110, compute 0x310, geometry 0x410, pixel 0x510. The replay fills one DRV_SIZE buffer per segment a shader reads enum { C2_TEX = 0x20, C2_TEX_SLOTS = 41, C2_IMG = 0x120, C2_IMG_SLOTS = 8, C2_SEPTEX = 0x168, C2_SAMP = 0x568, DRV_SIZE = 0xA00 }; _Static_assert(C2_TEX + 8 * C2_TEX_SLOTS == C2_SEPTEX && C2_SEPTEX + 8 * 128 == C2_SAMP && C2_SAMP + 8 * 128 <= DRV_SIZE && NVN_SEPTEX_SLOT0 + 128 == NTEX, "NVN driver handle tables"); -static int c0_ssbo_base(int stage) { return stage == 0 ? 0x110 : stage == 1 ? 0x510 : stage == 5 ? 0x310 : -1; } // NVN stages 0 vertex, 1 pixel, 5 compute; geometry / hull / domain never seen +// Geometry's counter/output addresses are c0+0x410/0x430 (NieR:Automata's MOVC/IADDC pairs); they use the logical NVN stage even when Metal executes a compute kernel. +static int c0_ssbo_base(int stage) { return stage == 0 ? 0x110 : stage == 1 ? 0x510 : stage == 2 ? 0x410 : stage == 5 ? 0x310 : -1; } // NVN stages 0 vertex, 1 pixel, 2 geometry, 5 compute; hull / domain never seen // The handle a texture binding of slot reg reads: as c2 holds it (encode_args fills c2 the same way), a combined slot past 31 shares its word with an image slot, and a bound image // is what lies there. A texture instruction on an image handle names such a slot: a size query of the image a compute shader writes (Unreal's GetDimensions on a RWTexture3D, // dmsh_build.py decode_tex). DRAGON QUEST VII Reimagined's volumetric lightmap indirection patch read the empty texture slot 32 there, got a 1x1 size and wrote only cell (0, 0, 0) @@ -1129,10 +1131,10 @@ void mtl_sub_event(volatile uint32_t *val, uint32_t mode, uint32_t v) { post((po void mtl_sub_counter(uint64_t addr, uint32_t type) { sbw_note(addr, 16, SBW_REPORT); post((post_op){2, NULL, 0, 0, addr, type, NULL, g_seg}); } void mtl_counter_stats(uint64_t rep[32], uint64_t rst[32]) { memcpy(rep, g_cnt_report, sizeof g_cnt_report); memcpy(rst, g_cnt_reset, sizeof g_cnt_reset); } -// Counter timestamps (19.2 MHz) are taken from the guest clock (hle_os.c guest_ns, the same source as svc GetSystemTick / cntpct): on hardware GPU timestamps and the CPU counter share one timebase, and games compare them. +// Counter timestamps (614.4 MHz) are taken from the guest clock (hle_os.c guest_ns, the same epoch as svc GetSystemTick / cntpct, whose ticks are 19.2 MHz). // They used to come from CLOCK_MONOTONIC, which keeps running while the Mac sleeps while the guest clock (mach_absolute_time) does not, so the two differed by the sleep time; once timestamps were converted to ns, Mario halved its frame rate. In graphics unit tests guest_ns is a weak definition returning 0; fall back to the monotonic clock uint64_t guest_ns(void); -static uint64_t gpu_ticks(void) { uint64_t g = guest_ns(); if (!g) { struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); g = (uint64_t)t.tv_sec * 1000000000ull + t.tv_nsec; } return g * 12 / 625; } +static uint64_t gpu_ticks(void) { uint64_t g = guest_ns(); if (!g) { struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); g = (uint64_t)t.tv_sec * 1000000000ull + t.tv_nsec; } return nvn_timestamp_from_ns(g); } // Counter timestamps by segment (profile gpu_timestamps segment; DM_NVN_GPU_TS=segment / submission overrides it). On hardware a timestamp report is written when the GPU reaches it, so two reports of one submission bracket the GPU work between them. // The host writes all reports of a submission in its completion handler; with one time for all of them a game that measures its GPU time that way reads 0 (Breath of the Wild: frame-interval controller and dynamic resolution). // In segment mode a report takes the GPU time of the segment it was encoded in (sub_cut): TIMESTAMP_TOP (0x10) that segment's GPU start, other types its GPU end. The writes stay in the last segment's handler, before the fence, @@ -1147,11 +1149,11 @@ static uint64_t gpu_s_guest_ns(double s) { // a feedback GPU time (seconds on if (s <= 0 || !g || at > now || now - at > g) return 0; return g - (now - at); } -static uint64_t rep_ticks(const post_op *o, seg_clk *sc, uint32_t last, uint64_t c0, uint64_t c1) { // the time a counter report records (19.2 MHz); c0 / c1: the last segment's GPU start / end on the guest clock +static uint64_t rep_ticks(const post_op *o, seg_clk *sc, uint32_t last, uint64_t c0, uint64_t c1) { // the time a counter report records (614.4 MHz); c0 / c1: the last segment's GPU start / end on the guest clock int top = o->type == 0x10; uint64_t ns = 0; if (sc && o->seg < last && o->seg < SEG_CLK_N) ns = atomic_load(&sc->t[o->seg][!top]); if (!ns) ns = top ? c0 : c1; - return ns ? ns * 12 / 625 : gpu_ticks(); + return ns ? nvn_timestamp_from_ns(ns) : gpu_ticks(); } // ---------- Boot instrumentation (DM_BOOTPROF=1): metallib loading, pipeline creation (both happen synchronously during replay on the submit thread), texture upload, first-frame present ---------- @@ -6741,7 +6743,7 @@ static void fb_prepare(NvProg *pr) { if (g_fb_rebind) { args_dirty_all(); g_fb_rebind = 0; } // the previous draw had a substituted binding: re-encode with the original bindings this time if (!pr || !pr->sh[1] || !R.rt.n || g_fz.active || g_defer_replaying || !fb_want(pr->sh[1]->key)) return; NvShader *fs = pr->sh[1]; - for (int i = 0; i < fs->rf.nb && g_fb_n < 4; i++) { const nvn_rbind *b = &fs->rf.b[i]; if (b->kind != NVN_RB_TEX || b->reg >= 128) continue; + for (int i = 0; i < fs->rf.nb && g_fb_n < 4; i++) { const nvn_rbind *b = &fs->rf.b[i]; if (b->kind != NVN_RB_TEX || b->reg >= NTEX) continue; int tid = (int)(tex_slot_h(S.tex[1], S.img[1], b->reg) & 0xfffff); if (!tid) continue; os_unfair_lock_lock(&g_rmu); uint64_t ser = tid < g_ntreg && g_treg[tid].ok ? g_treg[tid].t.serial : 0; os_unfair_lock_unlock(&g_rmu); if (!ser) continue; diff --git a/dm/gfx/nvn/nvn_refl.m b/dm/gfx/nvn/nvn_refl.m index dcc1d62..a1b079d 100644 --- a/dm/gfx/nvn/nvn_refl.m +++ b/dm/gfx/nvn/nvn_refl.m @@ -27,7 +27,7 @@ static int arr_len(NSString *ty, NSString **el) { return [[ty substringWithRange:NSMakeRange(NSMaxRange(c), ty.length - 1 - NSMaxRange(c))] intValue]; } -// Whether a storage buffer binding may be written: route A's reflection says so ("rw"); route B's does not, and there SPIRV-Cross types a buffer the shader never writes as const device +// Whether a storage buffer binding may be written: current B reflection carries the translator's write flag ("rw"); old samples without it fall back to SPIRV-Cross's const device qualifier. static int sbuf_rw(NSDictionary *b) { id rw = b[@"rw"]; if (rw) return [rw boolValue]; id ty = b[@"msl_type"]; return !([ty isKindOfClass:[NSString class]] && [ty hasPrefix:@"const "]); } int nvn_refl_from_json(NSDictionary *j, nvn_refl *o, char *err, int errlen) { memset(o, 0, sizeof *o); diff --git a/dm/gfx/nvn/nvn_timestamp.h b/dm/gfx/nvn/nvn_timestamp.h new file mode 100644 index 0000000..77e0441 --- /dev/null +++ b/dm/gfx/nvn/nvn_timestamp.h @@ -0,0 +1,7 @@ +// NVN counter timestamps are 614.4 MHz ticks (384 ticks per 625 ns), not the CPU's 19.2 MHz system counter. +// Keep the guest clock's epoch in both directions. Wide products avoid overflow on long host uptimes. +#pragma once +#include + +static inline uint64_t nvn_timestamp_from_ns(uint64_t ns) { return (uint64_t)((__uint128_t)ns * 384 / 625); } +static inline uint64_t nvn_timestamp_to_ns(uint64_t ticks) { return (uint64_t)((__uint128_t)ticks * 625 / 384); } diff --git a/dm/gfx/tests/.gitignore b/dm/gfx/tests/.gitignore index eb5721c..867788e 100644 --- a/dm/gfx/tests/.gitignore +++ b/dm/gfx/tests/.gitignore @@ -9,6 +9,8 @@ t_deswz_gpu t_deswz_gpu.dSYM/ t_builtin.dSYM/ t_pace +t_timestamp +t_timestamp.dSYM/ t_fstep .precommit.err .precommit_snap/ @@ -52,6 +54,8 @@ t_vbuf t_vbuf.dSYM/ t_geometry t_geometry.dSYM/ +t_feedback +t_feedback.dSYM/ t_dirty_race t_dirty_race.dSYM/ t_vin diff --git a/dm/gfx/tests/Makefile b/dm/gfx/tests/Makefile index df5ce52..faf5841 100644 --- a/dm/gfx/tests/Makefile +++ b/dm/gfx/tests/Makefile @@ -53,6 +53,8 @@ t_cover: t_cover.c ../nvn/nvn_cover.h clang -O1 -Wall -o $@ t_cover.c t_pace: t_pace.c ../nvn/nvn_pace.h clang -O1 -Wall -o $@ t_pace.c +t_timestamp: t_timestamp.c ../nvn/nvn_timestamp.h + $(CC) -std=c11 -O2 -g -Wall -Wextra -Werror -o $@ $< t_fstep: t_fstep.c ../nvn/nvn_fstep.h clang -O1 -Wall -o $@ t_fstep.c t_fuse_check: t_fuse_check.m $(MTL_T_DEP) @@ -94,6 +96,12 @@ t_vbuf: t_vbuf.m $(MTL_T_DEP) clang $(CFLAGS) -fobjc-arc -o $@ t_vbuf.m $(MTL_T_SRC) $(FW) t_geometry: t_geometry.m $(MTL_T_DEP) clang $(CFLAGS) -fobjc-arc -o $@ t_geometry.m $(MTL_T_SRC) $(FW) +t_feedback: t_feedback.m $(MTL_T_DEP) + clang $(CFLAGS) -fobjc-arc -o $@ t_feedback.m $(MTL_T_SRC) $(FW) +.PHONY: check_t_feedback +check_t_feedback: t_feedback + MTL_DEBUG_LAYER=1 ./t_feedback +run: check_t_feedback t_mip_extent: t_mip_extent.m ../nvn/hle_nvn.c ../../host/crash.c ../../host/hle_bigstack.c t_host_stubs.c $(GFX) $(GFX_H) clang $(CFLAGS) -fobjc-arc -o $@ t_mip_extent.m ../../host/crash.c ../../host/hle_bigstack.c t_host_stubs.c $(filter-out ../nvn/nvn_mtl.m,$(GFX)) $(FW) t_rt_range_shape: t_rt_range_shape.m $(MTL_T_DEP) @@ -157,7 +165,7 @@ t_stencil_view: t_stencil_view.m $(MTL_T_DEP) # The Vulkan layer (#included) over the whole NVN layer, whose device and present path it uses t_vk_desc: t_vk_desc.m ../vk/hle_vk.m $(MTL_T_DEP) clang $(CFLAGS) -I../../third_party/vulkan-headers/include -fobjc-arc -o $@ t_vk_desc.m $(MTL_T_SRC) ../nvn/nvn_mtl.m $(FW) -run: t_nvn t_dirty_slots t_dirty_race t_builtin t_vin t_tbuf2d t_deswz_gpu t_pace t_fstep t_refl t_hmap t_cover t_fuse_check t_present_crop t_reorder_chain t_defer_chain t_zskip t_xv t_ub t_vbuf t_geometry t_mip_extent t_rt_range_shape t_rt_range_ro t_rt_range t_rt_depth_ro t_pso_skey t_pso_archive t_pso_pending t_pfv t_view_levels t_view_swizzle t_vk_desc t_integer_blend t_primitive_restart t_clear_ds t_depth16_clear t_upgrade_alias t_stencil_view +run: t_nvn t_dirty_slots t_dirty_race t_builtin t_vin t_tbuf2d t_deswz_gpu t_pace t_timestamp t_fstep t_refl t_hmap t_cover t_fuse_check t_present_crop t_reorder_chain t_defer_chain t_zskip t_xv t_ub t_vbuf t_geometry t_mip_extent t_rt_range_shape t_rt_range_ro t_rt_range t_rt_depth_ro t_pso_skey t_pso_archive t_pso_pending t_pfv t_view_levels t_view_swizzle t_vk_desc t_integer_blend t_primitive_restart t_clear_ds t_depth16_clear t_upgrade_alias t_stencil_view ./t_nvn ./t_dirty_slots ./t_dirty_race @@ -166,6 +174,7 @@ run: t_nvn t_dirty_slots t_dirty_race t_builtin t_vin t_tbuf2d t_deswz_gpu t_pac ./t_tbuf2d ./t_deswz_gpu ./t_pace + ./t_timestamp ./t_fstep ./t_refl ./t_hmap diff --git a/dm/gfx/tests/t_feedback.m b/dm/gfx/tests/t_feedback.m new file mode 100644 index 0000000..cc75109 --- /dev/null +++ b/dm/gfx/tests/t_feedback.m @@ -0,0 +1,108 @@ +// Feedback snapshots and their per-draw argument substitution include separate texture slots. +#include "../nvn/nvn_mtl.m" +void *front_metal_layer(void) { return NULL; } +module_t *module_of(const void *p) { (void)p; return NULL; } +module_t g_mod[MAX_MOD]; int g_nmod; +void svc_thread_dump(void) {} +uint64_t now_ns(void) { return bp_now(); } +static int checks, failed; +#define CHECK(c, label) do { checks++; if (!(c)) { failed++; fprintf(stderr, "FAIL: %s\n", label); } } while (0) + +static id target(tex_t *t, uint64_t serial) { + *t = (tex_t){.magic=MAGIC('T','E','X',0), .serial=serial}; + t->d = (nvn_texdesc){.target=NVN_TEXTURE_TARGET_2D, .format=NVN_FORMAT_RGBA8, + .width=4, .height=4, .depth=1, .levels=1, .samples=1}; + MTLTextureDescriptor *d = tex_desc(t, 0); d.storageMode = MTLStorageModeShared; + id texture = [g_dev newTextureWithDescriptor:d]; + CHECK(texture != nil, "render target created"); + res_add(texture); mtl_tex_init(t); serial_put(serial, texture); + return texture; +} +static void clear(MTLClearColor color) { + R.clear_c[0] = 1; R.cc[0] = color; + CHECK(rp_begin() != nil, "production render pass opens"); +} +static void sample(NvShader *fs, id pipeline) { + clear(MTLClearColorMake(0, 0, 0, 1)); + enc_r_pso(g_enc, pipeline); + enc_r_viewport(g_enc, (MTLViewport){0, 0, 4, 4, 0, 1}); + CHECK(encode_args((id)g_enc, fs, 1, 0), "production fragment arguments encoded"); + enc_r_draw(g_enc, MTLPrimitiveTypeTriangle, 0, 3); + rp_end(); +} +static void readback(id t, id b, unsigned offset) { + enc_b_copy_texture_buffer(blit(), t, 0, 0, MTLOriginMake(0, 0, 0), MTLSizeMake(4, 4, 1), b, offset, 256, 1024); +} +static void pixels(id b, unsigned offset, const uint8_t want[4], const char *label) { + int valid = 1; + for (int y = 0; y < 4; y++) for (int x = 0; x < 4; x++) + valid &= !memcmp((const uint8_t *)b.contents + offset + y * 256 + x * 4, want, 4); + CHECK(valid, label); +} +static void slot_case(NvProg *pr, id pipeline, int slot, int index) { + int before = failed, tid = 600 + index; + NvShader *fs = pr->sh[1]; fs->rf.b[0].reg = slot; + tex_t source, output; + id original = target(&source, 99700 + index * 2); + id destination = target(&output, 99701 + index * 2); + mtl_reg_tex(tid, &source, NULL); + id result = [g_dev newBufferWithLength:2048 options:MTLResourceStorageModeShared]; res_add(result); + state_reset(); memset(&R, 0, sizeof R); mtl_sub_begin(); + R.has_rt = 1; R.rt.n = 1; R.rt.color[0] = &source; S.tex[1][slot] = tid; + clear(MTLClearColorMake(1, 0, 0, 1)); + fb_prepare(pr); + CHECK(!g_enc, "snapshot closes the preceding render pass"); + CHECK(g_fb_n == 1, "feedback attachment receives a snapshot"); + CHECK(g_fb_n == 1 && g_fb_src[0] == original && g_fb_use[0] != original, + "snapshot substitutes a distinct texture for the registered source"); + rp_end(); + // Overwrite the attachment after the snapshot, then render the sampled value + // into a distinct target. This makes a missing snapshot fail deterministically + // even on GPUs that happen to tolerate sampling an attached render target. + clear(MTLClearColorMake(0, 1, 0, 1)); rp_end(); + R.rt.color[0] = &output; + sample(fs, pipeline); + uint64_t bound = *(uint64_t *)((uint8_t *)fs->ab_buf.contents + fs->ab_off); + CHECK(g_fb_n == 1 && bound == g_fb_rid[0] && bound != original.gpuResourceID._impl, + "production argument buffer contains the snapshot resource ID"); + readback(destination, result, 0); + // With a different attachment the following draw restores the original binding. + fb_prepare(pr); + CHECK(g_fb_n == 0, "following draw needs no snapshot"); + sample(fs, pipeline); + bound = *(uint64_t *)((uint8_t *)fs->ab_buf.contents + fs->ab_off); + CHECK(bound == original.gpuResourceID._impl, "following draw restores the original resource ID"); + readback(destination, result, 1024); + CHECK(mtl_wait(mtl_sub_commit(), 5000000000ull), "GPU submission completed"); + CHECK(!mtl_last_commit_error(), "GPU submission has no error"); + pixels(result, 0, (const uint8_t[]){255, 0, 0, 255}, "first draw reads the red pre-overwrite snapshot"); + pixels(result, 1024, (const uint8_t[]){0, 255, 0, 255}, "following draw reads the green original attachment"); + printf("feedback slot %d: %s\n", slot, before == failed ? "PASS" : "FAIL"); + mtl_tex_release(&source); mtl_tex_release(&output); +} +int main(void) { @autoreleasepool { + setenv("DM_NVN_FB_SNAP", "0123456789abcdef", 1); + setenv("DM_NVN_TBDR", "0", 1); + mtl_init(); NSError *error = nil; + id lib = [g_dev newLibraryWithSource:@"#include \nusing namespace metal;\n" + "vertex float4 v(uint i[[vertex_id]]) { return float4(i == 1 ? 3.0 : -1.0, i == 2 ? 3.0 : -1.0, 0, 1); }\n" + "struct A {texture2d source[[id(0)]];};\n" + "fragment float4 f(float4 p[[position]], constant A&a[[buffer(0)]]) {return a.source.read(uint2(p.xy));}\n" + options:nil error:&error]; + CHECK(lib != nil, "synthetic shader compiles"); + if (!lib) { fprintf(stderr, "%s\n", error.localizedDescription.UTF8String); return 1; } + NvProg *pr = [NvProg new]; NvShader *fs = [NvShader new]; pr->sh[1] = fs; + fs->stage = 1; strcpy(fs->key, "0123456789abcdef"); fs->fn = [lib newFunctionWithName:@"f"]; + fs->ae = [fs->fn newArgumentEncoderWithBufferIndex:0]; fs->arg_len = fs->ae.encodedLength; + fs->rf.nb = 1; fs->rf.b[0] = (nvn_rbind){.kind=NVN_RB_TEX, .aid=0, .dtt=MTLTextureType2D}; + MTLRenderPipelineDescriptor *d = [MTLRenderPipelineDescriptor new]; + d.vertexFunction = [lib newFunctionWithName:@"v"]; d.fragmentFunction = fs->fn; + d.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm; + id pipeline = [g_dev newRenderPipelineStateWithDescriptor:d error:&error]; + CHECK(pipeline != nil, "synthetic render pipeline compiles"); + if (!pipeline) { fprintf(stderr, "%s\n", error.localizedDescription.UTF8String); return 1; } + const int slots[] = {0, 128, 255}; + for (int i = 0; i < 3; i++) slot_case(pr, pipeline, slots[i], i); + printf("feedback snapshot: %d checks, %d failed\n", checks, failed); + return failed != 0; +} } diff --git a/dm/gfx/tests/t_geometry.m b/dm/gfx/tests/t_geometry.m index 2823909..c57aee9 100644 --- a/dm/gfx/tests/t_geometry.m +++ b/dm/gfx/tests/t_geometry.m @@ -35,6 +35,67 @@ static void assembly(void) { EXPECT("triangle adjacency",6,nvn_geo_assemble(12,a,8,0,0,out,32)); EXPECT("unsupported",SIZE_MAX,nvn_geo_assemble(99,a,8,0,0,NULL,0)); } +static void capture_indices(void) { + uint32_t order[]={229,105,UINT32_MAX,101,164,105,102,229},want[]={101,102,105,164,229},out[8]; + memset(out,0xcc,sizeof out); + EXPECT("sparse duplicate capture count",5,geo_capture_unique(order,8,1,UINT32_MAX,100,130,out,8)); + EXPECT("ascending capture order",0,memcmp(out,want,sizeof want)); + EXPECT("capture output canary",0xcccccccc,out[5]); + memset(out,0xcc,sizeof out); + EXPECT("short capture destination rejected",SIZE_MAX,geo_capture_unique(order,8,1,UINT32_MAX,100,130,out,4)); + for(int i=0;i<8;i++)EXPECT("short capture destination untouched",0xcccccccc,out[i]); + uint32_t wide[]={UINT32_MAX,0,5,UINT32_MAX},wide_want[]={0,5,UINT32_MAX}; + EXPECT("wide-span sorted fallback",3,geo_capture_unique(wide,4,0,0,0,(uint64_t)UINT32_MAX+1,out,8)); + EXPECT("fallback capture order",0,memcmp(out,wide_want,sizeof wide_want)); + uint32_t restart[]={17,17};memset(out,0xcc,sizeof out); + EXPECT("restart-only capture",0,geo_capture_unique(restart,2,1,17,0,1,out,8)); + EXPECT("restart-only output canary",0xcccccccc,out[0]); + uint32_t invalid[]={9,11}; + EXPECT("capture below declared span rejected",SIZE_MAX,geo_capture_unique(invalid,2,0,0,10,2,out,8)); + EXPECT("capture above declared span rejected",SIZE_MAX,geo_capture_unique(invalid,2,0,0,9,2,out,8)); + EXPECT("capture address overflow rejected",SIZE_MAX,geo_capture_unique(invalid,2,0,0,UINT32_MAX,2,out,8)); + EXPECT("invalid capture output canary",0xcccccccc,out[0]); +} +static void cpu_read_proofs(void) { + // Independent hazards from each production tracker, including its unknown + // cases. Fake addresses are queried only; no CPU/GPU memory is dereferenced. + const uint64_t address=0x40000000;pend_reset();memset(g_gw,0,sizeof g_gw);g_gw_all=0;state_reset(); + EXPECT("clean CPU range",0,geo_cpu_hazard(address,64)); + for(int kind=1;kind<=3;kind++) { + pend_reset();pend_add(address+16,16,kind); + EXPECT("queued update copy or fill overlap",1,geo_cpu_hazard(address,64)); + EXPECT("unrelated queued write",0,geo_cpu_hazard(address+4096,64)); + } + pend_reset();sbw_note(address,64,SBW_GPU); + EXPECT("current shader write overlap",1,geo_cpu_hazard(address+32,4)); + EXPECT("unrelated current shader write",0,geo_cpu_hazard(address+4096,64)); + pend_reset();sbw_note(address,16,SBW_REPORT); + EXPECT("deferred CPU counter report is not current GPU data",0,geo_cpu_hazard(address,64)); + pend_reset();g_pend_over=1;EXPECT("unknown pending writes",1,geo_cpu_hazard(address,64)); + pend_reset();g_sbw_over=1;EXPECT("unknown storage writes",1,geo_cpu_hazard(address,64)); + pend_reset();gw_put(address,address+64,g_done+1,g_done); + EXPECT("previous submission live write",1,geo_cpu_hazard(address,64)); + EXPECT("unrelated previous live write",0,geo_cpu_hazard(address+4096,64)); + memset(g_gw,0,sizeof g_gw);gw_put(address,address+64,g_done,g_done); + EXPECT("completed previous write",0,geo_cpu_hazard(address,64)); + g_gw_all=g_done+1;EXPECT("previous write overflow",1,geo_cpu_hazard(address,64));g_gw_all=0; + EXPECT("CPU range overflow",1,geo_cpu_hazard(UINT64_MAX-3,8)); + EXPECT("empty CPU range",0,geo_cpu_hazard(0,0)); + NvShader *vs=[NvShader new];vs->rf.nv=1;vs->rf.v[0].nvn=0;vs->rf.v[0].ct=NVN_CT_FLOAT; + S.nattr=1;S.attr[0].stream=0;S.attr[0].fmt=0x0a;S.vbuf[0]=(NVNbufferRange){address,64}; + pend_add(address,64,2); + EXPECT("GPU-only native vertex stream does not need CPU snapshot",0,geo_conversion_hazard(vs)); + S.attr[0].fmt=0x51; + EXPECT("converted vertex stream waits for queued write",1,geo_conversion_hazard(vs)); + pend_reset();EXPECT("clean converted stream",0,geo_conversion_hazard(vs)); + sbw_note(address,64,SBW_GPU);EXPECT("converted stream current GPU write",1,geo_conversion_hazard(vs)); + pend_reset();gw_put(address,address+64,g_done+1,g_done); + EXPECT("converted stream prior GPU write",1,geo_conversion_hazard(vs)); + memset(g_gw,0,sizeof g_gw);S.attr[0].stream=1;S.vbuf[1]=(NVNbufferRange){address+4096,64};pend_add(address,64,2); + EXPECT("conversion checks its actual stream",0,geo_conversion_hazard(vs)); + pend_reset();g_sbw_over=1;EXPECT("converted stream unknown GPU write",1,geo_conversion_hazard(vs)); + pend_reset();memset(g_gw,0,sizeof g_gw);state_reset(); +} static void pack_test(void) { id l=library(@(k_nvn_geo_pack_msl)); NSError *e=nil; id p[3]; const char *fn[3]={"geo_pack_count","geo_pack_scan","geo_pack_write"}; @@ -47,8 +108,7 @@ static void pack_test(void) { nvn_geo_pack_job j={b.gpuAddress,b.gpuAddress+512,b.gpuAddress+1024,3,8,t==0?7:t==1?6:1,100,b.gpuAddress+3072}; memcpy((char*)b.contents+2048,&j,sizeof j); mtl_sub_begin(); - for(int i=0;i<3;i++) { id en=enc_c_begin(NULL); enc_c_pso(en,p[i]);enc_c_args(en,b.gpuAddress+2048,0); - enc_c_dispatch(en,MTLSizeMake(1,1,1),MTLSizeMake(i==1?1:64,1,1));enc_c_end(en); } + id en=enc_c_begin(NULL);geo_pack_encode(en,p,b.gpuAddress+2048,3);enc_c_end(en); finish(); uint32_t *args=(uint32_t*)((char*)b.contents+1024); EXPECT("compacted index count",t==0?15:t==1?18:13,args[0]); @@ -57,13 +117,206 @@ static void pack_test(void) { EXPECT("output bound sentinel",0xcccccccc,((uint32_t*)((char*)b.contents+512))[args[0]]); } } +static void pack_dependency_test(uint32_t groups) { + // A GPU producer and all three production compaction dispatches share one + // encoder. Compare every output and offset with an independent CPU list. + NSString *source=[@(k_nvn_geo_pack_msl) stringByAppendingString:@"\nstruct E{device uint*raw;uint groups;};\n" + "kernel void produce(constant E&e[[buffer(0)]],uint g[[thread_position_in_grid]]){if(g>=e.groups)return;" + "for(uint i=0;i<8;i++)e.raw[g*8+i]=(g%5&&i<4)?g*4+i:0xffffffffu;}\n"]; + id lib=library(source);NSError *error=nil;id pack[3]; + const char *names[]={"geo_pack_count","geo_pack_scan","geo_pack_write"}; + for(int i=0;i<3;i++){pack[i]=[g_dev newComputePipelineStateWithFunction:[lib newFunctionWithName:@(names[i])] error:&error];if(!pack[i])abort();} + id producer=[g_dev newComputePipelineStateWithFunction:[lib newFunctionWithName:@"produce"] error:&error];if(!producer)abort(); + size_t raw_bytes=(size_t)groups*32,packed_off=(raw_bytes+259)&~255ull,packed_bytes=(size_t)groups*24; + size_t count_off=(packed_off+packed_bytes+259)&~255ull,args_off=(count_off+(size_t)groups*4+259)&~255ull,job_off=args_off+256,emit_off=job_off+256; + id b=[g_dev newBufferWithLength:emit_off+256 options:MTLResourceStorageModeShared];res_add(b); + const uint32_t topology[]={1,6,7},width[]={1,2,3},per[]={4,6,6},order[3][6]={{0,1,2,3},{0,1,1,2,2,3},{0,1,2,2,1,3}}; + uint32_t *want=malloc(packed_bytes?packed_bytes:4),*offsets=malloc(groups?(size_t)groups*4:4);if(!want||!offsets)abort(); + for(int t=0;t<3;t++) { + uint32_t n=0;for(uint32_t g=0;g257?7:0; + for(int c=first;c<8;c++) { + uint32_t capacity=caps[c],written=n<=capacity?n:capacity-capacity%width[t]; + memset(b.contents,0xcc,b.length); + nvn_geo_pack_job job={b.gpuAddress,b.gpuAddress+packed_off,b.gpuAddress+args_off,groups,8,topology[t],capacity,b.gpuAddress+count_off}; + memcpy((char*)b.contents+job_off,&job,sizeof job);uint64_t emit[]={b.gpuAddress,groups};memcpy((char*)b.contents+emit_off,emit,sizeof emit); + mtl_sub_begin();id ce=enc_c_begin(NULL);enc_c_pso(ce,producer);enc_c_args(ce,b.gpuAddress+emit_off,0); + enc_c_dispatch(ce,MTLSizeMake((groups+63)/64,1,1),MTLSizeMake(64,1,1)); + geo_pack_encode(ce,pack,b.gpuAddress+job_off,groups);enc_c_end(ce);finish(); + uint32_t *raw=b.contents,*packed=(uint32_t*)((char*)b.contents+packed_off),*counts=(uint32_t*)((char*)b.contents+count_off),*args=(uint32_t*)((char*)b.contents+args_off); + EXPECT("parallel compaction count",written,args[0]);EXPECT("parallel compaction instance count",1,args[1]); + EXPECT("parallel compaction complete ordered output",0,memcmp(packed,want,(size_t)written*4)); + EXPECT("parallel prefix offsets for every group",0,memcmp(counts,offsets,(size_t)groups*4)); + EXPECT("GPU producer allocation canary",0xcccccccc,raw[(size_t)groups*8]); + EXPECT("parallel compaction output canary",0xcccccccc,packed[written]); + EXPECT("parallel prefix allocation canary",0xcccccccc,counts[groups]); + EXPECT("parallel indirect args canary",0xcccccccc,args[5]); + } + } + free(want);free(offsets); +} +static void scan_edges(void) { + id lib=library(@(k_nvn_geo_pack_msl));NSError *error=nil; + id scan=[g_dev newComputePipelineStateWithFunction:[lib newFunctionWithName:@"geo_pack_scan"] error:&error];if(!scan)abort(); + id b=[g_dev newBufferWithLength:32768 options:MTLResourceStorageModeShared];res_add(b); + const uint32_t sizes[]={0,1,2,31,32,33,63,64,65,255,256,257,1023},threads[]={1,32,192,256};uint32_t want[1023]; + for(int sz=0;sz<13;sz++)for(int nt=0;nt<4;nt++) { + uint32_t groups=sizes[sz],sum=0;memset(b.contents,0xcc,b.length);uint32_t *counts=b.contents; + for(uint32_t g=0;g ce=enc_c_begin(NULL);enc_c_pso(ce,scan);enc_c_args(ce,b.gpuAddress+16640,0); + enc_c_dispatch(ce,MTLSizeMake(1,1,1),MTLSizeMake(threads[nt],1,1));enc_c_end(ce);finish(); + uint32_t *args=(uint32_t*)((char*)b.contents+16384); + EXPECT("scan edge complete offsets",0,memcmp(counts,want,(size_t)groups*4)); + EXPECT("scan edge capacity count",sum<=37?sum:36,args[0]);EXPECT("scan edge counts canary",0xcccccccc,counts[groups]); + EXPECT("scan edge args canary",0xcccccccc,args[5]); + } + // Large invalid totals must not wrap back into the writable output range. + memset(b.contents,0xcc,b.length);uint32_t *counts=b.contents;counts[0]=UINT32_MAX-5;counts[1]=10;counts[2]=100; + nvn_geo_pack_job job={0,0,b.gpuAddress+16384,3,0,7,64,b.gpuAddress};memcpy((char*)b.contents+16640,&job,sizeof job); + mtl_sub_begin();id ce=enc_c_begin(NULL);enc_c_pso(ce,scan);enc_c_args(ce,b.gpuAddress+16640,0); + enc_c_dispatch(ce,MTLSizeMake(1,1,1),MTLSizeMake(256,1,1));enc_c_end(ce);finish(); + uint32_t *args=(uint32_t*)((char*)b.contents+16384); + EXPECT("overflow prefix first",0,counts[0]);EXPECT("overflow prefix second",UINT32_MAX-5,counts[1]);EXPECT("overflow prefix saturates",UINT32_MAX,counts[2]); + EXPECT("overflow total stays capacity bounded",63,args[0]);EXPECT("overflow scan counts canary",0xcccccccc,counts[3]); + // Exercise the production write bound with an offset whose addition used + // to wrap. All output bytes must remain untouched. + id write=[g_dev newComputePipelineStateWithFunction:[lib newFunctionWithName:@"geo_pack_write"] error:&error];if(!write)abort(); + uint32_t *raw=(uint32_t*)((char*)b.contents+4096);raw[0]=0;raw[1]=1;raw[2]=2;counts[0]=UINT32_MAX-1; + job=(nvn_geo_pack_job){b.gpuAddress+4096,b.gpuAddress+8192,b.gpuAddress+16384,1,3,7,8,b.gpuAddress};memcpy((char*)b.contents+16640,&job,sizeof job); + mtl_sub_begin();ce=enc_c_begin(NULL);enc_c_pso(ce,write);enc_c_args(ce,b.gpuAddress+16640,0); + enc_c_dispatch(ce,MTLSizeMake(1,1,1),MTLSizeMake(64,1,1));enc_c_end(ce);finish(); + uint32_t *output=(uint32_t*)((char*)b.contents+8192);for(int i=0;i<9;i++)EXPECT("overflow offset never writes output",0xcccccccc,output[i]); +} +static void passthrough_bounds(NSArray *layouts) { + // The synthetic emitter uses the translator's topology-specific bound; + // allocations and compaction consume metadata from output_layout(). Old + // header-only metadata overwrites both canaries and compacts the wrong span. + const uint32_t vertices[]={1,2,2,3,3};const int groups=3; + EXPECT("five passthrough topology layouts",5,layouts.count);if(layouts.count!=5)return; + id packlib=library(@(k_nvn_geo_pack_msl));NSError *error=nil; + id pack[3];const char *names[]={"geo_pack_count","geo_pack_scan","geo_pack_write"}; + for(int i=0;i<3;i++){pack[i]=[g_dev newComputePipelineStateWithFunction:[packlib newFunctionWithName:@(names[i])] error:&error];if(!pack[i])abort();} + id b=[g_dev newBufferWithLength:32768 options:MTLResourceStorageModeShared];res_add(b); + for(int t=0;t<5;t++) { + NSDictionary *layout=layouts[t];uint32_t bound=[layout[@"vertices"] unsignedIntValue],stride=[layout[@"index_stride"] unsignedIntValue],topology=[layout[@"output"] unsignedIntValue]; + if(bound>100||stride>200){EXPECT("bounded fixture layout",1,0);continue;} + id emitlib=library([NSString stringWithFormat:@"#include \nusing namespace metal;\n" + "struct A{device uint*raw;device float4*vertices;};\n" + "kernel void emit(constant A&a[[buffer(0)]],uint g[[thread_position_in_grid]]){const uint nv=%u;" + "for(uint v=0;v emit=[g_dev newComputePipelineStateWithFunction:[emitlib newFunctionWithName:@"emit"] error:&error];if(!emit)abort(); + memset(b.contents,0xcc,b.length);uint64_t emitargs[]={b.gpuAddress,b.gpuAddress+16384};memcpy((char*)b.contents+28672,emitargs,sizeof emitargs); + nvn_geo_pack_job job={b.gpuAddress,b.gpuAddress+4096,b.gpuAddress+8192,groups,stride,topology,100,b.gpuAddress+12288};memcpy((char*)b.contents+28928,&job,sizeof job); + mtl_sub_begin();id en=enc_c_begin(NULL);enc_c_pso(en,emit);enc_c_args(en,b.gpuAddress+28672,0); + enc_c_dispatch(en,MTLSizeMake(groups,1,1),MTLSizeMake(1,1,1)); + geo_pack_encode(en,pack,b.gpuAddress+28928,groups);enc_c_end(en);finish(); + uint32_t *raw=b.contents,*output=(uint32_t*)((char*)b.contents+16384),*indices=(uint32_t*)((char*)b.contents+4096),*args=(uint32_t*)((char*)b.contents+8192); + EXPECT("passthrough raw allocation canary",0xcccccccc,raw[groups*stride]); + EXPECT("passthrough vertex allocation canary",0xcccccccc,output[groups*bound*4]); + EXPECT("passthrough compacted count",groups*vertices[t],args[0]); + for(unsigned i=0;i l, NSString *name, int stage, const int *helpers, int n) { NvShader *s=[NvShader new];s->stage=stage;s->fn=[l newFunctionWithName:name];s->rf.nb=n; if(n) {s->ae=[s->fn newArgumentEncoderWithBufferIndex:0];s->arg_len=s->ae.encodedLength;} for(int i=0;irf.b[i]=(nvn_rbind){.kind=NVN_RB_GEOMETRY,.reg=helpers[i],.aid=i}; return s; } +static void storage_buffers(void) { + // Exercise the production JSON conversion and argument encoder: geometry + // keeps NVN stage 2 even though this function runs as a Metal kernel. + id l=library(@"#include \nusing namespace metal;\n" + "struct A {constant uint*driver[[id(0)]];device uint*output[[id(1)]];};\n" + "kernel void table(constant A&a[[buffer(0)]]) {for(uint i=0;i<3;i++){a.output[i]=a.driver[0x104+i];a.output[3+i]=a.driver[0x10c+i];}}\n"); + int helpers[]={0,0};NvShader *s=shader(l,@"table",2,helpers,2);char error[160]={0}; + NSDictionary *json=@{@"route":@"B",@"bindings":@[ + @{@"kind":@"drvcb",@"bank":@0,@"arg_id":@0,@"msl_name":@"gp_c0",@"msl_type":@"constant uint*"}, + @{@"kind":@"sbuf",@"reg":@2,@"arg_id":@1,@"msl_name":@"gp_s1",@"msl_type":@"device uint*",@"rw":@YES}]}; + EXPECT("geometry storage reflection",0,nvn_refl_from_json(json,&s->rf,error,sizeof error)); + EXPECT("geometry storage write flag",1,s->rf.b[1].rw); + NSDictionary *readonly=@{@"route":@"B",@"bindings":@[ + @{@"kind":@"sbuf",@"reg":@2,@"arg_id":@0,@"msl_name":@"gp_s1",@"msl_type":@"device uint*",@"rw":@NO}]}; + nvn_refl rr;EXPECT("explicit read-only reflection",0,nvn_refl_from_json(readonly,&rr,error,sizeof error)); + EXPECT("explicit read-only flag overrides device qualifier",0,rr.b[0].rw); + uint8_t *data;if(posix_memalign((void**)&data,getpagesize(),12288))abort();memset(data,0xcc,12288);mtl_pool_add(data,12288); + state_reset();S.ssbo[2][0]=(p_bind_buf){.stage=2,.index=0,.addr=(uint64_t)data,.size=123}; + S.ssbo[2][2]=(p_bind_buf){.stage=2,.index=2,.addr=(uint64_t)(data+4096),.size=64}; + S.ssbo[5][0]=(p_bind_buf){.stage=5,.index=0,.addr=(uint64_t)(data+8192),.size=99}; + NSError *e=nil;id ps=[g_dev newComputePipelineStateWithFunction:s->fn error:&e];if(!ps)abort(); + mtl_sub_begin();id en=enc_c_begin(NULL);args_dirty_all();encode_args(en,s,2,0);enc_c_pso(en,ps); + EXPECT("geometry storage write tracked",1,sbw_hits((uint64_t)(data+4096),(uint64_t)(data+4096)+24)); + enc_c_dispatch(en,MTLSizeMake(1,1,1),MTLSizeMake(1,1,1));enc_c_end(en);finish(); + uint64_t row0=0,row2=0;uint32_t *out=(uint32_t*)(data+4096);memcpy(&row0,out,8);memcpy(&row2,out+3,8); + EXPECT("geometry c0 row 0 guest address",(uint64_t)data,row0);EXPECT("geometry c0 row 0 size",123,out[2]); + EXPECT("geometry c0 row 2 guest address",(uint64_t)(data+4096),row2);EXPECT("geometry c0 row 2 size",64,out[5]); + mtl_pool_del(data);mtl_drain();free(data); +} +static void passthrough_kernels(const char *directory) { + // Actual EXIT-only Maxwell passthrough shaders, compiled by dmsh_xlate. + // Positions and all unmodified generic attributes must survive compute + // lowering, with adjacency removed and instances kept independent. + const uint32_t widths[]={1,2,4,3,6},vertices[]={1,2,2,3,3}; + const uint32_t source_vertex[5][3]={{0},{0,1},{1,2},{0,1,2},{0,2,4}}; + const uint32_t primitives=3,instances=2,groups=primitives*instances; + id packlib=library(@(k_nvn_geo_pack_msl));NSError *error=nil; + id pack[3];const char *names[]={"geo_pack_count","geo_pack_scan","geo_pack_write"}; + for(int i=0;i<3;i++){pack[i]=[g_dev newComputePipelineStateWithFunction:[packlib newFunctionWithName:@(names[i])] error:&error];if(!pack[i])abort();} + for(int t=0;t<5;t++) { + fprintf(stderr,"compiled passthrough topology %d\n",t); + NSString *stem=[@(directory) stringByAppendingPathComponent:[NSString stringWithFormat:@"pass%d",t]]; + NSData *data=[NSData dataWithContentsOfFile:[stem stringByAppendingString:@".json"]]; + NSDictionary *json=data?[NSJSONSerialization JSONObjectWithData:data options:0 error:&error]:nil; + id lib=[g_dev newLibraryWithURL:[NSURL fileURLWithPath:[stem stringByAppendingString:@".macosx.metallib"]] error:&error]; + EXPECT("compiled passthrough fixture loaded",1,json&&lib);if(!json||!lib)continue; + NvShader *s=shader(lib,@"main0",2,NULL,0);char message[160]={0}; + EXPECT("passthrough reflection",0,nvn_refl_from_json(json,&s->rf,message,sizeof message)); + s->ae=[s->fn newArgumentEncoderWithBufferIndex:0];s->arg_len=s->ae.encodedLength; + NSDictionary *layout=json[@"geometry"]; + uint32_t bound=[layout[@"vertices"] unsignedIntValue],stride=[layout[@"stride"] unsignedIntValue],index_stride=[layout[@"index_stride"] unsignedIntValue]; + EXPECT("passthrough topology bound",vertices[t],bound);EXPECT("passthrough complete generic map",133,stride); + if(bound!=vertices[t]||stride!=133||index_stride!=vertices[t]*2)continue; + id pipeline=[g_dev newComputePipelineStateWithFunction:s->fn error:&error]; + if(!pipeline){fprintf(stderr,"passthrough topology %d: %s\n",t,error.localizedDescription.UTF8String);abort();} + id b=[g_dev newBufferWithLength:65536 options:MTLResourceStorageModeShared];res_add(b);memset(b.contents,0xcc,b.length); + const uint32_t count=primitives*widths[t];float *in=b.contents; + for(unsigned i=0;i en=enc_c_begin(NULL);args_dirty_all();encode_args(en,s,2,0);enc_c_pso(en,pipeline); + enc_c_dispatch(en,MTLSizeMake(1,instances,1),MTLSizeMake(32,1,1)); + geo_pack_encode(en,pack,b.gpuAddress+54016,groups);enc_c_end(en);finish(); + float *out=(float*)((char*)b.contents+32768);uint32_t *raw=(uint32_t*)((char*)b.contents+49152),*packed=(uint32_t*)((char*)b.contents+50176),*args=(uint32_t*)((char*)b.contents+53248); + for(unsigned g=0;g=16?5:3; + int conversion=mode==12||mode==13,native_stream=mode==11; id l=library(@"#include \nusing namespace metal;\n" "struct C {device float *dst;uint4 info;};\n" "vertex void capture(uint v[[vertex_id]],uint i[[instance_id]],constant C&c[[buffer(13)]]) {uint n=v-c.info.x,inst=i-c.info.z;device float*p=c.dst+(inst*c.info.y+n)*144; p[0]=float(n);p[1]=float(inst);p[2]=0;p[3]=1;}\n" @@ -71,14 +324,16 @@ static void replay(int mode) { "struct G{device const float*in[[id(0)]];device float4*out[[id(1)]];device uint*ix[[id(2)]];constant uint4*info[[id(3)]];device const uint*map[[id(4)]];};\n" "kernel void geometry(constant G&g[[buffer(0)]],uint3 t[[thread_position_in_grid]]) {if(t.x>=g.info[1].x||t.y>=g.info[0].y)return;uint k=(t.y*g.info[1].x+t.x)*2+t.z;uint v=g.map[t.x];float2 q=float2(g.in[(t.y*g.info[0].x+v)*144],g.in[(t.y*g.info[0].x+v)*144+1]);float2 a=q*0.5-0.9;float2 d[4]={float2(0),float2(.4,0),float2(0,.4),float2(.4)};for(uint n=0;n<4;n++){g.out[k*4+n]=float4(a+d[n],0,1);g.ix[k*5+n]=k*4+n;}g.ix[k*5+4]=0xffffffffu;}\n" "struct V{device const float4*p[[id(0)]];};vertex float4 reader(uint v[[vertex_id]],constant V&a[[buffer(0)]]){return a.p[v];}\n" - "fragment float4 red(){return float4(1,0,0,1);}\n"); + "fragment float4 red(){return float4(1,0,0,1);}\n" + "kernel void index_write(device uint*p[[buffer(0)]]){p[0]=12;p[1]=10;p[2]=0xffffffffu;p[3]=11;}\n"); int helpers[]={0,1,2,3,4}, rh[]={1}; NvProg *pr=[NvProg new];pr->sh[0]=shader(l,@"unused",0,NULL,0);pr->sh[0]->geo_fn=[l newFunctionWithName:@"capture"]; pr->sh[1]=shader(l,@"red",1,NULL,0);pr->sh[2]=shader(l,@"geometry",2,helpers,5); + if(conversion||native_stream){pr->sh[0]->rf.nv=1;pr->sh[0]->rf.v[0].ct=NVN_CT_FLOAT;pr->sh[0]->rf.v[0].nvn=pr->sh[0]->rf.v[0].loc=0;} NvShader *gs=pr->sh[2];strcpy(gs->key,"0123456789abcdef_b");gs->geo_vertices=4;gs->geo_invocations=2;gs->geo_output=7;gs->geo_stride=4;gs->geo_index_stride=5; g_shcache=[NSMutableDictionary dictionary];g_shcache[@"0123456789abcdef_bg0"]=gs;g_shcache[@"0123456789abcdef_bgv"]=shader(l,@"reader",0,rh,1); static NSMutableArray *keep;if(!keep)keep=[NSMutableArray array];[keep addObject:pr];[keep addObject:g_shcache[@"0123456789abcdef_bgv"]]; - static prog_t cp[7];cp[mode].serial=8700+mode;serial_put(cp[mode].serial,pr); + static prog_t cp[18];cp[mode].serial=8700+mode;serial_put(cp[mode].serial,pr); tex_t target={.magic=MAGIC('T','E','X',0),.serial=8800+mode};target.d.width=target.d.height=32;target.d.depth=target.d.samples=target.d.levels=1;target.d.target=NVN_TEXTURE_TARGET_2D;target.d.format=NVN_FORMAT_RGBA8; uint8_t *commands; if(posix_memalign((void**)&commands,getpagesize(),65536))abort();memset(commands,0,65536);mtl_pool_add(commands,65536); size_t used=0; @@ -87,28 +342,70 @@ static void replay(int mode) { p_viewports vp={.n=1};vp.v[0][2]=vp.v[0][3]=32;EMIT(OP_VIEWPORTS,vp);p_scissor sc={0,0,32,32};EMIT(OP_SCISSOR,sc); p_clear_color cl={.index=0,.mask=15,.rgba={0,0,0,1}};EMIT(OP_CLEAR_COLOR,cl); p_bind_program bp={&cp[mode],7};EMIT(OP_BIND_PROGRAM,bp); - p_draw d={.prim=0,.first=7,.count=mode==6?9000:3,.instances=2,.base_instance=5}; - if((mode>=1&&mode<=3)||mode==5) { - int type=mode==5?1:mode-1;uint32_t ix[]={12,10,UINT32_MAX,11}; + if(conversion||native_stream) { + p_bind_vattr va={.n=1};va_st attribute={.fmt=conversion?0x51:0x0a};memcpy(va.st,&attribute,4);EMIT(OP_BIND_VATTR,va); + p_bind_vstream stream={.n=1};stream.st[0].stride=conversion?1:4;EMIT(OP_BIND_VSTREAM,stream); + p_bind_vbuf vb={.n=1};vb.r[0]=(NVNbufferRange){(uint64_t)(commands+24576),64};EMIT(OP_BIND_VBUF,vb); + memset(commands+24576,conversion?17:0,64); + } + p_draw d={.prim=0,.first=7,.count=kind==6?9000:3,.instances=2,.base_instance=5}; + if((kind>=1&&kind<=3)||kind==5) { + int type=kind==5?1:kind-1;uint32_t ix[]={12,10,UINT32_MAX,11}; for(int i=0;i<4;i++)memcpy(commands+8192+(i< writer; + if(mode==8||mode==9){NSError *error=nil;writer=[g_dev newComputePipelineStateWithFunction:[l newFunctionWithName:@"index_write"] error:&error];if(!writer)abort();} + id gate; + if(mode==9) { + // Hold a previous submission live until this draw reaches its hazard + // check; a completed prior write correctly needs no second wait. + gate=[g_dev newSharedEvent];rec_drain();[g_q4 waitForEvent:gate value:1]; + mtl_sub_begin();id en=enc_c_begin(NULL);enc_c_pso(en,writer); + uint64_t gpu,offset;void *buffer;mtl_gpu_addr((uint64_t)(commands+8192),16,&buffer,&offset,&gpu);enc_c_args(en,gpu,0); + enc_c_dispatch(en,MTLSizeMake(1,1,1),MTLSizeMake(1,1,1));enc_c_end(en);sbw_note((uint64_t)(commands+8192),16,SBW_GPU); + mtl_sub_commit();rec_drain(); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW,500000000),dispatch_get_global_queue(QOS_CLASS_USER_INITIATED,0),^{gate.signaledValue=1;}); + } + state_reset();memset(&R,0,sizeof R);mtl_sub_begin();uint64_t waits=g_mdi_v; + if(mode==8) { + id en=enc_c_begin(NULL);enc_c_pso(en,writer); + uint64_t gpu,offset;void *buffer;mtl_gpu_addr((uint64_t)(commands+8192),16,&buffer,&offset,&gpu);enc_c_args(en,gpu,0); + enc_c_dispatch(en,MTLSizeMake(1,1,1),MTLSizeMake(1,1,1));enc_c_end(en);sbw_note((uint64_t)(commands+8192),16,SBW_GPU); + } + if(mode==14)g_sbw_over=1; + if(mode==15)g_pend_over=1; + uint64_t h=(uint64_t)commands;mtl_sub_index(&h,1);mtl_exec(commands); + char wait_name[80];snprintf(wait_name,sizeof wait_name,"geometry CPU snapshot wait mode %d",mode); + EXPECT(wait_name,mode==7||mode==8||mode==9||mode==13||mode>=14,g_mdi_v-waits); + if(conversion) { + float first=-1;for(int i=0;i<64;i++)if(g_vconv[i].serial==g_sub_serial&&g_vconv[i].addr==(uint64_t)(commands+24576)) + for(NvArena *a in g_sub_arenas)if(g_vconv[i].gpu>=a->gpu&&g_vconv[i].gpu+4<=a->gpu+a->buf.length)memcpy(&first,(char*)a->buf.contents+g_vconv[i].gpu-a->gpu,4); + EXPECT("CPU conversion sees the queued GPU write",1,first==17); + } id b=[g_dev newBufferWithLength:4096 options:MTLResourceStorageModeShared]; uint32_t *args=NULL;id argsBuffer; for(NvArena *a in g_sub_arenas)if(g_geo_args>=a->gpu&&g_geo_args+20<=a->gpu+a->buf.length){argsBuffer=a->buf;args=(uint32_t*)((char*)argsBuffer.contents+g_geo_args-a->gpu);} [blit() copyFromTexture:tex_mtl(&target) sourceSlice:0 sourceLevel:0 sourceOrigin:MTLOriginMake(0,0,0) sourceSize:MTLSizeMake(32,32,1) toBuffer:b destinationOffset:0 destinationBytesPerRow:128 destinationBytesPerImage:4096];finish(); - EXPECT("two GS invocations per input primitive",mode==6?216000:72,args?args[0]:0); + EXPECT("two GS invocations per input primitive",kind==6?216000:72,args?args[0]:0); int red=0;uint8_t *px=b.contents;for(int i=0;i<1024;i++)if(px[i*4]>200)red++; - EXPECT("expanded quads rasterized",mode==6?288:216,red); + EXPECT("expanded quads rasterized",kind==6?288:216,red); EXPECT("each instance has independent capture and output",1,px[(24*32+4)*4]>200); mtl_pool_del(commands);mtl_drain();free(commands); } @@ -176,7 +473,12 @@ static void translated(const char *directory) { mtl_pool_del(uniforms);mtl_drain();free(uniforms); } int main(int argc,char **argv) {@autoreleasepool { - setvbuf(stdout,NULL,_IONBF,0);assembly();mtl_init();pack_test();for(int mode=0;mode<7;mode++)replay(mode); - if(argc>1)translated(argv[1]); + setvbuf(stdout,NULL,_IONBF,0);assembly();capture_indices();mtl_init();storage_buffers();cpu_read_proofs();pack_test(); + scan_edges();pack_dependency_test(3);pack_dependency_test(257);pack_dependency_test(129032);for(int mode=0;mode<18;mode++)replay(mode); + if(argc>2&&!strcmp(argv[1],"--passthrough-layouts")) { + NSData *data=[NSData dataWithContentsOfFile:@(argv[2])];NSArray *layouts=data?[NSJSONSerialization JSONObjectWithData:data options:0 error:nil]:nil; + passthrough_bounds(layouts); + } else if(argc>2&&!strcmp(argv[1],"--passthrough-kernels"))passthrough_kernels(argv[2]); + else if(argc>1)translated(argv[1]); printf("t_geometry: %d checks, %d failed\n",checks,failed);return failed!=0; }} diff --git a/dm/gfx/tests/t_nvn.c b/dm/gfx/tests/t_nvn.c index 27b489b..6cc9114 100644 --- a/dm/gfx/tests/t_nvn.c +++ b/dm/gfx/tests/t_nvn.c @@ -202,9 +202,11 @@ int main(void) { P(nvnQueueBuilderSetQueueMemory)(&qb, qmem, qsz); EXPECT("QueueInitialize succeeds", 1, P(nvnQueueInitialize)(&q, &qb)); NVNcommandHandle hs[2] = {h1, h2}; + uint64_t counter_before = now_ns(); P(nvnQueueSubmitCommands)(&q, 2, hs); NVNsync sf; P(nvnSyncInitialize)(&sf, &dev); P(nvnQueueFenceSync)(&q, &sf, NVN_SYNC_CONDITION_ALL_GPU_COMMANDS_COMPLETE, 0); int wr = P(nvnSyncWait)(&sf, 5000000000ull); + uint64_t counter_after = now_ns(); EXPECT("fence wait after submit succeeds (0 or 1)", 1, wr == 0 || wr == 1); int ub_ok = 1; for (int k = 0; k < 20; k++) for (int i = 0; i < 16; i++) { uint32_t w; memcpy(&w, ub + k * 64 + i * 4, 4); ub_ok &= w == (uint32_t)(k * 100 + i); } @@ -213,6 +215,11 @@ int main(void) { EXPECT("buffer copy 64 B identical", 0, memcmp(src, dst, 64)); uint64_t ts[2]; memcpy(ts, cnt, 16); EXPECT("counter timestamp written (non-zero)", 1, ts[0] != 0 && ts[0] == ts[1]); + NVNcounterData fixed_counter = {0, 614400}; + EXPECT("614400 raw counter ticks = 1 ms", 1000000, P(nvnDeviceGetTimestampInNanoseconds)(&dev, &fixed_counter)); + NVNcounterData reported_counter; memcpy(&reported_counter, cnt, sizeof reported_counter); + uint64_t counter_ns = P(nvnDeviceGetTimestampInNanoseconds)(&dev, &reported_counter); + EXPECT("report converted to ns lies inside submit/wait", 1, counter_ns + 2 >= counter_before && counter_ns <= counter_after); // 5a. Command memory per recording, as GetCommandMemoryUsed reports it (games size prerecorded command blocks by it: Breath of the Wild records one scratch draw per mesh): // no BEGIN record, a plain indexed draw without the indirect / multi-draw fields, and the handle is the first record; an indirect draw keeps its address diff --git a/dm/gfx/tests/t_timestamp.c b/dm/gfx/tests/t_timestamp.c new file mode 100644 index 0000000..835baa0 --- /dev/null +++ b/dm/gfx/tests/t_timestamp.c @@ -0,0 +1,49 @@ +// NVN raw timestamp ABI: known vectors, long uptimes and an independent game's inline conversion. +#include "../nvn/nvn_timestamp.h" +#include + +static int checks, fails; +#define CHECK(c, why) do { checks++; if (!(c)) { fails++; fprintf(stderr, "FAIL: %s\n", why); } } while (0) + +// NieR:Automata 1.0.3 main build 3c10ec35c5ef4c3686b4053afb0e58e7, main+0x9ba7a8..0x9ba808. +// These are its integer instructions, including the two multiply-high divisions, before SCVTF / FDIV by 1000. +// The consumer never calls our conversion helper: 614400 raw ticks must become 1 ms in its own arithmetic. +static float nier_dr_ms(uint64_t ticks) { + uint64_t a = ticks * 625; + a = (uint64_t)((__uint128_t)a * UINT64_C(0xaaaaaaaaaaaaaaab) >> 64); + uint64_t b = (a >> 8) & UINT32_MAX; + a >>= 40; + uint64_t c = a * UINT64_C(0xe353f7cf); + uint64_t d = b * UINT64_C(0xe353f7cf); + d = c + (d >> 32); + a *= UINT64_C(0x20c49ba5); + b *= UINT64_C(0x20c49ba5); + b += (uint32_t)d; + a += d >> 32; + a += b >> 32; + return (float)(int64_t)(a >> 7) / 1000.0f; +} + +int main(void) { + const struct { uint64_t ns, ticks; } exact[] = { + {0, 0}, {625, 384}, {1000000, 614400}, {16000000, 9830400}, {1000000000, 614400000}, + {UINT64_C(5000000000000000000), UINT64_C(3072000000000000000)}, + }; + for (unsigned i = 0; i < sizeof exact / sizeof *exact; i++) { + CHECK(nvn_timestamp_from_ns(exact[i].ns) == exact[i].ticks, "known ns -> 614.4 MHz ticks"); + CHECK(nvn_timestamp_to_ns(exact[i].ticks) == exact[i].ns, "known raw ticks -> ns"); + } + CHECK(nvn_timestamp_from_ns(1) == 0 && nvn_timestamp_from_ns(2) == 1, "ns -> ticks rounds down"); + CHECK(nvn_timestamp_to_ns(1) == 1 && nvn_timestamp_to_ns(2) == 3, "ticks -> ns rounds down"); + const uint64_t ns[] = {1, 2, 624, 626, 16666667, UINT64_C(1234567890123456789), UINT64_MAX}; + for (unsigned i = 0; i < sizeof ns / sizeof *ns; i++) { + uint64_t back = nvn_timestamp_to_ns(nvn_timestamp_from_ns(ns[i])); + CHECK(back <= ns[i] && ns[i] - back <= 2, "ns round trip loses at most 2 ns, including long uptime"); + } + CHECK(nier_dr_ms(614400) == 1.0f, "independent NieR raw counter conversion: 614400 ticks = 1 ms"); + CHECK(nier_dr_ms(nvn_timestamp_from_ns(16000000)) == 16.0f, "NieR sees a 16 ms GPU report as 16 ms"); + CHECK(nier_dr_ms(nvn_timestamp_from_ns(1000000000)) == 1000.0f, "NieR sees a 1 second GPU report as 1000 ms"); + CHECK(nier_dr_ms(307200) == 0.5f, "old 19.2 MHz report of 16 ms was read as 0.5 ms"); + printf("timestamp: %d checks, %d failed\n", checks, fails); + return fails != 0; +} diff --git a/dm/gfx/tests/test_dmsh_geometry.py b/dm/gfx/tests/test_dmsh_geometry.py new file mode 100644 index 0000000..e82511c --- /dev/null +++ b/dm/gfx/tests/test_dmsh_geometry.py @@ -0,0 +1,236 @@ +"""Synthetic geometry lowering, compiler and optional native GPU regressions.""" +import ast +import json +import os +from pathlib import Path +import re +import shutil +import struct +import subprocess +import sys +import tempfile +import unittest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / 'tools')) +import dmsh_geometry + +RASTER_CHECK = r'''#import +#import +int main(int argc, const char **argv) { @autoreleasepool { + id device = MTLCreateSystemDefaultDevice(); + if (!device) { fprintf(stderr, "no Metal device\n"); return 77; } + NSError *error = nil; + id library = [device newLibraryWithURL:[NSURL fileURLWithPath:@(argv[1])] error:&error]; + if (!library) { fprintf(stderr, "%s\n", error.description.UTF8String); return 1; } + MTLRenderPipelineDescriptor *pipeline = [MTLRenderPipelineDescriptor new]; + pipeline.vertexFunction = [library newFunctionWithName:@(argv[2])]; + pipeline.fragmentFunction = [library newFunctionWithName:@"pixel"]; + pipeline.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm; + id state = [device newRenderPipelineStateWithDescriptor:pipeline error:&error]; + if (!state) { fprintf(stderr, "%s\n", error.description.UTF8String); return 1; } + MTLTextureDescriptor *td = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:16 height:16 mipmapped:NO]; + td.usage = MTLTextureUsageRenderTarget; td.storageMode = MTLStorageModeShared; + id texture = [device newTextureWithDescriptor:td]; + id queue = [device newCommandQueue]; + uint32_t masks[] = {0, 1, 2, 3, 0x80000000u, 0xffffffffu}; + for (unsigned clamp = 0; clamp < 2; clamp++) + for (uint32_t points = 0; points < 2; points++) + for (unsigned i = 0; i < sizeof(masks) / sizeof(*masks); i++) { + MTLRenderPassDescriptor *pass = [MTLRenderPassDescriptor new]; + pass.colorAttachments[0].texture = texture; + pass.colorAttachments[0].loadAction = MTLLoadActionClear; + pass.colorAttachments[0].storeAction = MTLStoreActionStore; + pass.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 1); + id command = [queue commandBuffer]; + id encoder = [command renderCommandEncoderWithDescriptor:pass]; + [encoder setRenderPipelineState:state]; + [encoder setDepthClipMode:clamp ? MTLDepthClipModeClamp : MTLDepthClipModeClip]; + [encoder setVertexBytes:&masks[i] length:sizeof(masks[i]) atIndex:0]; + [encoder setVertexBytes:&points length:sizeof(points) atIndex:1]; + [encoder drawPrimitives:points ? MTLPrimitiveTypePoint : MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:points ? 1 : 3]; + [encoder endEncoding]; [command commit]; [command waitUntilCompleted]; + if (command.error) { fprintf(stderr, "%s\n", command.error.description.UTF8String); return 1; } + uint8_t pixel[4]; + [texture getBytes:pixel bytesPerRow:4 fromRegion:MTLRegionMake2D(8, 8, 1, 1) mipmapLevel:0]; + if ((pixel[0] != 0) != ((masks[i] & 1u) != 0)) { + fprintf(stderr, "mask %#x, points=%u, depth clamp=%u: red=%u\n", masks[i], points, clamp, pixel[0]); return 1; + } + } + return 0; +} } +''' + + +def mask_reader(): + # GenerateVertexPassthroughForCompute treats ViewportMask (int[1]) as a + # scalar output. SPIRV-Cross emits this invalid array-copy expression. + return '''#include +using namespace metal; +template +inline void spvArrayCopyFromStackToStack(thread T (&dst)[N], thread const T (&src)[N]) +{ for (uint i = 0; i < N; i++) dst[i] = src[i]; } +struct main0_out +{ + float4 gl_Position [[position]]; + float gl_PointSize [[point_size]]; +}; +vertex main0_out main0(uint vid [[vertex_id]], constant uint& mask [[buffer(0)]], constant uint& points [[buffer(1)]]) +{ + main0_out out = {}; + float2 positions[] = {float2(-1.0, -1.0), float2(3.0, -1.0), float2(-1.0, 3.0)}; + out.gl_Position = float4(points ? float2(0.0) : positions[vid], 0.0, 1.0); + out.gl_PointSize = 64.0; + float bits = as_type(mask); + spvArrayCopyFromStackToStack(gl_BuiltIn_5253, as_type(bits).elements); + return out; +} +fragment float4 pixel() { return float4(1.0, 0.0, 0.0, 1.0); } +''' + + +def depth_entries(src): + # Exercise the same post-reader depth conversion as geometry_finish without + # importing the builder's command-line and game-profile initialization. + builder = Path(dmsh_geometry.__file__).with_name('dmsh_build.py').read_text() + node = next(n for n in ast.parse(builder).body if isinstance(n, ast.FunctionDef) and n.name == 'vs_depth') + ns = {'re': re, 'sys': sys} + exec(ast.get_source_segment(builder, node), ns) + # The production helper locates the translated vertex entry at file end. + vertex, pixel = src.split('fragment float4 pixel()', 1) + return ns['vs_depth'](vertex)[1] + 'fragment float4 pixel()' + pixel + + +class GeometryReader(unittest.TestCase): + def test_capture_loads_preserve_input_reads(self): + source = 'device _22* vertex_output [[id(1)]]; device _22* geometry_vb_output [[id(2)]];' + self.assertEqual(dmsh_geometry.capture_input(source), + 'device volatile _22* vertex_output [[id(1)]]; device _22* geometry_vb_output [[id(2)]];') + self.assertEqual(dmsh_geometry.capture_input('kernel void main0() {}'), 'kernel void main0() {}') + with self.assertRaisesRegex(ValueError, 'capture-input declaration'): + dmsh_geometry.capture_input('unknown vertex_output;') + + def test_ordinary_reader_is_unchanged(self): + src = mask_reader().replace(' spvArrayCopyFromStackToStack(gl_BuiltIn_5253, as_type(bits).elements);\n', '') + self.assertEqual(dmsh_geometry.reader(src), src) + + def test_unknown_mask_expression_is_rejected(self): + for expression in ('gl_BuiltIn_5253[0] = 1;', + 'spvArrayCopyFromStackToStack(gl_BuiltIn_5253, as_type(bits + 1.0).elements);'): + with self.subTest(expression=expression), self.assertRaisesRegex(ValueError, 'viewport-mask expression'): + dmsh_geometry.reader(mask_reader().replace( + 'spvArrayCopyFromStackToStack(gl_BuiltIn_5253, as_type(bits).elements);', expression)) + + @unittest.skipUnless(sys.platform == 'darwin' and shutil.which('xcrun'), 'requires Metal on macOS') + def test_mask_controls_viewport_zero_visibility(self): + with tempfile.TemporaryDirectory(prefix='dmsh_geometry_raster_') as d: + root = Path(d) + source = root / 'reader.metal'; source.write_text(depth_entries(dmsh_geometry.reader(mask_reader()))) + library = root / 'reader.metallib' + compiler = ['xcrun', '-sdk', 'macosx', 'metal', '-fmodules-cache-path=' + d + '/modules'] + r = subprocess.run([*compiler, '-c', str(source), '-o', str(root / 'reader.air')], capture_output=True, text=True) + self.assertEqual(r.returncode, 0, r.stderr) + subprocess.run(['xcrun', '-sdk', 'macosx', 'metallib', str(root / 'reader.air'), '-o', str(library)], check=True, capture_output=True) + executable = root / 'raster' + subprocess.run(['xcrun', 'clang', '-fobjc-arc', '-x', 'objective-c', '-', '-o', str(executable), + '-framework', 'Foundation', '-framework', 'Metal'], input=RASTER_CHECK, + text=True, check=True, capture_output=True) + for entry in ('main0', 'main0_z'): + with self.subTest(entry=entry): + r = subprocess.run([str(executable), str(library), entry], capture_output=True, text=True) + if r.returncode == 77: + self.skipTest(r.stderr.strip()) + self.assertEqual(r.returncode, 0, r.stderr) + + @unittest.skipUnless(shutil.which('xcrun'), 'requires the Metal compiler') + def test_viewport_mask_reader_compiles(self): + with tempfile.TemporaryDirectory(prefix='dmsh_geometry_test_') as d: + src = Path(d) / 'reader.metal' + src.write_text(dmsh_geometry.reader(mask_reader())) + for sdk in ('macosx', 'iphoneos'): + with self.subTest(sdk=sdk): + r = subprocess.run(['xcrun', '-sdk', sdk, 'metal', + '-fmodules-cache-path=' + d + '/modules', '-fsyntax-only', str(src)], + capture_output=True, text=True) + self.assertEqual(r.returncode, 0, r.stderr) + + +def geometry_header(passthrough=True, vertices=1, topology=7, invocations=1): + return struct.pack('<5I', int(passthrough) << 24, 0, invocations << 24, topology << 24, vertices) + + +class GeometryOutputLayout(unittest.TestCase): + def test_passthrough_uses_input_primitive_vertex_count(self): + layouts = [dmsh_geometry.output_layout(geometry_header(), t) for t in range(5)] + self.assertEqual([g['vertices'] for g in layouts], [1, 2, 2, 3, 3]) + self.assertEqual([g['index_stride'] for g in layouts], [2, 4, 4, 6, 6]) + self.assertEqual([g['output'] for g in layouts], [1, 6, 6, 7, 7]) + + def test_regular_geometry_retains_declared_bound(self): + for t in range(5): + self.assertEqual(dmsh_geometry.output_layout(geometry_header(False, 12, 6, 3), t), + {'vertices': 12, 'invocations': 3, 'output': 6, 'index_stride': 24}) + + def test_invalid_header_or_topology_is_rejected(self): + for code, t in ((b'', 0), (geometry_header(), 5), (geometry_header(), -1), + (geometry_header(False, vertices=0), 0), (geometry_header(invocations=0), 0), + (geometry_header(False, topology=3), 0)): + with self.subTest(code=code, topology=t), self.assertRaises(ValueError): + dmsh_geometry.output_layout(code, t) + + @unittest.skipUnless(os.environ.get('DM_TEST_GEOMETRY'), 'set DM_TEST_GEOMETRY to the native t_geometry executable') + def test_native_passthrough_canaries_and_compaction(self): + layouts = [dmsh_geometry.output_layout(geometry_header(), t) for t in range(5)] + with tempfile.TemporaryDirectory(prefix='geometry_bounds_') as d: + path = Path(d) / 'layouts.json'; path.write_text(json.dumps(layouts)) + r = subprocess.run([os.environ['DM_TEST_GEOMETRY'], '--passthrough-layouts', str(path)], capture_output=True, text=True) + self.assertEqual(r.returncode, 0, r.stdout + r.stderr) + + +@unittest.skipUnless(os.environ.get('DMSH_TEST_XLATE'), 'set DMSH_TEST_XLATE to the offline translator') +class PassthroughCompiler(unittest.TestCase): + def test_passthrough_emits_positions_and_generic_attributes(self): + from test_dmsh_reflect import REFLECT + root = Path(__file__).resolve().parents[3] + table = (root / 'dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Decoders/InstTable.cs').read_text() + pattern = re.search(r'Add\("([01x]{64})", InstName\.Exit\s*,', table)[1] + exit_instruction = int(pattern.replace('x', '0'), 2) | (7 << 16) | 15 + with tempfile.TemporaryDirectory(prefix='geometry_passthrough_') as d: + work = Path(d); jobs = [] + for t in range(5): + header = bytearray(0x50) + struct.pack_into('<5I', header, 0, (1 << 24) | (4 << 10) | (3 << 5) | 1, + 0, 1 << 24, 7 << 24, 1) + code = work / f'pass{t}.bin'; code.write_bytes(header + struct.pack('= 3: # the address is in the game's own uniform buffer c[n] = uniform slot n - 3 (Monster Hunter Rise's compute shaders: c3 + 0x38); the replay reads it there e.update(kind='sbuf_ubo', reg=b['cb_slot'] - 3, off=b['cb_offset'] * 4) else: e['reg'] = (off - base) // 16 if off is not None and base is not None and 0 <= off - base < 0x100 and (off - base) % 16 == 0 else None - e['rw'] = bool(b and b['flags'] & 2) + e['rw'] = bool(b and b['flags'] & 1) # BufferUsageFlags.Write; Program.cs serializes the translator enum unchanged (atomics count as writes too) return binds DRV_FILL = {0: [(b, b + 0x100) for b in sorted(SSBO.values())], # c0: storage buffer address tables (vertex / compute / pixel, 16 slots × 0x10 each) @@ -749,28 +749,24 @@ def geometry_finish(key, w, j, c1): Resources retain logical NVN stage 2 even though Metal executes a kernel. """ code = open(j['code'], 'rb').read() - w2, w3, w4 = struct.unpack_from('<3I', code, 8) - nv, inv, topology = w4 & 4095, w2 >> 24, w3 >> 24 & 15 - if topology not in (1, 6, 7) or not nv or not inv: - return 'geometry failed', 'invalid output declaration', None - nidx = nv * 2 # one restart after every emitted vertex, including incomplete strips + dmsh_geometry.output_layout(code, 0) # validate before running the translator jobs = [{**j, 'key': key + '_g' + str(t), 'geometry_topology': t} for t in range(5)] jp = os.path.join(w, key + '_geometry.json'); atomic_json(jp, jobs) rx = subprocess.run([XLATE, jp, w], capture_output=True, text=True) if rx.returncode: return 'geometry failed', rx.stderr.strip()[:160], None base = None for t, job in enumerate(jobs): + layout = dmsh_geometry.output_layout(code, t) k = job['key']; spv = os.path.join(w, k + '.spv') dmsh_geometry.flatten_sets(spv) r = subprocess.run(['spirv-cross', *XC, spv], capture_output=True, text=True) if r.returncode: return 'geometry MSL failed', r.stderr.strip()[:160], None - src = dmsh_geometry.topology_pointer(precise(dmsh_atomic.lower_msl(r.stdout))) + src = dmsh_geometry.capture_input(dmsh_geometry.topology_pointer(precise(dmsh_atomic.lower_msl(r.stdout)))) res = json.load(open(os.path.join(w, k + '.res.json'))) refl = {'key': key + '_bg' + str(t), 'route': 'B', 'chain': CHAIN, 'dm_ctl': key, 'source': f'{loc[key][0]}#{loc[key][1]}', 'pc_paired': pc_of[key], 'stage': 'gs', 'entry': 'main0', 'msl_entry_kind': 'kernel', 'threadgroup_size': [32, 1, 1], - 'geometry': {'vertices': nv, 'invocations': inv, 'output': topology, - 'stride': res['geometry_stride'], 'index_stride': nidx}, + 'geometry': dict(layout, stride=res['geometry_stride']), 'c1': c1.hex(), 'notes': res['notes'], 'drv_reads': drv_reads(src), 'drv_unfillable': [], 'bindings': reflect(key, 'gs', src, res), 'vertex_inputs': [], 'raster': {}} def save(suffix, text, meta): @@ -787,11 +783,11 @@ def geometry_finish(key, w, j, c1): spv = os.path.join(w, k + '.reader.spv'); dmsh_geometry.flatten_sets(spv) r = subprocess.run(['spirv-cross', *XC, spv], capture_output=True, text=True) if r.returncode: return 'geometry reader failed', r.stderr.strip()[:160], None - reader = vs_layer(vs_init(precise(dmsh_atomic.lower_msl(r.stdout)))) + reader = vs_layer(vs_init(dmsh_geometry.reader(precise(dmsh_atomic.lower_msl(r.stdout))))) analysis, full = vs_depth(reader) meta = {'key': key + '_bgv', 'route': 'B', 'chain': CHAIN, 'dm_ctl': key, 'stage': 'vs', 'entry': 'main0', 'entry_z': 'main0_z', 'msl_entry_kind': 'vertex', - 'geometry_reader': True, 'geometry_output': topology, 'c1': '', 'notes': [], 'drv_reads': {}, 'drv_unfillable': [], + 'geometry_reader': True, 'geometry_output': layout['output'], 'c1': '', 'notes': [], 'drv_reads': {}, 'drv_unfillable': [], 'bindings': reflect(key, 'vs', analysis, {'sbufs': []}), 'vertex_inputs': [], 'raster': {}} save('_bgv', full, meta) return 'ok', '', base diff --git a/dm/gfx/tools/dmsh_chain.lock b/dm/gfx/tools/dmsh_chain.lock index 46d434a..a91bd35 100644 --- a/dm/gfx/tools/dmsh_chain.lock +++ b/dm/gfx/tools/dmsh_chain.lock @@ -1,8 +1,8 @@ # Translation chain tool fingerprints (written by dmsh_chain.py --update-lock; regenerate after changing tools and commit it) -dmsh_xlate.dll 0d9b8700c85c7194 -Ryujinx.Graphics.Shader.dll eff19af935aefcdb -Ryujinx.Common.dll b99db57e72c1fa16 -xlate_source 729b1339ce845abb +dmsh_xlate.dll 770e81bc853cde4e +Ryujinx.Graphics.Shader.dll 5c427183cb7ec561 +Ryujinx.Common.dll 50db51f83d8cb36d +xlate_source af0a596483e1ec36 spirv-cross d9dc197f061b42a5 metal_macosx Apple metal version 32023.921 (metalfe-32023.921.6) metal_iphoneos Apple metal version 32023.921 (metalfe-32023.921.6) diff --git a/dm/gfx/tools/dmsh_chain.py b/dm/gfx/tools/dmsh_chain.py index 8ede900..82cc854 100644 --- a/dm/gfx/tools/dmsh_chain.py +++ b/dm/gfx/tools/dmsh_chain.py @@ -21,7 +21,7 @@ FILES = ['tools/dmsh_chain.py', 'tools/dmsh_build.py', 'tools/dmsh_atomic.py', ' FILES += ['../third_party/ryujinx/src/Ryujinx.Graphics.Shader/' + f for f in ( 'Instructions/InstEmitSurface.cs', 'IntermediateRepresentation/TextureFlags.cs', 'Translation/TranslationFlags.cs', 'Translation/HostCapabilities.cs', - 'Translation/TranslatorContext.cs', 'CodeGen/Spirv/Instructions.cs', + 'Translation/TranslatorContext.cs', 'Translation/EmitterContext.cs', 'Translation/ShaderDefinitions.cs', 'CodeGen/Spirv/Instructions.cs', 'StructuredIr/ShaderProperties.cs', 'Translation/Optimizations/BindlessElimination.cs')] INPUT_TABLES = ['shader_facts.tsv', 'shader_map.tsv', 'shader_map.tsv.conflicts.tsv', 'shader_pairs.tsv', 'bf_want.tsv'] # in the game profile folder LOCK = os.path.join(HERE, 'dmsh_chain.lock'); HEADER = os.path.join(GFX, 'nvn/dmsh_chain.h') diff --git a/dm/gfx/tools/dmsh_geometry.py b/dm/gfx/tools/dmsh_geometry.py index 8537356..77d32d7 100644 --- a/dm/gfx/tools/dmsh_geometry.py +++ b/dm/gfx/tools/dmsh_geometry.py @@ -15,6 +15,66 @@ HELPERS = {'vertex_output': 0, 'geometry_vb_output': 1, 'vb_input': 1} +def output_layout(code, input_topology): + """Geometry output bounds in the translator's fixed-input compute ABI.""" + if len(code) < 20 or input_topology not in range(5): + raise ValueError('invalid geometry header or input topology') + w2, w3, w4 = struct.unpack_from('<3I', code, 8) + vertices, invocations, topology = w4 & 4095, w2 >> 24, w3 >> 24 & 15 + # ShaderDefinitions overrides a passthrough GS's raw SPH bound with the + # non-adjacent input vertex count. Match that override for every topology; + # raw bounds can be 1 even when a triangle kernel writes three vertices and + # six index words per invocation (including restart padding). + if struct.unpack_from('\((\w+)\)\.elements\s*\);') + lowered, n = store.subn(r'dm_gs_viewport_mask = as_type(\1);', src) + if not n or builtin in lowered or 'dm_gs_viewport_mask' in src: + raise ValueError('geometry reader: unsupported viewport-mask expression') + output = re.search(r'struct main0_out\s*\{(.*?)\};', lowered, re.S) + position = re.search(r'\bfloat4 (\w+) \[\[position(?:, invariant)?\]\];', output[1]) if output else None + entry = re.search(r'\bvertex\s+main0_out\s+main0\s*\([^{}]*\)\s*\{', lowered) + if not position or not entry: + raise ValueError('geometry reader: missing vertex position or entry') + begin, depth, end = entry.end(), 1, entry.end() + while depth and end < len(lowered): + depth += (lowered[end] == '{') - (lowered[end] == '}') + end += 1 + if depth: + raise ValueError('geometry reader: unterminated vertex entry') + body = lowered[begin:end - 1] + if body.count('dm_gs_viewport_mask') != n or 'return out;' not in body: + raise ValueError('geometry reader: viewport mask outside the vertex entry') + body = body.replace('return out;', + '{ if ((dm_gs_viewport_mask & 1u) == 0u) ' + f'out.{position[1]} = float4(2.0, 0.0, 0.0, 1.0); return out; }}') + return lowered[:begin] + '\n uint dm_gs_viewport_mask = 1u;' + body + lowered[end - 1:] + + def capture(src): """Append a rasterizer-discard vertex entry to the unmodified-depth source.""" m = re.search(r'\bvertex main0_out main0\((.*?)\)\s*\{', src, re.S) @@ -80,7 +140,8 @@ def capture(src): def flatten_sets(path): """Give auxiliary sets their own binding ranges in the ordinary set-0 ABI.""" - data = open(path, 'rb').read() + with open(path, 'rb') as f: + data = f.read() w = list(struct.unpack('<%dI' % (len(data) // 4), data)) sets, bindings = {}, {} i = 5 @@ -98,7 +159,8 @@ def flatten_sets(path): raise ValueError('unknown geometry auxiliary descriptor set') w[bindings[ident]] += 10000 if s == 1 else 11000 w[at] = 0 - open(path, 'wb').write(struct.pack('<%dI' % len(w), *w)) + with open(path, 'wb') as f: + f.write(struct.pack('<%dI' % len(w), *w)) def topology_pointer(src): @@ -122,3 +184,20 @@ def topology_pointer(src): if 'trb_data.read' in src: raise ValueError('unconverted geometry topology read') return src + + +def capture_input(src): + """Keep the full Maxwell capture map readable by optimized Metal kernels. + + Copying all 128 contiguous generic components can make Metal's optimized + AIR fail AGX pipeline compilation. Volatile capture reads retain each scalar + load without changing the captured values or disabling kernel optimization. + Ordinary geometry kernels which do not read captured input stay unchanged. + """ + if 'vertex_output' not in src: + return src + lowered, n = re.subn(r'\bdevice (\w+)\* vertex_output\b', + r'device volatile \1* vertex_output', src) + if n != 1: + raise ValueError('unknown geometry capture-input declaration') + return lowered diff --git a/dm/gfx/tools/dmsh_xlate/Program.cs b/dm/gfx/tools/dmsh_xlate/Program.cs index 7c41095..73cad28 100644 --- a/dm/gfx/tools/dmsh_xlate/Program.cs +++ b/dm/gfx/tools/dmsh_xlate/Program.cs @@ -107,6 +107,9 @@ static class SwshXlate public int QueryComputeSharedMemorySize() => _job["shared"] is JsonNode n ? (int)n : 0; // the shared memory size in the compute shader's control section (shader_split.py) static AttributeType Attr(string s) => s switch { "sint" => AttributeType.Sint, "uint" => AttributeType.Uint, _ => AttributeType.Float }; public bool QueryGeometryInputFixed() => _job["geometry_topology"] != null; + // Compute lowering must emit passthrough vertices explicitly: Metal + // cannot supply the native NV geometry-passthrough stage afterwards. + public bool QueryHostSupportsGeometryShaderPassthrough() => _job["geometry_topology"] == null; public GpuGraphicsState QueryGraphicsState() { Array32 attr = default; Array8 fout = default; diff --git a/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Common.dll b/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Common.dll index 7f4fc6e..bdbb24f 100644 Binary files a/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Common.dll and b/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Common.dll differ diff --git a/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Graphics.Shader.dll b/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Graphics.Shader.dll index 5ffcf99..513bfff 100644 Binary files a/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Graphics.Shader.dll and b/dm/gfx/tools/dmsh_xlate_bin/Ryujinx.Graphics.Shader.dll differ diff --git a/dm/gfx/tools/dmsh_xlate_bin/Spv.Generator.dll b/dm/gfx/tools/dmsh_xlate_bin/Spv.Generator.dll index 6731a71..6f790a3 100644 Binary files a/dm/gfx/tools/dmsh_xlate_bin/Spv.Generator.dll and b/dm/gfx/tools/dmsh_xlate_bin/Spv.Generator.dll differ diff --git a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate index 2241f67..4f09c1c 100755 Binary files a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate and b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate differ diff --git a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.deps.json b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.deps.json index 51145e4..8a0a8a1 100644 --- a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.deps.json +++ b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.deps.json @@ -1,11 +1,12 @@ { "runtimeTarget": { - "name": ".NETCoreApp,Version=v10.0", + "name": ".NETCoreApp,Version=v10.0/osx-arm64", "signature": "" }, "compilationOptions": {}, "targets": { - ".NETCoreApp,Version=v10.0": { + ".NETCoreApp,Version=v10.0": {}, + ".NETCoreApp,Version=v10.0/osx-arm64": { "dmsh_xlate/1.0.0": { "dependencies": { "Ryujinx.Common": "1.0.0", diff --git a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.dll b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.dll index fe4a289..9bdf25e 100644 Binary files a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.dll and b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.dll differ diff --git a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.pdb b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.pdb index e8a230b..44f459e 100644 Binary files a/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.pdb and b/dm/gfx/tools/dmsh_xlate_bin/dmsh_xlate.pdb differ diff --git a/dm/gfx/tools/shader_split.py b/dm/gfx/tools/shader_split.py index 74da417..48699fd 100644 --- a/dm/gfx/tools/shader_split.py +++ b/dm/gfx/tools/shader_split.py @@ -29,6 +29,7 @@ # · PKZ (PlatinumGames, Bayonetta 3): shader objects (VSO / PSO / CSO / HSO / DSO, a control section and a code area each) in the DAT archives of the PKZ entries (Oodle Kraken, decoded by the # game's own decoder in the Mac host), see pkz_entries, pgdat_members and pg_shader # · CPK (CRI's file system, Bayonetta 2): BNSH files ('.vso' / '.pso') in the PlatinumGames DAT archives of the CPK entries (CRILAYLA entries, cpk.py), see cpk_jobs +# NieR:Automata's DAT members instead prefix length-delimited NVN code and control sections with a binding table (pg_sized_shader) # · HNSHV002 (Needle, Persona 5 Royal): NVN section descriptors in the shader containers embedded in main and the GSC files of its CPK archives, see needle_shaders # · GFPAK (Game Freak, Pokémon Sword): BNSH entries of the archives under bin/archive (LZ4 entries), see gfpak_members # · .tfxo (Silicon Studio's YEBIS post effects, Pokémon Sword): control sections each followed by its code area, in a zlib stream in main, see tfxo_streams and tfxo_shaders @@ -527,6 +528,25 @@ def pg_shader(d, label): if why: red(f'{label} ({st}): {why}') return [(f'{label}#PGSO', st, ctl, code)] +def pg_sized_shader(d, label): + """PlatinumGames' binding-table form: u32 prefix length (including itself), bindings, u32 code length, code, u32 control length, control. NieR:Automata's 1,371 objects in five DATs + all have a 0x88-byte prefix and 0x880 control bytes; keys match the objects passed to NVN at boot. Recognize the section boundaries and NVN magics, without relying on a title or filename.""" + if len(d) < 12: return [] + prefix = struct.unpack_from(' len(d): return [] + ncode = struct.unpack_from(' len(d) or d[codeoff:codeoff + 4] not in (GFX_MAGIC, CS_MAGIC): return [] + nctl = struct.unpack_from('= 0x18 and d[(o := struct.unpack_from('> 14)` instead of `(x, 0)`, and the handle is reported. A 1D texture (one row at most 16384 wide on the host) reads the same; the host binds a texture buffer in such a slot as a linear 2D texture of 16384-texel rows over its memory (`nvn_mtl.m` `tbuf_as_2d`). Upstream read `(x, 0)` and the host had only a dummy texture to give: the light and decal lists of Age of Calamity (at least 15,000 shaders) and Three Houses read zeros (2026-10-21). Marked `nxnative:` in the code. +- `Ryujinx.Graphics.Shader/Translation/EmitterContext.cs` and `Translation/ShaderDefinitions.cs`: fixed-input compute lowering explicitly forwards passthrough positions and all captured generic attributes not replaced by the geometry shader, and inherits its output primitive from input topology. Independent offline stages have no next-stage usage mask, and Metal cannot provide the native NV passthrough raster stage. See [passthrough compute emission](../../../docs/reference/shaders.md#passthrough-geometry-kernels-lose-raster-vertices) and [output bounds](../../../docs/reference/shaders.md#passthrough-geometry-output-bounds-follow-input-topology). + The shader translation tool in `dm/gfx/tools/dmsh_xlate` references them to translate the original Switch shaders to SPIR-V. License: MIT, see `LICENSE.txt`. Upstream: . diff --git a/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs b/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs index 0e39de2..614726a 100644 --- a/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs +++ b/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs @@ -426,7 +426,13 @@ namespace Ryujinx.Graphics.Shader.Translation { WritePositionOutput(primIndex); - int passthroughAttributes = TranslatorContext.AttributeUsage.PassthroughAttributes; + // Independently compiled fixed-input stages meet through + // the complete Maxwell map, with no linked next-stage + // usage to populate PassthroughAttributes. Preserve every + // captured generic output the GS did not replace. + int passthroughAttributes = TranslatorContext.GpuAccessor.QueryGeometryInputFixed() + ? ~TranslatorContext.AttributeUsage.UsedOutputAttributes + : TranslatorContext.AttributeUsage.PassthroughAttributes; while (passthroughAttributes != 0) { int index = BitOperations.TrailingZeroCount(passthroughAttributes); diff --git a/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs b/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs index c2126ac..719d979 100644 --- a/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs +++ b/dm/third_party/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs @@ -156,7 +156,15 @@ namespace Ryujinx.Graphics.Shader.Translation _graphicsState = graphicsState; GpPassthrough = gpPassthrough; ThreadsPerInputPrimitive = threadsPerInputPrimitive; - OutputTopology = outputTopology; + // Native geometry passthrough inherits the input primitive; its + // SPH output declaration is unused. Compute emulation must expose + // the same primitive to index compaction and raster replay. + OutputTopology = gpPassthrough ? graphicsState.Topology switch + { + InputTopology.Points => OutputTopology.PointList, + InputTopology.Lines or InputTopology.LinesAdjacency => OutputTopology.LineStrip, + _ => OutputTopology.TriangleStrip, + } : outputTopology; MaxOutputVertices = gpPassthrough ? graphicsState.Topology.InputVertexCountNoAdjacency : maxOutputVertices; ImapTypes = imapTypes; OmapTargets = omapTargets; diff --git a/docs/agents/symptoms.md b/docs/agents/symptoms.md index eebfa3e..56bd9f1 100644 --- a/docs/agents/symptoms.md +++ b/docs/agents/symptoms.md @@ -207,6 +207,7 @@ One line per symptom in the [subsystem references](../reference/): what you see - a 30 fps game to run at 60; after the floor was lowered, slow motion on a GPU-bound device (GitHub issue #9). → [sead's dynamic present interval, `ksys::VFR` and the host's frame step](../reference/frame-rate.md#seads-dynamic-present-interval-ksysvfr-and-the-hosts-frame-step) - slow motion when the GPU is the bottleneck: a game's interval controller that times the GPU never steps up (GitHub issue #9). → [GPU timestamps per submission segment](../reference/frame-rate.md#gpu-timestamps-per-submission-segment) +- GPU time reads 32 times too small when a game converts raw NVN counter timestamps itself. → [Raw NVN timestamp units](../reference/frame-rate.md#raw-nvn-timestamp-units) - the game presents at interval 1, yet every frame takes exactly 33.3 ms of "frame work"; after only the limiter was raised, everything ran twice as fast on the iPhone. → [A render-thread limiter with a constant and a fixed time step](../reference/frame-rate.md#a-render-thread-limiter-with-a-constant-and-a-fixed-time-step) - 55 fps with every frame 18.2 ms, the main thread asleep most of the time; every 11th frame stays on screen two vsyncs. → [A frame-end wait polled in 2 ms sleeps](../reference/frame-rate.md#a-frame-end-wait-polled-in-2-ms-sleeps) - the app is active and the game keeps running, but the picture freezes while display-link callbacks stop; the log repeatedly drops queued frames. → [Present thread rescues a silent display link](../reference/frame-rate.md#present-thread-rescues-a-silent-display-link) @@ -351,6 +352,7 @@ One line per symptom in the [subsystem references](../reference/): what you see - an NVN game's split finds none of its shipped shaders, and the ones it compiles at run time were not captured: the game's renderer is in NROs that call `glslcCompile`, and its whole RomFS is one zip. → [GLSLC outputs in a zip archive, and those NROs compile at run time](../reference/shaders.md#glslc-outputs-in-a-zip-archive-and-those-nros-compile-at-run-time) - 24 shaders before the control-length fix, 1,355 after. → [SPKG packages in KTGL LINKDATA](../reference/shaders.md#spkg-packages-in-ktgl-linkdata) - `[RED] ... PKZ version 0x10000: only 0x20000 is known` stops the shader split. → [PKZ version 1 archives](../reference/shaders.md#pkz-version-1-archives) +- the split finds zero shaders and refuses the shader build, although the CPK's DAT archives contain the objects passed to NVN at boot. → [Size-delimited PlatinumGames shader objects](../reference/shaders.md#size-delimited-platinumgames-shader-objects) - the split finds no shaders, although `main` contains NVN control sections; it reports that no data record or code-address pair identifies their code areas. → [Needle shader containers in main and GFD archives](../reference/shaders.md#needle-shader-containers-in-main-and-gfd-archives) - shaders the game draws are missing from the map (`DM_NVN_SHDUMP`), in no RomFS file and no module, stored or LZ4, and not compiled at run time. → [Shaders in a zlib stream in main (YEBIS .tfxo)](../reference/shaders.md#shaders-in-a-zlib-stream-in-main-yebis-tfxo) - two `[RED] shader … is not in the shader map` lines and `program has no vertex shader` as the opening movie starts; every movie drew white. → [Loose control sections and code areas in main (Bink 2)](../reference/shaders.md#loose-control-sections-and-code-areas-in-main-bink-2) @@ -373,10 +375,17 @@ One line per symptom in the [subsystem references](../reference/): what you see - `SPIRV-Cross threw an exception: Subgroup builtins are not available in this type of function`. → [Subgroup operations rewritten for a one-lane subgroup](../reference/shaders.md#subgroup-operations-rewritten-for-a-one-lane-subgroup) - the tone mapper read an empty LUT and the screen came out a flat blue. → [Geometry shaders that only pick the layer](../reference/shaders.md#geometry-shaders-that-only-pick-the-layer) - a geometry shader fails to compile with `unknown main0_out`: SPIRV-Cross writes `unknown main0_out main0()` for the geometry stage, and the shader does not build. → [Geometry shaders with no Metal stage](../reference/shaders.md#geometry-shaders-with-no-metal-stage) +- the geometry kernel compiles, but its `_bgv.metal` vertex reader fails with `use of undeclared identifier 'gl_BuiltIn_5253'` and `member reference base type 'int' is not a structure or union`. → [Geometry reader viewport masks](../reference/shaders.md#geometry-reader-viewport-masks) +- a passthrough geometry kernel writes beyond its vertex and raw-index scratch regions, and compaction reads the wrong groups; corruption can reach the following primitive-map buffers without a red diagnostic. → [Passthrough geometry output bounds follow input topology](../reference/shaders.md#passthrough-geometry-output-bounds-follow-input-topology) +- a geometry kernel compiles and runs its storage-buffer side effects, but contains no `geometry_vb_output` binding and fills its index stream with restart markers; its following raster pass draws no geometry. → [Passthrough geometry kernels lose raster vertices](../reference/shaders.md#passthrough-geometry-kernels-lose-raster-vertices) +- geometry-heavy frames have a large submission wall/CPU gap despite short GPU execution; stack samples spend most of the main thread in `geo_draw` → `mdi_wait` → shared-event wait, with index sorting another substantial cost. → [Geometry capture waits for every indexed draw](../reference/shaders.md#geometry-capture-waits-for-every-indexed-draw) +- geometry-heavy frames remain GPU-bound after CPU readback waits are removed; encoder timestamps attribute most compaction time to the offset scan rather than the geometry shader or index writes. → [Geometry compaction serial prefix scan](../reference/shaders.md#geometry-compaction-serial-prefix-scan) - `[RED] geometry draw needs 261 MiB of scratch, above the 256 MiB bound` (or `exceeds the capture or invocation bound`); the draw is skipped. → [Geometry draws above the capture scratch bound](../reference/shaders.md#geometry-draws-above-the-capture-scratch-bound) - `primitive type 14 not implemented`; patch draws skipped. → [Tessellation stages are not drawn](../reference/shaders.md#tessellation-stages-are-not-drawn) - a vertex or compute shader reads zeros from NVN's driver segment `c0`. → [Driver-segment reads outside fragment shaders](../reference/shaders.md#driver-segment-reads-outside-fragment-shaders) - flickering hard-edged white tiles (tiled lighting with every tile row getting row 0's or other rows' lights). → [Compute `c0`: dispatch size and uniform buffer table](../reference/shaders.md#compute-c0-dispatch-size-and-uniform-buffer-table) +- `[RED] shader ... reflection conversion failed: B binding gp_s0 has no resolved slot number`; a geometry shader reading driver segment `c0` reports that its storage-buffer table base was never measured. → [Geometry-stage storage buffer table](../reference/shaders.md#geometry-stage-storage-buffer-table) +- a storage buffer the shader stores to or uses atomically has `rw: false` in its generated reflection; replay does not record its GPU writes for dependent buffer reads. → [Storage-buffer write flag in translation metadata](../reference/shaders.md#storage-buffer-write-flag-in-translation-metadata) - point sprites of size 0 (Odyssey's Cap Kingdom fog never parted around Mario). → [Graphics `c0 + 0x610`: the largest point size](../reference/shaders.md#graphics-c0--0x610-the-largest-point-size) - occlusion queries that always return 0 samples (Z-A: characters' legs folded back from the hips once they walked); every instanced draw's transform taken for instance 0. → [Graphics `c0 + 0x644`: the draw's base instance](../reference/shaders.md#graphics-c0--0x644-the-draws-base-instance) - a menu's labels drawn as plain bars, other menus empty except for the cursor (one pool's textures overwritten by another's); a black screen when IDs past a fixed table read as empty slots. → [Texture and sampler pools with overlapping IDs](../reference/shaders.md#texture-and-sampler-pools-with-overlapping-ids) diff --git a/docs/images/nier-automata.png b/docs/images/nier-automata.png new file mode 100644 index 0000000..c8d97ee Binary files /dev/null and b/docs/images/nier-automata.png differ diff --git a/docs/reference/frame-rate.md b/docs/reference/frame-rate.md index 0be32e7..2c8c263 100644 --- a/docs/reference/frame-rate.md +++ b/docs/reference/frame-rate.md @@ -20,6 +20,14 @@ Frame pacing: the host's frame step, engine frame limiters, present intervals an - **Fix:** the profile key `gpu_timestamps segment` makes each report take the GPU start (`TIMESTAMP_TOP`) or end (other types) of the `sub_cut` segment ([Submissions handed to the GPU in segments](#submissions-handed-to-the-gpu-in-segments)) it was encoded in (`rep_ticks` in `nvn_mtl.m`: MTL4CommitFeedback times converted to the guest clock, written in the last segment's handler as before). `DM_NVN_GPU_TS=submission` gives the old timestamps. - **Found on:** [The Legend of Zelda: Breath of the Wild](../../dm/games/01007EF00011E000/README.md) (legacy frame-step method): BotW's frame has 5 reports in one submission (`main+0xe94584`, `main+0xe94664`); with two more cuts the controller always takes the GPU path, and the GPU time now reads the frame's GPU span, gaps where the GPU waits for the host's translation included. Measured on the Mac with two BotW runs sharing the GPU under a heavy CPU load (load average about 75, a shader rebuild running): GPU time p50 16–23 ms; the fixed run stayed at interval 2 (3 while the GPU time passed 1.9 vsyncs, 1 for under 2% of the frames) at 0.93–0.98 of real time, while a run with `DM_NVN_GPU_TS=submission` spent 10–70% of its frames at interval 1 and ran at 0.78–0.95. The same GPU time drives the game's dynamic resolution. +### Raw NVN timestamp units + +- **Symptom:** GPU time reads 32 times too small when a game converts raw NVN counter timestamps itself. +- **Cause:** the host wrote reports in 19.2 MHz CPU ticks, while the raw NVN timestamp field uses 614.4 MHz ticks (384 ticks per 625 ns). Games calling `nvnDeviceGetTimestampInNanoseconds` saw correct time because its inverse conversion had the same wrong rate, but an inline conversion read a 16 ms span as 0.5 ms. +- **Fix:** `nvn_timestamp.h` shares the 614.4 MHz conversions between all report writes (`gpu_ticks`, `rep_ticks`) and `nvnDeviceGetTimestampInNanoseconds`. Wide integer products preserve long uptimes. The guest clock epoch stays the same; CPU system counters stay at 19.2 MHz, and the API still returns nanoseconds. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md), whose dynamic-resolution controller subtracts two raw report timestamps and converts the difference inline. +- **Check:** `t_timestamp` checks known vectors, long uptimes, round-trip precision and the game's exact inline arithmetic. `t_nvn` checks the API's known units and bounds a completed report between submit and fence wait. + ## Engine frame limiters ### A render-thread limiter with a constant and a fixed time step diff --git a/docs/reference/nvn-objects.md b/docs/reference/nvn-objects.md index 903ae7a..dc6dd1c 100644 --- a/docs/reference/nvn-objects.md +++ b/docs/reference/nvn-objects.md @@ -232,6 +232,7 @@ Games read this count as a position in their own command memory and size their h - **Cause:** the decoder's NV12 output is copied by the game into textures in a CPU-visible pool and published with `nvnMemoryPoolFlushMappedRange`, which the host did not take as an upload. - **Fix:** the profile key `tex_flush_upload`. Buffer textures stay out of that path: they are views onto the pool buffer, and an upload would have sent them past Metal's 2D size limit. - **Found on:** [Hyrule Warriors: Age of Calamity](../../dm/games/01002B00111A2000/README.md): a 1280×720 R8 and a 640×360 RG8 texture; the buffer texture kept out is a 1,048,576-texel R32F one. +- **Also found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): the title background; the game note records the controlled comparison. ### CPU writes with no flush, caught by page protection (`tex_dirty_upload`) diff --git a/docs/reference/rendering.md b/docs/reference/rendering.md index f3d66b4..42f0280 100644 --- a/docs/reference/rendering.md +++ b/docs/reference/rendering.md @@ -261,7 +261,8 @@ The replay on Metal (`dm/gfx/nvn/nvn_mtl.m`) and the Vulkan and OpenGL layers. E - **Symptom:** solid magenta blocks, exactly (255, 0, 255), hard-edged and aligned to the 16-pixel grid (16×16, sometimes two stacked): Super Mario 3D World showed them only on the iPhone; Captain Toad on a Mac, Apple M6, in about half the frames of the opening course, moving with the falling leaves. - **Cause:** a program writes an attachment while sampling it (agl's post-effect program writes the 1920x1080 RGB10A2 image as an attachment while sampling it). Writing and sampling one attachment within a render pass is undefined in Metal: the M4 Pro happens to return the old content, while the A20 Pro now and then returns whole 16×16 blocks as (1, 0, 1), probably blocks of the compressed render target caught mid-write. On the Switch the read returns the content from before the draw. -- **Fix:** for the fragment shaders the profile's `feedback_snap` key lists, the host ends the pass before such a draw, copies the attachment's level and layer into a snapshot texture in the replay stream, and binds the snapshot for that draw (`fb_prepare` in `nvn_mtl.m`). A sampled view that spans more levels than the attachment's one is left as before with a red line. +- **Fix:** for the fragment shaders the profile's `feedback_snap` key lists, the host ends the pass before such a draw, copies the attachment's level and layer into a snapshot texture in the replay stream, and binds the snapshot for that draw (`fb_prepare` in `nvn_mtl.m`). The binding scan covers combined slots 0–127 and separate texture slots 128–255 (`NTEX`), using the argument encoder's handle lookup; an earlier bound of 128 silently skipped separate bindings even for a listed shader. A sampled view that spans more levels than the attachment's one is left as before with a red line. +- **Check:** `make -C dm/gfx/tests GAME= check_t_feedback` exercises the production snapshot and argument encoder at slots 0, 128 and 255. GPU readback must retain a red snapshot after the original attachment is overwritten green, then read the green original on the next draw. The old slot bound fails 10 of 56 checks; the corrected bound passes all 56 with Metal API validation on the M4 Pro. - **Found on:** - [Super Mario 3D World + Bowser's Fury](../../dm/games/010028600EBDA000/README.md): `DM_NVN_MAGSCAN` on the A20 Pro found the blocks first in the 1920×1080 RGB10A2 composite (`ser=30`) in World 1-1, in the pass whose shader `66a71a3081b91b9a` renders into that texture while sampling it. They kept appearing with the sparkle particle `5e4de7561c670fee` dropped, so that earlier suspect (picked by position) is not the cause. `feedback_snap` lists `66a71a3081b91b9a` and `30e3ccb0bd304ead` (which samples a G-buffer target of its own pass on the title screen); in 1-1 that is one 8 MB copy per frame. `3e8567da37eb28a1` renders level 1 of a texture while its view covers levels 0–4 (mip-chain passes) and keeps the red line. The source said the fix was in place and waiting for a device run when written; the README lists the game as tested and playable on the iPhone. - [Captain Toad: Treasure Tracker](../../dm/games/01009BF0072D4000/README.md): agl's post-effect program 987 (`54f58a7cab608766`, the same program as 3D World's `66a71a3081b91b9a` in another build); `DM_NVN_FB_SNAP=all` cleared every frame and named this one shader, now in the profile's `feedback_snap`. diff --git a/docs/reference/shaders.md b/docs/reference/shaders.md index 58af6c5..b153c09 100644 --- a/docs/reference/shaders.md +++ b/docs/reference/shaders.md @@ -128,6 +128,13 @@ Finding, keying and translating shaders (`dm/gfx/tools/shader_split.py`, `dmsh_b - PlatinumGames' shader objects: `VSO\0` / `PSO\0` / `CSO\0` / `HSO\0` / `DSO\0` (the stage), u32 compiler version, u32 control length, u32 control offset (0x18), u32 code length, u32 code offset, and nothing else. The engine makes a program of each and binds them per stage at draw time, so they are single-stage programs, paired with a cover pixel shader (`shader_split.py` `pg_shader`; the archives: [01](../agents/01-extract.md)). It finds its built-in ones by name (`hwfillcolor.vso`, …) and checks each object's GPU code version against the driver's (the NVN layer reports the translator's supported GPU-code range: [Newest GPU code version reported by the driver](nvn-objects.md#newest-gpu-code-version-reported-by-the-driver), SDK 13.3.2). - **Found on:** [Bayonetta 3](../../dm/games/01004A4010FEA000/README.md): 8,024 objects in `root_000.pkz` (`shader.dat`, `shader2.dat`, `shadereff*.dat`, `autoshadereff.dat`); 6,424 distinct keys (4,288 pixel, 2,047 vertex, 78 compute, 6 domain, 5 hull). +### Size-delimited PlatinumGames shader objects + +- **Symptom:** the split finds zero shaders and refuses the shader build, although the CPK's DAT archives contain the objects passed to NVN at boot. +- **Cause:** another PlatinumGames wrapper stores a binding table before the code and control sections, rather than the stage-tagged object above or a BNSH file: u32 prefix length (including that word), binding bytes, u32 code length, code, u32 control length, control. The observed prefix is `0x88` bytes and the control section `0x880` bytes. +- **Fix:** `shader_split.py` `pg_sized_shader` recognizes the self-described section boundaries and NVN magics (`0x12345678` for graphics code, `0x12345679` for compute, `0x98761234` for control). The prefix must be aligned and in bounds, both sections must fit, the record must end with its control section, and the control's code length at `+0x704` must agree. Graphics stages come from SPH; the compute magic identifies compute. The reader emits `#PGSO` records so the existing single-stage cover pairing applies. Recognition needs no title or filename rule, and the shader translation chain is unchanged. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): the objects in five DAT shader archives inside `data000.cpk`; the game note records the census and the runtime-key checks. + ### BNSH files in PlatinumGames DAT archives inside CRI CPK archives - PlatinumGames' engine in its Wii U form keeps its shaders as BNSH files of one stage each, the `.vso` / `.pso` members of PlatinumGames DAT archives (`shader.dat`, `shader2.dat`, `shadereff.dat`) inside a CRI CPK archive, all CRILAYLA-compressed ([01](../agents/01-extract.md) has the CPK layout). `dm/gfx/tools/cpk.py` reads the @UTF tables (and the masked ones of Unicorn Overlord's CPKs, the same tables as before once unmasked), the TOC and CRILAYLA (a decoder over a bit string, about 29 MB/s); `shader_split.py` `cpk_jobs` splits the CPKs into jobs and scans each entry (a CPK it cannot read is scanned as one file, with a `[RED]` line). @@ -405,6 +412,47 @@ Finding, keying and translating shaders (`dm/gfx/tools/shader_split.py`, `dmsh_b - **Note:** Big Brain Academy's 12 geometry shaders (`_BezelSystemResources/line/shader/line.bfsha`) do not build (`unknown main0_out`) and their draws are skipped (`[RED] primitive type 11 not implemented`). They take a line strip with adjacency (primitive type 11) and emit up to 12 vertices per segment as triangle strips: thick lines with joins and caps (28 emit sites). From the main menu on, every frame draws one such line (width 10 in its uniform block) into the top-left 512x512 of the frame and copies that region into a texture, so the menu's chart loses its outlines. Not done. - **Note:** the vendored Ryujinx translator has its geometry-to-compute transforms (`VertexToCompute`, `GeometryToCompute`), which the chain does not use yet. +### Geometry reader viewport masks + +- **Symptom:** the geometry kernel compiles, but its `_bgv.metal` vertex reader fails with `use of undeclared identifier 'gl_BuiltIn_5253'` and `member reference base type 'int' is not a structure or union`. +- **Cause:** `ResourceReservations` packs `ViewportMask` into one output word; `GenerateVertexPassthroughForCompute` stores that word as a scalar although SPIR-V `IoMap` declares builtin 5253 (`ViewportMaskNV`) as `int[1]`. SPIRV-Cross emits an invalid array-copy expression for it, and Metal has no viewport-mask output. The mask still matters: zero discards a primitive, while bit zero selects viewport zero ([NV_viewport_array2](https://registry.khronos.org/OpenGL/extensions/NV/NV_viewport_array2.txt)). +- **Fix:** `dmsh_geometry.reader` recognizes that generated scalar-array store, retains the mask's integer bits and moves vertices beyond the X clip plane when bit zero is clear. This runs before `vs_depth` makes both depth entries. Using the X plane preserves culling with depth clamp too; moving vertices beyond the far depth plane allowed masked points to render when depth clamp was enabled. Unknown mask expressions fail the build instead of silently losing culling. No pinned translator change is required. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): its four geometry shaders' readers. +- **Check:** `dm/gfx/tests/test_dmsh_geometry.py` uses synthetic generated-reader MSL. Both Mac and iOS compiler checks reproduce the original error before the fix. Mac GPU readback covers six masks, points and triangles, depth clip and clamp, and both production depth entries (48 cases); zero-mask points under depth clamp fail with the earlier depth-plane cull. All four original readers also pass both platform syntax checks. +- **Limits:** replay binds viewport zero only. Multi-viewport fanout is not implemented, and per-vertex-disagreeing masks are not validated; the tested primitives use one mask for every vertex. These tests establish compilation and viewport-zero culling, not the appearance of those effects in gameplay. + +### Passthrough geometry output bounds follow input topology + +- **Symptom:** a passthrough geometry kernel writes beyond its vertex and raw-index scratch regions, and compaction reads the wrong groups; corruption can reach the following primitive-map buffers without a red diagnostic. +- **Cause:** the builder used the SPH's raw maximum output count for every topology. Ryujinx's `ShaderDefinitions` overrides that count for `GpPassthrough` (SPH word 0 bit 24) with the input primitive's vertex count excluding adjacency. A header can declare one vertex while the triangle variant writes three vertices and six raw index words per group. Allocating two index words per group then overlaps later scratch regions. +- **Fix:** `dmsh_geometry.output_layout` mirrors the translator's override for each input variant: points, lines, lines with adjacency, triangles, triangles with adjacency use vertex bounds `1, 2, 2, 3, 3` and index strides `2, 4, 4, 6, 6`. Passthrough also inherits the input primitive: native GLSL omits the SPH's output primitive declaration, so `ShaderDefinitions` and metadata use point, line strip or triangle strip accordingly. `geometry_finish` writes those bounds and topology into each variant's metadata, which replay uses for allocation and compaction. Ordinary geometry shaders retain their declared bound and topology. Rebuild shaders and the host for the new chain. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): its passthrough index-building geometry shaders; the triangle kernel's six-word stores disagreed with its two-word metadata while rendering flight. The game note tracks the visual result after correction. +- **Check:** `test_dmsh_geometry.py` covers all five variants, ordinary bounds and malformed headers. With `DM_TEST_GEOMETRY` pointing at `t_geometry`, it passes production-generated layouts to a native emitter with independent topology bounds. GPU canaries protect the nominal vertex and raw-index allocations, and compaction must preserve the emitted count and order. The old rule produced 34 failures; the corrected metadata passes all 170 native checks with Metal validation. + +### Passthrough geometry kernels lose raster vertices + +- **Symptom:** a geometry kernel compiles and runs its storage-buffer side effects, but contains no `geometry_vb_output` binding and fills its index stream with restart markers; its following raster pass draws no geometry. +- **Cause:** the offline accessor inherited native geometry-passthrough support. Native NV passthrough forwards input vertices without an explicit emit, but Metal's compute stage must emit them. Disabling native support alone still loses generic attributes: independently compiled stages have no linked next-stage usage to populate `PassthroughAttributes`. +- **Fix:** fixed-input compute jobs report no native geometry-passthrough support. `EmitterContext` explicitly emits input positions and every captured generic attribute the GS did not replace, removing adjacency vertices as the input topology requires. This uses the complete Maxwell capture map; ordinary linked translation retains its existing usage mask. Copying all 128 generic components also exposes a Metal backend compiler failure at normal optimization (`Internal compiler error` when creating the pipeline, despite successful offline compilation). `dmsh_geometry.capture_input` keeps capture reads volatile, preserving their values and normal kernel optimization while preventing that failure. No game IDs or shader keys participate. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): its passthrough index-building shaders run before depth-writing raster passes during flight. The game note tracks rendering after rebuilding. +- **Check:** `PassthroughCompiler` translates a synthetic EXIT-only Maxwell passthrough shader for all five input topologies, deliberately declaring triangle output in every raw header. Both Mac and iOS compile checks run. With `DM_TEST_GEOMETRY`, production reflection and the argument encoder dispatch the actual kernels; readback checks positions, all 32 generic attributes, adjacency selection, two instances, raw indices, restart padding, primitive compaction and allocation canaries (9,066 native checks). The original pinned translator fails all five variants because raster output is absent. Removing volatile capture reads makes the 128-component synthetic pipeline fail to compile on the M4 Pro; reducing to 96 components or compiling at `-O0` independently removes that failure. + +### Geometry capture waits for every indexed draw + +- **Symptom:** geometry-heavy frames have a large submission wall/CPU gap despite short GPU execution; stack samples spend most of the main thread in `geo_draw` → `mdi_wait` → shared-event wait, with index sorting another substantial cost. +- **Cause:** every indexed geometry draw unconditionally committed and drained the GPU before assembling its primitives on the CPU. It also waited for vertex streams consumed only by native GPU capture. The capture list sorted every index reference to remove duplicates, even though the scratch bound already limits the vertex span. +- **Fix:** `nvn_geometry.inc` checks each actual CPU-read range against pending copies/updates/fills, current shader writes and previous live submission writes. Unknown or overflowing write sets retain the wait. Indirect records are checked before decoding; their selected index ranges are checked afterwards. CPU-converted vertex bindings retain the same hazard checks, while native capture follows GPU encoder ordering. A successful drain covers the remaining reads of that draw. Capture uniqueness uses a bounded vertex-span bitset and ascending set-bit enumeration; allocation failure or a wider span retains an in-place sort fallback. Non-indexed captures need no unique index list. The primitive map, restart handling, base vertex and instance semantics are unchanged. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): its flight geometry path. The game note records matched frame-time and visual validation. +- **Check:** `t_geometry` first reproduced five unnecessary drains for clean static and indirect inputs. Its 226 native checks cover clean versus pending/current/prior GPU-written ranges, unknown write sets, GPU-only and converted streams, indirect arguments selecting a different dirty index range, 8/16/32-bit indices, restart, base vertex and instances. Actual copy/compute writes and raster readback validate synchronization; converted data must see the new GPU-written value. Sparse duplicates, ascending output, short destinations, fallback and allocation canaries cover the capture list. These checks establish behavior; throughput is measured separately in gameplay. + +### Geometry compaction serial prefix scan + +- **Symptom:** geometry-heavy frames remain GPU-bound after CPU readback waits are removed; encoder timestamps attribute most compaction time to the offset scan rather than the geometry shader or index writes. +- **Cause:** count and write dispatches ran in parallel, but one GPU thread walked all group counts to compute ordered offsets. Geometry replay also created a separate compute encoder for each of the geometry, count, scan and write dispatches, with full queue barriers at every boundary. +- **Fix:** `geo_pack_scan` divides the groups into contiguous chunks across at most 256 threads. Each thread sums its chunk; a threadgroup prefix scan gives its starting offset; a second chunk pass writes the ordered offsets. The group count does not need to fit in the threadgroup. Totals use 64 bits; unrepresentable 32-bit offsets saturate, output writes use subtraction-based capacity checks, and indirect counts retain complete-primitive truncation. `geo_pack_encode` keeps the geometry and three compaction dispatches in one encoder, with explicit dispatch-to-dispatch device-memory barriers. Full barriers remain at its boundaries. The primitive order and large-draw algorithm are preserved; no shader-library chain change is required. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): its flight geometry passes. The game note records the baseline encoder timings and matched result. +- **Check:** `t_geometry` passes 1,066 checks with Metal validation. A GPU producer and the production compaction stages share one encoder; readback compares every offset and ordered index with an independent CPU result, including 129,032 groups. Cases cover points, lines and triangle strips, empty groups, zero/odd/thread-boundary group counts, 1/32/192/256-thread scans, short capacities, integer overflow and allocation canaries. The actual translated passthrough integration also passes all five input topologies through the same encoder path. Performance is checked separately with matched gameplay. + ### Geometry draws above the capture scratch bound - **Symptom:** `[RED] geometry draw needs 261 MiB of scratch, above the 256 MiB bound` (or `exceeds the capture or invocation bound`); the draw is skipped. @@ -438,6 +486,22 @@ Finding, keying and translating shaders (`dm/gfx/tools/shader_split.py`, `dmsh_b - **Found on:** [The Legend of Zelda: Link's Awakening](../../dm/games/01006BB00C6F0000/README.md) (Mac and iPhone): the step of Marin and Tarin's doorway. The room shaders use tiled forward lighting: the fragment position picks a 64×64-pixel tile (`trunc(y / 64) × ceil(width / 64) + trunc(x / 64)`), whose light count and light indices come from two storage buffers that a compute shader (`light_culling_compute.bfsha`, one thread per workgroup, one workgroup per tile) fills every frame. Every row's workgroups wrote row 0's entries, the last writer won (a different one each frame), and the bottom tile row, where the step is, got the lights of other rows; a dump of the tile lists showed only the first of 17 rows filled. After the fix every tile row has its lights and the doorway shows the game's soft light from outside. - **Check:** Breath of the Wild (101 compute and 4 vertex shaders read `c0`) and Super Mario 3D World (11 and 1) render the same as before on the Mac. +### Geometry-stage storage buffer table + +- **Symptom:** `[RED] shader ... reflection conversion failed: B binding gp_s0 has no resolved slot number`; a geometry shader reading driver segment `c0` reports that its storage-buffer table base was never measured. +- **Cause:** geometry shaders access their storage buffers through `c0 + 0x410 + 0x10 r`, but the builder's `SSBO` map and replay's `c0_ssbo_base` covered only vertex, pixel and compute. Running the lowered geometry shader as a Metal kernel does not change its logical NVN stage or driver table. +- **Fix:** geometry uses base `0x410` in both reflection and driver-buffer population. `encode_args` keeps NVN stage 2 for these kernels, so storage slots and driver-table rows come from the geometry bindings. Hull and domain bases remain unmeasured and unresolved. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): the original shader's constant-buffer operands and the pinned translator's metadata agree on addresses in rows 0 and 2. +- **Check:** `dm/gfx/tests/test_dmsh_reflect.py` resolves synthetic geometry descriptors to slots 0 and 2 and rejects unknown or unaligned table addresses. `t_geometry` passes synthetic metadata through native reflection and the production argument encoder; GPU readback checks both rows' guest addresses and sizes with different compute-stage bindings, plus a write through the geometry storage pointer. + +### Storage-buffer write flag in translation metadata + +- **Symptom:** a storage buffer the shader stores to or uses atomically has `rw: false` in its generated reflection; replay does not record its GPU writes for dependent buffer reads. +- **Cause:** Ryujinx's `BufferUsageFlags.Write` is bit 0 (`1`), and `Program.cs` serializes that enum unchanged. The builder tested bit 1 (`2`), incorrectly marking every such descriptor read-only. Native reflection honors the explicit `rw` field, so its older fallback to the MSL pointer qualifier could not correct it. +- **Fix:** `reflect` tests bit 0 for both driver-table storage buffers and addresses carried in guest uniform buffers. Replay then uses its existing write-access and pending-write tracking paths. Rebuild shaders to replace the old metadata. +- **Found on:** [NieR:Automata The End of YoRHa Edition](../../dm/games/010056B015FE8000/README.md): its geometry counter atomic and output stream both emitted translator flag `1` but reached reflection as read-only. +- **Check:** `test_dmsh_reflect.py` exercises writable and read-only translator descriptors, including an address in a guest uniform. `t_geometry` verifies that native reflection preserves explicit true and false flags and that the writable geometry output enters the GPU-write tracker before its dispatch. + ### Graphics `c0 + 0x610`: the largest point size - **Symptom:** point sprites of size 0 (Odyssey's Cap Kingdom fog never parted around Mario).