From a1ebc651ab830a381e8960029145b557990342d6 Mon Sep 17 00:00:00 2001 From: xuwx1 <2530900445@qq.com> Date: Thu, 11 Dec 2025 13:57:18 +0800 Subject: [PATCH] updata lightx2v --- .gitignore | 30 + .pre-commit-config.yaml | 22 + LICENSE | 201 + README.md | 295 +- app/README.md | 13 + app/gradio_demo.py | 1442 +++ app/gradio_demo_zh.py | 1442 +++ app/run_gradio.sh | 181 + app/run_gradio_win.bat | 196 + assets/figs/offload/fig1_en.png | Bin 0 -> 28359 bytes assets/figs/offload/fig1_zh.png | Bin 0 -> 32161 bytes assets/figs/offload/fig2_en.png | Bin 0 -> 21698 bytes assets/figs/offload/fig2_zh.png | Bin 0 -> 23017 bytes assets/figs/offload/fig3_en.png | Bin 0 -> 25025 bytes assets/figs/offload/fig3_zh.png | Bin 0 -> 25706 bytes assets/figs/offload/fig4_en.png | Bin 0 -> 46194 bytes assets/figs/offload/fig4_zh.png | Bin 0 -> 44789 bytes assets/figs/offload/fig5_en.png | Bin 0 -> 28465 bytes assets/figs/offload/fig5_zh.png | Bin 0 -> 53596 bytes assets/figs/portabl_windows/pic1.png | Bin 0 -> 377591 bytes assets/figs/portabl_windows/pic_gradio_en.png | Bin 0 -> 290512 bytes assets/figs/portabl_windows/pic_gradio_zh.png | Bin 0 -> 265559 bytes assets/figs/step_distill/fig_01.png | Bin 0 -> 370168 bytes assets/img_lightx2v.png | Bin 0 -> 1055022 bytes assets/inputs/audio/multi_person/config.json | 12 + .../multi_person/config_multi_template.json | 12 + .../multi_person/config_single_template.json | 8 + assets/inputs/audio/multi_person/p1.mp3 | Bin 0 -> 621967 bytes assets/inputs/audio/multi_person/p1_mask.png | Bin 0 -> 3854 bytes assets/inputs/audio/multi_person/p2.mp3 | Bin 0 -> 621967 bytes assets/inputs/audio/multi_person/p2_mask.png | Bin 0 -> 3856 bytes .../inputs/audio/multi_person/seko_input.png | Bin 0 -> 583852 bytes assets/inputs/audio/seko_input.mp3 | Bin 0 -> 361787 bytes assets/inputs/audio/seko_input.png | Bin 0 -> 504390 bytes .../imgs/flf2v_input_first_frame-fs8.png | Bin 0 -> 469575 bytes .../imgs/flf2v_input_last_frame-fs8.png | Bin 0 -> 409871 bytes assets/inputs/imgs/girl.png | Bin 0 -> 248908 bytes assets/inputs/imgs/img_0.jpg | Bin 0 -> 250628 bytes assets/inputs/imgs/img_1.jpg | Bin 0 -> 410321 bytes assets/inputs/imgs/img_2.jpg | Bin 0 -> 36300 bytes assets/inputs/imgs/snake.png | Bin 0 -> 445894 bytes configs/attentions/wan_i2v_flash.json | 13 + configs/attentions/wan_i2v_nbhd_480p.json | 17 + configs/attentions/wan_i2v_nbhd_720p.json | 17 + configs/attentions/wan_i2v_radial.json | 13 + configs/attentions/wan_i2v_sage.json | 13 + configs/attentions/wan_i2v_svg.json | 13 + configs/attentions/wan_i2v_svg2.json | 13 + configs/attentions/wan_t2v_sparge.json | 16 + configs/bench/lightx2v_1.json | 13 + configs/bench/lightx2v_2.json | 13 + configs/bench/lightx2v_3.json | 16 + configs/bench/lightx2v_3_distill.json | 22 + configs/bench/lightx2v_4.json | 35 + configs/bench/lightx2v_5.json | 19 + configs/bench/lightx2v_5_distill.json | 25 + configs/bench/lightx2v_6.json | 19 + configs/bench/lightx2v_6_distill.json | 25 + configs/caching/adacache/wan_i2v_ada.json | 15 + configs/caching/adacache/wan_t2v_ada.json | 15 + .../caching/custom/wan_i2v_custom_480p.json | 21 + .../caching/custom/wan_i2v_custom_720p.json | 32 + .../caching/custom/wan_t2v_custom_14b.json | 33 + .../caching/custom/wan_t2v_custom_1_3b.json | 33 + configs/caching/dualblock/wan_t2v_1_3b.json | 17 + .../caching/dynamicblock/wan_t2v_1_3b.json | 17 + configs/caching/firstblock/wan_t2v_1_3b.json | 17 + .../wan_i2v_dist_cfg_ulysses_mag_480p.json | 109 + .../caching/magcache/wan_i2v_mag_480p.json | 104 + .../wan_i2v_mag_calibration_480p.json | 104 + .../wan_t2v_dist_cfg_ulysses_mag_1_3b.json | 130 + .../caching/magcache/wan_t2v_mag_1_3b.json | 125 + .../wan_t2v_mag_calibration_1_3b.json | 125 + .../taylorseer/wan_t2v_taylorseer.json | 15 + .../caching/teacache/wan_i2v_tea_480p.json | 32 + .../caching/teacache/wan_i2v_tea_720p.json | 32 + .../teacache/wan_t2v_1_3b_tea_480p.json | 33 + .../caching/teacache/wan_ti2v_tea_720p.json | 25 + configs/causvid/wan_i2v_causvid.json | 29 + configs/causvid/wan_t2v_causvid.json | 29 + configs/changing_resolution/wan_i2v.json | 20 + configs/changing_resolution/wan_i2v_U.json | 22 + configs/changing_resolution/wan_t2v.json | 21 + configs/changing_resolution/wan_t2v_U.json | 23 + .../wan_t2v_U_teacache.json | 42 + configs/deploy/wan_i2v.json | 30 + configs/deploy/wan_t2v.json | 31 + configs/dist_infer/wan22_moe_i2v_cfg.json | 25 + .../dist_infer/wan22_moe_i2v_cfg_ulysses.json | 25 + configs/dist_infer/wan22_moe_i2v_ulysses.json | 26 + configs/dist_infer/wan22_moe_t2v_cfg.json | 24 + .../dist_infer/wan22_moe_t2v_cfg_ulysses.json | 26 + configs/dist_infer/wan22_moe_t2v_ulysses.json | 25 + configs/dist_infer/wan22_ti2v_i2v_cfg.json | 25 + .../wan22_ti2v_i2v_cfg_ulysses.json | 27 + .../dist_infer/wan22_ti2v_i2v_ulysses.json | 26 + configs/dist_infer/wan22_ti2v_t2v_cfg.json | 24 + .../wan22_ti2v_t2v_cfg_ulysses.json | 26 + .../dist_infer/wan22_ti2v_t2v_ulysses.json | 25 + .../dist_infer/wan_i2v_dist_cfg_ulysses.json | 18 + configs/dist_infer/wan_i2v_dist_ring.json | 17 + configs/dist_infer/wan_i2v_dist_ulysses.json | 17 + configs/dist_infer/wan_t2v_dist_cfg.json | 17 + configs/dist_infer/wan_t2v_dist_cfg_ring.json | 19 + .../dist_infer/wan_t2v_dist_cfg_ulysses.json | 19 + configs/dist_infer/wan_t2v_dist_ring.json | 18 + configs/dist_infer/wan_t2v_dist_ulysses.json | 18 + .../distill/wan_i2v_distill_4step_cfg.json | 19 + .../wan_i2v_distill_4step_cfg_4090.json | 29 + .../wan_i2v_distill_4step_cfg_4090_lora.json | 35 + .../wan_i2v_distill_4step_cfg_lora.json | 20 + .../distill/wan_t2v_distill_4step_cfg.json | 20 + .../wan_t2v_distill_4step_cfg_4090.json | 30 + .../wan_t2v_distill_4step_cfg_dynamic.json | 22 + .../wan_t2v_distill_4step_cfg_lora.json | 21 + .../wan_t2v_distill_4step_cfg_lora_4090.json | 36 + .../4090/hy15_t2v_480p_bf16.json | 18 + .../4090/hy15_t2v_480p_bf16_dist.json | 16 + .../4090/hy15_t2v_480p_fp8.json | 24 + .../5090/hy15_t2v_480p_bf16.json | 18 + .../5090/hy15_t2v_480p_bf16_dist.json | 22 + .../5090/hy15_t2v_480p_fp8.json | 19 + .../cache/hy_15_i2v_480p_magcache.json | 17 + .../hy_15_i2v_480p_magcache_calibration.json | 13 + .../cache/hy_15_i2v_480p_teacache.json | 20 + .../cache/hy_15_i2v_720p_teacache.json | 20 + .../cache/hy_15_t2v_480p_teacache.json | 20 + .../cache/hy_15_t2v_720p_teacache.json | 20 + ...5_i2v_480p_int8_offload_dist_fp8_comm.json | 23 + .../hunyuan_video_i2v_480p.json | 11 + .../hunyuan_video_i2v_720p.json | 11 + .../hunyuan_video_i2v_720p_cfg_distilled.json | 11 + .../hunyuan_video_t2v_480p.json | 12 + .../hunyuan_video_t2v_480p_distill.json | 19 + .../hunyuan_video_t2v_720p.json | 12 + .../lightae/hy15_t2v_480p_bf16.json | 14 + .../offload/hy15_t2v_480p_bf16.json | 18 + .../quant/hy15_t2v_480p_fp8.json | 15 + .../hunyuan_video_15/vsr/hy15_i2v_480p.json | 19 + .../matrix_game2/matrix_game2_gta_drive.json | 72 + .../matrix_game2_gta_drive_streaming.json | 72 + .../matrix_game2/matrix_game2_templerun.json | 65 + .../matrix_game2_templerun_streaming.json | 72 + .../matrix_game2/matrix_game2_universal.json | 72 + .../matrix_game2_universal_streaming.json | 72 + configs/model_pipeline.json | 179 + .../block/qwen_image_i2i_2509_block.json | 66 + .../offload/block/qwen_image_i2i_block.json | 66 + .../offload/block/qwen_image_t2i_block.json | 86 + configs/offload/block/wan_i2v_block.json | 23 + configs/offload/block/wan_t2v_1_3b.json | 17 + configs/offload/block/wan_t2v_block.json | 24 + .../disk/wan_i2v_phase_lazy_load_480p.json | 28 + .../disk/wan_i2v_phase_lazy_load_720p.json | 30 + configs/offload/phase/wan_i2v_phase.json | 24 + configs/offload/phase/wan_t2v_phase.json | 25 + configs/quantization/gguf/wan_i2v_q4_k.json | 16 + configs/quantization/wan_i2v.json | 16 + configs/quantization/wan_i2v_q8f.json | 19 + configs/quantization/wan_i2v_torchao.json | 19 + configs/qwen_image/qwen_image_i2i.json | 64 + configs/qwen_image/qwen_image_i2i_2509.json | 64 + .../qwen_image/qwen_image_i2i_2509_quant.json | 67 + configs/qwen_image/qwen_image_i2i_lora.json | 70 + configs/qwen_image/qwen_image_t2i.json | 85 + .../seko_talk/5090/seko_talk_5090_bf16.json | 23 + .../seko_talk/5090/seko_talk_5090_int8.json | 29 + .../5090/seko_talk_5090_int8_8gpu.json | 34 + .../seko_talk/A800/seko_talk_A800_int8.json | 22 + .../A800/seko_talk_A800_int8_dist_2gpu.json | 26 + .../A800/seko_talk_A800_int8_dist_4gpu.json | 26 + .../A800/seko_talk_A800_int8_dist_8gpu.json | 26 + .../seko_talk/L40s/1gpu/seko_talk_bf16.json | 23 + .../seko_talk/L40s/1gpu/seko_talk_fp8.json | 27 + .../seko_talk/L40s/2gpu/seko_talk_bf16.json | 25 + .../seko_talk/L40s/2gpu/seko_talk_fp8.json | 31 + .../seko_talk/L40s/4gpu/seko_talk_bf16.json | 25 + .../seko_talk/L40s/4gpu/seko_talk_fp8.json | 31 + .../seko_talk/L40s/8gpu/seko_talk_bf16.json | 25 + .../seko_talk/L40s/8gpu/seko_talk_fp8.json | 31 + configs/seko_talk/mlu/seko_talk_bf16.json | 18 + configs/seko_talk/mlu/seko_talk_int8.json | 29 + .../seko_talk/mlu/seko_talk_int8_dist.json | 33 + configs/seko_talk/multi_person/01_base.json | 16 + .../seko_talk/multi_person/02_base_fp8.json | 22 + configs/seko_talk/multi_person/03_dist.json | 20 + .../seko_talk/multi_person/04_dist_fp8.json | 26 + .../multi_person/15_base_compile.json | 27 + configs/seko_talk/seko_talk_01_base.json | 16 + configs/seko_talk/seko_talk_02_fp8.json | 24 + configs/seko_talk/seko_talk_03_dist.json | 20 + configs/seko_talk/seko_talk_04_fp8_dist.json | 26 + .../seko_talk_05_offload_fp8_4090.json | 32 + .../seko_talk_05_offload_fp8_4090_dist.json | 36 + .../seko_talk_06_offload_fp8_H100.json | 30 + .../seko_talk/seko_talk_07_dist_offload.json | 28 + configs/seko_talk/seko_talk_08_5B_base.json | 31 + .../seko_talk_09_base_fixed_min_area.json | 16 + .../seko_talk_10_fp8_dist_fixed_min_area.json | 26 + .../seko_talk_11_fp8_dist_fixed_shape.json | 30 + ...talk_12_fp8_dist_fixed_shape_8gpus_1s.json | 31 + ...8_dist_bucket_shape_8gpus_5s_realtime.json | 62 + ...8_dist_bucket_shape_8gpus_1s_realtime.json | 63 + .../seko_talk/seko_talk_15_base_compile.json | 59 + .../seko_talk_16_fp8_dist_compile.json | 71 + configs/seko_talk/seko_talk_17_base_vsr.json | 25 + configs/seko_talk/seko_talk_22_nbhd_attn.json | 16 + .../seko_talk_23_fp8_dist_nbhd_attn.json | 28 + ...ko_talk_24_fp8_dist_compile_nbhd_attn.json | 74 + .../seko_talk_25_int8_dist_fp8_comm.json | 40 + configs/seko_talk/seko_talk_28_f2v.json | 24 + configs/self_forcing/wan_t2v_sf.json | 26 + .../sparse_attn/spas_sage_attn/wan_i2v.json | 13 + .../sparse_attn/spas_sage_attn/wan_t2v.json | 14 + .../video_frame_interpolation/wan_t2v.json | 19 + configs/volcengine_voices_list.json | 4727 ++++++++++ configs/wan/wan_flf2v.json | 13 + configs/wan/wan_i2v.json | 13 + configs/wan/wan_t2v.json | 14 + configs/wan/wan_t2v_enhancer.json | 19 + configs/wan/wan_vace.json | 13 + configs/wan22/wan_animate.json | 18 + configs/wan22/wan_animate_4090.json | 25 + configs/wan22/wan_animate_lora.json | 24 + configs/wan22/wan_animate_replace.json | 18 + configs/wan22/wan_animate_replace_4090.json | 25 + configs/wan22/wan_distill_moe_flf2v.json | 28 + configs/wan22/wan_distill_moe_flf2v_fp8.json | 32 + configs/wan22/wan_distill_moe_flf2v_int8.json | 32 + .../wan_distill_moe_flf2v_with_lora.json | 40 + configs/wan22/wan_moe_flf2v.json | 21 + configs/wan22/wan_moe_i2v.json | 20 + configs/wan22/wan_moe_i2v_4090.json | 27 + configs/wan22/wan_moe_i2v_audio.json | 38 + configs/wan22/wan_moe_i2v_distill.json | 28 + configs/wan22/wan_moe_i2v_distill_4090.json | 32 + configs/wan22/wan_moe_i2v_distill_5090.json | 32 + configs/wan22/wan_moe_i2v_distill_quant.json | 32 + .../wan22/wan_moe_i2v_distill_with_lora.json | 40 + configs/wan22/wan_moe_t2v.json | 21 + configs/wan22/wan_moe_t2v_distill.json | 34 + configs/wan22/wan_ti2v_i2v.json | 25 + configs/wan22/wan_ti2v_i2v_4090.json | 26 + configs/wan22/wan_ti2v_t2v.json | 24 + configs/wan22/wan_ti2v_t2v_4090.json | 25 + dockerfiles/Dockerfile | 105 + dockerfiles/Dockerfile_5090 | 105 + dockerfiles/Dockerfile_cambricon_mlu590 | 31 + dockerfiles/Dockerfile_cu124 | 76 + dockerfiles/Dockerfile_deploy | 32 + docs/EN/.readthedocs.yaml | 17 + docs/EN/Makefile | 20 + docs/EN/make.bat | 35 + docs/EN/source/conf.py | 128 + .../EN/source/deploy_guides/deploy_comfyui.md | 25 + docs/EN/source/deploy_guides/deploy_gradio.md | 240 + .../deploy_guides/deploy_local_windows.md | 127 + .../EN/source/deploy_guides/deploy_service.md | 88 + .../source/deploy_guides/for_low_latency.md | 41 + .../source/deploy_guides/for_low_resource.md | 219 + docs/EN/source/deploy_guides/lora_deploy.md | 214 + docs/EN/source/getting_started/benchmark.md | 3 + .../getting_started/benchmark_source.md | 149 + .../source/getting_started/model_structure.md | 573 ++ docs/EN/source/getting_started/quickstart.md | 349 + docs/EN/source/index.rst | 67 + docs/EN/source/method_tutorials/attention.md | 35 + .../autoregressive_distill.md | 53 + docs/EN/source/method_tutorials/cache.md | 3 + .../source/method_tutorials/cache_source.md | 139 + .../method_tutorials/changing_resolution.md | 66 + docs/EN/source/method_tutorials/offload.md | 177 + docs/EN/source/method_tutorials/parallel.md | 53 + .../source/method_tutorials/quantization.md | 158 + .../source/method_tutorials/step_distill.md | 183 + .../video_frame_interpolation.md | 246 + docs/PAPERS_ZH_CN/.readthedocs.yaml | 17 + docs/PAPERS_ZH_CN/Makefile | 20 + docs/PAPERS_ZH_CN/make.bat | 35 + docs/PAPERS_ZH_CN/source/conf.py | 122 + docs/PAPERS_ZH_CN/source/index.rst | 53 + docs/PAPERS_ZH_CN/source/papers/RL.md | 3 + docs/PAPERS_ZH_CN/source/papers/attention.md | 113 + .../source/papers/autoregressive.md | 3 + docs/PAPERS_ZH_CN/source/papers/cache.md | 3 + .../source/papers/changing_resolution.md | 3 + .../source/papers/generation_basics.md | 3 + docs/PAPERS_ZH_CN/source/papers/models.md | 276 + docs/PAPERS_ZH_CN/source/papers/offload.md | 3 + docs/PAPERS_ZH_CN/source/papers/parallel.md | 3 + .../source/papers/prompt_enhance.md | 3 + .../source/papers/quantization.md | 3 + .../source/papers/step_distill.md | 3 + docs/PAPERS_ZH_CN/source/papers/vae.md | 3 + docs/ZH_CN/.readthedocs.yaml | 17 + docs/ZH_CN/Makefile | 20 + docs/ZH_CN/make.bat | 35 + docs/ZH_CN/source/conf.py | 128 + .../source/deploy_guides/deploy_comfyui.md | 25 + .../source/deploy_guides/deploy_gradio.md | 241 + .../deploy_guides/deploy_local_windows.md | 129 + .../source/deploy_guides/deploy_service.md | 88 + .../source/deploy_guides/for_low_latency.md | 42 + .../source/deploy_guides/for_low_resource.md | 223 + .../ZH_CN/source/deploy_guides/lora_deploy.md | 213 + .../ZH_CN/source/getting_started/benchmark.md | 3 + .../getting_started/benchmark_source.md | 149 + .../source/getting_started/model_structure.md | 571 ++ .../source/getting_started/quickstart.md | 352 + docs/ZH_CN/source/index.rst | 68 + .../source/method_tutorials/attention.md | 35 + .../autoregressive_distill.md | 53 + docs/ZH_CN/source/method_tutorials/cache.md | 3 + .../source/method_tutorials/cache_source.md | 139 + .../method_tutorials/changing_resolution.md | 68 + docs/ZH_CN/source/method_tutorials/offload.md | 177 + .../ZH_CN/source/method_tutorials/parallel.md | 55 + .../source/method_tutorials/quantization.md | 158 + .../source/method_tutorials/step_distill.md | 183 + .../video_frame_interpolation.md | 246 + examples/README.md | 284 + examples/README_zh.md | 284 + examples/hunyuan_video/hunyuan_i2v.py | 63 + examples/hunyuan_video/hunyuan_t2v.py | 60 + examples/hunyuan_video/hunyuan_t2v_distill.py | 55 + examples/wan/wan_animate.py | 72 + examples/wan/wan_flf2v.py | 55 + examples/wan/wan_i2v.py | 56 + examples/wan/wan_i2v_distilled.py | 57 + examples/wan/wan_i2v_with_distill_loras.py | 62 + examples/wan/wan_t2v.py | 39 + examples/wan/wan_vace.py | 52 + lightx2v/__init__.py | 18 + lightx2v/common/__init__.py | 0 lightx2v/common/modules/__init__.py | 0 lightx2v/common/modules/weight_module.py | 175 + lightx2v/common/offload/manager.py | 133 + lightx2v/common/ops/__init__.py | 6 + lightx2v/common/ops/attn/__init__.py | 10 + lightx2v/common/ops/attn/flash_attn.py | 89 + lightx2v/common/ops/attn/nbhd_attn.py | 196 + lightx2v/common/ops/attn/radial_attn.py | 185 + lightx2v/common/ops/attn/ring_attn.py | 179 + lightx2v/common/ops/attn/sage_attn.py | 83 + lightx2v/common/ops/attn/spassage_attn.py | 76 + lightx2v/common/ops/attn/svg2_attn.py | 355 + lightx2v/common/ops/attn/svg2_attn_utils.py | 1359 +++ lightx2v/common/ops/attn/svg_attn.py | 409 + lightx2v/common/ops/attn/template.py | 35 + lightx2v/common/ops/attn/torch_sdpa.py | 39 + lightx2v/common/ops/attn/ulysses_attn.py | 415 + lightx2v/common/ops/attn/utils/all2all.py | 89 + lightx2v/common/ops/attn/utils/ring_comm.py | 46 + lightx2v/common/ops/conv/__init__.py | 2 + lightx2v/common/ops/conv/conv2d.py | 61 + lightx2v/common/ops/conv/conv3d.py | 94 + lightx2v/common/ops/embedding/__init__.py | 1 + .../common/ops/embedding/embedding_weight.py | 72 + lightx2v/common/ops/mm/__init__.py | 1 + lightx2v/common/ops/mm/mm_weight.py | 1325 +++ lightx2v/common/ops/norm/__init__.py | 2 + lightx2v/common/ops/norm/layer_norm_weight.py | 220 + lightx2v/common/ops/norm/rms_norm_weight.py | 204 + lightx2v/common/ops/norm/triton_ops.py | 900 ++ lightx2v/common/ops/tensor/__init__.py | 1 + lightx2v/common/ops/tensor/tensor.py | 110 + .../transformer_infer/transformer_infer.py | 46 + lightx2v/deploy/__init__.py | 0 lightx2v/deploy/common/__init__.py | 0 lightx2v/deploy/common/aliyun.py | 81 + lightx2v/deploy/common/audio_separator.py | 376 + lightx2v/deploy/common/face_detector.py | 277 + lightx2v/deploy/common/pipeline.py | 167 + lightx2v/deploy/common/podcasts.py | 696 ++ lightx2v/deploy/common/utils.py | 253 + lightx2v/deploy/common/va_controller.py | 202 + lightx2v/deploy/common/va_reader.py | 274 + lightx2v/deploy/common/va_reader_omni.py | 508 ++ lightx2v/deploy/common/va_recorder.py | 657 ++ lightx2v/deploy/common/va_recorder_x264.py | 321 + lightx2v/deploy/common/video_recorder.py | 422 + lightx2v/deploy/common/volcengine_tts.py | 241 + lightx2v/deploy/data_manager/__init__.py | 248 + .../deploy/data_manager/local_data_manager.py | 120 + .../deploy/data_manager/s3_data_manager.py | 254 + lightx2v/deploy/queue_manager/__init__.py | 25 + .../queue_manager/local_queue_manager.py | 113 + .../queue_manager/rabbitmq_queue_manager.py | 124 + lightx2v/deploy/server/__init__.py | 0 lightx2v/deploy/server/__main__.py | 1490 ++++ lightx2v/deploy/server/auth.py | 205 + lightx2v/deploy/server/frontend/.gitignore | 24 + lightx2v/deploy/server/frontend/README.md | 5 + lightx2v/deploy/server/frontend/index.html | 133 + .../deploy/server/frontend/package-lock.json | 2143 +++++ lightx2v/deploy/server/frontend/package.json | 26 + .../deploy/server/frontend/public/cover.png | Bin 0 -> 1235899 bytes .../deploy/server/frontend/public/female.svg | 3 + .../deploy/server/frontend/public/logo.svg | 1 + .../server/frontend/public/logo_black.png | Bin 0 -> 30640 bytes .../server/frontend/public/logo_black.svg | 1 + .../deploy/server/frontend/public/male.svg | 3 + .../deploy/server/frontend/public/robots.txt | 3 + .../deploy/server/frontend/public/sitemap.xml | 14 + .../deploy/server/frontend/public/vite.svg | 1 + lightx2v/deploy/server/frontend/src/App.vue | 125 + .../server/frontend/src/components/Alert.vue | 311 + .../src/components/AudioPreviewTest.vue | 67 + .../frontend/src/components/Confirm.vue | 70 + .../frontend/src/components/DropdownMenu.vue | 96 + .../src/components/FloatingParticles.vue | 73 + .../frontend/src/components/Generate.vue | 3517 ++++++++ .../frontend/src/components/Inspirations.vue | 289 + .../frontend/src/components/LeftBar.vue | 56 + .../frontend/src/components/Loading.vue | 15 + .../frontend/src/components/LoginCard.vue | 124 + .../frontend/src/components/MediaTemplate.vue | 466 + .../frontend/src/components/ModelDropdown.vue | 57 + .../frontend/src/components/Projects.vue | 609 ++ .../src/components/PromptTemplate.vue | 123 + .../frontend/src/components/SiteFooter.vue | 38 + .../frontend/src/components/TaskCarousel.vue | 497 ++ .../frontend/src/components/TaskDetails.vue | 1154 +++ .../src/components/TemplateDetails.vue | 335 + .../src/components/TemplateDisplay.vue | 294 + .../server/frontend/src/components/TopBar.vue | 106 + .../frontend/src/components/VoiceSelector.vue | 233 + .../src/components/VoiceTtsHistoryPanel.vue | 308 + .../frontend/src/components/Voice_tts.vue | 2511 ++++++ .../server/frontend/src/locales/en.json | 651 ++ .../server/frontend/src/locales/zh.json | 696 ++ lightx2v/deploy/server/frontend/src/main.js | 20 + .../server/frontend/src/router/index.js | 144 + lightx2v/deploy/server/frontend/src/style.css | 2540 ++++++ .../deploy/server/frontend/src/utils/i18n.js | 62 + .../deploy/server/frontend/src/utils/other.js | 7839 +++++++++++++++++ .../deploy/server/frontend/src/views/404.vue | 56 + .../server/frontend/src/views/Layout.vue | 85 + .../server/frontend/src/views/Login.vue | 108 + .../frontend/src/views/PodcastGenerate.vue | 3893 ++++++++ .../server/frontend/src/views/Share.vue | 511 ++ .../deploy/server/frontend/vite.config.js | 8 + lightx2v/deploy/server/metrics.py | 65 + lightx2v/deploy/server/monitor.py | 375 + lightx2v/deploy/server/redis_client.py | 247 + lightx2v/deploy/server/redis_monitor.py | 166 + lightx2v/deploy/server/static/assets | 1 + .../deploy/server/static/icon/logoblack.png | Bin 0 -> 10616 bytes .../deploy/server/static/icon/seko_logo.svg | 9 + .../server/static/icon/seko_logo_nobg.png | Bin 0 -> 11540 bytes .../server/static/icon/seko_logo_white.svg | 9 + lightx2v/deploy/server/static/index.html | 1 + lightx2v/deploy/server/static/index_old.html | 1124 +++ lightx2v/deploy/task_manager/__init__.py | 313 + .../deploy/task_manager/local_task_manager.py | 476 + .../deploy/task_manager/sql_task_manager.py | 1112 +++ lightx2v/deploy/worker/__init__.py | 0 lightx2v/deploy/worker/__main__.py | 370 + lightx2v/deploy/worker/hub.py | 498 ++ lightx2v/infer.py | 146 + lightx2v/models/__init__.py | 0 lightx2v/models/input_encoders/__init__.py | 0 lightx2v/models/input_encoders/hf/__init__.py | 0 .../input_encoders/hf/animate/__init__.py | 0 .../input_encoders/hf/animate/face_encoder.py | 171 + .../hf/animate/motion_encoder.py | 300 + .../hf/hunyuan15/byt5/__init__.py | 0 .../hf/hunyuan15/byt5/format_prompt.py | 68 + .../input_encoders/hf/hunyuan15/byt5/model.py | 369 + .../hf/hunyuan15/qwen25/__init__.py | 0 .../hf/hunyuan15/qwen25/model.py | 641 ++ .../hf/hunyuan15/siglip/__init__.py | 0 .../hf/hunyuan15/siglip/model.py | 303 + lightx2v/models/input_encoders/hf/q_linear.py | 312 + .../qwen25_vlforconditionalgeneration.py | 190 + .../hf/seko_audio/audio_adapter.py | 311 + .../hf/seko_audio/audio_encoder.py | 40 + .../input_encoders/hf/vace/vace_processor.py | 173 + .../hf/wan/matrix_game2/__init__.py | 0 .../hf/wan/matrix_game2/clip.py | 332 + .../hf/wan/matrix_game2/conditions.py | 203 + .../hf/wan/matrix_game2/tokenizers.py | 75 + .../input_encoders/hf/wan/t5/__init__.py | 0 .../models/input_encoders/hf/wan/t5/model.py | 849 ++ .../input_encoders/hf/wan/t5/tokenizer.py | 81 + .../hf/wan/xlm_roberta/__init__.py | 0 .../hf/wan/xlm_roberta/model.py | 473 + lightx2v/models/networks/__init__.py | 0 .../models/networks/hunyuan_video/__init__.py | 0 .../hunyuan_video/infer/attn_no_pad.py | 129 + .../infer/feature_caching/__init__.py | 0 .../feature_caching/transformer_infer.py | 229 + .../networks/hunyuan_video/infer/module_io.py | 27 + .../hunyuan_video/infer/offload/__init__.py | 0 .../infer/offload/transformer_infer.py | 34 + .../hunyuan_video/infer/post_infer.py | 39 + .../networks/hunyuan_video/infer/pre_infer.py | 240 + .../hunyuan_video/infer/transformer_infer.py | 265 + .../hunyuan_video/infer/triton_ops.py | 902 ++ .../models/networks/hunyuan_video/model.py | 279 + .../hunyuan_video/weights/post_weights.py | 7 + .../hunyuan_video/weights/pre_weights.py | 147 + .../weights/transformer_weights.py | 390 + .../qwen_image/infer/offload/__init__.py | 0 .../infer/offload/transformer_infer.py | 50 + .../networks/qwen_image/infer/post_infer.py | 19 + .../networks/qwen_image/infer/pre_infer.py | 188 + .../qwen_image/infer/transformer_infer.py | 224 + .../networks/qwen_image/lora_adapter.py | 90 + lightx2v/models/networks/qwen_image/model.py | 383 + .../qwen_image/weights/post_weights.py | 49 + .../qwen_image/weights/pre_weights.py | 40 + .../qwen_image/weights/transformer_weights.py | 323 + lightx2v/models/networks/wan/animate_model.py | 22 + lightx2v/models/networks/wan/audio_model.py | 164 + lightx2v/models/networks/wan/causvid_model.py | 58 + lightx2v/models/networks/wan/distill_model.py | 35 + .../networks/wan/infer/animate/pre_infer.py | 31 + .../wan/infer/animate/transformer_infer.py | 74 + .../networks/wan/infer/audio/post_infer.py | 21 + .../networks/wan/infer/audio/pre_infer.py | 124 + .../wan/infer/audio/transformer_infer.py | 96 + .../networks/wan/infer/causvid/__init__.py | 0 .../wan/infer/causvid/transformer_infer.py | 222 + .../wan/infer/feature_caching/__init__.py | 0 .../feature_caching/transformer_infer.py | 1104 +++ .../wan/infer/matrix_game2/posemb_layers.py | 291 + .../wan/infer/matrix_game2/pre_infer.py | 98 + .../infer/matrix_game2/transformer_infer.py | 672 ++ .../models/networks/wan/infer/module_io.py | 21 + .../networks/wan/infer/offload/__init__.py | 0 .../wan/infer/offload/transformer_infer.py | 154 + .../models/networks/wan/infer/post_infer.py | 31 + .../models/networks/wan/infer/pre_infer.py | 124 + .../wan/infer/self_forcing/__init__.py | 0 .../wan/infer/self_forcing/pre_infer.py | 114 + .../infer/self_forcing/transformer_infer.py | 358 + .../networks/wan/infer/transformer_infer.py | 321 + .../models/networks/wan/infer/triton_ops.py | 902 ++ lightx2v/models/networks/wan/infer/utils.py | 239 + .../wan/infer/vace/transformer_infer.py | 38 + lightx2v/models/networks/wan/lora_adapter.py | 131 + .../models/networks/wan/matrix_game2_model.py | 48 + lightx2v/models/networks/wan/model.py | 505 ++ lightx2v/models/networks/wan/sf_model.py | 53 + lightx2v/models/networks/wan/vace_model.py | 55 + .../weights/animate/transformer_weights.py | 127 + .../wan/weights/audio/transformer_weights.py | 161 + .../wan/weights/matrix_game2/pre_weights.py | 50 + .../matrix_game2/transformer_weights.py | 244 + .../networks/wan/weights/post_weights.py | 7 + .../networks/wan/weights/pre_weights.py | 80 + .../wan/weights/transformer_weights.py | 578 ++ .../wan/weights/vace/transformer_weights.py | 76 + lightx2v/models/runners/__init__.py | 0 lightx2v/models/runners/base_runner.py | 169 + lightx2v/models/runners/default_runner.py | 419 + .../hunyuan_video_15_distill_runner.py | 18 + .../hunyuan_video/hunyuan_video_15_runner.py | 550 ++ .../runners/qwen_image/qwen_image_runner.py | 273 + .../models/runners/vsr/utils/TCDecoder.py | 326 + lightx2v/models/runners/vsr/utils/utils.py | 156 + lightx2v/models/runners/vsr/vsr_wrapper.py | 162 + .../models/runners/vsr/vsr_wrapper_hy15.py | 152 + lightx2v/models/runners/wan/__init__.py | 0 .../models/runners/wan/wan_animate_runner.py | 418 + .../models/runners/wan/wan_audio_runner.py | 923 ++ .../models/runners/wan/wan_distill_runner.py | 200 + .../runners/wan/wan_matrix_game2_runner.py | 327 + lightx2v/models/runners/wan/wan_runner.py | 638 ++ lightx2v/models/runners/wan/wan_sf_runner.py | 175 + .../models/runners/wan/wan_vace_runner.py | 192 + lightx2v/models/schedulers/__init__.py | 0 .../schedulers/hunyuan_video/__init__.py | 0 .../hunyuan_video/feature_caching/__init__.py | 0 .../feature_caching/scheduler.py | 9 + .../schedulers/hunyuan_video/posemb_layers.py | 283 + .../schedulers/hunyuan_video/scheduler.py | 216 + .../hunyuan_video/step_distill/scheduler.py | 33 + .../models/schedulers/qwen_image/scheduler.py | 235 + lightx2v/models/schedulers/scheduler.py | 22 + .../models/schedulers/wan/audio/scheduler.py | 127 + .../wan/changing_resolution/scheduler.py | 94 + .../wan/feature_caching/scheduler.py | 18 + lightx2v/models/schedulers/wan/scheduler.py | 434 + .../schedulers/wan/self_forcing/scheduler.py | 105 + .../schedulers/wan/step_distill/scheduler.py | 76 + lightx2v/models/vfi/rife/model/loss.py | 130 + .../vfi/rife/model/pytorch_msssim/__init__.py | 204 + lightx2v/models/vfi/rife/model/warplayer.py | 17 + .../models/vfi/rife/rife_comfyui_wrapper.py | 138 + .../models/vfi/rife/train_log/IFNet_HDv3.py | 214 + .../models/vfi/rife/train_log/RIFE_HDv3.py | 85 + lightx2v/models/vfi/rife/train_log/refine.py | 113 + lightx2v/models/video_encoders/__init__.py | 0 lightx2v/models/video_encoders/hf/__init__.py | 0 .../hf/hunyuanvideo15/__init__.py | 0 .../hf/hunyuanvideo15/hunyuanvideo_15_vae.py | 910 ++ .../hf/hunyuanvideo15/lighttae_hy15.py | 17 + .../video_encoders/hf/qwen_image/__init__.py | 0 .../video_encoders/hf/qwen_image/vae.py | 140 + lightx2v/models/video_encoders/hf/tae.py | 304 + .../models/video_encoders/hf/vid_recon.py | 94 + .../models/video_encoders/hf/wan/__init__.py | 0 lightx2v/models/video_encoders/hf/wan/vae.py | 1457 +++ .../models/video_encoders/hf/wan/vae_2_2.py | 1045 +++ .../models/video_encoders/hf/wan/vae_sf.py | 348 + .../models/video_encoders/hf/wan/vae_tiny.py | 216 + lightx2v/pipeline.py | 360 + lightx2v/server/README.md | 438 + lightx2v/server/__init__.py | 0 lightx2v/server/__main__.py | 28 + lightx2v/server/api/__init__.py | 7 + lightx2v/server/api/deps.py | 54 + lightx2v/server/api/files.py | 69 + lightx2v/server/api/router.py | 25 + lightx2v/server/api/server.py | 125 + lightx2v/server/api/service_routes.py | 18 + lightx2v/server/api/tasks/__init__.py | 9 + lightx2v/server/api/tasks/common.py | 147 + lightx2v/server/api/tasks/image.py | 97 + lightx2v/server/api/tasks/video.py | 109 + lightx2v/server/config.py | 63 + lightx2v/server/main.py | 59 + lightx2v/server/media/__init__.py | 13 + lightx2v/server/media/audio.py | 74 + lightx2v/server/media/base.py | 86 + lightx2v/server/media/image.py | 68 + lightx2v/server/metrics/__init__.py | 6 + lightx2v/server/metrics/metrics.py | 361 + lightx2v/server/metrics/monitor.py | 22 + lightx2v/server/schema.py | 73 + lightx2v/server/services/__init__.py | 11 + lightx2v/server/services/distributed_utils.py | 141 + lightx2v/server/services/file_service.py | 153 + .../server/services/generation/__init__.py | 9 + lightx2v/server/services/generation/base.py | 146 + lightx2v/server/services/generation/image.py | 66 + lightx2v/server/services/generation/video.py | 22 + .../server/services/inference/__init__.py | 7 + lightx2v/server/services/inference/service.py | 81 + lightx2v/server/services/inference/worker.py | 128 + lightx2v/server/task_manager.py | 215 + lightx2v/utils/__init__.py | 0 lightx2v/utils/async_io.py | 83 + lightx2v/utils/custom_compiler.py | 187 + lightx2v/utils/envs.py | 49 + lightx2v/utils/generate_task_id.py | 49 + lightx2v/utils/ggml_tensor.py | 628 ++ lightx2v/utils/global_paras.py | 1 + lightx2v/utils/input_info.py | 230 + lightx2v/utils/lockable_dict.py | 177 + lightx2v/utils/memory_profiler.py | 29 + lightx2v/utils/print_atten_score.py | 76 + lightx2v/utils/profiler.py | 200 + lightx2v/utils/prompt_enhancer.py | 78 + lightx2v/utils/quant_utils.py | 219 + lightx2v/utils/registry_factory.py | 71 + lightx2v/utils/service_utils.py | 146 + lightx2v/utils/set_config.py | 115 + lightx2v/utils/utils.py | 486 + lightx2v_kernel/CMakeLists.txt | 103 + lightx2v_kernel/LICENSE | 201 + lightx2v_kernel/README.md | 56 + lightx2v_kernel/cmake/utils.cmake | 21 + lightx2v_kernel/csrc/common_extension.cc | 51 + .../csrc/gemm/mxfp4_quant_kernels_sm120.cu | 324 + .../gemm/mxfp4_scaled_mm_kernels_sm120.cu | 323 + .../mxfp6_mxfp8_scaled_mm_kernels_sm120.cu | 324 + .../csrc/gemm/mxfp6_quant_kernels_sm120.cu | 348 + .../csrc/gemm/mxfp8_quant_kernels_sm120.cu | 315 + .../gemm/mxfp8_scaled_mm_kernels_sm120.cu | 325 + .../csrc/gemm/nvfp4_quant_kernels_sm120.cu | 387 + .../gemm/nvfp4_scaled_mm_kernels_sm120.cu | 323 + .../en_US/mx_formats_quantization_basics.md | 35 + .../docs/en_US/nvfp4_quantization_basics.md | 80 + ...17\345\214\226\345\237\272\347\241\200.md" | 35 + ...17\345\214\226\345\237\272\347\241\200.md" | 80 + lightx2v_kernel/include/lightx2v_kernel_ops.h | 92 + lightx2v_kernel/include/utils.h | 348 + lightx2v_kernel/pyproject.toml | 39 + .../python/lightx2v_kernel/__init__.py | 15 + .../python/lightx2v_kernel/gemm.py | 115 + .../python/lightx2v_kernel/utils.py | 157 + .../python/lightx2v_kernel/version.py | 1 + .../test/mxfp4_mxfp4/test_bench.py | 121 + .../test/mxfp4_mxfp4/test_bench3_bias.py | 94 + .../test/mxfp4_mxfp4/test_mxfp4_quant.py | 52 + lightx2v_kernel/test/mxfp6_mxfp8/test.py | 29 + .../test/mxfp6_mxfp8/test_bench.py | 121 + .../test/mxfp6_mxfp8/test_bench3_bias.py | 94 + .../test/mxfp6_mxfp8/test_fake_quant.py | 181 + .../test/mxfp6_mxfp8/test_mm_tflops.py | 115 + .../test/mxfp6_mxfp8/test_mxfp6_quant.py | 51 + .../test/mxfp6_mxfp8/test_quant_mem_utils.py | 158 + .../test/mxfp8_mxfp8/test_bench.py | 121 + .../test/mxfp8_mxfp8/test_bench3_bias.py | 94 + .../test/mxfp8_mxfp8/test_mm_tflops.py | 115 + .../test/mxfp8_mxfp8/test_mxfp8_quant.py | 51 + .../test/mxfp8_mxfp8/test_quant_mem_utils.py | 158 + .../test/nvfp4_nvfp4/fake_quant.py | 55 + .../test/nvfp4_nvfp4/test_bench1.py | 142 + .../test/nvfp4_nvfp4/test_bench2.py | 126 + .../test/nvfp4_nvfp4/test_bench3_bias.py | 94 + .../test/nvfp4_nvfp4/test_mm_tflops.py | 114 + .../test/nvfp4_nvfp4/test_quant_mem_utils.py | 160 + lightx2v_platform/__init__.py | 1 + lightx2v_platform/base/__init__.py | 7 + lightx2v_platform/base/base.py | 33 + lightx2v_platform/base/cambricon_mlu.py | 27 + lightx2v_platform/base/dcu.py | 55 + lightx2v_platform/base/global_var.py | 1 + lightx2v_platform/base/metax.py | 7 + lightx2v_platform/base/nvidia.py | 36 + lightx2v_platform/ops/__init__.py | 12 + lightx2v_platform/ops/attn/__init__.py | 0 .../ops/attn/cambricon_mlu/__init__.py | 2 + .../ops/attn/cambricon_mlu/flash_attn.py | 42 + .../ops/attn/cambricon_mlu/sage_attn.py | 31 + lightx2v_platform/ops/attn/dcu/__init__.py | 1 + lightx2v_platform/ops/attn/dcu/flash_attn.py | 146 + lightx2v_platform/ops/attn/template.py | 32 + lightx2v_platform/ops/mm/__init__.py | 0 .../ops/mm/cambricon_mlu/__init__.py | 1 + .../ops/mm/cambricon_mlu/mm_weight.py | 37 + .../ops/mm/cambricon_mlu/q_linear.py | 47 + lightx2v_platform/ops/mm/template.py | 466 + lightx2v_platform/ops/norm/__init__.py | 0 lightx2v_platform/ops/rope/__init__.py | 0 lightx2v_platform/registry_factory.py | 58 + lightx2v_platform/set_ai_device.py | 15 + lightx2v_platform/test/test_device.py | 11 + pyproject.toml | 114 + requirements-docs.txt | 7 + requirements.txt | 40 + requirements_animate.txt | 8 + requirements_win.txt | 18 + save_results/.gitkeep | 0 scripts/base/base.sh | 53 + scripts/bench/run_lightx2v_1.sh | 40 + scripts/bench/run_lightx2v_2.sh | 40 + scripts/bench/run_lightx2v_3.sh | 40 + scripts/bench/run_lightx2v_3_distill.sh | 40 + scripts/bench/run_lightx2v_4.sh | 40 + scripts/bench/run_lightx2v_5.sh | 40 + scripts/bench/run_lightx2v_5_distill.sh | 40 + scripts/bench/run_lightx2v_6.sh | 40 + scripts/bench/run_lightx2v_6_distill.sh | 40 + scripts/cache/readme.md | 11 + .../cache/run_wan_i2v_dist_cfg_ulysses_mag.sh | 20 + scripts/cache/run_wan_i2v_mag.sh | 20 + scripts/cache/run_wan_i2v_mag_calibration.sh | 20 + scripts/cache/run_wan_i2v_tea.sh | 20 + .../cache/run_wan_t2v_dist_cfg_ulysses_mag.sh | 19 + scripts/cache/run_wan_t2v_mag.sh | 19 + scripts/cache/run_wan_t2v_mag_calibration.sh | 19 + scripts/cache/run_wan_t2v_tea.sh | 19 + .../run_wan_i2v_changing_resolution.sh | 20 + .../run_wan_t2v_changing_resolution.sh | 19 + scripts/dist_infer/run_wan22_moe_i2v_cfg.sh | 20 + .../run_wan22_moe_i2v_cfg_ulysses.sh | 20 + .../dist_infer/run_wan22_moe_i2v_ulysses.sh | 20 + scripts/dist_infer/run_wan22_moe_t2v_cfg.sh | 19 + .../run_wan22_moe_t2v_cfg_ulysses.sh | 19 + .../dist_infer/run_wan22_moe_t2v_ulysses.sh | 19 + scripts/dist_infer/run_wan22_ti2v_i2v_cfg.sh | 20 + .../run_wan22_ti2v_i2v_cfg_ulysses.sh | 20 + .../dist_infer/run_wan22_ti2v_i2v_ulysses.sh | 20 + scripts/dist_infer/run_wan22_ti2v_t2v_cfg.sh | 19 + .../run_wan22_ti2v_t2v_cfg_ulysses.sh | 19 + .../dist_infer/run_wan22_ti2v_t2v_ulysses.sh | 19 + .../run_wan_i2v_dist_cfg_ulysses.sh | 20 + .../dist_infer/run_wan_i2v_dist_ulysses.sh | 20 + scripts/dist_infer/run_wan_t2v_dist_cfg.sh | 19 + .../run_wan_t2v_dist_cfg_ulysses.sh | 19 + .../dist_infer/run_wan_t2v_dist_ulysses.sh | 19 + scripts/hunyuan_video_15/README.md | 103 + scripts/hunyuan_video_15/run_hy15_i2v_480p.sh | 21 + .../hunyuan_video_15/run_hy15_i2v_480p_vsr.sh | 21 + scripts/hunyuan_video_15/run_hy15_i2v_720p.sh | 21 + scripts/hunyuan_video_15/run_hy15_t2v_480p.sh | 20 + .../run_hy15_t2v_480p_distill.sh | 20 + scripts/hunyuan_video_15/run_hy15_t2v_720p.sh | 20 + .../run_matrix_game2_gta_drive.sh | 20 + .../run_matrix_game2_gta_drive_streaming.sh | 20 + .../run_matrix_game2_templerun.sh | 20 + .../run_matrix_game2_templerun_streaming.sh | 20 + .../run_matrix_game2_universal.sh | 20 + .../run_matrix_game2_universal_streaming.sh | 20 + .../gguf/run_wan_i2v_gguf_q4_k.sh | 21 + scripts/quantization/readme.md | 11 + .../quantization/run_wan_i2v_quantization.sh | 20 + scripts/qwen_image/qwen_image_i2i.sh | 21 + scripts/qwen_image/qwen_image_i2i_2509.sh | 21 + .../qwen_image/qwen_image_i2i_2509_block.sh | 21 + scripts/qwen_image/qwen_image_i2i_block.sh | 21 + scripts/qwen_image/qwen_image_i2i_lora.sh | 22 + scripts/qwen_image/qwen_image_t2i.sh | 20 + scripts/qwen_image/qwen_image_t2i_block.sh | 20 + scripts/seko_talk/multi_person/01_base.sh | 21 + scripts/seko_talk/multi_person/03_dist.sh | 21 + scripts/seko_talk/run_seko_talk_01_base.sh | 21 + scripts/seko_talk/run_seko_talk_02_fp8.sh | 21 + scripts/seko_talk/run_seko_talk_03_dist.sh | 21 + .../seko_talk/run_seko_talk_04_fp8_dist.sh | 21 + .../run_seko_talk_05_offload_fp8_4090.sh | 21 + .../run_seko_talk_06_offload_fp8_H100.sh | 21 + .../run_seko_talk_07_dist_offload.sh | 21 + scripts/seko_talk/run_seko_talk_08_5B_base.sh | 21 + .../run_seko_talk_09_base_fixed_min_area.sh | 21 + ...un_seko_talk_10_fp8_dist_fixed_min_area.sh | 21 + .../run_seko_talk_11_fp8_dist_fixed_shape.sh | 21 + ...o_talk_12_fp8_dist_fixed_shape_8gpus_1s.sh | 21 + ...fp8_dist_bucket_shape_8gpus_5s_realtime.sh | 21 + ...fp8_dist_bucket_shape_8gpus_1s_realtime.sh | 21 + .../run_seko_talk_15_base_compile.sh | 21 + .../run_seko_talk_16_fp8_dist_compile.sh | 21 + scripts/seko_talk/run_seko_talk_17_vsr.sh | 21 + .../seko_talk/run_seko_talk_18_5090_base.sh | 21 + .../run_seko_talk_19_A800_int8_dist.sh | 21 + .../seko_talk/run_seko_talk_20_A800_int8.sh | 22 + .../seko_talk/run_seko_talk_21_5090_int8.sh | 22 + .../run_seko_talk_21_5090_int8_dist.sh | 21 + .../seko_talk/run_seko_talk_22_nbhd_attn.sh | 21 + .../run_seko_talk_23_fp8_dist_nbhd_attn.sh | 21 + ...seko_talk_24_fp8_dist_compile_nbhd_attn.sh | 21 + .../seko_talk/run_seko_talk_25_mlu_bf16.sh | 22 + .../seko_talk/run_seko_talk_26_mlu_int8.sh | 22 + .../run_seko_talk_27_mlu_int8_dist.sh | 22 + scripts/seko_talk/run_seko_talk_28_f2v.sh | 20 + scripts/self_forcing/run_wan_t2v_sf.sh | 20 + scripts/server/check_status.py | 13 + scripts/server/post.py | 17 + scripts/server/post_enhancer.py | 17 + scripts/server/post_i2v.py | 27 + scripts/server/post_multi_servers.py | 148 + scripts/server/post_multi_servers_i2v.py | 40 + scripts/server/post_multi_servers_t2v.py | 166 + scripts/server/post_vbench_i2v.py | 68 + scripts/server/readme.md | 1 + scripts/server/start_multi_servers.sh | 19 + scripts/server/start_server.sh | 21 + scripts/server/start_server_i2i.sh | 26 + scripts/server/start_server_t2i.sh | 28 + scripts/server/stop_running_task.py | 5 + .../sparse_attn/spas_sage_attn/run_wan_i2v.sh | 20 + .../sparse_attn/spas_sage_attn/run_wan_t2v.sh | 19 + .../run_wan_t2v_video_frame_interpolation.sh | 21 + scripts/wan/run_wan_flf2v.sh | 21 + scripts/wan/run_wan_i2v.sh | 20 + scripts/wan/run_wan_i2v_causvid.sh | 20 + scripts/wan/run_wan_i2v_distill_4step_cfg.sh | 20 + .../wan/run_wan_i2v_distill_4step_cfg_lora.sh | 20 + scripts/wan/run_wan_i2v_lazy_load.sh | 34 + scripts/wan/run_wan_i2v_nbhd_attn_480p.sh | 20 + scripts/wan/run_wan_i2v_nbhd_attn_720p.sh | 20 + scripts/wan/run_wan_t2v.sh | 19 + scripts/wan/run_wan_t2v_causvid.sh | 19 + scripts/wan/run_wan_t2v_distill_4step_cfg.sh | 20 + .../run_wan_t2v_distill_4step_cfg_dynamic.sh | 20 + .../wan/run_wan_t2v_distill_4step_cfg_lora.sh | 20 + scripts/wan/run_wan_vace.sh | 20 + scripts/wan22/run_wan22_animate.sh | 33 + scripts/wan22/run_wan22_animate_lora.sh | 33 + scripts/wan22/run_wan22_animate_replace.sh | 39 + scripts/wan22/run_wan22_distill_moe_flf2v.sh | 22 + scripts/wan22/run_wan22_moe_flf2v.sh | 21 + scripts/wan22/run_wan22_moe_i2v.sh | 20 + scripts/wan22/run_wan22_moe_i2v_distill.sh | 20 + scripts/wan22/run_wan22_moe_t2v.sh | 19 + scripts/wan22/run_wan22_moe_t2v_distill.sh | 19 + scripts/wan22/run_wan22_ti2v_i2v.sh | 20 + scripts/wan22/run_wan22_ti2v_t2v.sh | 19 + scripts/win/run_wan_i2v.bat | 53 + scripts/win/run_wan_t2v.bat | 52 + setup_vae.py | 86 + test_cases/run_matrix_game2_gta_drive.sh | 20 + test_cases/run_qwen_image_i2i_2509.sh | 21 + test_cases/run_seko_talk_01_base.sh | 24 + test_cases/run_wan_i2v.sh | 20 + test_cases/run_wan_i2v_offload.sh | 20 + test_cases/run_wan_t2v.sh | 19 + test_cases/run_wan_t2v_dist_cfg_ulysses.sh | 19 + test_cases/run_wan_t2v_sf.sh | 20 + tools/convert/converter.py | 883 ++ tools/convert/lora_loader.py | 448 + tools/convert/quant/__init__.py | 1 + tools/convert/quant/quant.py | 141 + tools/convert/quant_adapter.py | 75 + tools/convert/readme.md | 445 + tools/convert/readme_zh.md | 438 + tools/convert/seko_talk_converter.py | 452 + tools/download_rife.py | 133 + tools/extract/convert_vigen_to_x2v_lora.py | 144 + tools/extract/lora_extractor.py | 456 + tools/extract/lora_merger.py | 418 + tools/preprocess/UserGuider.md | 70 + tools/preprocess/__init__.py | 3 + tools/preprocess/human_visualization.py | 1337 +++ tools/preprocess/pose2d.py | 414 + tools/preprocess/pose2d_utils.py | 1117 +++ tools/preprocess/preprocess_data.py | 88 + tools/preprocess/process_pipepline.py | 355 + tools/preprocess/retarget_pose.py | 850 ++ tools/preprocess/sam_utils.py | 146 + tools/preprocess/utils.py | 219 + tools/preprocess/video_predictor.py | 131 + 907 files changed, 127963 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 LICENSE create mode 100644 app/README.md create mode 100644 app/gradio_demo.py create mode 100644 app/gradio_demo_zh.py create mode 100644 app/run_gradio.sh create mode 100644 app/run_gradio_win.bat create mode 100644 assets/figs/offload/fig1_en.png create mode 100644 assets/figs/offload/fig1_zh.png create mode 100644 assets/figs/offload/fig2_en.png create mode 100644 assets/figs/offload/fig2_zh.png create mode 100644 assets/figs/offload/fig3_en.png create mode 100644 assets/figs/offload/fig3_zh.png create mode 100644 assets/figs/offload/fig4_en.png create mode 100644 assets/figs/offload/fig4_zh.png create mode 100644 assets/figs/offload/fig5_en.png create mode 100644 assets/figs/offload/fig5_zh.png create mode 100644 assets/figs/portabl_windows/pic1.png create mode 100644 assets/figs/portabl_windows/pic_gradio_en.png create mode 100644 assets/figs/portabl_windows/pic_gradio_zh.png create mode 100644 assets/figs/step_distill/fig_01.png create mode 100644 assets/img_lightx2v.png create mode 100644 assets/inputs/audio/multi_person/config.json create mode 100644 assets/inputs/audio/multi_person/config_multi_template.json create mode 100644 assets/inputs/audio/multi_person/config_single_template.json create mode 100644 assets/inputs/audio/multi_person/p1.mp3 create mode 100644 assets/inputs/audio/multi_person/p1_mask.png create mode 100644 assets/inputs/audio/multi_person/p2.mp3 create mode 100644 assets/inputs/audio/multi_person/p2_mask.png create mode 100644 assets/inputs/audio/multi_person/seko_input.png create mode 100644 assets/inputs/audio/seko_input.mp3 create mode 100644 assets/inputs/audio/seko_input.png create mode 100644 assets/inputs/imgs/flf2v_input_first_frame-fs8.png create mode 100644 assets/inputs/imgs/flf2v_input_last_frame-fs8.png create mode 100644 assets/inputs/imgs/girl.png create mode 100644 assets/inputs/imgs/img_0.jpg create mode 100644 assets/inputs/imgs/img_1.jpg create mode 100644 assets/inputs/imgs/img_2.jpg create mode 100644 assets/inputs/imgs/snake.png create mode 100644 configs/attentions/wan_i2v_flash.json create mode 100644 configs/attentions/wan_i2v_nbhd_480p.json create mode 100644 configs/attentions/wan_i2v_nbhd_720p.json create mode 100644 configs/attentions/wan_i2v_radial.json create mode 100644 configs/attentions/wan_i2v_sage.json create mode 100644 configs/attentions/wan_i2v_svg.json create mode 100644 configs/attentions/wan_i2v_svg2.json create mode 100644 configs/attentions/wan_t2v_sparge.json create mode 100644 configs/bench/lightx2v_1.json create mode 100644 configs/bench/lightx2v_2.json create mode 100644 configs/bench/lightx2v_3.json create mode 100644 configs/bench/lightx2v_3_distill.json create mode 100644 configs/bench/lightx2v_4.json create mode 100644 configs/bench/lightx2v_5.json create mode 100644 configs/bench/lightx2v_5_distill.json create mode 100644 configs/bench/lightx2v_6.json create mode 100644 configs/bench/lightx2v_6_distill.json create mode 100644 configs/caching/adacache/wan_i2v_ada.json create mode 100644 configs/caching/adacache/wan_t2v_ada.json create mode 100644 configs/caching/custom/wan_i2v_custom_480p.json create mode 100644 configs/caching/custom/wan_i2v_custom_720p.json create mode 100644 configs/caching/custom/wan_t2v_custom_14b.json create mode 100644 configs/caching/custom/wan_t2v_custom_1_3b.json create mode 100644 configs/caching/dualblock/wan_t2v_1_3b.json create mode 100644 configs/caching/dynamicblock/wan_t2v_1_3b.json create mode 100644 configs/caching/firstblock/wan_t2v_1_3b.json create mode 100644 configs/caching/magcache/wan_i2v_dist_cfg_ulysses_mag_480p.json create mode 100644 configs/caching/magcache/wan_i2v_mag_480p.json create mode 100644 configs/caching/magcache/wan_i2v_mag_calibration_480p.json create mode 100644 configs/caching/magcache/wan_t2v_dist_cfg_ulysses_mag_1_3b.json create mode 100644 configs/caching/magcache/wan_t2v_mag_1_3b.json create mode 100644 configs/caching/magcache/wan_t2v_mag_calibration_1_3b.json create mode 100644 configs/caching/taylorseer/wan_t2v_taylorseer.json create mode 100644 configs/caching/teacache/wan_i2v_tea_480p.json create mode 100644 configs/caching/teacache/wan_i2v_tea_720p.json create mode 100644 configs/caching/teacache/wan_t2v_1_3b_tea_480p.json create mode 100644 configs/caching/teacache/wan_ti2v_tea_720p.json create mode 100644 configs/causvid/wan_i2v_causvid.json create mode 100644 configs/causvid/wan_t2v_causvid.json create mode 100644 configs/changing_resolution/wan_i2v.json create mode 100644 configs/changing_resolution/wan_i2v_U.json create mode 100644 configs/changing_resolution/wan_t2v.json create mode 100644 configs/changing_resolution/wan_t2v_U.json create mode 100644 configs/changing_resolution/wan_t2v_U_teacache.json create mode 100644 configs/deploy/wan_i2v.json create mode 100644 configs/deploy/wan_t2v.json create mode 100644 configs/dist_infer/wan22_moe_i2v_cfg.json create mode 100644 configs/dist_infer/wan22_moe_i2v_cfg_ulysses.json create mode 100644 configs/dist_infer/wan22_moe_i2v_ulysses.json create mode 100644 configs/dist_infer/wan22_moe_t2v_cfg.json create mode 100644 configs/dist_infer/wan22_moe_t2v_cfg_ulysses.json create mode 100644 configs/dist_infer/wan22_moe_t2v_ulysses.json create mode 100644 configs/dist_infer/wan22_ti2v_i2v_cfg.json create mode 100644 configs/dist_infer/wan22_ti2v_i2v_cfg_ulysses.json create mode 100644 configs/dist_infer/wan22_ti2v_i2v_ulysses.json create mode 100644 configs/dist_infer/wan22_ti2v_t2v_cfg.json create mode 100644 configs/dist_infer/wan22_ti2v_t2v_cfg_ulysses.json create mode 100644 configs/dist_infer/wan22_ti2v_t2v_ulysses.json create mode 100644 configs/dist_infer/wan_i2v_dist_cfg_ulysses.json create mode 100644 configs/dist_infer/wan_i2v_dist_ring.json create mode 100644 configs/dist_infer/wan_i2v_dist_ulysses.json create mode 100644 configs/dist_infer/wan_t2v_dist_cfg.json create mode 100644 configs/dist_infer/wan_t2v_dist_cfg_ring.json create mode 100644 configs/dist_infer/wan_t2v_dist_cfg_ulysses.json create mode 100644 configs/dist_infer/wan_t2v_dist_ring.json create mode 100644 configs/dist_infer/wan_t2v_dist_ulysses.json create mode 100644 configs/distill/wan_i2v_distill_4step_cfg.json create mode 100644 configs/distill/wan_i2v_distill_4step_cfg_4090.json create mode 100644 configs/distill/wan_i2v_distill_4step_cfg_4090_lora.json create mode 100644 configs/distill/wan_i2v_distill_4step_cfg_lora.json create mode 100644 configs/distill/wan_t2v_distill_4step_cfg.json create mode 100644 configs/distill/wan_t2v_distill_4step_cfg_4090.json create mode 100644 configs/distill/wan_t2v_distill_4step_cfg_dynamic.json create mode 100644 configs/distill/wan_t2v_distill_4step_cfg_lora.json create mode 100644 configs/distill/wan_t2v_distill_4step_cfg_lora_4090.json create mode 100644 configs/hunyuan_video_15/4090/hy15_t2v_480p_bf16.json create mode 100644 configs/hunyuan_video_15/4090/hy15_t2v_480p_bf16_dist.json create mode 100644 configs/hunyuan_video_15/4090/hy15_t2v_480p_fp8.json create mode 100644 configs/hunyuan_video_15/5090/hy15_t2v_480p_bf16.json create mode 100644 configs/hunyuan_video_15/5090/hy15_t2v_480p_bf16_dist.json create mode 100644 configs/hunyuan_video_15/5090/hy15_t2v_480p_fp8.json create mode 100644 configs/hunyuan_video_15/cache/hy_15_i2v_480p_magcache.json create mode 100644 configs/hunyuan_video_15/cache/hy_15_i2v_480p_magcache_calibration.json create mode 100644 configs/hunyuan_video_15/cache/hy_15_i2v_480p_teacache.json create mode 100644 configs/hunyuan_video_15/cache/hy_15_i2v_720p_teacache.json create mode 100644 configs/hunyuan_video_15/cache/hy_15_t2v_480p_teacache.json create mode 100644 configs/hunyuan_video_15/cache/hy_15_t2v_720p_teacache.json create mode 100644 configs/hunyuan_video_15/fp8comm/hy15_i2v_480p_int8_offload_dist_fp8_comm.json create mode 100644 configs/hunyuan_video_15/hunyuan_video_i2v_480p.json create mode 100644 configs/hunyuan_video_15/hunyuan_video_i2v_720p.json create mode 100644 configs/hunyuan_video_15/hunyuan_video_i2v_720p_cfg_distilled.json create mode 100644 configs/hunyuan_video_15/hunyuan_video_t2v_480p.json create mode 100644 configs/hunyuan_video_15/hunyuan_video_t2v_480p_distill.json create mode 100644 configs/hunyuan_video_15/hunyuan_video_t2v_720p.json create mode 100644 configs/hunyuan_video_15/lightae/hy15_t2v_480p_bf16.json create mode 100644 configs/hunyuan_video_15/offload/hy15_t2v_480p_bf16.json create mode 100644 configs/hunyuan_video_15/quant/hy15_t2v_480p_fp8.json create mode 100644 configs/hunyuan_video_15/vsr/hy15_i2v_480p.json create mode 100644 configs/matrix_game2/matrix_game2_gta_drive.json create mode 100644 configs/matrix_game2/matrix_game2_gta_drive_streaming.json create mode 100644 configs/matrix_game2/matrix_game2_templerun.json create mode 100644 configs/matrix_game2/matrix_game2_templerun_streaming.json create mode 100644 configs/matrix_game2/matrix_game2_universal.json create mode 100644 configs/matrix_game2/matrix_game2_universal_streaming.json create mode 100644 configs/model_pipeline.json create mode 100644 configs/offload/block/qwen_image_i2i_2509_block.json create mode 100644 configs/offload/block/qwen_image_i2i_block.json create mode 100644 configs/offload/block/qwen_image_t2i_block.json create mode 100644 configs/offload/block/wan_i2v_block.json create mode 100644 configs/offload/block/wan_t2v_1_3b.json create mode 100644 configs/offload/block/wan_t2v_block.json create mode 100644 configs/offload/disk/wan_i2v_phase_lazy_load_480p.json create mode 100644 configs/offload/disk/wan_i2v_phase_lazy_load_720p.json create mode 100644 configs/offload/phase/wan_i2v_phase.json create mode 100644 configs/offload/phase/wan_t2v_phase.json create mode 100644 configs/quantization/gguf/wan_i2v_q4_k.json create mode 100644 configs/quantization/wan_i2v.json create mode 100644 configs/quantization/wan_i2v_q8f.json create mode 100644 configs/quantization/wan_i2v_torchao.json create mode 100644 configs/qwen_image/qwen_image_i2i.json create mode 100644 configs/qwen_image/qwen_image_i2i_2509.json create mode 100644 configs/qwen_image/qwen_image_i2i_2509_quant.json create mode 100644 configs/qwen_image/qwen_image_i2i_lora.json create mode 100644 configs/qwen_image/qwen_image_t2i.json create mode 100644 configs/seko_talk/5090/seko_talk_5090_bf16.json create mode 100644 configs/seko_talk/5090/seko_talk_5090_int8.json create mode 100644 configs/seko_talk/5090/seko_talk_5090_int8_8gpu.json create mode 100644 configs/seko_talk/A800/seko_talk_A800_int8.json create mode 100644 configs/seko_talk/A800/seko_talk_A800_int8_dist_2gpu.json create mode 100644 configs/seko_talk/A800/seko_talk_A800_int8_dist_4gpu.json create mode 100644 configs/seko_talk/A800/seko_talk_A800_int8_dist_8gpu.json create mode 100644 configs/seko_talk/L40s/1gpu/seko_talk_bf16.json create mode 100644 configs/seko_talk/L40s/1gpu/seko_talk_fp8.json create mode 100644 configs/seko_talk/L40s/2gpu/seko_talk_bf16.json create mode 100644 configs/seko_talk/L40s/2gpu/seko_talk_fp8.json create mode 100644 configs/seko_talk/L40s/4gpu/seko_talk_bf16.json create mode 100644 configs/seko_talk/L40s/4gpu/seko_talk_fp8.json create mode 100644 configs/seko_talk/L40s/8gpu/seko_talk_bf16.json create mode 100644 configs/seko_talk/L40s/8gpu/seko_talk_fp8.json create mode 100644 configs/seko_talk/mlu/seko_talk_bf16.json create mode 100644 configs/seko_talk/mlu/seko_talk_int8.json create mode 100644 configs/seko_talk/mlu/seko_talk_int8_dist.json create mode 100644 configs/seko_talk/multi_person/01_base.json create mode 100644 configs/seko_talk/multi_person/02_base_fp8.json create mode 100644 configs/seko_talk/multi_person/03_dist.json create mode 100644 configs/seko_talk/multi_person/04_dist_fp8.json create mode 100644 configs/seko_talk/multi_person/15_base_compile.json create mode 100644 configs/seko_talk/seko_talk_01_base.json create mode 100644 configs/seko_talk/seko_talk_02_fp8.json create mode 100644 configs/seko_talk/seko_talk_03_dist.json create mode 100644 configs/seko_talk/seko_talk_04_fp8_dist.json create mode 100644 configs/seko_talk/seko_talk_05_offload_fp8_4090.json create mode 100644 configs/seko_talk/seko_talk_05_offload_fp8_4090_dist.json create mode 100644 configs/seko_talk/seko_talk_06_offload_fp8_H100.json create mode 100644 configs/seko_talk/seko_talk_07_dist_offload.json create mode 100644 configs/seko_talk/seko_talk_08_5B_base.json create mode 100644 configs/seko_talk/seko_talk_09_base_fixed_min_area.json create mode 100644 configs/seko_talk/seko_talk_10_fp8_dist_fixed_min_area.json create mode 100644 configs/seko_talk/seko_talk_11_fp8_dist_fixed_shape.json create mode 100644 configs/seko_talk/seko_talk_12_fp8_dist_fixed_shape_8gpus_1s.json create mode 100644 configs/seko_talk/seko_talk_13_fp8_dist_bucket_shape_8gpus_5s_realtime.json create mode 100644 configs/seko_talk/seko_talk_14_fp8_dist_bucket_shape_8gpus_1s_realtime.json create mode 100644 configs/seko_talk/seko_talk_15_base_compile.json create mode 100644 configs/seko_talk/seko_talk_16_fp8_dist_compile.json create mode 100644 configs/seko_talk/seko_talk_17_base_vsr.json create mode 100644 configs/seko_talk/seko_talk_22_nbhd_attn.json create mode 100644 configs/seko_talk/seko_talk_23_fp8_dist_nbhd_attn.json create mode 100644 configs/seko_talk/seko_talk_24_fp8_dist_compile_nbhd_attn.json create mode 100644 configs/seko_talk/seko_talk_25_int8_dist_fp8_comm.json create mode 100644 configs/seko_talk/seko_talk_28_f2v.json create mode 100644 configs/self_forcing/wan_t2v_sf.json create mode 100644 configs/sparse_attn/spas_sage_attn/wan_i2v.json create mode 100644 configs/sparse_attn/spas_sage_attn/wan_t2v.json create mode 100644 configs/video_frame_interpolation/wan_t2v.json create mode 100644 configs/volcengine_voices_list.json create mode 100644 configs/wan/wan_flf2v.json create mode 100644 configs/wan/wan_i2v.json create mode 100644 configs/wan/wan_t2v.json create mode 100644 configs/wan/wan_t2v_enhancer.json create mode 100644 configs/wan/wan_vace.json create mode 100644 configs/wan22/wan_animate.json create mode 100644 configs/wan22/wan_animate_4090.json create mode 100644 configs/wan22/wan_animate_lora.json create mode 100644 configs/wan22/wan_animate_replace.json create mode 100644 configs/wan22/wan_animate_replace_4090.json create mode 100644 configs/wan22/wan_distill_moe_flf2v.json create mode 100644 configs/wan22/wan_distill_moe_flf2v_fp8.json create mode 100644 configs/wan22/wan_distill_moe_flf2v_int8.json create mode 100644 configs/wan22/wan_distill_moe_flf2v_with_lora.json create mode 100644 configs/wan22/wan_moe_flf2v.json create mode 100644 configs/wan22/wan_moe_i2v.json create mode 100644 configs/wan22/wan_moe_i2v_4090.json create mode 100644 configs/wan22/wan_moe_i2v_audio.json create mode 100644 configs/wan22/wan_moe_i2v_distill.json create mode 100644 configs/wan22/wan_moe_i2v_distill_4090.json create mode 100644 configs/wan22/wan_moe_i2v_distill_5090.json create mode 100644 configs/wan22/wan_moe_i2v_distill_quant.json create mode 100644 configs/wan22/wan_moe_i2v_distill_with_lora.json create mode 100644 configs/wan22/wan_moe_t2v.json create mode 100644 configs/wan22/wan_moe_t2v_distill.json create mode 100644 configs/wan22/wan_ti2v_i2v.json create mode 100644 configs/wan22/wan_ti2v_i2v_4090.json create mode 100644 configs/wan22/wan_ti2v_t2v.json create mode 100644 configs/wan22/wan_ti2v_t2v_4090.json create mode 100644 dockerfiles/Dockerfile create mode 100644 dockerfiles/Dockerfile_5090 create mode 100644 dockerfiles/Dockerfile_cambricon_mlu590 create mode 100644 dockerfiles/Dockerfile_cu124 create mode 100644 dockerfiles/Dockerfile_deploy create mode 100644 docs/EN/.readthedocs.yaml create mode 100644 docs/EN/Makefile create mode 100644 docs/EN/make.bat create mode 100644 docs/EN/source/conf.py create mode 100644 docs/EN/source/deploy_guides/deploy_comfyui.md create mode 100644 docs/EN/source/deploy_guides/deploy_gradio.md create mode 100644 docs/EN/source/deploy_guides/deploy_local_windows.md create mode 100644 docs/EN/source/deploy_guides/deploy_service.md create mode 100644 docs/EN/source/deploy_guides/for_low_latency.md create mode 100644 docs/EN/source/deploy_guides/for_low_resource.md create mode 100644 docs/EN/source/deploy_guides/lora_deploy.md create mode 100644 docs/EN/source/getting_started/benchmark.md create mode 100644 docs/EN/source/getting_started/benchmark_source.md create mode 100644 docs/EN/source/getting_started/model_structure.md create mode 100644 docs/EN/source/getting_started/quickstart.md create mode 100644 docs/EN/source/index.rst create mode 100644 docs/EN/source/method_tutorials/attention.md create mode 100644 docs/EN/source/method_tutorials/autoregressive_distill.md create mode 100644 docs/EN/source/method_tutorials/cache.md create mode 100644 docs/EN/source/method_tutorials/cache_source.md create mode 100644 docs/EN/source/method_tutorials/changing_resolution.md create mode 100644 docs/EN/source/method_tutorials/offload.md create mode 100644 docs/EN/source/method_tutorials/parallel.md create mode 100644 docs/EN/source/method_tutorials/quantization.md create mode 100644 docs/EN/source/method_tutorials/step_distill.md create mode 100644 docs/EN/source/method_tutorials/video_frame_interpolation.md create mode 100644 docs/PAPERS_ZH_CN/.readthedocs.yaml create mode 100644 docs/PAPERS_ZH_CN/Makefile create mode 100644 docs/PAPERS_ZH_CN/make.bat create mode 100644 docs/PAPERS_ZH_CN/source/conf.py create mode 100644 docs/PAPERS_ZH_CN/source/index.rst create mode 100644 docs/PAPERS_ZH_CN/source/papers/RL.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/attention.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/autoregressive.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/cache.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/changing_resolution.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/generation_basics.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/models.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/offload.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/parallel.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/prompt_enhance.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/quantization.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/step_distill.md create mode 100644 docs/PAPERS_ZH_CN/source/papers/vae.md create mode 100644 docs/ZH_CN/.readthedocs.yaml create mode 100644 docs/ZH_CN/Makefile create mode 100644 docs/ZH_CN/make.bat create mode 100644 docs/ZH_CN/source/conf.py create mode 100644 docs/ZH_CN/source/deploy_guides/deploy_comfyui.md create mode 100644 docs/ZH_CN/source/deploy_guides/deploy_gradio.md create mode 100644 docs/ZH_CN/source/deploy_guides/deploy_local_windows.md create mode 100644 docs/ZH_CN/source/deploy_guides/deploy_service.md create mode 100644 docs/ZH_CN/source/deploy_guides/for_low_latency.md create mode 100644 docs/ZH_CN/source/deploy_guides/for_low_resource.md create mode 100644 docs/ZH_CN/source/deploy_guides/lora_deploy.md create mode 100644 docs/ZH_CN/source/getting_started/benchmark.md create mode 100644 docs/ZH_CN/source/getting_started/benchmark_source.md create mode 100644 docs/ZH_CN/source/getting_started/model_structure.md create mode 100644 docs/ZH_CN/source/getting_started/quickstart.md create mode 100644 docs/ZH_CN/source/index.rst create mode 100644 docs/ZH_CN/source/method_tutorials/attention.md create mode 100644 docs/ZH_CN/source/method_tutorials/autoregressive_distill.md create mode 100644 docs/ZH_CN/source/method_tutorials/cache.md create mode 100644 docs/ZH_CN/source/method_tutorials/cache_source.md create mode 100644 docs/ZH_CN/source/method_tutorials/changing_resolution.md create mode 100644 docs/ZH_CN/source/method_tutorials/offload.md create mode 100644 docs/ZH_CN/source/method_tutorials/parallel.md create mode 100644 docs/ZH_CN/source/method_tutorials/quantization.md create mode 100644 docs/ZH_CN/source/method_tutorials/step_distill.md create mode 100644 docs/ZH_CN/source/method_tutorials/video_frame_interpolation.md create mode 100644 examples/README.md create mode 100644 examples/README_zh.md create mode 100644 examples/hunyuan_video/hunyuan_i2v.py create mode 100644 examples/hunyuan_video/hunyuan_t2v.py create mode 100644 examples/hunyuan_video/hunyuan_t2v_distill.py create mode 100644 examples/wan/wan_animate.py create mode 100644 examples/wan/wan_flf2v.py create mode 100644 examples/wan/wan_i2v.py create mode 100644 examples/wan/wan_i2v_distilled.py create mode 100644 examples/wan/wan_i2v_with_distill_loras.py create mode 100644 examples/wan/wan_t2v.py create mode 100644 examples/wan/wan_vace.py create mode 100644 lightx2v/__init__.py create mode 100644 lightx2v/common/__init__.py create mode 100644 lightx2v/common/modules/__init__.py create mode 100644 lightx2v/common/modules/weight_module.py create mode 100644 lightx2v/common/offload/manager.py create mode 100644 lightx2v/common/ops/__init__.py create mode 100644 lightx2v/common/ops/attn/__init__.py create mode 100644 lightx2v/common/ops/attn/flash_attn.py create mode 100644 lightx2v/common/ops/attn/nbhd_attn.py create mode 100644 lightx2v/common/ops/attn/radial_attn.py create mode 100644 lightx2v/common/ops/attn/ring_attn.py create mode 100644 lightx2v/common/ops/attn/sage_attn.py create mode 100644 lightx2v/common/ops/attn/spassage_attn.py create mode 100644 lightx2v/common/ops/attn/svg2_attn.py create mode 100644 lightx2v/common/ops/attn/svg2_attn_utils.py create mode 100644 lightx2v/common/ops/attn/svg_attn.py create mode 100644 lightx2v/common/ops/attn/template.py create mode 100644 lightx2v/common/ops/attn/torch_sdpa.py create mode 100644 lightx2v/common/ops/attn/ulysses_attn.py create mode 100644 lightx2v/common/ops/attn/utils/all2all.py create mode 100644 lightx2v/common/ops/attn/utils/ring_comm.py create mode 100644 lightx2v/common/ops/conv/__init__.py create mode 100644 lightx2v/common/ops/conv/conv2d.py create mode 100644 lightx2v/common/ops/conv/conv3d.py create mode 100644 lightx2v/common/ops/embedding/__init__.py create mode 100644 lightx2v/common/ops/embedding/embedding_weight.py create mode 100644 lightx2v/common/ops/mm/__init__.py create mode 100644 lightx2v/common/ops/mm/mm_weight.py create mode 100644 lightx2v/common/ops/norm/__init__.py create mode 100644 lightx2v/common/ops/norm/layer_norm_weight.py create mode 100644 lightx2v/common/ops/norm/rms_norm_weight.py create mode 100644 lightx2v/common/ops/norm/triton_ops.py create mode 100644 lightx2v/common/ops/tensor/__init__.py create mode 100644 lightx2v/common/ops/tensor/tensor.py create mode 100644 lightx2v/common/transformer_infer/transformer_infer.py create mode 100644 lightx2v/deploy/__init__.py create mode 100644 lightx2v/deploy/common/__init__.py create mode 100644 lightx2v/deploy/common/aliyun.py create mode 100644 lightx2v/deploy/common/audio_separator.py create mode 100644 lightx2v/deploy/common/face_detector.py create mode 100644 lightx2v/deploy/common/pipeline.py create mode 100644 lightx2v/deploy/common/podcasts.py create mode 100644 lightx2v/deploy/common/utils.py create mode 100644 lightx2v/deploy/common/va_controller.py create mode 100644 lightx2v/deploy/common/va_reader.py create mode 100644 lightx2v/deploy/common/va_reader_omni.py create mode 100644 lightx2v/deploy/common/va_recorder.py create mode 100644 lightx2v/deploy/common/va_recorder_x264.py create mode 100644 lightx2v/deploy/common/video_recorder.py create mode 100644 lightx2v/deploy/common/volcengine_tts.py create mode 100644 lightx2v/deploy/data_manager/__init__.py create mode 100644 lightx2v/deploy/data_manager/local_data_manager.py create mode 100644 lightx2v/deploy/data_manager/s3_data_manager.py create mode 100644 lightx2v/deploy/queue_manager/__init__.py create mode 100644 lightx2v/deploy/queue_manager/local_queue_manager.py create mode 100644 lightx2v/deploy/queue_manager/rabbitmq_queue_manager.py create mode 100644 lightx2v/deploy/server/__init__.py create mode 100644 lightx2v/deploy/server/__main__.py create mode 100644 lightx2v/deploy/server/auth.py create mode 100644 lightx2v/deploy/server/frontend/.gitignore create mode 100644 lightx2v/deploy/server/frontend/README.md create mode 100644 lightx2v/deploy/server/frontend/index.html create mode 100644 lightx2v/deploy/server/frontend/package-lock.json create mode 100644 lightx2v/deploy/server/frontend/package.json create mode 100644 lightx2v/deploy/server/frontend/public/cover.png create mode 100644 lightx2v/deploy/server/frontend/public/female.svg create mode 100644 lightx2v/deploy/server/frontend/public/logo.svg create mode 100644 lightx2v/deploy/server/frontend/public/logo_black.png create mode 100644 lightx2v/deploy/server/frontend/public/logo_black.svg create mode 100644 lightx2v/deploy/server/frontend/public/male.svg create mode 100644 lightx2v/deploy/server/frontend/public/robots.txt create mode 100644 lightx2v/deploy/server/frontend/public/sitemap.xml create mode 100644 lightx2v/deploy/server/frontend/public/vite.svg create mode 100644 lightx2v/deploy/server/frontend/src/App.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Alert.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/AudioPreviewTest.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Confirm.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/DropdownMenu.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/FloatingParticles.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Generate.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Inspirations.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/LeftBar.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Loading.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/LoginCard.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/MediaTemplate.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/ModelDropdown.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Projects.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/PromptTemplate.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/SiteFooter.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/TaskCarousel.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/TaskDetails.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/TemplateDetails.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/TemplateDisplay.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/TopBar.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/VoiceSelector.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/VoiceTtsHistoryPanel.vue create mode 100644 lightx2v/deploy/server/frontend/src/components/Voice_tts.vue create mode 100644 lightx2v/deploy/server/frontend/src/locales/en.json create mode 100644 lightx2v/deploy/server/frontend/src/locales/zh.json create mode 100644 lightx2v/deploy/server/frontend/src/main.js create mode 100644 lightx2v/deploy/server/frontend/src/router/index.js create mode 100644 lightx2v/deploy/server/frontend/src/style.css create mode 100644 lightx2v/deploy/server/frontend/src/utils/i18n.js create mode 100644 lightx2v/deploy/server/frontend/src/utils/other.js create mode 100644 lightx2v/deploy/server/frontend/src/views/404.vue create mode 100644 lightx2v/deploy/server/frontend/src/views/Layout.vue create mode 100644 lightx2v/deploy/server/frontend/src/views/Login.vue create mode 100644 lightx2v/deploy/server/frontend/src/views/PodcastGenerate.vue create mode 100644 lightx2v/deploy/server/frontend/src/views/Share.vue create mode 100644 lightx2v/deploy/server/frontend/vite.config.js create mode 100644 lightx2v/deploy/server/metrics.py create mode 100644 lightx2v/deploy/server/monitor.py create mode 100644 lightx2v/deploy/server/redis_client.py create mode 100644 lightx2v/deploy/server/redis_monitor.py create mode 120000 lightx2v/deploy/server/static/assets create mode 100644 lightx2v/deploy/server/static/icon/logoblack.png create mode 100644 lightx2v/deploy/server/static/icon/seko_logo.svg create mode 100644 lightx2v/deploy/server/static/icon/seko_logo_nobg.png create mode 100644 lightx2v/deploy/server/static/icon/seko_logo_white.svg create mode 120000 lightx2v/deploy/server/static/index.html create mode 100644 lightx2v/deploy/server/static/index_old.html create mode 100644 lightx2v/deploy/task_manager/__init__.py create mode 100644 lightx2v/deploy/task_manager/local_task_manager.py create mode 100644 lightx2v/deploy/task_manager/sql_task_manager.py create mode 100644 lightx2v/deploy/worker/__init__.py create mode 100644 lightx2v/deploy/worker/__main__.py create mode 100644 lightx2v/deploy/worker/hub.py create mode 100644 lightx2v/infer.py create mode 100644 lightx2v/models/__init__.py create mode 100644 lightx2v/models/input_encoders/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/animate/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/animate/face_encoder.py create mode 100644 lightx2v/models/input_encoders/hf/animate/motion_encoder.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/byt5/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/byt5/format_prompt.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/byt5/model.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/qwen25/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/qwen25/model.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/siglip/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/hunyuan15/siglip/model.py create mode 100644 lightx2v/models/input_encoders/hf/q_linear.py create mode 100644 lightx2v/models/input_encoders/hf/qwen25/qwen25_vlforconditionalgeneration.py create mode 100644 lightx2v/models/input_encoders/hf/seko_audio/audio_adapter.py create mode 100644 lightx2v/models/input_encoders/hf/seko_audio/audio_encoder.py create mode 100644 lightx2v/models/input_encoders/hf/vace/vace_processor.py create mode 100644 lightx2v/models/input_encoders/hf/wan/matrix_game2/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/wan/matrix_game2/clip.py create mode 100644 lightx2v/models/input_encoders/hf/wan/matrix_game2/conditions.py create mode 100644 lightx2v/models/input_encoders/hf/wan/matrix_game2/tokenizers.py create mode 100644 lightx2v/models/input_encoders/hf/wan/t5/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/wan/t5/model.py create mode 100644 lightx2v/models/input_encoders/hf/wan/t5/tokenizer.py create mode 100644 lightx2v/models/input_encoders/hf/wan/xlm_roberta/__init__.py create mode 100644 lightx2v/models/input_encoders/hf/wan/xlm_roberta/model.py create mode 100644 lightx2v/models/networks/__init__.py create mode 100644 lightx2v/models/networks/hunyuan_video/__init__.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/attn_no_pad.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/feature_caching/__init__.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/feature_caching/transformer_infer.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/module_io.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/offload/__init__.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/offload/transformer_infer.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/post_infer.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/pre_infer.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/transformer_infer.py create mode 100644 lightx2v/models/networks/hunyuan_video/infer/triton_ops.py create mode 100644 lightx2v/models/networks/hunyuan_video/model.py create mode 100644 lightx2v/models/networks/hunyuan_video/weights/post_weights.py create mode 100644 lightx2v/models/networks/hunyuan_video/weights/pre_weights.py create mode 100644 lightx2v/models/networks/hunyuan_video/weights/transformer_weights.py create mode 100644 lightx2v/models/networks/qwen_image/infer/offload/__init__.py create mode 100644 lightx2v/models/networks/qwen_image/infer/offload/transformer_infer.py create mode 100644 lightx2v/models/networks/qwen_image/infer/post_infer.py create mode 100644 lightx2v/models/networks/qwen_image/infer/pre_infer.py create mode 100644 lightx2v/models/networks/qwen_image/infer/transformer_infer.py create mode 100644 lightx2v/models/networks/qwen_image/lora_adapter.py create mode 100644 lightx2v/models/networks/qwen_image/model.py create mode 100644 lightx2v/models/networks/qwen_image/weights/post_weights.py create mode 100644 lightx2v/models/networks/qwen_image/weights/pre_weights.py create mode 100644 lightx2v/models/networks/qwen_image/weights/transformer_weights.py create mode 100644 lightx2v/models/networks/wan/animate_model.py create mode 100644 lightx2v/models/networks/wan/audio_model.py create mode 100644 lightx2v/models/networks/wan/causvid_model.py create mode 100644 lightx2v/models/networks/wan/distill_model.py create mode 100644 lightx2v/models/networks/wan/infer/animate/pre_infer.py create mode 100644 lightx2v/models/networks/wan/infer/animate/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/audio/post_infer.py create mode 100644 lightx2v/models/networks/wan/infer/audio/pre_infer.py create mode 100644 lightx2v/models/networks/wan/infer/audio/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/causvid/__init__.py create mode 100644 lightx2v/models/networks/wan/infer/causvid/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/feature_caching/__init__.py create mode 100644 lightx2v/models/networks/wan/infer/feature_caching/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/matrix_game2/posemb_layers.py create mode 100644 lightx2v/models/networks/wan/infer/matrix_game2/pre_infer.py create mode 100644 lightx2v/models/networks/wan/infer/matrix_game2/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/module_io.py create mode 100644 lightx2v/models/networks/wan/infer/offload/__init__.py create mode 100644 lightx2v/models/networks/wan/infer/offload/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/post_infer.py create mode 100644 lightx2v/models/networks/wan/infer/pre_infer.py create mode 100644 lightx2v/models/networks/wan/infer/self_forcing/__init__.py create mode 100644 lightx2v/models/networks/wan/infer/self_forcing/pre_infer.py create mode 100644 lightx2v/models/networks/wan/infer/self_forcing/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/infer/triton_ops.py create mode 100644 lightx2v/models/networks/wan/infer/utils.py create mode 100644 lightx2v/models/networks/wan/infer/vace/transformer_infer.py create mode 100644 lightx2v/models/networks/wan/lora_adapter.py create mode 100644 lightx2v/models/networks/wan/matrix_game2_model.py create mode 100644 lightx2v/models/networks/wan/model.py create mode 100644 lightx2v/models/networks/wan/sf_model.py create mode 100644 lightx2v/models/networks/wan/vace_model.py create mode 100644 lightx2v/models/networks/wan/weights/animate/transformer_weights.py create mode 100644 lightx2v/models/networks/wan/weights/audio/transformer_weights.py create mode 100644 lightx2v/models/networks/wan/weights/matrix_game2/pre_weights.py create mode 100644 lightx2v/models/networks/wan/weights/matrix_game2/transformer_weights.py create mode 100644 lightx2v/models/networks/wan/weights/post_weights.py create mode 100644 lightx2v/models/networks/wan/weights/pre_weights.py create mode 100644 lightx2v/models/networks/wan/weights/transformer_weights.py create mode 100644 lightx2v/models/networks/wan/weights/vace/transformer_weights.py create mode 100644 lightx2v/models/runners/__init__.py create mode 100644 lightx2v/models/runners/base_runner.py create mode 100644 lightx2v/models/runners/default_runner.py create mode 100644 lightx2v/models/runners/hunyuan_video/hunyuan_video_15_distill_runner.py create mode 100644 lightx2v/models/runners/hunyuan_video/hunyuan_video_15_runner.py create mode 100644 lightx2v/models/runners/qwen_image/qwen_image_runner.py create mode 100644 lightx2v/models/runners/vsr/utils/TCDecoder.py create mode 100644 lightx2v/models/runners/vsr/utils/utils.py create mode 100644 lightx2v/models/runners/vsr/vsr_wrapper.py create mode 100644 lightx2v/models/runners/vsr/vsr_wrapper_hy15.py create mode 100644 lightx2v/models/runners/wan/__init__.py create mode 100644 lightx2v/models/runners/wan/wan_animate_runner.py create mode 100644 lightx2v/models/runners/wan/wan_audio_runner.py create mode 100644 lightx2v/models/runners/wan/wan_distill_runner.py create mode 100644 lightx2v/models/runners/wan/wan_matrix_game2_runner.py create mode 100644 lightx2v/models/runners/wan/wan_runner.py create mode 100644 lightx2v/models/runners/wan/wan_sf_runner.py create mode 100644 lightx2v/models/runners/wan/wan_vace_runner.py create mode 100644 lightx2v/models/schedulers/__init__.py create mode 100644 lightx2v/models/schedulers/hunyuan_video/__init__.py create mode 100644 lightx2v/models/schedulers/hunyuan_video/feature_caching/__init__.py create mode 100644 lightx2v/models/schedulers/hunyuan_video/feature_caching/scheduler.py create mode 100644 lightx2v/models/schedulers/hunyuan_video/posemb_layers.py create mode 100644 lightx2v/models/schedulers/hunyuan_video/scheduler.py create mode 100644 lightx2v/models/schedulers/hunyuan_video/step_distill/scheduler.py create mode 100644 lightx2v/models/schedulers/qwen_image/scheduler.py create mode 100644 lightx2v/models/schedulers/scheduler.py create mode 100644 lightx2v/models/schedulers/wan/audio/scheduler.py create mode 100644 lightx2v/models/schedulers/wan/changing_resolution/scheduler.py create mode 100644 lightx2v/models/schedulers/wan/feature_caching/scheduler.py create mode 100644 lightx2v/models/schedulers/wan/scheduler.py create mode 100644 lightx2v/models/schedulers/wan/self_forcing/scheduler.py create mode 100644 lightx2v/models/schedulers/wan/step_distill/scheduler.py create mode 100644 lightx2v/models/vfi/rife/model/loss.py create mode 100644 lightx2v/models/vfi/rife/model/pytorch_msssim/__init__.py create mode 100644 lightx2v/models/vfi/rife/model/warplayer.py create mode 100644 lightx2v/models/vfi/rife/rife_comfyui_wrapper.py create mode 100644 lightx2v/models/vfi/rife/train_log/IFNet_HDv3.py create mode 100644 lightx2v/models/vfi/rife/train_log/RIFE_HDv3.py create mode 100644 lightx2v/models/vfi/rife/train_log/refine.py create mode 100644 lightx2v/models/video_encoders/__init__.py create mode 100644 lightx2v/models/video_encoders/hf/__init__.py create mode 100644 lightx2v/models/video_encoders/hf/hunyuanvideo15/__init__.py create mode 100644 lightx2v/models/video_encoders/hf/hunyuanvideo15/hunyuanvideo_15_vae.py create mode 100644 lightx2v/models/video_encoders/hf/hunyuanvideo15/lighttae_hy15.py create mode 100644 lightx2v/models/video_encoders/hf/qwen_image/__init__.py create mode 100644 lightx2v/models/video_encoders/hf/qwen_image/vae.py create mode 100644 lightx2v/models/video_encoders/hf/tae.py create mode 100644 lightx2v/models/video_encoders/hf/vid_recon.py create mode 100644 lightx2v/models/video_encoders/hf/wan/__init__.py create mode 100644 lightx2v/models/video_encoders/hf/wan/vae.py create mode 100644 lightx2v/models/video_encoders/hf/wan/vae_2_2.py create mode 100644 lightx2v/models/video_encoders/hf/wan/vae_sf.py create mode 100644 lightx2v/models/video_encoders/hf/wan/vae_tiny.py create mode 100644 lightx2v/pipeline.py create mode 100644 lightx2v/server/README.md create mode 100644 lightx2v/server/__init__.py create mode 100644 lightx2v/server/__main__.py create mode 100644 lightx2v/server/api/__init__.py create mode 100644 lightx2v/server/api/deps.py create mode 100644 lightx2v/server/api/files.py create mode 100644 lightx2v/server/api/router.py create mode 100644 lightx2v/server/api/server.py create mode 100644 lightx2v/server/api/service_routes.py create mode 100644 lightx2v/server/api/tasks/__init__.py create mode 100644 lightx2v/server/api/tasks/common.py create mode 100644 lightx2v/server/api/tasks/image.py create mode 100644 lightx2v/server/api/tasks/video.py create mode 100644 lightx2v/server/config.py create mode 100644 lightx2v/server/main.py create mode 100644 lightx2v/server/media/__init__.py create mode 100644 lightx2v/server/media/audio.py create mode 100644 lightx2v/server/media/base.py create mode 100644 lightx2v/server/media/image.py create mode 100644 lightx2v/server/metrics/__init__.py create mode 100644 lightx2v/server/metrics/metrics.py create mode 100644 lightx2v/server/metrics/monitor.py create mode 100644 lightx2v/server/schema.py create mode 100644 lightx2v/server/services/__init__.py create mode 100644 lightx2v/server/services/distributed_utils.py create mode 100644 lightx2v/server/services/file_service.py create mode 100644 lightx2v/server/services/generation/__init__.py create mode 100644 lightx2v/server/services/generation/base.py create mode 100644 lightx2v/server/services/generation/image.py create mode 100644 lightx2v/server/services/generation/video.py create mode 100644 lightx2v/server/services/inference/__init__.py create mode 100644 lightx2v/server/services/inference/service.py create mode 100644 lightx2v/server/services/inference/worker.py create mode 100644 lightx2v/server/task_manager.py create mode 100644 lightx2v/utils/__init__.py create mode 100644 lightx2v/utils/async_io.py create mode 100644 lightx2v/utils/custom_compiler.py create mode 100644 lightx2v/utils/envs.py create mode 100644 lightx2v/utils/generate_task_id.py create mode 100644 lightx2v/utils/ggml_tensor.py create mode 100644 lightx2v/utils/global_paras.py create mode 100644 lightx2v/utils/input_info.py create mode 100644 lightx2v/utils/lockable_dict.py create mode 100644 lightx2v/utils/memory_profiler.py create mode 100644 lightx2v/utils/print_atten_score.py create mode 100644 lightx2v/utils/profiler.py create mode 100644 lightx2v/utils/prompt_enhancer.py create mode 100644 lightx2v/utils/quant_utils.py create mode 100644 lightx2v/utils/registry_factory.py create mode 100644 lightx2v/utils/service_utils.py create mode 100644 lightx2v/utils/set_config.py create mode 100644 lightx2v/utils/utils.py create mode 100644 lightx2v_kernel/CMakeLists.txt create mode 100644 lightx2v_kernel/LICENSE create mode 100644 lightx2v_kernel/README.md create mode 100644 lightx2v_kernel/cmake/utils.cmake create mode 100644 lightx2v_kernel/csrc/common_extension.cc create mode 100644 lightx2v_kernel/csrc/gemm/mxfp4_quant_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/mxfp4_scaled_mm_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/mxfp6_mxfp8_scaled_mm_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/mxfp6_quant_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/mxfp8_quant_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/mxfp8_scaled_mm_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/nvfp4_quant_kernels_sm120.cu create mode 100644 lightx2v_kernel/csrc/gemm/nvfp4_scaled_mm_kernels_sm120.cu create mode 100644 lightx2v_kernel/docs/en_US/mx_formats_quantization_basics.md create mode 100644 lightx2v_kernel/docs/en_US/nvfp4_quantization_basics.md create mode 100644 "lightx2v_kernel/docs/zh_CN/mx_formats\351\207\217\345\214\226\345\237\272\347\241\200.md" create mode 100644 "lightx2v_kernel/docs/zh_CN/nvfp4\351\207\217\345\214\226\345\237\272\347\241\200.md" create mode 100644 lightx2v_kernel/include/lightx2v_kernel_ops.h create mode 100644 lightx2v_kernel/include/utils.h create mode 100644 lightx2v_kernel/pyproject.toml create mode 100644 lightx2v_kernel/python/lightx2v_kernel/__init__.py create mode 100644 lightx2v_kernel/python/lightx2v_kernel/gemm.py create mode 100644 lightx2v_kernel/python/lightx2v_kernel/utils.py create mode 100644 lightx2v_kernel/python/lightx2v_kernel/version.py create mode 100644 lightx2v_kernel/test/mxfp4_mxfp4/test_bench.py create mode 100644 lightx2v_kernel/test/mxfp4_mxfp4/test_bench3_bias.py create mode 100644 lightx2v_kernel/test/mxfp4_mxfp4/test_mxfp4_quant.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test_bench.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test_bench3_bias.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test_fake_quant.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test_mm_tflops.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test_mxfp6_quant.py create mode 100644 lightx2v_kernel/test/mxfp6_mxfp8/test_quant_mem_utils.py create mode 100644 lightx2v_kernel/test/mxfp8_mxfp8/test_bench.py create mode 100644 lightx2v_kernel/test/mxfp8_mxfp8/test_bench3_bias.py create mode 100644 lightx2v_kernel/test/mxfp8_mxfp8/test_mm_tflops.py create mode 100644 lightx2v_kernel/test/mxfp8_mxfp8/test_mxfp8_quant.py create mode 100644 lightx2v_kernel/test/mxfp8_mxfp8/test_quant_mem_utils.py create mode 100644 lightx2v_kernel/test/nvfp4_nvfp4/fake_quant.py create mode 100644 lightx2v_kernel/test/nvfp4_nvfp4/test_bench1.py create mode 100644 lightx2v_kernel/test/nvfp4_nvfp4/test_bench2.py create mode 100644 lightx2v_kernel/test/nvfp4_nvfp4/test_bench3_bias.py create mode 100644 lightx2v_kernel/test/nvfp4_nvfp4/test_mm_tflops.py create mode 100644 lightx2v_kernel/test/nvfp4_nvfp4/test_quant_mem_utils.py create mode 100644 lightx2v_platform/__init__.py create mode 100644 lightx2v_platform/base/__init__.py create mode 100644 lightx2v_platform/base/base.py create mode 100644 lightx2v_platform/base/cambricon_mlu.py create mode 100644 lightx2v_platform/base/dcu.py create mode 100644 lightx2v_platform/base/global_var.py create mode 100644 lightx2v_platform/base/metax.py create mode 100644 lightx2v_platform/base/nvidia.py create mode 100644 lightx2v_platform/ops/__init__.py create mode 100644 lightx2v_platform/ops/attn/__init__.py create mode 100644 lightx2v_platform/ops/attn/cambricon_mlu/__init__.py create mode 100644 lightx2v_platform/ops/attn/cambricon_mlu/flash_attn.py create mode 100644 lightx2v_platform/ops/attn/cambricon_mlu/sage_attn.py create mode 100644 lightx2v_platform/ops/attn/dcu/__init__.py create mode 100644 lightx2v_platform/ops/attn/dcu/flash_attn.py create mode 100644 lightx2v_platform/ops/attn/template.py create mode 100644 lightx2v_platform/ops/mm/__init__.py create mode 100644 lightx2v_platform/ops/mm/cambricon_mlu/__init__.py create mode 100644 lightx2v_platform/ops/mm/cambricon_mlu/mm_weight.py create mode 100644 lightx2v_platform/ops/mm/cambricon_mlu/q_linear.py create mode 100644 lightx2v_platform/ops/mm/template.py create mode 100644 lightx2v_platform/ops/norm/__init__.py create mode 100644 lightx2v_platform/ops/rope/__init__.py create mode 100644 lightx2v_platform/registry_factory.py create mode 100644 lightx2v_platform/set_ai_device.py create mode 100644 lightx2v_platform/test/test_device.py create mode 100644 pyproject.toml create mode 100644 requirements-docs.txt create mode 100644 requirements.txt create mode 100644 requirements_animate.txt create mode 100644 requirements_win.txt create mode 100644 save_results/.gitkeep create mode 100644 scripts/base/base.sh create mode 100644 scripts/bench/run_lightx2v_1.sh create mode 100644 scripts/bench/run_lightx2v_2.sh create mode 100644 scripts/bench/run_lightx2v_3.sh create mode 100644 scripts/bench/run_lightx2v_3_distill.sh create mode 100644 scripts/bench/run_lightx2v_4.sh create mode 100644 scripts/bench/run_lightx2v_5.sh create mode 100644 scripts/bench/run_lightx2v_5_distill.sh create mode 100644 scripts/bench/run_lightx2v_6.sh create mode 100644 scripts/bench/run_lightx2v_6_distill.sh create mode 100644 scripts/cache/readme.md create mode 100644 scripts/cache/run_wan_i2v_dist_cfg_ulysses_mag.sh create mode 100644 scripts/cache/run_wan_i2v_mag.sh create mode 100644 scripts/cache/run_wan_i2v_mag_calibration.sh create mode 100644 scripts/cache/run_wan_i2v_tea.sh create mode 100644 scripts/cache/run_wan_t2v_dist_cfg_ulysses_mag.sh create mode 100644 scripts/cache/run_wan_t2v_mag.sh create mode 100644 scripts/cache/run_wan_t2v_mag_calibration.sh create mode 100644 scripts/cache/run_wan_t2v_tea.sh create mode 100644 scripts/changing_resolution/run_wan_i2v_changing_resolution.sh create mode 100644 scripts/changing_resolution/run_wan_t2v_changing_resolution.sh create mode 100644 scripts/dist_infer/run_wan22_moe_i2v_cfg.sh create mode 100644 scripts/dist_infer/run_wan22_moe_i2v_cfg_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_moe_i2v_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_moe_t2v_cfg.sh create mode 100644 scripts/dist_infer/run_wan22_moe_t2v_cfg_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_moe_t2v_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_ti2v_i2v_cfg.sh create mode 100644 scripts/dist_infer/run_wan22_ti2v_i2v_cfg_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_ti2v_i2v_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_ti2v_t2v_cfg.sh create mode 100644 scripts/dist_infer/run_wan22_ti2v_t2v_cfg_ulysses.sh create mode 100644 scripts/dist_infer/run_wan22_ti2v_t2v_ulysses.sh create mode 100644 scripts/dist_infer/run_wan_i2v_dist_cfg_ulysses.sh create mode 100644 scripts/dist_infer/run_wan_i2v_dist_ulysses.sh create mode 100644 scripts/dist_infer/run_wan_t2v_dist_cfg.sh create mode 100644 scripts/dist_infer/run_wan_t2v_dist_cfg_ulysses.sh create mode 100644 scripts/dist_infer/run_wan_t2v_dist_ulysses.sh create mode 100644 scripts/hunyuan_video_15/README.md create mode 100644 scripts/hunyuan_video_15/run_hy15_i2v_480p.sh create mode 100644 scripts/hunyuan_video_15/run_hy15_i2v_480p_vsr.sh create mode 100644 scripts/hunyuan_video_15/run_hy15_i2v_720p.sh create mode 100644 scripts/hunyuan_video_15/run_hy15_t2v_480p.sh create mode 100644 scripts/hunyuan_video_15/run_hy15_t2v_480p_distill.sh create mode 100644 scripts/hunyuan_video_15/run_hy15_t2v_720p.sh create mode 100644 scripts/matrix_game2/run_matrix_game2_gta_drive.sh create mode 100644 scripts/matrix_game2/run_matrix_game2_gta_drive_streaming.sh create mode 100644 scripts/matrix_game2/run_matrix_game2_templerun.sh create mode 100644 scripts/matrix_game2/run_matrix_game2_templerun_streaming.sh create mode 100644 scripts/matrix_game2/run_matrix_game2_universal.sh create mode 100644 scripts/matrix_game2/run_matrix_game2_universal_streaming.sh create mode 100644 scripts/quantization/gguf/run_wan_i2v_gguf_q4_k.sh create mode 100644 scripts/quantization/readme.md create mode 100644 scripts/quantization/run_wan_i2v_quantization.sh create mode 100644 scripts/qwen_image/qwen_image_i2i.sh create mode 100644 scripts/qwen_image/qwen_image_i2i_2509.sh create mode 100644 scripts/qwen_image/qwen_image_i2i_2509_block.sh create mode 100644 scripts/qwen_image/qwen_image_i2i_block.sh create mode 100644 scripts/qwen_image/qwen_image_i2i_lora.sh create mode 100644 scripts/qwen_image/qwen_image_t2i.sh create mode 100644 scripts/qwen_image/qwen_image_t2i_block.sh create mode 100644 scripts/seko_talk/multi_person/01_base.sh create mode 100644 scripts/seko_talk/multi_person/03_dist.sh create mode 100644 scripts/seko_talk/run_seko_talk_01_base.sh create mode 100644 scripts/seko_talk/run_seko_talk_02_fp8.sh create mode 100644 scripts/seko_talk/run_seko_talk_03_dist.sh create mode 100644 scripts/seko_talk/run_seko_talk_04_fp8_dist.sh create mode 100644 scripts/seko_talk/run_seko_talk_05_offload_fp8_4090.sh create mode 100644 scripts/seko_talk/run_seko_talk_06_offload_fp8_H100.sh create mode 100644 scripts/seko_talk/run_seko_talk_07_dist_offload.sh create mode 100644 scripts/seko_talk/run_seko_talk_08_5B_base.sh create mode 100644 scripts/seko_talk/run_seko_talk_09_base_fixed_min_area.sh create mode 100644 scripts/seko_talk/run_seko_talk_10_fp8_dist_fixed_min_area.sh create mode 100644 scripts/seko_talk/run_seko_talk_11_fp8_dist_fixed_shape.sh create mode 100644 scripts/seko_talk/run_seko_talk_12_fp8_dist_fixed_shape_8gpus_1s.sh create mode 100644 scripts/seko_talk/run_seko_talk_13_fp8_dist_bucket_shape_8gpus_5s_realtime.sh create mode 100644 scripts/seko_talk/run_seko_talk_14_fp8_dist_bucket_shape_8gpus_1s_realtime.sh create mode 100644 scripts/seko_talk/run_seko_talk_15_base_compile.sh create mode 100644 scripts/seko_talk/run_seko_talk_16_fp8_dist_compile.sh create mode 100644 scripts/seko_talk/run_seko_talk_17_vsr.sh create mode 100644 scripts/seko_talk/run_seko_talk_18_5090_base.sh create mode 100644 scripts/seko_talk/run_seko_talk_19_A800_int8_dist.sh create mode 100644 scripts/seko_talk/run_seko_talk_20_A800_int8.sh create mode 100644 scripts/seko_talk/run_seko_talk_21_5090_int8.sh create mode 100644 scripts/seko_talk/run_seko_talk_21_5090_int8_dist.sh create mode 100644 scripts/seko_talk/run_seko_talk_22_nbhd_attn.sh create mode 100644 scripts/seko_talk/run_seko_talk_23_fp8_dist_nbhd_attn.sh create mode 100644 scripts/seko_talk/run_seko_talk_24_fp8_dist_compile_nbhd_attn.sh create mode 100644 scripts/seko_talk/run_seko_talk_25_mlu_bf16.sh create mode 100644 scripts/seko_talk/run_seko_talk_26_mlu_int8.sh create mode 100644 scripts/seko_talk/run_seko_talk_27_mlu_int8_dist.sh create mode 100644 scripts/seko_talk/run_seko_talk_28_f2v.sh create mode 100644 scripts/self_forcing/run_wan_t2v_sf.sh create mode 100644 scripts/server/check_status.py create mode 100644 scripts/server/post.py create mode 100644 scripts/server/post_enhancer.py create mode 100644 scripts/server/post_i2v.py create mode 100644 scripts/server/post_multi_servers.py create mode 100644 scripts/server/post_multi_servers_i2v.py create mode 100644 scripts/server/post_multi_servers_t2v.py create mode 100644 scripts/server/post_vbench_i2v.py create mode 100644 scripts/server/readme.md create mode 100644 scripts/server/start_multi_servers.sh create mode 100644 scripts/server/start_server.sh create mode 100644 scripts/server/start_server_i2i.sh create mode 100644 scripts/server/start_server_t2i.sh create mode 100644 scripts/server/stop_running_task.py create mode 100644 scripts/sparse_attn/spas_sage_attn/run_wan_i2v.sh create mode 100644 scripts/sparse_attn/spas_sage_attn/run_wan_t2v.sh create mode 100644 scripts/video_frame_interpolation/run_wan_t2v_video_frame_interpolation.sh create mode 100644 scripts/wan/run_wan_flf2v.sh create mode 100644 scripts/wan/run_wan_i2v.sh create mode 100644 scripts/wan/run_wan_i2v_causvid.sh create mode 100644 scripts/wan/run_wan_i2v_distill_4step_cfg.sh create mode 100644 scripts/wan/run_wan_i2v_distill_4step_cfg_lora.sh create mode 100644 scripts/wan/run_wan_i2v_lazy_load.sh create mode 100644 scripts/wan/run_wan_i2v_nbhd_attn_480p.sh create mode 100644 scripts/wan/run_wan_i2v_nbhd_attn_720p.sh create mode 100644 scripts/wan/run_wan_t2v.sh create mode 100644 scripts/wan/run_wan_t2v_causvid.sh create mode 100644 scripts/wan/run_wan_t2v_distill_4step_cfg.sh create mode 100644 scripts/wan/run_wan_t2v_distill_4step_cfg_dynamic.sh create mode 100644 scripts/wan/run_wan_t2v_distill_4step_cfg_lora.sh create mode 100644 scripts/wan/run_wan_vace.sh create mode 100644 scripts/wan22/run_wan22_animate.sh create mode 100644 scripts/wan22/run_wan22_animate_lora.sh create mode 100644 scripts/wan22/run_wan22_animate_replace.sh create mode 100644 scripts/wan22/run_wan22_distill_moe_flf2v.sh create mode 100644 scripts/wan22/run_wan22_moe_flf2v.sh create mode 100644 scripts/wan22/run_wan22_moe_i2v.sh create mode 100644 scripts/wan22/run_wan22_moe_i2v_distill.sh create mode 100644 scripts/wan22/run_wan22_moe_t2v.sh create mode 100644 scripts/wan22/run_wan22_moe_t2v_distill.sh create mode 100644 scripts/wan22/run_wan22_ti2v_i2v.sh create mode 100644 scripts/wan22/run_wan22_ti2v_t2v.sh create mode 100644 scripts/win/run_wan_i2v.bat create mode 100644 scripts/win/run_wan_t2v.bat create mode 100644 setup_vae.py create mode 100644 test_cases/run_matrix_game2_gta_drive.sh create mode 100644 test_cases/run_qwen_image_i2i_2509.sh create mode 100644 test_cases/run_seko_talk_01_base.sh create mode 100644 test_cases/run_wan_i2v.sh create mode 100644 test_cases/run_wan_i2v_offload.sh create mode 100644 test_cases/run_wan_t2v.sh create mode 100644 test_cases/run_wan_t2v_dist_cfg_ulysses.sh create mode 100644 test_cases/run_wan_t2v_sf.sh create mode 100644 tools/convert/converter.py create mode 100644 tools/convert/lora_loader.py create mode 100644 tools/convert/quant/__init__.py create mode 100644 tools/convert/quant/quant.py create mode 100644 tools/convert/quant_adapter.py create mode 100644 tools/convert/readme.md create mode 100644 tools/convert/readme_zh.md create mode 100644 tools/convert/seko_talk_converter.py create mode 100644 tools/download_rife.py create mode 100644 tools/extract/convert_vigen_to_x2v_lora.py create mode 100644 tools/extract/lora_extractor.py create mode 100644 tools/extract/lora_merger.py create mode 100644 tools/preprocess/UserGuider.md create mode 100644 tools/preprocess/__init__.py create mode 100644 tools/preprocess/human_visualization.py create mode 100644 tools/preprocess/pose2d.py create mode 100644 tools/preprocess/pose2d_utils.py create mode 100644 tools/preprocess/preprocess_data.py create mode 100644 tools/preprocess/process_pipepline.py create mode 100644 tools/preprocess/retarget_pose.py create mode 100644 tools/preprocess/sam_utils.py create mode 100644 tools/preprocess/utils.py create mode 100644 tools/preprocess/video_predictor.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77b7ba2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +*.pth +*.pt +*.onnx +*.pk +*.model +*.zip +*.tar +*.pyc +*.log +*.o +*.so +*.a +*.exe +*.out +.idea +**.DS_Store** +**/__pycache__/** +**.swp +.vscode/ +.env +.log +*.pid +*.ipynb* +*.mp4 +build/ +dist/ +.cache/ +server_cache/ +app/.gradio/ +*.pkl diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..bdb356a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,22 @@ +# Follow https://verdantfox.com/blog/how-to-use-git-pre-commit-hooks-the-hard-way-and-the-easy-way +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.0 + hooks: + - id: ruff + args: [--fix, --respect-gitignore, --config=pyproject.toml] + - id: ruff-format + args: [--config=pyproject.toml] + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-toml + - id: check-added-large-files + args: ['--maxkb=3000'] # Allow files up to 3MB + - id: check-case-conflict + - id: check-merge-conflict + - id: debug-statements diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 6b94e24..35408da 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,295 @@ -# LightX2V +
+
+[](https://opensource.org/licenses/Apache-2.0)
+[](https://deepwiki.com/ModelTC/lightx2v)
+[](https://lightx2v-en.readthedocs.io/en/latest)
+[](https://lightx2v-zhcn.readthedocs.io/zh-cn/latest)
+[](https://lightx2v-papers-zhcn.readthedocs.io/zh-cn/latest)
+[](https://hub.docker.com/r/lightx2v/lightx2v/tags)
+
+**\[ [English](README.md) | 中文 \]**
+
+mqgua+h6yGVv_h6`txKoRxF&f(O?JTW= zBmLbrNYeP4y+mI-Gq_AagBy#&u*{#I&l~Nrmh(8V85fpZIgNmeENLxoCOO8Yru2g? z=}@%VD-#cTy^3`r4V7A;s-O5uzl8TfyLNRU?R4w>#|7aj+k?;oE8+yzqulscq7NbB zK~7Tmf+W*wRh2oGc452!DI?1Vag*v^TpA;;%%AwjE$T&a?{`v7z>>>?BBds#zH};A zEgQb6uc?75ikWd`Oa`@3c<>$!RsqfsKY9#FI=BX7mqA%*;i=|5; zL!gm}tT@ARmbfBH%P9nJ8gr>r!*`})O2|yTNQ{>Ll{BfymC(tsoVaX7S8%Hr#J1vO zd6 YR!&B7HGZ}TE&4N=-9Y;tEW`_&e{NvVBsQfJlBOwhw^r^47xeBL}rv?1j)ZpEZD zE_R(^8j&sv045l*tfi?7_8(jgXd{=yyt`${{C1wN<^Y2cP^bw1I4*AC(2I>R2y(u8 zWAr<}2d1_RtZWI{3N^1YapR30tYjSLQGQCAS8^n&3W_0O2E65(Dkj2?Vw#~NITQou zSl^X;_3qX!1A5Fvm{ !{L58WNA<2La3p$wQaBA zceb70Mg}XHcb>q#F;IR1dBHSxTM*+W%+?qQtXJmgxBqazr6;uay7E}2fp164s>E=h zQLM*_DIwC^ogSY|b2kl3!9Y87wR1XCX2m9nEH0|wW=%sBfAuvN`{JU>jTM +E)VcbNSO!W4|L4xQ zr8=5oqF$OcbUN0;>FZhW9myZIy1_y*IEL?%vE)S)7Fe&u*rpe?nP!}^sK$-uRrYh! znzMdWUGL@_`e)O^Wb4#qfX0qSrsJNOJz8abc`Aq&N8;m-zMV7INsnQjOTeX6jD)ti zpLGOM!ldO=;8`ZDye7|$1 26xjTAo z*d`P|Qs=7b_wv#OwmY#-xfI# g|Mx=$A*5-(z-iYzU;qIn@)2m z+=%-kKPrjzT}Ztb5LD_fcW5zXPzt}HGOgO4Qq&-MoTNaCqO 3F{0@m*;9%m?NK874D zj1w2lL${Z_Fs~^(;D_f&+-hsawV~&5uRPvVj;da2h{&o`I{e@g=3Z{dgu(<53wD9# z`$#A~XVT4S f2Y5^M;oAFH;u1ya~UW?5vo9%{IYi`jSHl553V1Ncibj z@ZdiEh!oN7Q9ec%4R_xD!_uf9sev194k28U-D2%#RlvKASMw$hrG`7%W&pSV|FtHi zsvpnaSEh~V_wHAtd2v5e8BG)I$yXa^-oW^mITf&cpkZwqg7qc1VWyrZVd47)0 z>1&DP)u7jLv71uuL$2vL7EXAI2GntCDrKmg+$ujQRYdIP9O)RBxLqsO7Yr+wDCvZ~ zD}~qm0CT?;+no<%L~&YSNFvpFd~(`zFIOCy QKawHbOHMM*uWC}f?t+c zcG0|~h-2)4cfBJ|=e2DIz&|Y|NQ;rct<&-eVdJdN+f9oqW5a+M9{R=%!gE!<(MUGa z+*N$HG`4PBXlm}Rj&V0}2-NJDPauJry2imqGurW25|&rX$$88P- <7Q zS*hhaXW_C+-dXC1VaDiq7;)EB`lZr|DJG)t`cL(oz)}6oz $utSLdfL-*QO4Mb~)zv}xf%T+$z>^|CP@ z_&H}<7|UzhvS#m~SOwZ2&60gNkL*9Ulkk~~MVA`!_)#OZ6_GdYZ{VWzvM8h+p1h=l zD%#~D^lyT%xtSTV*X^+e938B%xE~?Hh3Sc;ELzTM6XCw{DNEb(BDSu MWK4VVT++oKyGj)1ixz_S4FR}Zf{?XVM#mA4 )xwDiPt=hcU z3?26VY0Wk;7jl=8;~n}&amtbCAW+twYcw=c$YCcd%H|`^#SgNJ%2!*=YN;&Puxn<< zM(pmjiX}~K(dJZWLN7Z@3R(BZ=0!a%2vTxPYivurqqF}^$~@Gh-;9PQz%Sw@(TmYG zm>&E*yoAY4A)cOZXk}~ZJ(f+HWZ(_m&^1ZasO9-e2S~r03BDh#SkW29d{^$!hZ#bw zBvJ)YAIoY(X5gZ`tf-s CzlUC$yA#{jx(P}rXe(nq~VY;X60@OA( z3O$;gx$R%!SDvervE}xOTq}`&bpl{cal#Mr(Unjh!=@L=49B3)MKi?ESZT3DQjykP zUSFTHTs>(@O*G^bBJ-M-79DSS{l{9-q*XeKV(>;Iq1}JD`f5Vfd`)zHj<@fk#&ALO zY|^*!<%Cx>PRCep-vAN&kos&_*jaPw9M({&=?^VoG+q}NB(Q-sUJ7Z5^VF&~VOq{y z8iN)QFBTDb&1#qE8oJmW_0oi)m9Vv~CAPZuYg%z?!D5L`g_FAp`dvCEnpN9FU?^#u zTS~+$kD4b=q2~03F*JNM>)fa_7QFm|)bEx(H}vC!NrJ!OtZL~g!H+x79W?{8V4UoR z6WMn4 i*$EeX^pClR4WrIZuEtUY!C@iOnBx8d$%uuSLZ#+6Qzc-c zKE44FW(x+8-`?Xt{U~&C>4u|n2B%WNHfH|QxNK^CShJr0>FxFduQ)M1u5$FKCWYqB zQ%s^F(K(iN=5_xfu0DDRP?1T!KDuT-ylG3Ly?@Rcm^ovL`2M`1OvBj};=5YF|L$nr zob7Xct2BAz0*!87yM*i)U&}~9qgH325&&>gFZV{{#Zc7jWRs$3!h*mu`*f#vb*aL` zFbzkK9v4k;f@X(t*k2xY3gBT2&l@eQj|m`& 7P``8+&N}8Bh>x{X%3+}Qu!xKX81vU1R9SVx`prmy@Te4hQd1N zJnYo#6 <^z@ z??)E^%{@p~DVpxF!f<>Me>B8@Ta-WkfFNc2irfTganfaF;A%qBMu~f;Q!7a}@2>N> zzpyBF*)T(HUNRn|gmUQn?6QPRq}fGou5E?-IN3UoyijwFy>|Q4Jv=*?f2l4!hc7$C zWVHHSt+q+$kX2C0-ooq5Bnu0>OO8H&&1KY^F0Db#3~d({G#|~LJi&4lwm#OoydAq7 zkUn2E`MTdy*9+$vT~r}6Tn;!XM<`y$4aS!lO4%xy)H&_|8ONkPc{yH2Ww^MHsW05t zv%Dy4ON+Sj?!}hF;c}mP78-xnAYogjw(3U+b1}-S#1y+aEm;MH#K`Wl(^n)VN0a!o z>ZBW1J$5s)annT%7lb?{Z>GTZl!7B?&yiU1YKj*;DF>S+=3urC*O+N_Ohb;fH5Ww8 z)|fCpwQR 5W=XP4Vh=&A1m2Q;ZB=CaD^<4xL1_9xvUxIlKEgM z &UH+JG_0=@25b3qKdmUvv+SjZJk%wB9UcDneZ}>x@ z207r(*Jl~$?XT+=HWsQ>P2Q0yMQ$vII^DrEhuEiMHv$ltRizoZK5Ja|yuRG*IO|M& zgRYwvdh=dbl#12rl!qo1E{yo8+N4;}<9HD@RZK9MZN~Fu+j;8yc2wP}1!re`V~+;T z42?T~ZB3yrh(>!rV^$f}qT6rRh-i ?Kd`eIJP~1^ z+s4XG01WdCkN|Ie-)4-Ez3;9X;73no1v*e4x5~Qmm4{Bq43&O*yT>L-HF9^}qh5h( zpZ*88K)#xYUg^E~LaRcIu*P>b+`rw$DSg4ZGYO;E_^i_psL=BjXL0();4K%UQ{R|L z^E<`FUnB(q5umM|-!p0iQ4cRJNd{-|XS`0GSBf~^-7f$JQ0|Reob;uNgs>8q-<+Dn z9AgN5nCTUdP^eB;_IE?#dF6Aymm#8&jm{lYxBua7(Z?L~WP20n=6MeFe1B%u&&)9P4ivW{J8Jq zy~lXcOei3Bfw>2Lta3f(Y0ghNZzUrMT&M`C= 6+7(keHbW zajPb^Jy8q#h|T3^R@`BKFfC3Wy64-?NRBE}ghDJILKFRZw|eYbR>xLP(;wy=i}P-E&yz*FW2)= zSx)A Y<9~F@x*5-;{K>-ik6O zOc#KprLXNTuddd;%8;z$oyx1QM=;Q(%!k(vmMtS11W>8`Ox9xp(D!tm(qBY79Z7(s z1_E^n{O`GJIKj#Y_s;(!12%nfHX%-A&EM&9e{$yVvonXCY~YK51X_T&3*d%OtGG{% zoVapASCn*7RZG*A=|yqnkI>Q#DF&liVvF5Qs?W|unZO&r2@OHsrW?@rgSt2|S-}CV zC7CPbyM49z={i(pnf7vxvt2(3v<* 6} zTt~^*$}OhaGCA6}qb_TWh5DPGP`N(5K-~IMAm!m7P|}s!>t$kZ!}H78b-S%=|lt zzVM(4uxd4dwKScUh({POlT#=i8pT;;p ja0HZ9Wvv$#$Dy*K=K}dBwc)A>NkA2vzDqT)C(V-*?|zF&du#v$|3Eg z#XVu#0AY0WwW`)r`-U`Jb3z={UA$qTEiB4|A aPFSYgU zl^FO{?Emin<-Wem8cwWE$6jlFVxgx@zs % u2Xj(?-Ll4;3_Piv|SM&aMp&p)tPw_JNpd+}ck0Y7rp|b#?_Vb*Q=QIpEwgzzy_d z^q1cIN@^r$*S `3sG{j3F0{xdL6)^m<^ z(AlM>2HVMr_&e#~hT5ei>jnugLThVq>|xLYfPe`?j6FRh`mkZ?!>mbN=_NUWCuWUE z^(VSwMjUH8)_ eIVL?_j|9~)QDq?t1T#3Zm%41IFJ^` z;0qyCyEs_U0_@cN)fA->9&RLdM3 bRrl(?jjU+-j=3Ig=4KN zjbe?sKstoI Iyz%T5E9yvK`Axat!E85{_Evr$_rN~TN+L3@ zwY1m@v%R}<23YdhW5z!0jFmi*DGYe_y~hU4f6`^se(gpl&3kHv_`*jnMe^`7spiZ5 z4*db*S%W}^=gt<`HnL+MQ}Fl0&!*3h)_2rTFGJ*l77ZzV%K=6{wyw4Y6M*?Kc*DKG zL{*2pc?hc>3dXMS0rP!2&>?<(K+;az>JUht*P)>^$LSZ(`81%1|B>$ef6I^V#PcZF z>z$vSI~TWi=6Az4vS{qAl~j_3#2yux@ri@m=#cOu9mMEzHcE6cO22YUoyIn);|G1Z z54aTXjsOf`A4F%!Xrd_ltA4?Va >y7!BTv8X6DJu zCU~iaX%eeI-)EzKC9N~Gzy PS z+RBvUW@pMh_*UPuZL)K9=sl|E$98Hd02^xWQAOY1{rqfY$yhYmYIY%M^??i46@6K3 zE5mR1^zLg>+`{n6YI%;9i%mAbb!VhuO1(8le;Q6 {8Qq;@bZ#b#En+z=cLe*ISO9qlcL4d(N`v9;T#yKH#ytV}s9sRR^k~usm zjf8s5Qq`^5Qfr5#9hRe}q!(gxX65U(@^nSnn09bIBy8cim?zdkLRogPm+uYpH9WeY zQQ~~xJPK|$&4(GNHd9v+0~Q{jIv&7F#8%=({K7VSQ>v!IWdS09Nnpd`1e2!dP7({> z$V_n?+ P-H{De!PHD9GnMPvL1#Xun2?i=8RX{8pR|-vJJS`(p;M zEyj1WQdHs% 6+w$*g^IQPh)k@|=1&(*&|M$}8xRDb zJiaxKpub`s|7MtzLT>ONbAZD $($&A{Qd9^H&}|SUA38=x8s9PzEQ;Uf=>i0 zjwj@wLhwnJi;?Vl!yU?cBFTA-X!=_H9z*-xLHd6At0t-wNtMgI;SDZV!)sWawr(uh zZ3`x%J%nYdy}=G++!Vt}ht1bnmnmPW+wv}M+jiW2%-mQh%}J^re2`&fdqh)V ;sAU zv(>J{Wz^dl754pyo}>Z3y1?(4tN`0|7S7Sm$G~CdrxkS@ll^}5>sB`>r7>_vaeJ%d z5IM~8PQ8}bXGG#-+D(0I8KHJUf}tmeFq0|O4b59g#6+1^$2i0p?&vZlC&C55y$PmE z;dc57$y2I9#|+Fh(aBf0W63H8^fen#nA0YFbTK?&rg40B()Zw#G{D;z_#Gi0GF-l6 zP#Z>Cb$lMapilE^uwQAl_O2Lh`?(ZB$tn+9+#oT>@Vr_hMS-j }ne^-b9k0TkptkFI`?PI2Nn5`?!-t8`=0i#{tg1l)OWh z+(K+Dp$Nm?g>gAatA8*gA6x>{PYxkXo4n26kSuZd&G-TxGXre26gpX|9ldui!JnR~ ziS=f+vKn&=;bI_p^}U5R`7vkPle)9W)Sk-2v6jWWr{1o7;@ 7S!8b zijB3H>nVla{B?S=&7#r1F?E%A(Ez8P2eQXl_oa)Esd&B2i;j{&yPJ$ml4IdKS#x(h z%K@@Gecpl#gaFc`<(>M1wg1ha!SDd`!|%bzGsAwwuTZuLiGkqV+Q*Mz$$lZe($3 zs&c7(U@eer9=>f&LE%@>R^f8vrn&K3d{5E@z-EYNSjMz&3l7Mh>wQV(gAcQdWxUU> ziI6nGfD}Q(>|sQW 5M5FM7KB7l2uT3ZS}SR)z>`GK`#@?R7u9O^&*Fv64#{Im4OV3?S0m zdv(JoR5mVqy~ubch6mIp3|RJdmF*P@#n55t^-7cejsdd~8{-we+)w5eW#RTxgcju1 zUj9iyHW$l+wt=*-TjneIp1;zi_K3rN0C-*Hn|nl;{>*LPwAfx;33_Lq`Q1l}O~_=*9SnUHCn_ee{;Bz>(yD%-xtV;78 A~ao&}62MO&WA$=>_ARbIPgt zeG2h#m`A%Dz=`+bi+f2u4NeuV @(J*I$$!Ov=^+btY{3m%}d9vMO zyLS}^&sd)7G~MF}sQXvmg-K+*?m!#6S-1i3Z8@F#fLs0N`=_%9;ta3L# ~cBMnmTJUW^j(ZDFr<=LAh?!`uZzGM+&4C3CX|{A@!b zSnXtw?2RGDc%rE{D!YS>HpDOj%LL;$-`J^ZO<#U#vVIfbg~P79!S-^{*7E13<0yB) zmw%=rACzDROv<`pQ$Q+ECiGxjD-b$XMiVEnT8}IdKi|lZIko(~)HcQ(-}*)%0yn6p za|Uu-D^;38sG@fA?0eCJqd@|wAM$|Cn5EbPfLjFBTxkq5- RhbCw>7N`?Bi?jE_Zj9inZrka076=cMpJ! zIYy>$N1BA6&qbjl{q_L2-SCMT&d^O Hw z(8A|PYQh8JJ7g^Ik{S{6?#_3*kWuS-Ia5Z6oN2$qR;L>sxt2MDW&pfeds|se#>XYP6To1teS)b&SH)`|QqXW6t(f(Dui8tvbQ-*imm3 z73FH??91J^o|Clz9hd;`X~|q~bgUk|>TYi>0FLd-IEw*ZsKcCcTeRfkv ^>Y z8jKGZAs-Z$_^1HcU8Uz#LOb3oCu}?>2sRo4wt**y-R4RbqOB8GzEAj=a&NKJ?PxKZ zKrX{Thpf3G|4~MZT7qC()vThsWWT56aYK}MYeCEAxfHOszKbD3>;UjssBFx=Ja|#3 z=Gq3mPjx`15enIR3y*E(Lo>vjj|TJ?MbI9g<{Jn#yk=e^K-^kvTEAJ>-0;M_W!8H; z5I0LQ`d)0_zVrVycjn lU) Lc3ZaTpa?~X%AbHPSan(P;!!Zmyr zReDUV53_?nXuC%lf}m(VltSE$j(jJCZV6qob6JEC)HgS4hSZi?9q5^L7Y;<{SWeo* z+O*fFmXdo25(9n%XmYJua5 XHvDnj4Lm|O0b)$GD`@vXH`s#T< 3K7{J!N4y7Fo*nOIn@kE|k}t-D(C{kuXP?Cw@50=hxGNxnMSzpGw){WZC>f zm$L2w8MHR6y%QGclt?Qx>T6&7=vQ}=i?<9IPDN(qELI?H)Nx@E-l$Ru)paScGo7qS z2fNE8$OeYMJ~=hW$V{*HF0ku=mNtyAsCgEkvu`|W=DSyWP{HAt-g~bIPceS&CBu~b zv$i}icB);0<}D|n^jRS+0%xd; )~|)?y#;(;)fFFTeT(!>0+tcjEn91 zXxL-@>RHYSO05jKJhWjfpgqWzG$hu{N4yy-5M?~(4Szx|etp-$W=3Js+J~|(mGu1! z=VO+351G0!3rnhdLKDQ08X6zs(pD=6TtaE%O`4V78p_V}opVq&2%lEd8kcT2Xy?SO z tjx60i*9Zovs05G?Q9qt ztb{0XLOS~UO7u$DLi?q~A5=R=Q^;_j= a{4SY$^2Su$=H?Y+9I-6&Ej=U$m&{9T&5d?5$1x4KPgq8q=e zEEi6g-Ndj=L4H8VL^Zmd(DemB(S2&Oqd(Pe@S-DZX%(g1=3MJ&{?gZs3=G5reNRpN zT0N89A~4f(uuN=7SWzofy)t{nw1f4fz|uOcwmXVk*|z aAI Ej#0XpJgGC(89;?pGYLXpoq9uQck>Jky<|xOgo|gs7i| z^YXZ#+g=o=PObMj TOu98*_uR*nIxqKUC_+T0D$yK7h zcgX>DmKq6&6a FA^L}YUN2{@ zugtCCkI(qOy1wGw7f?$PmdLUd|K>#iiun+SSi`j-$(*B8HOdtGyBO=#yMz7|6Z&|H zm&=N_NVKU#cakBBh7X?5g&G{(p7F}%so26SK^6QTa|R95IwNNZb00Bfm7D3L>~@et zK27f6(-0}L$ZhKPr)-~Ot9`>Sw$;#Ty)Hk@)Gn%-HXhT`aHeNMlYs0Tz$|t^=j;$_ zu!vt7H*$B-Gt;#5hXBDMOI3aZ#PUy|=-3+7!MP4$3*uPbbbA?rRU1W
K)|L19-@c`1S+B6=BFcC{k)i zLXn+R c&^oU#Hxzr@OebbSm5yQ z2~$HhDRjH->7l;=U+td)5TpQZ>1SN1OST#GQ^rtG#&=L>uikBpOJRU!t{ZlGdi&?c zy~u#ib~xchUgpD}Nep|~#uam<)rCBpP=%$e=x=9JTR}>-5^(@OapG6)q0so0hM~rY zp
sKm^{}I&dB5Ke%Q)kzjm~l`_Ps z#8lcP&l$YD6;-yWqq9Bqr1=1`32${Kb@^$r#CY|r({sk#SZ@gpc4fx+J7 zlUS0eC$BI%SbI>#yXv;Mh9Km@;^T! 7lnKy(jT}-H1K}s;UllyK!FnQdqDp!u{AvUPMUsK(D1_uot@? z&hqNFQ_es?w{W_`snSY e*2HKb=mHBJhcLlH}xKW(UpF*X6>xR0HqKv2AuZ*sR1EoHrLA@9Z?i_ zk2jQzffg3cr_EJcvgykO%PFiHz8iV-g_t|ltkHaru{EwH@0Fwx!i({Wq0seHeaGua zgL{>8dY)U1JAU%0NDW-TH7GFZT!#B7s(sUh&WF~IIUvfPMg$ ~dp=>SmIv zeC-mMN)Oh`;aQO`;Fwllc*Cd)bva$dD}s%iHG0Xqb_o*Q;9#Dj-1(7Y=~@p?%7V{T z !3J3O?r5OJ)N0G7iajb#y40uY_yz#}8pHg2|RXm+y9(DtyCzRpYo z(%a~oR)qQiH`y3UGD1_{j-1>=3>2+LY#aMsjFrqp#LwKY=o3PUprZWgPrcki#`U1R zBIStAKHWgpL^aFH8Sa+}1>_q;Q_U@fJNEZ*C6oTq-l VyQ$;{V@ferLmJWSOyg9i z)(PAstHk#$G`>n3uFzA~!k~NS8^<(rLj9+z+mNEQDhFPY0ELp6FdJtJ9J+!^r@@WH zdXJDk=Xpk~8`BLqx9o@3o;B0UPmCXekx)=}a&d7x{%+%jxM5=1q~0bsdR~ac`5GuU zEu7~|^ZV*>H^7a!DGgJFMsdFT&PGfN_f#5dEpN!R_TC i?&79@698CfjE_@U A9WXMNdMz-N6$^ zCbD7&ooy}r {2d-a|Y6sB6=t=1= zudXCrk9dxmO)@g3ImlL`%_jDYkPV1OC=L*mxDh&{jA<`hT39y8h7!fGn6E2+Yqnk( zFIy_hBejW;4=vBAG&d*uzDKh%yJD}7X{5H2ALS`tm(z&9n~+AIFW@`D7>F{4*SYes z_YlP$UK7RZgpNb-lOHUS#q91!k=Bk|4TinUf3m~Ti{5vt$&TZ6y|VQf>8PEAtRN%- z;`u2a@@n%M;ZJ%l^B_1p+vkS6>)@Hl&_N&yjDsE6^(J9kJbIM&qo>)e@R8O^20KQm z#B))#KfHO(t{8FH^@a-;4UM0Oc>$McopF2%-)A3a}jd@JpiSzC||rAh>kKqi@fn0JN6xj-gIuDMIJ*L z0%*?y$OXm&WZ;gX2ViBFfL@6OTIA_3_`iS-$M?Vfud4F2eT{!Lnv!JS3D7gE5@&WR zrYY(Z$AZvX_p{bc&; d1^BrQ`29Da7+LP9B&NBCde?I8Zk!lNpIV>{jr94Vn zqap+1PNr{vC0Fbr#-(^w<*3i Tt7#jZM9)P;qDuTNeg>u8)Dtx?%e;Ez+8t|4d&ahp{MAI80-5P{b zxS# )>5MEHb$bCituczO<&F~;z1Q1jq~zn z#>Eu^xSoZV{9@yfn<{deyNIV$bcDbIr~1w1l;i6_hx}>0-&r)U{JiL3Byu$z>CD)J zf;xw)+=pHNv2)&%{sMT7*{R$emqY )!zc6j7k+;I&G@!dgapj5~fk71N|dRfxhRw#%k%04LS zUyOOyX(CL|yz-+D(L?<^;`=KP$zP{5TT4_{5YYq6!HzTp1I@oEA?}mN4*V~dC`}-6 z>ek!w@^OgW!e#~c_2)#8kd*o5^XMaR1q1j7nN`Nzg_byDfGdBp?yB_e`xlzIJ8a31 z{O)AyQ2i4*qWH7lOBDUp;39JFOJ`mDB>+r|Ysz*O{hwdGmZJU@a-j1Y^&7tfRt+^# zgF67d%^j8~57%JFwMBv$B2A2Sc|ocTpUQPE*i|oX0d(gZH|vt%wS{KF|6{E!_(qId zvwS{lC{%QMO+NYT0J|Puev~cak;STdj`*IRg?J+%-VB@aRgupzvIJpk4S5C>Zjq@> zpU*PEm%Tsx0nD6GL79ys?Bql>cq|BB T-$^k3$O=}TuwLc5nn}qu6>hVH+u6K6 zM|XSKXBOz*lG3~>4+dWXV}ZNUrBf5`(anWwnfpjCD=Xc>7(1X#5;2xNZ|XAn_44*o z19J9i&%6wVr7pZ!c}1i47IL8b!L7xK_8Nbx^d{L*L8JitlFgh;N-lB(NAdxb;dj|l z|1+Z*K0WP=U4uI;jU4?BfctozZ;6Ffbz1fNB_QT=Bblk=O5C7PP02s_n%{5yU75%U z`OG+oZ`j1!{_tM62*Sx9yhL wHnn>_U;_iEK4^isDYp*SwT!-C zDfqVE%dJUkraaEg>vWW+5M%|?0s=IuFr*S(@QDJ9@tUU{k_E_e_|fDTAv5&>+V_U= zhu90l4R~Pv_Gw`^vhRrh<5Z2?^vXA}W0%J7Y-jDFD+L==qYfMP3_eu7mT8b~M7aQD zb1YFjQsGW>tP7yKovnK-<%{{Ye{unA+1QlumY&_ z )=>!P)_wsm!$}}(1NnWTxr(c)+&7B{b5@|c?pw^ zx|%a*+y m8akaF7bqgD;3y2dH5u(jz$ z@MG+c&IMSY5$uei4=+wMWPZwD=r~aNN7kWQE_VsQS{d{S@HaDO=lBd)oC=&WI@K~R z?A~=B7Ir%!H%q(df}2cUwwzv9V79q!4{)MQ5wb!zf(tK%t=M)2p{h^MfeB!e!;^|@ zAeWO3=_Z4YXgJmR_q1__y*P67 YS>4&V@5Y`#j=xgcgzfrZYeJQo*#8NeD{C7fd#-naN+v 37}^{0XICY zPip6}A#}3H@0X+a9ziFJH8~Smc^=$e`@94;mkl-`Zv8h)FdN?+#yld;@750%URoJe zlwQJffdce4j&Ql%bOF%>%C}jDf6_&fTC{qZ?7*s$%Fsn0t-Hx{wy&{T2XdMenYfjk z1Hc>MacgJfP_%bGgTZY1b71Wfd$!0bNc%aQy52Y@;;L&^Uy!9ltzW*@&nIuUv+fwF z$RkcfzzA(C8B?#F7gb(1r7)^egDL7u^+u$n)fXlY&vLl3#56(b`(3!oO{%PGaVz zYx@e2ItHbfl?IF439Z|bz9}De+7IbGd+mr`t7dl7hODLF=A;MK4sO`9wq=qZeP=!L zZG}Z0FpE<1UoZpvvWZ}I((|G4QVQXf`}uyrTRJm%nI_=b#}1xujjOZ)bz^7w+_#A{ zjRItiyed?=XEafgXSkYLuoBTS7IdAdSifWA@C&2G6)!~BPoJV9E*W|ssYY#GFA4za zctmr;GO9eS(rjli7%9n13>`XddlK{gB~z&c`!(e(;BKk(EXL`3nlDH`->JMLHKF`r zt$sZ $3`UK? @8^JQHiDO9afo=_+t-}IWKk(1ZiBIRK z+3ZnWHP@1Oh2TRqx2~;!FetPLuj>20{?9AXOy!8{J@ZrXTbVJKN@E5dVIvQIy(dTO zZKVT-F--*y|8)u~>P2GsKIhI!n!Oy?po?PskYOL~5bfyNcuV@>NnT=(t(8vIGFUl` za+>%U9Fq!(MNUq8gZgdX0$y+7Q!CS~-#sS|KNp-xT(pYCsA;LryZhybGCwJBcLU@Z zxEhz0;!+pQ=g)0Q=CO!RJNq8WB5m)dZ3cb{Q0C0}rTlIZ=fU*F%*0Hm1Y0F}u_37E znOw%UjA!?QnUI_%fA~&!X8H_*g =j#pU5^gRHuz8bP4NA< z(-eSz|J^tXRIU&N87;p}gW* -BR5iZjT0#$Ru+Tqe!gU;tb51I-=qRxln z>Mai-@P(KMBFkADN5JOr>)k$&LL(Qe;ec~S4n3!@1McnI>Qr*{+C(MdO uXL*>YPkunP4M`775>Bp(y zV=7$+QO{cW%y?ugX6+h5V6k@|@8T($yY6SHdQtr4Tf}7s2e&_?dXn|+OssqPON8KQ zP#_)a0iBsNqpy?$>Q|mEZBk7D{pA5Bq0DVs@5nu~t#YR(ARByo)0VB CID37~`bu3GQ;uKTRy@6<#dE35kfQng*7 zl@0K1#Uyg(&2BWO%YQ-fqWzk&KcUt=H}pBEN!$kyMo_RAwSD%>d9W4o;%a;#IPX-e zgH h#!#rp}@-)eE1qoNNzj z=oxft*aI|O1Nul)dy_=w{a`%ldH33JYnQ!^Wn`oQ0|3$L`4R6C4eUr_uEt=*F)tJ7 zo(8aWt7kejs=I2&v`-*TKc_|ZfMS%?7cP|ZW wqiEdmV%Ci>_Xq|n^#%@gEFX>j)ZDqCqO~tL zZTm*0)Ffuuq~uPg!cm{VZV&U7Q(5-c0<7Zay4BGdpNt7@)c7*7XzM)kGek1&9Mef6 zD9cB#-*dw~npLxT2{yFGv8jH7tP|z`-MbK;mS>UA+I6qa>V4+7`dHUz8PI*gSjIy` z?<95-eB|gpZ9GXv6h~BZ2fyHOrwp@zkmar%-WqxT+p;&kOm(O(*uAW_v8;*(RRfLE z#Gs$Th{IUPcm=pjYY6+Qy8<+JZWUaqgPq~}1K5ifj#pMcP<)vbCcl~FZk`0c0V!;6 z-Tny`FC{>F jwqXdV%=T4~I1X1gQYZAgb%GGDJzN<+tJM9m-Y4xvP6D$jF=^B| za{hSK&eXiqV~4>}FA7CfpN}YM3ef^>+?kbMQ|^C%D_*YEuSGPC@HGK7Y0q};!yW!O zZTdGt@De#{={=H-H?|7j4D4>tbu{+|_arDXK1pM%uqy^Wf}_W^!9L>;^Ob4AfDhfE zQ4ohH5wu)dPiQm+(PAJr |i1!ag<|;iFDohar zRS`h{+uDy%Bfmnhexa8AWBWTOLzkJx)v&fwpe^M91x8o^{TbZd54pxB72!APNer1{ zi;bydR;0HiQFEqhWe_MXU{-49sr%Un(;Ja%uK#ExJ6{RAtOlYz|L3xn{x20a?hZ?< zA82F#U9TPSPuA40lEoR^`&vYmZ}()`cJ=k0RH|oxgq`Yv1;P7X`8b^cQQ^CGnOOdt etvGszv#lU;= +Wvg|9uay+Q2{{{(9ce4gxgq9teccxOUmVGQe@EW?!YW6`YH*JKK~OzRyELeNV~H zGcgBuU%uCAeo)- XjER2%g+GC9p&F(AV9)uRRa% zxp`#h`KQobyPlEsC(<~M<3Tz3)wt?>Z>tF+2|k`%ZJN54W|3RFqP4QL %8oTNQ3)g~sP3;ny}$m`%Nxx8bMms# zN0mMKV;Xw3J9*!p-d`}JF=vAnyYD!6BM#rJ%6q$)m?IrMdjR+=L*#$F&2P=3z*84c zf5CSFp9=@20nCCxy3c;SZ1msaWw+->I@1T;BbCbEwMZ~Ng?%tquDZA2jGgQ)PAB z%{s~65s!kRZYfFT_bRi=XkEr&sZ(Qw@Au Nh$%kEk%XOJ z9z6xHa?GH41eU%zN|Ozt%DPV=*2Sg03F43KZA ;>d7w@uWjF#1PIJpWgaJ2-l!$#3&PcEmmbj zlDjG?Fs#1 G(WM4eT=+SmYSlbPevv znApZs!>kDuf?ThjD0+YmVN(=NLa%?Keb{mG6l?m671%*t$Kr;~H@`+9@c!D;j7L$- z#R9Ci4!nAc+Pc^IHq$*fRYP&?vN<)U;xV|$R$UI (MmE7;v`p{j{Q+h}M$pRAE86lWNy1uN ;lFlP1 z_GsGA=d#&SC>=F6EmvQ>*Gmn)$*8ES`MLNGxqJy_hNQ;!oXSm6yZVJXYm&aNx45WK zKMJxh4>R{lD*CEEv)SyWE9g!dpp2eeahr+PWDAcJK-h~07qf^@5v21IN7GKp$k-$2 zmUc;Qe3^_qq&Xfi^Qm9PyN=EHx>Enq+nnmZ+9;Cisxxy`D)!XO?2=&m#$|0vVacBK zf}UbWlb)49^2q1wxO*&(kH}BwSnNT9p2o(lmm}`>*L$ZE#qM!-K6iu%ZH`RT-sG5Z zX=b669Z#4~c$j=21s-n*)8Cph_;$kL#N$?_iv7d~9n#o@eKmm}a4dm?+% Z zwWl-g8I#P;O+CNsu4+0?`y+Y0r59F1ov%1c_W;Cpz4mEcVlC|h* zfTTraV6!4Vaw;q0c4X-P5~I}?bf;P9kMa?3zVH@fN9x c(@mBCg; 20(q#bwkei4fjuL&D+Nj$*n4x`6^8T2iboQ$6U7JC1i zDYy7Ir_M5|_C1Si77{qc$Dj4^mQ@0tY~-u1zi15IOgMShW$vQ>*+Q o(_9bk|A58g8 z*1@IOZtK41Swx!3TUqF87&43O M0W509!8klQl%o>Z71>?K-YV%K+vya%We?PV zbJ^=-&^H?Z7yHHdG^2keO5F>LUr~a>Tkk_^zXJz=X5vzBa6LSihRf %qN-s4tGtg z#c{*4p8Rhs$~T{r^W-a)pI}(KaL;5efIENlTgcBBc&nNBLi_TFFz`->g4<5t-6l7~ zF!`*%;Gwp8mrA{!{`Yv?^XXd0d6gpjDmC#(-;dY7t*+wv8_U%zX}1flRRel`BtQNG ztZiVn3i(E0s}^I>dGE1UG8}RNyi^}(6_u}db=>xXQ`uiLPGG}4%mn>KF@IP2Zrnw% z$!Qf_L_mGKX|^m`e(^yZ(mo_bIB} ^Oo8F|iw;aU{zEO8t|sPIs8^i5lxO-HB&UE?p1RPPi7j8ZW2|PSTviJjKX_(LHp2 zF-656S4+*RiR_-3x=(YLGldT2K9`MkL!Fy`^ ~PYquPJ`_d9RhVzpW)N_A$>H;{nK2SYP+t;dZZ}Z3z zex09RN*jgk6kpvYR*XJsof=vVSnY8VX|%q7$nEgQ7ZR(}3oM6>f5_dr+riMga_Z$% z%ss#`Y%OG=B>In_d?ycREM|SrCX{&&C`)^GXO|ugw{>VaAmU)Mhhn9^*lA@YDGl8n zOtG7|9<);PIB*i`l`66EZmB0$g1+JVRfTJc^T?{1*W^6B$@o%KZakuQx7v4Wm5|GG zfCnGJGC?)JU;pC5m-rmfX|VT0R U}7D?(dI}*pGN+I>dAAZ?E&Wuz(Rz4~Qt?W;to%FgY<%0g; zE1l{N>xiwWbZ;HF^$gPlU`p$6vOeM58bfX_^{~r>Em<{e{ggCcnt;d;!?3g@{*iTd zWJ@`ml0-f}qNAWodoN((n&Q*c+3NJ@={%oPY2~0zibwiDtJg=7i{@c&BRd`57syyg zsH;6{Qzc|Wf+s_J>eHxiY0vBHkQF)6EQ3HU-*|$5&^lK!Zt3S&zMiagq!Es|E9B%- zF+t*zK;$XF*2|=zHLYdcIX45%9Y$_>)h^_V^%syoUIJSo-r#pDSIxeqiK2$I5tGJ= z9|VwW-0qR}hF0O{II5J0iuU?fECij#9j@;_Kf&yHpXelgJG^@$&!#4j{_LGnXXRB~ z8(-$B{E^*@e|p(vDERjMW?X#b3S;c?L@9SdyzZ(|$a=h|@L8FlrBh&KZ7!!o*|csW zW3Pa2oRq_Y)t~Mr$6&WemzBKRlw;w7!iIi{fB0JQQ~GGV?+bX!Wapu!+bD+^)2fAe zLq-?3N`A@b+Xwdn6xKK_jXBfav9iv392aprGw$5UQu73E-zPCcK+ggK^YvC?%)yh; zu&tSJG U;nbdPSN+YQ_la}Yw&k@?veU|Md@XG~+W|tOUQ~)7`ntk) z3+#?fJ4^c%d;vW7$ @ )2YgIXV0i1QWCOP_-%!~G3{AXvOvpWETmiLQg z43v7050_s6vv)Wc2m%J}+5hPAHWTVR^ehvtV7P&n=g71wF4!rv9)#DKtN*c1fwsNA zG|`ltjTHH12Rp3
ZZobQukv7@@dufus=&yVo$HoW<% zS%YueuCyQ1GCgla)7)pJKIvoC_eZlG>~A`1oU}4jm@*lbML#InX3d_$n3+-w!;sjU zhP%2`X`0v4rJ?O#0}ZLS8|-DExS>OF-ob}`V%(JE?UVym?&+!29eSWVyg+bLu>Ec3 zh@z>aXkt2&Mdm|PLt;=`X@X2R^9-|Ua7FPKLKgD(<=99O#wzmkCn)yki)&9+gO@Ln zvLq=cm0n#(d@*u+GQB^jq$V0hZP OPAVJWhykmWLfM!|1cW391|BAwF`cvL2go`kN-Z0xahGcPrN zqb&?iYP@Uk`#wuy!yrK2Dp8%OhBpKDdypClC(0_R&M2vJRf&?#@R #ogQu!7 z_GgsWw+6ABNy7aK{R%`B8<%dg&6RC**KzyX(!*OR;eOL=Vv(0fF2#_kwW_}&f^mu> zUJ}8=PU97A0|y(AwjyeZqly&%HsimbSlhDQ%hVMr?ieof6zL-t?|D!RdB0X$AtQN7 z5$51YusyV_Fd>~al*^u*s~sPus+#^m>B|X9Pd`&^8k{z>xx9I3Q%FyeE)VS1<_BXB z4&bqXc5Ry*$-!Ow7Wrbg&~8B}W_MiT+)`t*y5}B_l33pWq&VNzeBZju)X_vcIm4MF zCvDj-MXQx66{rEF(JM$xeU4!o>LdTZ^eT^em(g_BqQma82|_hgnRJ%X NM+H){3PtB6WEDCcCM{sI%$ce)JqGrs0djeHKj zgB4vh5sIF_|J3@la2N_!ay2s8R?PfrzN^9a+z}h=n9q7y3;D0g3u|^MC1Z2*py}xN zf0@v;p0kyk^Fhl@nvc0CQ-008=*oeOwE6We*6A!(=|tX1&ohj TELI;0 XWpH*EW|bAXA7)=U1v3 -0Z1s3wf@k2sng6LxhQG1aK;P!8U>bgAhS++mZA#huz z8VfX!bbkx%ll Q3`cSl<)<#c3<};YI*4=M|#-*NKd}O|KC!p|K;N&aT}NLhLX6p z5Y+v{s}-nw920ac&y{e}TDZPJlFaX4IkAxMuq7zaZL%e jOh&0YWYWKM;nA1F`eqYDkw>?8#%dBkru0ZT)dI$a#BPRc+(R|?1Al@2)c#>ZA< z(p`pUl~{2x_^6k&Ue~8(6e4$GaLtP%pK7!ShOlA40ej0^U=5={Hlk-^<>}S?aUO}4 z{LRyQJiHh_7VQS$k{DTAAL6liy!!z=z`yubD^hG$WQXXp`A73lUrdm7u+kh7t9xN9 z&B9plj#ahbVJq&x&$mz6bUa&>-Flo%gr>j!1(u+ayJ6rP$CNiFXnc|$rI5$-22_oc z=66WxA)FIC%u3v~k2w8F3*SDPA-HGZlV?VOe|Yl DY!_(PlT zzF*UqhDt+?yIrjwJvH3n*@eE>Q#$BE?J?p>siKHO48F`b(a$RW9sZhr{~OwZzD!}e z9`L%94D>{;XPhjwKd$AGf-Rb={>kib4<{%4>K)-v TG_S$E_dS>Hz?`xXK>ak|K%gNL66 }*A XUE1bqOMT;71s(2es8v`_O$_9oiZMOK5 _W=|G98LZ5C)|C zZ(+a5w~cBmFl1|5WUq! kXn)d}Cc014si=BNk5M8ssa}jGUK}+n zivv`8Ja*5h+ZmKmGx4UZ*c&N~( u>!uX^1yr(4+CDd6o9{{$qi_8O?}qLEx>(f$x_@`T;ju&MpDmVqPV+7B2n}eD zqEH|tI*Jaz?E>ndrmh6Lo-rBn<-c IqRg3 z9XDEbi`c&b3KC$Y!H)AQI-jh|{g;OCdOh*jUef9Su;l7XP5k@QKC!??g#kN$%M;wj zNCa@?KSebjTs4EYSo|TVnbg4x{pyE7Jzt%E2QUV3w3VtfRD2r9XPXivL$;nR)ow2D zigd}}b(&A{B|sS7nS}tn-u+W)+sFPzts?-nLfzi; z(Ejq9R12>OwEp3cU9?$;%sd%fsOfai;3;| z1wiVrmt W9l;nuo!_3WWf4J1Zjsaw koQP%q29mSJPp}_8@hHk>neL+V{G6$X22hwwaX>IWYW{5L(NN%Nd? zzgyc`5+#jPBXCJ5Mi||ZRWM`#jx-^W01p9hqJ{2sMdOA7dws0BaQeEEvbO7zyWPcf z4&^M0^x6FJuK !tZDops~1dDbnD5lw;74|ArFu*wqbq!Z6Ha(hxsWHv} zJl5CFW~v-s7a>^5Zf8A!U|}aOZwqozQUSccV#T^o8KSnnJ#_n|;KN1U{s;357{#XM z7b@GF-n#h)bC@I*`HJtB5WiU|&8Y1}GW*I7oa7KM_V#lz68E!&@-q6{ApHlvN@%t_ z4EDx-w7M)xnaz2WDk5CLwoVcDdXVcJrF5uKaaMNaQl(_n1hMt9LOOo}?q7M2?fk@o z2b}zihmMX_${icCANwhvsa}P$zfrXith1;RJ?a``cs##$WWnf uS z!isi45MkkRY%40sCioR@%km^cwg(nZw$oshN1 E-{bK2?<*7AsSR0Zt!k~g z!{to(i>3T~xO&l~6P)Pid6)ht!rLs=_W&@Mo&Wr%neZZf1oghb!k$0I6vxgcwfNRg zM+wzdwe-`W>Z6XD=U9grPzzBPR%V2xe#J-5KG~Gh0TKxKXzcHb0(-c-4 (B^KKhc#2>(D~)>z%&E z4zRz++z3{rsu9E3rvJ+L{6~px^P|p-Ivs5M95AD(94W1@vHDVk+1#4HagYhwb3#So z(B!#@;aL|$*x3XBR#qOwY9^%-KHHZvqh4!{`ejO*Te`+cnoAE4-saXTNy3CiQEZR> zR1)QIEhG4K>@RWORv17=th0~W&0|KEm&L@na3jqDdj6|+Wab9-v(07E-SfnK4Qmpx zm?12sG6a?DrU&F!uKzo&)5aDNmVP7GDOWgZ3APkMqhPIuY8@y;g-GY9Z?EU9PF44x zSS5UR|F;5FWj3xT#@DTR%YQmtR(bSlx` +xY|6Tz9hm)RwM_vT 4Kq}Yno+e;ewBZaNyWIej8>SZu{y9T`Qhv&Ed9Gm@Dbz-0x{$y_F{{oF> z|Bq|s|Mc*wRy2>yB|_51fi{mEAP0S3mzQvZ2Goo4+Mmwr@BygkG@A#yVm1i+Y0I$m zpxl}?W)N9$CBR>M6+txHTv`nyi-b&(x*da-;(2x3!hO7VRDitqdCta6Pl7;Ih&H!Z z{~8&usrb2-v-yNJD^wQ)cze2qV=DjnguXwD3H-)QFrb<3#;6QIk7gb3&ay%S4Q>3( zL|*k81Jtn%m_S`wQ%+@Zg47GPvOtuz@*3)fL%8g{eooxjn=Y7HFvkkoyJcCVdCG*@ z?p}~C6P_%0rtw1zhB4%teto#ue-1*YzoXobV;JhyX2Q!+`N_8-)Ke2$K5d4i9U0>D z^6+XlW2EPjB&*Z6-)HlIy^FA{cR9M2111khvLeZCXNY3u$55KHZjN~TyE&4JkNH4m z{^!iyy&QtlE33B^nZ>t@KernUy2fkACL;o~2J9t(hPqG~;B53}Mm6(v7r(~Uc7)aR zMg+#W7x7wn#od(lp742 _q3uArgFDiOh?3`m1-H2=MB745#Mz5)Y0yD7K2%dgD$Y!tf-7)6hcuq zh-4)2w$z;QRa4*jr&gs;L*qG36~`Ij>naV7ptaqQ0OwD{N;hy>uxgZ^uXxGis@2e& zoTUL+k)BR&+IdNeJzmzTNlJ(FSz|R=Z$2PoO)I*A(oa$}>cb}Yo{itSvG{m6Xt;MH zai{0yffdSIGCV~xG3nf1E0e(3 B4*SN#eR=U)8!NT?dKGpkjW zz86GS12?0E !G)wKCFMcKSv;ue z#bAK*Lx-d^61&N;H%=+1M{#)7Hs2Ph+v6?l18ZBYq(!7` =_x=cO8UP2xv4?wpJox()HEMDX^)g9j8To mEiK4*QLr zV8=CLUKQt6S#Y)c3%Zt#=j82x&dD!fX$7g_+KR{Qta?!dUL9%I6UMuO*`+=#(ocJO z(m?|g+;|PWv^SmI^L3;k>!(wy$}26Om?*w%5p|_e+b?S~uQsXA77R64&U^nQ1G!;X z>sIZMR3*9DLReq~o;CDyT>`s!XE{SHU4#j-f`k(VpQ|<`nxSHwmF3 - Lw4HcGagYk-TN~uXl(EM8~Q{9;4|-=}}o-zES-*QqDtSC7cVd6u>Y$ z?&!ec@#I_s+JT
s>a1k zRG$NPLBuYNn|U*=dVx}DMU3HrxW3r*QK(Mzy7h*AN~C)e )jY4Dt0elFKky1BU86+g@{n=HIS<$1 X8hqo*19=!1ZkMWJH<_h^G8+VsD?{209UmtkmnP Iu$F0c8>w1`wHc{pesJB%URReF zr=pqkcQe+n35T(& l zPGHrl(_RfMRlY(9C6T_sPADXoESzV!N3d=sk?Orh&CDf1onpXo_py(xtbuj!&*WFD znr|{%Em*_Krx4D>C{)277g@1dZLb=7KRNpR@{#hvluGjJ;X9XyrqfiW9rv$2ih-s% zTG#v;q@(B0cJme$8OyAFG;t7OJl?@>tolyr=*Bue{i!*c?|sV ES|B%6mGL+YcH9gov3D;zAZ6J Dn+_0-SbmLrWYVYD?+- ~zmbLggBIG#sU?M`YDTz?zGq+Bto!LMrFM>eHuFG#V zeMqT~b0)a#2{TE=ruV7T>iWNYsu_GiAJXe4hzAbE$-AjipCzbt2VxpcA`?YQeE6&j zNiXahkfXJ3Q_5?pDmj@g^O+hRqQzKzs^+_M%b9@WD(DCV_P)#r48(wEX*wM*3iD8} z*ireU)!|(IKP3nYo+_e`O}p&p8jv%H*3Ag|Sy^+D;?$KFEq-Igj(DW5aE;gEfpc|N zP)2%EJ<$`DX(KFaRAymnI7z)+emziFr;f40S>sG2eu@P=sO6X3v_<@=x~ZGGru!OE z3F$-WwKUCa+MW$#o;y)2Sr&y1jyi@8K@}GYfZU?1Zj3jaA7728MIii5^mW#Ek)Ofz z;yCoIkW>lo20?&$`w|~oBzF`)*tFY@Z(1&YL(s9ZX2dsgaFqAWF{o*9xXBs5 Tjl*#m>5Z!$)KgRQ<4B)J@xNFN@|A0?*9!-O`w3lPV$HeW9})l~Wj zN0sI26CDb3J>{vQ6b~JO7_2RGEyjkhqD8G))h$Ei?I>#{wnq5QYIIHO($sMi@(qA$ zgCr_)11{iA`@l(yA59uavm=n(oduc4&=ireIv-(@p|iP7moBZ!UegCN<{g*rK7SZ= z-xU+9iBSF8JmTrNmi+N;#fL9^ZuYOFd@SPT=+pDlCiQ%ulpv)>Qzkz4Xd4#&e$Iim z^nrseqSikyS&mIgE%#_Nr^K22VQ{ZkoQ2pzUJDM5>p|VBp8VO@Vk!3PxF1N8*9&!V z!L%c?$8srySe7~av*d2&?o T7c{zubZV5Xwfy|12_Xuwwm%sgkU=0FnOG_(hIUv@jyMStT4`l53h zaIWbCkaW%uB1h4yxKVhQ#WZ71B?KNI49fX{1>%b@c;Fed7AXbREmHgQh3{IsrhqZ% zjxg^^O+rG|^>JQ%8x2p=h064hW&pn$gln-s2~`OiYV8)bTS+SqU{vRp?0t~bp}Ri% ze*0R^vT8{4NWNx{l4A(Rm!VMC6A4^PfVL-P3a|-kTw>$KQ$Jl57APo~Pl@~4AX@+T zbd(*kpcEqC)c!an^fTp?Kzl*m-E*fH2UqN(DYF{OV1_!zoO`!^SWa700Gi5@=y()T zxDvp12C@l3xt~7=k>ANhRH=;)C=PTA_q!+gC%-zismSV%7|>sLZ6$!SW36+_EQqZ@ zLSFgmc&5o4Jp6r|lCqlP6IkR^Ns*}F_tAXT_WN6e^#GZubBT;KsY}4DEfTq|mN}n2 zu{HkhZxC2o0_l=2OnN{E)h8$|LU`e7SBfV-IoEtZgfOKgZ~J9wLhr@OQ;JBtPa(8r zx$&F=)#V4wGW8Wny6*O7^U5VheF@6Mr@7jeWm2KFKv!=?lZ6J>$KIT;Y7au+PdR#I zZkf=)>IxRn*=v}i%@MEMkgAa=n74G%?)MX-$D%itzO89AvpdiAhK!?{1WBqD=ddm? z`OFaJVay6#4wq{ ~50^DSd#gdE7ehw3+#X xJo+_WUOiF@&-+D?lqD%KDB6=+*@!FY#n``H0fYi^zW6K+HNu-;v zao#q1D8u_9K5e-1t75r;W(c3@DqF1l_>OvH3A{A@F1V;4$0iNLZl03wDJJeX+X!UF zCh*hcwD;KYHyzb125m7GnS!J*iR2hba6)O_W{@NdvpJPqyiy$ibjcdzXGA}R`ig~) z@m=2UtMZ5Uis2;!^Wx#nNMv7!i=)__vn6$&6q_tkl2R#0Fl?Ra%ZdgZssN=`mU>f) zISf;d)95>eHUb)WvGr>=eH|py2@)hl4y%UK?H|MhCxz(vr6U+Nr3OJ;E^F48@d?*% z%vjm!&aXG=t@&&m^AmSr w}S)9t1Oa^fss0lsGeT!bNzq z!ff+9Wj=@H0-I*|bgbcgYBQN$J`SOa&0*15_kXm)VkJi^B#KN@!8JDKT %X=S4N zj!tP FLV)>~C62R{6%bTPLwrsoLmiQD@ko%@Dz!EMFU(*=SkxD8yX}xm^@JYm!5P zSKEZcPIsh}zBnI}03*c>IZhCBC?kd#N@{^EGxTmFnDT06kDU&&^C7weHO2F^b1jJ` zoL(qi#B^LoW(xk6XbooL%;Mqvk#cAwRL_#Gtb8O)ezc-vj`bS3RPU@P#Smf}I;E Psh zP<2~_b>Z{km_j}WBO;yb1Mr`|6Dq;uKd=w(u0H$VzbplLoqN(Tw~f!i{)n#Z{oc{p zSq`j~)W9|hX8Ry@Tmj{G)WsVbqDDtMPiRYGRUC~UkctVb@qO|7QA5pW4TNs~4f^aQ zf?+c{I*U21>zJhf3gYV!dx&&5WgJkp^FGntCN>a;DCu}d{0*-ev4yIeqGd|Sd=xvs z(XikGl+7myGg$*3NspB432lc_w9IXgTmS=bq&;L#dxa_LB0(utJvn-NX*3tn5QI^! z!eC|7>&2KoaDv^?258X Fh-1?S6Jo-%qc+v zrk`1t%Qfy+X0?l;KO1)Oy%3J8%zJG-KK*PK)`cZfRGKqiTt_~d@R(W6yD`%~vJVnT zEGQb@=+m>a|JgE+e`T#%vCuQa*fI=euS(z)J1p=FwP1*)nK0o_L~vw)lA$wdMxg*b zA?SXIZkYqsTQv9kVL@ElmLKe5tFNiw{gaFK9HXh#d11mKlJq)Q*n&|2$Z48Bv1(-V zTvK{%-Z|lP;zYt3h9sh(#@S}3OMP}Jf>kDYaK*E*z{los6*1);s;aqewbClha|l7u zSk~{S2dpt-78F>KhnX6Bx&G#a&l`j&Rx`V@cKC{Z6KO{3LM%{N@Sg=^%)(OP?PJYD zoiwcq^~4Dcx3%RGOwH!#J0f1|bfmDZik{C7KZHuMOI%-MWTr?&<(C4C$XVvkBlw52 zgyr1tPC+)vsO5n sAURD@2RJ-J# 2X54TqdxtpU{))W MG_vlNzS!c@XBUBn)sT5UF4`(*xH9 zBZ%)8-O{MeQ!H=D-qmsU!sK UNLuwn zZQpG|vA(WI?MpmHVumi1v{+fIIKKBu&O6GiSHb$$ou6xeg&>Ce9?QCkF6lva^bzE@ zc6%Xi@1)^t7qdZrZ$y=L!Y2ct{>-$wvOicw=G#)18OneJw9|eiQD tz9LfpH;a7UEG>e!wL|KcHH9+5S)Z!U4IJ^U>E(4B6RBNOjFFNEbc1624)3xvQ+& z+or~PV6GVR9ee%|>GUC<^3i=2C|5uUnr24OGkML#p+ gw!_# X60NRb(Ib4xu`MRl}N)qQhQ#W4{%_ld6u$+cZN1C`n19@A(D*!9|t z*#Lu9#L)E4w<= r@2inc_AgOHCN=mm!95=Y7_jE{=mUy z$UH@`SVt2@jKsD?U^H(vLQIjUvwFn$Z+o{`ud!zwQLE=@*1Oli8cnZO!b$xNdb%1w zOmvzqgas4hr5EsNL727TptStgs)U(SYQ!Q^#=`IkCc8x`dW2Q#ts~%(Uiav}0#0w8 zT>QtTf4W}3--fNd{ gkyoS7!8?mdIj`k8kElV}+O^9v zPA%KW@w7_EC0J|bE~K!T5(|}XKR|w}>&<8rh+_byY1Tx4aPv*nH9PZE`DXO1NZYe} zYke+&4>%2=ghhT|7iE+2i|z)iFlIQ(H$^3G<_2J#2YfrUNc)EutAdA7n?AbfJsZGv zLEg10?Q_wvnMNY}-8n4NJ|Swt`IVQ0Mnq=2Oh>`0n5omTTut*RLl shues3R^V2)P;zFw=vQoc1I;(rRN-vPjsc1 Dj0YB>Yv9SIy5MRF{vVjITI#?1iC9x|BntF#M!C zE(fs7Q3{TUq)WBWN%gR^%{y0CUwa6$3!s84=FuHOOq%+~RDD?z J* z3?IrdU!`Mp*sm_NO`OXOH^h&^OR-lHJUgEI4qFs1Q1 zb5(iwD(*QZE9zYY%q ^!1F5b z>XlvH!UBVjv`3uyw&y4;oCUIRY@oU#u~qlg2Dm$`!G8Wb5a?YHNh;XBmU(CV`2YK( z4!W*V%XxPrqyL`VpzURmX5~!v?{3cJ7jruD(yxyZylUKY8#U(t)z{uqp#F4WK~Auz zSbVG|=!r6H&I EQ!4q5U{WH%weix`skaz7mNV#shrF8n5LXZD>eO+MY z0X TScQPbVrEa&XHZBw)u|H(T6m%oZ~6@#T}rwUA!gi`W*so zhVMH&F=lgh6&ym?2kN^U^Xy4hX7n8(7C#V4)80l7u-%+5mcs&DdeT!db??vloYBSx z0v yi3A@96?hH6rv`O0g3f&U2)GGnXz;1(4`E#%S4b%wd6!{}D zaJlLEkEXls>bxf$ksuK3cit{9%S0UGBr3)%y7OK2^~WC0+zUsWpD#<4WbOhji1I+? z>#z$lU}Z(^8#r@&CCMAVnsb-zn^&{-J$-8@h_(-)`GU^G`IW7x@P1SG0n&23H{QLx zq5V5*s~Nks3q;$^d*Un!^6)MzOLjR *^z^Djp&xY+zu=4&IXLTsVs)e-fI%7j#-+ z`?vsGJ(=6XJJm7Z0c-F7HNW&tMo9z(2llS$duLl+8;=+^w9p4A&btDy-M$;37H1*+ z{0D-L|A_D4dDPVv?qrxoi5aIgyneWGA=vypGZw-G|LYCnddGQvc9;M84-V Y3xGOBco(xpQYskF0P0zE|01wY`ERC6b4Hw55m1I14~J0epeaMLkEkHV ziikwwrkX^ zIaf5}}`_)x4r z{621(MG5 yv9m9;RSKbpSCpqystycdw-)UrhrZTMyLc%U4&0j=a2^ zTCVGeKlL Jx@)p zi2?iyC`T3G5 oYA?uIHz#I_cMEghAaO50x_fglB z7$8giIQx=-?pbl<##Fs92z2@sK-SY|u6O&7`Ve@xbhG!4Q6$_cn-k}~HlJ)}hjB-B zdvrAtK5mWIQ9sf6Mt;0mUVlf(3DcQ9UY~F}!VX%azCFf5Vh88}Zy-+2JTThDj5k4{ zCv*jYqG62m{&J{X!e)!6(>e|PyDTcM2Z;q;AD*wSIPjxOQcHad0M``g!Gy8Ubxid8 zT;^meg!70sQpX+%zu^_JF+@ZrjPpjX2r1mo-o=0JFZQgg{?W7@Pv&?!_(mhptsQe4 zW1qyCV6UVq!@ps@6H1#g2r4$0gkYTK3rGJDFg>rL`=bwPDi8n|g%R)S12s{uKtDb? z&cgKC_Ot^*U?hjZEh(TyEcNj?ygvC !*nLc8&HJDxiaX5$d*J9A8 zMe5Eu_;wlAcRTSW;=J&&QZG9Qw)Zg%BnFL_yy-pV6EuG&T`O;mmqa!H2EON^APG9n z1=# ~o?ZrzAgQFF?DVvt`>Y{#@P|^4EP0}Kz5Ye^(qke{b!=T+ z|7yra6g_k%jLUpa22jE19C3?_!_z*fj47^$`vWZo0-h+dOh@)2IM>d*%H<|_$$t5= zyc6WQrSmiE=akw-E9`YH9l}-bwv=U@npmuNPU_8nEdZL|1t{Qm@34p^Pcmt_*pNk) zWK(k*mOi4ci$?3;TA_R8f8r$g4!DTqRzQ%1zs!T$M7(dT2e 4+(Onmn zzBg03m|wta#3*}{jh{WKa#UJh9#Y{wHrZFHzgePhM`L8g%GIa`0ls6l0v7-1rWrP4 zh*-y=)bTHB#Ne&qA8z U{?iJw&88Phrqxe#`)={395DpjALwPD&%Gj_mnpAm+r zW=;^7nn0eB I1LK=#&8gyIo)Kmw<6Wg6{=7CV(roH(d4ndkVZO@J<5; z%+v|aVpI0gfXE^3p-BCQk8lKZe@+;uC!Q~S#DAjlcxpL!oLsRSM5IBv3}|S%i#>wg zN3J3wmj7xV0&d;z#g<#WSDfkw8Wrtho6!i=MZX9Z9+-KwCw;1?YM_ooC% zYUsT83G+D*DbvOf)~&$Fn&lYp!Mm*n&-^#TCB@@_DKxDbC%p=g=g0hMBRwQN_;uVm zr7oQ_S>xH=%3=SYMMQcVL-7mqv>K9^W?scQc3g!wgb4s@;qeTuKlg2{W*xIV6g>UB zb}qS&nw?F;R4*S(QMq2(%K+xZG~91CO>~6!5T7k5S;bRw!L{@vXgrd6F$X*!u?6}P zyp5#Qk7fvYFZ$ZLZGhiW$4ao*O$@Py98kZ?eN&4Z@* n04vc0etz96a3~X)><}_#m#-4= zm2XdasG!5O@i==4;O2(=h*yPp9BR=Fi>#$MtQ_m@Q?KE&SFkjHwO=!NP9NlM5xMwt zz|@_pQ0j}>rONeO7}D1>aLgT?Tip+QQNY#BBh4=Pi2{`&xsb!GL(gK5BF5W+K~fPn z5EvlMdef{o2^i>ehW$LEk~xp=i7}GUx+>O}9`c7YCp)b6&SbW+UmB}7SNZjaLVd)w z87(5bBO@9!M}crz-xS`0KI!lV!h~-Cn&h3tLt>Dkv`a br!*7H{*WUroG0y+;n%U{3iT+kfeT9ddU**&1(p{>6h zU%?w36?*SGwCEVS16|i}GY&8A({L~pHuF}qrm^5&i~gm|Vz(O}1;3el&DA3TU$Lol zrFN5lI2f4cBN3ct27R&oxm7uIHE*0Z$LH%{7CF$D6K)pl#44y`6&RA7Zv6pT !3}m<`K4kRGryIZE`d z^_f!Y3E_tB&E=WH& }4rkRS?fcK0fVBzha zd+2oGB0c?_d)McQ@#ImU;MwF0)U)~Rgw}Xt!9w-==JT?m KeK=@2zf5V0+B}H4eg?-6h}N5o;7Lst@wKyz0mc5<9pGtx~}~6jSZk{;AS$O zT;y8QlB*&&n+}eoM>Odz>wwyT>xH1xLM;5Se_cSjFP(u#s$EX^{6E?|@2IA>b k6A)Be~bpe*}z(Y|V)XzLFbS zoe#d{Uh{w{OArrUxJtpS)jt{ZrxtLyi+7w}a=MCAC|jA@j(npW%-tJ-B#&-|1+Ry- z;LozP@$Kk7Icbjvf5d-~E$ A!tiXaV?#Gn6Z|L9H-fOU&ssN|( zUxNw#86f$;K@R`Z{WybfM+sM@BkqkE`kNOXk?t4OLi2PUdO1NXgHpgig8AiwL01*% z@6r{9s(EtLej(5=`KK_~(6+s31g6;ep}G!vX7#`_KI{2A<#68IgTSRL7pqT5$Hhd9 zA67Nw3qc$H&&U7nm`t8AB^KGF?~p$LmA~{md9}PEn-vo2^0oAc^sMyFXu0N=EIVPp z5F DVQ9y|>=N*QLUyeoZY|5*}%e!Sagb3$bXt^K4l^v3G( zsXKXHrs~ET)i3FDNg0rZjmAe&AEL!Zp4PthBXqsYFx2s>!{-hmkKjpxpDfpSsg)94 zQu^Ov$or9@0NCfj2g9gDwY-u`FX_I(sps(E@s)x9^O>d7^^+Glvgo~O%7aG8fy7_S z`zTHFK}(-jVX5KH+