diff --git a/dm/games/01007EF00011E000/README.md b/dm/games/01007EF00011E000/README.md index 9a4eb51..62194d2 100644 --- a/dm/games/01007EF00011E000/README.md +++ b/dm/games/01007EF00011E000/README.md @@ -102,6 +102,20 @@ Used at `DM_FPS_TARGET=0` and for the interval the framework keeps while the VFR - **Resolved: duplicate pipeline keys from disabled blend state.** A recording held 4,829 keys for 1,982 distinct pipelines from 1,818 Metal 4 bases; 2,845 keys differed only in blend factors of targets whose blending was disabled. [Pipeline keys omit unused colour state](../../../docs/reference/shaders.md#pipeline-keys-omit-unused-colour-state) describes the shared normalization. - `pack_ipa.py` packs its 16 GB IPA in 57 s (Info-ZIP took 2 min 50 s). +### Pipelines on a cold start + +- `pso_pairs.tsv`: 3,012 shader pairs from agl's BAHS program variations (the agl / gsys / terrain resource packs), which `shader_pairs.tsv` does not hold. 109 of the 543 pairs drawn on entering Zora's Domain came from them; with the table all 543 are known. The prebuild (15,767 bases) takes 910 MB in 16 files, 187 s with 7 workers for the first 12,755 and 19 s for the 3,012 more; the files open in 2.2 s cold, 0.25 s from the file cache, and add about 850 MB of footprint. +- Mac (M2 Max), the Zora's Domain save, Metal shader cache empty (a new bundle ID per run): + +| Start | Frame entering the area | Draws that waited, entering it | +|---|---|---| +| `DM_PSO_MTL4=0`, no `pso_user.tsv` | 990 ms, then 535 / 738 / 496 ms frames | 512 draws, 3,325 ms | +| Hybrid, archive prebuilt from `shader_pairs.tsv`, no `pso_user.tsv` | 830 ms, no other frame over 250 ms | 102 draws, 650 ms | +| Hybrid, archive prebuilt with `pso_pairs.tsv` too, no `pso_user.tsv` | 340 ms, no other frame over 150 ms | 50 draws, 20 ms (no pair without its pulling base) | +| Hybrid, archive and `pso_user.tsv` of an earlier run | no frame over 100 ms | 17 draws, 4.6 ms | + +Every kind of cold start also shows the game's own 130–220 ms frames every 9–13 frames for a while after the load, with no pipeline work in them. + ## Mac routes - From the title menu into the autosave: `DM_KEYS=f2500:A,f2800:A,f3100:A,f3400:A` (control at frame ~3900). @@ -119,6 +133,7 @@ General host changes first needed here; each applies to every game: - **Spin waits that take a spin lock** (`patch_nso.py` "Spin waits", `dm_spin_wait`) and **yields that make progress** (`thr_yield`): [development.md, Power](../../../docs/development.md#power). - **`DT_RELR`** (`relr_apply`) and **halfword jump tables** (`half_count`): [Packed relative relocations (DT_RELR)](../../../docs/reference/rewriter.md#packed-relative-relocations-dt_relr), [Halfword jump table landing pads sized to the largest entry](../../../docs/reference/rewriter.md#halfword-jump-table-landing-pads-sized-to-the-largest-entry). **NVN calls on the big host stack** (`nvn_big_entry`): [NVN entry points on the big host stack](../../../docs/reference/nvn-objects.md#nvn-entry-points-on-the-big-host-stack). - **SDK 20 service calls** and **record sizes against `GetCommandMemoryUsed`** (`draw_rec`): [SDK 20 six-axis sensor and amiibo (`nfp`) calls](../../../docs/reference/services.md#sdk-20-six-axis-sensor-and-amiibo-nfp-calls), [Applet resource user ID, launch parameters and VR mode](../../../docs/reference/services.md#applet-resource-user-id-launch-parameters-and-vr-mode), [Shared font load request](../../../docs/reference/services.md#shared-font-load-request), [Model heaps sized by the host's command record sizes](../../../docs/reference/memory.md#model-heaps-sized-by-the-hosts-command-record-sizes). **SDK 20's audio renderer layout** (`render_once`): [SDK 20's `AudioRenderSystem` layout](../../../docs/reference/audio.md#sdk-20s-audiorendersystem-layout). **Running a 30 fps game at 60**: [sead's dynamic present interval, `ksys::VFR` and the host's frame step](../../../docs/reference/frame-rate.md#seads-dynamic-present-interval-ksysvfr-and-the-hosts-frame-step). +- **Pipeline bases, hybrid pipelines and the prebuild** (`pso_build_ex`, `hybrid_get`, `pso_prebuild`): [development.md, Hybrid pipelines](../../../docs/development.md#hybrid-pipelines), [Pulling vertex inputs](../../../docs/reference/rendering.md#pulling-vertex-inputs); measured under [Pipelines on a cold start](#pipelines-on-a-cold-start). - **Hitch dumps and guest thread names** (`DM_HITCH_DUMP`), **heap probes** (`DM_PROBE_HEAP*`), **autorelease leaks**: [05, Scripted input and thread scheduling](../../../docs/agents/05-debugging.md#scripted-input-and-thread-scheduling), [05, Memory growth](../../../docs/agents/05-debugging.md#memory-growth). ## Open diff --git a/dm/games/01007EF00011E000/pso_pairs.tsv b/dm/games/01007EF00011E000/pso_pairs.tsv new file mode 100644 index 0000000..d4e3b26 --- /dev/null +++ b/dm/games/01007EF00011E000/pso_pairs.tsv @@ -0,0 +1,3013 @@ +# kind: evidence vertex / pixel shader pairs of agl program variations (BAHS) that shader_pairs.tsv does not hold, for the pipeline prebuild only (generated by dm/gfx/tools/shader_split.py, do not edit): vertex key pixel key +01be5a92907e6e16 69e579d81b294d68 +01be5a92907e6e16 f350bb6918d9fdea +0246f3fec578278b 925ba8ee8f49b33e +030c1a8dbdb8c365 3e46cfde6bf5087d +030c1a8dbdb8c365 7240e0b9216d7fab +030c1a8dbdb8c365 dba6d0453cb740f9 +030c1a8dbdb8c365 f357fdc36feb270d +032bb73b1c96a38e 0ee080977102497a +032bb73b1c96a38e 46614936ac13b289 +0439e113cb0929c3 4882606599e506ff +044e9221c42b1c00 2aacb41eeafd99fb +044e9221c42b1c00 a86fa724f4e9e8bb +044e9221c42b1c00 b487914edcdb711b +044e9221c42b1c00 c0b8accf0fbd2781 +046b794fbbe6cd4f cd0d58b128fb3f9b +04a3aa12e317622f dd1eea7b70c7c273 +05b20dc5f0960782 18cb4ef0e44bee43 +05b20dc5f0960782 99ccc755eb609168 +05b20dc5f0960782 cfc3e13298c3c1aa +05b20dc5f0960782 d980e2d83b446d6f +0607ba204a2e1acb 2aacb41eeafd99fb +0607ba204a2e1acb a86fa724f4e9e8bb +06ef91820073a584 5eeba3e58ff8c06c +07550eefe82f73aa 4caeba046484be63 +07cc6cae74d49c16 07fb15f7cce6d533 +07cc6cae74d49c16 13564ff56a3267b7 +07cc6cae74d49c16 1f387acc44b827ac +07cc6cae74d49c16 1f5f3dd6e29c721c +07cc6cae74d49c16 268310347a281b82 +07cc6cae74d49c16 297b3adcfb870f06 +07cc6cae74d49c16 40148ccf6589f1fe +07cc6cae74d49c16 43e9f5bbe111a821 +07cc6cae74d49c16 44032df21ae158e8 +07cc6cae74d49c16 45576ac70e227eac +07cc6cae74d49c16 4d49a1a7dd0f93c0 +07cc6cae74d49c16 505aa19006a2b70b +07cc6cae74d49c16 5d4ce705d2fe6ed7 +07cc6cae74d49c16 5e44798cd6e6e43e +07cc6cae74d49c16 619d44942f6a4da4 +07cc6cae74d49c16 64a9eef45477f5c1 +07cc6cae74d49c16 6720b1e0cd31f6a8 +07cc6cae74d49c16 6c128eaac0ecc1d6 +07cc6cae74d49c16 728c939971c22c12 +07cc6cae74d49c16 78b1a8b034171131 +07cc6cae74d49c16 8d96d57f323e044c +07cc6cae74d49c16 8f04c54b05431038 +07cc6cae74d49c16 94f19abed2524223 +07cc6cae74d49c16 b6326c3608635ad7 +07cc6cae74d49c16 bf16864071af1c24 +07cc6cae74d49c16 cf2e4ee0c10f1e03 +07cc6cae74d49c16 d2c6facaf9ad82b2 +07cc6cae74d49c16 d67d183d75460a10 +07cc6cae74d49c16 e625138a2762e3fb +07cc6cae74d49c16 ec94c1ddb28e181f +07cc6cae74d49c16 f56145f24f5fa99d +07cc6cae74d49c16 f7d370a096816c3b +092c27dce37d8d5a 7a7e340274fbb590 +0989f3b133730075 d755fbada2c10cd9 +0a69c77356c0752b b02775ec2c8e4a92 +0a69c77356c0752b dadc11d44c8cec7e +0b0ed1087c495b7c 9bd76e366cec0da8 +0b120ac2af46bef9 7240e0b9216d7fab +0b120ac2af46bef9 dba6d0453cb740f9 +0b5c3a04bd579b57 9549751f85856a97 +0c8e9d25c52d723f 24cd45ee407bc31c +0c8e9d25c52d723f c5bc947469b81473 +0d2aee23b1e5eeec 1b7a33a867bfa797 +0d4744d002dc328e 9c2deb30bb42217b +0ed7d2487624a061 0d0d9173ff0be49d +0ed7d2487624a061 7eca6b9b90a59645 +0ed7d2487624a061 a1348ce80211c7a3 +0ed7d2487624a061 af95f892bfcdbfae +0f19504455f4ab49 73891215b8f9091b +0f4559ae6fe84f58 aa015823b84bfc4e +1082455b6b7ebe27 0016115ce3f3488f +111d88a5c132fe0f 1bc2335d9bcd9355 +111d88a5c132fe0f 3a00e3dcc7fd0926 +12a8bd08868f927b 3d37ac0ac1a5d232 +12a8bd08868f927b 6755309678a46f07 +12a8bd08868f927b a18b9bd02ca716d8 +12a8bd08868f927b f6f4f08a33a9cbc6 +12e262b4548e9ce3 3ef5977307ea0d5c +12e262b4548e9ce3 7d25048425736e27 +12e262b4548e9ce3 dce4a244c7f9e746 +12e262b4548e9ce3 e2af9600c5786b35 +12e6d1d0f91839f5 74ff768ced2ff776 +134812e58696a882 eeaa603f77086a47 +137607bb58ba3268 2094d7c3dd1e59d9 +137607bb58ba3268 7cf9f61b9838628d +13ca0758e7ed2520 64992efa3fe2cfc1 +13ca0758e7ed2520 806bf9cf8a95b840 +13ca0758e7ed2520 a1a89e1c0e950595 +13ca0758e7ed2520 b25c8fb83b5cce42 +13ca0758e7ed2520 b2daaaf38762d5c5 +13ca0758e7ed2520 e51245342b7c754e +1430289de5345f9f 0055c6b5392aafd4 +1430289de5345f9f 0d419e91d3c47213 +1430289de5345f9f 12f28effc2903fc0 +1430289de5345f9f 1792593948d3aa76 +1430289de5345f9f 1bada949b3939173 +1430289de5345f9f 1fbddc952be1caef +1430289de5345f9f 5be8ad70f0ed6469 +1430289de5345f9f 66c9d7a1caf873cc +1430289de5345f9f 78b9897963135665 +1430289de5345f9f 851e72db6c2f6643 +1430289de5345f9f 88f164a1a22ab681 +1430289de5345f9f b51d5335d0dc552f +1430289de5345f9f c86412fb464a3b1e +1430289de5345f9f ce155946d816f1a9 +1430289de5345f9f d0845caa66f24baa +1430289de5345f9f db3765a6ec245b17 +1430289de5345f9f e584634c70374764 +14805420cf3db39a 28fa9447625e244f +14917452a941a6c2 153fd595931405a2 +14917452a941a6c2 35a6169fc2ca69bd +14917452a941a6c2 617c3c56f3778485 +14917452a941a6c2 6563d9a972a5a30e +14917452a941a6c2 d26df772c36032cd +14917452a941a6c2 e41353410f76809f +14ccb69ef78dd91d d86c02cce0f8d260 +15ba6d135f8daf6a 14b765579e75b857 +1624eee28ae3d869 13564ff56a3267b7 +1624eee28ae3d869 1f387acc44b827ac +1624eee28ae3d869 40148ccf6589f1fe +1624eee28ae3d869 4d49a1a7dd0f93c0 +1624eee28ae3d869 505aa19006a2b70b +1624eee28ae3d869 5d4ce705d2fe6ed7 +1624eee28ae3d869 5e44798cd6e6e43e +1624eee28ae3d869 64a9eef45477f5c1 +1624eee28ae3d869 78b1a8b034171131 +1624eee28ae3d869 8f04c54b05431038 +1624eee28ae3d869 94f19abed2524223 +1624eee28ae3d869 bf16864071af1c24 +1624eee28ae3d869 cf2e4ee0c10f1e03 +1624eee28ae3d869 d2c6facaf9ad82b2 +1624eee28ae3d869 d67d183d75460a10 +1624eee28ae3d869 ec94c1ddb28e181f +168c376bf57f6ed3 28fa9447625e244f +168c376bf57f6ed3 6d8d7a74b39c564c +168c376bf57f6ed3 709e1dc3114848b0 +168c376bf57f6ed3 abd1181088e01639 +16cf951c31326c85 630ce6f71220870f +17dccd27ad609e8b 4d04ce3426b95c5c +17dccd27ad609e8b 7b3503f6346516c6 +17dccd27ad609e8b ecb4242efaf4042b +180ad61f0a4a2ab5 1b7a33a867bfa797 +192fa9617f96a4de 91cee660cbd4e0d8 +192fa9617f96a4de b096cd7237c0b06c +192fa9617f96a4de c9f4b463a0f5108b +192fa9617f96a4de e5e3f03bbe3d24a6 +19f0784a4c0c2d01 00cd504df928d778 +19f0784a4c0c2d01 15dd07266e3555c5 +19f0784a4c0c2d01 22413337311db403 +19f0784a4c0c2d01 4f67afe1b4b2e50e +19f0784a4c0c2d01 51d42fa53a56b27b +19f0784a4c0c2d01 9d9f50ac01968aa0 +1a15c831c8635a08 00cd504df928d778 +1a15c831c8635a08 15dd07266e3555c5 +1a15c831c8635a08 22413337311db403 +1a15c831c8635a08 4f67afe1b4b2e50e +1a15c831c8635a08 51d42fa53a56b27b +1a15c831c8635a08 9d9f50ac01968aa0 +1a179a7dfa6ad324 0ba68a463a1b28a0 +1a179a7dfa6ad324 1b952d008f2a2948 +1a179a7dfa6ad324 343bb455662189f2 +1a179a7dfa6ad324 7c5ced033b2e7ed1 +1a179a7dfa6ad324 9e6e8758629e775d +1a179a7dfa6ad324 b86974c4b8065e26 +1a179a7dfa6ad324 e1f2d8c262ab4264 +1a179a7dfa6ad324 eb13f2726a890ff5 +1afbc8c41b0927b9 98d2ec2c9b8dfd2a +1b9ec86ef9e37d5d 6317a68167678aa9 +1b9ec86ef9e37d5d c9c50dbfcf5c2db1 +1bdd4529ffd74ecc 378c49d3964651d7 +1bdd4529ffd74ecc 4a3c8b1bac41c9d4 +1bfbd76db57cd8fb 34db51f4831fa2bf +1c69e4a3df9c47a3 0b5b4539b538dd91 +1c69e4a3df9c47a3 0cda8b16c440d02d +1c69e4a3df9c47a3 2546d315f04b6db3 +1c69e4a3df9c47a3 2ed1a63ccd2d5bdb +1c69e4a3df9c47a3 3e96b820d51c04c6 +1c69e4a3df9c47a3 4719ee62acae7363 +1c69e4a3df9c47a3 61fc11e4581cc0bc +1c69e4a3df9c47a3 72d5599e74d985aa +1c69e4a3df9c47a3 73c09eb8badd1010 +1c69e4a3df9c47a3 77968f7f1dacb014 +1c69e4a3df9c47a3 7d7b07e802f943ce +1c69e4a3df9c47a3 856ea6de415d6c7a +1c69e4a3df9c47a3 ae14029b02d22ce1 +1c69e4a3df9c47a3 b78f34581e3f5e26 +1c69e4a3df9c47a3 d91073ff722762ef +1c69e4a3df9c47a3 f5652ebffe98f8da +1c69e4a3df9c47a3 f5eb420b4a934465 +1c69e4a3df9c47a3 fb944f2347addcea +1cc2a27c880c4558 9aacd9847e7700cb +1d7b8afd45dbe91e 5379a7f3b588d5da +1d7b8afd45dbe91e 9510817d349553f3 +1e4e2ccad0e6ecab bad7b34d06c61e31 +1e684a187106ac96 addc8774ebbb510c +1e8f3edf2978e7c5 0b9301095aea75c6 +1e8f3edf2978e7c5 591fee8925f2bb8b +1e8f3edf2978e7c5 742bfecad4d21bbe +1e8f3edf2978e7c5 863f646be991e406 +1e8f3edf2978e7c5 8a5ecfc0dd1133f5 +1e8f3edf2978e7c5 9f2859bea195b7bb +1e8f3edf2978e7c5 edbece19512741a1 +1e8f3edf2978e7c5 f2f68f5b94fa2b0b +1ea35e575956e6c8 471e3f85da2ae661 +1f037afbe71a66f4 01a34dba95bdfcc4 +1f037afbe71a66f4 021edbaa0533e669 +1f037afbe71a66f4 0322ea2dc75428fa +1f037afbe71a66f4 0348b03acac25949 +1f037afbe71a66f4 03f8c47a9fd1aa67 +1f037afbe71a66f4 045907d9c522abae +1f037afbe71a66f4 052343bf04d4cb24 +1f037afbe71a66f4 054a73a4c9fef9ce +1f037afbe71a66f4 0649c291ae21ec3f +1f037afbe71a66f4 07412757f43b9594 +1f037afbe71a66f4 0843513942b5da98 +1f037afbe71a66f4 093290d03342fed1 +1f037afbe71a66f4 0942e87e6251dacf +1f037afbe71a66f4 0a937308e297f975 +1f037afbe71a66f4 0b5964e58c236803 +1f037afbe71a66f4 0c0ad95fa1122f28 +1f037afbe71a66f4 0ca6671a5325d472 +1f037afbe71a66f4 0cc84c91d97496a1 +1f037afbe71a66f4 0cf780789a6d87cb +1f037afbe71a66f4 0d05b2dc5d884b18 +1f037afbe71a66f4 0e10611125f12117 +1f037afbe71a66f4 0e17c8846b13cee0 +1f037afbe71a66f4 0eac280a8f088738 +1f037afbe71a66f4 1033cd2b3f9824c4 +1f037afbe71a66f4 117a238e991b8494 +1f037afbe71a66f4 11c33cc21455b937 +1f037afbe71a66f4 11d074a15d5986f7 +1f037afbe71a66f4 1244e8342c2b4e36 +1f037afbe71a66f4 1497ebaa117b5698 +1f037afbe71a66f4 14c2be1646eb5e4b +1f037afbe71a66f4 1565553ed43aec39 +1f037afbe71a66f4 158a31e4df164001 +1f037afbe71a66f4 15dea9ae0a87a478 +1f037afbe71a66f4 1658e4b9979afe30 +1f037afbe71a66f4 166f65f16a1219b4 +1f037afbe71a66f4 1690706f07eb26d7 +1f037afbe71a66f4 169539aa99e03779 +1f037afbe71a66f4 1812f97152da8d53 +1f037afbe71a66f4 18690965e99e67fc +1f037afbe71a66f4 18b6e37492c2abd0 +1f037afbe71a66f4 18cb3b017df340c4 +1f037afbe71a66f4 196f197ea609bf51 +1f037afbe71a66f4 19763a2671f85094 +1f037afbe71a66f4 197af80ad2f625b9 +1f037afbe71a66f4 19b3db2e464d30a0 +1f037afbe71a66f4 1a343af11218ab7b +1f037afbe71a66f4 1a73e3e45e372587 +1f037afbe71a66f4 1ac9278e2f8803e1 +1f037afbe71a66f4 1ad13137140d940b +1f037afbe71a66f4 1b2726423437b5ce +1f037afbe71a66f4 1b35c2d4fada0742 +1f037afbe71a66f4 1c09f48da13adb4b +1f037afbe71a66f4 1c3d62a6f24f6959 +1f037afbe71a66f4 1c69336f187482e4 +1f037afbe71a66f4 1ccb20a97fb9508b +1f037afbe71a66f4 1d3ff501bf232688 +1f037afbe71a66f4 1de66359e953a14d +1f037afbe71a66f4 1eb46bf477109ab4 +1f037afbe71a66f4 1f5b44a1da08a3b7 +1f037afbe71a66f4 1ffa5e216092e48a +1f037afbe71a66f4 212eb983d66a2292 +1f037afbe71a66f4 218b9c2df795b630 +1f037afbe71a66f4 21971659b64211ba +1f037afbe71a66f4 2302ad53240902de +1f037afbe71a66f4 236140188aeb7144 +1f037afbe71a66f4 23ce7c5cc82e4c6e +1f037afbe71a66f4 24ad814637f4bf4e +1f037afbe71a66f4 2543a10c702d2c0f +1f037afbe71a66f4 261019fa7fa96802 +1f037afbe71a66f4 261966aeb782b8d2 +1f037afbe71a66f4 26a8409f58062201 +1f037afbe71a66f4 2735148b5ad6e63a +1f037afbe71a66f4 278ad55ef6911b91 +1f037afbe71a66f4 27e27b91cd7aa786 +1f037afbe71a66f4 284073e3851199eb +1f037afbe71a66f4 28bde01cea3d27f1 +1f037afbe71a66f4 29ff45f3ec10e345 +1f037afbe71a66f4 2a52ed31a99ac909 +1f037afbe71a66f4 2aa9249c6d1135e2 +1f037afbe71a66f4 2b735f57c280b8c8 +1f037afbe71a66f4 2c06faa8ca3c0e75 +1f037afbe71a66f4 2ca5047f0a49cbed +1f037afbe71a66f4 2ce5189c64dccba5 +1f037afbe71a66f4 2d316bccde8cfd3a +1f037afbe71a66f4 2df16115f8a91d24 +1f037afbe71a66f4 2e2d17ea0b869b20 +1f037afbe71a66f4 2e3ecaae39ffb942 +1f037afbe71a66f4 2e54e1bdacdde1ac +1f037afbe71a66f4 2ebeca1c29f83392 +1f037afbe71a66f4 2f0df7defd53a952 +1f037afbe71a66f4 30396bc553be130d +1f037afbe71a66f4 30cea125d469efde +1f037afbe71a66f4 311ca96b06119449 +1f037afbe71a66f4 32443e25aaa9f765 +1f037afbe71a66f4 328d363c80ae99b4 +1f037afbe71a66f4 32fbf8e7a593a18c +1f037afbe71a66f4 335b90a266cc5912 +1f037afbe71a66f4 338f30f57a4086f5 +1f037afbe71a66f4 33aabc2b14a0e306 +1f037afbe71a66f4 349f604b5591a78f +1f037afbe71a66f4 358cb007cbf35564 +1f037afbe71a66f4 3658dfaffd1fc9f0 +1f037afbe71a66f4 3671c28d314de6ca +1f037afbe71a66f4 36950ab9cadd9142 +1f037afbe71a66f4 37020152ab5180ee +1f037afbe71a66f4 376c60bef112b4d4 +1f037afbe71a66f4 37a0f6520f1a8839 +1f037afbe71a66f4 38c7619a0c67ceca +1f037afbe71a66f4 39daa0c104e1ad9e +1f037afbe71a66f4 3a70661f04b6e594 +1f037afbe71a66f4 3a83016f005d288d +1f037afbe71a66f4 3b33b53185c2e69a +1f037afbe71a66f4 3bbd36479a901b9f +1f037afbe71a66f4 3c1693148acbf02a +1f037afbe71a66f4 3c6cdf5661a82bf7 +1f037afbe71a66f4 3c80407098f0f7db +1f037afbe71a66f4 3d601531dc4f6f7b +1f037afbe71a66f4 3e8567da37eb28a1 +1f037afbe71a66f4 3f62d02074eb92c2 +1f037afbe71a66f4 3f6fe561d2222b4e +1f037afbe71a66f4 3f9597ae8891b862 +1f037afbe71a66f4 3fe580cb272de065 +1f037afbe71a66f4 400293c7e57a75b5 +1f037afbe71a66f4 40efefe28a59b601 +1f037afbe71a66f4 415c6f439f764c34 +1f037afbe71a66f4 41fea873f6569532 +1f037afbe71a66f4 421844af1ea262bd +1f037afbe71a66f4 422336159dbc235f +1f037afbe71a66f4 436cd3a781caf08a +1f037afbe71a66f4 43fb0e8758367a1c +1f037afbe71a66f4 441ee2d9dcf35014 +1f037afbe71a66f4 44a4f91fc2faa3d8 +1f037afbe71a66f4 44eaaffc61ff121e +1f037afbe71a66f4 44f08ad62fff0291 +1f037afbe71a66f4 457602629f010145 +1f037afbe71a66f4 46243263668a260e +1f037afbe71a66f4 4665a3fd295870ab +1f037afbe71a66f4 4704341552539aaa +1f037afbe71a66f4 47ca8a61a3bc4c77 +1f037afbe71a66f4 47cb0bffcead3663 +1f037afbe71a66f4 47fb1a0530216675 +1f037afbe71a66f4 48ab4026ba6a2bd8 +1f037afbe71a66f4 49fc4930d3ff7085 +1f037afbe71a66f4 4aa6dd7e3bfce939 +1f037afbe71a66f4 4bd1d26e36d3b92f +1f037afbe71a66f4 4da1af52776b3198 +1f037afbe71a66f4 4e4cf88f6f581026 +1f037afbe71a66f4 4e58ac9b68a86767 +1f037afbe71a66f4 4ea137ee534b3b22 +1f037afbe71a66f4 4f085a991ddac9ef +1f037afbe71a66f4 4f24996c244bd423 +1f037afbe71a66f4 4f2fd72e31b7340b +1f037afbe71a66f4 4fb0680ad7c2ca9f +1f037afbe71a66f4 4fb77297bbfb5a4a +1f037afbe71a66f4 50e5057e8db5c241 +1f037afbe71a66f4 51027d32ee710bd8 +1f037afbe71a66f4 51c79cf15188490e +1f037afbe71a66f4 521c0314e5f95a8e +1f037afbe71a66f4 53a11e84272c8842 +1f037afbe71a66f4 53a3ce63a49c8663 +1f037afbe71a66f4 5573a2dd4908dcc3 +1f037afbe71a66f4 5574a92624b607ea +1f037afbe71a66f4 55ec0252376f57c9 +1f037afbe71a66f4 567e05ab9b6668f5 +1f037afbe71a66f4 56962f4a8c7b3e81 +1f037afbe71a66f4 56e47f01e47d94ef +1f037afbe71a66f4 57c1fa39086a96d8 +1f037afbe71a66f4 585ce249bf00044c +1f037afbe71a66f4 592074adc3d5eb92 +1f037afbe71a66f4 593dcc90d40c43b6 +1f037afbe71a66f4 59a4d5836093d7a7 +1f037afbe71a66f4 59d748ca1ccb9047 +1f037afbe71a66f4 59e5f8cee827ff75 +1f037afbe71a66f4 5a0dcedbd7a8b99b +1f037afbe71a66f4 5aeda0a56903a007 +1f037afbe71a66f4 5b5ec958a37b6096 +1f037afbe71a66f4 5dec65c199b5c019 +1f037afbe71a66f4 5e25a389f9a7f285 +1f037afbe71a66f4 5ee6b77fc54c43a1 +1f037afbe71a66f4 5f1972df5a3bd4af +1f037afbe71a66f4 5f20753fd3cb3b8a +1f037afbe71a66f4 5fdb34efc275b7f5 +1f037afbe71a66f4 6001d6f342b87d91 +1f037afbe71a66f4 606079e75da9dd90 +1f037afbe71a66f4 609bcb0ef7dc98e6 +1f037afbe71a66f4 61abb04b83cf73ca +1f037afbe71a66f4 626b182ea4f246b4 +1f037afbe71a66f4 62990bb14175b772 +1f037afbe71a66f4 63dc5a5e10aa5da7 +1f037afbe71a66f4 6475717e409767df +1f037afbe71a66f4 64b16867f8223c78 +1f037afbe71a66f4 6545b2924b60d8a5 +1f037afbe71a66f4 65dc96cec8a6aefa +1f037afbe71a66f4 6621ea967db1e06b +1f037afbe71a66f4 663dc2f1e7ef880e +1f037afbe71a66f4 6a45afc5c22daf30 +1f037afbe71a66f4 6ac0396a7f35ba4f +1f037afbe71a66f4 6ad667000674f5b5 +1f037afbe71a66f4 6b6292d5fb3e4304 +1f037afbe71a66f4 6b822ad03df9b86a +1f037afbe71a66f4 6c5e6a4ee52764ae +1f037afbe71a66f4 6cab086cf41b022b +1f037afbe71a66f4 6ce2b62d66de22a5 +1f037afbe71a66f4 6ce366d0e2f8ccbf +1f037afbe71a66f4 6ddc6dc067fcf4d6 +1f037afbe71a66f4 6e2a319600d3bdec +1f037afbe71a66f4 6f1d814a84a50eeb +1f037afbe71a66f4 6f28f8836ed57040 +1f037afbe71a66f4 6f5e683da00e37ce +1f037afbe71a66f4 6f8c6621f35cf057 +1f037afbe71a66f4 7030e004248ca15d +1f037afbe71a66f4 705df47982e8e445 +1f037afbe71a66f4 70a7b4df183ef7c2 +1f037afbe71a66f4 721fb15620013def +1f037afbe71a66f4 7292c0777e9d722c +1f037afbe71a66f4 7313e0af835986a6 +1f037afbe71a66f4 73b0b748cb63481a +1f037afbe71a66f4 759eee56aa203cbf +1f037afbe71a66f4 771ba375df61f5e0 +1f037afbe71a66f4 780c1645ef002175 +1f037afbe71a66f4 78a2d566032dee71 +1f037afbe71a66f4 78b8c8060e87fb34 +1f037afbe71a66f4 78cb9d57a05f5918 +1f037afbe71a66f4 79f5b5a0bb9384a0 +1f037afbe71a66f4 7ae25259add666a9 +1f037afbe71a66f4 7d185829b93d7366 +1f037afbe71a66f4 7d323b2179a83a6b +1f037afbe71a66f4 7d4c108f0960baa2 +1f037afbe71a66f4 7dc5789779729a21 +1f037afbe71a66f4 7e8f695efea0ddda +1f037afbe71a66f4 7ea12eb52310ac89 +1f037afbe71a66f4 7ec03155f57eeb99 +1f037afbe71a66f4 7f7b4965bb39ece7 +1f037afbe71a66f4 802d234b20e6b78d +1f037afbe71a66f4 81bca444fa8eceb9 +1f037afbe71a66f4 81f79b27669ddaec +1f037afbe71a66f4 82c8f35ee124952c +1f037afbe71a66f4 834eb7adab944ec1 +1f037afbe71a66f4 83cff5fa437dde64 +1f037afbe71a66f4 8401980378de70e7 +1f037afbe71a66f4 840ba2e0179825d4 +1f037afbe71a66f4 84992eccdd730332 +1f037afbe71a66f4 84d71777729c7b17 +1f037afbe71a66f4 85be84289739d3b3 +1f037afbe71a66f4 86f1a53da65e8c95 +1f037afbe71a66f4 88fdd8fe252261ce +1f037afbe71a66f4 89663e79026175aa +1f037afbe71a66f4 8979d808d0894759 +1f037afbe71a66f4 8a393ddbad8be221 +1f037afbe71a66f4 8a68fe44378a4c7f +1f037afbe71a66f4 8a75a1b51708bbf2 +1f037afbe71a66f4 8a99e739b5dc13de +1f037afbe71a66f4 8b2af3f0450587c8 +1f037afbe71a66f4 8b6eefdaee459589 +1f037afbe71a66f4 8bea1d7d490a41e0 +1f037afbe71a66f4 8c806f52353a9c58 +1f037afbe71a66f4 8d0d667a3293c353 +1f037afbe71a66f4 8d14fd6e7194cfee +1f037afbe71a66f4 8d3bab365f988d74 +1f037afbe71a66f4 8dac926c61dd0af0 +1f037afbe71a66f4 8dd7b76fd4415b75 +1f037afbe71a66f4 8e1fa755a537729f +1f037afbe71a66f4 8f9c97f28a53c522 +1f037afbe71a66f4 8fe930321043fd29 +1f037afbe71a66f4 8ffe9c1e17653a44 +1f037afbe71a66f4 90b8e8bd4b42b0c1 +1f037afbe71a66f4 91393aad5a9ba75b +1f037afbe71a66f4 91780f52ccdf26cc +1f037afbe71a66f4 91c90fe84e8a45bb +1f037afbe71a66f4 921d5155a412e88e +1f037afbe71a66f4 9319901815a896af +1f037afbe71a66f4 9362d9211a11eabc +1f037afbe71a66f4 93a7be118ce43152 +1f037afbe71a66f4 93caddc5d77fe8e1 +1f037afbe71a66f4 9414fcdcb67f9327 +1f037afbe71a66f4 941cd1e18eeebfa5 +1f037afbe71a66f4 9462218580f43691 +1f037afbe71a66f4 96335758fb50d291 +1f037afbe71a66f4 9646b98ba4567128 +1f037afbe71a66f4 9682e356a49fab7b +1f037afbe71a66f4 96d731080d518129 +1f037afbe71a66f4 97870a345cfa3ad7 +1f037afbe71a66f4 98209dec9d91910b +1f037afbe71a66f4 98842c9dc694b9b9 +1f037afbe71a66f4 988981b8fd9d532c +1f037afbe71a66f4 98e1c7cdc1f64b43 +1f037afbe71a66f4 99cb2c253cfc1a45 +1f037afbe71a66f4 99ec79aedbbebd8d +1f037afbe71a66f4 9a1aaeaae5fc14e6 +1f037afbe71a66f4 9cd83540f7fe32d0 +1f037afbe71a66f4 9cdc9448f67abb70 +1f037afbe71a66f4 9d7850a9f73f7602 +1f037afbe71a66f4 9e0222333eee5873 +1f037afbe71a66f4 9e6f38e85205a06c +1f037afbe71a66f4 9ef5b7ae40dd56d7 +1f037afbe71a66f4 9f3f504a358329b5 +1f037afbe71a66f4 9fac3200f07a3f58 +1f037afbe71a66f4 9fe096d5b8f653f9 +1f037afbe71a66f4 a05bdda293a531da +1f037afbe71a66f4 a17894e982fe9142 +1f037afbe71a66f4 a25c68f808747798 +1f037afbe71a66f4 a2d7f0f8f53131ab +1f037afbe71a66f4 a302a663b920d1e7 +1f037afbe71a66f4 a5b8f8a56b1a3fe2 +1f037afbe71a66f4 a63a92577b0990b3 +1f037afbe71a66f4 a67a6f474005dfde +1f037afbe71a66f4 a71a2878857f6f4b +1f037afbe71a66f4 a789ba0058d4e85b +1f037afbe71a66f4 a7a7212c9dede6f3 +1f037afbe71a66f4 a7fb32a5a1019e9d +1f037afbe71a66f4 a8137ceefda6ef22 +1f037afbe71a66f4 a93b89b21d66f933 +1f037afbe71a66f4 a9eb94918b962dcb +1f037afbe71a66f4 aa4c40a200ac6b4e +1f037afbe71a66f4 ab3ab93aa2e6deab +1f037afbe71a66f4 abd477fdb2ed7185 +1f037afbe71a66f4 ae6bbd761319e29d +1f037afbe71a66f4 aeeca69025aa1557 +1f037afbe71a66f4 af3939114e3936c6 +1f037afbe71a66f4 af5def3123f619eb +1f037afbe71a66f4 b0255e9d2c3717c7 +1f037afbe71a66f4 b1e222ac6a0e42fb +1f037afbe71a66f4 b20e925132dc2335 +1f037afbe71a66f4 b219cc02819cf333 +1f037afbe71a66f4 b2fe375d562c3508 +1f037afbe71a66f4 b3636db3fc9a5bfc +1f037afbe71a66f4 b396bfe9c028a7fe +1f037afbe71a66f4 b3d18ed297472362 +1f037afbe71a66f4 b407e5ff659704ce +1f037afbe71a66f4 b41a2a53b8a7984d +1f037afbe71a66f4 b42573c71a40e883 +1f037afbe71a66f4 b43300ce086ed959 +1f037afbe71a66f4 b452a309f17d005e +1f037afbe71a66f4 b4dac7b651de0f59 +1f037afbe71a66f4 b51adb1ce6630053 +1f037afbe71a66f4 b59ce1c4c348f8ef +1f037afbe71a66f4 b5b7146056d7a31b +1f037afbe71a66f4 b6a3f8a582205c4c +1f037afbe71a66f4 b6f588770e797317 +1f037afbe71a66f4 b7bea139ac427717 +1f037afbe71a66f4 b7df0b2096e43c77 +1f037afbe71a66f4 b834a14ce8e8ad1c +1f037afbe71a66f4 b92ac768e9efb710 +1f037afbe71a66f4 ba5e1ac22db52b52 +1f037afbe71a66f4 baaf6612d8bc88ce +1f037afbe71a66f4 baf764db15cae91f +1f037afbe71a66f4 bb1a6bbcd98dae6a +1f037afbe71a66f4 bc892ea805ebf8e7 +1f037afbe71a66f4 bd18df537615d4c2 +1f037afbe71a66f4 bd4c2b5ed0d0daf3 +1f037afbe71a66f4 be064c0b953cecc4 +1f037afbe71a66f4 bec08a5dd7a78b1b +1f037afbe71a66f4 bf621b290a9c3fa1 +1f037afbe71a66f4 bf63333ac2888605 +1f037afbe71a66f4 c03a766dd3edf76a +1f037afbe71a66f4 c05d5c4c97b98ffc +1f037afbe71a66f4 c06305373206fc9a +1f037afbe71a66f4 c064d00ccd8f9a4b +1f037afbe71a66f4 c1a85b6c34c19a38 +1f037afbe71a66f4 c32665582e498e01 +1f037afbe71a66f4 c362cfd425e234c1 +1f037afbe71a66f4 c3e223e50a1899be +1f037afbe71a66f4 c45b1842adff8816 +1f037afbe71a66f4 c4a109b4f6e7c79d +1f037afbe71a66f4 c4a26b89848a3f72 +1f037afbe71a66f4 c50e640142cc14bd +1f037afbe71a66f4 c541e4988f8a075b +1f037afbe71a66f4 c5928a4ce27864db +1f037afbe71a66f4 c595ccb8960de043 +1f037afbe71a66f4 c5d387dd5103a39d +1f037afbe71a66f4 c77cf988dc5a558a +1f037afbe71a66f4 c7f094989aad11d9 +1f037afbe71a66f4 c80324a72b54c5b7 +1f037afbe71a66f4 c8be85a4eb326a0f +1f037afbe71a66f4 c8e485a4ca19b350 +1f037afbe71a66f4 c97e757fb4bdb3d8 +1f037afbe71a66f4 cac279100f505430 +1f037afbe71a66f4 cb22102a41ea44fa +1f037afbe71a66f4 cb9ad974dea4c68b +1f037afbe71a66f4 cbff060767c4a0e7 +1f037afbe71a66f4 cca6b51361598c7c +1f037afbe71a66f4 ccff87e553d6ada1 +1f037afbe71a66f4 cdf66a5bfe5868c6 +1f037afbe71a66f4 ce001ebab53cd5f1 +1f037afbe71a66f4 ce8e0fc2bb4a8a7e +1f037afbe71a66f4 d010f098c8cc37c2 +1f037afbe71a66f4 d05bec28bcfbbe8f +1f037afbe71a66f4 d2f3a66094a82827 +1f037afbe71a66f4 d377f8c2ec0b973f +1f037afbe71a66f4 d4211e30b16746a1 +1f037afbe71a66f4 d467889c6adcdc2a +1f037afbe71a66f4 d67d495f0db80387 +1f037afbe71a66f4 d6cd4c7406b460ab +1f037afbe71a66f4 d6dc374e7fe69470 +1f037afbe71a66f4 d76e429fb91e8d16 +1f037afbe71a66f4 d779bc8202cd08ff +1f037afbe71a66f4 d7832466dc814276 +1f037afbe71a66f4 d87f69dc338cb8b8 +1f037afbe71a66f4 d896527fe6564c1f +1f037afbe71a66f4 d8f2bde5087119e8 +1f037afbe71a66f4 d92f89da3fe7ee96 +1f037afbe71a66f4 da36b951116508c7 +1f037afbe71a66f4 da4a10848b76977c +1f037afbe71a66f4 da568a3459c2b327 +1f037afbe71a66f4 db7ab1c3220aa210 +1f037afbe71a66f4 dd04c2a70adbadec +1f037afbe71a66f4 ddbe43a2e74574cf +1f037afbe71a66f4 de22d1a81ce8e738 +1f037afbe71a66f4 deb72534029e20e9 +1f037afbe71a66f4 dfb8b04ed3074e47 +1f037afbe71a66f4 e0e358b212dc01ca +1f037afbe71a66f4 e10de6bd98f57703 +1f037afbe71a66f4 e26ad35b834bb57f +1f037afbe71a66f4 e2b286c45c644851 +1f037afbe71a66f4 e3246c274631f38f +1f037afbe71a66f4 e336e36b22ece70f +1f037afbe71a66f4 e42cae2ac5729837 +1f037afbe71a66f4 e474e9a3ca9e1a90 +1f037afbe71a66f4 e47dc7774b7e6efa +1f037afbe71a66f4 e5f73c2b3d707b7b +1f037afbe71a66f4 e6a409b6c5114947 +1f037afbe71a66f4 e6eb47b7294c6943 +1f037afbe71a66f4 e7bfd1d37c8e6509 +1f037afbe71a66f4 e963f1d84e613356 +1f037afbe71a66f4 eab6488fa19cf063 +1f037afbe71a66f4 eaca73007b74d3ea +1f037afbe71a66f4 ecb065a06f7a05d1 +1f037afbe71a66f4 ecb4242efaf4042b +1f037afbe71a66f4 ed0f81a9b114c7f8 +1f037afbe71a66f4 ed2510684a5a320e +1f037afbe71a66f4 ed679867409b4126 +1f037afbe71a66f4 eec3979a0ec07763 +1f037afbe71a66f4 ef7a8b8279e7cdde +1f037afbe71a66f4 eff34661f70fa69e +1f037afbe71a66f4 f00c0c7a04f20bea +1f037afbe71a66f4 f02d7f8b163be8cc +1f037afbe71a66f4 f04239f9de2cc449 +1f037afbe71a66f4 f1107172a38231ea +1f037afbe71a66f4 f1bca5289245477f +1f037afbe71a66f4 f1db53afb8087496 +1f037afbe71a66f4 f28dce447be93bea +1f037afbe71a66f4 f392f86ec0aaf041 +1f037afbe71a66f4 f3c8f40391a24040 +1f037afbe71a66f4 f49f14fc3bebf974 +1f037afbe71a66f4 f57e3162742dfec3 +1f037afbe71a66f4 f5ba1614715bf53d +1f037afbe71a66f4 f5c0f4bab92e547c +1f037afbe71a66f4 f5fb3ccb74d65fe8 +1f037afbe71a66f4 f61c02c207077d46 +1f037afbe71a66f4 f64a5a98a0704d89 +1f037afbe71a66f4 f66f6ca2a8054e09 +1f037afbe71a66f4 f71638318e3dad84 +1f037afbe71a66f4 f7a8849426174ceb +1f037afbe71a66f4 f85a0891a72f4afa +1f037afbe71a66f4 f8bb20c043f6816d +1f037afbe71a66f4 f8d398bf4dbdbc6b +1f037afbe71a66f4 f9b6d8671837eabc +1f037afbe71a66f4 fb39efd132a64c55 +1f037afbe71a66f4 feed872b58d055b3 +1f037afbe71a66f4 fefefb5e8e6a6d27 +1f037afbe71a66f4 ffca9af7450a4cd6 +1f037afbe71a66f4 fff0af4db9b3810f +1fc25ef166bb25bd 577220de75344d2e +1fc25ef166bb25bd 6e888f5da9b01237 +1fc25ef166bb25bd 739d5049c3cc017e +1fc25ef166bb25bd 96f9d700ef5f84f4 +1fc25ef166bb25bd ce809622fb76a2d9 +201d5e9fb2aa2fb7 b6e56983313b1fb1 +201d5e9fb2aa2fb7 d96440cce16e9545 +208a800ad2c2158d 3204fcd61378b827 +208a800ad2c2158d 3f61bfb22189fd48 +208a800ad2c2158d 7cc3993e7cf19d2a +208a800ad2c2158d 86ad484a9430823f +208a800ad2c2158d 8f8256dcc7cb4395 +208a800ad2c2158d 995f1a615329813f +208a800ad2c2158d babf867aff5a167e +208a800ad2c2158d fdde0d8484b7f04f +20ae44e221518f45 72941205d99bb7a3 +20ae44e221518f45 7ea7d3e914735904 +20ae44e221518f45 f27af687e2935fd7 +21f9126d6d184646 016e81b4b5344204 +22ce08f5120c119c 564fe0a839f946dd +2319b4177d1c2809 020a0b9a9a297aea +2319b4177d1c2809 604a29551a6c8ab1 +2342c92060f89a67 2b3e497443a5303f +2342c92060f89a67 67431a1bdfed181f +239f09e29a482976 c8dd614e68e84913 +246c67216bfc9dcd 4f88cd0ea0d06465 +2484559ae4c3b24d 678b0c0f451b8944 +24dbca3be0162e9a 179ce4db769b4add +2512069b8d895d36 dd1eea7b70c7c273 +26a43fc421707e9a beb6221a01054b66 +2769059518a5d4b8 565e1cc2cdd893ba +277908ddcf1cd871 8110c74078548172 +277908ddcf1cd871 ff40f533617ee90f +27839b518d592488 295f409b9fadc530 +27839b518d592488 590d07e65b3f87cb +27839b518d592488 80c018f55a60344c +27839b518d592488 92e00c6c40f2f260 +27839b518d592488 a347f0197ce5fe30 +27839b518d592488 ee99bac9b6b20212 +281753e540d00a43 f1604c60496ae974 +28355061e8de5af5 b5e2a38d10708d5c +28355061e8de5af5 c0669daecda7415e +2992ddbc896349bf 678ee2a8da9e3639 +29985926ad45875c 07a32c89b2fda507 +29985926ad45875c 093d16da2cc9cec3 +29985926ad45875c 0baf72e8821f5e3d +29985926ad45875c 0e96851ba8d878ce +29985926ad45875c 1d42c06fbc821e3a +29985926ad45875c 2f53fc5344468ce5 +29985926ad45875c 30974712de84db15 +29985926ad45875c 32b418b22649dae8 +29985926ad45875c 3a346b639fda4513 +29985926ad45875c 3b3006e0462ebcab +29985926ad45875c 4330ba732a60739e +29985926ad45875c 457de28e5d324206 +29985926ad45875c 460b138ea9a5fc0d +29985926ad45875c 47df8b302ce89bae +29985926ad45875c 55364ae4ce22ad46 +29985926ad45875c 62a4c30aaf53f0f7 +29985926ad45875c 687d2c756ef77034 +29985926ad45875c 6b002e364d5dfec6 +29985926ad45875c 6e745df5bec973b3 +29985926ad45875c 6f98b6a28b55c53a +29985926ad45875c 74c24eb072d93e29 +29985926ad45875c 75207860f219fe6a +29985926ad45875c 776cb11e135c5181 +29985926ad45875c 7a890e1db3808ac1 +29985926ad45875c 7d521127923ece70 +29985926ad45875c 7e3f0dfae64445a6 +29985926ad45875c 82863c067b78d02e +29985926ad45875c 8873f4feecd8fc9a +29985926ad45875c 895c0d0d979bade6 +29985926ad45875c 905848101a5dbacc +29985926ad45875c 91cf4c02760c21fb +29985926ad45875c 9a5eb447c906d8de +29985926ad45875c a572a68b34647ff0 +29985926ad45875c ac3249588376c1dd +29985926ad45875c b54744963072eb09 +29985926ad45875c b5aa63f8ba2969b7 +29985926ad45875c b685575b030d2be7 +29985926ad45875c b7ad21374a91c8fd +29985926ad45875c d100f36daaff739e +29985926ad45875c d27c32b9fa1f76b1 +29985926ad45875c db3b47bc3ca728d2 +29985926ad45875c e0a45d8ad169d20d +29985926ad45875c e1043baa26336f43 +29985926ad45875c e38e40f205a3037e +29985926ad45875c e7f3b9158525d65f +29985926ad45875c eef234b001cff570 +29985926ad45875c f38adc388db38081 +29985926ad45875c fb0be2c74bd55545 +29f8964da3f573a1 17985ad09687de42 +29f8964da3f573a1 8f1e5d8565fe3b09 +2b256a8e186cfc54 0f7c9cb7669456af +2badc52c0ae51070 34677ed55db6ca09 +2badc52c0ae51070 85816d93324384a0 +2bc8ff09f0f0eeeb 08c416fd3198df53 +2bc8ff09f0f0eeeb 18cdd497f48f2690 +2bc8ff09f0f0eeeb 2f1af81fe302df71 +2bc8ff09f0f0eeeb 3ab00dd17feacd36 +2bc8ff09f0f0eeeb 511aecf0e9e83d04 +2bc8ff09f0f0eeeb 54ab095249459229 +2bc8ff09f0f0eeeb b14a6cd8bd4d89fe +2bc8ff09f0f0eeeb b607af8d9faefc8f +2bc8ff09f0f0eeeb d0eec7bcee121dca +2bc8ff09f0f0eeeb d3e6dba899836f48 +2bc8ff09f0f0eeeb dc1599ba4061e2bd +2bc8ff09f0f0eeeb e8f1660df366298e +2c1d7b89ec0f6920 d8cad07cc8c16984 +2c4e53aa27739ef6 addc8774ebbb510c +2ccfd52bf527f910 7eca6b9b90a59645 +2cfa26b44e8c9e28 856f033fbc37a26d +2cfa26b44e8c9e28 fda96f52e5434e44 +2d840747ae5ac6c9 1fd97b8706575777 +2d840747ae5ac6c9 a09867ea44e07eab +2d9fc1de1513aa86 078447f608a41a21 +2d9fc1de1513aa86 318caef632709d99 +2d9fc1de1513aa86 361b5c384dcc6a7d +2d9fc1de1513aa86 3e29f4849cb9c7da +2d9fc1de1513aa86 88e5157648dfc502 +2d9fc1de1513aa86 9dd018213489cc18 +2d9fc1de1513aa86 a35ee731ef7578cf +2d9fc1de1513aa86 b8bb3ec9a045c9b8 +2d9fc1de1513aa86 bcf7e6b30fbea17e +2d9fc1de1513aa86 cd4ced64b8d800cd +2d9fc1de1513aa86 eac0708a5cc86d78 +2d9fc1de1513aa86 f5ba198cb2c061ae +2dd010a29c1fba2f 905acfa1a44f0a57 +2decd3e894b3736a 26ae1640f3448ba4 +2e51d89505f5e6e9 940bc2688bb71f57 +301a6f9669434c88 74dedbfc87b18ccb +301a6f9669434c88 a49323972109105f +301a6f9669434c88 a866b1656c55d454 +301a6f9669434c88 d755fbada2c10cd9 +306e5d08dd089b33 08fe25061d583637 +306e5d08dd089b33 1769e55ef7b76369 +306e5d08dd089b33 895362645eeb762f +306e5d08dd089b33 e7714b0a656dcfc2 +31671c72fa6c3ffe dd1eea7b70c7c273 +319528ca0df5506d 32d2bfd16179d494 +319528ca0df5506d cc0b32f7b026958a +32d0f6e143780255 9a08f70c2775ebe7 +32d0f6e143780255 b6e61323a67551d3 +32d0f6e143780255 cb8f5f811fa60687 +32d0f6e143780255 ef9e314de2941c4d +34be760e3496b81d 1962c9d728608261 +34be760e3496b81d 379ac6ba05a78197 +34be760e3496b81d 626d4ac6bbeec91a +34be760e3496b81d 628c671e53eac9f5 +34be760e3496b81d 6d4957b8e0c19928 +34be760e3496b81d 754271a4c8677a08 +34be760e3496b81d 79c42b6e6ad795ad +34be760e3496b81d 8a6431d2f1bf983d +34be760e3496b81d a2406ffb6621954d +34be760e3496b81d aa881759663d7e70 +34be760e3496b81d ac93cd99649881c9 +34be760e3496b81d b1597156871dd38a +34be760e3496b81d b96b699c06794484 +34be760e3496b81d e467ee870491928e +34be760e3496b81d fcc8d0ea42d4d941 +3557621b1ac58c90 4cc7dba8e6d9504b +3557621b1ac58c90 4fe515e8e7e6fcd1 +3557621b1ac58c90 75faa7ccdf6ddfae +3557621b1ac58c90 8656896835e2088e +3557621b1ac58c90 8babc48af1eca09b +3557621b1ac58c90 aeabe4316d4441d2 +3557621b1ac58c90 d5bb7abb1fd6a1a9 +3557621b1ac58c90 e69aa7e026704f42 +3632c2681d256ac6 00f5a0572be1eb2a +3632c2681d256ac6 781d6771dae7625b +37339e0439e3d9c6 141dc59e839e06d9 +37339e0439e3d9c6 4929732c4817bb72 +37339e0439e3d9c6 6a47ffa246a21e5d +37339e0439e3d9c6 d75c6eb71dbb9033 +373e8377d7f1e9b5 8cc566d5ffd9f850 +373e8377d7f1e9b5 c4193c1eda099dea +383e3753312d0b76 d86c02cce0f8d260 +384597a04ae3928e 00d93e073ff624e6 +384597a04ae3928e 2ab6c9fadc7f8cb4 +384597a04ae3928e 2f69fdec6571dd4d +384597a04ae3928e 39a0a17be54cafe3 +384597a04ae3928e 6af0d6ff5f10eb6d +384597a04ae3928e 71f5167fe36c717f +384597a04ae3928e 7dd7e3131a70bae4 +384597a04ae3928e 92c1198e916ac1ed +384597a04ae3928e 9b13e5d9ac99442e +384597a04ae3928e 9c2deb30bb42217b +384597a04ae3928e 9def6ca0223dd1d4 +384597a04ae3928e b3a8aea183777898 +384597a04ae3928e c835080785786479 +384597a04ae3928e d0c0205a8bbe168d +384597a04ae3928e f7ee6fe10b925543 +397181806d57273a cd3b9fa05dadf490 +3996c2f2363b634b 1c60d8b87aed28b4 +3996c2f2363b634b 24a359acfd71ccfd +3996c2f2363b634b 4eee71881ed6e3c5 +3996c2f2363b634b 62b06d51d247806d +3996c2f2363b634b 6dc6bea8a17ed57a +3996c2f2363b634b 93aa5e22a8202409 +3996c2f2363b634b 94ebb5cf3ee543f0 +3996c2f2363b634b b8656271c8a4afee +3a0d8be3e359e659 50cfb53ddc1c82e2 +3a0d8be3e359e659 90d0d9f0a60bda2e +3aa6ba4f4553506e bc32dce768a83e92 +3c79f4112a877d13 9786d84e2006896d +409f07dabde1942b 1fd97b8706575777 +409f07dabde1942b a09867ea44e07eab +43d1051e6daf9953 1fd97b8706575777 +43d1051e6daf9953 a09867ea44e07eab +43f916789d5b7320 f849afce4f8e7e5e +44e0349a45140f88 02949742c087e915 +44e0349a45140f88 d4137dafdab30240 +451d786154f9704e 3e46cfde6bf5087d +451d786154f9704e 7240e0b9216d7fab +451d786154f9704e dba6d0453cb740f9 +451d786154f9704e f357fdc36feb270d +454381adb20491c5 2860bb4c3b578a46 +454381adb20491c5 6a72b495c70ac26e +4639249140206b96 1746c310a1c6eebb +4639249140206b96 ad317afffcab0a23 +4667ac13a69484b9 5bd1308ce214fc83 +47434f4c1adfd0d5 ebc09ab415c57716 +47bd33443ac203d8 0214bce40e5a91cd +47bd33443ac203d8 0b3dfb9fcd938c58 +47bd33443ac203d8 0b419cb88ec9d982 +47bd33443ac203d8 12b59ceb6657e21c +47bd33443ac203d8 1dc41bb61c305aec +47bd33443ac203d8 1e872870ee856b1c +47bd33443ac203d8 1ed29b8cac5814f5 +47bd33443ac203d8 20aaaac52877bc70 +47bd33443ac203d8 20d31d0604d724e5 +47bd33443ac203d8 2a93c3b5a268bd8f +47bd33443ac203d8 2d06bff10f7c131e +47bd33443ac203d8 3a202c34c2f5b36f +47bd33443ac203d8 3ae175fe23efa527 +47bd33443ac203d8 3bbece86af768206 +47bd33443ac203d8 3beacf853d337366 +47bd33443ac203d8 3ce77f9cc6b81b68 +47bd33443ac203d8 45bc1ef60884d3f5 +47bd33443ac203d8 47d3a0d29ae8944c +47bd33443ac203d8 496eed960d6089a1 +47bd33443ac203d8 4a3737ea2e4b2306 +47bd33443ac203d8 4c1a3a9d051950d5 +47bd33443ac203d8 511af8334faca6db +47bd33443ac203d8 55db42d1c3018402 +47bd33443ac203d8 563490663ef02846 +47bd33443ac203d8 59c20b82bbfc397f +47bd33443ac203d8 5b81fe9786fb91fc +47bd33443ac203d8 600f17e164ae5e09 +47bd33443ac203d8 63923284a4be461a +47bd33443ac203d8 64d159e8d88d68e5 +47bd33443ac203d8 650b8d332969e029 +47bd33443ac203d8 690ad56d535a67df +47bd33443ac203d8 6b9482e91e6d9097 +47bd33443ac203d8 6d4237c0a0615a11 +47bd33443ac203d8 6f23f57ef13c7d36 +47bd33443ac203d8 788009747b487e40 +47bd33443ac203d8 7fbcf31de4d41b05 +47bd33443ac203d8 81276eb679367527 +47bd33443ac203d8 8234fd14e0fb65ed +47bd33443ac203d8 850c3bb3e7711f1e +47bd33443ac203d8 90ebcaf155415297 +47bd33443ac203d8 947be84382561bb4 +47bd33443ac203d8 b3c565b3feac3058 +47bd33443ac203d8 bbdc4516178e837c +47bd33443ac203d8 cb6fc1a799ee6cdd +47bd33443ac203d8 d036267dfbd6b544 +47bd33443ac203d8 d42fc5186d496c2b +47bd33443ac203d8 e19bea630ba4914b +47bd33443ac203d8 e25ec5c8e6fe1325 +47bd33443ac203d8 ea26fa3973bb4a1b +47bd33443ac203d8 ec9e647bddceb1a1 +47bd33443ac203d8 f6c956a17bfeda7e +47bd33443ac203d8 f9e12dbc23c774e1 +47bd33443ac203d8 fa6744545f11ea78 +47bd33443ac203d8 fae2590ba303f16e +49d57d75ea20562e 208046efad82773c +49d57d75ea20562e 8443ebafb605f1ec +4aa1331f53171828 10c9b1a9f71f7e29 +4aa1331f53171828 77dce940f97f1a16 +4bcdb57137dec253 a49e10314bb89cba +4c498a3494cf3e50 1765bd180c462cb0 +4c498a3494cf3e50 3b5bf68e15df66a0 +4d4be49968fcb4ed 14d4fe48107606c2 +4d4be49968fcb4ed 15508b45c33bade7 +4d4be49968fcb4ed 1cc73898c8a1e809 +4d4be49968fcb4ed 27b5ef8152c2369c +4d4be49968fcb4ed 346e2e33be68df3e +4d4be49968fcb4ed 57cc8d1a356b4005 +4d4be49968fcb4ed 6dd39664b1879d18 +4d4be49968fcb4ed 73eecad18e5a43a3 +4d4be49968fcb4ed 8def98794e5dfe0c +4d4be49968fcb4ed 97f7428b4a0306d6 +4d4be49968fcb4ed 9f2a780d355574e3 +4d4be49968fcb4ed b0b8a3217b53d09f +4d4be49968fcb4ed b558f676103f2ac2 +4d4be49968fcb4ed c5acde1cee3b8166 +4d4be49968fcb4ed d636f5b200412480 +4d4be49968fcb4ed d731a0d217a105b5 +4d4be49968fcb4ed e8df07f3509739f8 +4df4b9ba461e7f60 c34ca151275add16 +4e08f0d81ca72806 6c66d2a01236cf70 +4e08f0d81ca72806 6fb478cc57be1e7d +4e08f0d81ca72806 9c8053675febfbb4 +4e08f0d81ca72806 ced524b299c02307 +4f54bd92e87e88c2 08a8d1342e6e29dd +4f54bd92e87e88c2 1e75f9b2da7d4838 +4f54bd92e87e88c2 3f34f75b5fb9d8eb +4f54bd92e87e88c2 5833e9960efb6421 +4f54bd92e87e88c2 67758af2bd90f55e +4fd8cbaa9046c8f2 53066037b6c15c74 +50221af1c5a50a25 0258f6694ff3767f +504ac5597dce11b2 153fd595931405a2 +504ac5597dce11b2 35a6169fc2ca69bd +504ac5597dce11b2 617c3c56f3778485 +504ac5597dce11b2 6563d9a972a5a30e +504ac5597dce11b2 d26df772c36032cd +504ac5597dce11b2 e41353410f76809f +508baa27673c3ee5 416c3c3bb5c168f1 +508baa27673c3ee5 681e060a49cffc34 +5095f06ff96fb0d4 47645519b37c1a10 +509832fcde2a28db 0d662c61685e393b +509832fcde2a28db 26fa955b715ac5f6 +509832fcde2a28db 9913844e3e245bc5 +509832fcde2a28db a864a59f83b167ce +509832fcde2a28db bbf993e9d281f89a +509832fcde2a28db d4c307b69c36c459 +509832fcde2a28db fb8513c7f9abc2fe +509832fcde2a28db ff73b9f2b736ab3e +5176be858cbddf45 fcf8cd65158243d9 +51f07d21b502ff06 2916a1b424c49795 +51f07d21b502ff06 42a0d155150c9b29 +51f07d21b502ff06 564077ae38876f9a +51f07d21b502ff06 566d54d8395266ec +51f07d21b502ff06 6cf4f0609c1db23f +51f07d21b502ff06 8bc2926453704d7d +51f07d21b502ff06 9b13e5d9ac99442e +51f07d21b502ff06 a8c9712743b88496 +51f07d21b502ff06 e37626a519c8fbe4 +51f07d21b502ff06 eb60ffdca0ffb2fe +51f07d21b502ff06 fcf96300cb9d26cb +51f07d21b502ff06 fd4e71ce65b0ff7a +523985888bb18191 0ea8b8b1cfad661d +523985888bb18191 130d106cac176994 +523985888bb18191 27a4361a0f967a82 +523985888bb18191 29fa605fc16e715a +523985888bb18191 34ee4261b5c640f0 +523985888bb18191 36716b2c4c623bd8 +523985888bb18191 39172e27095faf0d +523985888bb18191 557c81a168af656b +523985888bb18191 62d1939b527508c6 +523985888bb18191 69cba6ee38b3c703 +523985888bb18191 79644a784536b2fc +523985888bb18191 7cdf071b8dabe1f6 +523985888bb18191 7f23d30c453a2d7d +523985888bb18191 821251978cdab287 +523985888bb18191 83251c897955d99e +523985888bb18191 8455766ac7bce37c +523985888bb18191 8983086622d514e6 +523985888bb18191 92963b4a9b15f296 +523985888bb18191 96136796838fb535 +523985888bb18191 a680e5cf93c3edce +523985888bb18191 a79f4583d3702d96 +523985888bb18191 aedf3b0dc8fc3ff4 +523985888bb18191 afa5c645307dbbb4 +523985888bb18191 b6dc003c95c450af +523985888bb18191 b70b4e57fc9a0cca +523985888bb18191 c0eb8402246df446 +523985888bb18191 cc06078f02f683e4 +523985888bb18191 cd68cad97c75c773 +523985888bb18191 d42ef1d0899b6001 +523985888bb18191 dfbcbf2e06afd488 +523985888bb18191 e64769b91ce1e93e +523985888bb18191 f335ebf67745100e +523f8b9b11f460b7 0458f69c0b4eb22e +523f8b9b11f460b7 05cb605dd9678ef0 +523f8b9b11f460b7 06bea2cfde8f695b +523f8b9b11f460b7 128a600fcc114f34 +523f8b9b11f460b7 15b6b942359e75ad +523f8b9b11f460b7 1eaf8702f9883273 +523f8b9b11f460b7 22dcd6f164b596df +523f8b9b11f460b7 25f88c3f17bdc2d0 +523f8b9b11f460b7 2b9a6ea920cf7cb6 +523f8b9b11f460b7 2be0bd5703665796 +523f8b9b11f460b7 2cae250bf6bf8e72 +523f8b9b11f460b7 2e891380fe084556 +523f8b9b11f460b7 34749c9f2ed5cd40 +523f8b9b11f460b7 45d8861a1a478993 +523f8b9b11f460b7 59755599f053dbb7 +523f8b9b11f460b7 650116a2fef93598 +523f8b9b11f460b7 662b5422d852d630 +523f8b9b11f460b7 691780a095f79294 +523f8b9b11f460b7 6bac352c733f2cf4 +523f8b9b11f460b7 6f2bc2650a681309 +523f8b9b11f460b7 749de23717982ddb +523f8b9b11f460b7 763d260e7dd07d61 +523f8b9b11f460b7 771337139216ec80 +523f8b9b11f460b7 84a747d8496e26f4 +523f8b9b11f460b7 8765b08a5cfb449a +523f8b9b11f460b7 888749e9030ae478 +523f8b9b11f460b7 8f2cb90a9814eca5 +523f8b9b11f460b7 90942b538077abac +523f8b9b11f460b7 9d8b3947c7d30897 +523f8b9b11f460b7 9f1f8d455dcd68e6 +523f8b9b11f460b7 a1ee7e5c5922be3f +523f8b9b11f460b7 a8e36ebd68c42200 +523f8b9b11f460b7 b025ca1754914d31 +523f8b9b11f460b7 b474c6efd2df2325 +523f8b9b11f460b7 b87232a50e7c1ff4 +523f8b9b11f460b7 ba237ec2fef8f849 +523f8b9b11f460b7 bbf2a042c33708ab +523f8b9b11f460b7 bc44931b2e6c8787 +523f8b9b11f460b7 c6c21895bd374501 +523f8b9b11f460b7 cc6022ac48cc6cc8 +523f8b9b11f460b7 d6f739055cf309ed +523f8b9b11f460b7 d98079a2a4a5b41b +523f8b9b11f460b7 e0eb5f01c02218a6 +523f8b9b11f460b7 e100c57aec2c161a +523f8b9b11f460b7 e77ea18ac4b4d16e +523f8b9b11f460b7 f1a20fad446a63dc +5242acc5a50c558b 6a3e30d8ddeca092 +525958e157da4fda 0258f6694ff3767f +53603854cbea5267 a4ccae4a4aaedca2 +538a610a64022c13 000084a91b9e57a2 +538a610a64022c13 1b04ed87e389d128 +538a610a64022c13 2ca5e7991c74130d +538a610a64022c13 3568ccf49d06aba9 +538a610a64022c13 35775cae26890ae8 +538a610a64022c13 3cd8fae8fcc14241 +538a610a64022c13 3e8567da37eb28a1 +538a610a64022c13 4743dd1d13b062fd +538a610a64022c13 5383af2b99ad13fd +538a610a64022c13 57ffc7637f03dd41 +538a610a64022c13 5efccb9761ffb9c5 +538a610a64022c13 65c8883f04b2f9fa +538a610a64022c13 67ea15fdaee7fee7 +538a610a64022c13 6bc2bd45e40c716e +538a610a64022c13 7a7af3305c92cfe0 +538a610a64022c13 82c0ceed5c08efa4 +538a610a64022c13 847bc36a7d8b55fc +538a610a64022c13 8f478814529d763a +538a610a64022c13 a5d8b145361a9614 +538a610a64022c13 a9d448fe7d0f2e0d +538a610a64022c13 a9fb1f2e63943e74 +538a610a64022c13 ae685ba2800bdaf8 +538a610a64022c13 b72e8499e286ce78 +538a610a64022c13 dbd24cdadbbeee14 +538a610a64022c13 e3c7d43dc2e32b87 +538a610a64022c13 ecb4242efaf4042b +538a610a64022c13 f6f48ba69105f38c +557b776ac25b390b ac456d5b10516ab9 +57205613b59cd32d 7ba2747bc22e1d6a +5785e061395a25d3 4fc44a1902bd5a59 +5785e061395a25d3 74b7f69524e92b58 +57f99f373776d736 652c0c79312f52c6 +57f99f373776d736 ab46fc438ece1833 +58afe743a5cdeed9 7240e0b9216d7fab +58afe743a5cdeed9 dba6d0453cb740f9 +58cad1113d5bda18 74f9d2df93916489 +590001dbe0f4877a 2a6b54a6274c39c5 +59157ed237211edc 0d4453d6b331b592 +59157ed237211edc 15a19c647832629f +59157ed237211edc 169a1b63633e89d7 +59157ed237211edc 1953d04ffc8fef0a +59157ed237211edc 1f74a6280ecd942b +59157ed237211edc 32254e851409e742 +59157ed237211edc 4c185f3266c3e0e9 +59157ed237211edc 510ec96a36b037a7 +59157ed237211edc 531c276d0ec61dfd +59157ed237211edc 5c62b73932bde8d2 +59157ed237211edc 5f4f4703e1fe1abe +59157ed237211edc 5ffffa1bf5857851 +59157ed237211edc 608a8f9b3663781e +59157ed237211edc 65d15ede569f49dc +59157ed237211edc 74d367b776ea25f4 +59157ed237211edc 75d0b961a991a981 +59157ed237211edc 77db878438208996 +59157ed237211edc 7ebce9bddf90e834 +59157ed237211edc 8c839b02a3fe666c +59157ed237211edc 9642fb53db48945d +59157ed237211edc 99ac2e311b0fe219 +59157ed237211edc a50268bdb76ff7bd +59157ed237211edc b4243b2a5c910582 +59157ed237211edc b9c2745027166d74 +59157ed237211edc bd743e08424790e8 +59157ed237211edc c4003c03f7c7ff9d +59157ed237211edc c9cba958596d99a0 +59157ed237211edc cadc390e77da2ff4 +59157ed237211edc ce80c793d28f411e +59157ed237211edc d89b8c98e9874543 +59157ed237211edc dc14f2c4abd9fdb4 +59157ed237211edc e379b4143663ff88 +59157ed237211edc e557709c0f23b188 +59157ed237211edc e67252c98951792b +59157ed237211edc f1ee39c2a3792726 +59157ed237211edc f6f82117c6357af1 +596d09e116367a72 e2abe1bd0a724bc9 +59c2b66da1e7f672 d487c397641afe39 +59e6a370fc05e242 378c49d3964651d7 +59e6a370fc05e242 4a3c8b1bac41c9d4 +5a3915199ae123cf 6c7713a259384cb6 +5a9f29afc59a5e90 0f3c624d176235ca +5a9f29afc59a5e90 2aacb41eeafd99fb +5a9f29afc59a5e90 a86fa724f4e9e8bb +5a9f29afc59a5e90 b487914edcdb711b +5a9f29afc59a5e90 c0b8accf0fbd2781 +5bbd7b448568f078 bccb8fe4f3efe06c +5c5dd05f43a36953 1de0ae3dc2446886 +5c5dd05f43a36953 cd0d58b128fb3f9b +5c5dd05f43a36953 e0c6d8901094b837 +5c5dd05f43a36953 e51e7a3b504e506c +5c705e8b85aa55b5 a468958463595f90 +5c705e8b85aa55b5 a6980862b4362a05 +5cb5445adad003c2 559d9196f61ae13d +5cea3497d6296bd7 3208b437cad19970 +5cea3497d6296bd7 d455e2c9476449bf +5cf22ecfb1ad0aa1 a3acf6a65092bda7 +5d734ce6c886f64a 086b379c93199826 +5d734ce6c886f64a 0dfc1318d796490b +5d734ce6c886f64a 3419444185946af9 +5d734ce6c886f64a 44eaaffc61ff121e +5d734ce6c886f64a 6a91783dfb908ae0 +5d734ce6c886f64a 6f6d8651b3605131 +5d734ce6c886f64a 8a2a21cfcd2724f4 +5d734ce6c886f64a be431d4319d4cb1d +5d734ce6c886f64a de22d1a81ce8e738 +5d734ce6c886f64a de9919610226e054 +5d734ce6c886f64a dfd68b4db63a3019 +5e097bec33878e30 00cd504df928d778 +5e097bec33878e30 15dd07266e3555c5 +5e097bec33878e30 22413337311db403 +5e097bec33878e30 4f67afe1b4b2e50e +5e097bec33878e30 51d42fa53a56b27b +5e097bec33878e30 9d9f50ac01968aa0 +5e685b2ac1eed93d 86b1e5bcfee24b90 +5e9f57168d89a543 052b75bd3bb0ff57 +5e9f57168d89a543 0f0cf69b224817f6 +5e9f57168d89a543 1cdac8aaa08006b7 +5e9f57168d89a543 2ddc422f9043dc31 +5e9f57168d89a543 2df181eb9a60f9bb +5e9f57168d89a543 34f39a656f8a21e4 +5e9f57168d89a543 3a57727af1aea396 +5e9f57168d89a543 3aa407bb824a2698 +5e9f57168d89a543 404ff0713bb8c875 +5e9f57168d89a543 43a7e89e80f98139 +5e9f57168d89a543 49bc3a5c7679b3da +5e9f57168d89a543 513248bd5de2a773 +5e9f57168d89a543 52673426e8357eb0 +5e9f57168d89a543 54f58a7cab608766 +5e9f57168d89a543 5b00fe6a7f49b4c9 +5e9f57168d89a543 5d46dafe830247c4 +5e9f57168d89a543 640c8927e5c91671 +5e9f57168d89a543 64c604a5a6a859b0 +5e9f57168d89a543 6691440c1e8d8cea +5e9f57168d89a543 67d9df2990f456a1 +5e9f57168d89a543 72a5327c6d7ca7fb +5e9f57168d89a543 7c4465aedd285dfd +5e9f57168d89a543 8c47a61d0decdb75 +5e9f57168d89a543 9ccaffb7b88e291b +5e9f57168d89a543 af64ef113af641fd +5e9f57168d89a543 afaf9d71805a368d +5e9f57168d89a543 b785e314ed120749 +5e9f57168d89a543 bd7ffdd435c6c3bc +5e9f57168d89a543 c51ff461f8a4e8bc +5e9f57168d89a543 da00333304552120 +5e9f57168d89a543 e24798a3a98fd37b +5e9f57168d89a543 f410ce267580645f +5e9f57168d89a543 f4fa3c07f0abb9bc +5e9f57168d89a543 f702a104be8e62db +5e9f57168d89a543 fa364c29cf72a4fc +5ee9a682fff60855 7a8bb7784aec9536 +5ee9a682fff60855 c1065a9ea0a55f07 +5ee9a682fff60855 ef0ad0b7ed56bb6a +5ee9a682fff60855 f3b442448a796b84 +6073f8d9957a606c 8d86a30ea20df71b +61363f46316647fa 1eccf8363ada01bf +61363f46316647fa 43b1025244536991 +61363f46316647fa 62328fecd28cfb06 +61363f46316647fa 6e501286fd776ab1 +61363f46316647fa defb913c1b700907 +61ad1c3204313a2c 15c79f94ab6391bd +61ad1c3204313a2c 58b9a65d08943e75 +61ad1c3204313a2c b9ebac9a685e0b49 +61ad1c3204313a2c ef778804b67bf096 +629c3369ca429cd3 153fd595931405a2 +629c3369ca429cd3 35a6169fc2ca69bd +629c3369ca429cd3 617c3c56f3778485 +629c3369ca429cd3 6563d9a972a5a30e +629c3369ca429cd3 d26df772c36032cd +629c3369ca429cd3 e41353410f76809f +629f082e5db449b5 b02775ec2c8e4a92 +629f082e5db449b5 dadc11d44c8cec7e +631c594f44e201fe 122aa79e73c37f8b +631c594f44e201fe 81bca444fa8eceb9 +634f2f36bec1251d 3b6847ade7e6ed3d +634f2f36bec1251d 83adc2fb7d32416b +634f2f36bec1251d 940bc2688bb71f57 +634f2f36bec1251d ff11940643a7a543 +63bd48a369ec199f 46bde8c2cc04d402 +641baee15d18938a 1c9cc398fcbbbd83 +641baee15d18938a 22597f8d6e7fa5ba +641baee15d18938a 4f19e725b9bc2a64 +641baee15d18938a 79080ca280acee86 +641baee15d18938a 99900f16f60952c0 +641baee15d18938a c858e4d53cdbc944 +641c14065d594b2e 416c3c3bb5c168f1 +641c14065d594b2e 681e060a49cffc34 +647e9226e0242306 bdf236b263d69078 +648699e6050be087 72aca74890a88742 +648699e6050be087 a24150e7cd38d9a0 +648699e6050be087 bef6f1df4c4e480c +648699e6050be087 ea23690e082986fd +6554ed03e5cd6859 0ee080977102497a +6554ed03e5cd6859 46614936ac13b289 +6587a747a1a15b7c ac456d5b10516ab9 +65b3075f35a0e018 00ccfb638fc7eafd +65b3075f35a0e018 063f9dcb4fce4c0f +65b3075f35a0e018 4456b45e5ca66315 +65b3075f35a0e018 4487f21cb0e87287 +65b3075f35a0e018 47bbc9a8101a7714 +65b3075f35a0e018 5656ec01bbd4d331 +65b3075f35a0e018 57c2d7d87945690f +65b3075f35a0e018 8e2cc2671cae6020 +65b3075f35a0e018 93067965d80d0d78 +65b3075f35a0e018 a9984a344ea081f1 +65b3075f35a0e018 b1d767fd83aa0115 +65b3075f35a0e018 b65b58a0a599a994 +65b3075f35a0e018 d167c7346de380ee +65b3075f35a0e018 ea19fe4e7d66f5f3 +65b3075f35a0e018 f61776ff86227b83 +65b3075f35a0e018 fc65f0d3f4b9a47f +662f6bdf14298607 cad717229ff4609f +6638c572fb03b0f1 4cc351a20548ce6b +6638c572fb03b0f1 ba8059e5e75ced4e +66793e46cd584727 27f0c180991bc27a +66793e46cd584727 43c0c1e801c059e0 +66793e46cd584727 533249dc9253bc46 +66793e46cd584727 7cfba6be0fa6ec25 +66793e46cd584727 9585e99836746f63 +66793e46cd584727 a06ecf0ab1eb78d2 +66c4101d4fae1eb9 00cd504df928d778 +66c4101d4fae1eb9 15dd07266e3555c5 +66c4101d4fae1eb9 22413337311db403 +66c4101d4fae1eb9 4f67afe1b4b2e50e +66c4101d4fae1eb9 51d42fa53a56b27b +66c4101d4fae1eb9 9d9f50ac01968aa0 +674f131b09a04af5 7240e0b9216d7fab +674f131b09a04af5 dba6d0453cb740f9 +67788d6d563cafd3 122fd5493cd2d4fa +68285f41e38990ce 67057c030cfcd401 +68285f41e38990ce 684022943356ae2d +68285f41e38990ce 6b1f4b90672b2caf +68285f41e38990ce be6b39196280fb47 +683fdafc172018cb beda1d33385214ea +683fdafc172018cb fad6ad2262fec7de +6861dd233a3103d8 441ee2d9dcf35014 +6861dd233a3103d8 47cb0bffcead3663 +6872cbbc3200ce87 639c15180bbe0f83 +6968617dd9af1897 6cfbb6c3f9a1ae8d +6968617dd9af1897 a4ccae4a4aaedca2 +6968617dd9af1897 ab902b2e66819564 +6968617dd9af1897 cdf6e8edad4c9dd2 +6a9a53fbf605cdd6 652c0c79312f52c6 +6a9a53fbf605cdd6 ab46fc438ece1833 +6de20076bd29d348 b9c468289b17b552 +6de20076bd29d348 dd2b8745f824a63a +6e1112cf2876f041 012eb45cd1befa4c +6e1112cf2876f041 0287fc20890bfb78 +6e1112cf2876f041 029d603abeed0471 +6e1112cf2876f041 03fba449237e283c +6e1112cf2876f041 05611cc037dfaf26 +6e1112cf2876f041 0a052643eb8b356b +6e1112cf2876f041 0a62a89b292168c9 +6e1112cf2876f041 0a6f201ea5b175bf +6e1112cf2876f041 0a98f4428b4dc84d +6e1112cf2876f041 0abdc61504601a58 +6e1112cf2876f041 0d6203370460c6ba +6e1112cf2876f041 0f807c9f678178ce +6e1112cf2876f041 141ff03be92c9a7f +6e1112cf2876f041 18f6668aabe0ff9a +6e1112cf2876f041 1bb8fd332a077c24 +6e1112cf2876f041 20d583ecb7ac901f +6e1112cf2876f041 24c98121c64e964b +6e1112cf2876f041 27537fb19ce144f6 +6e1112cf2876f041 2bda0b6856d36c41 +6e1112cf2876f041 2e52966d977e14de +6e1112cf2876f041 2fbe32d1bd27fb97 +6e1112cf2876f041 2fd07304ff89ac78 +6e1112cf2876f041 3a271fbba7f04be9 +6e1112cf2876f041 3f68bb60898c3ea5 +6e1112cf2876f041 415143bc999a66b9 +6e1112cf2876f041 46ebe819231a1608 +6e1112cf2876f041 4771364c7fb9d070 +6e1112cf2876f041 47798d4569387f5b +6e1112cf2876f041 491f7329c449b2f1 +6e1112cf2876f041 4b1a66ef945f644b +6e1112cf2876f041 4c056d6c9c16f7fe +6e1112cf2876f041 4c90aa9ca2f3ae5c +6e1112cf2876f041 4d12b0139914b4af +6e1112cf2876f041 5a27ee83b686e6b6 +6e1112cf2876f041 5d8ed6418bfe516e +6e1112cf2876f041 5e1b7ac0c3cbfbdc +6e1112cf2876f041 5f2c4f592eb58274 +6e1112cf2876f041 60057f97b1308ae0 +6e1112cf2876f041 61d5f2cd08c01156 +6e1112cf2876f041 622f87ae697ce361 +6e1112cf2876f041 62a8e65d5d310445 +6e1112cf2876f041 649a7585164d5bb2 +6e1112cf2876f041 6697d7b52e99e08e +6e1112cf2876f041 66f21ef6bd573973 +6e1112cf2876f041 699a5ba0fd17c38d +6e1112cf2876f041 6a7322053615651d +6e1112cf2876f041 6fb0f24c874224f9 +6e1112cf2876f041 75ba322bc8b2044b +6e1112cf2876f041 7b6b70658bb108b6 +6e1112cf2876f041 7c0640297a7786fb +6e1112cf2876f041 7c6e6ad0dccaf626 +6e1112cf2876f041 7cb964af49117889 +6e1112cf2876f041 852e129ed9c9e567 +6e1112cf2876f041 86e805bbf45813f3 +6e1112cf2876f041 89a9d0464dac1392 +6e1112cf2876f041 8bf90501724d51f6 +6e1112cf2876f041 8ca8267902590c5d +6e1112cf2876f041 930dd1c0e858e747 +6e1112cf2876f041 9671407e16ea53cc +6e1112cf2876f041 97cddf341a00184c +6e1112cf2876f041 987746ded9b43eb2 +6e1112cf2876f041 991bdf11f446e5d7 +6e1112cf2876f041 99c0d933f5a8856b +6e1112cf2876f041 9ba1503d291f5e56 +6e1112cf2876f041 9e6e3405e942eede +6e1112cf2876f041 a66c775652a4b455 +6e1112cf2876f041 a6cbd2e0604ccf41 +6e1112cf2876f041 a9720dd324d5e60e +6e1112cf2876f041 aabbfabcafaa7944 +6e1112cf2876f041 aec34f69f1cec31c +6e1112cf2876f041 b091cdd3b202ec0e +6e1112cf2876f041 b468c0e494897f84 +6e1112cf2876f041 b53ad42b3bbe090c +6e1112cf2876f041 b68ff401a216390b +6e1112cf2876f041 bac1a636a96d96aa +6e1112cf2876f041 bae4f665f1c528d9 +6e1112cf2876f041 bb15fdda93357208 +6e1112cf2876f041 bc5b3260102940a6 +6e1112cf2876f041 ceb7bba7ee1d40c7 +6e1112cf2876f041 cf3f9d0e489b6658 +6e1112cf2876f041 d15df50d210a19c7 +6e1112cf2876f041 d5d966d0fe9f0cec +6e1112cf2876f041 d6eeae9333d5f77c +6e1112cf2876f041 d7cf13ff7197f87b +6e1112cf2876f041 d89f903174d08945 +6e1112cf2876f041 de27be267acdb1b0 +6e1112cf2876f041 e15ae8e070bb2652 +6e1112cf2876f041 e41190d23bc37c0e +6e1112cf2876f041 e9e5302ed8cd6026 +6e1112cf2876f041 eaea191a19993b80 +6e1112cf2876f041 edacb9b4a9b3fe41 +6e1112cf2876f041 eeac8d434aac588b +6e1112cf2876f041 f69d5c44b85e9418 +6e1112cf2876f041 fa56d7507d3200fb +6e1112cf2876f041 fc5786febf488ddf +6e1112cf2876f041 ff8d2d91c418290e +6e2fe61b065642ba 2aacb41eeafd99fb +6e2fe61b065642ba a86fa724f4e9e8bb +6e85e8cf0a5556a1 5f92bb3948b39d15 +6ec8ee4c8b640b8f 6317a68167678aa9 +6ec8ee4c8b640b8f c9c50dbfcf5c2db1 +6f2b4bea752ee202 041a43177110c018 +6f2b4bea752ee202 14113c02c96fe94e +6f2b4bea752ee202 4d891990a60f87e0 +6f2b4bea752ee202 6386551f4678729c +6f2b4bea752ee202 c96ce6aebf261d68 +6f2b4bea752ee202 cb9a972e9175553a +6f39e369e950316c 1b7a33a867bfa797 +6fe8717083f9534e 4a7fce1632eb402f +6feb23e1d4e25439 0e0440f4f042f99d +6ffa895c5d1ec8aa 27f0c180991bc27a +6ffa895c5d1ec8aa 43c0c1e801c059e0 +6ffa895c5d1ec8aa 533249dc9253bc46 +6ffa895c5d1ec8aa 7cfba6be0fa6ec25 +6ffa895c5d1ec8aa 9585e99836746f63 +6ffa895c5d1ec8aa a06ecf0ab1eb78d2 +704a04d82662ce74 04fb26bc9fc73c23 +704a04d82662ce74 151d22ee8c7eb728 +704a04d82662ce74 1aa9c4e721bd64df +704a04d82662ce74 247a6b0d6f6e7baf +704a04d82662ce74 31e633fd219c2fd5 +704a04d82662ce74 39f65e9cfe7edfaf +704a04d82662ce74 3dd5ca919fa54d71 +704a04d82662ce74 44eaaffc61ff121e +704a04d82662ce74 4f92654bdfa421c1 +704a04d82662ce74 5e83a2fbc4bfc064 +704a04d82662ce74 64152baa13dc4846 +704a04d82662ce74 6904981819f185c1 +704a04d82662ce74 7b81ee4eaa9f44f6 +704a04d82662ce74 9586056a05ff97cb +704a04d82662ce74 a334538cff72c147 +704a04d82662ce74 ad65aa344c40a052 +704a04d82662ce74 ae475c09bc08d204 +704a04d82662ce74 b1a8636932a5ddf7 +704a04d82662ce74 c7a1fcac139f2327 +704a04d82662ce74 cc9d33c656d8bf78 +704a04d82662ce74 de22d1a81ce8e738 +704a04d82662ce74 e6ff1ac8f9be9af1 +704a04d82662ce74 ecb4242efaf4042b +704a04d82662ce74 fcde71d05e2f80ee +705af0546dc6042d 49105f06fe55363a +705af0546dc6042d 921715dc245a08c1 +705af0546dc6042d 94288986c4d9b611 +705af0546dc6042d c7034c5d72edf595 +7111fdc9413f7e21 2bd5b78f58f61d08 +71daa405c5f334a3 4f88cd0ea0d06465 +757fa60239048aee 1391348d72149975 +757fa60239048aee 25ce30748fb7cbb7 +757fa60239048aee 76d5d2c89c2ca05b +757fa60239048aee d2032c5ebe07d205 +75c4d8d051e788ec 0e5eb9e780801c5a +75c4d8d051e788ec 3876ad9b3e995a66 +75c4d8d051e788ec 68a93a89cbae8f4c +75c4d8d051e788ec dbc2a411e7f5f18e +7a219aa27cfc44e7 a38963328428b0a1 +7a219aa27cfc44e7 bc9be97493ff9862 +7a219aa27cfc44e7 e1007877ac3002a1 +7a219aa27cfc44e7 e631120440924a2a +7b20f33b993baab6 40627cd2bad14ff7 +7b48f135c37b9ed9 f08ac46b9fd34dc4 +7b77a6491ac562b8 0f1aca7901cc2802 +7b77a6491ac562b8 1ad6d3e7fb0daf2d +7b77a6491ac562b8 9c0813865dc8fa1d +7b77a6491ac562b8 d392126186f0599e +7b84914072b74244 8bc1b08d8b3e5ca0 +7b84914072b74244 8c670fe416de1ac9 +7bb846c8ca50f44f 9b71537fd0b403eb +7bf55fbc8150484d 678b0c0f451b8944 +7bf55fbc8150484d 6a3e30d8ddeca092 +7c38d46f2453882f addc8774ebbb510c +7c9e870bfb89059c 0d7310529cb18226 +7c9e870bfb89059c 794aea12d3ef114e +7cc53797298ffd27 a92d15010781280b +7cc53797298ffd27 d3b3e4209ae4546a +7cc53797298ffd27 d3d12a89a85a688f +7cc53797298ffd27 e2c7f6948c3b9e1c +7cc53797298ffd27 e485238645f55951 +7e91097d1c164695 0b6f1abf3c07b035 +7e91097d1c164695 24ec88b08a98669f +7e91097d1c164695 703e3d85121acef5 +7e91097d1c164695 a138f61c1ece5e46 +7e91097d1c164695 ebb894f97773d54a +7e91097d1c164695 f42655329ef66cd0 +7ef17b0b66b66494 c8760a1e6f00455b +7ef17b0b66b66494 cc49fc701e2f9411 +7ef17b0b66b66494 fab2bf384b6df421 +7f0df85d658af23f 0c0ad95fa1122f28 +7f0df85d658af23f 441ee2d9dcf35014 +7f0df85d658af23f 47cb0bffcead3663 +7f0df85d658af23f 941cd1e18eeebfa5 +7f921abb5138ec2d 7a8bb7784aec9536 +7fb89479e8076b98 dd1eea7b70c7c273 +804acf745d6dd553 00cba9e108cdf1ea +804acf745d6dd553 a541f2af59b26f11 +804acf745d6dd553 dee33ff362e2b74c +804acf745d6dd553 e798be99ba962f4b +80ef8d69d56a0b71 1cd5f2a8931010b1 +80ef8d69d56a0b71 5aa992f544cfe0ed +80ef8d69d56a0b71 83ed6a533d14d8a7 +80ef8d69d56a0b71 937c7aca1e5f1a4d +80ef8d69d56a0b71 974a1443c58f627a +80ef8d69d56a0b71 9aafbfa955786f91 +80ef8d69d56a0b71 d967a47bc92790e5 +819d6a4aabb5afc0 08a8d1342e6e29dd +819d6a4aabb5afc0 1e75f9b2da7d4838 +81ef1e1ddc05c0fd 27f0c180991bc27a +81ef1e1ddc05c0fd 43c0c1e801c059e0 +81ef1e1ddc05c0fd 533249dc9253bc46 +81ef1e1ddc05c0fd 7cfba6be0fa6ec25 +81ef1e1ddc05c0fd 9585e99836746f63 +81ef1e1ddc05c0fd a06ecf0ab1eb78d2 +83a83572a1d71e22 6c3864afaef7861d +85515bc2576882c9 9857d062b3331d7f +8585a38c1c7f9147 0b6f1abf3c07b035 +8585a38c1c7f9147 24ec88b08a98669f +8585a38c1c7f9147 703e3d85121acef5 +8585a38c1c7f9147 a138f61c1ece5e46 +8585a38c1c7f9147 ebb894f97773d54a +8585a38c1c7f9147 f42655329ef66cd0 +859c2bfd7c0f3236 3e46cfde6bf5087d +859c2bfd7c0f3236 7240e0b9216d7fab +859c2bfd7c0f3236 dba6d0453cb740f9 +859c2bfd7c0f3236 f357fdc36feb270d +873f13fd86097a34 d2b967f4d3dae4c0 +87f79a88a2f4fde6 0ce4f4e594a4f26d +87f79a88a2f4fde6 4226d39d5ad6e6f1 +87f79a88a2f4fde6 dfc8b412206eeb56 +894378fbea51fe53 2628504effd77416 +894378fbea51fe53 44eaaffc61ff121e +894378fbea51fe53 611dc70141085fef +894378fbea51fe53 62a04874a88297ad +894378fbea51fe53 6c0a4e34229bc895 +894378fbea51fe53 a724223b8c127516 +894378fbea51fe53 de22d1a81ce8e738 +894378fbea51fe53 e187a12ef68f576d +894378fbea51fe53 e73f315439c108c7 +894378fbea51fe53 ff67f4297dd55f52 +896439ff8b6b24e9 08a8d1342e6e29dd +896439ff8b6b24e9 1e75f9b2da7d4838 +896439ff8b6b24e9 5833e9960efb6421 +896439ff8b6b24e9 67758af2bd90f55e +899c0951871e2ce2 efea6cbd419bdcd0 +89b5d2d419727eb6 19310a6300060e9a +89b5d2d419727eb6 1a897db761564897 +89b5d2d419727eb6 45dc29230329df51 +89b5d2d419727eb6 493bedce659bee0c +89b5d2d419727eb6 583c9ae5c2eaeaea +89b5d2d419727eb6 9504a343733e6479 +89e4e779fd6e18ac 86753567363b92ee +8a20f7190e2e0c80 02c065410d100642 +8a20f7190e2e0c80 0eaf560772f0e128 +8a20f7190e2e0c80 21023f12bdb2fbaa +8a20f7190e2e0c80 45e969d9432cbc4d +8a20f7190e2e0c80 47de8e9a70552a69 +8a20f7190e2e0c80 52b091205cf8231d +8a20f7190e2e0c80 723aab49f9058280 +8a20f7190e2e0c80 84ab8fbf2549c880 +8a20f7190e2e0c80 a7dd562533d1577d +8a20f7190e2e0c80 ae16164ed38266b4 +8a20f7190e2e0c80 cf4e89c0958402ba +8a20f7190e2e0c80 e85c51596f98f156 +8a63a367b87b9274 64d312b0d06839ca +8a922ed33316c35e 0aaeeef0a7a11a8a +8a922ed33316c35e 0cf3b6eb92292b5f +8a922ed33316c35e 1fe4d03b019e99c6 +8a922ed33316c35e 332e42de7667f7d5 +8a922ed33316c35e 3340a0b872d04a29 +8a922ed33316c35e 3b04fb545a6a91b1 +8a922ed33316c35e 5636025171ee68cb +8a922ed33316c35e 5b9d18baf0e6d8eb +8a922ed33316c35e 801302e718fb697b +8a922ed33316c35e 84d84414bda7817f +8a922ed33316c35e 8c39676322547ab0 +8a922ed33316c35e 947c8b8cdd346456 +8a922ed33316c35e b3826381885f0b09 +8a922ed33316c35e bb848c4d48e18b8c +8a922ed33316c35e bd84931ebd3b13e4 +8a922ed33316c35e be10580c3a4f8c64 +8a922ed33316c35e c1dd97bb3734b754 +8a922ed33316c35e c5788de2386b1825 +8a922ed33316c35e c92740d708a77072 +8a922ed33316c35e cd9d3bf26927a69c +8a922ed33316c35e e3bd6cfd0c778f88 +8a922ed33316c35e ed1383077f90a756 +8a922ed33316c35e f6278a85c34bbeee +8a922ed33316c35e ff498676a17d5a5f +8b404ccd3e86ed54 7479aab9e454bfa5 +8b7dedbdde81e77d 32a49fb43cbec650 +8cdc0e1984b36b99 0d57a03dc5779f61 +8cdc0e1984b36b99 247ef50eccca6659 +8cdc0e1984b36b99 6bc18ea465f82f97 +8cdc0e1984b36b99 905ac3108c761f55 +8cdc0e1984b36b99 97aaeac893fe636a +8cdc0e1984b36b99 c38dc52f1e0334e2 +8cdc0e1984b36b99 d0f42f25b13d4ec7 +8cdc0e1984b36b99 de901aadac6d065b +8d42ba2ddd47170d 7bbe672ba521973c +8f7cef3e6bbac176 f368ff9351e139fb +8ffec3b0f5a08f2b 1fd97b8706575777 +8ffec3b0f5a08f2b a09867ea44e07eab +900f57955ab1dfb6 652c0c79312f52c6 +900f57955ab1dfb6 ab46fc438ece1833 +9023cebe31b9ad0d 4a7fce1632eb402f +90c5ef101b9a5516 3cee8b4f825e4331 +9128a8f53a7c0dc8 2bd0c40c82de2932 +9128a8f53a7c0dc8 8d11600c8d381c5d +9128a8f53a7c0dc8 fd9301b4af38e28e +921a4790b0d80af2 26a1b0ae6ff634a9 +921a4790b0d80af2 3252a0560945f93a +921a4790b0d80af2 a0d52b7acd8d8bf8 +921a4790b0d80af2 a4c170ef8aa78af8 +921a4790b0d80af2 bf44b1c1739f7a77 +934c4618728fa365 08c416fd3198df53 +934c4618728fa365 18cdd497f48f2690 +934c4618728fa365 2f1af81fe302df71 +934c4618728fa365 3ab00dd17feacd36 +934c4618728fa365 511aecf0e9e83d04 +934c4618728fa365 54ab095249459229 +934c4618728fa365 b14a6cd8bd4d89fe +934c4618728fa365 b607af8d9faefc8f +934c4618728fa365 d0eec7bcee121dca +934c4618728fa365 d3e6dba899836f48 +934c4618728fa365 dc1599ba4061e2bd +934c4618728fa365 e8f1660df366298e +93c518d7b32bbe4e 7261d5c854fc6072 +9481e51b56595c60 dd1eea7b70c7c273 +95edcbca5ede1f3c afcdeaed85d1f91e +95edcbca5ede1f3c c8784de3068d1e4f +9608cd24a8df4447 c6d5234c180170d1 +961e58f0d8dd38a2 5722299a45324984 +963a8bcf19aa3555 0b6f1abf3c07b035 +963a8bcf19aa3555 24ec88b08a98669f +963a8bcf19aa3555 703e3d85121acef5 +963a8bcf19aa3555 a138f61c1ece5e46 +963a8bcf19aa3555 ebb894f97773d54a +963a8bcf19aa3555 f42655329ef66cd0 +969a99c05360aa8d 3e46cfde6bf5087d +969a99c05360aa8d 7240e0b9216d7fab +969a99c05360aa8d dba6d0453cb740f9 +969a99c05360aa8d f357fdc36feb270d +97290bd3cafa42fd ea1c45f5ed8e995f +972f7309521b8c2b c710c5b66fc26d49 +975de2cd2b4ec6b3 1a927bb050a097b1 +9878814c6a0062a4 2aaf0a1ecad7acb8 +9878814c6a0062a4 861c038c622d2d42 +9878814c6a0062a4 b9fd48bded71dd0e +9878814c6a0062a4 bcac819dd64e3173 +9878814c6a0062a4 dc56568f872c0560 +991775f5b5201a18 899a87608e0e8a73 +995965b96a052a47 31d829b3e73b18bc +995965b96a052a47 76f020c999d6c9f0 +995965b96a052a47 84e4a010b2d6dae8 +995965b96a052a47 97313b49e1a36195 +9a35a46bf63965d0 055c03dbc7d850aa +9a35a46bf63965d0 640070b6d5d28c5b +9a5ef75c17272be6 68d70b1edf499947 +9ceababdbd96e5e1 34b6c5644f80cf2f +9e16e95606924ff5 51a5d993ecfe377d +9e16e95606924ff5 662780a3dec1011d +9e16e95606924ff5 dc73ac905236c74b +9e16e95606924ff5 e1382e3a517f52d5 +9e24be4a5b6c43a1 ea518bb0e496f9cc +9e3695f3be7ebcfa b66b01d18fa1cc68 +9ea69ed1405f9e49 7ceae9fb9ee6b8ec +9ea69ed1405f9e49 aa41b45f45c0c592 +9f2b16de4dea27c1 0b6f1abf3c07b035 +9f2b16de4dea27c1 24ec88b08a98669f +9f2b16de4dea27c1 703e3d85121acef5 +9f2b16de4dea27c1 a138f61c1ece5e46 +9f2b16de4dea27c1 ebb894f97773d54a +9f2b16de4dea27c1 f42655329ef66cd0 +9f3b0e226fab513c 1d13b774d380b2b7 +9f3b0e226fab513c e8faa1fec0addc73 +9f752079609eac11 6a3bbd4f42a7e3dd +9fdb8ce749297fce d1af0556adc9f26e +9fdb8ce749297fce f409b3802f7468e4 +9ffd2194b5b01ee7 02f6af1c65b980c4 +9ffd2194b5b01ee7 1948162e2046ad42 +9ffd2194b5b01ee7 1abdff884bd97243 +9ffd2194b5b01ee7 1bcfdd309721bfe5 +9ffd2194b5b01ee7 2361dbf05d372882 +9ffd2194b5b01ee7 2fd741a508904b33 +9ffd2194b5b01ee7 361f5cb5730197b6 +9ffd2194b5b01ee7 386b2be4f787dcf7 +9ffd2194b5b01ee7 472ca2aaa2355edd +9ffd2194b5b01ee7 473ffe93f6c38f10 +9ffd2194b5b01ee7 48e3e74da7e55ac7 +9ffd2194b5b01ee7 510194311803d889 +9ffd2194b5b01ee7 5828e42827a095e1 +9ffd2194b5b01ee7 5b198bba6ae5ff6a +9ffd2194b5b01ee7 600681dde3cbdfe1 +9ffd2194b5b01ee7 6a5288bc638fc423 +9ffd2194b5b01ee7 730afd5f1e7281e8 +9ffd2194b5b01ee7 7ab7743bdef0d009 +9ffd2194b5b01ee7 81f79b27669ddaec +9ffd2194b5b01ee7 832cb389a801291d +9ffd2194b5b01ee7 885832c0e2f79efc +9ffd2194b5b01ee7 96f5500399b9c2a6 +9ffd2194b5b01ee7 a2c81ee9ffe2ab38 +9ffd2194b5b01ee7 a5113560bdd183b9 +9ffd2194b5b01ee7 a7e72da28de18c8a +9ffd2194b5b01ee7 a975e88183d96af4 +9ffd2194b5b01ee7 b0c693fa8a3a9f88 +9ffd2194b5b01ee7 b45c9eec55fe4b5d +9ffd2194b5b01ee7 bdb161b991506bc4 +9ffd2194b5b01ee7 be61410b5d7942ab +9ffd2194b5b01ee7 bfc5940643477d64 +9ffd2194b5b01ee7 db45846b2bda6f4f +9ffd2194b5b01ee7 db9fa0ff50a6c383 +9ffd2194b5b01ee7 df260276b9f72df1 +9ffd2194b5b01ee7 e5aea453a55a4251 +9ffd2194b5b01ee7 e988608fe37e7a85 +9ffd2194b5b01ee7 e99d9eb2014813c4 +9ffd2194b5b01ee7 f0ada4bbc66d0929 +9ffd2194b5b01ee7 f1c7ac28df1d9ad7 +9ffd2194b5b01ee7 fc5636169cf4fe03 +9ffd2194b5b01ee7 fcb85e0cc30213c0 +9ffd2194b5b01ee7 fe3529ab5f533329 +a06cec7ecda6cc45 8e53ecfeec620d2d +a06cec7ecda6cc45 dc8274a222abe8a2 +a08dbfa4a0f98f44 3bd68d3432406c27 +a08dbfa4a0f98f44 7f2ea4878519aab4 +a08dbfa4a0f98f44 b74e6c0cb065d380 +a0ff128199a0719a 3fddca87401acff7 +a0ff128199a0719a 6e2094f6f92510e8 +a0ff128199a0719a aa458f23c69551e8 +a0ff128199a0719a ab21df8d02fe5697 +a0ff128199a0719a b8a5aa65d2cdff10 +a0ff128199a0719a c03675695ebe9a59 +a0ff128199a0719a db9fe1a0ee4426bd +a0ff128199a0719a f4b4dbd0a9a57f13 +a19951d94369bdbf 50cfb53ddc1c82e2 +a19951d94369bdbf 90d0d9f0a60bda2e +a1f3f79753f6cbc2 91ebf10c08c62a7d +a2b67b6750130408 32bfe521d4287e82 +a2fe1f5d0c178757 27f0c180991bc27a +a2fe1f5d0c178757 43c0c1e801c059e0 +a2fe1f5d0c178757 533249dc9253bc46 +a2fe1f5d0c178757 7cfba6be0fa6ec25 +a2fe1f5d0c178757 9585e99836746f63 +a2fe1f5d0c178757 a06ecf0ab1eb78d2 +a37e99363e85c3ad 03e797a374d77fd1 +a37e99363e85c3ad 0770dbc09e602379 +a37e99363e85c3ad 35c1dfbb33108714 +a37e99363e85c3ad 3a0ebac6ad086418 +a37e99363e85c3ad 4fa1cb08d57f4511 +a37e99363e85c3ad 5104ce520c3dc129 +a37e99363e85c3ad 64c395233ca0bd4a +a37e99363e85c3ad 8218a7c974cd7272 +a37e99363e85c3ad 9729b78711a8ed98 +a37e99363e85c3ad c1d03dc895749057 +a37e99363e85c3ad d91343e05d461451 +a37e99363e85c3ad dc86c66f417fc08c +a3ee84dda1e2cc08 1eccf8363ada01bf +a3ee84dda1e2cc08 62328fecd28cfb06 +a3ee84dda1e2cc08 6e501286fd776ab1 +a3ee84dda1e2cc08 defb913c1b700907 +a5028cc3ebfa7f93 07fb15f7cce6d533 +a5028cc3ebfa7f93 13564ff56a3267b7 +a5028cc3ebfa7f93 1f387acc44b827ac +a5028cc3ebfa7f93 1f5f3dd6e29c721c +a5028cc3ebfa7f93 268310347a281b82 +a5028cc3ebfa7f93 297b3adcfb870f06 +a5028cc3ebfa7f93 40148ccf6589f1fe +a5028cc3ebfa7f93 43e9f5bbe111a821 +a5028cc3ebfa7f93 44032df21ae158e8 +a5028cc3ebfa7f93 45576ac70e227eac +a5028cc3ebfa7f93 4d49a1a7dd0f93c0 +a5028cc3ebfa7f93 505aa19006a2b70b +a5028cc3ebfa7f93 5d4ce705d2fe6ed7 +a5028cc3ebfa7f93 5e44798cd6e6e43e +a5028cc3ebfa7f93 619d44942f6a4da4 +a5028cc3ebfa7f93 64a9eef45477f5c1 +a5028cc3ebfa7f93 6720b1e0cd31f6a8 +a5028cc3ebfa7f93 6c128eaac0ecc1d6 +a5028cc3ebfa7f93 728c939971c22c12 +a5028cc3ebfa7f93 78b1a8b034171131 +a5028cc3ebfa7f93 8d96d57f323e044c +a5028cc3ebfa7f93 8f04c54b05431038 +a5028cc3ebfa7f93 94f19abed2524223 +a5028cc3ebfa7f93 b6326c3608635ad7 +a5028cc3ebfa7f93 bf16864071af1c24 +a5028cc3ebfa7f93 cf2e4ee0c10f1e03 +a5028cc3ebfa7f93 d2c6facaf9ad82b2 +a5028cc3ebfa7f93 d67d183d75460a10 +a5028cc3ebfa7f93 e625138a2762e3fb +a5028cc3ebfa7f93 ec94c1ddb28e181f +a5028cc3ebfa7f93 f56145f24f5fa99d +a5028cc3ebfa7f93 f7d370a096816c3b +a50b71362daedd1f 0569aeba4b989d96 +a50b71362daedd1f 0c69f325cc334e27 +a50b71362daedd1f 0ee058ca2788cf45 +a50b71362daedd1f 12acfdf705bd90d6 +a50b71362daedd1f 1aa3a8b02d1485f9 +a50b71362daedd1f 27bd03f194a8396c +a50b71362daedd1f 27bd52a273aadd05 +a50b71362daedd1f 27e73325b0650fcf +a50b71362daedd1f 2e9a57e20a9b362e +a50b71362daedd1f 4124b7dc688a5a22 +a50b71362daedd1f 43fb6f522bb85fff +a50b71362daedd1f 4dcad30784799679 +a50b71362daedd1f 538739976fd788f3 +a50b71362daedd1f 549f0a272fcecd74 +a50b71362daedd1f 549fc69985d720d5 +a50b71362daedd1f 5562832b1255648f +a50b71362daedd1f 687695f4f313dfae +a50b71362daedd1f 6db49318b196e95f +a50b71362daedd1f 6ed9244616133df4 +a50b71362daedd1f 704a8a74fdcfa96c +a50b71362daedd1f 787409d03b1f418e +a50b71362daedd1f 7de38d2c92a7a073 +a50b71362daedd1f 8d041d836431ab8f +a50b71362daedd1f 9aecd92b7730c953 +a50b71362daedd1f 9bf8e8bcbff23220 +a50b71362daedd1f a0b729c28a614d45 +a50b71362daedd1f a0de2ffeee9be817 +a50b71362daedd1f a351f81f982ece3d +a50b71362daedd1f c217e254ecb3361c +a50b71362daedd1f cf6e4e15f680959a +a50b71362daedd1f e4c60fd762dc17f5 +a50b71362daedd1f f917676019bfd09d +a655663a4307f326 b02775ec2c8e4a92 +a655663a4307f326 dadc11d44c8cec7e +a880d82ec089ffcb 42e97576eb683dfe +a8e437b6e13320bf 00268c2b5f495ff8 +a8e437b6e13320bf 026a78077f142781 +a8e437b6e13320bf 06b6f7108a8e2486 +a8e437b6e13320bf 0836a0d7c3149736 +a8e437b6e13320bf 0b348e204fca416a +a8e437b6e13320bf 0eae5cc697744a90 +a8e437b6e13320bf 0f93776867fef9e8 +a8e437b6e13320bf 12570bfa0966253c +a8e437b6e13320bf 14497d3348184a64 +a8e437b6e13320bf 15bf9cc99bb43acf +a8e437b6e13320bf 1699b91c5fd57139 +a8e437b6e13320bf 1788cf3797f0b6e9 +a8e437b6e13320bf 1aae77c8a05abb52 +a8e437b6e13320bf 1b5aa04b9a8b4903 +a8e437b6e13320bf 1c984745f6b484d4 +a8e437b6e13320bf 1cae57982860e98d +a8e437b6e13320bf 1d67c1e4565e28e0 +a8e437b6e13320bf 1fb28d25ebb9cec0 +a8e437b6e13320bf 20a3a631fc7afe2c +a8e437b6e13320bf 25135e6b19742d23 +a8e437b6e13320bf 282201e7b2bd874c +a8e437b6e13320bf 3147339ca9627031 +a8e437b6e13320bf 32d5266908de95ad +a8e437b6e13320bf 330982a4aba67757 +a8e437b6e13320bf 3e9a9f0fc0411c03 +a8e437b6e13320bf 42749c6f0dbeca90 +a8e437b6e13320bf 45b9934af51657e3 +a8e437b6e13320bf 469d81cadf98be61 +a8e437b6e13320bf 49391011cfed5343 +a8e437b6e13320bf 4c838eef98157152 +a8e437b6e13320bf 4cc29b77787d106d +a8e437b6e13320bf 54785a59b94e8b64 +a8e437b6e13320bf 5534a5e5148853cb +a8e437b6e13320bf 569bdcc90eaff9f1 +a8e437b6e13320bf 57653ceb9cd69985 +a8e437b6e13320bf 5b7822129464d832 +a8e437b6e13320bf 5da38cb21d7d8eae +a8e437b6e13320bf 607a7c94e505a8fc +a8e437b6e13320bf 66041ac7647c5609 +a8e437b6e13320bf 69f393a37ff15e03 +a8e437b6e13320bf 6a8385f183af8747 +a8e437b6e13320bf 7068c68877690f9a +a8e437b6e13320bf 785ec691ab0cf39c +a8e437b6e13320bf 7a5e103323e13f7e +a8e437b6e13320bf 7bf14473c9a2931b +a8e437b6e13320bf 81d909e9387105c6 +a8e437b6e13320bf 874e3717a8e5cbc9 +a8e437b6e13320bf 884b17631b17101f +a8e437b6e13320bf 8a77f892279b1dcb +a8e437b6e13320bf 8efd83482245d7b0 +a8e437b6e13320bf 95c5e9b8d1039445 +a8e437b6e13320bf 9682da1b57ffd967 +a8e437b6e13320bf 96ae30c308c59a6a +a8e437b6e13320bf 98538847e6fa91cc +a8e437b6e13320bf 99a0e40b21229e69 +a8e437b6e13320bf 9e8a2b053241cce4 +a8e437b6e13320bf a026264bfcf41de5 +a8e437b6e13320bf a8d270e17d51b4a2 +a8e437b6e13320bf a99bb144ec1fc936 +a8e437b6e13320bf aa5262bf17fa7fd3 +a8e437b6e13320bf b023982c04659f29 +a8e437b6e13320bf b22409a5f53401f8 +a8e437b6e13320bf b3347e9f6f4312a0 +a8e437b6e13320bf b915ee809ef03730 +a8e437b6e13320bf b9e2b73a8a5c1dea +a8e437b6e13320bf ba0286cabc77fce3 +a8e437b6e13320bf bd9ab68619f54969 +a8e437b6e13320bf c04f1946bb28c80c +a8e437b6e13320bf c184602d8ff064bc +a8e437b6e13320bf c1af17764d9519e3 +a8e437b6e13320bf c7da66d4ebb89e1b +a8e437b6e13320bf cd099eee31d3b781 +a8e437b6e13320bf d03e34451054971d +a8e437b6e13320bf d3cdbf38777724a0 +a8e437b6e13320bf d56193c4615ebef0 +a8e437b6e13320bf d709984f39faf527 +a8e437b6e13320bf d9f1ffe89c01c8be +a8e437b6e13320bf df677add12861fcc +a8e437b6e13320bf e19fc05b9f1d6f6a +a8e437b6e13320bf e311a11bf1cb233c +a8e437b6e13320bf eae223170c7d106d +a8e437b6e13320bf f20453380e931c45 +a8e437b6e13320bf f436d8ff09b7fc9a +a8e437b6e13320bf fe15f7814f69e1fb +a94480e8dd234093 b46cca38cf21e949 +a94917b2ed948700 5c7d59552ed87fa4 +a94917b2ed948700 abee23a39299259f +a968681cc483b1b0 aa015823b84bfc4e +a99e5d5082c7efa9 b3bae0d31aff1437 +a99e5d5082c7efa9 ec50af9741d94a58 +a9f63cf9cbc294bf 1a927bb050a097b1 +a9fede56c9d07bb2 0c8a838d265b2331 +a9fede56c9d07bb2 11d590d4b15e07df +a9fede56c9d07bb2 298cf7ce5fd12261 +a9fede56c9d07bb2 31044c2bfe6e2bbb +a9fede56c9d07bb2 32f3d0488619ff83 +a9fede56c9d07bb2 37ba12b88e7bab89 +a9fede56c9d07bb2 381705459b21e913 +a9fede56c9d07bb2 47e1d0b0858fdddf +a9fede56c9d07bb2 534f624d3a743387 +a9fede56c9d07bb2 559d9196f61ae13d +a9fede56c9d07bb2 6b3a3618fceed940 +a9fede56c9d07bb2 7f63f811e1bf0367 +a9fede56c9d07bb2 89abab5d99b5cecd +a9fede56c9d07bb2 8ca6e2fb014603a1 +a9fede56c9d07bb2 9a34eddb54010c44 +a9fede56c9d07bb2 d75f2bf13e8a0b81 +a9fede56c9d07bb2 ea58ece172567ed8 +a9fede56c9d07bb2 fe658859ca29eddb +aa6954a277cb0001 256eee53d0470cda +aa6954a277cb0001 37fb688d2e20e27f +aa6954a277cb0001 45ab79f62ecc8084 +aa6954a277cb0001 52b441664f538102 +aa6954a277cb0001 78e82e84f62e0c71 +aa6954a277cb0001 a337e1eb953b18f7 +aa6954a277cb0001 a3da13eb3a69a557 +aa6954a277cb0001 d00ec760f519620b +aa6954a277cb0001 ec8ed63c82aa24be +aa6954a277cb0001 ed25ca545e819240 +aa6954a277cb0001 f4d68611110feaca +aa6954a277cb0001 fab5deae9caea627 +ab539e1b4a60e552 75c5e09f35d8fac9 +ac99bb1667b06e86 856f033fbc37a26d +ad3698466b9cf2c7 0e974f643d76c52f +ad3698466b9cf2c7 3d8c2181c8d706ae +ad3698466b9cf2c7 c4193c1eda099dea +ade8fa4672d99b67 62328fecd28cfb06 +ade8fa4672d99b67 defb913c1b700907 +adf8deb475b7db7a be1fc210df5b7e3f +ae495dd7436af2db 0f1aca7901cc2802 +ae495dd7436af2db 1ad6d3e7fb0daf2d +ae495dd7436af2db 9c0813865dc8fa1d +ae495dd7436af2db d392126186f0599e +aeb48b5ea53ea88d 905acfa1a44f0a57 +aed24f6c161be7a8 aa87e3353df64797 +af4a04f5326ed4d1 3b3a0fd3c9dc4abb +af4a04f5326ed4d1 a1435fdee8a850cf +afa3e243bd5ed1da 416c3c3bb5c168f1 +afa3e243bd5ed1da 681e060a49cffc34 +b0c17f77df97e75d 0653dba439d00966 +b0c17f77df97e75d 6cb631c1b0f6214e +b0c1e9cfd053392e dd1eea7b70c7c273 +b1061a4dae8a4d53 29350ead83ff5a78 +b1061a4dae8a4d53 38521975a762301f +b1061a4dae8a4d53 4107834bc18561a1 +b1061a4dae8a4d53 50c4033a97bd8610 +b1061a4dae8a4d53 828656e0d43bf2eb +b1061a4dae8a4d53 b7193064f1aa1bdb +b1061a4dae8a4d53 c89a615879087250 +b1061a4dae8a4d53 f8a00d82426d65cc +b10810c903dab457 dd1eea7b70c7c273 +b110e6d352b96f21 055c03dbc7d850aa +b110e6d352b96f21 640070b6d5d28c5b +b2bfcea6171051ab 3d0501afda102fea +b2bfcea6171051ab 4e21420a680221f7 +b2bfcea6171051ab 4fe4f85c8b0fd7d7 +b2bfcea6171051ab 536d848810922445 +b2bfcea6171051ab 559d9196f61ae13d +b2bfcea6171051ab 6c663f086a967f91 +b2bfcea6171051ab 8cd47aff67c0bc62 +b2bfcea6171051ab fe99390f71413c68 +b2c0cfbcd9722ace 58606cb67cb94e6d +b2c0cfbcd9722ace f84705cb4c5a46b8 +b2c41130fbe136e2 051ca8b44535ed96 +b446c33fe2a127f9 1fd97b8706575777 +b446c33fe2a127f9 a09867ea44e07eab +b460d13a04b1552f 50cfb53ddc1c82e2 +b460d13a04b1552f 90d0d9f0a60bda2e +b55c17701e72eced 2734934aa9aa3a59 +b55c17701e72eced 2e06523cf320ddf9 +b55c17701e72eced 96c51b6f4ad68dcc +b55c17701e72eced b2f0aa3cbc0c0ee6 +b56a5f393765de7d a92d15010781280b +b5b0cdd104714f76 35f2194d9b30070e +b5b0cdd104714f76 4a0795be6c2a4d36 +b5b0cdd104714f76 cb10c8ea79f40fec +b5f35cd72e45a48f 7e44d7af9fdaeb4d +b5f35cd72e45a48f 8d86a30ea20df71b +b64fd880c716f117 cbc71da001e3e5c8 +b7da02daf288eb7e 6c7713a259384cb6 +b7da02daf288eb7e bc78b04ec969967d +b8148b27adf4b21e 9b71537fd0b403eb +b85dcdc2a78975f9 b48937f0992a997a +b8cf1fa50fd0ae38 00cd504df928d778 +b8cf1fa50fd0ae38 15dd07266e3555c5 +b8cf1fa50fd0ae38 22413337311db403 +b8cf1fa50fd0ae38 4f67afe1b4b2e50e +b8cf1fa50fd0ae38 51d42fa53a56b27b +b8cf1fa50fd0ae38 9d9f50ac01968aa0 +b91a0a45e67ce463 a16754b0573eab83 +b91a0a45e67ce463 babcafc94b2a435f +b941154749f6ba2d 680d85d275480fad +b941154749f6ba2d 82f9eece6c1f0f3b +ba16cf182035925c 206da0a2e2a722ae +ba16cf182035925c 42a95189266c00f3 +ba16cf182035925c 93254c49efbc34dc +ba16cf182035925c a771425f5d8a26fc +ba16cf182035925c c1508298f418eb2a +ba16cf182035925c c71c069e391a1705 +ba822639367b31f2 89aa803a893e71ab +bac598152d1a1f82 0c85584f66d1dece +bac598152d1a1f82 1213162125010cdd +bac598152d1a1f82 13ea8969ca211efd +bac598152d1a1f82 158bde482ad9ed51 +bac598152d1a1f82 1c54e5dc537c3bac +bac598152d1a1f82 4acecbaef9cec3ae +bac598152d1a1f82 5e0a85d72e1d0816 +bac598152d1a1f82 5f244b94f52ab231 +bac598152d1a1f82 684e6702cea1500c +bac598152d1a1f82 73aa2391429de85b +bac598152d1a1f82 8c1a7c294fb919a6 +bac598152d1a1f82 961151b59dab6f91 +bac598152d1a1f82 98b4e82343bfe51a +bac598152d1a1f82 9be5d5d602344515 +bac598152d1a1f82 a2675c73bc1b6257 +bac598152d1a1f82 b6b3b82973407185 +bac598152d1a1f82 d912778e41f68d6a +bac598152d1a1f82 e605c691e5a81d02 +bac598152d1a1f82 e80d49dbc51bf1ae +bac598152d1a1f82 f401c13aee6749f1 +baf03650df72799f 7363a4d79a13cb7d +baf03650df72799f 953b266dc8b40266 +baf03650df72799f c69043abf3b7db47 +baf03650df72799f e13b694d1b7efc9d +bba413b4c334c1a3 3e2a10fcd402f086 +bba413b4c334c1a3 dab3a9e9f3e3413a +bbd919e07211ecea 8d6e0b64a7d4a691 +bc2e6e5a556e9b6c 64a7d6a1331e0268 +bc2e6e5a556e9b6c 6f12114f6f8bd012 +bf4ca12ff80a8f04 f92fec05255f663a +bf60a393b5a072ca 41b299a4fd361621 +c0824d7b4be3f948 2169facbb15adb10 +c0824d7b4be3f948 300c86a1aed9d103 +c0824d7b4be3f948 89a88e89f51b105a +c0824d7b4be3f948 b79bb64ab9dce867 +c0824d7b4be3f948 f1266b9abb029774 +c09328d2327d85a1 05f43cd3fa75f706 +c09328d2327d85a1 0644c13cd9999527 +c09328d2327d85a1 078e267b00c8695b +c09328d2327d85a1 07ca1eee12bb37bf +c09328d2327d85a1 0a4f455d534c0eda +c09328d2327d85a1 0a63c47547079913 +c09328d2327d85a1 0c9a8a382f79cdf5 +c09328d2327d85a1 0d57bf0511b6f847 +c09328d2327d85a1 0e26c05dfd7329de +c09328d2327d85a1 0fcbd3324309fb80 +c09328d2327d85a1 0ff4300ef6d4cd4b +c09328d2327d85a1 12283073706381fc +c09328d2327d85a1 12f3dd3a1b63bde6 +c09328d2327d85a1 142c39d5fb18c61b +c09328d2327d85a1 1676e2ecc1ebf997 +c09328d2327d85a1 187aaa79da5ebb91 +c09328d2327d85a1 1ad779e073304099 +c09328d2327d85a1 1b6890ca22427a0c +c09328d2327d85a1 1bbad614aee13b8f +c09328d2327d85a1 1bfea977b043f674 +c09328d2327d85a1 1c9bdda481775f36 +c09328d2327d85a1 1e02842be550f805 +c09328d2327d85a1 1f21b9c1e6eef258 +c09328d2327d85a1 20acad616c419dbc +c09328d2327d85a1 21facd0e5ceffb44 +c09328d2327d85a1 220178ddac8aa2b2 +c09328d2327d85a1 221e06ed8a4bb690 +c09328d2327d85a1 22a819cd62d22826 +c09328d2327d85a1 22cea08857c026ff +c09328d2327d85a1 24257e221b624030 +c09328d2327d85a1 26be8b8c2a6f21f0 +c09328d2327d85a1 28a1d2307a31aba8 +c09328d2327d85a1 2afc4c1cb65624f8 +c09328d2327d85a1 2b029a55ff8f575e +c09328d2327d85a1 2b7c2d1bd1c9a07a +c09328d2327d85a1 2b8710d154eee001 +c09328d2327d85a1 2bdd10dcd4eecb86 +c09328d2327d85a1 2ca3f0ab2a061d37 +c09328d2327d85a1 2f948b8e0f432872 +c09328d2327d85a1 301110435b705938 +c09328d2327d85a1 33049a99aa3a1102 +c09328d2327d85a1 337b51c6b8f3426b +c09328d2327d85a1 33e4ffee35c002e9 +c09328d2327d85a1 37473d2225877064 +c09328d2327d85a1 377105c5074bad6c +c09328d2327d85a1 38a807e23efe203e +c09328d2327d85a1 38cd9aae475e37e0 +c09328d2327d85a1 39a3e96aa03bb0eb +c09328d2327d85a1 39fdff7e7fa63ac7 +c09328d2327d85a1 3a49f0819b8e215d +c09328d2327d85a1 3a69f35d852d5d71 +c09328d2327d85a1 3b62d58c934c117e +c09328d2327d85a1 3bc1b4d694310647 +c09328d2327d85a1 3d3cd15b623d4213 +c09328d2327d85a1 3f95c59eea529343 +c09328d2327d85a1 3f9d0c65a302162d +c09328d2327d85a1 3feb751986adbc88 +c09328d2327d85a1 40d4d808442f6312 +c09328d2327d85a1 41c11c9d93b2852d +c09328d2327d85a1 450e77d92adf2f1f +c09328d2327d85a1 457fab3a9e830ac8 +c09328d2327d85a1 464b82f921f350ba +c09328d2327d85a1 4654d4edb9e1012f +c09328d2327d85a1 4685c259314cd8a0 +c09328d2327d85a1 47199c57e5aaacae +c09328d2327d85a1 484e3ecc7e5c8c3b +c09328d2327d85a1 48c4dbb9d792f547 +c09328d2327d85a1 4993376bf78fff32 +c09328d2327d85a1 4c32eba44fdcdb6d +c09328d2327d85a1 4c52056488a8e734 +c09328d2327d85a1 4e3017abcf9edc85 +c09328d2327d85a1 4fb2487c6fcc862e +c09328d2327d85a1 5085cbd321b6eaa5 +c09328d2327d85a1 514f63a8bedbabec +c09328d2327d85a1 516546a6aacb652b +c09328d2327d85a1 5184a44526ec72aa +c09328d2327d85a1 522000c1592c206e +c09328d2327d85a1 525b01e0e0c1ef8e +c09328d2327d85a1 52d0ee6294bf5555 +c09328d2327d85a1 53fc8cf4032ec007 +c09328d2327d85a1 54845c883d9c0c4b +c09328d2327d85a1 5611489b8d5dc008 +c09328d2327d85a1 56c9070ec1002232 +c09328d2327d85a1 57d70727109a155b +c09328d2327d85a1 593691caa90e6293 +c09328d2327d85a1 59b26ca47f516c49 +c09328d2327d85a1 5c70252e0bbb5169 +c09328d2327d85a1 5e5f5ca9e108b565 +c09328d2327d85a1 5ece5c600d3562bd +c09328d2327d85a1 619a6e209cb1590a +c09328d2327d85a1 66bdb4620759af80 +c09328d2327d85a1 67847bce824bbce8 +c09328d2327d85a1 678e1f1113e38c67 +c09328d2327d85a1 681d7626b64f019c +c09328d2327d85a1 68b017332477d9be +c09328d2327d85a1 6d41d78ab01bb995 +c09328d2327d85a1 6d588b9dac6aeb94 +c09328d2327d85a1 6db3e2beca614225 +c09328d2327d85a1 6ef94f153d1c3a9c +c09328d2327d85a1 6ff548e60e1705e0 +c09328d2327d85a1 6ffd276f17cc0546 +c09328d2327d85a1 70480bd0dbdee9b0 +c09328d2327d85a1 70fedaa4ca5c202d +c09328d2327d85a1 73a8508e882e1bfc +c09328d2327d85a1 73b6500185682adc +c09328d2327d85a1 73c485c2b19c1a15 +c09328d2327d85a1 740b925eb6529819 +c09328d2327d85a1 76cf9ea68f71395b +c09328d2327d85a1 76e900236e125d69 +c09328d2327d85a1 77b11c30dcd996c2 +c09328d2327d85a1 77d48c7aa58aea38 +c09328d2327d85a1 79098056539338bf +c09328d2327d85a1 798b83a79ee9933f +c09328d2327d85a1 7d054f19454dfc4f +c09328d2327d85a1 7f8b02a807176eb5 +c09328d2327d85a1 7fd4ebfa67ba8bd3 +c09328d2327d85a1 80e2eeebf84e7720 +c09328d2327d85a1 815906d351415019 +c09328d2327d85a1 81d4d9cf695b198a +c09328d2327d85a1 838ba2a8d1199605 +c09328d2327d85a1 83ad9c253eddfd0a +c09328d2327d85a1 8563ebaf4650a3fa +c09328d2327d85a1 8567ad9bd14efeae +c09328d2327d85a1 856c31e0a5fe4ef2 +c09328d2327d85a1 85ab7612a85c9543 +c09328d2327d85a1 862be0e48b32160b +c09328d2327d85a1 87c65f71e030af10 +c09328d2327d85a1 8814841bea07e852 +c09328d2327d85a1 884fe85530859bd7 +c09328d2327d85a1 89ce899ce1e2892a +c09328d2327d85a1 8bb56c1166766fa5 +c09328d2327d85a1 8c81bc5f35b92ac0 +c09328d2327d85a1 8cec4602aa40aada +c09328d2327d85a1 8d63d3bbc3d9c748 +c09328d2327d85a1 8ec931ec046a53c4 +c09328d2327d85a1 8eee67f344e1e40e +c09328d2327d85a1 8f479ba667304cad +c09328d2327d85a1 8fe4cff50d5f40d8 +c09328d2327d85a1 9402c414fbd6f8d8 +c09328d2327d85a1 9423624f267ca139 +c09328d2327d85a1 95aaea30a8458278 +c09328d2327d85a1 98aa02d57b5475dd +c09328d2327d85a1 99a0c1948f9139be +c09328d2327d85a1 9caaa0cc0291dcf5 +c09328d2327d85a1 9f546f54ee33cbe8 +c09328d2327d85a1 9f6581f5a7a735fa +c09328d2327d85a1 a1423b3bb27cbba1 +c09328d2327d85a1 a158a739e64db314 +c09328d2327d85a1 a261049287bcaad5 +c09328d2327d85a1 a31d929257eab935 +c09328d2327d85a1 a3d4e91d207ff758 +c09328d2327d85a1 a42680a122511ce2 +c09328d2327d85a1 a5bd71fa546e7749 +c09328d2327d85a1 a887941b6036735f +c09328d2327d85a1 a89e9a2d0702a4be +c09328d2327d85a1 a97121641f594e67 +c09328d2327d85a1 aa4692b6d51ef9dd +c09328d2327d85a1 aa50de2a91acedde +c09328d2327d85a1 ad16280ed4c04d96 +c09328d2327d85a1 aefc840ee06a7d6a +c09328d2327d85a1 af529862a0f371d8 +c09328d2327d85a1 af7fe9e50214fc3d +c09328d2327d85a1 b057d33a1c92f7a0 +c09328d2327d85a1 b364e910926512f2 +c09328d2327d85a1 b48b86fa25c68a1b +c09328d2327d85a1 b523432f2103d740 +c09328d2327d85a1 b542ca359fec5dcd +c09328d2327d85a1 b67dfe83c38be1b0 +c09328d2327d85a1 b753f5c3a34e344d +c09328d2327d85a1 b7f6f89c5b10dd5b +c09328d2327d85a1 b90c2b314c2a307f +c09328d2327d85a1 ba406b5600145fd6 +c09328d2327d85a1 ba458a1d1df64a1c +c09328d2327d85a1 ba46b48ba2059cf2 +c09328d2327d85a1 ba65d1945e183f7e +c09328d2327d85a1 ba6c004634433240 +c09328d2327d85a1 baa058f036862546 +c09328d2327d85a1 bab4beb3f4c8f2ae +c09328d2327d85a1 badbbf7f9be21d2e +c09328d2327d85a1 bc7c2ecb1013c821 +c09328d2327d85a1 bf64fa95bf90b47d +c09328d2327d85a1 bfce40c2cbc9b960 +c09328d2327d85a1 c0d420045ff8262f +c09328d2327d85a1 c11b4b4a94c21684 +c09328d2327d85a1 c14dbc8f0da28d75 +c09328d2327d85a1 c1788e7abd86446d +c09328d2327d85a1 c19e38c2f2db6aef +c09328d2327d85a1 c222b8d752b4ac35 +c09328d2327d85a1 c23bfc57bbbeee38 +c09328d2327d85a1 c2cee046782298cf +c09328d2327d85a1 c4b2cad02fc01f90 +c09328d2327d85a1 c587043c7bfd2e1b +c09328d2327d85a1 c5a1a46cf329fbf8 +c09328d2327d85a1 c75ad145dff02c5a +c09328d2327d85a1 c81100990157ee1b +c09328d2327d85a1 ca12d9645ba8a3cf +c09328d2327d85a1 ca95050074726183 +c09328d2327d85a1 cad265390bacab7f +c09328d2327d85a1 ccddf9814e23c453 +c09328d2327d85a1 cdcf5ced3051ecfc +c09328d2327d85a1 ce2ea8e179c1b5e3 +c09328d2327d85a1 d0f0539f2e809df0 +c09328d2327d85a1 d1040d971acd3591 +c09328d2327d85a1 d18bdf5c6da1cbe1 +c09328d2327d85a1 d1e574eb8634f99c +c09328d2327d85a1 d223599ac660fe74 +c09328d2327d85a1 d304805e47a21a4f +c09328d2327d85a1 d3952e24f4d135ef +c09328d2327d85a1 d3a059e3b2a1f354 +c09328d2327d85a1 d444810fa2dd8fc9 +c09328d2327d85a1 d534528026ad3daf +c09328d2327d85a1 d59ce72cc28c2c9b +c09328d2327d85a1 d62dfd7c47de5df6 +c09328d2327d85a1 d65873c76ecd627c +c09328d2327d85a1 d7b20dcdcfe62b93 +c09328d2327d85a1 d8f5111bea2e4104 +c09328d2327d85a1 da6e9c4b6e876ca7 +c09328d2327d85a1 dc45d69ebe464e4a +c09328d2327d85a1 ddbdb8704c024162 +c09328d2327d85a1 dfadafd8348b6e6f +c09328d2327d85a1 e1309b4e3f5edc5c +c09328d2327d85a1 e2073bb1f2a5d3f5 +c09328d2327d85a1 e51fb1d367bb6d6e +c09328d2327d85a1 e6c85d4ed6230c5b +c09328d2327d85a1 e79c89d6dde7a7ed +c09328d2327d85a1 e99dafaf7290518b +c09328d2327d85a1 e9e55ad00630524b +c09328d2327d85a1 eabb8c2fad1cafeb +c09328d2327d85a1 eb57d92585cccb04 +c09328d2327d85a1 ed563b14c9e9de93 +c09328d2327d85a1 eda7269b841f4e40 +c09328d2327d85a1 eedea19268e0b068 +c09328d2327d85a1 f02d633b5e610cd1 +c09328d2327d85a1 f095d59b1ef2bdc2 +c09328d2327d85a1 f17f80116bcb1684 +c09328d2327d85a1 f253929fd42b8cf3 +c09328d2327d85a1 f2931f45a7ef1850 +c09328d2327d85a1 f316410f9b8e1737 +c09328d2327d85a1 f40d36c01d6f1193 +c09328d2327d85a1 f5d2be37542fa5d4 +c09328d2327d85a1 f62041a8fc4e134b +c09328d2327d85a1 f6d3ea922006e6f5 +c09328d2327d85a1 f742e390833d3d42 +c09328d2327d85a1 f7da4fd1b5967b79 +c09328d2327d85a1 f8608d33892a4be4 +c09328d2327d85a1 f8adf08ab86cacff +c09328d2327d85a1 f8f3d4acd53b9468 +c09328d2327d85a1 fa65871ced1fef16 +c09328d2327d85a1 fb404521d86c9e53 +c09328d2327d85a1 fbb4504424a38634 +c09328d2327d85a1 fc12feaab83c641c +c09328d2327d85a1 fc58cedadead6f33 +c09328d2327d85a1 fd281834890f5977 +c09328d2327d85a1 fda9ce421b1e7935 +c09328d2327d85a1 fffc8b80cc205955 +c14269696ff0e3af 1b7a33a867bfa797 +c2e7451e57dc6536 0f8d337cfe52dac7 +c2e7451e57dc6536 8ed1881f52794f74 +c342f4d4325e1489 8f1e5d8565fe3b09 +c34eca68c3655d89 6c2e7157952d0646 +c352d717c68ffaa9 6857031e846cb37a +c352d717c68ffaa9 adc128cc41696a85 +c357a0a2ae629ccc 00179b95b99d30fa +c357a0a2ae629ccc 0282b903168dd79a +c357a0a2ae629ccc 054aad9f1879f6c8 +c357a0a2ae629ccc 1048f6333c34ce10 +c357a0a2ae629ccc 1b9b4486582fd247 +c357a0a2ae629ccc 1d51180727e10604 +c357a0a2ae629ccc 1e584eb60e72e563 +c357a0a2ae629ccc 1f1566a64e558fc4 +c357a0a2ae629ccc 22520ebc40115560 +c357a0a2ae629ccc 2817169d275e61e5 +c357a0a2ae629ccc 2c76df2e5b3b046f +c357a0a2ae629ccc 304faa36589a7087 +c357a0a2ae629ccc 3c89f72be8f512f5 +c357a0a2ae629ccc 3e8567da37eb28a1 +c357a0a2ae629ccc 42ed17c75c82c5d1 +c357a0a2ae629ccc 48e55c0e4cd06039 +c357a0a2ae629ccc 48f4c35ea84b4601 +c357a0a2ae629ccc 4dac065fa45a3e0e +c357a0a2ae629ccc 4f5b8fb9bee91be1 +c357a0a2ae629ccc 521a334b81268b08 +c357a0a2ae629ccc 55ef2effda9de713 +c357a0a2ae629ccc 5a00e98591430e8c +c357a0a2ae629ccc 5a545c0a98969721 +c357a0a2ae629ccc 5f2d509303aefc51 +c357a0a2ae629ccc 6805099687bfe158 +c357a0a2ae629ccc 6fe829c644ef8084 +c357a0a2ae629ccc 72aba7bc4dc2b365 +c357a0a2ae629ccc 790b6c55efb8947e +c357a0a2ae629ccc 7d6b4227790ba916 +c357a0a2ae629ccc 8078dfca428355f6 +c357a0a2ae629ccc 81a7d756458eaed4 +c357a0a2ae629ccc 83ed6a533d14d8a7 +c357a0a2ae629ccc 85e8a163277e5c33 +c357a0a2ae629ccc 87276935f1365e31 +c357a0a2ae629ccc 8d57e82cd71faf5c +c357a0a2ae629ccc 93efad31164e7443 +c357a0a2ae629ccc 987219df2bdeed16 +c357a0a2ae629ccc 9f67b29958f5a388 +c357a0a2ae629ccc aa0f688cc575902d +c357a0a2ae629ccc af75359a70fe8166 +c357a0a2ae629ccc ba76276ca635b761 +c357a0a2ae629ccc bdddd476c5a27824 +c357a0a2ae629ccc cbca2f61e81b3d97 +c357a0a2ae629ccc cf1fdcec323079e9 +c357a0a2ae629ccc d01e0d238ce1dace +c357a0a2ae629ccc d6434fc1544b7767 +c357a0a2ae629ccc e10c7926ca4a5c6b +c357a0a2ae629ccc e4afb80d0196e589 +c357a0a2ae629ccc e62fa48bcf9ed26c +c357a0a2ae629ccc e6ef881c0b330808 +c357a0a2ae629ccc e8f1749f7321db72 +c357a0a2ae629ccc e9990ee3161790c6 +c357a0a2ae629ccc f3322200a8725604 +c357a0a2ae629ccc f5d37eb62bcdaf92 +c357a0a2ae629ccc f64fe970747abd77 +c357a0a2ae629ccc ffd0ad7a3317f138 +c3c3935661d79ff2 5a079f806d1ff86d +c3c3935661d79ff2 7deee65b28bb482e +c3c3935661d79ff2 a5a0eb198747c644 +c3c958b34d151431 0b6f1abf3c07b035 +c3c958b34d151431 24ec88b08a98669f +c3c958b34d151431 703e3d85121acef5 +c3c958b34d151431 a138f61c1ece5e46 +c3c958b34d151431 ebb894f97773d54a +c3c958b34d151431 f42655329ef66cd0 +c4fd92826860ac5b 652c0c79312f52c6 +c4fd92826860ac5b ab46fc438ece1833 +c5a5f2abd713ccee 5eeba3e58ff8c06c +c5a5f2abd713ccee 6dd8b41e1536dc24 +c5f4b77db5ad3549 366840fe48ee7310 +c616f08f1eb867a9 08c416fd3198df53 +c616f08f1eb867a9 18cdd497f48f2690 +c616f08f1eb867a9 2f1af81fe302df71 +c616f08f1eb867a9 3ab00dd17feacd36 +c616f08f1eb867a9 511aecf0e9e83d04 +c616f08f1eb867a9 54ab095249459229 +c616f08f1eb867a9 b14a6cd8bd4d89fe +c616f08f1eb867a9 b607af8d9faefc8f +c616f08f1eb867a9 d0eec7bcee121dca +c616f08f1eb867a9 d3e6dba899836f48 +c616f08f1eb867a9 dc1599ba4061e2bd +c616f08f1eb867a9 e8f1660df366298e +c6324a977665f41e 112541f989dd6c68 +c6324a977665f41e 235effd16f7caef8 +c6324a977665f41e 7e22e35dfdc6bb62 +c6324a977665f41e 8b95549642c0ffac +c6324a977665f41e 9a08f70c2775ebe7 +c6324a977665f41e b6e61323a67551d3 +c6324a977665f41e cb8f5f811fa60687 +c6324a977665f41e ef9e314de2941c4d +c6409c47da4e40ed 3e2a10fcd402f086 +c6409c47da4e40ed dab3a9e9f3e3413a +c6bc9fce166de0ec cdab2b4462e6d84b +c8c1fe5a15b9fa03 d11575ff2e305a68 +c8eda40e78b8c66b 157b1f92ff847024 +c9d253cfa78bd32a daee6654c2be74a5 +c9f64e1806e72727 0b6f1abf3c07b035 +c9f64e1806e72727 24ec88b08a98669f +c9f64e1806e72727 703e3d85121acef5 +c9f64e1806e72727 a138f61c1ece5e46 +c9f64e1806e72727 ebb894f97773d54a +c9f64e1806e72727 f42655329ef66cd0 +ca175022ca3b8f26 7240e0b9216d7fab +ca175022ca3b8f26 dba6d0453cb740f9 +ccf10f927b336bd2 1ef65d3949166979 +ccf10f927b336bd2 266de4bb04230c15 +ccf10f927b336bd2 418e48d1565a5be5 +ccf10f927b336bd2 946e2dd3517dc6c8 +ccf10f927b336bd2 bc133759ccb26c89 +ccf10f927b336bd2 c534b746a6a286a2 +cdb5774b003240d2 8d6e0b64a7d4a691 +cee55303260c0c33 02362b41ae93f11d +cee55303260c0c33 0452261faa081d33 +cee55303260c0c33 0654f94fc497b62d +cee55303260c0c33 11228cc1a0a0808c +cee55303260c0c33 1c44298179a92b96 +cee55303260c0c33 28e75004ac16c012 +cee55303260c0c33 36a9fa31b1e56ec3 +cee55303260c0c33 3f13ac49243c9079 +cee55303260c0c33 3f86a9ffebc4d97b +cee55303260c0c33 4f2f39f0b1586ec8 +cee55303260c0c33 691a0e52266f5f1f +cee55303260c0c33 7382ebf9668d086c +cee55303260c0c33 83ed6a533d14d8a7 +cee55303260c0c33 9144bcfcb0104efc +cee55303260c0c33 ae5b428ac8d2c730 +cee55303260c0c33 b1969008fafc8757 +cee55303260c0c33 c5e9bab1e09036de +cee55303260c0c33 d3ae3f019d264a48 +cee55303260c0c33 d649d8ae77cdf690 +cee55303260c0c33 d77c92d232ff8ec4 +cee55303260c0c33 df268a23e22dfc1a +cee55303260c0c33 ed5f6358bb845531 +cee55303260c0c33 fbdafc185ba94966 +cfdeb37d1cd894d9 bad7b34d06c61e31 +d04a8d7c9df39004 dd1eea7b70c7c273 +d0536b945c53f36e 9c7a494ecfba7fd4 +d0b54a278bd56584 13564ff56a3267b7 +d0b54a278bd56584 1f387acc44b827ac +d0b54a278bd56584 40148ccf6589f1fe +d0b54a278bd56584 4d49a1a7dd0f93c0 +d0b54a278bd56584 505aa19006a2b70b +d0b54a278bd56584 5d4ce705d2fe6ed7 +d0b54a278bd56584 5e44798cd6e6e43e +d0b54a278bd56584 64a9eef45477f5c1 +d0b54a278bd56584 78b1a8b034171131 +d0b54a278bd56584 8f04c54b05431038 +d0b54a278bd56584 94f19abed2524223 +d0b54a278bd56584 bf16864071af1c24 +d0b54a278bd56584 cf2e4ee0c10f1e03 +d0b54a278bd56584 d2c6facaf9ad82b2 +d0b54a278bd56584 d67d183d75460a10 +d0b54a278bd56584 ec94c1ddb28e181f +d0f66456492e7c71 00cd504df928d778 +d0f66456492e7c71 15dd07266e3555c5 +d0f66456492e7c71 22413337311db403 +d0f66456492e7c71 4f67afe1b4b2e50e +d0f66456492e7c71 51d42fa53a56b27b +d0f66456492e7c71 9d9f50ac01968aa0 +d1610afb1bb995d5 470a9455a86a66d3 +d1610afb1bb995d5 86b1e5bcfee24b90 +d1610afb1bb995d5 999ded9eb8b4c695 +d1610afb1bb995d5 eea1be39c04d78d4 +d21b595234b9bb00 caf05bfbd2ec2f9c +d2a436b471f1f9ce 715951d5458094eb +d2ffe072ac262c01 d830c061a57ed0e2 +d31b51e30ddc34dd 3ca6eaba8ed7e45e +d31b51e30ddc34dd 3e5d1998fdf18ab6 +d31b51e30ddc34dd 57a60adddbf94dc4 +d31b51e30ddc34dd 5ccb35c7e5bad5af +d31b51e30ddc34dd 698df4f27dbf6fe6 +d31b51e30ddc34dd 6b1c6a398832eb9b +d31b51e30ddc34dd 8d5dd565dd11851d +d31b51e30ddc34dd 988b0448cc8d52ed +d31b51e30ddc34dd c07c9c2a563ce4f2 +d31b51e30ddc34dd ca4f9ff7477fca43 +d31b51e30ddc34dd e6f28273d06fe1fb +d31b51e30ddc34dd f85b75d6f530e68c +d38b0390c0a99e33 bb6f5557b601b9c8 +d38b0390c0a99e33 fd1029c6006085b2 +d50f18685792715e 13480be326e8eeb3 +d50f18685792715e 23b8088b220a0dcf +d50f18685792715e 4492dd324ae403b6 +d50f18685792715e 66ca4af9b989d0ab +d50f18685792715e 7340d9c426fd738c +d50f18685792715e 7fa2500f79a3bd07 +d50f18685792715e aaf84fe411f97222 +d50f18685792715e be7764595cf85630 +d50f18685792715e c88eb40dc32bc872 +d50f18685792715e d6e02531e882830a +d50f18685792715e e508123ed21cd7d3 +d50f18685792715e fad24257b35d90e9 +d683e5a598bb0ba6 0cd4c9f563e46a29 +d6bdcc7f91267dfe e7b62476bfa1849c +d719f57f7f75caba 31d829b3e73b18bc +d73b7e731d1a2a41 1952b3888ff6d04d +d73b7e731d1a2a41 1bc2335d9bcd9355 +d73b7e731d1a2a41 3a00e3dcc7fd0926 +d73b7e731d1a2a41 fc5aafb3771a01b7 +d793295226effcea dd1eea7b70c7c273 +d861d53eb4d0c42e 6317a68167678aa9 +d861d53eb4d0c42e c9c50dbfcf5c2db1 +d8ed29498ae0b9e3 4a7fce1632eb402f +d985000d1a31f04a 30e24ca347af2467 +da6e12c8ddcdfa6b 55b3021534e4835b +db3c57d3bac860c9 34037a6e4a16f367 +dbff07e5d0acd788 a96e5c6fa2ccd730 +dc422e88a336d1d7 6317a68167678aa9 +dc422e88a336d1d7 c9c50dbfcf5c2db1 +dce75a387647e5a5 08a8d1342e6e29dd +dce75a387647e5a5 1e75f9b2da7d4838 +dd16d2de3dbb4123 22cbf242b90bca27 +dd62cfbf72c7e385 2b8d18aef85c9428 +dd7233bcc81e1f58 183433e0f6e939ac +dd7233bcc81e1f58 604b31a2977b039e +dd7233bcc81e1f58 76b663d8873c6ffd +dd7233bcc81e1f58 f9ae15af63b84210 +de6a821edff3953e 0046078ae769e623 +de6a821edff3953e 02c891a519b19e87 +de6a821edff3953e 0a6707074658eb85 +de6a821edff3953e 0b5fb6e23b6932d9 +de6a821edff3953e 18341b59c3487324 +de6a821edff3953e 20d74fe8ec4800de +de6a821edff3953e 2c06a9ea90ae1c3c +de6a821edff3953e 3b135c615cd761cd +de6a821edff3953e 50a4150b05ec0e28 +de6a821edff3953e 54440c611f94ea68 +de6a821edff3953e 6529d26a7dd33270 +de6a821edff3953e 65c61fa702f60106 +de6a821edff3953e 6867e83d15b0b275 +de6a821edff3953e 6869f14b337117b8 +de6a821edff3953e 744c3acb902af142 +de6a821edff3953e 760b807f27c7e6a8 +de6a821edff3953e 7c6ba3b78dd31f80 +de6a821edff3953e 84766a37a5c8a80e +de6a821edff3953e 8b9aea229cda7a5c +de6a821edff3953e 8e595fd9f9ec86a0 +de6a821edff3953e 987d520f90969409 +de6a821edff3953e a29ff7d2551ebac2 +de6a821edff3953e a2cd4f4cb174e0e6 +de6a821edff3953e b3c2ab2327bae7ca +de6a821edff3953e b60ffceef5a5cb31 +de6a821edff3953e b9a0e5467e57de3b +de6a821edff3953e c2ae9b1812dbe06c +de6a821edff3953e c5068607f7b8742f +de6a821edff3953e cc6684974a6b49c5 +de6a821edff3953e d363977e1aec1ed8 +de6a821edff3953e e3d5424f7668005e +de6a821edff3953e e716738960c496ba +de6a821edff3953e ebec0f380fe37b50 +de6a821edff3953e f47d8572bbf08f75 +de6a821edff3953e f9f5732389543173 +de6a821edff3953e fd6a95684fdd5ed2 +dffaacd4648e62d0 b6e5d146cd012b7a +e01440edd8f761b7 5eeba3e58ff8c06c +e06819b16d428512 07820d7f83640594 +e06819b16d428512 0d9b68f4ecb1c488 +e06819b16d428512 480bf00e2cc81869 +e06819b16d428512 6cc2ee39b4e91fd1 +e06819b16d428512 d15321216e690fb2 +e06819b16d428512 d6c0d9b7df27175c +e06819b16d428512 e73fa2385514ce2f +e06819b16d428512 edcb75cbaff821de +e0e8c6c6edab7858 addc8774ebbb510c +e1fb42b99d28bad0 153fd595931405a2 +e1fb42b99d28bad0 35a6169fc2ca69bd +e1fb42b99d28bad0 617c3c56f3778485 +e1fb42b99d28bad0 6563d9a972a5a30e +e1fb42b99d28bad0 d26df772c36032cd +e1fb42b99d28bad0 e41353410f76809f +e21e03885c1e6dad b02775ec2c8e4a92 +e21e03885c1e6dad dadc11d44c8cec7e +e24cc51f5c1311a6 416c3c3bb5c168f1 +e24cc51f5c1311a6 681e060a49cffc34 +e2b0a7dc92f0754c 1952b3888ff6d04d +e2b0a7dc92f0754c 1bc2335d9bcd9355 +e2b0a7dc92f0754c 3a00e3dcc7fd0926 +e2b0a7dc92f0754c 677bc1ab085a963f +e2b0a7dc92f0754c fc5aafb3771a01b7 +e339df4470784679 8b570d96d97c0d7e +e430fec18794bc7d aa015823b84bfc4e +e4b5b0967a3cd0b3 04c7b950c13e37cd +e4b5b0967a3cd0b3 04fb26bc9fc73c23 +e4b5b0967a3cd0b3 151d22ee8c7eb728 +e4b5b0967a3cd0b3 19fddf6e82af9218 +e4b5b0967a3cd0b3 1aa9c4e721bd64df +e4b5b0967a3cd0b3 1db6d3d941fc2fdd +e4b5b0967a3cd0b3 2317a4a551cbfcf8 +e4b5b0967a3cd0b3 247a6b0d6f6e7baf +e4b5b0967a3cd0b3 2609992fa56283d7 +e4b5b0967a3cd0b3 31434cc8d4a2daf8 +e4b5b0967a3cd0b3 3dd5ca919fa54d71 +e4b5b0967a3cd0b3 4f92654bdfa421c1 +e4b5b0967a3cd0b3 5e83a2fbc4bfc064 +e4b5b0967a3cd0b3 64152baa13dc4846 +e4b5b0967a3cd0b3 6904981819f185c1 +e4b5b0967a3cd0b3 7ae747c2f813eb6f +e4b5b0967a3cd0b3 7b3503f6346516c6 +e4b5b0967a3cd0b3 7b81ee4eaa9f44f6 +e4b5b0967a3cd0b3 974585b0d92c7b81 +e4b5b0967a3cd0b3 988b1ddc3cf261d1 +e4b5b0967a3cd0b3 9efa89eea1812dfe +e4b5b0967a3cd0b3 a825bfe851948fe5 +e4b5b0967a3cd0b3 c1b8cc28b816b8b1 +e4b5b0967a3cd0b3 c313edf77e44772c +e4b5b0967a3cd0b3 c7a1fcac139f2327 +e4b5b0967a3cd0b3 cc9d33c656d8bf78 +e4b5b0967a3cd0b3 ce6f10adb3b85c7a +e4b5b0967a3cd0b3 d29a9f951ed1bd17 +e4b5b0967a3cd0b3 d78ffd033e48b524 +e4b5b0967a3cd0b3 df2f8ac14ae3bc91 +e4b5b0967a3cd0b3 e6ff1ac8f9be9af1 +e4b5b0967a3cd0b3 ecb4242efaf4042b +e5000778862ad363 3a1215e1f31c8734 +e5000778862ad363 441ee2d9dcf35014 +e5000778862ad363 47cb0bffcead3663 +e50364a3fa851536 925ba8ee8f49b33e +e50364a3fa851536 afcdeaed85d1f91e +e5f85d2880842bfa b512e6d6c57d31dd +e625b3e815831f59 1de545d8ccb31100 +e625b3e815831f59 27018d3f54423b09 +e625b3e815831f59 4ddd3536b4990ef6 +e625b3e815831f59 7212e00a4610e315 +e625b3e815831f59 810b8cd769042d74 +e625b3e815831f59 8f067ac1199ea399 +e625b3e815831f59 965e560630173812 +e625b3e815831f59 9f388fc68e2261be +e625b3e815831f59 d0e7338c0664dd79 +e625b3e815831f59 d5772493f5c4c39a +e625b3e815831f59 d927bea03ae931e0 +e625b3e815831f59 eab4b808fe1964ba +e625b3e815831f59 f28b55aba88a35cb +e68a80cf4149ad62 7e0a6ec2b1fd6f07 +e68a80cf4149ad62 f234fcbc78d6f2af +e6ef39f6297f0639 08c416fd3198df53 +e6ef39f6297f0639 18cdd497f48f2690 +e6ef39f6297f0639 2f1af81fe302df71 +e6ef39f6297f0639 3ab00dd17feacd36 +e6ef39f6297f0639 511aecf0e9e83d04 +e6ef39f6297f0639 54ab095249459229 +e6ef39f6297f0639 b14a6cd8bd4d89fe +e6ef39f6297f0639 b607af8d9faefc8f +e6ef39f6297f0639 d0eec7bcee121dca +e6ef39f6297f0639 d3e6dba899836f48 +e6ef39f6297f0639 dc1599ba4061e2bd +e6ef39f6297f0639 e8f1660df366298e +e7bfb22d5d2bd9d6 905acfa1a44f0a57 +e9dd9055036d3b73 afcdeaed85d1f91e +eb27e85d2d037116 5aeb4a2c766de6dd +ec6263c620e60331 0549866296fb6166 +ec6263c620e60331 4e5fbdd66a561d01 +ec6263c620e60331 8fdc0b468f1a9da1 +ec6263c620e60331 90b492bc6cfd4f63 +ecd8b7e834a6eb2f e9f926b372ea7130 +ed5e159c13b1f3ba 9d1d8f94d5295369 +ed714e24e14fabb4 0ccb43f6e3901c18 +ed714e24e14fabb4 d20b9cc10f4e166b +ed732b56c12f90ce 50cfb53ddc1c82e2 +ed732b56c12f90ce 90d0d9f0a60bda2e +eef73ad296893f98 28318442708447e9 +eef73ad296893f98 5b2b87cd5df582e1 +eef73ad296893f98 788fe42899e5c664 +eef73ad296893f98 8801818266be555d +eef73ad296893f98 90fb8dfe357805b3 +eef73ad296893f98 97d7d5f3456ea1bb +eef73ad296893f98 fd9ca6a223681c6c +efa561433fb4471e a4d6a52d32ee05aa +efc24e7929b03f58 7201d5045e77d4f5 +eff3b71b39c16c9b dd1eea7b70c7c273 +f00e95024dcea3b7 55b3021534e4835b +f060eb8c0d8d18e4 06b722a188d40f05 +f060eb8c0d8d18e4 3bc1bac48f060e57 +f060eb8c0d8d18e4 81a9dab80058e83e +f060eb8c0d8d18e4 91dd3d13f9ddb9a8 +f13c1363b77592f3 0fcc7e840716d4f5 +f13c1363b77592f3 19ad955bd2b92b47 +f13c1363b77592f3 36ee03e66e0f1b37 +f13c1363b77592f3 5bd3ad70b831abf2 +f13c1363b77592f3 7b910f3465fb7252 +f13c1363b77592f3 8c99aab6e7956b67 +f13c1363b77592f3 f8fa1a94c8055db1 +f168876b97ab0a21 02273c02bcf808e2 +f168876b97ab0a21 765fd9b9404309fd +f1c61f38228ba0f8 208046efad82773c +f1c61f38228ba0f8 8443ebafb605f1ec +f1f2ae521bb8f5f3 37285644b942f8b9 +f24c8acfab591467 905acfa1a44f0a57 +f27a1b0ab583eb68 0a00e62de7aa632c +f377b80bcc5f9410 05c62363240441d8 +f377b80bcc5f9410 147d1698190b4b49 +f377b80bcc5f9410 17286d2d0c3bb838 +f377b80bcc5f9410 2ef8783ee69d8374 +f377b80bcc5f9410 324a7d399bda349e +f377b80bcc5f9410 a02fc8c774a83036 +f377b80bcc5f9410 a841735777f188b1 +f377b80bcc5f9410 e90f908dac711f96 +f3d5906f550c3359 1347c0fa1dce8c14 +f3d5906f550c3359 1c1a7d64264356a5 +f3d5906f550c3359 258524a8ec776db5 +f3d5906f550c3359 6dcfce739295f9fe +f3d5906f550c3359 f774b1b6c805ab4c +f451d64739ee4777 2fa2833a1b65c7f2 +f468c3a953c6203e 81f79b27669ddaec +f468c3a953c6203e 93c82f6be23ac6db +f468c3a953c6203e e99d9eb2014813c4 +f468c3a953c6203e fcde71d05e2f80ee +f4cd66a158269736 416c3c3bb5c168f1 +f4cd66a158269736 681e060a49cffc34 +f4d0e39075a47d72 3b3a0fd3c9dc4abb +f4d0e39075a47d72 a1435fdee8a850cf +f4d1f2e34a4e8ffa 0766068f52ac2bdc +f4d1f2e34a4e8ffa 89951c13f001ef2f +f4d1f2e34a4e8ffa a2998e92aa21c9ee +f4d1f2e34a4e8ffa c62bb29cfb7ac63d +f557b8d58e94d91c 06d68917ae28a29d +f7154528b39457e0 34b2094807b7fb4a +f742c6434fc75e1f 0426bbd49ae9cc7d +f742c6434fc75e1f 057572c9c378ead2 +f742c6434fc75e1f 08f0cd2f61143fe2 +f742c6434fc75e1f 09750d83af1c6b0a +f742c6434fc75e1f 09ab6b2cc790b657 +f742c6434fc75e1f 10004091845e25b2 +f742c6434fc75e1f 14c252d1e507338e +f742c6434fc75e1f 18d456b3b3d66274 +f742c6434fc75e1f 18def80f09c7926c +f742c6434fc75e1f 19693119438a1bd4 +f742c6434fc75e1f 197734fb70bec107 +f742c6434fc75e1f 19df6011ba5f60c1 +f742c6434fc75e1f 1bfa8cd52be25130 +f742c6434fc75e1f 1e84e5cb3f1dd479 +f742c6434fc75e1f 1eb0a4261efd9425 +f742c6434fc75e1f 214254f091c0e492 +f742c6434fc75e1f 23cfd87dc81294b0 +f742c6434fc75e1f 2487fd4d47c0ee8d +f742c6434fc75e1f 275cd4a89effec54 +f742c6434fc75e1f 2c695c159aca470a +f742c6434fc75e1f 2f14dfdc73d67870 +f742c6434fc75e1f 2fb1302cec06c1ed +f742c6434fc75e1f 3310c0a2e5d97b99 +f742c6434fc75e1f 369217f297585e2b +f742c6434fc75e1f 36c45656641a40be +f742c6434fc75e1f 391ff76fdbe9e558 +f742c6434fc75e1f 3db4a54d0259eaef +f742c6434fc75e1f 3debdc7590cf5992 +f742c6434fc75e1f 40c5d6858b4c5b7f +f742c6434fc75e1f 422fead8905aa192 +f742c6434fc75e1f 42ba6a544a86fcdf +f742c6434fc75e1f 45a75d11b091684a +f742c6434fc75e1f 46339e22a1ab46ec +f742c6434fc75e1f 4c4d76d61d7299df +f742c6434fc75e1f 4de19adc3830ac79 +f742c6434fc75e1f 4f915de280c14e8a +f742c6434fc75e1f 502c5ddf56692cd0 +f742c6434fc75e1f 51f46acfa89cf1d8 +f742c6434fc75e1f 5202b243cde9b35f +f742c6434fc75e1f 5397477b94f98e45 +f742c6434fc75e1f 53f0e5d9c14fc698 +f742c6434fc75e1f 5ff8cdddf724ebb1 +f742c6434fc75e1f 6229c42f092219ce +f742c6434fc75e1f 634fc7b45164cd06 +f742c6434fc75e1f 6549f579b32716c1 +f742c6434fc75e1f 656985f757cd469f +f742c6434fc75e1f 670d968114c89f61 +f742c6434fc75e1f 6785b5072ac08b72 +f742c6434fc75e1f 6ab91a7b6ba6c269 +f742c6434fc75e1f 6b470deaad3e43bb +f742c6434fc75e1f 6b59ef364735be06 +f742c6434fc75e1f 6ea5e51a93ce301b +f742c6434fc75e1f 70fcc73ebdbb8e4c +f742c6434fc75e1f 710e567e8b52ff73 +f742c6434fc75e1f 71e43388cfead098 +f742c6434fc75e1f 74815c05d9294772 +f742c6434fc75e1f 75af73a50dbbfe63 +f742c6434fc75e1f 7721ac217b8248bf +f742c6434fc75e1f 7ab01fb4e825966c +f742c6434fc75e1f 7d384005c06c488e +f742c6434fc75e1f 7e5c523ff1f8a425 +f742c6434fc75e1f 7f92104091faa77d +f742c6434fc75e1f 825eaa884145cd4d +f742c6434fc75e1f 84350d5ea6627156 +f742c6434fc75e1f 84e465b0d4c1f63d +f742c6434fc75e1f 84f069524cb20972 +f742c6434fc75e1f 84f1b7583d8ec794 +f742c6434fc75e1f 858772d98970482e +f742c6434fc75e1f 88a4d5bad12336a8 +f742c6434fc75e1f 8978f7cc364f8018 +f742c6434fc75e1f 8a59f98b936f760f +f742c6434fc75e1f 8d54a871a1e869de +f742c6434fc75e1f 8f7b0b47b5a510fc +f742c6434fc75e1f 92b7c1f8eb4f3a56 +f742c6434fc75e1f 94fb18daaa48a722 +f742c6434fc75e1f 951a8e601b2d14f8 +f742c6434fc75e1f 952a9459ce882408 +f742c6434fc75e1f 96c03462f4f1b652 +f742c6434fc75e1f 970871b268336e87 +f742c6434fc75e1f 97edbfe9c54cb0a5 +f742c6434fc75e1f 9c0d9afaa92a4715 +f742c6434fc75e1f 9d0a27d5dcd8408b +f742c6434fc75e1f a05477f0a20b6d9d +f742c6434fc75e1f a079f0c5319b7c6b +f742c6434fc75e1f a14b1f51306fdb35 +f742c6434fc75e1f a2f7ceca04774f4d +f742c6434fc75e1f a40745c2acffd8a1 +f742c6434fc75e1f a4f1a51e41e190fb +f742c6434fc75e1f a5630868a0975598 +f742c6434fc75e1f aa069ea6e69c46ef +f742c6434fc75e1f aaf63f9d62ddafac +f742c6434fc75e1f abe2cc9a1c7e6f64 +f742c6434fc75e1f b3da0fa0ecc5880a +f742c6434fc75e1f b42a35372984fe76 +f742c6434fc75e1f b6d026613ca0cbbe +f742c6434fc75e1f b739cc0e05a3ac45 +f742c6434fc75e1f b81376d2b42313e3 +f742c6434fc75e1f b8766b753c850e53 +f742c6434fc75e1f b8a95732439bdc79 +f742c6434fc75e1f bb4ea04e11083ec1 +f742c6434fc75e1f bd9859216226ed67 +f742c6434fc75e1f be3dac69e2306c37 +f742c6434fc75e1f bf3cd2baa35f82bd +f742c6434fc75e1f bf9f41b6db593620 +f742c6434fc75e1f c04bb9eac4f2b0a8 +f742c6434fc75e1f c5164e7617ba9cb1 +f742c6434fc75e1f c54ff6d40ba0c493 +f742c6434fc75e1f c55d199ec170d2cf +f742c6434fc75e1f c586e61ae30ddd39 +f742c6434fc75e1f c6d61bdcb3c693d6 +f742c6434fc75e1f c8f1a2098e43e280 +f742c6434fc75e1f c8fb7ce574c82083 +f742c6434fc75e1f cb359bea1dddb5f5 +f742c6434fc75e1f ccc223019f7d5242 +f742c6434fc75e1f ce4f77dd39884276 +f742c6434fc75e1f ce65cfbbda1178ba +f742c6434fc75e1f cfd23c89dbbe0626 +f742c6434fc75e1f d08faeb47d688ae0 +f742c6434fc75e1f d23c282b3d40b7a6 +f742c6434fc75e1f d559b14a88390734 +f742c6434fc75e1f d981d06178dac563 +f742c6434fc75e1f dad8b10f52898a6f +f742c6434fc75e1f db18899783f37b55 +f742c6434fc75e1f db9e9a7bccbc7b79 +f742c6434fc75e1f ddcd4ad8074bbc6f +f742c6434fc75e1f df45b606a2dad9f4 +f742c6434fc75e1f df6237e87dbb63a4 +f742c6434fc75e1f e309a7c648cd2a91 +f742c6434fc75e1f e8590b8a1ada5756 +f742c6434fc75e1f e9506267262c3e7c +f742c6434fc75e1f ead58320cfc15125 +f742c6434fc75e1f eb3ff7fed9926c99 +f742c6434fc75e1f ee2cd16424cb645f +f742c6434fc75e1f ef0b91e00ba3e5a2 +f742c6434fc75e1f efc42e66e8180c36 +f742c6434fc75e1f f14bf30b75b13518 +f742c6434fc75e1f f22c606457cdc072 +f742c6434fc75e1f f24282ad5bf66ba9 +f742c6434fc75e1f f26987c13922c630 +f742c6434fc75e1f f54f7db0cf24c9dd +f742c6434fc75e1f f96f239d7beeccae +f742c6434fc75e1f fbbf6b5dedc96ad5 +f742c6434fc75e1f fdee06cedbc39d5b +f742c6434fc75e1f fe21eb79d3791a2e +f762f7cc4cbdac80 1bc2335d9bcd9355 +f762f7cc4cbdac80 3a00e3dcc7fd0926 +f79bd8f76a6c09c3 13540660ad78e484 +f79bd8f76a6c09c3 4ad250377939c75c +f79bd8f76a6c09c3 9b5ccd7169572258 +f79bd8f76a6c09c3 a020104ec8b4f67f +f7ea945dbac0579d 5ffc3451b2d06882 +f8d9bbda1e0ebb0a 2ab186d450f5b32c +f8d9bbda1e0ebb0a cfc85e532ccf8dd2 +f99fa498dec5b174 19b437bb5cc28798 +f99fa498dec5b174 cdab2b4462e6d84b +f9f13f38119e2cb7 bda4b11d98f14d2a +fa2fe4c746c8b51a eb0afe555b86da79 +fa2fe4c746c8b51a fe2fb179ae768fb8 +fa50350ae0ff5299 4a7fce1632eb402f +faa726fd5a51d08f 62328fecd28cfb06 +faa726fd5a51d08f defb913c1b700907 +faabc63ea488ae47 111485cc0f01328d +fca891aad682b0bc 02949742c087e915 +fca891aad682b0bc d4137dafdab30240 +fcd838adfc3b5364 0122d95483523519 +fcd838adfc3b5364 048184c8e1d9b6e0 +fcd838adfc3b5364 069949766b0c5ecb +fcd838adfc3b5364 084d158a64a4f78c +fcd838adfc3b5364 15224a79eb318912 +fcd838adfc3b5364 1800693a91731a46 +fcd838adfc3b5364 184efc83065f53bd +fcd838adfc3b5364 21a027fa40a89030 +fcd838adfc3b5364 24a28f2193dad6e2 +fcd838adfc3b5364 2870cce1009454ba +fcd838adfc3b5364 3368c5d9921c13ec +fcd838adfc3b5364 346601ba0308be9a +fcd838adfc3b5364 39099dfb8beb4f25 +fcd838adfc3b5364 3c2e7a8ff96ad43e +fcd838adfc3b5364 4aa9e7de41cecaef +fcd838adfc3b5364 4df1f7f446488a4c +fcd838adfc3b5364 4e1ce984210c755a +fcd838adfc3b5364 4e2d1524bd653bd2 +fcd838adfc3b5364 4e4dc5344f2f7f73 +fcd838adfc3b5364 50906113e4ba4677 +fcd838adfc3b5364 51f6152c3161ff80 +fcd838adfc3b5364 5a0444db9a58b3fd +fcd838adfc3b5364 5d0c8a217232e832 +fcd838adfc3b5364 5ee93eb6e002bd13 +fcd838adfc3b5364 5f44c3ae4066462f +fcd838adfc3b5364 5f85d9ad03ae46a3 +fcd838adfc3b5364 5fb5a882951fcb63 +fcd838adfc3b5364 630718b796f732ca +fcd838adfc3b5364 63e560183d65f2cc +fcd838adfc3b5364 64cdb8795268b595 +fcd838adfc3b5364 6850f02b459fb893 +fcd838adfc3b5364 6b1e79bee253bb04 +fcd838adfc3b5364 71c1d4e836a03b9e +fcd838adfc3b5364 7cdacb3d3e06e3bc +fcd838adfc3b5364 7d3e12d813f7720d +fcd838adfc3b5364 7fd246c3c653ef7d +fcd838adfc3b5364 7fe62f9e2a826572 +fcd838adfc3b5364 8209ab42e9752615 +fcd838adfc3b5364 82552298f81d94e4 +fcd838adfc3b5364 8cc4e4a5d49da6f9 +fcd838adfc3b5364 8d3f4b75a5702a42 +fcd838adfc3b5364 90829dc069b8334c +fcd838adfc3b5364 9549057bf1fb67a7 +fcd838adfc3b5364 96f5a51a875e93fe +fcd838adfc3b5364 98b25e2c790a6f60 +fcd838adfc3b5364 9b3c9c93fc394397 +fcd838adfc3b5364 9d9a530e36eb03c3 +fcd838adfc3b5364 9fa1edf8deaf4ee7 +fcd838adfc3b5364 a453cbbb30170a5a +fcd838adfc3b5364 a4ad158db254669e +fcd838adfc3b5364 a6b7cfc423590dc1 +fcd838adfc3b5364 adaf9a9a15e4da40 +fcd838adfc3b5364 b7bc77a154a42de3 +fcd838adfc3b5364 c0d1c110c74140a4 +fcd838adfc3b5364 c70f61381cbd5074 +fcd838adfc3b5364 cf78148f96782a08 +fcd838adfc3b5364 d4183934c485ccb8 +fcd838adfc3b5364 da23dbdf1fdc41ec +fcd838adfc3b5364 df0dee678d18ffd1 +fcd838adfc3b5364 e1756775d4bb5408 +fcd838adfc3b5364 e8b19e653b33158e +fcd838adfc3b5364 ebd052899dfc0cf3 +fcd838adfc3b5364 ebee432709280bd8 +fcd838adfc3b5364 eefeeaea4f24dcea +fce828edf60ca9cc 6e10b55581435e12 +fd0657a53244671c 4f88cd0ea0d06465 +fd5850394a8c51bf dd1eea7b70c7c273 +ff772db3008b53e2 328b89e003a2538d +ff772db3008b53e2 4ba82c8709ac6f41 +ff772db3008b53e2 7997814518c91bb4 +ff772db3008b53e2 c5c42592171cce53 +ff772db3008b53e2 c61e5000af9641d7 +ff772db3008b53e2 f22dda7c4395b904 +ffc982facb3c7051 80a1f563c24694a0 diff --git a/dm/games/README.md b/dm/games/README.md index 1fe82b6..5b8fff6 100644 --- a/dm/games/README.md +++ b/dm/games/README.md @@ -3,7 +3,7 @@ Each game the port knows has a folder `dm/games//`, named after the base game's title ID: Mario's is `010015100B514000`, Engage's `0100A6301214E000`. The folder holds: - **`game.tsv`**: the game's constants, one `keyvalue` row each, with comments on their own lines. -- **The shader tables** that `shader_split.py` writes: `shader_map.tsv` (+ `.conflicts.tsv`), `shader_facts.tsv`, `shader_pairs.tsv`. +- **The shader tables** that `shader_split.py` writes: `shader_map.tsv` (+ `.conflicts.tsv`), `shader_facts.tsv`, `shader_pairs.tsv`, and `pso_pairs.tsv` (the pairs of agl BAHS program variations, read only by the pipeline prebuild; a profile without it still packs). - **`shader_facts_manual.tsv`** (optional): hand-written translation facts in `shader_facts.tsv`'s row format, for what the machine code cannot tell (Link's Awakening: a vertex input the integer-input guess gets wrong; Breath of the Wild and Tears of the Kingdom: integer fragment outputs, which a game without a PC version has no other source for). `shader_split.py` merges it over the generated rows; since the table is on the chain, changing it changes only that profile's chain version. - **`pso_manifest.tsv`**: the prewarm seed list. - **`vk_capture.tsv`** (a Vulkan game that generates its shaders at run time, Super Mario Galaxy): the keys of the SPIR-V modules it generates. @@ -175,7 +175,7 @@ These are not profile keys: the tools read them from the game files each time, b The shader tables, `c1_full.tsv` and `cb_extent.tsv` are written into the same folder. A second run reuses that `game.tsv` (delete it to survey again), so it can be edited by hand. `--provisional` builds from a provisional profile even for a game that has one in `dm/games`, to test the guesses: `DM_GAMES_FIRST=1` makes every tool search `DM_GAMES_DIR` first, and the IPA gets `-provisional` in its name. Tools find profiles outside `dm/games` through `DM_GAMES_DIR` (folders separated by `:`, searched after `dm/games`); `make -C dm/host` reaches such a profile through the symlink `dm/host/gen//profile`. To keep a game, move the folder into `dm/games/` and bring it up as below. 2. **Profile.** Copy `010015100B514000/game.tsv` (or the provisional profile) to `dm/games//game.tsv` (the base game's title ID, as the folder name) and fill in the identity, `build` rows and `modules`. Leave the memory values as Mario's until the bring-up measures them ([docs/agents](../../docs/agents/README.md)). -3. **Shader tables.** Run `DM_GAME=<id> shader_split.py … dm/games/<id>/shader_map.tsv dm/games/<id>/shader_facts.tsv dm/games/<id>/shader_pairs.tsv`. Add an empty `shader_map.tsv.conflicts.tsv`, `bf_want.tsv` and `pso_manifest.tsv` (copy Mario's headers). +3. **Shader tables.** Run `DM_GAME=<id> shader_split.py … dm/games/<id>/shader_map.tsv dm/games/<id>/shader_facts.tsv dm/games/<id>/shader_pairs.tsv dm/games/<id>/pso_pairs.tsv`. Add an empty `shader_map.tsv.conflicts.tsv`, `bf_want.tsv` and `pso_manifest.tsv` (copy Mario's headers). 4. **Shaders.** `DM_GAME=<id> [IOSOUT=…] dmsh_build.py <pkg> <cache>`, with a cache directory of the game's own. A full build also writes `c1_full.tsv` and `cb_extent.tsv` (local files, not committed). The chain version needs nothing: it is the same for every game. 5. **Host bring-up.** Run `make -C dm/host GAME=<id>`, then work through the bring-up loop in docs/agents. Code that only fits one game is gated by its build ID (`dm_main_build()`), never left to run on every game. 6. **IPA.** Use `GAME=<id> dm/ios/tools/build_ipa.sh`, or the NSP script, which now finds the profile. diff --git a/dm/gfx/README.md b/dm/gfx/README.md index 4f6f440..4b7d653 100644 --- a/dm/gfx/README.md +++ b/dm/gfx/README.md @@ -155,6 +155,8 @@ Resource locations: | `DM_PSO_ARCHIVE=folder` or `off` | Where to keep the per-game pipeline archive of pipeline bases (default: `pso_archive/` beside `pso_user.tsv`), or no archive | | `DM_PSO_MTL4=0` / `=1` | `0`: build render pipelines through the `MTLDevice` as before, with no unspecialized bases and no archive (the Mac's default is on). `1`: turn them on on iOS, where they are off by default | | `DM_PSO_HYBRID=0` | A draw whose pipeline is not built yet waits for it, instead of drawing with the pair's pulling pipeline meanwhile (docs/development.md, "Hybrid pipelines") | +| `DM_PSO_PREBUILD=0` or `tool` | No background prebuild of the pulling bases into the archive; `tool`: run the prebuild alone and exit (`DM_PSO_PREBUILD_DEPTH=zero`, `DM_PSO_PREBUILD_THREADS=<n>`) | +| `DM_PSO_PAIRS=path` | The prebuild's second pair table (default: `pso_pairs.tsv` beside the shader map) | | `DM_PSO_WAITLOG=1` | Log each draw that waited more than 20 ms for its pipeline, with why no stand-in served it | | `DM_PSO_PULL_ALL=1` | Diagnostic: every draw that has a pulling pipeline draws with it | diff --git a/dm/gfx/nvn/nvn_mtl.m b/dm/gfx/nvn/nvn_mtl.m index 4728803..bec1647 100644 --- a/dm/gfx/nvn/nvn_mtl.m +++ b/dm/gfx/nvn/nvn_mtl.m @@ -4484,8 +4484,9 @@ static MTLRenderPipelineDescriptor *pso_desc(const pso_key *k, NvShader *vs, NvS // at start, and a base found in one is taken from it directly (MTL4Archive), not through the compiler's lookupArchives, which would capture it again into the next file. A base // taken from an archive costs about 0.06 ms, against 10-80 ms to build one. // DM_PSO_MTL4=0: the MTLDevice path as before (no bases, no archive). DM_PSO_ARCHIVE=off: no archive; DM_PSO_ARCHIVE=<folder>: the archive in that folder. -// On by default on the Mac only; on iOS DM_PSO_MTL4=1 turns it on, and with it the hybrid pipelines. The archive's memory is not measured against an iPhone's limit yet, and an -// iPhone cannot be given an archive made offline (metal-tt rejects the Metal 4 serializer's pipeline script) +// On by default on the Mac only; on iOS DM_PSO_MTL4=1 turns it on, and with it the hybrid pipelines and the pipeline prebuild. The archive's footprint (with the prebuild, about +// 850 MB more for Breath of the Wild) is not measured against an iPhone's limit yet, and an iPhone cannot be given an archive made offline (metal-tt rejects the Metal 4 serializer's +// pipeline script) static int pso4_on(void) { static int v = -1; if (v < 0) { @@ -4501,17 +4502,20 @@ static int pso4_on(void) { return v; } static id<MTL4Compiler> g_comp4; static id<MTL4PipelineDataSetSerializer> g_ser4; -static NSArray<id<MTL4Archive>> *g_arch4; static NSString *g_arch_dir; static int g_arch_seq; -static dispatch_queue_t g_arch_q; static _Atomic int g_arch_new, g_arch_sched; -// Compiles with the serializer attached hold this shared, a flush holds it alone: a compile that finishes during serializeAsArchiveAndFlushToURL crashed in Metal -// (-[_MTLBinaryArchive newArchiverIdWithBinaryKey:...]). Specializations and archive lookups do not take it (they capture nothing) -static pthread_rwlock_t g_arch_rw = PTHREAD_RWLOCK_INITIALIZER; -// Compaction: every start writes a file or more (each flush captures only what is new; Breath of the Wild 5-7 per start), and each file a base is not in costs a lookup about -// 0.06 ms. With more than PSO_ARCH_COMPACT files, the bases the prewarm takes from them are taken through the compiler with those files as its lookup archives, which captures them -// again, so the flush after the prewarm writes them into one file; the old files are then removed (open archives stay usable for the rest of the run). Bases the prewarm did not -// take (pso_user.tsv never named them) go with them and are built again when drawn +// g_arch4: the files that may hold bases with a vertex layout, g_arch4p: the files that hold none (p<seq>.mtl4a: the prebuild's, and any flush whose bases all read their vertices +// themselves). A base with a layout is looked up in g_arch4 alone: each file a lookup misses in costs about 0.06 ms, and a cold start's misses were for such bases, in the 13 prebuilt files +static NSArray<id<MTL4Archive>> *g_arch4, *g_arch4p; static NSString *g_arch_dir; static int g_arch_seq; +// Compaction: every start writes a file or more (each flush captures only what is new), Breath of the Wild 5-7 per start, and each file a base is not in costs a lookup about 0.06 ms. +// With more than PSO_ARCH_COMPACT files of bases with a vertex layout, the bases the prewarm takes from them are taken through the compiler with those files as its lookup archives, +// which captures them again, so the flush after the prewarm writes them into one file; the old files are then removed (open archives stay usable for the rest of the run). Bases the +// prewarm did not take (pso_user.tsv never named them) go with them and are built again when drawn. The prebuild's files (p<seq>) are left as they are enum { PSO_ARCH_COMPACT = 8 }; static MTL4CompilerTaskOptions *g_compact_opts; static NSArray<NSString *> *g_compact_files; static _Atomic int g_compacted; +static _Atomic int g_arch_new_vd; // bases with a vertex layout captured since the last flush (counted under g_arch_rw's read side, read under its write side) +static dispatch_queue_t g_arch_q; static _Atomic int g_arch_new, g_arch_sched; +// Compiles with the serializer attached hold this shared, a flush holds it alone: a compile that finishes during serializeAsArchiveAndFlushToURL crashed in Metal +// (-[_MTLBinaryArchive newArchiverIdWithBinaryKey:...], the prebuild's first flush). Specializations and archive lookups do not take it (they capture nothing) +static pthread_rwlock_t g_arch_rw = PTHREAD_RWLOCK_INITIALIZER; static _Atomic uint64_t g_pb_built, g_pb_archived, g_pb_reused, g_pb_spec, g_pb_legacy, g_pb_base_ns; // Time by kind, all threads (the 'pipelines up to frame' line): archive lookups that found the base / found none, specializations, base compiles; predictions (submit thread) static _Atomic uint64_t g_pt_hit_n, g_pt_hit_ns, g_pt_miss_n, g_pt_miss_ns, g_pt_spec_ns, g_pt_comp_ns, g_pt_pred_n, g_pt_pred_ns, g_pp_done_n; // bases compiled / taken from the archive / reused, specializations, MTLDevice builds @@ -4535,20 +4539,22 @@ static void pso4_init(void) { g_arch_q = dispatch_queue_create("dm.nvn.pso-archive", dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, 0)); MTL4PipelineDataSetSerializerDescriptor *sd = [MTL4PipelineDataSetSerializerDescriptor new]; sd.configuration = MTL4PipelineDataSetSerializerConfigurationCaptureBinaries; ser = [g_dev newPipelineDataSetSerializerWithDescriptor:sd]; - NSMutableArray<id<MTL4Archive>> *arch = [NSMutableArray array]; uint64_t t0 = bp_now(); unsigned long long bytes = 0; + NSMutableArray<id<MTL4Archive>> *arch = [NSMutableArray array], *archp = [NSMutableArray array]; uint64_t t0 = bp_now(); unsigned long long bytes = 0; NSMutableArray<NSString *> *runf = [NSMutableArray array]; NSArray<NSString *> *names = [[[NSFileManager.defaultManager contentsOfDirectoryAtPath:g_arch_dir error:nil] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.mtl4a'"]] sortedArrayUsingSelector:@selector(compare:)]; for (NSString *n in names.reverseObjectEnumerator) { // newest first NSString *p = [g_arch_dir stringByAppendingPathComponent:n]; NSError *ae = nil; id<MTL4Archive> a = [g_dev newArchiveWithURL:[NSURL fileURLWithPath:p] error:&ae]; - if (a) { [arch addObject:a]; [runf addObject:p]; bytes += [[NSFileManager.defaultManager attributesOfItemAtPath:p error:nil] fileSize]; } + int pf = [n hasPrefix:@"p"]; + if (a) { [pf ? archp : arch addObject:a]; if (!pf) [runf addObject:p]; bytes += [[NSFileManager.defaultManager attributesOfItemAtPath:p error:nil] fileSize]; } else MLOG("[RED] pipeline archive file %s not usable (%s): its bases are built again", p.UTF8String, ae.localizedDescription.UTF8String); - g_arch_seq = MAX(g_arch_seq, n.intValue + 1); + g_arch_seq = MAX(g_arch_seq, [n substringFromIndex:pf].intValue + 1); } - g_arch4 = arch; + g_arch4 = arch; g_arch4p = archp; if (runf.count > PSO_ARCH_COMPACT) { g_compact_opts = [MTL4CompilerTaskOptions new]; g_compact_opts.lookupArchives = arch; g_compact_files = runf; } - MLOG("pipeline archive %s: %lu files, %.1f MB, opened in %.1f ms", g_arch_dir.UTF8String, (unsigned long)arch.count, bytes / 1048576.0, (bp_now() - t0) / 1e6); + MLOG("pipeline archive %s: %lu files (%lu of bases without a vertex layout), %.1f MB, opened in %.1f ms", g_arch_dir.UTF8String, (unsigned long)(arch.count + archp.count), + (unsigned long)archp.count, bytes / 1048576.0, (bp_now() - t0) / 1e6); } MTL4CompilerDescriptor *cd = [MTL4CompilerDescriptor new]; cd.pipelineDataSetSerializer = ser; NSError *ce = nil; g_comp4 = [g_dev newCompilerWithDescriptor:cd error:&ce]; @@ -4567,7 +4573,8 @@ static void arch_flush(void) { if (!n || !g_ser4 || !g_arch_dir) { pthread_rwlock_unlock(&g_arch_rw); return; } [NSFileManager.defaultManager createDirectoryAtPath:g_arch_dir withIntermediateDirectories:YES attributes:nil error:nil]; uint64_t t0 = bp_now(); NSError *e = nil; - NSString *path = [g_arch_dir stringByAppendingPathComponent:[NSString stringWithFormat:@"%05d.mtl4a", g_arch_seq++]], *tmp = [path stringByAppendingString:@".tmp"]; + int vd = atomic_exchange(&g_arch_new_vd, 0); // exact: no compile is between capture and count while the write side is held + NSString *path = [g_arch_dir stringByAppendingPathComponent:[NSString stringWithFormat:vd ? @"%05d.mtl4a" : @"p%05d.mtl4a", g_arch_seq++]], *tmp = [path stringByAppendingString:@".tmp"]; BOOL ok = [g_ser4 serializeAsArchiveAndFlushToURL:[NSURL fileURLWithPath:tmp] error:&e]; pthread_rwlock_unlock(&g_arch_rw); ok = ok && !rename(tmp.fileSystemRepresentation, path.fileSystemRepresentation); if (!ok) { MLOG("[RED] pipeline archive: writing %s failed%s%s", path.UTF8String, e ? ": " : "", e ? e.localizedDescription.UTF8String : ""); unlink(tmp.fileSystemRepresentation); return; } @@ -4585,7 +4592,7 @@ static void arch_compact_finish(void) { // after the flush that follows the pr if (!g_compact_files || !g_compacted) return; if (!g_arch_flush_ok) { MLOG("[RED] pipeline archive: compaction left the old files (the flush failed)"); return; } for (NSString *f in g_compact_files) unlink(f.fileSystemRepresentation); - MLOG("pipeline archive compacted: %lu files gave %d bases to the file just written and were removed", (unsigned long)g_compact_files.count, (int)g_compacted); + MLOG("pipeline archive compacted: %lu files of bases with a vertex layout gave %d bases to the file just written and were removed", (unsigned long)g_compact_files.count, (int)g_compacted); g_compact_files = nil; } static void arch_flush_now(void) { if (g_arch_q) dispatch_async(g_arch_q, ^{ arch_flush(); arch_compact_finish(); }); } @@ -4651,22 +4658,25 @@ static id<MTLRenderPipelineState> pso_build_ex(MTLRenderPipelineDescriptor *d, N if (base) g_pb_reused++; else { uint64_t t0 = bp_now(); - for (id<MTL4Archive> a in g_arch4) if ((base = [a newRenderPipelineStateWithDescriptor:b error:nil])) break; + int vd = 0; for (int i = 0; i < 31 && !vd; i++) vd = bk.va[i][0] != 0; // a vertex layout (MTLVertexFormatInvalid is 0) + if (!vd) for (id<MTL4Archive> a in g_arch4p) if ((base = [a newRenderPipelineStateWithDescriptor:b error:nil])) break; + int from_run = 0; + if (!base) for (id<MTL4Archive> a in g_arch4) if ((base = [a newRenderPipelineStateWithDescriptor:b error:nil])) { from_run = 1; break; } uint64_t t1 = bp_now(); if (base) { g_pb_archived++; g_pt_hit_n++; g_pt_hit_ns += t1 - t0; } // the compile / flush lock only for what the serializer captures (a recapture or a compile): a compile 0 call that only looked in the archive must not wait for a flush - int recap = base && g_compact_opts && atomic_load(&g_warm_running), lk = recap || (!base && compile); + int recap = base && from_run && g_compact_opts && atomic_load(&g_warm_running), lk = recap || (!base && compile); if (lk) pthread_rwlock_rdlock(&g_arch_rw); if (recap) { // compaction (see g_compact_opts): taken again through the compiler, which captures it id<MTLRenderPipelineState> cb = [g_comp4 newRenderPipelineStateWithDescriptor:b compilerTaskOptions:g_compact_opts error:nil]; - if (cb) { base = cb; atomic_fetch_add(&g_arch_new, 1); g_compacted++; } + if (cb) { base = cb; atomic_fetch_add(&g_arch_new, 1); g_compacted++; if (vd) g_arch_new_vd++; } } if (!base) { - if (g_arch4.count) { g_pt_miss_n++; g_pt_miss_ns += t1 - t0; } + if (g_arch4.count + g_arch4p.count) { g_pt_miss_n++; g_pt_miss_ns += t1 - t0; } if (compile) { NSError *be = nil; base = [g_comp4 newRenderPipelineStateWithDescriptor:b compilerTaskOptions:nil error:&be]; job->error = be; job->compiled = 1; g_pt_comp_ns += bp_now() - t1; - if (base) { g_pb_built++; if (g_ser4) arch_note_new(); } + if (base) { g_pb_built++; if (vd) g_arch_new_vd++; if (g_ser4) arch_note_new(); } } } if (lk) pthread_rwlock_unlock(&g_arch_rw); @@ -4798,7 +4808,7 @@ static int pso_pend_try(const pso_key *k, id<MTLRenderPipelineState> *out) { // pair's pulling pipeline (<key>_bp, dmsh_pull.py: no vertex descriptor; the vertex streams are read through a per-draw layout block, pull_bind), specialized with the draw's colour // state, while the pipeline for its vertex layout is built in the background (pso_pend_demand); a later draw takes that one when it is ready (pso_pend_try). The pulling pipeline costs // vertex time (the run-time format decode: about 1 ms per million vertices on an M2 Max), so it only bridges those frames. Both compute the same positions: [[position, invariant]], -// built with preserved invariance, from bit-identical inputs (t_pull.m, t_pull_inv.m). Only a pulling base already made or in the archive is used; otherwise +// built with preserved invariance, from bit-identical inputs (t_pull.m, t_pull_inv.m). Only a pulling base already made or in the archive is used (the prebuild makes them); otherwise // the draw waits as before and the pulling base is built in the background for the pair's next miss. Not for merged passes, readable-tile or diagnostic fragments, layer-writing or // transform feedback vertex shaders. DM_PSO_HYBRID=0 turns it off static int hybrid_on(void) { @@ -4848,6 +4858,108 @@ void mtl_pso_line(char *o, size_t n) { memcpy(pn, g_pw_n, sizeof pn); memcpy(pns, g_pw_ns, sizeof pns); } +// ---- Prebuild: the base of every shader pair of the game, into the pipeline archive ---- +// For each pair in the profile's shader_pairs.tsv, the base a hybrid draw needs: the pulling vertex entry (<key>_bp; a vertex shader without stage inputs: its own entry), the pixel +// shader, no vertex descriptor, one sample, no alpha-to-coverage, the colour state unspecialized: the descriptor pso_desc_pull / pso_desc make at run time, so the archive gives it back +// there (the archive matches libraries by content). Bases already in the archive are skipped; what is built goes into the archive, flushed every 1,000 bases (the serializer holds +// what it captured until then). Runs once per chain version, depth mode and pair list (pso_archive/prebuilt.tsv): in the app after the prewarm, on a background queue at utility QoS +// (DM_PSO_PREBUILD=0: not at all), or as a tool on the Mac (DM_PSO_PREBUILD=tool: build, write, exit). Vertex shaders that write the layer, pairs whose vertex shader has stage +// inputs but no pulling library, and integer-output or multisampled bases are left to the draws +static _Atomic int g_pre_running; static _Atomic int g_pre_done, g_pre_built, g_pre_archived, g_pre_skipped, g_pre_failed; +static MTL4FunctionDescriptor *pre_fn(id<MTLLibrary> lib, NSString *name) { // as shader_load notes them (fn4_note): constants specialized with an empty set + id<MTLFunction> f = [lib newFunctionWithName:name]; if (!f) return nil; + MTL4LibraryFunctionDescriptor *ld = [MTL4LibraryFunctionDescriptor new]; ld.library = lib; ld.name = name; + if (!f.functionConstantsDictionary.count) return ld; + MTL4SpecializedFunctionDescriptor *sd = [MTL4SpecializedFunctionDescriptor new]; sd.functionDescriptor = ld; sd.constantValues = [MTLFunctionConstantValues new]; return sd; +} +static NSDictionary *pre_json(NSString *key) { NSData *d = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@/%@_b.json", g_msl_dir, key]]; return d ? [NSJSONSerialization JSONObjectWithData:d options:0 error:nil] : nil; } +static void pre_pair(NSString *vk, NSString *fk, int zero) { + @autoreleasepool { + NSDictionary *vj = pre_json(vk), *fj = pre_json(fk); + if (!vj || !fj || ![vj[@"chain"] isEqual:@DMSH_CHAIN] || ![fj[@"chain"] isEqual:@DMSH_CHAIN]) { g_pre_skipped++; return; } + NSString *ventry = zero && vj[@"entry_z"] ? vj[@"entry_z"] : vj[@"entry"], *fentry = fj[@"entry"] ?: @"main0"; + int pull = [vj[@"pull"] isKindOfClass:[NSDictionary class]]; + if (!pull && [vj[@"vertex_inputs"] count]) { g_pre_skipped++; return; } // stage inputs and no pulling library: its pipelines need the draw's layout + NSError *e = nil; + id<MTLLibrary> vl = lib_from_file([NSString stringWithFormat:@"%@/%@%@.metallib", g_msl_dir, vk, pull ? @"_bp" : @"_b"], &e); + if (!vl || t_lib_layer) { g_pre_skipped++; return; } // writes the layer: its pipelines take an input primitive class (pso_desc), no pulling pipeline + id<MTLLibrary> fl = lib_from_file([NSString stringWithFormat:@"%@/%@_b.metallib", g_msl_dir, fk], &e); + MTL4FunctionDescriptor *vf = pre_fn(vl, ventry), *ff = fl ? pre_fn(fl, fentry) : nil; + if (!vf || !ff) { g_pre_skipped++; return; } + MTL4RenderPipelineDescriptor *m = [MTL4RenderPipelineDescriptor new]; + m.vertexFunctionDescriptor = vf; m.fragmentFunctionDescriptor = ff; m.vertexDescriptor = [MTLVertexDescriptor vertexDescriptor]; m.rasterSampleCount = 1; + for (int i = 0; i < 8; i++) { MTL4RenderPipelineColorAttachmentDescriptor *a = m.colorAttachments[i]; + a.pixelFormat = MTLPixelFormatUnspecialized; a.writeMask = MTLColorWriteMaskUnspecialized; a.blendingState = MTL4BlendStateUnspecialized; + a.sourceRGBBlendFactor = a.destinationRGBBlendFactor = a.sourceAlphaBlendFactor = a.destinationAlphaBlendFactor = MTLBlendFactorUnspecialized; + a.rgbBlendOperation = a.alphaBlendOperation = MTLBlendOperationUnspecialized; } + for (id<MTL4Archive> a in g_arch4p) if ([a newRenderPipelineStateWithDescriptor:m error:nil]) { g_pre_archived++; return; } + for (id<MTL4Archive> a in g_arch4) if ([a newRenderPipelineStateWithDescriptor:m error:nil]) { g_pre_archived++; return; } + pthread_rwlock_rdlock(&g_arch_rw); id ps = [g_comp4 newRenderPipelineStateWithDescriptor:m compilerTaskOptions:nil error:&e]; pthread_rwlock_unlock(&g_arch_rw); + if (ps) { g_pre_built++; atomic_fetch_add(&g_arch_new, 1); } + else { if (g_pre_failed++ < 4) MLOG("[RED] pipeline prebuild: the base of %s + %s failed: %s", vk.UTF8String, fk.UTF8String, e.localizedDescription.UTF8String); } + } +} +// threads: workers; wait: run on the calling thread until done (the tool), else in the background. Returns the number of pairs, -1 when there is nothing to do +static int pso_prebuild(int threads, int wait, dispatch_qos_class_t qos) { + shmap_load(); pso4_init(); + if (!g_comp4 || !g_ser4 || !g_arch_dir || atomic_exchange(&g_pre_running, 1)) return -1; + // The pairs: shader_pairs.tsv (BNSH variations and the other readers' pairs) and pso_pairs.tsv (agl BAHS program variations, which vs_pad does not read; DM_PSO_PAIRS: another path), + // both beside the shader map + NSString *pp = [g_shmap_path.stringByDeletingLastPathComponent stringByAppendingPathComponent:@"shader_pairs.tsv"]; + const char *ev = getenv("DM_PSO_PAIRS"); + NSString *pp2 = ev && *ev ? @(ev) : [g_shmap_path.stringByDeletingLastPathComponent stringByAppendingPathComponent:@"pso_pairs.tsv"]; + NSString *txt = [NSString stringWithContentsOfFile:pp encoding:NSUTF8StringEncoding error:nil], *txt2 = [NSString stringWithContentsOfFile:pp2 encoding:NSUTF8StringEncoding error:nil]; + if (!txt) { MLOG("pipeline prebuild: no %s, nothing to build", pp.UTF8String); g_pre_running = 0; return -1; } + if (txt2) txt = [txt stringByAppendingString:txt2]; + int zero = atomic_load(&g_depth_zero); + NSString *stamp = [g_arch_dir stringByAppendingPathComponent:@"prebuilt.tsv"]; + NSString *want = [NSString stringWithFormat:@"chain\t%s\ndepth\t%s\npairs\t%lu\t%lx\n", DMSH_CHAIN, zero ? "near=0" : "near=-w", (unsigned long)txt.length, (unsigned long)txt.hash]; + if ([[NSString stringWithContentsOfFile:stamp encoding:NSUTF8StringEncoding error:nil] isEqualToString:want]) { g_pre_running = 0; return -1; } + NSMutableArray<NSArray<NSString *> *> *pairs = [NSMutableArray array]; + NSMutableSet<NSString *> *seen = [NSMutableSet set]; + for (NSString *l in [txt componentsSeparatedByString:@"\n"]) { if (!l.length || [l hasPrefix:@"#"] || [seen containsObject:l]) continue; [seen addObject:l]; NSArray *c = [l componentsSeparatedByString:@"\t"]; if (c.count >= 2) [pairs addObject:c]; } + int n = (int)pairs.count; uint64_t t0 = bp_now(); + MLOG("pipeline prebuild: %d shader pairs of %s%s%s, %d workers (%s)", n, pp.UTF8String, txt2 ? " and " : "", txt2 ? pp2.UTF8String : "", threads, wait ? "tool" : "background"); + __block _Atomic int next = 0; + dispatch_group_t g = dispatch_group_create(); + for (int t = 0; t < threads; t++) dispatch_group_async(g, dispatch_get_global_queue(qos, 0), ^{ + for (;;) { + int i = atomic_fetch_add(&next, 1); if (i >= n) break; + pre_pair(pairs[(NSUInteger)i][0], pairs[(NSUInteger)i][1], zero); + int d = ++g_pre_done; + if (d % 1000 == 0) { + MLOG("pipeline prebuild: %d of %d pairs, %d built, %d already archived, %d left to the draws, %d failed, %.0f s", d, n, (int)g_pre_built, (int)g_pre_archived, (int)g_pre_skipped, (int)g_pre_failed, (bp_now() - t0) / 1e9); + if (atomic_load(&g_arch_new) >= 1000) dispatch_sync(g_arch_q, ^{ arch_flush(); }); // the serializer holds what it captured until written + } + } + }); + dispatch_block_t done = ^{ + dispatch_sync(g_arch_q, ^{ arch_flush(); }); + if (!g_pre_failed) [want writeToFile:stamp atomically:YES encoding:NSUTF8StringEncoding error:nil]; + MLOG("pipeline prebuild done: %d pairs, %d bases built, %d already archived, %d left to the draws, %d failed, %.1f s", n, (int)g_pre_built, (int)g_pre_archived, (int)g_pre_skipped, (int)g_pre_failed, (bp_now() - t0) / 1e9); + g_pre_running = 0; + }; + if (wait) { dispatch_group_wait(g, DISPATCH_TIME_FOREVER); done(); } + else dispatch_group_notify(g, dispatch_get_global_queue(qos, 0), done); + return n; +} +// DM_PSO_PREBUILD=tool: the prebuild alone (the host's other environment as for a run: DM_NVN_SHMAP, DM_MSL_DIR, DM_SAVE or DM_PSO_ARCHIVE), then exit; DM_PSO_PREBUILD_DEPTH=zero for +// a game that sets the near=0 depth mode, DM_PSO_PREBUILD_THREADS=<n> workers (default: the performance cores less one). Returns 0 when not asked for +int mtl_pso_prebuild_tool(void) { + const char *e = getenv("DM_PSO_PREBUILD"); if (!e || strcmp(e, "tool")) return 0; + setenv("DM_PSO_MANIFEST", "off", 1); // no prewarm (loading the shader map starts it) + mtl_init(); const char *z = getenv("DM_PSO_PREBUILD_DEPTH"); if (z && !strcmp(z, "zero")) atomic_store(&g_depth_zero, 1); + int threads = getenv("DM_PSO_PREBUILD_THREADS") ? atoi(getenv("DM_PSO_PREBUILD_THREADS")) : 0; + if (threads <= 0) { int pc = 0; size_t sz = sizeof pc; if (sysctlbyname("hw.perflevel0.physicalcpu", &pc, &sz, NULL, 0) || pc <= 1) pc = 4; threads = pc - 1; } + if (pso_prebuild(threads, 1, QOS_CLASS_USER_INITIATED) < 0) MLOG("pipeline prebuild: nothing to do (no archive, no shader_pairs.tsv, or prebuilt.tsv says it is done)"); + return 1; +} +static void pso_prebuild_bg(void) { // after the prewarm, in the app + const char *e = getenv("DM_PSO_PREBUILD"); if (e && !strcmp(e, "0")) return; + if (!hybrid_on()) return; + int pc = 0; size_t sz = sizeof pc; if (sysctlbyname("hw.perflevel0.physicalcpu", &pc, &sz, NULL, 0) || pc <= 1) pc = 4; + pso_prebuild(pc > 4 ? pc / 2 : 2, 0, QOS_CLASS_UTILITY); +} static __unsafe_unretained id<MTLRenderPipelineState> pso_get_(NvProg *pr, MTLRenderPassDescriptor *unused); static id<MTLFunction> ms_fs_override(NvShader *fs); // DM_NVN_MAGSCAN (defined before draw) static int pf_int_kind(MTLPixelFormat f); @@ -5012,6 +5124,7 @@ static void warm_worker(NSArray<NSString *> *paths) { } atomic_store(&g_warm_running, 0); arch_flush_now(); // flush and finish compaction together, after the prewarm stops recapturing bases + @autoreleasepool { pso_prebuild_bg(); } // then, once, the bases every shader pair's hybrid draws need } // Wait for the background warm-up to finish (at most timeout_ms): returns how many milliseconds were actually waited, 0 if it is not running. On first install the system shader cache is fully cold; if warm-up is slower than the player entering a run, // pipelines not yet warmed are compiled on the spot on the submit thread = in-run stutter; the loading screen on entering a run blocks the player anyway, so let it load a little longer (called where hle_nvn.c presents). diff --git a/dm/gfx/tests/t_pso_archive.m b/dm/gfx/tests/t_pso_archive.m index e6162f4..32eb129 100644 --- a/dm/gfx/tests/t_pso_archive.m +++ b/dm/gfx/tests/t_pso_archive.m @@ -1,7 +1,8 @@ // Metal 4 pipelines (pso_build): one base per pipeline with its colour state unspecialized, made into pipelines by specialization, kept in the pipeline archive. // Checks: pipelines that differ only in colour state share one base; a specialized pipeline draws the same pixels as one built through the MTLDevice; a flushed archive -// file serves the base again without compiling; a function with no Metal 4 descriptor keeps the MTLDevice path; pso_key_norm drops what no pipeline depends on; compaction -// merges the files the prewarm took bases from into one despite a mid-prewarm flush; depth-only draws write depth; concurrent colour variants compile one base +// file serves the base again without compiling; a flush of bases without a vertex layout is a p<seq> file, where a base with a layout is not looked up; a function with no +// Metal 4 descriptor keeps the MTLDevice path; pso_key_norm drops what no pipeline depends on; compaction merges the files the prewarm took bases from into one despite a +// mid-prewarm flush; depth-only draws write depth; concurrent colour variants compile one base #include "../nvn/nvn_mtl.m" uint64_t g_t0_ns; int dm_guest_as_contains(uintptr_t address) { (void)address; return 0; } @@ -134,7 +135,8 @@ int main(void) { @autoreleasepool { mtl_init(); g_q = [g_dev newCommandQueue]; NSError *err = nil; NSString *src = @"#include <metal_stdlib>\nusing namespace metal;\nstruct V { float4 p [[position]]; };\nstruct I { float4 a [[attribute(0)]]; };\n" "vertex V vs(I in [[stage_in]], uint id [[vertex_id]]) { V o; float2 uv = float2((id << 1) & 2, id & 2); o.p = float4(uv * 2 - 1, 0, in.a.w); return o; }\n" - "struct O { float4 c0 [[color(0)]]; float4 c1 [[color(1)]]; };\nfragment O fs() { return { float4(0.5, 0.25, 1.0, 0.5), float4(0.2, 0.4, 0.6, 0.8) }; }\n"; + "struct O { float4 c0 [[color(0)]]; float4 c1 [[color(1)]]; };\nfragment O fs() { return { float4(0.5, 0.25, 1.0, 0.5), float4(0.2, 0.4, 0.6, 0.8) }; }\n" + "vertex V vs0(uint id [[vertex_id]]) { V o; float2 uv = float2((id << 1) & 2, id & 2); o.p = float4(uv * 2 - 1, 0, 1); return o; }\n"; g_lib = [g_dev newLibraryWithSource:src options:nil error:&err]; if (!g_lib) { fprintf(stderr, "%s\n", err.localizedDescription.UTF8String); return 1; } g_lib2 = [g_dev newLibraryWithSource:[src stringByAppendingString:@"// another library: the same source would come back as the same library\n"] options:nil error:&err]; @@ -158,10 +160,27 @@ int main(void) { @autoreleasepool { same_pixels("from the archive: RGBA8 blended, RGBA16F", MTLPixelFormatRGBA8Unorm, 1, MTLPixelFormatRGBA16Float, MTLColorWriteMaskAll); EXPECT("base from the archive", 1, g_pb_archived); EXPECT("no base compiled", built, g_pb_built); + // a flush whose bases all read their vertices themselves (no vertex layout) is a p<seq> file; a base with a layout is never looked up in one + MTLRenderPipelineDescriptor *nd = desc(MTLPixelFormatRGBA8Unorm, 0, MTLPixelFormatRGBA8Unorm, MTLColorWriteMaskAll, 1); + nd.vertexFunction = fn4_note([g_lib newFunctionWithName:@"vs0"], g_lib, @"vs0", nil); nd.vertexDescriptor = [MTLVertexDescriptor vertexDescriptor]; + EXPECT("no layout: a pipeline", 1, pso_build(nd, &err) != nil); + EXPECT("no layout: its base compiled", built + 1, g_pb_built); + arch_flush(); + NSString *pfile = [@(dir) stringByAppendingPathComponent:@"p00001.mtl4a"]; + EXPECT("no layout: written to a p file", 1, [NSFileManager.defaultManager fileExistsAtPath:pfile]); + nvn_hm_clear(&g_pbase, hm_rel); + id<MTL4Archive> pa = [g_dev newArchiveWithURL:[NSURL fileURLWithPath:pfile] error:&err], va = [g_dev newArchiveWithURL:[NSURL fileURLWithPath:file] error:&err]; + g_arch4 = @[]; g_arch4p = @[pa, va]; // the layout base's file among the p files: not looked in + uint64_t arch0 = g_pb_archived; built = g_pb_built; + EXPECT("no layout again: a pipeline", 1, pso_build(nd, &err) != nil); + EXPECT("no layout again: base from the p file", arch0 + 1, g_pb_archived); + same_pixels("layout base with only p files open", MTLPixelFormatRGBA8Unorm, 1, MTLPixelFormatRGBA16Float, MTLColorWriteMaskAll); + EXPECT("layout base: not taken from a p file, compiled", built + 1, g_pb_built); + EXPECT("layout base: one waits for a plain file", 1, g_arch_new_vd); // compaction: with more than PSO_ARCH_COMPACT files, the bases the prewarm takes from them are captured again; after the flush that follows, one file holds them and the old ones are gone { char cdir[] = "/tmp/t_pso_compact.XXXXXX"; if (!mkdtemp(cdir)) abort(); - NSString *saved = g_arch_dir; g_arch_dir = @(cdir); nvn_hm_clear(&g_pbase, hm_rel); g_arch4 = @[]; + NSString *saved = g_arch_dir; g_arch_dir = @(cdir); nvn_hm_clear(&g_pbase, hm_rel); g_arch4 = @[]; g_arch4p = @[]; NSMutableArray<MTLRenderPipelineDescriptor *> *descs = [NSMutableArray array]; for (int i = 0; i <= PSO_ARCH_COMPACT; i++) { // one base per file: the stride of the layout tells them apart MTLRenderPipelineDescriptor *cd = desc(MTLPixelFormatRGBA8Unorm, 0, MTLPixelFormatRGBA8Unorm, MTLColorWriteMaskAll, 1); diff --git a/dm/gfx/tools/shader_split.py b/dm/gfx/tools/shader_split.py index 48699fd..030b7b1 100644 --- a/dm/gfx/tools/shader_split.py +++ b/dm/gfx/tools/shader_split.py @@ -41,7 +41,7 @@ # (SecredUber's 16600 stage shaders have only 3079 distinct control sections, with 6367 cases of same control, different code), so hashing the control alone picks the wrong library. # Output: <package dir>/<stage>_<source group>.bin, each record = 'BTCDBTCD' + header (+0x28 control length, +0x2c code length) padded to 0x38 + code area + control section, one copy per key; # map rows have the same columns as D2R's shader_map.tsv (column 5 records where the key first appeared); the answer table has one row per compute shader {"local", "shared"} (shared memory rounded up to 16 bytes, as D2R did). -# Usage: shader_split.py <RomFS dir> <ExeFS main> <output package dir> <output map> <output answer table> [<output pair table>] (decompressing main needs lz4: run with dm's venv python) Environment J=concurrency (default 8) +# Usage: shader_split.py <RomFS dir> <ExeFS main> <output package dir> <output map> <output answer table> [<output pair table> [<output pipeline pair table (pso_pairs.tsv)>]] (decompressing main needs lz4: run with dm's venv python) Environment J=concurrency (default 8) # With an update: give RomFS and main as comma-separated lists (base game first, e.g. data/v0/RomFS,data/v327680/RomFS); the output is the union of both versions (see main()) # Unity type trees need Unity's common string table, which is taken from the first main # Pair table: (vertex key, pixel key) of every BNSH variation (every Unity program); dmsh_build uses it to give vertex shaders the outputs their pixel shaders read but they do not write (see dmsh_build.py vs_pad) @@ -131,8 +131,46 @@ def bahs_shaders(d, label): st = 'cs' if code[:4] == CS_MAGIC else sph_stage(code) if code[:4] == GFX_MAGIC else None if not st or check(label, st, ctl, code): continue out.append((f'{label}#BAHS@{a:#x}', st, ctl, code)) + bahs_variations(d, label, [o[0] for o in out]) return out +BAHS_VAR = {} # BAHS entry label → the program variation it belongs to (bahs_variations; var_pairs pairs by it) +def bahs_variations(d, label, entries): + """The variations of an agl BAHS file's programs, for var_pairs. The table area holds a binary array (u32 byte size, u32 count, then per binary a record: u32 record size, u32 kind + (0 vertex, 1 fragment, 3 compute), two u32, the 16-byte entry bahs_shaders reads) and right after it a program array (u32 byte size, u32 count, then per program: u32 record size, + u32 name length, u32 stage mask, u32 index of its first binary, its name, its macros). A program's binaries run from its first index to the next program's; the n-th vertex binary + and the n-th fragment binary in that range are one variation. Breath of the Wild: 109 of the 543 pairs drawn on a cold start in Zora's Domain came from these files, and none was in + shader_pairs.tsv, which paired only BNSH variations. A file whose arrays do not read back (another layout, or an entry bahs_shaders took that no record holds) gives no pairs""" + if not entries: return + taken = {int(e.rsplit('@', 1)[1], 16) for e in entries} + arr = min(taken) - 0x18 + if arr < 0x20: return + asz, acnt = struct.unpack_from('<II', d, arr) + if arr + asz + 8 > len(d) or acnt < len(taken): return + o, recs = arr + 8, [] + for _ in range(acnt): + if o + 0x20 > arr + asz: return + rs, kind = struct.unpack_from('<II', d, o) + if rs < 0x20: return + recs.append((o + 0x10, kind)); o += rs + if o != arr + asz or not taken <= {a for a, _ in recs}: return + psz, pcnt = struct.unpack_from('<II', d, o) + if o + psz > len(d) or not pcnt: return + q, bases = o + 8, [] + for _ in range(pcnt): + rs, _nl, _mask, base = struct.unpack_from('<IIII', d, q) + if rs < 16 or base > acnt or (bases and base < bases[-1]): return + bases.append(base); q += rs + if q != o + psz: return + bases.append(acnt) + for p in range(pcnt): + seen = [0, 0] + for i in range(bases[p], bases[p + 1]): + a, k = recs[i] + if k > 1: continue # compute and the other kinds pair with nothing + if a in taken: BAHS_VAR[f'{label}#BAHS@{a:#x}'] = f'{label}#BAHS#prog{p}#var{seen[k]}' + seen[k] += 1 + def mshd_shaders(d, label): out, c = [], d.find(CTL_MAGIC) while c >= 0: @@ -1611,11 +1649,13 @@ def ue_shaders(d, label): return out def var_pairs(found): - """(vertex key, pixel key) within the same BNSH variation""" + """(vertex key, pixel key) within the same BNSH variation; (vertex key, pixel key, 'prog') within the same BAHS program variation (bahs_variations), which go to the pipeline + pair table only (main: shader_pairs.tsv, which vs_pad reads, keeps the BNSH pairs)""" var = collections.defaultdict(dict) for where, st, ctl, code in found: - if '#var' in where: var[where][st] = skey(ctl, code) - return {(v['vs'], v['ps']) for v in var.values() if 'vs' in v and 'ps' in v} + g = where if '#var' in where else BAHS_VAR.get(where) + if g: var[g][st] = skey(ctl, code) + return {(v['vs'], v['ps']) + (('prog',) if '#BAHS#prog' in g else ()) for g, v in var.items() if 'vs' in v and 'ps' in v} def scan_file(args): """→ (relative path, {key: …}, pairs, extra); extra = this file's Unity type trees, or 'defer' (no type tree, scanned again in the second pass)""" @@ -1711,6 +1751,7 @@ def nso_image(path): def main(): romfs_l, main_l, pkg, mapout, factsout = sys.argv[1:6] pairsout = sys.argv[6] if len(sys.argv) > 6 else None + psopairsout = sys.argv[7] if len(sys.argv) > 7 else None # pso_pairs.tsv: the pairs the pipeline prebuild takes besides shader_pairs.tsv (the BAHS program variations) # Several versions (base game + update): the RomFS and main arguments are comma-separated and paired one to one; the output is their union (keys are content hashes, shaders shared by versions appear once). # The first version's source column is unchanged; later versions are prefixed with their workspace directory name (e.g. v327680): /v327680/Shader/…, main@v327680. They sort after the first version, so existing rows keep their package indices. romfs_v, main_v = romfs_l.split(','), main_l.split(',') @@ -1779,6 +1820,7 @@ def main(): if not same_shader(keys[key][2:4], v[2:4]): red(f'key {key} is the same but the control section or code area differs ({v[0]} / {keys[key][0]})') continue keys[key] = v; per_src[group(v[0])] += 1 + prog = {(a, b) for a, b, *t in pairs if t} - pairs; pairs = {x for x in pairs if len(x) == 2} sp, cover = separable_pairs(keys); pairs |= sp if cover: print(f'single-stage programs: {len({v for v, _ in sp}):,} vertex shaders are paired with a cover of {len(cover)} pixel shader(s) ({" ".join(cover)})') os.makedirs(pkg, exist_ok=True) @@ -1820,6 +1862,10 @@ def main(): with open(pairsout, 'w') as f: f.write('# kind: evidence vertex / pixel shader pairs within BNSH variations (generated by dm/gfx/tools/shader_split.py, do not edit): vertex key <TAB> pixel key\n') for a, b in sorted(pairs): f.write(f'{a}\t{b}\n') + if psopairsout: + with open(psopairsout, 'w') as f: + f.write('# kind: evidence vertex / pixel shader pairs of agl program variations (BAHS) that shader_pairs.tsv does not hold, for the pipeline prebuild only (generated by dm/gfx/tools/shader_split.py, do not edit): vertex key <TAB> pixel key\n') + for a, b in sorted(prog - pairs): f.write(f'{a}\t{b}\n') print(f'shaders: {len(rows)} (' + ', '.join(f'{STAGE_NAME[s]} {n}' for s, n in sorted(stat.items())) + '); sources ' + ', '.join(f'{g} {n}' for g, n in per_src.most_common()) + f'; compute shader answers {len(facts)} rows' + (f'; variation pairs {len(pairs)}' if pairsout else '')) if __name__ == '__main__': main() diff --git a/dm/host/main.c b/dm/host/main.c index 25e87e3..33d7d98 100644 --- a/dm/host/main.c +++ b/dm/host/main.c @@ -122,6 +122,7 @@ void dm_host_preload_start(int argc, char **argv) { if (pthread_create(&g_pre.th, &a, preload_thread, NULL)) die("dm_host_preload_start: cannot start the thread"); } int main(int argc, char **argv) { + { int mtl_pso_prebuild_tool(void); if (mtl_pso_prebuild_tool()) return 0; } // DM_PSO_PREBUILD=tool: the pipeline archive's prebuild alone, no game (nvn_mtl.m) if (getenv("DM_PRELOAD")) dm_host_preload_start(argc, argv); // Exercise the early-start path on Mac (on iOS it is called from the App's main()) if (atomic_load(&g_pre.started)) { pthread_join(g_pre.th, NULL); diff --git a/docs/development.md b/docs/development.md index 3e910dd..550b63c 100644 --- a/docs/development.md +++ b/docs/development.md @@ -226,7 +226,7 @@ The unsigned IPA build still uses the repository's `dm/ios/DmIOS.xcodeproj`, ski Each game has a profile in `dm/games/<id>/`: - `game.tsv` holds the title ID, known builds, code modules, RomFS marker, memory split, app name and bundle ID; -- the shader tables: `shader_map.tsv`, `shader_facts.tsv`, `shader_pairs.tsv`, `pso_manifest.tsv`, and `c1_full.tsv` / `cb_extent.tsv`, which each checkout's full shader build makes (not committed); +- the shader tables: `shader_map.tsv`, `shader_facts.tsv`, `shader_pairs.tsv`, `pso_pairs.tsv` (pairs only the pipeline prebuild reads), `pso_manifest.tsv`, and `c1_full.tsv` / `cb_extent.tsv`, which each checkout's full shader build makes (not committed); - `patches.py` (when there are any): the rewriter's patches of the game's own builds. The shader translation chain has one version for every game, in `dm/gfx/nvn/dmsh_chain.h`. @@ -332,6 +332,12 @@ flowchart TD Every 300 frames the log has a `pipelines up to frame` line. It gives the submit thread's pipeline, library and prediction time; archive lookups that found the base or none; specializations and base compiles on all threads; draws with a hybrid pipeline; background builds; and the draws that waited, by why no stand-in served them. `DM_PSO_WAITLOG=1` logs every wait over 20 ms with its shader pair. `DM_PSO_PULL_ALL=1` (diagnostic) draws every draw that has a pulling pipeline with it. In steady state the GPU time is the same with and without the hybrid: in Breath of the Wild, mean GPU p50 over frames 2,400–5,100 was 8.98 ms with it, 8.98 ms on the Metal 4 path without it, and 9.35 ms through the `MTLDevice`. +The **prebuild** puts the pulling base of every known shader pair into the archive (`pso_prebuild`), so a cold start's draws have stand-ins. The pairs come from the profile's `shader_pairs.tsv` and `pso_pairs.tsv`. `shader_pairs.tsv` pairs the stages of one BNSH variation (and the other readers' programs). It held none of the pairs from agl's BAHS shader archives (`.sharcb`, the agl / gsys / terrain resource packs), and in Breath of the Wild 109 of the 543 pairs drawn on entering Zora's Domain came from those. `shader_split.py` now reads the binary and program arrays of a BAHS file (`bahs_variations`) and pairs the n-th vertex binary of a program with its n-th fragment binary. Those pairs go to `pso_pairs.tsv`, which only the prebuild reads. `vs_pad` keeps reading `shader_pairs.tsv`, so the shader libraries, the inputs digest and the other profiles' tables are unchanged. For Breath of the Wild that is 3,012 more pairs, and all 543 pairs drawn are now known. A profile made before the table existed still packs: the NSP script then keeps the table beside the shader package and hands it to the prebuild (`DM_PSO_PAIRS`). Super Mario Odyssey, Mario Bros. Wonder, Mario Kart 8 Deluxe, 3D World, Animal Crossing, Captain Toad and Tears of the Kingdom have BAHS files too; their tables are made at their next pack. + +The prebuild runs in the app after the prewarm, on a utility queue on half the performance cores, flushing every 1,000 bases (`DM_PSO_PREBUILD=0` turns it off). On the Mac it also runs as a tool, `DM_PSO_PREBUILD=tool`: build, write, exit. The NSP script runs the tool in a `--platform mac` build, into `<id>_build/run/pso_archive` (log `pso_prebuild.log`). It runs once per chain version, depth mode and pair list (`pso_archive/prebuilt.tsv`). `DM_PSO_PREBUILD_DEPTH=zero` serves a game that sets the near=0 depth mode; `DM_PSO_PREBUILD_THREADS=<n>` sets the workers. Its files hold bases without a vertex layout only, and are named `pNNNNN.mtl4a`; a base with a vertex layout is never looked up in them, and compaction leaves them alone. Breath of the Wild on an M2 Max: 15,767 bases, 910 MB in 16 files, 187 s with 7 workers for the first 12,755 and 19 s for the 3,012 more. Opening the files took 2.2 s on the first start (0.25 s from the file cache). The host's footprint is about 850 MB larger with them open (2,067 against 1,215 MiB at the title), which is one reason the Metal 4 path stays off on iOS. iOS archives cannot be made offline either: `metal-tt` rejects the pipeline script the Metal 4 serializer writes (format 0.1: "expecting [ instead got {"). On iOS this is a later step. + +Breath of the Wild's cold starts with and without the prebuild and `pso_pairs.tsv`: [its note](../dm/games/01007EF00011E000/README.md#pipelines-on-a-cold-start). + ## Power The game's own work and its frame rate stay as they are; the host avoids work of its own that the Switch never did. Every 300 frames the log has a `power` line (CPU energy in watts and per frame, CPU time, wakeups, thermal state, the threads that yield most) and a `residency set` line; [05](agents/05-debugging.md) explains them. diff --git a/scripts/build_ipa_from_nsp.py b/scripts/build_ipa_from_nsp.py index 4634f0e..d549fe0 100755 --- a/scripts/build_ipa_from_nsp.py +++ b/scripts/build_ipa_from_nsp.py @@ -676,7 +676,7 @@ def write_profile(pdir, app, f): # ---- Derived profile (a version the game's profile was not brought up on) ---- -DERIVED_SKIP = {'game.tsv', 'shader_map.tsv', 'shader_facts.tsv', 'shader_pairs.tsv', 'c1_full.tsv', 'cb_extent.tsv', 'vk_capture.tsv', 'gl_capture.tsv', 'patches.py'} # made again from the packed version's own files (patches.py: the rewriter's patches of the registered builds) +DERIVED_SKIP = {'game.tsv', 'shader_map.tsv', 'shader_facts.tsv', 'shader_pairs.tsv', 'pso_pairs.tsv', 'c1_full.tsv', 'cb_extent.tsv', 'vk_capture.tsv', 'gl_capture.tsv', 'patches.py'} # made again from the packed version's own files (patches.py: the rewriter's patches of the registered builds) def derive_profile(g, pdir, ver, d, mods, app=None): @@ -1294,10 +1294,15 @@ def split_shaders(py, repo, roms, mains, pkg, env, logs, g, provisional=False, o PROG.set(step='building the Mac host for the game\'s Oodle decoder'); env = dict(env, **oodle()) PROG.set(step='splitting') tmp = pkg.with_name(pkg.name + '.partial'); rmtree(tmp); (tmp / 'tables').mkdir(parents=True) - run([py, repo / 'dm/gfx/tools/shader_split.py', ','.join(map(str, roms)), ','.join(map(str, mains)), tmp / 'pkg'] + [tmp / 'tables' / n for n in names], logs / 'shader_split.log', env=env) + run([py, repo / 'dm/gfx/tools/shader_split.py', ','.join(map(str, roms)), ','.join(map(str, mains)), tmp / 'pkg'] + [tmp / 'tables' / n for n in names + ('pso_pairs.tsv',)], + logs / 'shader_split.log', env=env) m = re.search(r'shaders: (\d+) \(', (logs / 'shader_split.log').read_text(errors='replace')) if m and m.group(1) == '0': # dmsh_build.py would make no library, and the iOS shader step stop with no word of why raise BuildError('the shader split found no shaders in main or the RomFS: the game keeps them in a form shader_split.py does not read; locate them (docs/agents) and add a reader') + # pso_pairs.tsv (the pairs of agl BAHS program variations, which only the pipeline prebuild reads): checked like the others where the profile has one; else kept beside the + # package (pso_pairs_path), so a profile made before the table existed still packs and its prebuild still gets the pairs + if provisional or g.table('pso_pairs.tsv').is_file(): names += ('pso_pairs.tsv',) + else: shutil.copyfile(tmp / 'tables' / 'pso_pairs.tsv', pkg.with_name('pso_pairs.tsv')) if provisional: # a provisional profile takes the tables as they come for n in names: shutil.copyfile(tmp / 'tables' / n, g.table(n)) else: @@ -1526,7 +1531,7 @@ def mac_host(py, repo, work, env, logs, g): return host, font -def mac_run(work, game, patched, host, font, msl, aoc, gfx, lang, g, env_file=''): +def mac_run(work, game, patched, host, font, msl, aoc, gfx, lang, env, logs, g, env_file=''): """The command that runs the game in a window with sound after a Mac-only build (PLATFORM 'mac'; docs/development.md, Build by hand (Mac), step 5): its save and temporary storage in <id>_build/run (kept from run to run), the extracted RomFS, the Mac shader libraries (msl), the DLC, the profile's shader map (a host outside dm/host does not find it beside itself; c1_full.tsv and cb_extent.tsv are read beside it), the game language, and the switches of an environment file (DM_ENV_FILE / --env-file)""" @@ -1537,6 +1542,15 @@ def mac_run(work, game, patched, host, font, msl, aoc, gfx, lang, g, env_file='' if gfx == 'nvn': renv['DM_NVN_SHMAP'] = g.table('shader_map.tsv') renv.update(DM_LANG=lang, DM_WINDOW=1, DM_AUDIO=1) if env_file: renv.update(env_file_pairs(env_file)) + if gfx == 'nvn' and g.table('shader_pairs.tsv').is_file(): + if not g.table('pso_pairs.tsv').is_file() and (work / 'shader/pso_pairs.tsv').is_file(): renv['DM_PSO_PAIRS'] = work / 'shader/pso_pairs.tsv' # split_shaders' copy + # The pipeline prebuild (docs/development.md, Hybrid pipelines): the pulling base of every shader pair into run/pso_archive, so the first run's draws have stand-ins instead + # of waiting for the Metal compiler. The host's tool mode skips it when pso_archive/prebuilt.tsv matches (chain version, depth mode, pair list): Breath of the Wild's + # 12,755 pairs took about 3 minutes on an M2 Max the first time. It assumes the GL depth mode; a game that sets near=0 builds its bases again in the background in the app + PROG.add(1); PROG.stage('Pipeline prebuild', step='building') + penv = dict(env, **{k: str(v) for k, v in renv.items()}, DM_PSO_PREBUILD='tool') + run([host], logs / 'pso_prebuild.log', env=penv, cwd=rd) + PROG.end() q = lambda v: shlex.quote(str(v)) return f'cd {q(rd)} && ' + ' '.join(f'{k}={q(v)}' for k, v in renv.items()) + f' {q(host)} {q(patched)}' @@ -1819,7 +1833,7 @@ def main(args=None): return if mac: # a Mac-only build ends with the Mac host and the command that runs the game host, font = mac_host(py, repo, work, env, logs, g) - cmd = mac_run(work, game, patched, host, font, ios, aoc, gfx, lang, g, args.env_file or DM_ENV_FILE) + cmd = mac_run(work, game, patched, host, font, ios, aoc, gfx, lang, env, logs, g, args.env_file or DM_ENV_FILE) rmtree(work / 'tmp') say(f'done: the game runs on the Mac with this command (its save in {work / "run/save"}, kept from run to run; DM_WINDOW=1 opens a window, DM_AUDIO=1 plays sound):') PROG.say(cmd)